Merge "DO NOT MERGE - Validate notification-channel deletion semantics" into sc-dev
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__arm_CtsShimPrivUpgradeWrongSHA_apk.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__arm_CtsShimPrivUpgradeWrongSHA_apk.asciipb
index cc4eb05..ae658b4 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__arm_CtsShimPrivUpgradeWrongSHA_apk.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__arm_CtsShimPrivUpgradeWrongSHA_apk.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/CtsShimPrivUpgradeWrongSHA.apk"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__arm_CtsShimPrivUpgrade_apk.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__arm_CtsShimPrivUpgrade_apk.asciipb
index 2c1b30b..0ec2b3f 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__arm_CtsShimPrivUpgrade_apk.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__arm_CtsShimPrivUpgrade_apk.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/CtsShimPrivUpgrade.apk"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__x86_CtsShimPrivUpgradeWrongSHA_apk.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__x86_CtsShimPrivUpgradeWrongSHA_apk.asciipb
index 8bb986a..141ae82 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__x86_CtsShimPrivUpgradeWrongSHA_apk.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__x86_CtsShimPrivUpgradeWrongSHA_apk.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/CtsShimPrivUpgradeWrongSHA.apk"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__x86_CtsShimPrivUpgrade_apk.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__x86_CtsShimPrivUpgrade_apk.asciipb
index e28a099..0b2017c 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__x86_CtsShimPrivUpgrade_apk.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_appsecurity_test-apps_PrivilegedUpdateApp_apk__x86_CtsShimPrivUpgrade_apk.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/CtsShimPrivUpgrade.apk"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v1_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v1_apex.asciipb
index 4c34b9d..779dddb 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v1_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v1_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v1.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_additional_file_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_additional_file_apex.asciipb
index a40d92f..65ba29a 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_additional_file_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_additional_file_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_additional_file.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_additional_folder_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_additional_folder_apex.asciipb
index b16eebb..872b470 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_additional_folder_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_additional_folder_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_additional_folder.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_apex.asciipb
index 6761a86..c372928 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_apk_in_apex_sdk_target_p_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_apk_in_apex_sdk_target_p_apex.asciipb
index 3e4b7fd..f4fd435 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_apk_in_apex_sdk_target_p_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_apk_in_apex_sdk_target_p_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_different_certificate_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_different_certificate_apex.asciipb
index cc692d2..06f779e 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_different_certificate_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_different_certificate_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_different_certificate.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_different_package_name_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_different_package_name_apex.asciipb
index 85724c3..88879d4 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_different_package_name_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_different_package_name_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_different_package_name.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_no_hashtree_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_no_hashtree_apex.asciipb
index adae35d..0009342 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_no_hashtree_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_no_hashtree_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_no_hashtree.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_sdk_target_p_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_sdk_target_p_apex.asciipb
index 926c55f..6151ae3 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_sdk_target_p_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_sdk_target_p_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_sdk_target_p.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_apex.asciipb
index 800edaa..378cbdb 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_signed_bob.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_rot_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_rot_apex.asciipb
index 8df4e67..48e5ed6 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_rot_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_rot_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_signed_bob_rot.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_rot_rollback_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_rot_rollback_apex.asciipb
index 3cf7696..52ebaf0 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_rot_rollback_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_signed_bob_rot_rollback_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_unsigned_payload_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_unsigned_payload_apex.asciipb
index 3a0383e..97f78b3 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_unsigned_payload_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_unsigned_payload_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_unsigned_payload.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_with_post_install_hook_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_with_post_install_hook_apex.asciipb
index 2c3cb4a..437ff2b 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_with_post_install_hook_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_with_post_install_hook_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_with_post_install_hook.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_with_pre_install_hook_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_with_pre_install_hook_apex.asciipb
index f4326da..cc573a4 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_with_pre_install_hook_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_with_pre_install_hook_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_with_pre_install_hook.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_without_apk_in_apex_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_without_apk_in_apex_apex.asciipb
index 0d527d1..ae0243f 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_without_apk_in_apex_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_without_apk_in_apex_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_without_apk_in_apex.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_wrong_sha_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_wrong_sha_apex.asciipb
index 183db3f..d043084 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_wrong_sha_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v2_wrong_sha_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v2_wrong_sha.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_apex.asciipb
index 4cfd096..3c67ecb 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v3.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_signed_bob_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_signed_bob_apex.asciipb
index d699a7b..3d78040 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_signed_bob_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_signed_bob_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v3_signed_bob.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_signed_bob_rot_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_signed_bob_rot_apex.asciipb
index 4db830f..e3181b2 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_signed_bob_rot_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__arm_com_android_apex_cts_shim_v3_signed_bob_rot_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/com.android.apex.cts.shim.v3_signed_bob_rot.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v1_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v1_apex.asciipb
index 5c4f161..0d7a7ad 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v1_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v1_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v1.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_additional_file_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_additional_file_apex.asciipb
index 58378c9..98537ce 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_additional_file_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_additional_file_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_additional_file.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_additional_folder_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_additional_folder_apex.asciipb
index d88ead5..7a3bb1f 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_additional_folder_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_additional_folder_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_additional_folder.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_apex.asciipb
index f86bd15..d2a0443 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_apk_in_apex_sdk_target_p_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_apk_in_apex_sdk_target_p_apex.asciipb
index 3b040f2..922786e 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_apk_in_apex_sdk_target_p_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_apk_in_apex_sdk_target_p_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_different_certificate_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_different_certificate_apex.asciipb
index 31c07e1..bb924c9 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_different_certificate_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_different_certificate_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_different_certificate.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_different_package_name_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_different_package_name_apex.asciipb
index b19bcbb..0d881f4 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_different_package_name_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_different_package_name_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_different_package_name.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_no_hashtree_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_no_hashtree_apex.asciipb
index 5344843..18032c2 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_no_hashtree_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_no_hashtree_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_no_hashtree.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_sdk_target_p_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_sdk_target_p_apex.asciipb
index 8d97977..f9d23f7 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_sdk_target_p_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_sdk_target_p_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_sdk_target_p.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_apex.asciipb
index 979d5ec..f3638c65 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_signed_bob.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_rot_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_rot_apex.asciipb
index 88c6a14..b9a1e22 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_rot_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_rot_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_signed_bob_rot.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_rot_rollback_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_rot_rollback_apex.asciipb
index 19da60b..9d69dff 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_rot_rollback_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_signed_bob_rot_rollback_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_unsigned_payload_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_unsigned_payload_apex.asciipb
index e511c01..a056b2f 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_unsigned_payload_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_unsigned_payload_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_unsigned_payload.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_with_post_install_hook_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_with_post_install_hook_apex.asciipb
index 8266f21..2d181f0 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_with_post_install_hook_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_with_post_install_hook_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_with_post_install_hook.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_with_pre_install_hook_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_with_pre_install_hook_apex.asciipb
index 737ee4c..b0bc1f9 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_with_pre_install_hook_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_with_pre_install_hook_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_with_pre_install_hook.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_without_apk_in_apex_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_without_apk_in_apex_apex.asciipb
index df032f0..48fac6c 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_without_apk_in_apex_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_without_apk_in_apex_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_without_apk_in_apex.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_wrong_sha_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_wrong_sha_apex.asciipb
index 8700d88..457f945 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_wrong_sha_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v2_wrong_sha_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v2_wrong_sha.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_apex.asciipb
index 400f61c..58c8864 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v3.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_signed_bob_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_signed_bob_apex.asciipb
index 17ae337..c73132c 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_signed_bob_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_signed_bob_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v3_signed_bob.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_signed_bob_rot_apex.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_signed_bob_rot_apex.asciipb
index a825aba..e295e80 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_signed_bob_rot_apex.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apex__x86_com_android_apex_cts_shim_v3_signed_bob_rot_apex.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/com.android.apex.cts.shim.v3_signed_bob_rot.apex"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apk_CtsShimTargetPSdk__arm_CtsShimTargetPSdk_apk.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apk_CtsShimTargetPSdk__arm_CtsShimTargetPSdk_apk.asciipb
index f83e3be..f5f8566 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apk_CtsShimTargetPSdk__arm_CtsShimTargetPSdk_apk.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apk_CtsShimTargetPSdk__arm_CtsShimTargetPSdk_apk.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_arm64/CtsShimTargetPSdk.apk"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apk_CtsShimTargetPSdk__x86_CtsShimTargetPSdk_apk.asciipb b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apk_CtsShimTargetPSdk__x86_CtsShimTargetPSdk_apk.asciipb
index 89ebb7c..f22f680 100644
--- a/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apk_CtsShimTargetPSdk__x86_CtsShimTargetPSdk_apk.asciipb
+++ b/.prebuilt_info/prebuilt_info_hostsidetests_stagedinstall_testdata_apk_CtsShimTargetPSdk__x86_CtsShimTargetPSdk_apk.asciipb
@@ -1,6 +1,6 @@
drops {
android_build_drop {
- build_id: "6508977"
+ build_id: "7197701"
target: "CtsShim"
source_file: "aosp_x86_64/CtsShimTargetPSdk.apk"
}
@@ -8,5 +8,5 @@
version: ""
version_group: ""
git_project: "platform/cts"
- git_branch: "rvc-dev"
+ git_branch: "sc-dev"
}
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index a0feb5d..baf8a5e 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -12,15 +12,28 @@
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
-fw apps/CtsVerifier/
apps/CtsVerifierUSBCompanion/
+ common/device-side/bedstead/
+ common/device-side/util/
+ hostsidetests/car/
+ hostsidetests/devicepolicy
+ hostsidetests/dumpsys
+ hostsidetests/graphics
+ hostsidetests/inputmethodservice/
+ hostsidetests/multiuser/
+ hostsidetests/scopedstorage/
+ hostsidetests/stagedinstall/
+ hostsidetests/userspacereboot/
libs/
tests/app/
tests/autofillservice/
tests/contentcaptureservice/
+ tests/inputmethod/
tests/tests/animation/
tests/tests/carrierapi/
tests/tests/content/
tests/tests/graphics/
tests/tests/hardware/
+ tests/tests/packageinstaller/atomicinstall/
tests/tests/permission2/
tests/tests/permission/
tests/tests/preference/
@@ -36,17 +49,6 @@
tests/tests/uirendering/
tests/tests/view/
tests/tests/widget/
- common/device-side/bedstead/
- common/device-side/util/
- hostsidetests/car/
- hostsidetests/devicepolicy
- hostsidetests/dumpsys
- hostsidetests/graphics
- hostsidetests/multiuser/
- hostsidetests/scopedstorage/
- hostsidetests/stagedinstall/
- hostsidetests/userspacereboot/
- tests/tests/packageinstaller/atomicinstall/
ktlint_hook = ${REPO_ROOT}/prebuilts/ktlint/ktlint.py -f ${PREUPLOAD_FILES}
diff --git a/apps/CameraITS/build/envsetup.sh b/apps/CameraITS/build/envsetup.sh
index eb69844..c52e57e 100644
--- a/apps/CameraITS/build/envsetup.sh
+++ b/apps/CameraITS/build/envsetup.sh
@@ -61,7 +61,7 @@
-for M in sensor_fusion_utils camera_properties_utils capture_request_utils cv2_image_processing_utils image_processing_utils its_session_utils scene_change_utils target_exposure_utils
+for M in sensor_fusion_utils camera_properties_utils capture_request_utils opencv_processing_utils image_processing_utils its_session_utils scene_change_utils target_exposure_utils
do
python "utils/$M.py" 2>&1 | grep -q "OK" || \
echo ">> Unit test for $M failed" >&2
diff --git a/apps/CameraITS/tests/its_base_test.py b/apps/CameraITS/tests/its_base_test.py
index 5bacd24..9c488d6 100644
--- a/apps/CameraITS/tests/its_base_test.py
+++ b/apps/CameraITS/tests/its_base_test.py
@@ -27,8 +27,6 @@
TABLET_CMD_DELAY_SEC = 0.5 # found empirically
TABLET_DIMMER_TIMEOUT_MS = 1800000 # this is max setting possible
CTS_VERIFIER_PKG = 'com.android.cts.verifier'
-MBS_PKG_TXT = 'mbs'
-MBS_PKG = 'com.google.android.mobly.snippet.bundled'
WAIT_TIME_SEC = 5
SCROLLER_TIMEOUT_MS = 3000
VALID_NUM_DEVICES = (1, 2)
@@ -37,8 +35,7 @@
# Not yet mandated tests ['test', first_api_level mandatory]
# ie. ['test_test_patterns', 30] is MANDATED for first_api_level >= 30
NOT_YET_MANDATED = {
- 'scene0': [['test_solid_color_test_pattern', 31],
- ['test_test_patterns', 30],
+ 'scene0': [['test_test_patterns', 30],
['test_tonemap_curve', 30]],
'scene1_1': [['test_ae_precapture_trigger', 28],
['test_channel_saturation', 29]],
@@ -75,7 +72,6 @@
def setup_class(self):
devices = self.register_controller(android_device, min_number=1)
self.dut = devices[0]
- self.dut.load_snippet(MBS_PKG_TXT, MBS_PKG)
self.camera = self.user_params['camera']
if self.user_params.get('chart_distance'):
self.chart_distance = float(self.user_params['chart_distance'])
@@ -83,7 +79,7 @@
if self.user_params.get('chart_loc_arg'):
self.chart_loc_arg = self.user_params['chart_loc_arg']
else:
- self.chart_loc_arg = ""
+ self.chart_loc_arg = ''
if self.user_params.get('debug_mode'):
self.debug_mode = True if self.user_params[
'debug_mode'] == 'True' else False
@@ -102,7 +98,6 @@
if num_devices == 2: # scenes [0,1,2,3,4,5,6]
try:
self.tablet = devices[1]
- self.tablet.load_snippet(MBS_PKG_TXT, MBS_PKG)
self.tablet_screen_brightness = self.user_params['brightness']
except KeyError:
logging.debug('Not all tablet arguments set.')
@@ -170,10 +165,9 @@
Returns:
Array with camera id and hidden_physical camera id.
"""
- camera_id_combo = self.camera.split(':')
+ camera_id_combo = self.camera.split(its_session_utils.SUB_CAMERA_SEPARATOR)
return camera_id_combo
-
def determine_not_yet_mandated_tests(self, device_id, scene):
"""Determine not_yet_mandated tests from NOT_YET_MANDATED list & phone info.
@@ -193,9 +187,11 @@
# Determine which test are not yet mandated for first api level.
tests = NOT_YET_MANDATED[scene]
- for test in tests:
- if test[1] >= first_api_level:
- not_yet_mandated[scene].append(test[0])
+ for [test, first_api_level_mandated] in tests:
+ logging.debug('First API level %s MANDATED: %d',
+ test, first_api_level_mandated)
+ if first_api_level < first_api_level_mandated:
+ not_yet_mandated[scene].append(test)
return not_yet_mandated
def on_pass(self, record):
diff --git a/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py b/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
index 3edcc2f..922a666 100644
--- a/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
+++ b/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
@@ -39,6 +39,9 @@
_BLUE = {'color': 'BLUE', 'RGGB': (_OFF, _OFF, _OFF, _SAT), 'RGB': (0, 0, 1)}
_COLORS_CHECKED_RGB = (_BLACK, _WHITE, _RED, _GREEN, _BLUE)
_COLORS_CHECKED_MONO = (_BLACK, _WHITE)
+_COLORS_CHECKED_UPGRADE = (_BLACK,)
+_FULL_CHECK_FIRST_API_LEVEL = 31
+_SOLID_COLOR_TEST_PATTERN = 1
def check_solid_color(img, exp_values):
@@ -66,7 +69,7 @@
"""Solid Color test pattern generation test.
Test: Capture frame for the SOLID_COLOR test pattern with the values set
- and check RAW image matches request.
+ and check YUV image matches request.
android.sensor.testPatternMode
0: OFF
@@ -83,14 +86,26 @@
hidden_physical_id=self.hidden_physical_id) as cam:
props = cam.get_camera_properties()
props = cam.override_with_hidden_physical_camera_props(props)
- camera_properties_utils.skip_unless(
- camera_properties_utils.solid_color_test_pattern(props))
- # Handle MONO cameras
- if camera_properties_utils.mono_camera(props):
- colors_checked = _COLORS_CHECKED_MONO
+ # Determine patterns to check based on API level
+ first_api_level = its_session_utils.get_first_api_level(self.dut.serial)
+ if first_api_level >= _FULL_CHECK_FIRST_API_LEVEL:
+ if camera_properties_utils.mono_camera(props):
+ colors_checked = _COLORS_CHECKED_MONO
+ else:
+ colors_checked = _COLORS_CHECKED_RGB
else:
- colors_checked = _COLORS_CHECKED_RGB
+ colors_checked = _COLORS_CHECKED_UPGRADE
+
+ # Determine if test is run or skipped
+ available_patterns = props['android.sensor.availableTestPatternModes']
+ if cam.is_camera_privacy_mode_supported():
+ if _SOLID_COLOR_TEST_PATTERN not in available_patterns:
+ raise AssertionError(
+ 'SOLID_COLOR not in android.sensor.availableTestPatternModes.')
+ else:
+ camera_properties_utils.skip_unless(
+ _SOLID_COLOR_TEST_PATTERN in available_patterns)
# Take extra frames if no per-frame control
if camera_properties_utils.per_frame_control(props):
diff --git a/apps/CameraITS/tests/scene1_2/test_raw_sensitivity.py b/apps/CameraITS/tests/scene1_2/test_raw_sensitivity.py
index 307d620..6a581bc 100644
--- a/apps/CameraITS/tests/scene1_2/test_raw_sensitivity.py
+++ b/apps/CameraITS/tests/scene1_2/test_raw_sensitivity.py
@@ -22,9 +22,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
GR_PLANE_IDX = 1 # GR plane index in RGGB data
IMG_STATS_GRID = 9 # Center 11.11%
@@ -77,7 +77,7 @@
sens_step = (sens_max - sens_min) // NUM_SENS_STEPS
# Skip AF if TELE camera
- if camera_fov <= cv2_image_processing_utils.FOV_THRESH_TELE:
+ if camera_fov <= opencv_processing_utils.FOV_THRESH_TELE:
s_ae, e_ae, _, _, _ = cam.do_3a(do_af=False, get_results=True)
f_dist = 0
else:
diff --git a/apps/CameraITS/tests/scene3/test_edge_enhancement.py b/apps/CameraITS/tests/scene3/test_edge_enhancement.py
index 2168ffd..fdfb35c 100644
--- a/apps/CameraITS/tests/scene3/test_edge_enhancement.py
+++ b/apps/CameraITS/tests/scene3/test_edge_enhancement.py
@@ -21,9 +21,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
EDGE_MODES = {'OFF': 0, 'FAST': 1, 'HQ': 2, 'ZSL': 3}
NAME = os.path.splitext(os.path.basename(__file__))[0]
@@ -108,7 +108,7 @@
cam, props, self.scene, self.tablet, self.chart_distance)
# Initialize chart class and locate chart in scene
- chart = cv2_image_processing_utils.Chart(
+ chart = opencv_processing_utils.Chart(
cam, props, self.log_path, chart_loc=chart_loc_arg)
# Define format
diff --git a/apps/CameraITS/tests/scene3/test_flip_mirror.py b/apps/CameraITS/tests/scene3/test_flip_mirror.py
index 6265123..24606fa 100644
--- a/apps/CameraITS/tests/scene3/test_flip_mirror.py
+++ b/apps/CameraITS/tests/scene3/test_flip_mirror.py
@@ -24,9 +24,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
CHART_FILE = os.path.join(os.environ['CAMERA_ITS_TOP'], 'test_images',
@@ -70,8 +70,8 @@
y = image_processing_utils.rotate_img_per_argv(y)
patch = image_processing_utils.get_image_patch(y, chart.xnorm, chart.ynorm,
chart.wnorm, chart.hnorm)
- patch = 255 * cv2_image_processing_utils.gray_scale_img(patch)
- patch = cv2_image_processing_utils.scale_img(
+ patch = 255 * opencv_processing_utils.gray_scale_img(patch)
+ patch = opencv_processing_utils.scale_img(
patch.astype(np.uint8), chart.scale)
# check image has content
@@ -150,7 +150,7 @@
camera_properties_utils.read_3a(props))
# initialize chart class and locate chart in scene
- chart = cv2_image_processing_utils.Chart(
+ chart = opencv_processing_utils.Chart(
cam, props, self.log_path, chart_loc=chart_loc_arg)
fmt = {'format': 'yuv', 'width': VGA_W, 'height': VGA_H}
diff --git a/apps/CameraITS/tests/scene3/test_lens_movement_reporting.py b/apps/CameraITS/tests/scene3/test_lens_movement_reporting.py
index e67000f..1f3c97c 100644
--- a/apps/CameraITS/tests/scene3/test_lens_movement_reporting.py
+++ b/apps/CameraITS/tests/scene3/test_lens_movement_reporting.py
@@ -21,9 +21,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
FRAME_ATOL_MS = 10
@@ -117,7 +117,7 @@
cam, props, self.scene, self.tablet, self.chart_distance)
# Initialize chart class and locate chart in scene
- chart = cv2_image_processing_utils.Chart(
+ chart = opencv_processing_utils.Chart(
cam, props, self.log_path, chart_loc=chart_loc_arg)
# Get proper sensitivity, exposure time, and focus distance with 3A.
diff --git a/apps/CameraITS/tests/scene3/test_lens_position.py b/apps/CameraITS/tests/scene3/test_lens_position.py
index 1901d34..4d3e99c 100644
--- a/apps/CameraITS/tests/scene3/test_lens_position.py
+++ b/apps/CameraITS/tests/scene3/test_lens_position.py
@@ -21,10 +21,10 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import error_util
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
FRAME_ATOL_MS = 10 # ms
LENS_MOVING_STATE = 1
@@ -190,7 +190,7 @@
self.chart_distance)
# Initialize chart class and locate chart in scene
- chart = cv2_image_processing_utils.Chart(
+ chart = opencv_processing_utils.Chart(
cam, props, self.log_path, chart_loc=chart_loc_arg)
# Initialize capture format
diff --git a/apps/CameraITS/tests/scene3/test_reprocess_edge_enhancement.py b/apps/CameraITS/tests/scene3/test_reprocess_edge_enhancement.py
index e616ab2..1c17a73 100644
--- a/apps/CameraITS/tests/scene3/test_reprocess_edge_enhancement.py
+++ b/apps/CameraITS/tests/scene3/test_reprocess_edge_enhancement.py
@@ -23,9 +23,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
EDGE_MODES = {'OFF': 0, 'FAST': 1, 'HQ': 2, 'ZSL': 3}
EDGE_MODES_VALUES = list(EDGE_MODES.values())
@@ -37,9 +37,9 @@
def check_edge_modes(sharpness):
"""Check that the sharpness for the different edge modes is correct."""
- logging.debug(' Verify HQ is sharper than OFF')
+ logging.debug('Verify HQ is sharper than OFF')
if sharpness[EDGE_MODES['HQ']] < sharpness[EDGE_MODES['OFF']]:
- raise AssertionError(f"HQ: {sharpness[EDGE_MODES['HQ']]:.5f}, "
+ raise AssertionError(f"HQ < OFF! HQ: {sharpness[EDGE_MODES['HQ']]:.5f}, "
f"OFF: {sharpness[EDGE_MODES['OFF']]:.5f}")
logging.debug('Verify ZSL is similar to OFF')
@@ -115,7 +115,8 @@
edge_mode_res = caps[n]['metadata']['android.edge.mode']
sharpness_list.append(
image_processing_utils.compute_image_sharpness(chart.img))
-
+ logging.debug('Sharpness list for edge mode %d: %s',
+ edge_mode, str(sharpness_list))
return {'edge_mode': edge_mode_res, 'sharpness': np.mean(sharpness_list)}
@@ -155,7 +156,7 @@
cam, props, self.scene, self.tablet, self.chart_distance)
# Initialize chart class and locate chart in scene
- chart = cv2_image_processing_utils.Chart(
+ chart = opencv_processing_utils.Chart(
cam, props, self.log_path, chart_loc=chart_loc_arg)
# If reprocessing is supported, ZSL edge mode must be avaiable.
@@ -169,6 +170,7 @@
reprocess_formats.append('private')
size = capture_request_utils.get_available_output_sizes('jpg', props)[0]
+ logging.debug('image W: %d, H: %d', size[0], size[1])
out_surface = {'width': size[0], 'height': size[1], 'format': 'jpg'}
# Get proper sensitivity, exposure time, and focus distance.
diff --git a/apps/CameraITS/tests/scene4/test_aspect_ratio_and_crop.py b/apps/CameraITS/tests/scene4/test_aspect_ratio_and_crop.py
index b7dc193..284b66c 100644
--- a/apps/CameraITS/tests/scene4/test_aspect_ratio_and_crop.py
+++ b/apps/CameraITS/tests/scene4/test_aspect_ratio_and_crop.py
@@ -23,9 +23,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
_CIRCLE_COLOR = 0 # [0: black, 255: white].
_CIRCLE_MIN_AREA = 0.01 # 1% of image size.
@@ -221,10 +221,10 @@
# Find circle.
img_raw *= 255 # cv2 needs images between [0,255].
- circle_raw = cv2_image_processing_utils.find_circle(
+ circle_raw = opencv_processing_utils.find_circle(
img_raw, img_name, _CIRCLE_MIN_AREA, _CIRCLE_COLOR)
- cv2_image_processing_utils.append_circle_center_to_img(circle_raw, img_raw,
- img_name)
+ opencv_processing_utils.append_circle_center_to_img(circle_raw, img_raw,
+ img_name)
# Determine final return values.
aspect_ratio_gt = circle_raw['w'] / circle_raw['h']
@@ -267,10 +267,10 @@
img *= 255 # cv2 works with [0,255] images.
logging.debug('Captured JPEG %dx%d', w, h)
img_name = '%s_jpeg_w%d_h%d.png' % (os.path.join(log_path, _NAME), w, h)
- circle_jpg = cv2_image_processing_utils.find_circle(
+ circle_jpg = opencv_processing_utils.find_circle(
img, img_name, _CIRCLE_MIN_AREA, _CIRCLE_COLOR)
- cv2_image_processing_utils.append_circle_center_to_img(circle_jpg, img,
- img_name)
+ opencv_processing_utils.append_circle_center_to_img(circle_jpg, img,
+ img_name)
# Determine final return values.
cc_ct_gt = {'hori': circle_jpg['x_offset'], 'vert': circle_jpg['y_offset']}
@@ -528,11 +528,11 @@
img *= 255 # cv2 uses [0, 255].
img_name = '%s_%s_with_%s_w%d_h%d.png' % (
os.path.join(log_path, _NAME), fmt_iter, fmt_cmpr, w_iter, h_iter)
- circle = cv2_image_processing_utils.find_circle(
+ circle = opencv_processing_utils.find_circle(
img, img_name, _CIRCLE_MIN_AREA, _CIRCLE_COLOR)
if debug:
- cv2_image_processing_utils.append_circle_center_to_img(circle, img,
- img_name)
+ opencv_processing_utils.append_circle_center_to_img(circle, img,
+ img_name)
# Check pass/fail for fov coverage for all fmts in AR_CHECKED
img /= 255 # image_processing_utils uses [0, 1].
diff --git a/apps/CameraITS/tests/scene4/test_multi_camera_alignment.py b/apps/CameraITS/tests/scene4/test_multi_camera_alignment.py
index 2619c73..def3726 100644
--- a/apps/CameraITS/tests/scene4/test_multi_camera_alignment.py
+++ b/apps/CameraITS/tests/scene4/test_multi_camera_alignment.py
@@ -23,9 +23,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
ALIGN_TOL_MM = 4.0 # mm
ALIGN_TOL = 0.01 # multiplied by sensor diagonal to convert to pixels
@@ -108,19 +108,19 @@
logging.debug('Camera: %s, FoV: %.2f, chart_distance: %.1fcm', i, fov,
chart_distance)
# determine best combo with rig used or recommend different rig
- if (cv2_image_processing_utils.FOV_THRESH_TELE < fov <
- cv2_image_processing_utils.FOV_THRESH_WFOV):
+ if (opencv_processing_utils.FOV_THRESH_TELE < fov <
+ opencv_processing_utils.FOV_THRESH_WFOV):
test_ids.append(i) # RFoV camera
- elif fov < cv2_image_processing_utils.FOV_THRESH_SUPER_TELE:
+ elif fov < opencv_processing_utils.FOV_THRESH_SUPER_TELE:
logging.debug('Skipping camera. Not appropriate multi-camera testing.')
continue # super-TELE camera
- elif (fov <= cv2_image_processing_utils.FOV_THRESH_TELE and
+ elif (fov <= opencv_processing_utils.FOV_THRESH_TELE and
np.isclose(chart_distance,
- cv2_image_processing_utils.CHART_DISTANCE_RFOV, rtol=0.1)):
+ opencv_processing_utils.CHART_DISTANCE_RFOV, rtol=0.1)):
test_ids.append(i) # TELE camera in RFoV rig
- elif (fov >= cv2_image_processing_utils.FOV_THRESH_WFOV and
+ elif (fov >= opencv_processing_utils.FOV_THRESH_WFOV and
np.isclose(chart_distance,
- cv2_image_processing_utils.CHART_DISTANCE_WFOV, rtol=0.1)):
+ opencv_processing_utils.CHART_DISTANCE_WFOV, rtol=0.1)):
test_ids.append(i) # WFoV camera in WFoV rig
else:
logging.debug('Skipping camera. Not appropriate for test rig.')
@@ -492,7 +492,7 @@
os.path.join(log_path, NAME), fmt, i))
# Find the circles in grayscale image
- circle[i] = cv2_image_processing_utils.find_circle(
+ circle[i] = opencv_processing_utils.find_circle(
img, '%s_%s_gray_%s.jpg' % (os.path.join(log_path, NAME), fmt, i),
CIRCLE_MIN_AREA, CIRCLE_COLOR)
logging.debug('Circle radius %s: %.2f', format(i), circle[i]['r'])
diff --git a/apps/CameraITS/tests/scene6/test_zoom.py b/apps/CameraITS/tests/scene6/test_zoom.py
index 7a07d34..c621236 100644
--- a/apps/CameraITS/tests/scene6/test_zoom.py
+++ b/apps/CameraITS/tests/scene6/test_zoom.py
@@ -23,9 +23,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
CIRCLE_COLOR = 0 # [0: black, 255: white]
CIRCLE_TOL = 0.05 # contour area vs ideal circle area pi*((w+h)/4)**2
@@ -103,7 +103,7 @@
for contour in contours:
area = cv2.contourArea(contour)
if area > min_area and len(contour) >= MIN_CIRCLE_PTS:
- shape = cv2_image_processing_utils.component_shape(contour)
+ shape = opencv_processing_utils.component_shape(contour)
radius = (shape['width'] + shape['height']) / 4
colour = img_bw[shape['cty']][shape['ctx']]
circlish = round((math.pi * radius**2) / area, 4)
diff --git a/apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py b/apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py
index b380378..b99a740 100644
--- a/apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py
+++ b/apps/CameraITS/tests/sensor_fusion/test_multi_camera_frame_sync.py
@@ -26,9 +26,9 @@
import its_base_test
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import image_processing_utils
import its_session_utils
+import opencv_processing_utils
import sensor_fusion_utils
_ANGLE_90_MASK = 10 # (degrees) mask around 0/90 as rotated squares look same
@@ -161,8 +161,8 @@
req['android.lens.focusDistance'] = fd_chart
# Capture YUVs
- width = cv2_image_processing_utils.VGA_WIDTH
- height = cv2_image_processing_utils.VGA_HEIGHT
+ width = opencv_processing_utils.VGA_WIDTH
+ height = opencv_processing_utils.VGA_HEIGHT
out_surfaces = [{'format': 'yuv', 'width': width, 'height': height,
'physicalCamera': ids[0]},
{'format': 'yuv', 'width': width, 'height': height,
@@ -257,8 +257,8 @@
# Compute angles in frame pairs
frame_pairs_angles = [
- [cv2_image_processing_utils.get_angle(p[0]),
- cv2_image_processing_utils.get_angle(p[1])] for p in frame_pairs_gray]
+ [opencv_processing_utils.get_angle(p[0]),
+ opencv_processing_utils.get_angle(p[1])] for p in frame_pairs_gray]
# Remove frames where not enough squares were detected.
filtered_pairs_angles = _remove_frames_without_enough_squares(
diff --git a/apps/CameraITS/tests/sensor_fusion/test_sensor_fusion.py b/apps/CameraITS/tests/sensor_fusion/test_sensor_fusion.py
index f580558..c2eb156 100644
--- a/apps/CameraITS/tests/sensor_fusion/test_sensor_fusion.py
+++ b/apps/CameraITS/tests/sensor_fusion/test_sensor_fusion.py
@@ -273,7 +273,7 @@
# create mask
ymin = int(h * (1 - _FEATURE_MARGIN) / 2)
ymax = int(h * (1 + _FEATURE_MARGIN) / 2)
- mask = numpy.zeros_like(gframes[0])
+ mask = np.zeros_like(gframes[0])
mask[ymin:ymax, :] = 255
for i in range(1, len(gframes)):
@@ -322,7 +322,7 @@
Args:
best: x value of best fit data.
- coeff: 3 element np array. Return of numpy.polyfit(x,y) for 2nd order fit.
+ coeff: 3 element np array. Return of np.polyfit(x,y) for 2nd order fit.
x: np array of x data that was fit.
y: np array of y data that was fit.
log_path: where to store data.
diff --git a/apps/CameraITS/tools/run_all_tests.py b/apps/CameraITS/tools/run_all_tests.py
index d2be8cf..837cddb 100644
--- a/apps/CameraITS/tools/run_all_tests.py
+++ b/apps/CameraITS/tools/run_all_tests.py
@@ -116,6 +116,36 @@
}
+SUB_CAMERA_TESTS = {
+ 'scene0': [
+ 'test_burst_capture',
+ 'test_metadata',
+ 'test_read_write',
+ 'test_sensor_events',
+ 'test_solid_color_test_pattern',
+ 'test_unified_timestamps',
+ ],
+ 'scene1_1': [
+ 'test_exposure',
+ 'test_dng_noise_model',
+ 'test_linearity',
+ ],
+ 'scene1_2': [
+ 'test_raw_exposure',
+ 'test_raw_sensitivity',
+ ],
+ 'scene2_a': [
+ 'test_faces',
+ 'test_num_faces',
+ ],
+ 'scene4': [
+ 'test_aspect_ratio_and_crop',
+ ],
+ 'sensor_fusion': [
+ 'test_sensor_fusion',
+ ],
+}
+
_DST_SCENE_DIR = '/mnt/sdcard/Download/'
MOBLY_TEST_SUMMARY_TXT_FILE = 'test_mobly_summary.txt'
@@ -399,12 +429,16 @@
results[s] = {RESULT_KEY: RESULT_NOT_EXECUTED}
# A subdir in topdir will be created for each camera_id. All scene test
# output logs for each camera id will be stored in this subdir.
- os.mkdir(os.path.join(topdir, 'cam_id_' + camera_id))
# This output log path is a mobly param : LogPath
- mobly_output_logs_path = os.path.join(topdir, 'cam_id_' + camera_id)
+ cam_id_string = 'cam_id_%s' % (
+ camera_id.replace(its_session_utils.SUB_CAMERA_SEPARATOR, '_'))
+ mobly_output_logs_path = os.path.join(topdir, cam_id_string)
+ os.mkdir(mobly_output_logs_path)
tot_pass = 0
for s in scenes:
test_params_content['scene'] = s
+ results[s]['TEST_STATUS'] = []
+
# unit is millisecond for execution time record in CtsVerifier
scene_start_time = int(round(time.time() * 1000))
scene_test_summary = f'Cam{camera_id} {s}' + '\n'
@@ -432,15 +466,20 @@
logging.debug('Final config file contents: %s', config_file_contents)
new_yml_file_name = get_updated_yml_file(config_file_contents)
logging.info('Using %s as temporary config yml file', new_yml_file_name)
- scene_dir = os.listdir(
- os.path.join(os.environ['CAMERA_ITS_TOP'], 'tests', s))
- for file_name in scene_dir:
- if file_name.endswith('.py') and 'test' in file_name:
- scene_test_list.append(file_name)
-
- if _REPEATED_TESTS[s]:
- for t in _REPEATED_TESTS[s]:
- scene_test_list.append((os.path.join('tests', t[0], t[1] + '.py')))
+ if camera_id.rfind(its_session_utils.SUB_CAMERA_SEPARATOR) == -1:
+ scene_dir = os.listdir(
+ os.path.join(os.environ['CAMERA_ITS_TOP'], 'tests', s))
+ for file_name in scene_dir:
+ if file_name.endswith('.py') and 'test' in file_name:
+ scene_test_list.append(file_name)
+ if _REPEATED_TESTS[s]:
+ for t in _REPEATED_TESTS[s]:
+ scene_test_list.append((os.path.join('tests', t[0], t[1] + '.py')))
+ else: # sub-camera
+ if SUB_CAMERA_TESTS.get(s):
+ scene_test_list = [f'{test}.py' for test in SUB_CAMERA_TESTS[s]]
+ else:
+ scene_test_list = []
scene_test_list.sort()
# Run tests for scene
@@ -498,6 +537,8 @@
os.remove(MOBLY_TEST_SUMMARY_TXT_FILE)
logging.info('%s %s/%s', return_string, s, test)
+ test_name = test.split('/')[-1].split('.')[0]
+ results[s]['TEST_STATUS'].append({'test':test_name,'status':return_string.strip()})
msg_short = '%s %s' % (return_string, test)
scene_test_summary += msg_short + '\n'
@@ -520,18 +561,19 @@
tot_pass += num_pass
logging.info('scene tests: %s, Total tests passed: %s', tot_tests,
tot_pass)
- logging.info('%s compatibility score: %.f/100\n',
- s, 100 * num_pass / tot_tests)
-
- scene_test_summary_path = os.path.join(mobly_scene_output_logs_path,
- 'scene_test_summary.txt')
- with open(scene_test_summary_path, 'w') as f:
- f.write(scene_test_summary)
-
- results[s][RESULT_KEY] = (RESULT_PASS if num_fail == 0 else RESULT_FAIL)
- results[s][SUMMARY_KEY] = scene_test_summary_path
- results[s][TIME_KEY_START] = scene_start_time
- results[s][TIME_KEY_END] = scene_end_time
+ if tot_tests > 0:
+ logging.info('%s compatibility score: %.f/100\n',
+ s, 100 * num_pass / tot_tests)
+ scene_test_summary_path = os.path.join(mobly_scene_output_logs_path,
+ 'scene_test_summary.txt')
+ with open(scene_test_summary_path, 'w') as f:
+ f.write(scene_test_summary)
+ results[s][RESULT_KEY] = (RESULT_PASS if num_fail == 0 else RESULT_FAIL)
+ results[s][SUMMARY_KEY] = scene_test_summary_path
+ results[s][TIME_KEY_START] = scene_start_time
+ results[s][TIME_KEY_END] = scene_end_time
+ else:
+ logging.info('%s compatibility score: 0/100\n')
# Delete temporary yml file after scene run.
new_yaml_file_path = os.path.join(YAML_FILE_DIR, new_yml_file_name)
diff --git a/apps/CameraITS/utils/its_session_utils.py b/apps/CameraITS/utils/its_session_utils.py
index 7b2c6b8..019da6f 100644
--- a/apps/CameraITS/utils/its_session_utils.py
+++ b/apps/CameraITS/utils/its_session_utils.py
@@ -29,9 +29,9 @@
import camera_properties_utils
import capture_request_utils
-import cv2_image_processing_utils
import error_util
import image_processing_utils
+import opencv_processing_utils
LOAD_SCENE_DELAY_SEC = 3
SUB_CAMERA_SEPARATOR = '.'
@@ -1004,20 +1004,20 @@
file_name: file name to display on the tablet.
"""
- chart_scaling = cv2_image_processing_utils.calc_chart_scaling(
+ chart_scaling = opencv_processing_utils.calc_chart_scaling(
chart_distance, camera_fov)
if numpy.isclose(
chart_scaling,
- cv2_image_processing_utils.SCALE_TELE_IN_WFOV_BOX,
+ opencv_processing_utils.SCALE_TELE_IN_WFOV_BOX,
atol=0.01):
file_name = '%s_%sx_scaled.pdf' % (
- scene, str(cv2_image_processing_utils.SCALE_TELE_IN_WFOV_BOX))
+ scene, str(opencv_processing_utils.SCALE_TELE_IN_WFOV_BOX))
elif numpy.isclose(
chart_scaling,
- cv2_image_processing_utils.SCALE_RFOV_IN_WFOV_BOX,
+ opencv_processing_utils.SCALE_RFOV_IN_WFOV_BOX,
atol=0.01):
file_name = '%s_%sx_scaled.pdf' % (
- scene, str(cv2_image_processing_utils.SCALE_RFOV_IN_WFOV_BOX))
+ scene, str(opencv_processing_utils.SCALE_RFOV_IN_WFOV_BOX))
else:
file_name = '%s.pdf' % scene
logging.debug('Scene to load: %s', file_name)
@@ -1054,6 +1054,25 @@
return data['strValue'] == 'supportedCombination'
+ def is_camera_privacy_mode_supported(self):
+ """Query whether the mobile device supports camera privacy mode.
+
+ This function checks whether the mobile device has FEATURE_CAMERA_TOGGLE
+ feature support, which indicates the camera device can run in privacy mode.
+
+ Returns:
+ Boolean
+ """
+ cmd = {}
+ cmd['cmdName'] = 'isCameraPrivacyModeSupported'
+ self.sock.send(json.dumps(cmd).encode() + '\n'.encode())
+
+ data, _ = self.__read_response_from_socket()
+ if data['tag'] != 'cameraPrivacyModeSupport':
+ raise error_util.CameraItsError('Failed to query camera privacy mode'
+ ' support')
+ return data['strValue'] == 'true'
+
def parse_camera_ids(ids):
"""Parse the string of camera IDs into array of CameraIdCombo tuples.
@@ -1128,14 +1147,14 @@
rfov_camera_in_rfov_box = (
numpy.isclose(
chart_distance,
- cv2_image_processing_utils.CHART_DISTANCE_RFOV, rtol=0.1) and
- cv2_image_processing_utils.FOV_THRESH_TELE <= float(camera_fov)
- <= cv2_image_processing_utils.FOV_THRESH_WFOV)
+ opencv_processing_utils.CHART_DISTANCE_RFOV, rtol=0.1) and
+ opencv_processing_utils.FOV_THRESH_TELE <= float(camera_fov)
+ <= opencv_processing_utils.FOV_THRESH_WFOV)
wfov_camera_in_wfov_box = (
numpy.isclose(
chart_distance,
- cv2_image_processing_utils.CHART_DISTANCE_WFOV, rtol=0.1) and
- float(camera_fov) > cv2_image_processing_utils.FOV_THRESH_WFOV)
+ opencv_processing_utils.CHART_DISTANCE_WFOV, rtol=0.1) and
+ float(camera_fov) > opencv_processing_utils.FOV_THRESH_WFOV)
if rfov_camera_in_rfov_box or wfov_camera_in_wfov_box:
cam.do_3a()
cap = cam.do_capture(
diff --git a/apps/CameraITS/utils/cv2_image_processing_utils.py b/apps/CameraITS/utils/opencv_processing_utils.py
similarity index 98%
rename from apps/CameraITS/utils/cv2_image_processing_utils.py
rename to apps/CameraITS/utils/opencv_processing_utils.py
index 55f341d..137e0a3 100644
--- a/apps/CameraITS/utils/cv2_image_processing_utils.py
+++ b/apps/CameraITS/utils/opencv_processing_utils.py
@@ -58,6 +58,7 @@
SCALE_RFOV_IN_WFOV_BOX = 0.67
SCALE_TELE_IN_RFOV_BOX = 0.67
SCALE_TELE_IN_WFOV_BOX = 0.5
+SCALE_SUPER_TELE_IN_RFOV_BOX = 0.5
SQUARE_AREA_MIN_REL = 0.05 # Minimum size for square relative to image area
SQUARE_TOL = 0.1 # Square W vs H mismatch RTOL
@@ -96,6 +97,9 @@
elif (camera_fov <= FOV_THRESH_TELE and
numpy.isclose(chart_distance, CHART_DISTANCE_WFOV, rtol=0.1)):
chart_scaling = SCALE_TELE_IN_WFOV_BOX
+ elif (camera_fov <= FOV_THRESH_SUPER_TELE and
+ numpy.isclose(chart_distance, CHART_DISTANCE_RFOV, rtol=0.1)):
+ chart_scaling = SCALE_SUPER_TELE_IN_RFOV_BOX
elif (camera_fov <= FOV_THRESH_TELE and
numpy.isclose(chart_distance, CHART_DISTANCE_RFOV, rtol=0.1)):
chart_scaling = SCALE_TELE_IN_RFOV_BOX
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index cac1dc5..51b40ce 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -2396,6 +2396,12 @@
<string name="request_manage_credentials">Request to manage credentials</string>
<string name="is_credential_management_app">Check is credential management app</string>
<string name="credential_management_app_policy">Check correct authentication policy is set</string>
+ <string name="generate_key_pair">Generate key pair</string>
+ <string name="create_and_install_certificate">Create and install certificate</string>
+ <string name="request_certificate_authentication">Request certificate for authentication</string>
+ <string name="sign_data_with_key">Sign data with the private key</string>
+ <string name="verify_signature">Verify signature with the public key</string>
+ <string name="remove_credential_management_app">Remove credential management app</string>
<!-- Strings for Widget -->
<string name="widget_framework_test">Widget Framework Test</string>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java b/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
index 48f4c6b..75a9adc 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
@@ -407,7 +407,7 @@
.loadClass("android.os.SystemProperties")
.getMethod("get", String.class);
String emulatorKernel = (String) getStringMethod.invoke("0",
- "ro.kernel.qemu");
+ "ro.boot.qemu");
if (emulatorKernel.equals("1")) {
return false;
}
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 7ce97fe..8792ece 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
@@ -22,6 +22,7 @@
import android.app.Service;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.graphics.ImageFormat;
import android.graphics.Rect;
@@ -231,6 +232,8 @@
private HandlerThread mSensorThread = null;
private Handler mSensorHandler = null;
+ private PackageManager mPackageManager;
+
private static final int SERIALIZER_SURFACES_ID = 2;
private static final int SERIALIZER_PHYSICAL_METADATA_ID = 3;
@@ -312,6 +315,8 @@
mChannel.setDescription("ItsServiceChannel");
mChannel.enableVibration(false);
notificationManager.createNotificationChannel(mChannel);
+
+ mPackageManager = getPackageManager();
}
@Override
@@ -709,6 +714,8 @@
mSocketRunnableObj.sendResponse("ItsVersion", ITS_SERVICE_VERSION);
} else if ("isStreamCombinationSupported".equals(cmdObj.getString("cmdName"))) {
doCheckStreamCombination(cmdObj);
+ } else if ("isCameraPrivacyModeSupported".equals(cmdObj.getString("cmdName"))) {
+ doCheckCameraPrivacyModeSupport();
} else {
throw new ItsException("Unknown command: " + cmd);
}
@@ -1038,6 +1045,13 @@
}
}
+ private void doCheckCameraPrivacyModeSupport() throws ItsException {
+ boolean hasPrivacySupport = mPackageManager.hasSystemFeature(
+ PackageManager.FEATURE_CAMERA_TOGGLE);
+ mSocketRunnableObj.sendResponse("cameraPrivacyModeSupport",
+ hasPrivacySupport ? "true" : "false");
+ }
+
private void prepareImageReaders(Size[] outputSizes, int[] outputFormats, Size inputSize,
int inputFormat, int maxInputBuffers) {
closeImageReaders();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java
index fb4a893..cd75746 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java
@@ -38,6 +38,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.io.BufferedReader;
@@ -83,7 +84,7 @@
List<String> mToBeTestedCameraIds = null;
// Scenes
- private static final ArrayList<String> mSceneIds = new ArrayList<String> () { {
+ private static final ArrayList<String> mSceneIds = new ArrayList<String> () {{
add("scene0");
add("scene1_1");
add("scene1_2");
@@ -97,17 +98,147 @@
add("scene5");
add("scene_change");
add("sensor_fusion");
- } };
+ }};
// This must match scenes of HIDDEN_PHYSICAL_CAMERA_TESTS in run_all_tests.py
private static final ArrayList<String> mHiddenPhysicalCameraSceneIds =
- new ArrayList<String> () { {
+ new ArrayList<String> () {{
add("scene0");
add("scene1_1");
add("scene1_2");
add("scene2_a");
add("scene4");
add("sensor_fusion");
- }};
+ }};
+
+ private static final ArrayList<String> mScene0Tests = new ArrayList<String>() {{
+ add("test_burst_capture");
+ add("test_capture_result_dump");
+ add("test_gyro_bias");
+ add("test_jitter");
+ add("test_metadata");
+ add("test_param_sensitivity_burst");
+ add("test_read_write");
+ add("test_sensor_events");
+ add("test_solid_color_test_pattern");
+ add("test_test_patterns");
+ add("test_tonemap_curve");
+ add("test_unified_timestamps");
+ add("test_vibration_restriction");
+ }};
+
+ private static final ArrayList<String> mScene1_1Tests = new ArrayList<String>() {{
+ add("test_3a");
+ add("test_ae_af");
+ add("test_ae_precapture_trigger");
+ add("test_auto_vs_manual");
+ add("test_black_white");
+ add("test_burst_sameness_manual");
+ add("test_capture_result");
+ add("test_crop_region_raw");
+ add("test_crop_regions");
+ add("test_dng_noise_model");
+ add("test_ev_compensation_advanced");
+ add("test_ev_compensation_basic");
+ add("test_exposure");
+ add("test_jpeg");
+ add("test_latching");
+ add("test_linearity");
+ add("test_locked_burst");
+ add("test_multi_camera_match");
+ add("test_param_color_correction");
+ add("test_param_exposure_time");
+ add("test_param_flash_mode");
+ add("test_param_noise_reduction");
+ }};
+
+ private static final ArrayList<String> mScene1_2Tests = new ArrayList<String>() {{
+ add("test_param_sensitivity");
+ add("test_param_shading_mode");
+ add("test_param_tonemap_mode");
+ add("test_post_raw_sensitivity_boost");
+ add("test_raw_exposure");
+ add("test_raw_sensitivity_burst");
+ add("test_raw_sensitivity");
+ add("test_reprocess_noise_reduction");
+ add("test_tonemap_sequence");
+ add("test_yuv_jpeg_all");
+ add("test_yuv_plus_dng");
+ add("test_yuv_plus_jpeg");
+ add("test_yuv_plus_raw");
+ add("test_yuv_plus_raw10");
+ add("test_yuv_plus_raw12");
+ }};
+
+ private static final ArrayList<String> mScene2_aTests = new ArrayList<String>() {{
+ add("test_effects");
+ add("test_faces");
+ add("test_format_combos");
+ add("test_jpeg_quality");
+ add("test_num_faces");
+ }};
+
+ private static final ArrayList<String> mScene2_bTests = new ArrayList<String>() {{
+ add("test_auto_per_frame_control");
+ add("test_num_faces");
+ }};
+
+ private static final ArrayList<String> mScene2_cTests = new ArrayList<String>() {{
+ add("test_num_faces");
+ }};
+
+ private static final ArrayList<String> mScene2_dTests = new ArrayList<String>() {{
+ add("test_num_faces");
+ }};
+
+ private static final ArrayList<String> mScene2_eTests = new ArrayList<String>() {{
+ add("test_num_faces");
+ add("test_continuous_picture");
+ }};
+
+ private static final ArrayList<String> mScene3Tests = new ArrayList<String>() {{
+ add("test_3a_consistency");
+ add("test_edge_enhancement");
+ add("test_flip_mirror");
+ add("test_lens_movement_reporting");
+ add("test_lens_position");
+ add("test_reprocess_edge_enhancement");
+ }};
+
+ private static final ArrayList<String> mScene4Tests = new ArrayList<String>() {{
+ add("test_aspect_ratio_and_crop");
+ add("test_multi_camera_alignment");
+ }};
+
+ private static final ArrayList<String> mScene5Tests = new ArrayList<String>() {{
+ add("test_lens_shading_and_color_uniformity");
+ }};
+
+ private static final ArrayList<String> mSceneChangeTests = new ArrayList<String>() {{
+ add("test_scene_change");
+ }};
+
+ private static final ArrayList<String> mSensorFusionTests = new ArrayList<String>() {{
+ add("test_multi_camera_frame_sync");
+ add("test_sensor_fusion");
+ }};
+
+ private static final HashMap<String,ArrayList<String>> mSceneTestMap =
+ new HashMap<String,ArrayList<String>>() {{
+ put("scene0", mScene0Tests);
+ put("scene1_1",mScene1_1Tests );
+ put("scene1_2", mScene1_2Tests);
+ put("scene2_a",mScene2_aTests);
+ put("scene2_b",mScene2_bTests);
+ put("scene2_c",mScene2_cTests);
+ put("scene2_d", mScene2_dTests);
+ put("scene2_e",mScene2_eTests);
+ put("scene3",mScene3Tests);
+ put("scene4",mScene4Tests);
+ put("scene5",mScene5Tests);
+ put("scene_change",mSceneChangeTests);
+ put("sensor_fusion",mSensorFusionTests);
+ }};
+
// TODO: cache the following in saved bundle
private Set<ResultKey> mAllScenes = null;
@@ -239,7 +370,36 @@
// Update test execution results
for (String scene : scenes) {
+ HashMap<String, String> executedTests = new HashMap<>();
JSONObject sceneResult = jsonResults.getJSONObject(scene);
+ Log.v(TAG, sceneResult.toString());
+ if(sceneResult.has("TEST_STATUS")){
+ JSONArray testResults = sceneResult.getJSONArray("TEST_STATUS");
+ for(int i=0;i < testResults.length();i++){
+ JSONObject obj = (JSONObject)testResults.get(i);
+ String test_name = obj.get("test").toString();
+ String test_status = obj.get("status").toString();
+ executedTests.put(test_name,test_status);
+ }
+ Log.v(TAG,"Individual test results are:" + executedTests.toString());
+ for (Map.Entry<String,String> entry : executedTests.entrySet()){
+ int testResult;
+ String test_name,status;
+ test_name = entry.getKey();
+ status = entry.getValue();
+ if(status.equals("PASS")) {
+ testResult = TestResult.TEST_RESULT_PASSED;
+ } else if (status.equals("SKIP")) {
+ testResult = TestResult.TEST_RESULT_NOT_EXECUTED;
+ } else {
+ testResult = TestResult.TEST_RESULT_FAILED;
+ }
+ setTestResult(testId(cameraId, scene) + "_" + test_name, testResult);
+ Log.v(TAG, "setTestResult for " +
+ testId(cameraId, scene) + "_" + test_name + ": " + testResult);
+ }
+
+ }
String result = sceneResult.getString("result");
if (result == null) {
Log.e(TAG, "Result for " + scene + " is null");
@@ -405,6 +565,13 @@
adapter.add(new DialogTestListItem(this,
testTitle(cam, scene),
testId(cam, scene)));
+ if(mSceneTestMap.containsKey(scene)){
+ ArrayList<String> testList = mSceneTestMap.get(scene);
+ for(String test_name : testList){
+ adapter.add(new DialogTestListItem(
+ this,test_name,testId(cam, scene) + "_" + test_name));
+ }
+ }
}
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/CredentialManagementAppActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/CredentialManagementAppActivity.java
index 6cb48bc..2d58d17 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/security/CredentialManagementAppActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/CredentialManagementAppActivity.java
@@ -16,22 +16,42 @@
package com.android.cts.verifier.security;
+import static android.keystore.cts.CertificateUtils.createCertificate;
+
+import android.app.admin.DevicePolicyManager;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.security.AppUriAuthenticationPolicy;
+import android.security.AttestedKeyPair;
import android.security.KeyChain;
+import android.security.KeyChainAliasCallback;
+import android.security.KeyChainException;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyProperties;
+import android.util.Log;
import com.android.cts.verifier.ArrayTestListAdapter;
import com.android.cts.verifier.DialogTestListActivity;
import com.android.cts.verifier.R;
import com.android.cts.verifier.TestResult;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import javax.security.auth.x500.X500Principal;
+
/**
* CTS verifier test for credential management on unmanaged device.
*
@@ -40,6 +60,12 @@
* Can successfully request to become the Credential management app
* The credential management app is correctly set
* The authentication policy is correctly set
+ * The credential management app can generate a key pair
+ * The credential management app can install a certificate
+ * The credential management app can successfully predefine which alias should be used for
+ * authentication to a remote service
+ * The chosen alias can be used to get the private key to sign data and the public key to
+ * validate the signature.
*/
public class CredentialManagementAppActivity extends DialogTestListActivity {
@@ -47,21 +73,38 @@
private static final int REQUEST_MANAGE_CREDENTIALS_STATUS = 0;
- private static final String TEST_APP_PACKAGE_NAME = "com.test.pkg";
+ private static final String TEST_APP_PACKAGE_NAME = "com.android.cts.verifier";
private static final Uri TEST_URI = Uri.parse("https://test.com");
private static final String TEST_ALIAS = "testAlias";
private static final AppUriAuthenticationPolicy AUTHENTICATION_POLICY =
new AppUriAuthenticationPolicy.Builder()
.addAppAndUriMapping(TEST_APP_PACKAGE_NAME, TEST_URI, TEST_ALIAS)
.build();
+ private static final String KEY_ALGORITHM = "RSA";
+ private static final byte[] DATA = "test".getBytes();
+
+ private DevicePolicyManager mDevicePolicyManager;
private DialogTestListItem mRequestManageCredentials;
private DialogTestListItem mCheckIsCredentialManagementApp;
private DialogTestListItem mCheckAuthenticationPolicy;
+ private DialogTestListItem mGenerateKeyPair;
+ private DialogTestListItem mCreateAndInstallCertificate;
+ private DialogTestListItem mRequestCertificateForAuthentication;
+ private DialogTestListItem mSignDataWithKey;
+ private DialogTestListItem mVerifySignature;
+ private DialogTestListItem mRemoveCredentialManagementApp;
+
+ private AttestedKeyPair mAttestedKeyPair;
+ private X509Certificate mCertificate;
+ private String mChosenAlias;
+ private byte[] mSignature;
private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
private final Handler mHandler = new Handler(Looper.getMainLooper());
+ private boolean mHasCredentialManagementApp = false;
+
public CredentialManagementAppActivity() {
super(R.layout.credential_management_app_test,
R.string.credential_management_app_test,
@@ -72,6 +115,16 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
+ }
+
+ @Override
+ public void finish() {
+ super.finish();
+ if (mHasCredentialManagementApp) {
+ mExecutor.execute(
+ () -> KeyChain.removeCredentialManagementApp(getApplicationContext()));
+ }
}
@Override
@@ -104,6 +157,60 @@
}
};
testAdapter.add(mCheckAuthenticationPolicy);
+ mGenerateKeyPair = new DialogTestListItem(this,
+ R.string.generate_key_pair,
+ "generate_key_pair") {
+ @Override
+ public void performTest(DialogTestListActivity activity) {
+ generateKeyPair();
+ }
+ };
+ testAdapter.add(mGenerateKeyPair);
+ mCreateAndInstallCertificate = new DialogTestListItem(this,
+ R.string.create_and_install_certificate,
+ "create_and_install_certificate") {
+ @Override
+ public void performTest(DialogTestListActivity activity) {
+ createAndInstallCertificate();
+ }
+ };
+ testAdapter.add(mCreateAndInstallCertificate);
+ mRequestCertificateForAuthentication = new DialogTestListItem(this,
+ R.string.request_certificate_authentication,
+ "request_certificate_authentication") {
+ @Override
+ public void performTest(DialogTestListActivity activity) {
+ requestCertificateForAuthentication();
+ }
+ };
+ testAdapter.add(mRequestCertificateForAuthentication);
+ mSignDataWithKey = new DialogTestListItem(this,
+ R.string.sign_data_with_key,
+ "sign_data_with_key") {
+ @Override
+ public void performTest(DialogTestListActivity activity) {
+ getPrivateKeyAndSignData();
+ }
+ };
+ testAdapter.add(mSignDataWithKey);
+ mVerifySignature = new DialogTestListItem(this,
+ R.string.verify_signature,
+ "verify_signature") {
+ @Override
+ public void performTest(DialogTestListActivity activity) {
+ getPublicKeyAndVerifySignature();
+ }
+ };
+ testAdapter.add(mVerifySignature);
+ mRemoveCredentialManagementApp = new DialogTestListItem(this,
+ R.string.remove_credential_management_app,
+ "remove_credential_management_app") {
+ @Override
+ public void performTest(DialogTestListActivity activity) {
+ removeCredentialManagementApp();
+ }
+ };
+ testAdapter.add(mRemoveCredentialManagementApp);
}
private void checkIsCredentialManagementApp() {
@@ -123,6 +230,110 @@
});
}
+ private void generateKeyPair() {
+ mExecutor.execute(() -> {
+ KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(
+ TEST_ALIAS, KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+ .setKeySize(2048)
+ .setDigests(KeyProperties.DIGEST_SHA256)
+ .setSignaturePaddings(
+ KeyProperties.SIGNATURE_PADDING_RSA_PSS,
+ KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+ .build();
+ mAttestedKeyPair = mDevicePolicyManager.generateKeyPair(null, KEY_ALGORITHM,
+ keyGenParameterSpec, 0);
+ mHandler.post(() -> setResult(mGenerateKeyPair, mAttestedKeyPair != null));
+ });
+ }
+
+ private void createAndInstallCertificate() {
+ X500Principal issuer = new X500Principal("CN=SelfSigned, O=Android, C=US");
+ X500Principal subject = new X500Principal("CN=Subject, O=Android, C=US");
+ try {
+ mCertificate = createCertificate(mAttestedKeyPair.getKeyPair(), subject, issuer);
+ setResult(mCreateAndInstallCertificate,
+ mDevicePolicyManager.setKeyPairCertificate(null, TEST_ALIAS,
+ Arrays.asList(new X509Certificate[]{mCertificate}), false));
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to create certificate", e);
+ setResult(mCreateAndInstallCertificate, false);
+ }
+ }
+
+ private void requestCertificateForAuthentication() {
+ String[] keyTypes = new String[]{KEY_ALGORITHM};
+ Principal[] issuers = new Principal[0];
+ TestKeyChainAliasCallback callback = new TestKeyChainAliasCallback();
+ KeyChain.choosePrivateKeyAlias(this, callback, keyTypes, issuers, TEST_URI, null);
+ }
+
+ private void getPrivateKeyAndSignData() {
+ // Get private key with chosen alias
+ mExecutor.execute(() -> {
+ try {
+ final PrivateKey privateKey = KeyChain.getPrivateKey(
+ getApplicationContext(), mChosenAlias);
+ mHandler.post(() -> {
+ // Sign data with the private key
+ try {
+ Signature sign = Signature.getInstance("SHA256withRSA");
+ sign.initSign(privateKey);
+ sign.update(DATA);
+ mSignature = sign.sign();
+ } catch (NoSuchAlgorithmException | InvalidKeyException
+ | SignatureException e) {
+ Log.w(TAG, "Failed to sign data with key", e);
+ }
+ setResult(mSignDataWithKey, mSignature != null);
+ });
+ } catch (KeyChainException | InterruptedException e) {
+ Log.w(TAG, "Failed to get the private key", e);
+ }
+ });
+ }
+
+ private void getPublicKeyAndVerifySignature() {
+ // Get public key from certificate with chosen alias
+ mExecutor.execute(() -> {
+ try {
+ X509Certificate[] certChain =
+ KeyChain.getCertificateChain(getApplicationContext(), mChosenAlias);
+ mHandler.post(() -> {
+ boolean verified = false;
+ if (certChain != null && certChain.length > 0) {
+ PublicKey publicKey = certChain[0].getPublicKey();
+ // Verify the signature with the public key
+ try {
+ Signature verify = Signature.getInstance("SHA256withRSA");
+ verify.initVerify(publicKey);
+ verify.update(DATA);
+ verified = verify.verify(mSignature);
+ } catch (NoSuchAlgorithmException | InvalidKeyException
+ | SignatureException e) {
+ Log.w(TAG, "Failed to verify signature", e);
+ }
+ }
+ setResult(mVerifySignature, verified);
+ });
+ } catch (KeyChainException | InterruptedException e) {
+ Log.w(TAG, "Failed to get the public key", e);
+ }
+ });
+ }
+
+ private void removeCredentialManagementApp() {
+ mExecutor.execute(() -> {
+ final boolean result =
+ KeyChain.removeCredentialManagementApp(getApplicationContext());
+ mHandler.post(() -> {
+ setResult(mRemoveCredentialManagementApp, result);
+ if (result) {
+ mHasCredentialManagementApp = false;
+ }
+ });
+ });
+ }
+
private void setResult(DialogTestListItem testListItem, boolean passed) {
if (passed) {
setTestResult(testListItem, TestResult.TEST_RESULT_PASSED);
@@ -136,9 +347,20 @@
switch (requestCode) {
case REQUEST_MANAGE_CREDENTIALS_STATUS:
setResult(mRequestManageCredentials, resultCode == RESULT_OK);
+ if (resultCode == RESULT_OK) {
+ mHasCredentialManagementApp = true;
+ }
break;
default:
super.handleActivityResult(requestCode, resultCode, data);
}
}
+
+ private class TestKeyChainAliasCallback implements KeyChainAliasCallback {
+ @Override
+ public void alias(String alias) {
+ mChosenAlias = alias;
+ setResult(mRequestCertificateForAuthentication, mChosenAlias.equals(TEST_ALIAS));
+ }
+ }
}
diff --git a/build/test_executable.mk b/build/test_executable.mk
index 1ff9a51..8dca32c 100644
--- a/build/test_executable.mk
+++ b/build/test_executable.mk
@@ -18,4 +18,11 @@
# Replace "include $(BUILD_EXECUTABLE)" with "include $(BUILD_CTS_EXECUTABLE)"
#
+# Implicitly run this test under MTE SYNC for aarch64 binaries. This is a no-op
+# on non-MTE hardware.
+my_arch := $(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)
+ifneq (,$(filter arm64,$(my_arch)))
+ LOCAL_WHOLE_STATIC_LIBRARIES += note_memtag_heap_sync
+endif
+
include $(BUILD_EXECUTABLE)
diff --git a/common/device-side/bedstead/activitycontext/TEST_MAPPING b/common/device-side/bedstead/activitycontext/TEST_MAPPING
index b030d9d..16016dc 100644
--- a/common/device-side/bedstead/activitycontext/TEST_MAPPING
+++ b/common/device-side/bedstead/activitycontext/TEST_MAPPING
@@ -1,5 +1,5 @@
{
- "presubmit": [
+ "postsubmit": [
{
"name": "ActivityContextTest"
},
diff --git a/common/device-side/bedstead/deviceadminapp/TEST_MAPPING b/common/device-side/bedstead/deviceadminapp/TEST_MAPPING
index 6831197..364e9b7 100644
--- a/common/device-side/bedstead/deviceadminapp/TEST_MAPPING
+++ b/common/device-side/bedstead/deviceadminapp/TEST_MAPPING
@@ -1,5 +1,5 @@
{
- "presubmit": [
+ "postsubmit": [
{
"name": "DeviceAdminAppTests"
}
diff --git a/common/device-side/bedstead/deviceadminapp/src/main/AndroidManifest.xml b/common/device-side/bedstead/deviceadminapp/src/main/AndroidManifest.xml
index 7733f55..35b0796 100644
--- a/common/device-side/bedstead/deviceadminapp/src/main/AndroidManifest.xml
+++ b/common/device-side/bedstead/deviceadminapp/src/main/AndroidManifest.xml
@@ -19,7 +19,7 @@
package="com.android.bedstead.deviceadminapp"
android:targetSandboxVersion="2">
- <application>
+ <application android:testOnly="true">
<receiver android:name="com.android.eventlib.premade.EventLibDeviceAdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true">
diff --git a/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/DevicePolicyManagerWrapper.java b/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/DevicePolicyManagerWrapper.java
index 6e874b6..6abf302 100644
--- a/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/DevicePolicyManagerWrapper.java
+++ b/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/DevicePolicyManagerWrapper.java
@@ -76,10 +76,6 @@
doAnswer(answer).when(spy).enableSystemApp(any(), any(Intent.class));
doAnswer(answer).when(spy).canAdminGrantSensorsPermissions();
- // Used by HeadlessSystemUserTest
- doAnswer(answer).when(spy).getProfileOwnerAsUser(anyInt());
- doAnswer(answer).when(spy).getProfileOwnerAsUser(any());
-
// Used by NetworkLoggingTest
doAnswer(answer).when(spy).retrieveNetworkLogs(any(), anyLong());
doAnswer(answer).when(spy).setNetworkLoggingEnabled(any(), anyBoolean());
diff --git a/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/TestAppCallbacksReceiver.java b/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/TestAppCallbacksReceiver.java
index 23ffe82..d3ec6bb 100644
--- a/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/TestAppCallbacksReceiver.java
+++ b/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/TestAppCallbacksReceiver.java
@@ -61,22 +61,21 @@
private static final ArrayMap<String, ArrayList<BroadcastReceiver>> sRealReceivers =
new ArrayMap<>();
- /**
- * Called by {@code ActivityManager} to deliver an intent.
- */
- public TestAppCallbacksReceiver() {
- assertCurrentUserOnHeadlessSystemMode();
- if (sHandlerThread == null) {
- sHandlerThread = new HandlerThread("NonDeviceOwnerCallbackReceiverThread");
- Log.i(TAG, "Starting thread " + sHandlerThread + " on user " + MY_USER_ID);
- sHandlerThread.start();
- sHandler = new Handler(sHandlerThread.getLooper());
- }
+ private static void setHandlerThread() {
+ if (sHandlerThread != null) return;
+
+ sHandlerThread = new HandlerThread("TestAppCallbacksReceiverThread");
+ Log.i(TAG, "Starting thread " + sHandlerThread + " on user " + MY_USER_ID);
+ sHandlerThread.start();
+ sHandler = new Handler(sHandlerThread.getLooper());
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, " received intent on user " + context.getUserId() + ": " + intent);
+ assertCurrentUserOnHeadlessSystemMode(context);
+ setHandlerThread();
+
Intent realIntent = intent.getParcelableExtra(EXTRA);
if (realIntent == null) {
Log.e(TAG, "No " + EXTRA + " on intent " + intent);
diff --git a/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/TestAppHelper.java b/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/TestAppHelper.java
index 33f8d78..e4d5ea6 100644
--- a/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/TestAppHelper.java
+++ b/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/TestAppHelper.java
@@ -37,7 +37,7 @@
*/
public static void registerTestCaseReceiver(Context context, BroadcastReceiver receiver,
IntentFilter filter) {
- if (isCurrentUserOnHeadlessSystemUser()) {
+ if (isCurrentUserOnHeadlessSystemUser(context)) {
TestAppCallbacksReceiver.registerReceiver(context, receiver, filter);
return;
}
@@ -51,7 +51,7 @@
* device owner's {@link android.app.admin.DeviceAdminReceiver}.
*/
public static void unregisterTestCaseReceiver(Context context, BroadcastReceiver receiver) {
- if (isCurrentUserOnHeadlessSystemUser()) {
+ if (isCurrentUserOnHeadlessSystemUser(context)) {
TestAppCallbacksReceiver.unregisterReceiver(context, receiver);
return;
}
diff --git a/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/Utils.java b/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/Utils.java
index 65d4806..8b2c09b 100644
--- a/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/Utils.java
+++ b/common/device-side/bedstead/dpmwrapper/src/main/java/com/android/bedstead/dpmwrapper/Utils.java
@@ -16,6 +16,7 @@
package com.android.bedstead.dpmwrapper;
import android.app.ActivityManager;
+import android.content.Context;
import android.content.IntentFilter;
import android.os.UserHandle;
import android.os.UserManager;
@@ -37,13 +38,13 @@
return UserManager.isHeadlessSystemUserMode() && MY_USER_ID == UserHandle.USER_SYSTEM;
}
- static boolean isCurrentUserOnHeadlessSystemUser() {
+ static boolean isCurrentUserOnHeadlessSystemUser(Context context) {
return UserManager.isHeadlessSystemUserMode()
- && MY_USER_ID == ActivityManager.getCurrentUser();
+ && context.getSystemService(UserManager.class).isUserForeground();
}
- static void assertCurrentUserOnHeadlessSystemMode() {
- if (isCurrentUserOnHeadlessSystemUser()) return;
+ static void assertCurrentUserOnHeadlessSystemMode(Context context) {
+ if (isCurrentUserOnHeadlessSystemUser(context)) return;
throw new IllegalStateException("Should only be called by current user ("
+ ActivityManager.getCurrentUser() + ") on headless system user device, but was "
diff --git a/common/device-side/bedstead/eventlib/Android.bp b/common/device-side/bedstead/eventlib/Android.bp
index 46072fd..52545a6 100644
--- a/common/device-side/bedstead/eventlib/Android.bp
+++ b/common/device-side/bedstead/eventlib/Android.bp
@@ -4,7 +4,7 @@
android_library {
name: "EventLib",
- sdk_version: "current",
+ sdk_version: "test_current",
srcs: [
"src/main/java/**/*.java",
"src/main/aidl/**/I*.aidl",
diff --git a/common/device-side/bedstead/eventlib/TEST_MAPPING b/common/device-side/bedstead/eventlib/TEST_MAPPING
index c19ccac..6aff883 100644
--- a/common/device-side/bedstead/eventlib/TEST_MAPPING
+++ b/common/device-side/bedstead/eventlib/TEST_MAPPING
@@ -1,5 +1,5 @@
{
- "presubmit": [
+ "postsubmit": [
{
"name": "EventLibTest"
}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/broadcastreceivers/BroadcastReceivedEvent.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/broadcastreceivers/BroadcastReceivedEvent.java
index fc181c6..b67264d 100644
--- a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/broadcastreceivers/BroadcastReceivedEvent.java
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/broadcastreceivers/BroadcastReceivedEvent.java
@@ -32,7 +32,7 @@
import com.android.eventlib.util.SerializableParcelWrapper;
/**
- * Event logged when {@link BroadcastReceiver#onReceive(Context, Intent)}.
+ * Event logged when {@link BroadcastReceiver#onReceive(Context, Intent)} is called.
*/
public final class BroadcastReceivedEvent extends Event {
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisableRequestedEvent.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisableRequestedEvent.java
new file mode 100644
index 0000000..f1f82df
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisableRequestedEvent.java
@@ -0,0 +1,157 @@
+/*
+ * 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.eventlib.events.deviceadminreceivers;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.annotation.CheckResult;
+
+import com.android.eventlib.Event;
+import com.android.eventlib.EventLogger;
+import com.android.eventlib.EventLogsQuery;
+import com.android.eventlib.info.DeviceAdminReceiverInfo;
+import com.android.eventlib.queryhelpers.DeviceAdminReceiverQuery;
+import com.android.eventlib.queryhelpers.DeviceAdminReceiverQueryHelper;
+import com.android.eventlib.queryhelpers.IntentQueryHelper;
+import com.android.eventlib.util.SerializableParcelWrapper;
+
+/**
+ * Event logged when {@link DeviceAdminReceiver#onDisableRequested(Context, Intent)} is called.
+ */
+public final class DeviceAdminDisableRequestedEvent extends Event {
+
+ /** Begin a query for {@link DeviceAdminDisableRequestedEvent} events. */
+ public static DeviceAdminDisableRequestedEventQuery queryPackage(String packageName) {
+ return new DeviceAdminDisableRequestedEventQuery(packageName);
+ }
+
+ /** {@link EventLogsQuery} for {@link DeviceAdminDisableRequestedEvent}. */
+ public static final class DeviceAdminDisableRequestedEventQuery
+ extends EventLogsQuery<DeviceAdminDisableRequestedEvent,
+ DeviceAdminDisableRequestedEventQuery> {
+ DeviceAdminReceiverQueryHelper<DeviceAdminDisableRequestedEventQuery> mDeviceAdminReceiver =
+ new DeviceAdminReceiverQueryHelper<>(this);
+ IntentQueryHelper<DeviceAdminDisableRequestedEventQuery> mIntent =
+ new IntentQueryHelper<>(this);
+
+ private DeviceAdminDisableRequestedEventQuery(String packageName) {
+ super(DeviceAdminDisableRequestedEvent.class, packageName);
+ }
+
+ /**
+ * Query {@link Intent} passed into
+ * {@link DeviceAdminReceiver#onDisableRequested(Context, Intent)}.
+ */
+ @CheckResult
+ public IntentQueryHelper<DeviceAdminDisableRequestedEventQuery> whereIntent() {
+ return mIntent;
+ }
+
+ /** Query {@link DeviceAdminReceiver}. */
+ @CheckResult
+ public DeviceAdminReceiverQuery<DeviceAdminDisableRequestedEventQuery>
+ whereDeviceAdminReceiver() {
+ return mDeviceAdminReceiver;
+ }
+
+ @Override
+ protected boolean filter(DeviceAdminDisableRequestedEvent event) {
+ if (!mIntent.matches(event.mIntent)) {
+ return false;
+ }
+ if (!mDeviceAdminReceiver.matches(event.mDeviceAdminReceiver)) {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /** Begin logging a {@link DeviceAdminDisableRequestedEvent}. */
+ public static DeviceAdminDisableRequestedEventLogger logger(
+ DeviceAdminReceiver deviceAdminReceiver, Context context, Intent intent) {
+ return new DeviceAdminDisableRequestedEventLogger(deviceAdminReceiver, context, intent);
+ }
+
+ /** {@link EventLogger} for {@link DeviceAdminDisableRequestedEvent}. */
+ public static final class DeviceAdminDisableRequestedEventLogger
+ extends EventLogger<DeviceAdminDisableRequestedEvent> {
+ private DeviceAdminDisableRequestedEventLogger(
+ DeviceAdminReceiver deviceAdminReceiver, Context context, Intent intent) {
+ super(context, new DeviceAdminDisableRequestedEvent());
+ mEvent.mIntent = new SerializableParcelWrapper<>(intent);
+ setDeviceAdminReceiver(deviceAdminReceiver);
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminDisableRequestedEventLogger setDeviceAdminReceiver(
+ DeviceAdminReceiver deviceAdminReceiver) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiver);
+ return this;
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminDisableRequestedEventLogger setDeviceAdminReceiver(
+ Class<? extends DeviceAdminReceiver> deviceAdminReceiverClass) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiverClass);
+ return this;
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminDisableRequestedEventLogger setDeviceAdminReceiver(
+ String deviceAdminReceiverClassName) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiverClassName);
+ return this;
+ }
+
+ /** Set the {@link Intent} which was received. */
+ public DeviceAdminDisableRequestedEventLogger setIntent(Intent intent) {
+ mEvent.mIntent = new SerializableParcelWrapper<>(intent);
+ return this;
+ }
+ }
+
+ protected SerializableParcelWrapper<Intent> mIntent;
+ protected DeviceAdminReceiverInfo mDeviceAdminReceiver;
+
+ /**
+ * The {@link Intent} passed into
+ * {@link DeviceAdminReceiver#onDisableRequested(Context, Intent)}.
+ */
+ public Intent intent() {
+ if (mIntent == null) {
+ return null;
+ }
+ return mIntent.get();
+ }
+
+ /** Information about the {@link DeviceAdminReceiver} which received the intent. */
+ public DeviceAdminReceiverInfo deviceAdminReceiver() {
+ return mDeviceAdminReceiver;
+ }
+
+ @Override
+ public String toString() {
+ return "DeviceAdminDisableRequestedEvent{"
+ + " intent=" + intent()
+ + ", deviceAdminReceiver=" + mDeviceAdminReceiver
+ + ", packageName='" + mPackageName + "'"
+ + ", timestamp=" + mTimestamp
+ + "}";
+ }
+}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisabledEvent.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisabledEvent.java
new file mode 100644
index 0000000..25bd3d9
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisabledEvent.java
@@ -0,0 +1,152 @@
+/*
+ * 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.eventlib.events.deviceadminreceivers;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.annotation.CheckResult;
+
+import com.android.eventlib.Event;
+import com.android.eventlib.EventLogger;
+import com.android.eventlib.EventLogsQuery;
+import com.android.eventlib.info.DeviceAdminReceiverInfo;
+import com.android.eventlib.queryhelpers.DeviceAdminReceiverQuery;
+import com.android.eventlib.queryhelpers.DeviceAdminReceiverQueryHelper;
+import com.android.eventlib.queryhelpers.IntentQueryHelper;
+import com.android.eventlib.util.SerializableParcelWrapper;
+
+/**
+ * Event logged when {@link DeviceAdminReceiver#onDisabled(Context, Intent)} is called.
+ */
+public final class DeviceAdminDisabledEvent extends Event {
+
+ /** Begin a query for {@link DeviceAdminDisabledEvent} events. */
+ public static DeviceAdminDisabledEventQuery queryPackage(String packageName) {
+ return new DeviceAdminDisabledEventQuery(packageName);
+ }
+
+ /** {@link EventLogsQuery} for {@link DeviceAdminDisabledEvent}. */
+ public static final class DeviceAdminDisabledEventQuery
+ extends EventLogsQuery<DeviceAdminDisabledEvent, DeviceAdminDisabledEventQuery> {
+ DeviceAdminReceiverQueryHelper<DeviceAdminDisabledEventQuery> mDeviceAdminReceiver =
+ new DeviceAdminReceiverQueryHelper<>(this);
+ IntentQueryHelper<DeviceAdminDisabledEventQuery> mIntent = new IntentQueryHelper<>(this);
+
+ private DeviceAdminDisabledEventQuery(String packageName) {
+ super(DeviceAdminDisabledEvent.class, packageName);
+ }
+
+ /**
+ * Query {@link Intent} passed into {@link DeviceAdminReceiver#onDisabled(Context, Intent)}.
+ */
+ @CheckResult
+ public IntentQueryHelper<DeviceAdminDisabledEventQuery> whereIntent() {
+ return mIntent;
+ }
+
+ /** Query {@link DeviceAdminReceiver}. */
+ @CheckResult
+ public DeviceAdminReceiverQuery<DeviceAdminDisabledEventQuery> whereDeviceAdminReceiver() {
+ return mDeviceAdminReceiver;
+ }
+
+ @Override
+ protected boolean filter(DeviceAdminDisabledEvent event) {
+ if (!mIntent.matches(event.mIntent)) {
+ return false;
+ }
+ if (!mDeviceAdminReceiver.matches(event.mDeviceAdminReceiver)) {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /** Begin logging a {@link DeviceAdminDisabledEvent}. */
+ public static DeviceAdminDisabledEventLogger logger(
+ DeviceAdminReceiver deviceAdminReceiver, Context context, Intent intent) {
+ return new DeviceAdminDisabledEventLogger(deviceAdminReceiver, context, intent);
+ }
+
+ /** {@link EventLogger} for {@link DeviceAdminDisabledEvent}. */
+ public static final class DeviceAdminDisabledEventLogger
+ extends EventLogger<DeviceAdminDisabledEvent> {
+ private DeviceAdminDisabledEventLogger(
+ DeviceAdminReceiver deviceAdminReceiver, Context context, Intent intent) {
+ super(context, new DeviceAdminDisabledEvent());
+ mEvent.mIntent = new SerializableParcelWrapper<>(intent);
+ setDeviceAdminReceiver(deviceAdminReceiver);
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminDisabledEventLogger setDeviceAdminReceiver(
+ DeviceAdminReceiver deviceAdminReceiver) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiver);
+ return this;
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminDisabledEventLogger setDeviceAdminReceiver(
+ Class<? extends DeviceAdminReceiver> deviceAdminReceiverClass) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiverClass);
+ return this;
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminDisabledEventLogger setDeviceAdminReceiver(
+ String deviceAdminReceiverClassName) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiverClassName);
+ return this;
+ }
+
+ /** Set the {@link Intent} which was received. */
+ public DeviceAdminDisabledEventLogger setIntent(Intent intent) {
+ mEvent.mIntent = new SerializableParcelWrapper<>(intent);
+ return this;
+ }
+ }
+
+ protected SerializableParcelWrapper<Intent> mIntent;
+ protected DeviceAdminReceiverInfo mDeviceAdminReceiver;
+
+ /**
+ * The {@link Intent} passed into {@link DeviceAdminReceiver#onDisabled(Context, Intent)}.
+ */
+ public Intent intent() {
+ if (mIntent == null) {
+ return null;
+ }
+ return mIntent.get();
+ }
+
+ /** Information about the {@link DeviceAdminReceiver} which received the intent. */
+ public DeviceAdminReceiverInfo deviceAdminReceiver() {
+ return mDeviceAdminReceiver;
+ }
+
+ @Override
+ public String toString() {
+ return "DeviceAdminDisabledEvent{"
+ + " intent=" + intent()
+ + ", deviceAdminReceiver=" + mDeviceAdminReceiver
+ + ", packageName='" + mPackageName + "'"
+ + ", timestamp=" + mTimestamp
+ + "}";
+ }
+}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminEnabledEvent.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminEnabledEvent.java
index edbb7f4..b390ed8 100644
--- a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminEnabledEvent.java
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminEnabledEvent.java
@@ -32,7 +32,7 @@
import com.android.eventlib.util.SerializableParcelWrapper;
/**
- * Event logged when {@link DeviceAdminReceiver#onEnabled(Context, Intent)}.
+ * Event logged when {@link DeviceAdminReceiver#onEnabled(Context, Intent)} is called.
*/
public final class DeviceAdminEnabledEvent extends Event {
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminPasswordChangedEvent.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminPasswordChangedEvent.java
new file mode 100644
index 0000000..82998d6
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminPasswordChangedEvent.java
@@ -0,0 +1,193 @@
+/*
+ * 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.eventlib.events.deviceadminreceivers;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+
+import androidx.annotation.CheckResult;
+
+import com.android.eventlib.Event;
+import com.android.eventlib.EventLogger;
+import com.android.eventlib.EventLogsQuery;
+import com.android.eventlib.info.DeviceAdminReceiverInfo;
+import com.android.eventlib.queryhelpers.DeviceAdminReceiverQuery;
+import com.android.eventlib.queryhelpers.DeviceAdminReceiverQueryHelper;
+import com.android.eventlib.queryhelpers.IntentQueryHelper;
+import com.android.eventlib.queryhelpers.UserHandleQuery;
+import com.android.eventlib.queryhelpers.UserHandleQueryHelper;
+import com.android.eventlib.util.SerializableParcelWrapper;
+
+/**
+ * Event logged when {@link DeviceAdminReceiver#onPasswordChanged(Context, Intent)} or
+ * {@link DeviceAdminReceiver#onPasswordChanged(Context, Intent, UserHandle)} is called.
+ */
+public final class DeviceAdminPasswordChangedEvent extends Event {
+
+ /** Begin a query for {@link DeviceAdminPasswordChangedEvent} events. */
+ public static DeviceAdminPasswordChangedEventQuery queryPackage(String packageName) {
+ return new DeviceAdminPasswordChangedEventQuery(packageName);
+ }
+
+ /** {@link EventLogsQuery} for {@link DeviceAdminPasswordChangedEvent}. */
+ public static final class DeviceAdminPasswordChangedEventQuery
+ extends EventLogsQuery<DeviceAdminPasswordChangedEvent,
+ DeviceAdminPasswordChangedEventQuery> {
+ DeviceAdminReceiverQueryHelper<DeviceAdminPasswordChangedEventQuery> mDeviceAdminReceiver =
+ new DeviceAdminReceiverQueryHelper<>(this);
+ IntentQueryHelper<DeviceAdminPasswordChangedEventQuery> mIntent =
+ new IntentQueryHelper<>(this);
+ UserHandleQueryHelper<DeviceAdminPasswordChangedEventQuery> mUserHandle =
+ new UserHandleQueryHelper<DeviceAdminPasswordChangedEventQuery>(this);
+
+ private DeviceAdminPasswordChangedEventQuery(String packageName) {
+ super(DeviceAdminPasswordChangedEvent.class, packageName);
+ }
+
+ /**
+ * Query {@link Intent} passed into
+ * {@link DeviceAdminReceiver#onPasswordChanged(Context, Intent)}.
+ */
+ @CheckResult
+ public IntentQueryHelper<DeviceAdminPasswordChangedEventQuery> whereIntent() {
+ return mIntent;
+ }
+
+ /** Query {@link DeviceAdminReceiver}. */
+ @CheckResult
+ public DeviceAdminReceiverQuery<DeviceAdminPasswordChangedEventQuery>
+ whereDeviceAdminReceiver() {
+ return mDeviceAdminReceiver;
+ }
+
+ /** Query {@link UserHandle} passed into
+ * {@link DeviceAdminReceiver#onPasswordChanged(Context, Intent, UserHandle)}.
+ */
+ @CheckResult
+ public UserHandleQuery<DeviceAdminPasswordChangedEventQuery> whereUserHandle() {
+ return mUserHandle;
+ }
+
+ @Override
+ protected boolean filter(DeviceAdminPasswordChangedEvent event) {
+ if (!mIntent.matches(event.mIntent)) {
+ return false;
+ }
+ if (!mDeviceAdminReceiver.matches(event.mDeviceAdminReceiver)) {
+ return false;
+ }
+ if (!mUserHandle.matches(event.mUserHandle)) {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /** Begin logging a {@link DeviceAdminPasswordChangedEvent}. */
+ public static DeviceAdminPasswordChangedEventLogger logger(
+ DeviceAdminReceiver deviceAdminReceiver, Context context, Intent intent) {
+ return new DeviceAdminPasswordChangedEventLogger(deviceAdminReceiver, context, intent);
+ }
+
+ /** {@link EventLogger} for {@link DeviceAdminPasswordChangedEvent}. */
+ public static final class DeviceAdminPasswordChangedEventLogger
+ extends EventLogger<DeviceAdminPasswordChangedEvent> {
+ private DeviceAdminPasswordChangedEventLogger(
+ DeviceAdminReceiver deviceAdminReceiver, Context context, Intent intent) {
+ super(context, new DeviceAdminPasswordChangedEvent());
+ mEvent.mIntent = new SerializableParcelWrapper<>(intent);
+ setDeviceAdminReceiver(deviceAdminReceiver);
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminPasswordChangedEventLogger setDeviceAdminReceiver(
+ DeviceAdminReceiver deviceAdminReceiver) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiver);
+ return this;
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminPasswordChangedEventLogger setDeviceAdminReceiver(
+ Class<? extends DeviceAdminReceiver> deviceAdminReceiverClass) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiverClass);
+ return this;
+ }
+
+ /** Set the {@link DeviceAdminReceiver} which received this event. */
+ public DeviceAdminPasswordChangedEventLogger setDeviceAdminReceiver(
+ String deviceAdminReceiverClassName) {
+ mEvent.mDeviceAdminReceiver = new DeviceAdminReceiverInfo(deviceAdminReceiverClassName);
+ return this;
+ }
+
+ /** Set the {@link Intent} which was received. */
+ public DeviceAdminPasswordChangedEventLogger setIntent(Intent intent) {
+ mEvent.mIntent = new SerializableParcelWrapper<>(intent);
+ return this;
+ }
+
+ /** Set the {@link UserHandle}. */
+ public DeviceAdminPasswordChangedEventLogger setUserHandle(UserHandle userHandle) {
+ mEvent.mUserHandle = new SerializableParcelWrapper<>(userHandle);
+ return this;
+ }
+ }
+
+ protected SerializableParcelWrapper<Intent> mIntent;
+ protected SerializableParcelWrapper<UserHandle> mUserHandle;
+ protected DeviceAdminReceiverInfo mDeviceAdminReceiver;
+
+ /**
+ * The {@link Intent} passed into
+ * {@link DeviceAdminReceiver#onPasswordChanged(Context, Intent)}.
+ */
+ public Intent intent() {
+ if (mIntent == null) {
+ return null;
+ }
+ return mIntent.get();
+ }
+
+ /**
+ * The {@link UserHandle} passed into
+ * {@link DeviceAdminReceiver#onPasswordChanged(Context, Intent, UserHandle)}.
+ */
+ public UserHandle userHandle() {
+ if (mUserHandle == null) {
+ return null;
+ }
+ return mUserHandle.get();
+ }
+
+ /** Information about the {@link DeviceAdminReceiver} which received the intent. */
+ public DeviceAdminReceiverInfo deviceAdminReceiver() {
+ return mDeviceAdminReceiver;
+ }
+
+ @Override
+ public String toString() {
+ return "DeviceAdminPasswordChangedEvent{"
+ + " intent=" + intent()
+ + ", userHandle=" + userHandle()
+ + ", deviceAdminReceiver=" + mDeviceAdminReceiver
+ + ", packageName='" + mPackageName + "'"
+ + ", timestamp=" + mTimestamp
+ + "}";
+ }
+}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/info/ClassInfo.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/info/ClassInfo.java
index 7d2aa9c..b0d245a 100644
--- a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/info/ClassInfo.java
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/info/ClassInfo.java
@@ -47,9 +47,15 @@
}
private static String getSimpleName(String name) {
- final int dot = name.lastIndexOf(".");
+ // First deal with inner classes
+ int dollar = name.lastIndexOf("$");
+ if (dollar > 0) {
+ return name.substring(dollar + 1); // strip the package name
+ }
+
+ int dot = name.lastIndexOf(".");
if (dot > 0) {
- return name.substring(name.lastIndexOf(".")+1); // strip the package name
+ return name.substring(dot + 1); // strip the package name
}
return name;
}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/premade/EventLibDeviceAdminReceiver.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/premade/EventLibDeviceAdminReceiver.java
index 578c129..1c243ad 100644
--- a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/premade/EventLibDeviceAdminReceiver.java
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/premade/EventLibDeviceAdminReceiver.java
@@ -24,7 +24,10 @@
import android.os.UserHandle;
import com.android.eventlib.events.broadcastreceivers.BroadcastReceivedEvent;
+import com.android.eventlib.events.deviceadminreceivers.DeviceAdminDisableRequestedEvent;
+import com.android.eventlib.events.deviceadminreceivers.DeviceAdminDisabledEvent;
import com.android.eventlib.events.deviceadminreceivers.DeviceAdminEnabledEvent;
+import com.android.eventlib.events.deviceadminreceivers.DeviceAdminPasswordChangedEvent;
/** Implementation of {@link DeviceAdminReceiver} which logs events in response to callbacks. */
public class EventLibDeviceAdminReceiver extends DeviceAdminReceiver {
@@ -52,21 +55,58 @@
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
+ DeviceAdminDisableRequestedEvent.DeviceAdminDisableRequestedEventLogger logger =
+ DeviceAdminDisableRequestedEvent.logger(this, context, intent);
+
+ if (mOverrideDeviceAdminReceiverClassName != null) {
+ logger.setDeviceAdminReceiver(mOverrideDeviceAdminReceiverClassName);
+ }
+
+ logger.log();
+
return super.onDisableRequested(context, intent);
}
@Override
public void onDisabled(Context context, Intent intent) {
+ DeviceAdminDisabledEvent.DeviceAdminDisabledEventLogger logger =
+ DeviceAdminDisabledEvent.logger(this, context, intent);
+
+ if (mOverrideDeviceAdminReceiverClassName != null) {
+ logger.setDeviceAdminReceiver(mOverrideDeviceAdminReceiverClassName);
+ }
+
+ logger.log();
+
super.onDisabled(context, intent);
}
@Override
public void onPasswordChanged(Context context, Intent intent) {
+ DeviceAdminPasswordChangedEvent.DeviceAdminPasswordChangedEventLogger logger =
+ DeviceAdminPasswordChangedEvent.logger(this, context, intent);
+
+ if (mOverrideDeviceAdminReceiverClassName != null) {
+ logger.setDeviceAdminReceiver(mOverrideDeviceAdminReceiverClassName);
+ }
+
+ logger.log();
+
super.onPasswordChanged(context, intent);
}
@Override
public void onPasswordChanged(Context context, Intent intent, UserHandle user) {
+ DeviceAdminPasswordChangedEvent.DeviceAdminPasswordChangedEventLogger logger =
+ DeviceAdminPasswordChangedEvent.logger(this, context, intent);
+ logger.setUserHandle(user);
+
+ if (mOverrideDeviceAdminReceiverClassName != null) {
+ logger.setDeviceAdminReceiver(mOverrideDeviceAdminReceiverClassName);
+ }
+
+ logger.log();
+
super.onPasswordChanged(context, intent, user);
}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/IntegerQuery.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/IntegerQuery.java
new file mode 100644
index 0000000..92b2469
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/IntegerQuery.java
@@ -0,0 +1,39 @@
+/*
+ * 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.eventlib.queryhelpers;
+
+import com.android.eventlib.EventLogsQuery;
+
+import java.io.Serializable;
+
+/** Query for a {@link Integer}. */
+public interface IntegerQuery<E extends EventLogsQuery> extends Serializable {
+ /** Require the {@link Integer} is equal to {@code i}. */
+ E isEqualTo(int i);
+
+ /** Require the {@link Integer} is greater than {@code i}. */
+ E isGreaterThan(int i);
+
+ /** Require the {@link Integer} is greater than or equal to {@code i}. */
+ E isGreaterThanOrEqualTo(int i);
+
+ /** Require the {@link Integer} is less than {@code i}. */
+ E isLessThan(int i);
+
+ /** Require the {@link Integer} is less than or equal to {@code i}. */
+ E isLessThanOrEqualTo(int i);
+}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/IntegerQueryHelper.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/IntegerQueryHelper.java
new file mode 100644
index 0000000..1661954
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/IntegerQueryHelper.java
@@ -0,0 +1,110 @@
+/*
+ * 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.eventlib.queryhelpers;
+
+import com.android.eventlib.EventLogsQuery;
+
+import java.io.Serializable;
+
+/** Implementation of {@link IntegerQuery}. */
+public final class IntegerQueryHelper<E extends EventLogsQuery> implements IntegerQuery<E>,
+ Serializable {
+
+ private Integer mEqualToValue = null;
+ private Integer mGreaterThanValue = null;
+ private Integer mGreaterThanOrEqualToValue = null;
+ private Integer mLessThanValue = null;
+ private Integer mLessThanOrEqualToValue = null;
+
+ private final E mQuery;
+
+ public IntegerQueryHelper(E query) {
+ mQuery = query;
+ }
+
+
+ @Override
+ public E isEqualTo(int i) {
+ mEqualToValue = i;
+ return mQuery;
+ }
+
+ @Override
+ public E isGreaterThan(int i) {
+ if (mGreaterThanValue == null) {
+ mGreaterThanValue = i;
+ } else {
+ mGreaterThanValue = Math.max(mGreaterThanValue, i);
+ }
+ return mQuery;
+ }
+
+ @Override
+ public E isGreaterThanOrEqualTo(int i) {
+ if (mGreaterThanOrEqualToValue == null) {
+ mGreaterThanOrEqualToValue = i;
+ } else {
+ mGreaterThanOrEqualToValue = Math.max(mGreaterThanOrEqualToValue, i);
+ }
+ return mQuery;
+ }
+
+ @Override
+ public E isLessThan(int i) {
+ if (mLessThanValue == null) {
+ mLessThanValue = i;
+ } else {
+ mLessThanValue = Math.min(mLessThanValue, i);
+ }
+ return mQuery;
+ }
+
+ @Override
+ public E isLessThanOrEqualTo(int i) {
+ if (mLessThanOrEqualToValue == null) {
+ mLessThanOrEqualToValue = i;
+ } else {
+ mLessThanOrEqualToValue = Math.min(mLessThanOrEqualToValue, i);
+ }
+ return mQuery;
+ }
+
+ /** {@code true} if all filters are met by {@code value}. */
+ public boolean matches(int value) {
+ if (mEqualToValue != null && mEqualToValue != value) {
+ return false;
+ }
+
+ if (mGreaterThanValue != null && value <= mGreaterThanValue) {
+ return false;
+ }
+
+ if (mGreaterThanOrEqualToValue != null && value < mGreaterThanOrEqualToValue) {
+ return false;
+ }
+
+ if (mLessThanValue != null && value >= mLessThanValue) {
+ return false;
+ }
+
+ if (mLessThanOrEqualToValue != null && value > mLessThanOrEqualToValue) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/UserHandleQuery.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/UserHandleQuery.java
new file mode 100644
index 0000000..c0d5d28
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/UserHandleQuery.java
@@ -0,0 +1,35 @@
+/*
+ * 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.eventlib.queryhelpers;
+
+import android.os.UserHandle;
+
+import androidx.annotation.CheckResult;
+
+import com.android.eventlib.EventLogsQuery;
+
+import java.io.Serializable;
+
+/** Query for a {@link UserHandle}. */
+public interface UserHandleQuery<E extends EventLogsQuery> extends Serializable {
+ /** Require the {@link UserHandle} is equal to {@code userHandle}. */
+ E isEqualTo(UserHandle userHandle);
+
+ /** Query the user handle's ID. */
+ @CheckResult
+ IntegerQuery<E> id();
+}
diff --git a/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/UserHandleQueryHelper.java b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/UserHandleQueryHelper.java
new file mode 100644
index 0000000..3b5254c
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/main/java/com/android/eventlib/queryhelpers/UserHandleQueryHelper.java
@@ -0,0 +1,78 @@
+/*
+ * 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.eventlib.queryhelpers;
+
+import android.os.UserHandle;
+
+import com.android.eventlib.EventLogsQuery;
+import com.android.eventlib.util.SerializableParcelWrapper;
+
+import java.io.Serializable;
+
+/** Implementation of {@link UserHandleQuery}. */
+public final class UserHandleQueryHelper<E extends EventLogsQuery>
+ implements UserHandleQuery<E>, Serializable {
+
+ private final E mQuery;
+ private UserHandle mEqualsValue = null;
+ private IntegerQueryHelper<E> mIdQuery = null;
+
+ public UserHandleQueryHelper(E query) {
+ mQuery = query;
+ }
+
+ @Override
+ public E isEqualTo(UserHandle userHandle) {
+ mEqualsValue = userHandle;
+ return mQuery;
+ }
+
+ @Override
+ public IntegerQuery<E> id() {
+ if (mIdQuery == null) {
+ mIdQuery = new IntegerQueryHelper<>(mQuery);
+ }
+ return mIdQuery;
+ }
+
+ /**
+ * {@code true} if all filters are met by the {@link UserHandle}.
+ */
+ public boolean matches(UserHandle value) {
+ if (mEqualsValue != null && !mEqualsValue.equals(value)) {
+ return false;
+ }
+
+ if (mIdQuery != null && !mIdQuery.matches(value.getIdentifier())) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@code true} if all filters are met by the {@link UserHandle} contained in
+ * {@code serializableBundle}.
+ */
+ public boolean matches(SerializableParcelWrapper<UserHandle> serializableBundle) {
+ if ((serializableBundle == null || serializableBundle.get() == null)) {
+ return mEqualsValue == null && mIdQuery == null;
+ }
+
+ return matches(serializableBundle.get());
+ }
+}
diff --git a/common/device-side/bedstead/eventlib/src/test/AndroidManifest.xml b/common/device-side/bedstead/eventlib/src/test/AndroidManifest.xml
index b0172a1..68b4c3d 100644
--- a/common/device-side/bedstead/eventlib/src/test/AndroidManifest.xml
+++ b/common/device-side/bedstead/eventlib/src/test/AndroidManifest.xml
@@ -21,7 +21,8 @@
<uses-sdk android:minSdkVersion="27" android:targetSdkVersion="27"/>
<application
android:label="Event Library Tests"
- android:appComponentFactory="com.android.eventlib.premade.EventLibAppComponentFactory">
+ android:appComponentFactory="com.android.eventlib.premade.EventLibAppComponentFactory"
+ android:testOnly="true">
<uses-library android:name="android.test.runner" />
<activity android:name="com.android.eventlib.premade.EventLibActivity"
diff --git a/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisableRequestedEventTest.java b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisableRequestedEventTest.java
new file mode 100644
index 0000000..0d1f99a
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisableRequestedEventTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.eventlib.events.deviceadminreceivers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.eventlib.EventLogs;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class DeviceAdminDisableRequestedEventTest {
+
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
+ private static final String STRING_VALUE = "Value";
+ private static final String DIFFERENT_STRING_VALUE = "Value2";
+ private static final Intent INTENT = new Intent();
+
+ private static final String DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ TestDeviceAdminReceiver.class.getName();
+ private static final String CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ "customDeviceAdminReceiver";
+ private static final String DIFFERENT_CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ "customDeviceAdminReceiver2";
+ private static final DeviceAdminReceiver DEVICE_ADMIN_RECEIVER = new TestDeviceAdminReceiver();
+
+ private static class TestDeviceAdminReceiver extends DeviceAdminReceiver {
+ }
+
+ @Before
+ public void setUp() {
+ EventLogs.resetLogs();
+ }
+
+ @Test
+ public void whereIntent_works() {
+ Intent intent = new Intent();
+ intent.setAction(STRING_VALUE);
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, intent).log();
+
+ EventLogs<DeviceAdminDisableRequestedEvent> eventLogs =
+ DeviceAdminDisableRequestedEvent.queryPackage(sContext.getPackageName())
+ .whereIntent().action().isEqualTo(STRING_VALUE);
+
+ assertThat(eventLogs.get().intent()).isEqualTo(intent);
+ }
+
+ @Test
+ public void whereIntent_skipsNonMatching() {
+ Intent intent = new Intent();
+ intent.setAction(STRING_VALUE);
+ Intent differentIntent = new Intent();
+ differentIntent.setAction(DIFFERENT_STRING_VALUE);
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER,
+ sContext, differentIntent).log();
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER,
+ sContext, intent).log();
+
+ EventLogs<DeviceAdminDisableRequestedEvent> eventLogs =
+ DeviceAdminDisableRequestedEvent.queryPackage(sContext.getPackageName())
+ .whereIntent().action().isEqualTo(STRING_VALUE);
+
+ assertThat(eventLogs.get().intent()).isEqualTo(intent);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_customValueOnLogger_works() {
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+
+ EventLogs<DeviceAdminDisableRequestedEvent> eventLogs =
+ DeviceAdminDisableRequestedEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className().isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className()).isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_customValueOnLogger_skipsNonMatching() {
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(DIFFERENT_CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+
+ EventLogs<DeviceAdminDisableRequestedEvent> eventLogs =
+ DeviceAdminDisableRequestedEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className().isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className()).isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_defaultValue_works() {
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT).log();
+
+ EventLogs<DeviceAdminDisableRequestedEvent> eventLogs =
+ DeviceAdminDisableRequestedEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className()
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className())
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_defaultValue_skipsNonMatching() {
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+ DeviceAdminDisableRequestedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .log();
+
+ EventLogs<DeviceAdminDisableRequestedEvent> eventLogs =
+ DeviceAdminDisableRequestedEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className()
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className())
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+}
diff --git a/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisabledEventTest.java b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisabledEventTest.java
new file mode 100644
index 0000000..069dfe0
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminDisabledEventTest.java
@@ -0,0 +1,151 @@
+/*
+ * 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.eventlib.events.deviceadminreceivers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.eventlib.EventLogs;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class DeviceAdminDisabledEventTest {
+
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
+ private static final String STRING_VALUE = "Value";
+ private static final String DIFFERENT_STRING_VALUE = "Value2";
+ private static final Intent INTENT = new Intent();
+
+ private static final String DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ TestDeviceAdminReceiver.class.getName();
+ private static final String CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ "customDeviceAdminReceiver";
+ private static final String DIFFERENT_CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ "customDeviceAdminReceiver2";
+ private static final DeviceAdminReceiver DEVICE_ADMIN_RECEIVER = new TestDeviceAdminReceiver();
+
+ private static class TestDeviceAdminReceiver extends DeviceAdminReceiver {
+ }
+
+ @Before
+ public void setUp() {
+ EventLogs.resetLogs();
+ }
+
+ @Test
+ public void whereIntent_works() {
+ Intent intent = new Intent();
+ intent.setAction(STRING_VALUE);
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, intent).log();
+
+ EventLogs<DeviceAdminDisabledEvent> eventLogs =
+ DeviceAdminDisabledEvent.queryPackage(sContext.getPackageName())
+ .whereIntent().action().isEqualTo(STRING_VALUE);
+
+ assertThat(eventLogs.get().intent()).isEqualTo(intent);
+ }
+
+ @Test
+ public void whereIntent_skipsNonMatching() {
+ Intent intent = new Intent();
+ intent.setAction(STRING_VALUE);
+ Intent differentIntent = new Intent();
+ differentIntent.setAction(DIFFERENT_STRING_VALUE);
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, differentIntent).log();
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, intent).log();
+
+ EventLogs<DeviceAdminDisabledEvent> eventLogs =
+ DeviceAdminDisabledEvent.queryPackage(sContext.getPackageName())
+ .whereIntent().action().isEqualTo(STRING_VALUE);
+
+ assertThat(eventLogs.get().intent()).isEqualTo(intent);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_customValueOnLogger_works() {
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+
+ EventLogs<DeviceAdminDisabledEvent> eventLogs =
+ DeviceAdminDisabledEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className().isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className()).isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_customValueOnLogger_skipsNonMatching() {
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(DIFFERENT_CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+
+ EventLogs<DeviceAdminDisabledEvent> eventLogs =
+ DeviceAdminDisabledEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className().isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className()).isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_defaultValue_works() {
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT).log();
+
+ EventLogs<DeviceAdminDisabledEvent> eventLogs =
+ DeviceAdminDisabledEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className()
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className())
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_defaultValue_skipsNonMatching() {
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+ DeviceAdminDisabledEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .log();
+
+ EventLogs<DeviceAdminDisabledEvent> eventLogs =
+ DeviceAdminDisabledEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className()
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className())
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+}
diff --git a/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminPasswordChangedEventTest.java b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminPasswordChangedEventTest.java
new file mode 100644
index 0000000..0a3da08
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/events/deviceadminreceivers/DeviceAdminPasswordChangedEventTest.java
@@ -0,0 +1,183 @@
+/*
+ * 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.eventlib.events.deviceadminreceivers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.eventlib.EventLogs;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class DeviceAdminPasswordChangedEventTest {
+
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
+ private static final String STRING_VALUE = "Value";
+ private static final String DIFFERENT_STRING_VALUE = "Value2";
+ private static final Intent INTENT = new Intent();
+
+ private static final String DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ TestDeviceAdminReceiver.class.getName();
+ private static final String CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ "customDeviceAdminReceiver";
+ private static final String DIFFERENT_CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME =
+ "customDeviceAdminReceiver2";
+ private static final DeviceAdminReceiver DEVICE_ADMIN_RECEIVER = new TestDeviceAdminReceiver();
+ private static final UserHandle USER_HANDLE = UserHandle.of(1);
+ private static final UserHandle DIFFERENT_USER_HANDLE = UserHandle.of(2);
+
+ private static class TestDeviceAdminReceiver extends DeviceAdminReceiver {
+ }
+
+ @Before
+ public void setUp() {
+ EventLogs.resetLogs();
+ }
+
+ @Test
+ public void whereIntent_works() {
+ Intent intent = new Intent();
+ intent.setAction(STRING_VALUE);
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, intent).log();
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName())
+ .whereIntent().action().isEqualTo(STRING_VALUE);
+
+ assertThat(eventLogs.get().intent()).isEqualTo(intent);
+ }
+
+ @Test
+ public void whereIntent_skipsNonMatching() {
+ Intent intent = new Intent();
+ intent.setAction(STRING_VALUE);
+ Intent differentIntent = new Intent();
+ differentIntent.setAction(DIFFERENT_STRING_VALUE);
+ DeviceAdminPasswordChangedEvent.logger(
+ DEVICE_ADMIN_RECEIVER, sContext, differentIntent).log();
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, intent).log();
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName())
+ .whereIntent().action().isEqualTo(STRING_VALUE);
+
+ assertThat(eventLogs.get().intent()).isEqualTo(intent);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_customValueOnLogger_works() {
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className().isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className()).isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_customValueOnLogger_skipsNonMatching() {
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(DIFFERENT_CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className().isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className()).isEqualTo(
+ CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_defaultValue_works() {
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT).log();
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className()
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className())
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereDeviceAdminReceiver_defaultValue_skipsNonMatching() {
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setDeviceAdminReceiver(CUSTOM_DEVICE_ADMIN_RECEIVER_CLASS_NAME)
+ .log();
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .log();
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName())
+ .whereDeviceAdminReceiver().className()
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+
+ assertThat(eventLogs.get().deviceAdminReceiver().className())
+ .isEqualTo(DEFAULT_DEVICE_ADMIN_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void whereUserHandle_works() {
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setUserHandle(USER_HANDLE)
+ .log();
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName())
+ .whereUserHandle().isEqualTo(USER_HANDLE);
+
+ assertThat(eventLogs.get().userHandle()).isEqualTo(USER_HANDLE);
+ }
+
+ @Test
+ public void whereUserHandle_skipsNonMatching() {
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setUserHandle(DIFFERENT_USER_HANDLE)
+ .log();
+ DeviceAdminPasswordChangedEvent.logger(DEVICE_ADMIN_RECEIVER, sContext, INTENT)
+ .setUserHandle(USER_HANDLE)
+ .log();
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName())
+ .whereUserHandle().isEqualTo(USER_HANDLE);
+
+ assertThat(eventLogs.get().userHandle()).isEqualTo(USER_HANDLE);
+ }
+}
diff --git a/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/info/BroadcastReceiverInfoTest.java b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/info/BroadcastReceiverInfoTest.java
new file mode 100644
index 0000000..2121c86
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/info/BroadcastReceiverInfoTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.eventlib.info;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class BroadcastReceiverInfoTest {
+
+ private static class TestBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+
+ }
+ }
+
+ private static final Class<? extends BroadcastReceiver> TEST_BROADCAST_RECEIVER_CLASS =
+ TestBroadcastReceiver.class;
+ private static final String TEST_BROADCAST_RECEIVER_CLASS_NAME =
+ TestBroadcastReceiver.class.getName();
+ private static final String TEST_BROADCAST_RECEIVER_SIMPLE_NAME =
+ TestBroadcastReceiver.class.getSimpleName();
+ private static final BroadcastReceiver TEST_BROADCAST_RECEIVER_INSTANCE =
+ new TestBroadcastReceiver();
+
+ @Test
+ public void classConstructor_setsClassName() {
+ BroadcastReceiverInfo broadcastReceiverInfo = new BroadcastReceiverInfo(
+ TEST_BROADCAST_RECEIVER_CLASS);
+
+ assertThat(broadcastReceiverInfo.className())
+ .isEqualTo(TEST_BROADCAST_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void instanceConstructor_setsClassName() {
+ BroadcastReceiverInfo broadcastReceiverInfo = new BroadcastReceiverInfo(
+ TEST_BROADCAST_RECEIVER_INSTANCE);
+
+ assertThat(broadcastReceiverInfo.className())
+ .isEqualTo(TEST_BROADCAST_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void stringConstructor_setsClassName() {
+ BroadcastReceiverInfo broadcastReceiverInfo = new BroadcastReceiverInfo(
+ TEST_BROADCAST_RECEIVER_CLASS_NAME);
+
+ assertThat(broadcastReceiverInfo.className())
+ .isEqualTo(TEST_BROADCAST_RECEIVER_CLASS_NAME);
+ }
+
+ @Test
+ public void simpleName_getsSimpleName() {
+ BroadcastReceiverInfo broadcastReceiverInfo = new BroadcastReceiverInfo(
+ TEST_BROADCAST_RECEIVER_CLASS_NAME);
+
+ assertThat(broadcastReceiverInfo.simpleName())
+ .isEqualTo(TEST_BROADCAST_RECEIVER_SIMPLE_NAME);
+ }
+}
diff --git a/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/premade/EventLibDeviceAdminReceiverTest.java b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/premade/EventLibDeviceAdminReceiverTest.java
new file mode 100644
index 0000000..56c7f48
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/premade/EventLibDeviceAdminReceiverTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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.eventlib.premade;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.devicepolicy.DeviceOwner;
+import com.android.bedstead.nene.devicepolicy.ProfileOwner;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.eventlib.EventLogs;
+import com.android.eventlib.events.deviceadminreceivers.DeviceAdminDisableRequestedEvent;
+import com.android.eventlib.events.deviceadminreceivers.DeviceAdminDisabledEvent;
+import com.android.eventlib.events.deviceadminreceivers.DeviceAdminEnabledEvent;
+import com.android.eventlib.events.deviceadminreceivers.DeviceAdminPasswordChangedEvent;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class EventLibDeviceAdminReceiverTest {
+
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
+ private static final ComponentName DEVICE_ADMIN_COMPONENT =
+ new ComponentName(
+ sContext.getPackageName(), EventLibDeviceAdminReceiver.class.getName());
+ private static final TestApis sTestApis = new TestApis();
+ private static final UserReference sUser = sTestApis.users().instrumented();
+ private static final DevicePolicyManager sDevicePolicyManager =
+ sContext.getSystemService(DevicePolicyManager.class);
+ private static final Intent sIntent = new Intent();
+
+ @Before
+ public void setUp() {
+ EventLogs.resetLogs();
+ }
+
+ @Test
+ public void enableDeviceOwner_logsEnabledEvent() {
+ DeviceOwner deviceOwner =
+ sTestApis.devicePolicy().setDeviceOwner(sUser, DEVICE_ADMIN_COMPONENT);
+
+ try {
+ EventLogs<DeviceAdminEnabledEvent> eventLogs =
+ DeviceAdminEnabledEvent.queryPackage(sContext.getPackageName());
+
+ assertThat(eventLogs.poll()).isNotNull();
+ } finally {
+ deviceOwner.remove();
+ }
+ }
+
+ @Test
+ public void enableProfileOwner_logsEnabledEvent() {
+ ProfileOwner profileOwner =
+ sTestApis.devicePolicy().setProfileOwner(sUser, DEVICE_ADMIN_COMPONENT);
+
+ try {
+ EventLogs<DeviceAdminEnabledEvent> eventLogs =
+ DeviceAdminEnabledEvent.queryPackage(sContext.getPackageName());
+
+ assertThat(eventLogs.poll()).isNotNull();
+ } finally {
+ profileOwner.remove();
+ }
+ }
+
+ @Test
+ public void disableProfileOwner_logsDisableRequestedEvent() {
+ EventLibDeviceAdminReceiver receiver = new EventLibDeviceAdminReceiver();
+
+ receiver.onDisableRequested(sContext, sIntent);
+
+ EventLogs<DeviceAdminDisableRequestedEvent> eventLogs =
+ DeviceAdminDisableRequestedEvent.queryPackage(sContext.getPackageName());
+ assertThat(eventLogs.get()).isNotNull();
+ }
+
+ @Test
+ public void disableProfileOwner_logsDisabledEvent() {
+ EventLibDeviceAdminReceiver receiver = new EventLibDeviceAdminReceiver();
+
+ receiver.onDisabled(sContext, sIntent);
+
+ EventLogs<DeviceAdminDisabledEvent> eventLogs =
+ DeviceAdminDisabledEvent.queryPackage(sContext.getPackageName());
+ assertThat(eventLogs.get()).isNotNull();
+ }
+
+ @Test
+ public void changePassword_logsPasswordChangedEvent() {
+ EventLibDeviceAdminReceiver receiver = new EventLibDeviceAdminReceiver();
+
+ receiver.onPasswordChanged(sContext, sIntent);
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName());
+ assertThat(eventLogs.get()).isNotNull();
+ }
+
+ @Test
+ public void changePasswordWithUserHandle_logsPasswordChangedEvent() {
+ EventLibDeviceAdminReceiver receiver = new EventLibDeviceAdminReceiver();
+
+ receiver.onPasswordChanged(sContext, sIntent, sUser.userHandle());
+
+ EventLogs<DeviceAdminPasswordChangedEvent> eventLogs =
+ DeviceAdminPasswordChangedEvent.queryPackage(sContext.getPackageName());
+ assertThat(eventLogs.get()).isNotNull();
+ assertThat(eventLogs.get().userHandle()).isEqualTo(sUser.userHandle());
+ }
+
+}
diff --git a/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/queryhelpers/IntegerQueryHelperTest.java b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/queryhelpers/IntegerQueryHelperTest.java
new file mode 100644
index 0000000..528e9a5
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/queryhelpers/IntegerQueryHelperTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.eventlib.queryhelpers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.android.eventlib.events.CustomEvent;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class IntegerQueryHelperTest {
+
+ private final CustomEvent.CustomEventQuery mQuery =
+ CustomEvent.queryPackage("testPackage"); // package is not used
+ private static final int INTEGER_VALUE = 100;
+ private static final int GREATER_VALUE = 200;
+ private static final int LESS_VALUE = 50;
+
+ @Test
+ public void matches_noRestrictions_returnsTrue() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ assertThat(integerQueryHelper.matches(INTEGER_VALUE)).isTrue();
+ }
+
+ @Test
+ public void matches_isEqualTo_meetsRestriction_returnsTrue() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isEqualTo(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(INTEGER_VALUE)).isTrue();
+ }
+
+ @Test
+ public void matches_isEqualTo_doesNotMeetRestriction_returnsFalse() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isEqualTo(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(GREATER_VALUE)).isFalse();
+ }
+
+ @Test
+ public void matches_isGreaterThan_meetsRestriction_returnsTrue() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isGreaterThan(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(GREATER_VALUE)).isTrue();
+ }
+
+ @Test
+ public void matches_isGreaterThan_doesNotMeetRestriction_returnsFalse() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isGreaterThan(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(INTEGER_VALUE)).isFalse();
+ }
+
+ @Test
+ public void matches_isGreaterThanOrEqualTo_greaterThan_returnsTrue() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isGreaterThanOrEqualTo(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(GREATER_VALUE)).isTrue();
+ }
+
+ @Test
+ public void matches_isGreaterThanOrEqualTo_equalTo_returnsTrue() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isGreaterThanOrEqualTo(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(INTEGER_VALUE)).isTrue();
+ }
+
+ @Test
+ public void matches_isGreaterThanOrEqualTo_doesNotMeetRestriction_returnsFalse() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isGreaterThanOrEqualTo(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(LESS_VALUE)).isFalse();
+ }
+
+ @Test
+ public void matches_isLessThan_meetsRestriction_returnsTrue() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isLessThan(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(LESS_VALUE)).isTrue();
+ }
+
+ @Test
+ public void matches_isLessThan_doesNotMeetRestriction_returnsFalse() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isLessThan(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(INTEGER_VALUE)).isFalse();
+ }
+
+ @Test
+ public void matches_isLessThanOrEqualTo_lessThan_returnsTrue() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isLessThanOrEqualTo(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(LESS_VALUE)).isTrue();
+ }
+
+ @Test
+ public void matches_isLessThanOrEqualTo_equalTo_returnsTrue() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isLessThanOrEqualTo(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(INTEGER_VALUE)).isTrue();
+ }
+
+ @Test
+ public void matches_isLessThanOrEqualTo_doesNotMeetRestriction_returnsFalse() {
+ IntegerQueryHelper<CustomEvent.CustomEventQuery> integerQueryHelper =
+ new IntegerQueryHelper<>(mQuery);
+
+ integerQueryHelper.isLessThanOrEqualTo(INTEGER_VALUE);
+
+ assertThat(integerQueryHelper.matches(GREATER_VALUE)).isFalse();
+ }
+}
diff --git a/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/queryhelpers/UserHandleQueryHelperTest.java b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/queryhelpers/UserHandleQueryHelperTest.java
new file mode 100644
index 0000000..9b12586
--- /dev/null
+++ b/common/device-side/bedstead/eventlib/src/test/java/com/android/eventlib/queryhelpers/UserHandleQueryHelperTest.java
@@ -0,0 +1,85 @@
+/*
+ * 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.eventlib.queryhelpers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.UserHandle;
+
+import com.android.eventlib.events.CustomEvent;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class UserHandleQueryHelperTest {
+
+ private final CustomEvent.CustomEventQuery mQuery =
+ CustomEvent.queryPackage("testPackage"); // package is not used
+ private static final int USER_HANDLE_ID = 1;
+ private static final UserHandle USER_HANDLE = UserHandle.of(USER_HANDLE_ID);
+ private static final UserHandle DIFFERENT_USER_HANDLE = UserHandle.of(2);
+
+ @Test
+ public void matches_noRestrictions_returnsTrue() {
+ UserHandleQueryHelper<CustomEvent.CustomEventQuery> userHandleQueryHelper =
+ new UserHandleQueryHelper<>(mQuery);
+
+ assertThat(userHandleQueryHelper.matches(USER_HANDLE)).isTrue();
+ }
+
+ @Test
+ public void matches_isEqualTo_meetsRestriction_returnsTrue() {
+ UserHandleQueryHelper<CustomEvent.CustomEventQuery> userHandleQueryHelper =
+ new UserHandleQueryHelper<>(mQuery);
+
+ userHandleQueryHelper.isEqualTo(USER_HANDLE);
+
+ assertThat(userHandleQueryHelper.matches(USER_HANDLE)).isTrue();
+ }
+
+ @Test
+ public void matches_isEqualTo_doesNotMeetRestriction_returnsFalse() {
+ UserHandleQueryHelper<CustomEvent.CustomEventQuery> userHandleQueryHelper =
+ new UserHandleQueryHelper<>(mQuery);
+
+ userHandleQueryHelper.isEqualTo(USER_HANDLE);
+
+ assertThat(userHandleQueryHelper.matches(DIFFERENT_USER_HANDLE)).isFalse();
+ }
+
+ @Test
+ public void matches_id_meetsRestriction_returnsTrue() {
+ UserHandleQueryHelper<CustomEvent.CustomEventQuery> userHandleQueryHelper =
+ new UserHandleQueryHelper<>(mQuery);
+
+ userHandleQueryHelper.id().isEqualTo(USER_HANDLE_ID);
+
+ assertThat(userHandleQueryHelper.matches(USER_HANDLE)).isTrue();
+ }
+
+ @Test
+ public void matches_id_doesNotMeetRestriction_returnsFalse() {
+ UserHandleQueryHelper<CustomEvent.CustomEventQuery> userHandleQueryHelper =
+ new UserHandleQueryHelper<>(mQuery);
+
+ userHandleQueryHelper.id().isEqualTo(USER_HANDLE_ID);
+
+ assertThat(userHandleQueryHelper.matches(DIFFERENT_USER_HANDLE)).isFalse();
+ }
+}
diff --git a/common/device-side/bedstead/nene/Android.bp b/common/device-side/bedstead/nene/Android.bp
index b77ddf0..6723bc2 100644
--- a/common/device-side/bedstead/nene/Android.bp
+++ b/common/device-side/bedstead/nene/Android.bp
@@ -24,6 +24,7 @@
"general-tests",
],
static_libs: [
+ "TestApp",
"Nene",
"EventLib",
"androidx.test.ext.junit",
diff --git a/common/device-side/bedstead/nene/TEST_MAPPING b/common/device-side/bedstead/nene/TEST_MAPPING
index 8beeebe..808b8b8 100644
--- a/common/device-side/bedstead/nene/TEST_MAPPING
+++ b/common/device-side/bedstead/nene/TEST_MAPPING
@@ -1,5 +1,5 @@
{
- "presubmit": [
+ "postsubmit": [
{
"name": "NeneTest"
}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/TestApis.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/TestApis.java
index edc688b..51c8db8 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/TestApis.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/TestApis.java
@@ -16,6 +16,7 @@
package com.android.bedstead.nene;
+import com.android.bedstead.nene.devicepolicy.DevicePolicy;
import com.android.bedstead.nene.packages.Packages;
import com.android.bedstead.nene.users.Users;
@@ -25,6 +26,7 @@
public final class TestApis {
private final Users mUsers = new Users();
private final Packages mPackages = new Packages(this);
+ private final DevicePolicy mDevicePolicy = new DevicePolicy(this);
/** Access Test APIs related to Users. */
public Users users() {
@@ -35,4 +37,9 @@
public Packages packages() {
return mPackages;
}
+
+ /** Access Test APIs related to device policy. */
+ public DevicePolicy devicePolicy() {
+ return mDevicePolicy;
+ }
}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/AdbDevicePolicyParser.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/AdbDevicePolicyParser.java
new file mode 100644
index 0000000..505f306
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/AdbDevicePolicyParser.java
@@ -0,0 +1,53 @@
+/*
+ * 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.bedstead.nene.devicepolicy;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.exceptions.AdbParseException;
+import com.android.bedstead.nene.users.UserReference;
+
+import java.util.Map;
+
+/** Parser for `adb dumpsys device_policy`. */
+@TargetApi(Build.VERSION_CODES.O_MR1)
+public interface AdbDevicePolicyParser {
+
+ /**
+ * Get the {@link AdbDevicePolicyParser} for the given version.
+ */
+ static AdbDevicePolicyParser get(TestApis testApis, int sdkVersion) {
+ return new AdbDevicePolicyParser27(testApis);
+ }
+
+ /**
+ * The result of parsing.
+ *
+ * <p>Values which are not used on the current version of Android will be {@code null}.
+ */
+ class ParseResult {
+ Map<UserReference, ProfileOwner> mProfileOwners;
+ DeviceOwner mDeviceOwner;
+ }
+
+ /**
+ * Parse the device policy output.
+ */
+ ParseResult parse(String dumpsysDevicePolicyOutput) throws AdbParseException;
+}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/AdbDevicePolicyParser27.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/AdbDevicePolicyParser27.java
new file mode 100644
index 0000000..3a20f6c
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/AdbDevicePolicyParser27.java
@@ -0,0 +1,120 @@
+/*
+ * 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.bedstead.nene.devicepolicy;
+
+import android.content.ComponentName;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.exceptions.AdbParseException;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.bedstead.nene.utils.ParserUtils;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Parser of `adb shell dumpsys device_policy` for Android 27+.
+ */
+public class AdbDevicePolicyParser27 implements AdbDevicePolicyParser {
+
+ static final int DEFAULT_INDENTATION = 2;
+
+ private final TestApis mTestApis;
+
+ AdbDevicePolicyParser27(TestApis testApis) {
+ mTestApis = testApis;
+ }
+
+ @Override
+ public ParseResult parse(String dumpsysDevicePolicyOutput) throws AdbParseException {
+ ParseResult parseResult = new ParseResult();
+
+ Set<String> sections = extractDevicePolicySections(dumpsysDevicePolicyOutput);
+
+ parseResult.mDeviceOwner = parseDeviceOwner(sections);
+ parseResult.mProfileOwners = parseProfileOwners(sections);
+ return parseResult;
+ }
+
+ private Set<String> extractDevicePolicySections(String dumpsysDevicePolicyOutput)
+ throws AdbParseException {
+ // Remove first line ("Current Device Policy Manager state:")
+ dumpsysDevicePolicyOutput = dumpsysDevicePolicyOutput.split("\n", 2)[1];
+
+ return ParserUtils.extractIndentedSections(dumpsysDevicePolicyOutput, DEFAULT_INDENTATION);
+ }
+
+ DeviceOwner parseDeviceOwner(Set<String> devicePolicySections) {
+ String deviceOwnerSection = getDeviceOwnerSection(devicePolicySections);
+ if (deviceOwnerSection == null) {
+ return null;
+ }
+
+ ComponentName componentName = ComponentName.unflattenFromString(
+ deviceOwnerSection.split(
+ "ComponentInfo\\{", 2)[1].split("\\}", 2)[0]);
+ int userId = Integer.parseInt(deviceOwnerSection.split(
+ "User ID: ", 2)[1].split("\n", 2)[0]);
+ return new DeviceOwner(mTestApis.users().find(userId),
+ mTestApis.packages().find(componentName.getPackageName()), componentName);
+ }
+
+ String getDeviceOwnerSection(Set<String> devicePolicySections) {
+ for (String section : devicePolicySections) {
+ if (section.startsWith("Device Owner:")) {
+ return section;
+ }
+ }
+
+ return null;
+ }
+
+ Map<UserReference, ProfileOwner> parseProfileOwners(Set<String> devicePolicySections) {
+ Set<String> profileOwnerSections = getProfileOwnerSections(devicePolicySections);
+ Map<UserReference, ProfileOwner> profileOwners = new HashMap<>();
+
+ for (String profileOwnerSection : profileOwnerSections) {
+ ProfileOwner profileOwner = extractProfileOwner(profileOwnerSection);
+ profileOwners.put(profileOwner.user(), profileOwner);
+ }
+
+ return profileOwners;
+ }
+
+ Set<String> getProfileOwnerSections(Set<String> devicePolicySections) {
+ Set<String> sections = new HashSet<>();
+ for (String section : devicePolicySections) {
+ if (section.startsWith("Profile Owner (User ")) {
+ sections.add(section);
+ }
+ }
+
+ return sections;
+ }
+
+ ProfileOwner extractProfileOwner(String profileOwnerSection) {
+ ComponentName componentName = ComponentName.unflattenFromString(
+ profileOwnerSection.split(
+ "ComponentInfo\\{", 2)[1].split("\\}", 2)[0]);
+ int userId = Integer.parseInt(
+ profileOwnerSection.split("\\(User ", 2)[1].split("\\)", 2)[0]);
+ return new ProfileOwner(mTestApis.users().find(userId),
+ mTestApis.packages().find(componentName.getPackageName()), componentName);
+ }
+}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DeviceOwner.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DeviceOwner.java
new file mode 100644
index 0000000..3d9a4ea
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DeviceOwner.java
@@ -0,0 +1,77 @@
+/*
+ * 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.bedstead.nene.devicepolicy;
+
+import android.content.ComponentName;
+
+import com.android.bedstead.nene.exceptions.AdbException;
+import com.android.bedstead.nene.exceptions.NeneException;
+import com.android.bedstead.nene.packages.PackageReference;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.bedstead.nene.utils.ShellCommand;
+import com.android.bedstead.nene.utils.ShellCommandUtils;
+
+import java.util.Objects;
+
+/**
+ * A reference to a Device Owner.
+ */
+public final class DeviceOwner extends DevicePolicyController {
+
+ DeviceOwner(UserReference user,
+ PackageReference pkg,
+ ComponentName componentName) {
+ super(user, pkg, componentName);
+ }
+
+ @Override
+ public void remove() {
+ // TODO(scottjonathan): use DevicePolicyManager#forceRemoveActiveAdmin on S+
+ try {
+ ShellCommand.builder("dpm remove-active-admin")
+ .addOperand(componentName().flattenToShortString())
+ .validate(ShellCommandUtils::startsWithSuccess)
+ .execute();
+ } catch (AdbException e) {
+ throw new NeneException("Error removing device owner " + this, e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder stringBuilder = new StringBuilder("DeviceOwner{");
+ stringBuilder.append("user=").append(user());
+ stringBuilder.append(", package=").append(pkg());
+ stringBuilder.append(", componentName=").append(componentName());
+ stringBuilder.append("}");
+
+ return stringBuilder.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof DeviceOwner)) {
+ return false;
+ }
+
+ DeviceOwner other = (DeviceOwner) obj;
+
+ return Objects.equals(other.mUser, mUser)
+ && Objects.equals(other.mPackage, mPackage)
+ && Objects.equals(other.mComponentName, mComponentName);
+ }
+}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DevicePolicy.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DevicePolicy.java
new file mode 100644
index 0000000..fb924a1
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DevicePolicy.java
@@ -0,0 +1,189 @@
+/*
+ * 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.bedstead.nene.devicepolicy;
+
+import static android.os.Build.VERSION.SDK_INT;
+
+import android.content.ComponentName;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.exceptions.AdbException;
+import com.android.bedstead.nene.exceptions.AdbParseException;
+import com.android.bedstead.nene.exceptions.NeneException;
+import com.android.bedstead.nene.packages.PackageReference;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.bedstead.nene.utils.ShellCommand;
+import com.android.bedstead.nene.utils.ShellCommandUtils;
+
+import java.util.Map;
+
+
+/**
+ * Test APIs related to device policy.
+ */
+public final class DevicePolicy {
+
+ private final TestApis mTestApis;
+ private final AdbDevicePolicyParser mParser;
+
+ private DeviceOwner mCachedDeviceOwner;
+ private Map<UserReference, ProfileOwner> mCachedProfileOwners;
+
+ public DevicePolicy(TestApis testApis) {
+ if (testApis == null) {
+ throw new NullPointerException();
+ }
+
+ mTestApis = testApis;
+ mParser = AdbDevicePolicyParser.get(mTestApis, SDK_INT);
+ }
+
+ /**
+ * Set the profile owner for a given {@link UserReference}.
+ */
+ public ProfileOwner setProfileOwner(UserReference user, ComponentName profileOwnerComponent) {
+ if (user == null || profileOwnerComponent == null) {
+ throw new NullPointerException();
+ }
+
+ ShellCommand.Builder command =
+ ShellCommand.builderForUser(user, "dpm set-profile-owner")
+ .addOperand(profileOwnerComponent.flattenToShortString())
+ .validate(ShellCommandUtils::startsWithSuccess);
+
+ try {
+ command.execute();
+ } catch (AdbException e) {
+ // If it fails, we check for terminal failure states - and if not we retry because if
+ // the profile owner was recently removed, it can take some time to be allowed to set
+ // it again
+
+ ProfileOwner profileOwner = getProfileOwner(user);
+ if (profileOwner != null) {
+ // TODO(scottjonathan): Should we actually fail here if the component name is the
+ // same?
+
+ throw new NeneException(
+ "Could not set profile owner for user " + user
+ + " as a profile owner is already set: " + profileOwner);
+ }
+
+ PackageReference pkg = mTestApis.packages().find(
+ profileOwnerComponent.getPackageName());
+ if (!mTestApis.packages().installedForUser(user).contains(pkg)) {
+ throw new NeneException(
+ "Could not set profile owner for user " + user
+ + " as the package " + pkg + " is not installed");
+ }
+
+ try {
+ command.executeUntilValid();
+ } catch (AdbException | InterruptedException e2) {
+ throw new NeneException("Could not set profile owner for user " + user
+ + " component " + profileOwnerComponent, e2);
+ }
+ }
+
+ return new ProfileOwner(user,
+ mTestApis.packages().find(
+ profileOwnerComponent.getPackageName()), profileOwnerComponent);
+ }
+
+ /**
+ * Get the profile owner for a given {@link UserReference}.
+ */
+ public ProfileOwner getProfileOwner(UserReference user) {
+ if (user == null) {
+ throw new NullPointerException();
+ }
+ fillCache();
+ return mCachedProfileOwners.get(user);
+ }
+
+ /**
+ * Set the device owner.
+ */
+ public DeviceOwner setDeviceOwner(UserReference user, ComponentName deviceOwnerComponent) {
+ if (user == null || deviceOwnerComponent == null) {
+ throw new NullPointerException();
+ }
+
+ ShellCommand.Builder command = ShellCommand.builderForUser(
+ user, "dpm set-device-owner")
+ .addOperand(deviceOwnerComponent.flattenToShortString())
+ .validate(ShellCommandUtils::startsWithSuccess);
+
+ try {
+ command.execute();
+ } catch (AdbException e) {
+ // If it fails, we check for terminal failure states - and if not we retry because if
+ // the device owner was recently removed, it can take some time to be allowed to set
+ // it again
+
+ DeviceOwner deviceOwner = getDeviceOwner();
+ if (deviceOwner != null) {
+ // TODO(scottjonathan): Should we actually fail here if the component name is the
+ // same?
+
+ throw new NeneException(
+ "Could not set device owner for user " + user
+ + " as a device owner is already set: " + deviceOwner);
+ }
+
+ PackageReference pkg = mTestApis.packages().find(
+ deviceOwnerComponent.getPackageName());
+ if (!mTestApis.packages().installedForUser(user).contains(pkg)) {
+ throw new NeneException(
+ "Could not set device owner for user " + user
+ + " as the package " + pkg + " is not installed");
+ }
+
+ try {
+ command.executeUntilValid();
+ } catch (AdbException | InterruptedException e2) {
+ throw new NeneException("Could not set device owner for user " + user
+ + " component " + deviceOwnerComponent, e2);
+ }
+ }
+
+ return new DeviceOwner(user,
+ mTestApis.packages().find(
+ deviceOwnerComponent.getPackageName()), deviceOwnerComponent);
+ }
+
+ /**
+ * Get the device owner.
+ */
+ public DeviceOwner getDeviceOwner() {
+ fillCache();
+ return mCachedDeviceOwner;
+ }
+
+ private void fillCache() {
+ try {
+ // TODO: Replace use of adb on supported versions of Android
+ String devicePolicyDumpsysOutput =
+ ShellCommand.builder("dumpsys device_policy").execute();
+ AdbDevicePolicyParser.ParseResult result = mParser.parse(devicePolicyDumpsysOutput);
+
+ mCachedDeviceOwner = result.mDeviceOwner;
+ mCachedProfileOwners = result.mProfileOwners;
+ } catch (AdbException | AdbParseException e) {
+ throw new RuntimeException("Error filling cache", e);
+ }
+ }
+}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DevicePolicyController.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DevicePolicyController.java
new file mode 100644
index 0000000..9a8aff3
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/DevicePolicyController.java
@@ -0,0 +1,85 @@
+/*
+ * 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.bedstead.nene.devicepolicy;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.ComponentName;
+
+import com.android.bedstead.nene.packages.PackageReference;
+import com.android.bedstead.nene.users.UserReference;
+
+import java.util.Objects;
+
+/**
+ * A reference to either a Device Owner or a Profile Owner.
+ */
+public abstract class DevicePolicyController implements AutoCloseable {
+
+ protected final UserReference mUser;
+ protected final PackageReference mPackage;
+ protected final ComponentName mComponentName;
+
+ DevicePolicyController(UserReference user, PackageReference pkg, ComponentName componentName) {
+ if (user == null || pkg == null || componentName == null) {
+ throw new NullPointerException();
+ }
+
+ mUser = user;
+ mPackage = pkg;
+ mComponentName = componentName;
+ }
+
+ /**
+ * Get the {@link UserReference} which this device policy controller is installed into.
+ */
+ public UserReference user() {
+ return mUser;
+ }
+
+ /**
+ * Get the {@link PackageReference} of the device policy controller.
+ */
+ public PackageReference pkg() {
+ return mPackage;
+ }
+
+ /**
+ * Get the {@link ComponentName} of the {@link DeviceAdminReceiver} for this device policy
+ * controller.
+ */
+ public ComponentName componentName() {
+ return mComponentName;
+ }
+
+ /**
+ * Remove this device policy controller.
+ */
+ public abstract void remove();
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(mUser)
+ + Objects.hashCode(mPackage)
+ + Objects.hashCode(mComponentName);
+ }
+
+ /** See {@link #remove}. */
+ @Override
+ public void close() {
+ remove();
+ }
+}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/ProfileOwner.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/ProfileOwner.java
new file mode 100644
index 0000000..7fb21a8
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/devicepolicy/ProfileOwner.java
@@ -0,0 +1,77 @@
+/*
+ * 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.bedstead.nene.devicepolicy;
+
+import android.content.ComponentName;
+
+import com.android.bedstead.nene.exceptions.AdbException;
+import com.android.bedstead.nene.exceptions.NeneException;
+import com.android.bedstead.nene.packages.PackageReference;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.bedstead.nene.utils.ShellCommand;
+import com.android.bedstead.nene.utils.ShellCommandUtils;
+
+import java.util.Objects;
+
+/**
+ * A reference to a Profile Owner.
+ */
+public final class ProfileOwner extends DevicePolicyController {
+ ProfileOwner(UserReference user,
+ PackageReference pkg,
+ ComponentName componentName) {
+ super(user, pkg, componentName);
+ }
+
+ @Override
+ public void remove() {
+ // TODO(scottjonathan): use DevicePolicyManager#forceRemoveActiveAdmin on S+
+
+ try {
+ ShellCommand.builderForUser(mUser, "dpm remove-active-admin")
+ .addOperand(componentName().flattenToShortString())
+ .validate(ShellCommandUtils::startsWithSuccess)
+ .execute();
+ } catch (AdbException e) {
+ throw new NeneException("Error removing profile owner " + this, e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder stringBuilder = new StringBuilder("ProfileOwner{");
+ stringBuilder.append("user=").append(user());
+ stringBuilder.append(", package=").append(pkg());
+ stringBuilder.append(", componentName=").append(componentName());
+ stringBuilder.append("}");
+
+ return stringBuilder.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof ProfileOwner)) {
+ return false;
+ }
+
+ ProfileOwner other = (ProfileOwner) obj;
+
+ return Objects.equals(other.mUser, mUser)
+ && Objects.equals(other.mPackage, mPackage)
+ && Objects.equals(other.mComponentName, mComponentName);
+ }
+}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/exceptions/AdbParseException.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/exceptions/AdbParseException.java
index 5347408..e2568df 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/exceptions/AdbParseException.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/exceptions/AdbParseException.java
@@ -21,7 +21,7 @@
private final String adbOutput;
- AdbParseException(String message, String adbOutput) {
+ public AdbParseException(String message, String adbOutput) {
super(message);
if (message == null || adbOutput == null) {
throw new NullPointerException();
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/AdbPackageParser26.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/AdbPackageParser26.java
index 39485a8..1638caa 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/AdbPackageParser26.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/AdbPackageParser26.java
@@ -23,6 +23,7 @@
import androidx.annotation.RequiresApi;
import com.android.bedstead.nene.exceptions.AdbParseException;
+import com.android.bedstead.nene.users.UserReference;
import java.util.HashMap;
import java.util.HashSet;
@@ -108,16 +109,18 @@
String packageName = packageString.split("\\[", 2)[1].split("]", 2)[0];
Package.MutablePackage pkg = new Package.MutablePackage();
pkg.mPackageName = packageName;
- pkg.mInstalledOnUsers = new HashSet<>();
+ pkg.mInstalledOnUsers = new HashMap<>();
+ pkg.mInstallPermissions = new HashSet<>();
+ Set<String> sections = extractIndentedSections(
+ packageString.split("\n", 2)[1], // Remove first line (package name)
+ /* baseIndentation= */ 4);
- Matcher userInstalledMatcher = USER_INSTALLED_PATTERN.matcher(packageString);
- while (userInstalledMatcher.find()) {
- int userId = Integer.parseInt(userInstalledMatcher.group(1));
- boolean isInstalled = Boolean.parseBoolean(userInstalledMatcher.group(2));
-
- if (isInstalled) {
- pkg.mInstalledOnUsers.add(mPackages.mTestApis.users().find(userId));
+ for (String section : sections) {
+ if (section.startsWith("install permissions")) {
+ parseInstallPermissions(section, pkg);
+ } else if (section.startsWith("User ")) {
+ parseUser(section, pkg);
}
}
@@ -126,4 +129,63 @@
throw new AdbParseException("Error parsing package", packageString, e);
}
}
+
+ void parseInstallPermissions(String section, Package.MutablePackage pkg) {
+ String list = section.split("\n", 2)[1]; // remove header
+ for (String item : list.split("\n")) {
+ String[] trimmed = item.trim().split(":", 2);
+ String permissionName = trimmed[0];
+
+ if (trimmed[1].contains("granted=true")) {
+ pkg.mInstallPermissions.add(permissionName);
+ }
+ }
+ }
+
+ void parseUser(String section, Package.MutablePackage pkg) throws AdbParseException {
+ Matcher userInstalledMatcher = USER_INSTALLED_PATTERN.matcher(section);
+ if (!userInstalledMatcher.find()) {
+ throw new AdbParseException("Error parsing user section in package", section);
+ }
+ int userId = Integer.parseInt(userInstalledMatcher.group(1));
+ boolean isInstalled = Boolean.parseBoolean(userInstalledMatcher.group(2));
+
+ if (!isInstalled) {
+ return;
+ }
+
+ UserReference user = mPackages.mTestApis.users().find(userId);
+ Package.MutableUserPackage userPackage = new Package.MutableUserPackage();
+ userPackage.mGrantedPermissions = new HashSet<>();
+ pkg.mInstalledOnUsers.put(user, userPackage);
+
+
+ try {
+ String[] sectionParts = section.split("\n", 2); // remove header
+
+ if (sectionParts.length < 2) {
+ return; // No content - just the header
+ }
+
+ Set<String> userSections = extractIndentedSections(
+ sectionParts[1], // Remove first line (user name)
+ /* baseIndentation= */ 6);
+
+ for (String userSection : userSections) {
+ if (userSection.startsWith("runtime permissions:")) {
+ String list = userSection.split("\n", 2)[1]; // remove header
+ for (String item : list.split("\n")) {
+ String[] trimmed = item.trim().split(":", 2);
+ String permissionName = trimmed[0];
+
+ if (trimmed[1].contains("granted=true")) {
+ userPackage.mGrantedPermissions.add(permissionName);
+ }
+ }
+ }
+ }
+ } catch (IndexOutOfBoundsException e) {
+ throw new AdbParseException("Error parsing user section", section, e);
+ }
+ }
}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/KeepUninstalledPackagesBuilder.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/KeepUninstalledPackagesBuilder.java
index b81764d..f16a5c9 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/KeepUninstalledPackagesBuilder.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/KeepUninstalledPackagesBuilder.java
@@ -20,6 +20,7 @@
import android.content.pm.PackageManager;
import android.os.Build;
+import androidx.annotation.CheckResult;
import androidx.annotation.RequiresApi;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -28,6 +29,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.stream.Collectors;
/**
@@ -37,9 +39,11 @@
@RequiresApi(Build.VERSION_CODES.S)
public final class KeepUninstalledPackagesBuilder {
- private final List<String> mPackages = new ArrayList<>();
+ private final List<String> mPackagesToKeep = new ArrayList<>();
+ private final Packages mPackages;
- KeepUninstalledPackagesBuilder() {
+ KeepUninstalledPackagesBuilder(Packages packages) {
+ mPackages = packages;
}
/**
@@ -59,7 +63,7 @@
SystemUtil.runWithShellPermissionIdentity(() -> {
// Needs KEEP_UNINSTALLED_PACKAGES
- packageManager.setKeepUninstalledPackages(mPackages);
+ packageManager.setKeepUninstalledPackages(mPackagesToKeep);
});
}
@@ -70,25 +74,43 @@
* any user.
*/
public void clear() {
- mPackages.clear();
+ mPackagesToKeep.clear();
commit();
}
/**
* Add a package to the list of those which will not be cleaned up.
*/
+ @CheckResult
public KeepUninstalledPackagesBuilder add(PackageReference pkg) {
- mPackages.add(pkg.packageName());
+ mPackagesToKeep.add(pkg.packageName());
+ return this;
+ }
+
+ /**
+ * Add a package to the list of those which will not be cleaned up.
+ */
+ @CheckResult
+ public KeepUninstalledPackagesBuilder add(String pkg) {
+ return add(mPackages.find(pkg));
+ }
+
+ /**
+ * Add a collection of packages to the list of those which will not be cleaned up.
+ */
+ @CheckResult
+ public KeepUninstalledPackagesBuilder add(Collection<PackageReference> packages) {
+ for (PackageReference pkg : packages) {
+ add(pkg);
+ }
return this;
}
/**
* Add a collection of packages to the list of those which will not be cleaned up.
*/
- public KeepUninstalledPackagesBuilder add(Collection<PackageReference> packages) {
- for (PackageReference pkg : packages) {
- add(pkg);
- }
- return this;
+ @CheckResult
+ public KeepUninstalledPackagesBuilder addPackageNames(Collection<String> packages) {
+ return add(packages.stream().map(mPackages::find).collect(Collectors.toSet()));
}
}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Package.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Package.java
index 41c1522..5ecbd48 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Package.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Package.java
@@ -16,8 +16,20 @@
package com.android.bedstead.nene.packages;
+import static android.content.pm.PackageManager.GET_PERMISSIONS;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.util.Log;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
import com.android.bedstead.nene.users.UserReference;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
/**
@@ -25,21 +37,68 @@
*/
public class Package extends PackageReference {
+ private static final String LOG_TAG = "Package";
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
+ private static final PackageManager sPackageManager = sContext.getPackageManager();
+
static final class MutablePackage {
String mPackageName;
- Set<UserReference> mInstalledOnUsers;
+ Map<UserReference, MutableUserPackage> mInstalledOnUsers;
+ Set<String> mInstallPermissions;
+ }
+
+ static final class MutableUserPackage {
+ Set<String> mGrantedPermissions;
}
private final MutablePackage mMutablePackage;
+ private final Set<String> mRequestedPermissions;
Package(Packages packages, MutablePackage mutablePackage) {
super(packages, mutablePackage.mPackageName);
mMutablePackage = mutablePackage;
+ mRequestedPermissions = new HashSet<>();
+
+ try {
+ PackageInfo packageInfo = sPackageManager.getPackageInfo(
+ mMutablePackage.mPackageName, /* flags= */ GET_PERMISSIONS);
+ if (packageInfo.requestedPermissions != null) {
+ mRequestedPermissions.addAll(Arrays.asList(packageInfo.requestedPermissions));
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.d(LOG_TAG, "NameNotFound when resolving package", e);
+ }
}
/** Get {@link UserReference}s who have this {@link Package} installed. */
public Set<UserReference> installedOnUsers() {
- return mMutablePackage.mInstalledOnUsers;
+ return mMutablePackage.mInstalledOnUsers.keySet();
+ }
+
+ /**
+ * Get all permissions granted to this package on the given user.
+ *
+ * <p>This will also include permissions which are granted for all users.
+ */
+ public Set<String> grantedPermissions(UserReference user) {
+ MutableUserPackage userPackage = mMutablePackage.mInstalledOnUsers.get(user);
+ if (userPackage == null) {
+ return new HashSet<>();
+ }
+
+ Set<String> mergedPermissions = new HashSet<>();
+ mergedPermissions.addAll(mMutablePackage.mInstallPermissions);
+ mergedPermissions.addAll(userPackage.mGrantedPermissions);
+
+ return mergedPermissions;
+ }
+
+ /**
+ * Get all permissions requested by this package.
+ */
+ public Set<String> requestedPermissions() {
+ return mRequestedPermissions;
}
@Override
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/PackageReference.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/PackageReference.java
index 5602fb0..3f5a972 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/PackageReference.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/PackageReference.java
@@ -16,7 +16,17 @@
package com.android.bedstead.nene.packages;
+import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS;
+import static android.content.pm.PermissionInfo.PROTECTION_FLAG_DEVELOPMENT;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionInfo;
+
import androidx.annotation.Nullable;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.bedstead.nene.exceptions.AdbException;
import com.android.bedstead.nene.exceptions.NeneException;
@@ -34,6 +44,10 @@
private final Packages mPackages;
private final String mPackageName;
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
+ private static final PackageManager sPackageManager = sContext.getPackageManager();
+
PackageReference(Packages packages, String packageName) {
mPackages = packages;
mPackageName = packageName;
@@ -65,7 +79,7 @@
}
try {
// Expected output "Package X installed for user: Y"
- ShellCommand.builderForUser(user, "pm install-existing")
+ ShellCommand.builderForUser(user, "cmd package install-existing")
.addOperand(mPackageName)
.validate(
(output) -> output.contains("installed for user"))
@@ -103,6 +117,111 @@
}
}
+ /**
+ * Grant a permission for the package on the given user.
+ *
+ * <p>The package must be installed on the user, must request the given permission, and the
+ * permission must be a runtime permission.
+ */
+ public PackageReference grantPermission(UserReference user, String permission) {
+ // There is no readable output upon failure so we need to check ourselves
+ checkCanGrantOrRevokePermission(user, permission);
+
+ try {
+ ShellCommand.builderForUser(user, "pm grant")
+ .addOperand(packageName())
+ .addOperand(permission)
+ .allowEmptyOutput(true)
+ .validate(String::isEmpty)
+ .execute();
+
+ assertWithMessage("Error granting permission " + permission
+ + " to package " + this + " on user " + user
+ + ". Command appeared successful but not set.")
+ .that(resolve().grantedPermissions(user)).contains(permission);
+
+ return this;
+ } catch (AdbException e) {
+ throw new NeneException("Error granting permission " + permission + " to package "
+ + this + " on user " + user, e);
+ }
+ }
+
+ /**
+ * Deny a permission for the package on the given user.
+ *
+ * <p>The package must be installed on the user, must request the given permission, and the
+ * permission must be a runtime permission.
+ *
+ * <p>You can not deny permissions for the current package on the current user.
+ */
+ public PackageReference denyPermission(UserReference user, String permission) {
+ // There is no readable output upon failure so we need to check ourselves
+ checkCanGrantOrRevokePermission(user, permission);
+
+ if (packageName().equals(sContext.getPackageName())
+ && user.equals(mPackages.mTestApis.users().instrumented())) {
+ Package resolved = resolve();
+ if (!resolved.grantedPermissions(user).contains(permission)) {
+ return this; // Already denied
+ }
+ throw new NeneException("Cannot deny permission from current package");
+ }
+
+ try {
+ ShellCommand.builderForUser(user, "pm revoke")
+ .addOperand(packageName())
+ .addOperand(permission)
+ .allowEmptyOutput(true)
+ .validate(String::isEmpty)
+ .execute();
+
+ assertWithMessage("Error denying permission " + permission
+ + " to package " + this + " on user " + user
+ + ". Command appeared successful but not set.")
+ .that(resolve().grantedPermissions(user)).doesNotContain(permission);
+
+ return this;
+ } catch (AdbException e) {
+ throw new NeneException("Error denying permission " + permission + " to package "
+ + this + " on user " + user, e);
+ }
+ }
+
+ private void checkCanGrantOrRevokePermission(UserReference user, String permission) {
+ Package resolved = resolve();
+ if (resolved == null || !resolved.installedOnUsers().contains(user)) {
+ throw new NeneException("Attempting to grant " + permission + " to " + this
+ + " on user " + user + ". But it is not installed");
+ }
+
+ try {
+ PermissionInfo permissionInfo =
+ sPackageManager.getPermissionInfo(permission, /* flags= */ 0);
+
+ if (!protectionIsDangerous(permissionInfo.protectionLevel)
+ && !protectionIsDevelopment(permissionInfo.protectionLevel)) {
+ throw new NeneException("Cannot grant non-runtime permission "
+ + permission + ", protection level is " + permissionInfo.protectionLevel);
+ }
+
+ if (!resolved.requestedPermissions().contains(permission)) {
+ throw new NeneException("Cannot grant permission "
+ + permission + " which was not requested by package " + packageName());
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new NeneException("Permission does not exist: " + permission);
+ }
+ }
+
+ private boolean protectionIsDangerous(int protectionLevel) {
+ return (protectionLevel & PROTECTION_DANGEROUS) != 0;
+ }
+
+ private boolean protectionIsDevelopment(int protectionLevel) {
+ return (protectionLevel & PROTECTION_FLAG_DEVELOPMENT) != 0;
+ }
+
@Override
public int hashCode() {
return mPackageName.hashCode();
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Packages.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Packages.java
index 22be828..ceef26d 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Packages.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/packages/Packages.java
@@ -22,6 +22,7 @@
import android.os.Build;
+import androidx.annotation.CheckResult;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
@@ -97,6 +98,8 @@
* <p>The user must be started.
*
* <p>If the package is already installed, this will replace it.
+ *
+ * <p>If the package is marked testOnly, it will still be installed.
*/
public void install(UserReference user, File apkFile) {
if (user == null || apkFile == null) {
@@ -128,6 +131,8 @@
* <p>The user must be started.
*
* <p>If the package is already installed, this will replace it.
+ *
+ * <p>If the package is marked testOnly, it will still be installed.
*/
public void install(UserReference user, byte[] apkFile) {
if (user == null || apkFile == null) {
@@ -141,6 +146,7 @@
ShellCommand.builderForUser(user, "pm install")
.addOption("-S", apkFile.length)
.addOperand("-r")
+ .addOperand("-t")
.writeToStdIn(apkFile)
.validate(ShellCommandUtils::startsWithSuccess)
.execute();
@@ -167,10 +173,11 @@
* <p>This will ensure they can still be resolved and re-installed without needing the APK
*/
@RequiresApi(Build.VERSION_CODES.S)
+ @CheckResult
public KeepUninstalledPackagesBuilder keepUninstalledPackages() {
Versions.requireS();
- return new KeepUninstalledPackagesBuilder();
+ return new KeepUninstalledPackagesBuilder(this);
}
@Nullable
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/UserBuilder.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/UserBuilder.java
index 51bf36b..dae69da 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/UserBuilder.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/UserBuilder.java
@@ -22,6 +22,7 @@
import android.os.Build;
+import androidx.annotation.CheckResult;
import androidx.annotation.Nullable;
import com.android.bedstead.nene.exceptions.AdbException;
@@ -45,6 +46,10 @@
mUsers = users;
}
+ /**
+ * Set the user's name.
+ */
+ @CheckResult
public UserBuilder name(String name) {
if (name == null) {
throw new NullPointerException();
@@ -58,6 +63,7 @@
*
* <p>Defaults to android.os.usertype.full.SECONDARY
*/
+ @CheckResult
public UserBuilder type(UserType type) {
if (type == null) {
// We don't want to allow null to be passed in explicitly as that would cause subtle
@@ -73,6 +79,7 @@
*
* <p>This should only be set if the {@link #type(UserType)} is a profile.
*/
+ @CheckResult
public UserBuilder parent(UserReference parent) {
mParent = parent;
return this;
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/UserReference.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/UserReference.java
index 47ed133..bfd629f 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/UserReference.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/UserReference.java
@@ -16,6 +16,8 @@
package com.android.bedstead.nene.users;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
+
import android.content.Context;
import android.content.Intent;
import android.os.UserHandle;
@@ -28,6 +30,7 @@
import com.android.bedstead.nene.utils.ShellCommand;
import com.android.bedstead.nene.utils.ShellCommandUtils;
import com.android.compatibility.common.util.BlockingBroadcastReceiver;
+import com.android.compatibility.common.util.SystemUtil;
import java.util.ArrayList;
import java.util.List;
@@ -39,7 +42,7 @@
*
* <p>To resolve the user into a {@link User}, see {@link #resolve()}.
*/
-public abstract class UserReference {
+public abstract class UserReference implements AutoCloseable {
private static final Context sContext =
InstrumentationRegistry.getInstrumentation().getContext();
@@ -158,11 +161,15 @@
// the user being backgrounded is the user running the test. We should support this
// when this is not the case.
List<String> intents = new ArrayList<>();
- intents.add(Intent.ACTION_USER_BACKGROUND);
intents.add(Intent.ACTION_USER_FOREGROUND);
BlockingBroadcastReceiver broadcastReceiver =
- new BlockingBroadcastReceiver(sContext, intents);
- broadcastReceiver.register();
+ new BlockingBroadcastReceiver(sContext, intents,
+ (intent) ->((UserHandle)
+ intent.getParcelableExtra(Intent.EXTRA_USER))
+ .getIdentifier() == mId);
+
+ SystemUtil.runWithShellPermissionIdentity(
+ broadcastReceiver::registerForAllUsers, INTERACT_ACROSS_USERS_FULL);
// Expects no output on success or failure
ShellCommand.builder("am switch-user")
@@ -194,4 +201,10 @@
public int hashCode() {
return id();
}
+
+ /** See {@link #remove}. */
+ @Override
+ public void close() {
+ remove();
+ }
}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/Users.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/Users.java
index d64c88fd..4e590eb 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/Users.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/users/Users.java
@@ -26,6 +26,7 @@
import android.os.Build;
import android.os.UserHandle;
+import androidx.annotation.CheckResult;
import androidx.annotation.Nullable;
import com.android.bedstead.nene.exceptions.AdbException;
@@ -153,6 +154,7 @@
/**
* Create a new user.
*/
+ @CheckResult
public UserBuilder createUser() {
return new UserBuilder(this);
}
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ParserUtils.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ParserUtils.java
index 42019eb..3704221 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ParserUtils.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ParserUtils.java
@@ -52,23 +52,35 @@
*/
public static Set<String> extractIndentedSections(String list, int baseIndentation)
throws AdbParseException {
- Set<String> sections = new HashSet<>();
- String[] lines = list.split("\n");
- StringBuilder sectionBuilder = null;
- for (String line : lines) {
- int indentation = countIndentation(line);
- if (indentation == baseIndentation) {
- // New item
- if (sectionBuilder != null) {
- sections.add(sectionBuilder.toString().trim());
+ try {
+ Set<String> sections = new HashSet<>();
+ String[] lines = list.split("\n");
+
+ boolean skippingStart = true; // Skip empty lines at the start
+ StringBuilder sectionBuilder = null;
+ for (String line : lines) {
+ if (skippingStart && line.isEmpty()) {
+ continue;
}
- sectionBuilder = new StringBuilder(line).append("\n");
- } else {
- sectionBuilder.append(line).append("\n");
+ skippingStart = false;
+ int indentation = countIndentation(line);
+ if (indentation == baseIndentation) {
+ // New item
+ if (sectionBuilder != null) {
+ sections.add(sectionBuilder.toString().trim());
+ }
+ sectionBuilder = new StringBuilder(line).append("\n");
+ } else {
+ sectionBuilder.append(line).append("\n");
+ }
}
+ sections.add(sectionBuilder.toString().trim());
+ return sections;
+ } catch (NullPointerException e) {
+ throw new AdbParseException(
+ "Error extracting indented sections with baseIndentation: " + baseIndentation,
+ list, e);
}
- sections.add(sectionBuilder.toString().trim());
- return sections;
}
private static int countIndentation(String s) {
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ShellCommand.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ShellCommand.java
index 6a9a499..0bada6b 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ShellCommand.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ShellCommand.java
@@ -16,6 +16,7 @@
package com.android.bedstead.nene.utils;
+import androidx.annotation.CheckResult;
import androidx.annotation.Nullable;
import com.android.bedstead.nene.exceptions.AdbException;
@@ -28,10 +29,14 @@
*/
public final class ShellCommand {
- // 60 seconds
- private static final int MAX_WAIT_UNTIL_ATTEMPTS = 600;
+ // 10 seconds
+ private static final int MAX_WAIT_UNTIL_ATTEMPTS = 100;
private static final long WAIT_UNTIL_DELAY_MILLIS = 100;
+ /**
+ * Begin building a new {@link ShellCommand}.
+ */
+ @CheckResult
public static Builder builder(String command) {
if (command == null) {
throw new NullPointerException();
@@ -42,6 +47,7 @@
/**
* Create a builder and if {@code userReference} is not {@code null}, add "--user <userId>".
*/
+ @CheckResult
public static Builder builderForUser(@Nullable UserReference userReference, String command) {
Builder builder = builder(command);
if (userReference != null) {
@@ -69,6 +75,7 @@
*
* <p>e.g. --user 10
*/
+ @CheckResult
public Builder addOption(String key, Object value) {
// TODO: Deal with spaces/etc.
commandBuilder.append(" ").append(key).append(" ").append(value);
@@ -78,6 +85,7 @@
/**
* Add an operand to the command.
*/
+ @CheckResult
public Builder addOperand(Object value) {
// TODO: Deal with spaces/etc.
commandBuilder.append(" ").append(value);
@@ -89,6 +97,7 @@
*
* <p>Defaults to {@code false}
*/
+ @CheckResult
public Builder allowEmptyOutput(boolean allowEmptyOutput) {
mAllowEmptyOutput = allowEmptyOutput;
return this;
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ShellCommandUtils.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ShellCommandUtils.java
index 60ebb4f..9995e3d 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ShellCommandUtils.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/utils/ShellCommandUtils.java
@@ -16,7 +16,7 @@
package com.android.bedstead.nene.utils;
-import static android.os.Build.VERSION.SDK_INT;
+import static android.os.Build.VERSION_CODES.S;
import android.app.UiAutomation;
import android.os.ParcelFileDescriptor;
@@ -64,15 +64,14 @@
throws AdbException {
logCommand(command, allowEmptyOutput, stdInBytes);
- if (SDK_INT < Versions.S) {
+ if (!Versions.isRunningOn(S, "S")) {
return executeCommandPreS(command, allowEmptyOutput, stdInBytes);
}
// TODO(scottjonathan): Add argument to force errors to stderr
- UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
try {
- ParcelFileDescriptor[] fds = automation.executeShellCommandRwe(command);
+ ParcelFileDescriptor[] fds = uiAutomation().executeShellCommandRwe(command);
ParcelFileDescriptor fdOut = fds[OUT_DESCRIPTOR_INDEX];
ParcelFileDescriptor fdIn = fds[IN_DESCRIPTOR_INDEX];
ParcelFileDescriptor fdErr = fds[ERR_DESCRIPTOR_INDEX];
@@ -154,8 +153,7 @@
private static String executeCommandPreS(
String command, boolean allowEmptyOutput, byte[] stdInBytes) throws AdbException {
- UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
- ParcelFileDescriptor[] fds = automation.executeShellCommandRw(command);
+ ParcelFileDescriptor[] fds = uiAutomation().executeShellCommandRw(command);
ParcelFileDescriptor fdOut = fds[OUT_DESCRIPTOR_INDEX];
ParcelFileDescriptor fdIn = fds[IN_DESCRIPTOR_INDEX];
@@ -197,4 +195,11 @@
return new String(FileUtils.readInputStreamFully(fis));
}
}
+
+ /**
+ * Get a {@link UiAutomation}.
+ */
+ public static UiAutomation uiAutomation() {
+ return InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ }
}
diff --git a/common/device-side/bedstead/nene/src/test/AndroidManifest.xml b/common/device-side/bedstead/nene/src/test/AndroidManifest.xml
index a82d39b..92c6409 100644
--- a/common/device-side/bedstead/nene/src/test/AndroidManifest.xml
+++ b/common/device-side/bedstead/nene/src/test/AndroidManifest.xml
@@ -18,6 +18,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.bedstead.nene.test">
+
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
+ <uses-permission android:name="android.permission.READ_CONTACTS"/>
+
<application
android:label="Nene Tests"
android:appComponentFactory="com.android.eventlib.premade.EventLibAppComponentFactory">
diff --git a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/DeviceOwnerTest.java b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/DeviceOwnerTest.java
new file mode 100644
index 0000000..d3a23ee
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/DeviceOwnerTest.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.bedstead.nene.devicepolicy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ComponentName;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.bedstead.testapp.TestApp;
+import com.android.bedstead.testapp.TestAppProvider;
+import com.android.eventlib.premade.EventLibDeviceAdminReceiver;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class DeviceOwnerTest {
+
+ // TODO(180478924): We shouldn't need to hardcode this
+ private static final String DEVICE_ADMIN_TESTAPP_PACKAGE_NAME = "android.DeviceAdminTestApp";
+ private static final ComponentName DPC_COMPONENT_NAME =
+ new ComponentName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME,
+ EventLibDeviceAdminReceiver.class.getName());
+
+ private static final TestApis sTestApis = new TestApis();
+ private static final UserReference sUser = sTestApis.users().instrumented();
+
+ private static TestApp sTestApp;
+ private static DeviceOwner sDeviceOwner;
+
+ @BeforeClass
+ public static void setupClass() {
+ sTestApp = new TestAppProvider().query()
+ .withPackageName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME)
+ .get();
+
+ sTestApp.install(sUser);
+
+ sDeviceOwner = sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME);
+ }
+
+ @AfterClass
+ public static void teardownClass() {
+ sDeviceOwner.remove();
+ sTestApp.reference().uninstall(sUser);
+ }
+
+ @Test
+ public void user_returnsUser() {
+ assertThat(sDeviceOwner.user()).isEqualTo(sUser);
+ }
+
+ @Test
+ public void pkg_returnsPackage() {
+ assertThat(sDeviceOwner.pkg()).isEqualTo(sTestApp.reference());
+ }
+
+ @Test
+ public void componentName_returnsComponentName() {
+ assertThat(sDeviceOwner.componentName()).isEqualTo(DPC_COMPONENT_NAME);
+ }
+
+ @Test
+ public void remove_removesDeviceOwner() {
+ sDeviceOwner.remove();
+ try {
+ assertThat(sTestApis.devicePolicy().getDeviceOwner()).isNull();
+ } finally {
+ sDeviceOwner = sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME);
+ }
+ }
+}
diff --git a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/DevicePolicyTest.java b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/DevicePolicyTest.java
new file mode 100644
index 0000000..6b89d9f
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/DevicePolicyTest.java
@@ -0,0 +1,304 @@
+/*
+ * 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.bedstead.nene.devicepolicy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.content.ComponentName;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.exceptions.NeneException;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.bedstead.nene.users.UserType;
+import com.android.bedstead.testapp.TestApp;
+import com.android.bedstead.testapp.TestAppProvider;
+import com.android.eventlib.premade.EventLibDeviceAdminReceiver;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class DevicePolicyTest {
+
+ // TODO(180478924): We shouldn't need to hardcode this
+ private static final String DEVICE_ADMIN_TESTAPP_PACKAGE_NAME = "android.DeviceAdminTestApp";
+ private static final ComponentName DPC_COMPONENT_NAME =
+ new ComponentName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME,
+ EventLibDeviceAdminReceiver.class.getName());
+ private static final ComponentName NOT_DPC_COMPONENT_NAME =
+ new ComponentName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME,
+ "incorrect.class.name");
+
+ private static final TestApis sTestApis = new TestApis();
+ private static final UserReference sUser = sTestApis.users().instrumented();
+ private static final UserReference NON_EXISTENT_USER = sTestApis.users().find(99999);
+
+ private static TestApp sTestApp;
+
+ @BeforeClass
+ public static void setupClass() {
+ sTestApp = new TestAppProvider().query()
+ .withPackageName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME)
+ .get();
+
+ sTestApp.install(sUser);
+ }
+
+ @AfterClass
+ public static void teardownClass() {
+ sTestApp.reference().uninstall(sUser);
+ }
+
+ @Test
+ public void setProfileOwner_profileOwnerIsSet() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sTestApp.install(profile);
+
+ ProfileOwner profileOwner =
+ sTestApis.devicePolicy().setProfileOwner(profile, DPC_COMPONENT_NAME);
+
+ try {
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile)).isEqualTo(profileOwner);
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setProfileOwner_profileOwnerIsAlreadySet_throwsException() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sTestApp.install(profile);
+ sTestApis.devicePolicy().setProfileOwner(profile, DPC_COMPONENT_NAME);
+
+ try {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setProfileOwner(profile, DPC_COMPONENT_NAME));
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setProfileOwner_componentNameNotInstalled_throwsException() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setProfileOwner(profile, DPC_COMPONENT_NAME));
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setProfileOwner_componentNameIsNotDPC_throwsException() {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setProfileOwner(sUser, NOT_DPC_COMPONENT_NAME));
+ }
+
+ @Test
+ public void setProfileOwner_nullUser_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> sTestApis.devicePolicy().setProfileOwner(
+ /* user= */ null, DPC_COMPONENT_NAME));
+ }
+
+ @Test
+ public void setProfileOwner_nullComponentName_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> sTestApis.devicePolicy().setProfileOwner(
+ sUser, /* profileOwnerComponent= */ null));
+ }
+
+ @Test
+ public void setProfileOwner_userDoesNotExist_throwsException() {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setProfileOwner(
+ NON_EXISTENT_USER, DPC_COMPONENT_NAME));
+ }
+
+ @Test
+ public void getProfileOwner_returnsProfileOwner() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sTestApp.install(profile);
+ ProfileOwner profileOwner =
+ sTestApis.devicePolicy().setProfileOwner(profile, DPC_COMPONENT_NAME);
+
+ try {
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile)).isEqualTo(profileOwner);
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void getProfileOwner_noProfileOwner_returnsNull() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+
+ try {
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile)).isNull();
+ } finally {
+ profile.remove();
+ }
+
+ }
+
+ @Test
+ public void getProfileOwner_nullUser_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> sTestApis.devicePolicy().getProfileOwner(null));
+ }
+
+ @Test
+ public void setDeviceOwner_deviceOwnerIsSet() {
+ DeviceOwner deviceOwner =
+ sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME);
+
+ try {
+ assertThat(sTestApis.devicePolicy().getDeviceOwner()).isEqualTo(deviceOwner);
+ } finally {
+ deviceOwner.remove();
+ }
+ }
+
+ @Test
+ public void setDeviceOwner_deviceOwnerIsAlreadySet_throwsException() {
+ DeviceOwner deviceOwner =
+ sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME);
+
+ try {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME));
+ } finally {
+ deviceOwner.remove();
+ }
+ }
+
+ @Test
+ public void setDeviceOwner_componentNameNotInstalled_throwsException() {
+ sTestApp.reference().uninstall(sUser);
+ try {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME));
+ } finally {
+ sTestApp.install(sUser);
+ }
+ }
+
+ @Test
+ public void setDeviceOwner_componentNameIsNotDPC_throwsException() {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setDeviceOwner(sUser, NOT_DPC_COMPONENT_NAME));
+ }
+
+ @Test
+ public void setDeviceOwner_userAlreadyOnDevice_throwsException() {
+ UserReference user = sTestApis.users().createUser().create();
+
+ try {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME));
+ } finally {
+ user.remove();
+ }
+ }
+
+ @Test
+ @Ignore("TODO: Update once account support is added to Nene")
+ public void setDeviceOwner_accountAlreadyOnDevice_throwsException() {
+ }
+
+ @Test
+ public void setDeviceOwner_nullUser_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> sTestApis.devicePolicy().setDeviceOwner(
+ /* user= */ null, DPC_COMPONENT_NAME));
+ }
+
+ @Test
+ public void setDeviceOwner_nullComponentName_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> sTestApis.devicePolicy().setDeviceOwner(
+ sUser, /* deviceOwnerComponent= */ null));
+ }
+
+ @Test
+ public void setDeviceOwner_userDoesNotExist_throwsException() {
+ assertThrows(NeneException.class,
+ () -> sTestApis.devicePolicy().setDeviceOwner(
+ NON_EXISTENT_USER, DPC_COMPONENT_NAME));
+ }
+
+ @Test
+ public void getDeviceOwner_returnsDeviceOwner() {
+ DeviceOwner deviceOwner =
+ sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME);
+
+ try {
+ assertThat(sTestApis.devicePolicy().getDeviceOwner()).isEqualTo(deviceOwner);
+ } finally {
+ deviceOwner.remove();
+ }
+ }
+
+ @Test
+ public void getDeviceOwner_noDeviceOwner_returnsNull() {
+ // We must assume no device owner entering the test
+ // TODO(scottjonathan): Encode this assumption in the annotations when Harrier supports
+ assertThat(sTestApis.devicePolicy().getDeviceOwner()).isNull();
+ }
+
+ @Test
+ public void profileOwner_autoclose_removesProfileOwner() {
+ try (ProfileOwner profileOwner =
+ sTestApis.devicePolicy().setProfileOwner(sUser, DPC_COMPONENT_NAME)) {
+ // We intentionally don't do anything here, just rely on the auto-close behaviour
+ }
+
+ assertThat(sTestApis.devicePolicy().getProfileOwner(sUser)).isNull();
+ }
+
+ @Test
+ public void deviceOwner_autoclose_removesDeviceOwner() {
+ try (DeviceOwner deviceOwner =
+ sTestApis.devicePolicy().setDeviceOwner(sUser, DPC_COMPONENT_NAME)) {
+ // We intentionally don't do anything here, just rely on the auto-close behaviour
+ }
+
+ assertThat(sTestApis.devicePolicy().getDeviceOwner()).isNull();
+ }
+}
diff --git a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/ProfileOwnerTest.java b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/ProfileOwnerTest.java
new file mode 100644
index 0000000..5bc0232
--- /dev/null
+++ b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/devicepolicy/ProfileOwnerTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.bedstead.nene.devicepolicy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ComponentName;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.bedstead.nene.users.UserType;
+import com.android.bedstead.testapp.TestApp;
+import com.android.bedstead.testapp.TestAppProvider;
+import com.android.eventlib.premade.EventLibDeviceAdminReceiver;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class ProfileOwnerTest {
+
+ // TODO(180478924): We shouldn't need to hardcode this
+ private static final String DEVICE_ADMIN_TESTAPP_PACKAGE_NAME = "android.DeviceAdminTestApp";
+ private static final ComponentName DPC_COMPONENT_NAME =
+ new ComponentName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME,
+ EventLibDeviceAdminReceiver.class.getName());
+
+ private static final TestApis sTestApis = new TestApis();
+ private static final UserReference sUser = sTestApis.users().instrumented();
+ private static UserReference sProfile;
+
+ private static TestApp sTestApp;
+ private static ProfileOwner sProfileOwner;
+
+ @BeforeClass
+ public static void setupClass() {
+ sProfile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+
+ sTestApp = new TestAppProvider().query()
+ .withPackageName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME)
+ .get();
+
+ sTestApp.install(sProfile);
+
+ sProfileOwner = sTestApis.devicePolicy().setProfileOwner(sProfile, DPC_COMPONENT_NAME);
+ }
+
+ @AfterClass
+ public static void teardownClass() {
+ sProfile.remove();
+ }
+
+ @Test
+ public void user_returnsUser() {
+ assertThat(sProfileOwner.user()).isEqualTo(sProfile);
+ }
+
+ @Test
+ public void pkg_returnsPackage() {
+ assertThat(sProfileOwner.pkg()).isEqualTo(sTestApp.reference());
+ }
+
+ @Test
+ public void componentName_returnsComponentName() {
+ assertThat(sProfileOwner.componentName()).isEqualTo(DPC_COMPONENT_NAME);
+ }
+
+ @Test
+ public void remove_removesProfileOwner() {
+ sProfileOwner.remove();
+ try {
+ assertThat(sTestApis.devicePolicy().getProfileOwner(sProfile)).isNull();
+ } finally {
+ sProfileOwner = sTestApis.devicePolicy().setProfileOwner(sProfile, DPC_COMPONENT_NAME);
+ }
+ }
+}
diff --git a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/packages/PackageReferenceTest.java b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/packages/PackageReferenceTest.java
index 187d8df..93b10c4 100644
--- a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/packages/PackageReferenceTest.java
+++ b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/packages/PackageReferenceTest.java
@@ -20,10 +20,15 @@
import static org.testng.Assert.assertThrows;
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
import com.android.bedstead.nene.TestApis;
import com.android.bedstead.nene.exceptions.NeneException;
import com.android.bedstead.nene.users.UserReference;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -44,9 +49,21 @@
// Controlled by AndroidTest.xml
private static final String TEST_APP_PACKAGE_NAME =
"com.android.bedstead.nene.testapps.TestApp1";
- private static final File TEST_APP_APK_FILE = new File("/data/local/tmp/NeneTestApp1.apk");
+ private static final File TEST_APP_APK_FILE =
+ new File("/data/local/tmp/NeneTestApp1.apk");
private static final File NON_EXISTING_APK_FILE =
new File("/data/local/tmp/ThisApkDoesNotExist.apk");
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
+
+ // Relies on this being declared by AndroidManifest.xml
+ // TODO(scottjonathan): Replace with TestApp
+ private static final String INSTALL_PERMISSION = "android.permission.CHANGE_WIFI_STATE";
+ private static final String UNDECLARED_RUNTIME_PERMISSION = "android.permission.RECEIVE_SMS";
+ private static final String DECLARED_RUNTIME_PERMISSION =
+ "android.permission.INTERACT_ACROSS_USERS";
+ private static final String NON_EXISTING_PERMISSION = "aPermissionThatDoesntExist";
+ private static final String USER_SPECIFIC_PERMISSION = "android.permission.READ_CONTACTS";
@Test
public void packageName_returnsPackageName() {
@@ -64,6 +81,17 @@
}
@Test
+ public void install_alreadyInstalled_installsInUser() {
+ try (UserReference user = mTestApis.users().createUser().create()) {
+ PackageReference pkg = mTestApis.packages().find(sContext.getPackageName());
+
+ pkg.install(user);
+
+ assertThat(pkg.resolve().installedOnUsers()).contains(user);
+ }
+ }
+
+ @Test
public void install_packageIsInstalled() {
mTestApis.packages().install(mUser, TEST_APP_APK_FILE);
PackageReference packageReference = mTestApis.packages().find(TEST_APP_PACKAGE_NAME);
@@ -130,4 +158,183 @@
packageReference.uninstall(mUser);
}
+
+ @Test
+ public void grantPermission_installPermission_throwsException() {
+ assertThrows(NeneException.class, () ->
+ mTestApis.packages().find(sContext.getPackageName()).grantPermission(mUser,
+ INSTALL_PERMISSION));
+ }
+
+ @Test
+ public void grantPermission_nonDeclaredPermission_throwsException() {
+ assertThrows(NeneException.class, () ->
+ mTestApis.packages().find(sContext.getPackageName()).grantPermission(mUser,
+ UNDECLARED_RUNTIME_PERMISSION));
+ }
+
+ @Test
+ public void grantPermission_permissionIsGranted() {
+ try (UserReference user = mTestApis.users().createUser().create()) {
+ PackageReference packageReference =
+ mTestApis.packages().find(sContext.getPackageName());
+ packageReference.install(user);
+ packageReference.grantPermission(user, DECLARED_RUNTIME_PERMISSION);
+
+ assertThat(packageReference.resolve().grantedPermissions(user))
+ .contains(DECLARED_RUNTIME_PERMISSION);
+ }
+ }
+
+ @Test
+ public void grantPermission_permissionIsUserSpecific_permissionIsGrantedOnlyForThatUser() {
+ // Permissions are auto-granted on the current user so we need to test against new users
+ try (UserReference user = mTestApis.users().createUser().create();
+ UserReference user2 = mTestApis.users().createUser().create()) {
+ PackageReference packageReference =
+ mTestApis.packages().find(sContext.getPackageName());
+ packageReference.install(user);
+ packageReference.install(user2);
+
+ packageReference.grantPermission(user, USER_SPECIFIC_PERMISSION);
+
+ Package resolvedPackage = packageReference.resolve();
+ assertThat(resolvedPackage.grantedPermissions(user2))
+ .doesNotContain(USER_SPECIFIC_PERMISSION);
+ assertThat(resolvedPackage.grantedPermissions(user)).contains(USER_SPECIFIC_PERMISSION);
+ }
+ }
+
+ @Test
+ public void grantPermission_packageDoesNotExist_throwsException() {
+ assertThrows(NeneException.class, () ->
+ mTestApis.packages().find(NON_EXISTING_PACKAGE_NAME).grantPermission(mUser,
+ DECLARED_RUNTIME_PERMISSION));
+ }
+
+ @Test
+ public void grantPermission_permissionDoesNotExist_throwsException() {
+ assertThrows(NeneException.class, () ->
+ mTestApis.packages().find(sContext.getPackageName()).grantPermission(mUser,
+ NON_EXISTING_PERMISSION));
+ }
+
+ @Test
+ public void grantPermission_packageIsNotInstalledForUser_throwsException() {
+ try (UserReference user = mTestApis.users().createUser().create()) {
+ assertThrows(NeneException.class,
+ () -> mTestApis.packages().find(sContext.getPackageName()).grantPermission(user,
+ DECLARED_RUNTIME_PERMISSION));
+ }
+ }
+
+ @Test
+ @Ignore("Cannot be tested because all runtime permissions are granted by default")
+ public void denyPermission_ownPackage_permissionIsNotGranted_doesNotThrowException() {
+ PackageReference packageReference = mTestApis.packages().find(sContext.getPackageName());
+
+ packageReference.denyPermission(mUser, USER_SPECIFIC_PERMISSION);
+ }
+
+ @Test
+ public void denyPermission_ownPackage_permissionIsGranted_throwsException() {
+ PackageReference packageReference = mTestApis.packages().find(sContext.getPackageName());
+ packageReference.grantPermission(mUser, USER_SPECIFIC_PERMISSION);
+
+ assertThrows(NeneException.class, () ->
+ packageReference.denyPermission(mUser, USER_SPECIFIC_PERMISSION));
+ }
+
+ @Test
+ public void denyPermission_permissionIsNotGranted() {
+ try (UserReference user = mTestApis.users().createUser().create()) {
+ PackageReference packageReference =
+ mTestApis.packages().find(sContext.getPackageName());
+ packageReference.install(user);
+ packageReference.grantPermission(user, USER_SPECIFIC_PERMISSION);
+
+ packageReference.denyPermission(user, USER_SPECIFIC_PERMISSION);
+
+ assertThat(packageReference.resolve().grantedPermissions(user))
+ .doesNotContain(USER_SPECIFIC_PERMISSION);
+ }
+ }
+
+ @Test
+ public void denyPermission_packageDoesNotExist_throwsException() {
+ assertThrows(NeneException.class, () ->
+ mTestApis.packages().find(NON_EXISTING_PACKAGE_NAME).denyPermission(mUser,
+ DECLARED_RUNTIME_PERMISSION));
+ }
+
+ @Test
+ public void denyPermission_permissionDoesNotExist_throwsException() {
+ assertThrows(NeneException.class, () ->
+ mTestApis.packages().find(sContext.getPackageName()).denyPermission(mUser,
+ NON_EXISTING_PERMISSION));
+ }
+
+ @Test
+ public void denyPermission_packageIsNotInstalledForUser_throwsException() {
+ try (UserReference user = mTestApis.users().createUser().create()) {
+ assertThrows(NeneException.class,
+ () -> mTestApis.packages().find(sContext.getPackageName()).denyPermission(user,
+ DECLARED_RUNTIME_PERMISSION));
+ }
+ }
+
+ @Test
+ public void denyPermission_installPermission_throwsException() {
+ try (UserReference user = mTestApis.users().createUser().create()) {
+ PackageReference packageReference =
+ mTestApis.packages().find(sContext.getPackageName());
+ packageReference.install(user);
+
+ assertThrows(NeneException.class, () ->
+ packageReference.denyPermission(user, INSTALL_PERMISSION));
+ }
+ }
+
+ @Test
+ public void denyPermission_nonDeclaredPermission_throwsException() {
+ assertThrows(NeneException.class, () ->
+ mTestApis.packages().find(sContext.getPackageName()).denyPermission(mUser,
+ UNDECLARED_RUNTIME_PERMISSION));
+ }
+
+ @Test
+ public void denyPermission_alreadyDenied_doesNothing() {
+ try (UserReference user = mTestApis.users().createUser().create()) {
+ PackageReference packageReference =
+ mTestApis.packages().find(sContext.getPackageName());
+ packageReference.install(user);
+ packageReference.denyPermission(user, USER_SPECIFIC_PERMISSION);
+
+ packageReference.denyPermission(user, USER_SPECIFIC_PERMISSION);
+
+ assertThat(packageReference.resolve().grantedPermissions(user))
+ .doesNotContain(USER_SPECIFIC_PERMISSION);
+ }
+ }
+
+ @Test
+ public void denyPermission_permissionIsUserSpecific_permissionIsDeniedOnlyForThatUser() {
+ // Permissions are auto-granted on the current user so we need to test against new users
+ try (UserReference user = mTestApis.users().createUser().create();
+ UserReference user2 = mTestApis.users().createUser().create()) {
+ PackageReference packageReference =
+ mTestApis.packages().find(sContext.getPackageName());
+ packageReference.install(user);
+ packageReference.install(user2);
+ packageReference.grantPermission(user, USER_SPECIFIC_PERMISSION);
+ packageReference.grantPermission(user2, USER_SPECIFIC_PERMISSION);
+
+ packageReference.denyPermission(user2, USER_SPECIFIC_PERMISSION);
+
+ Package resolvedPackage = packageReference.resolve();
+ assertThat(resolvedPackage.grantedPermissions(user2))
+ .doesNotContain(USER_SPECIFIC_PERMISSION);
+ assertThat(resolvedPackage.grantedPermissions(user)).contains(USER_SPECIFIC_PERMISSION);
+ }
+ }
}
diff --git a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/packages/PackageTest.java b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/packages/PackageTest.java
index f470c8b..05e5e04 100644
--- a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/packages/PackageTest.java
+++ b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/packages/PackageTest.java
@@ -18,6 +18,10 @@
import static com.google.common.truth.Truth.assertThat;
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
import com.android.bedstead.nene.TestApis;
import com.android.bedstead.nene.users.UserReference;
@@ -33,7 +37,13 @@
// Controlled by AndroidTest.xml
private static final String TEST_APP_PACKAGE_NAME =
"com.android.bedstead.nene.testapps.TestApp1";
- private static final File TEST_APP_APK_FILE = new File("/data/local/tmp/NeneTestApp1.apk");
+ private static final File TEST_APP_APK_FILE =
+ new File("/data/local/tmp/NeneTestApp1.apk");
+
+ private static final String ACCESS_NETWORK_STATE_PERMISSION =
+ "android.permission.ACCESS_NETWORK_STATE";
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
private final TestApis mTestApis = new TestApis();
private final UserReference mUser = mTestApis.users().instrumented();
@@ -63,4 +73,14 @@
user.remove();
}
}
+
+ @Test
+ public void grantedPermission_includesKnownInstallPermission() {
+ // TODO(scottjonathan): This relies on the fact that the instrumented app declares
+ // ACCESS_NETWORK_STATE - this should be replaced with TestApp with a useful query
+ PackageReference packageReference = mTestApis.packages().find(sContext.getPackageName());
+
+ assertThat(packageReference.resolve().grantedPermissions(mUser))
+ .contains(ACCESS_NETWORK_STATE_PERMISSION);
+ }
}
diff --git a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/users/UserReferenceTest.java b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/users/UserReferenceTest.java
index 3ac74b0..ce802cc 100644
--- a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/users/UserReferenceTest.java
+++ b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/users/UserReferenceTest.java
@@ -176,12 +176,11 @@
UserReference user = mTestApis.users().createUser().createAndStart();
try {
+ mTestApis.packages().find(sContext.getPackageName()).install(user);
+ user.switchTo();
+
SystemUtil.runWithShellPermissionIdentity(() -> {
// for INTERACT_ACROSS_USERS
-
- mTestApis.packages().find(sContext.getPackageName()).install(user);
- user.switchTo();
-
Intent intent = new Intent();
intent.setPackage(sContext.getPackageName());
intent.setClassName(sContext.getPackageName(), TEST_ACTIVITY_NAME);
diff --git a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/users/UserTest.java b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/users/UserTest.java
index 0d8a1b3..958e6fb 100644
--- a/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/users/UserTest.java
+++ b/common/device-side/bedstead/nene/src/test/java/com/android/bedstead/nene/users/UserTest.java
@@ -185,6 +185,17 @@
assertThat(user.parent()).isEqualTo(parentUser);
}
+ @Test
+ public void autoclose_removesUser() {
+ int numUsers = mTestApis.users().all().size();
+
+ try (UserReference user = mTestApis.users().createUser().create()) {
+ // We intentionally don't do anything here, just rely on the auto-close behaviour
+ }
+
+ assertThat(mTestApis.users().all()).hasSize(numUsers);
+ }
+
private User.MutableUser createValidMutableUser() {
User.MutableUser mutableUser = new User.MutableUser();
mutableUser.mId = 1;
diff --git a/common/device-side/bedstead/remotedpc/Android.bp b/common/device-side/bedstead/remotedpc/Android.bp
new file mode 100644
index 0000000..e6996f2
--- /dev/null
+++ b/common/device-side/bedstead/remotedpc/Android.bp
@@ -0,0 +1,58 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_library {
+ name: "RemoteDPC",
+ sdk_version: "test_current",
+ srcs: [
+ "src/library/main/java/**/*.java"
+ ],
+ static_libs: [
+ "Nene",
+ ],
+ manifest: "src/library/main/AndroidManifest.xml",
+ min_sdk_version: "27",
+ resource_zips: [":RemoteDPC_Apps"],
+}
+
+android_test_helper_app {
+ name: "RemoteDPC_DPC",
+ static_libs: [
+ "DeviceAdminApp"
+ ],
+ manifest: "src/dpc/main/AndroidManifest.xml",
+ min_sdk_version: "27"
+}
+
+java_genrule {
+ name: "RemoteDPC_Apps",
+ srcs: [":RemoteDPC_DPC"],
+ out: ["RemoteDPC_Apps.res.zip"],
+ tools: ["soong_zip"],
+ cmd: "mkdir -p $(genDir)/res/raw"
+ + " && cp $(location :RemoteDPC_DPC) $(genDir)/res/raw"
+ + " && $(location soong_zip) -o $(out) -C $(genDir)/res -D $(genDir)/res/raw"
+}
+
+android_test {
+ name: "RemoteDPCTest",
+ srcs: [
+ "src/library/test/java/**/*.java"
+ ],
+ test_suites: [
+ "general-tests",
+ ],
+ static_libs: [
+ "RemoteDPC",
+ "Nene",
+ "TestApp",
+ "EventLib",
+ "androidx.test.ext.junit",
+ "compatibility-device-util-axt",
+ "truth-prebuilt",
+ "testng" // for assertThrows
+ ],
+ manifest: "src/library/test/AndroidManifest.xml",
+ min_sdk_version: "27"
+}
\ No newline at end of file
diff --git a/common/device-side/bedstead/remotedpc/AndroidTest.xml b/common/device-side/bedstead/remotedpc/AndroidTest.xml
new file mode 100644
index 0000000..cdc3b7d
--- /dev/null
+++ b/common/device-side/bedstead/remotedpc/AndroidTest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+<configuration description="Config for RemoteDPC test cases">
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="RemoteDPCTest.apk" />
+ </target_preparer>
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.bedstead.remotedpc.test" />
+ </test>
+</configuration>
\ No newline at end of file
diff --git a/common/device-side/bedstead/remotedpc/TEST_MAPPING b/common/device-side/bedstead/remotedpc/TEST_MAPPING
new file mode 100644
index 0000000..34b7cf24
--- /dev/null
+++ b/common/device-side/bedstead/remotedpc/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "postsubmit": [
+ {
+ "name": "RemoteDPCTest"
+ }
+ ]
+}
diff --git a/common/device-side/bedstead/remotedpc/src/dpc/main/AndroidManifest.xml b/common/device-side/bedstead/remotedpc/src/dpc/main/AndroidManifest.xml
new file mode 100644
index 0000000..eba2241
--- /dev/null
+++ b/common/device-side/bedstead/remotedpc/src/dpc/main/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.bedstead.remotedpc.dpc">
+ <uses-sdk android:minSdkVersion="27" />
+ <application android:testOnly="true">
+ </application>
+</manifest>
diff --git a/common/device-side/bedstead/remotedpc/src/library/main/AndroidManifest.xml b/common/device-side/bedstead/remotedpc/src/library/main/AndroidManifest.xml
new file mode 100644
index 0000000..571f8cf
--- /dev/null
+++ b/common/device-side/bedstead/remotedpc/src/library/main/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.bedstead.remotedpc">
+ <uses-sdk android:minSdkVersion="27" />
+ <application>
+ </application>
+</manifest>
diff --git a/common/device-side/bedstead/remotedpc/src/library/main/java/com/android/bedstead/remotedpc/RemoteDpc.java b/common/device-side/bedstead/remotedpc/src/library/main/java/com/android/bedstead/remotedpc/RemoteDpc.java
new file mode 100644
index 0000000..c9e2903
--- /dev/null
+++ b/common/device-side/bedstead/remotedpc/src/library/main/java/com/android/bedstead/remotedpc/RemoteDpc.java
@@ -0,0 +1,262 @@
+/*
+ * 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.bedstead.remotedpc;
+
+import static com.android.compatibility.common.util.FileUtils.readInputStreamFully;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.UserHandle;
+
+import androidx.annotation.Nullable;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.devicepolicy.DeviceOwner;
+import com.android.bedstead.nene.devicepolicy.DevicePolicyController;
+import com.android.bedstead.nene.devicepolicy.ProfileOwner;
+import com.android.bedstead.nene.exceptions.NeneException;
+import com.android.bedstead.nene.users.UserReference;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/** Entry point to RemoteDPC. */
+public final class RemoteDpc {
+
+ private static final TestApis sTestApis = new TestApis();
+ private static final Context sContext =
+ InstrumentationRegistry.getInstrumentation().getContext();
+ private static final ComponentName DPC_COMPONENT = new ComponentName(
+ "com.android.bedstead.remotedpc.dpc",
+ "com.android.eventlib.premade.EventLibDeviceAdminReceiver"
+ );
+
+ /**
+ * Get the {@link RemoteDpc} instance for the Device Owner.
+ *
+ * <p>This will return {@code null} if there is no Device Owner or it is not a RemoteDPC app.
+ */
+ @Nullable
+ public static RemoteDpc deviceOwner() {
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ if (deviceOwner == null || !deviceOwner.componentName().equals(DPC_COMPONENT)) {
+ return null;
+ }
+
+ return new RemoteDpc(deviceOwner);
+ }
+
+ /**
+ * Get the {@link RemoteDpc} instance for the Profile Owner of the current user.
+ *
+ * <p>This will return null if there is no Profile Owner or it is not a RemoteDPC app.
+ */
+ @Nullable
+ public static RemoteDpc profileOwner() {
+ return profileOwner(sTestApis.users().instrumented());
+ }
+
+ /**
+ * Get the {@link RemoteDpc} instance for the Profile Owner of the given {@code profile}.
+ *
+ * <p>This will return null if there is no Profile Owner or it is not a RemoteDPC app.
+ */
+ @Nullable
+ public static RemoteDpc profileOwner(UserHandle profile) {
+ if (profile == null) {
+ throw new NullPointerException();
+ }
+
+ return profileOwner(sTestApis.users().find(profile));
+ }
+
+ /**
+ * Get the {@link RemoteDpc} instance for the Profile Owner of the given {@code profile}.
+ *
+ * <p>This will return null if there is no Profile Owner or it is not a RemoteDPC app.
+ */
+ @Nullable
+ public static RemoteDpc profileOwner(UserReference profile) {
+ if (profile == null) {
+ throw new NullPointerException();
+ }
+
+ ProfileOwner profileOwner = sTestApis.devicePolicy().getProfileOwner(profile);
+ if (profileOwner == null || !profileOwner.componentName().equals(DPC_COMPONENT)) {
+ return null;
+ }
+
+ return new RemoteDpc(profileOwner);
+ }
+
+ /**
+ * Get the most specific {@link RemoteDpc} instance for the current user.
+ *
+ * <p>If the user has a RemoteDPC Profile Owner, this will refer to that. If it does not but
+ * has a RemoteDPC Device Owner it will refer to that. Otherwise it will return null.
+ */
+ @Nullable
+ public static RemoteDpc any() {
+ return any(sTestApis.users().instrumented());
+ }
+
+ /**
+ * Get the most specific {@link RemoteDpc} instance for the current user.
+ *
+ * <p>If the user has a RemoteDPC Profile Owner, this will refer to that. If it does not but
+ * has a RemoteDPC Device Owner it will refer to that. Otherwise it will return null.
+ */
+ @Nullable
+ public static RemoteDpc any(UserHandle user) {
+ if (user == null) {
+ throw new NullPointerException();
+ }
+
+ return any(sTestApis.users().find(user));
+ }
+
+ /**
+ * Get the most specific {@link RemoteDpc} instance for the current user.
+ *
+ * <p>If the user has a RemoteDPC Profile Owner, this will refer to that. If it does not but
+ * has a RemoteDPC Device Owner it will refer to that. Otherwise it will return null.
+ */
+ @Nullable
+ public static RemoteDpc any(UserReference user) {
+ RemoteDpc remoteDPC = profileOwner(user);
+ if (remoteDPC != null) {
+ return remoteDPC;
+ }
+ return deviceOwner();
+ }
+
+ /**
+ * Set RemoteDPC as the Device Owner.
+ */
+ public static RemoteDpc setAsDeviceOwner(UserHandle user) {
+ if (user == null) {
+ throw new NullPointerException();
+ }
+ return setAsDeviceOwner(sTestApis.users().find(user));
+ }
+
+ /**
+ * Set RemoteDPC as the Device Owner.
+ */
+ public static RemoteDpc setAsDeviceOwner(UserReference user) {
+ if (user == null) {
+ throw new NullPointerException();
+ }
+
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ if (deviceOwner != null) {
+ if (deviceOwner.componentName().equals(DPC_COMPONENT)) {
+ return new RemoteDpc(deviceOwner); // Already set
+ }
+ deviceOwner.remove();
+ }
+
+ ensureInstalled(user);
+ return new RemoteDpc(sTestApis.devicePolicy().setDeviceOwner(user, DPC_COMPONENT));
+ }
+
+ /**
+ * Set RemoteDPC as the Profile Owner.
+ */
+ public static RemoteDpc setAsProfileOwner(UserHandle user) {
+ if (user == null) {
+ throw new NullPointerException();
+ }
+ return setAsProfileOwner(sTestApis.users().find(user));
+ }
+
+ /**
+ * Set RemoteDPC as the Profile Owner.
+ */
+ public static RemoteDpc setAsProfileOwner(UserReference user) {
+ if (user == null) {
+ throw new NullPointerException();
+ }
+
+ ProfileOwner profileOwner = sTestApis.devicePolicy().getProfileOwner(user);
+ if (profileOwner != null) {
+ if (profileOwner.componentName().equals(DPC_COMPONENT)) {
+ return new RemoteDpc(profileOwner); // Already set
+ }
+ profileOwner.remove();
+ }
+
+ ensureInstalled(user);
+ return new RemoteDpc(sTestApis.devicePolicy().setProfileOwner(user, DPC_COMPONENT));
+ }
+
+ private static void ensureInstalled(UserReference user) {
+ sTestApis.packages().install(user, apkBytes());
+ }
+
+ private static byte[] apkBytes() {
+ int apkId = sContext.getResources().getIdentifier(
+ "raw/RemoteDPC_DPC", /* defType= */ null, sContext.getPackageName());
+ try (InputStream inputStream =
+ sContext.getResources().openRawResource(apkId)) {
+ return readInputStreamFully(inputStream);
+ } catch (IOException e) {
+ throw new NeneException("Error when reading RemoteDPC bytes", e);
+ }
+ }
+
+ private final DevicePolicyController mDevicePolicyController;
+
+ private RemoteDpc(DevicePolicyController devicePolicyController) {
+ if (devicePolicyController == null) {
+ throw new NullPointerException();
+ }
+ mDevicePolicyController = devicePolicyController;
+ }
+
+ /**
+ * Get the {@link DevicePolicyController} for this instance of RemoteDPC.
+ */
+ public DevicePolicyController devicePolicyController() {
+ return mDevicePolicyController;
+ }
+
+ /**
+ * Remove RemoteDPC as Device Owner or Profile Owner and uninstall the APK from the user.
+ */
+ public void remove() {
+ mDevicePolicyController.remove();
+ sTestApis.packages().find(DPC_COMPONENT.getPackageName())
+ .uninstall(mDevicePolicyController.user());
+ }
+
+ @Override
+ public int hashCode() {
+ return mDevicePolicyController.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof RemoteDpc)) {
+ return false;
+ }
+
+ RemoteDpc other = (RemoteDpc) obj;
+ return other.mDevicePolicyController.equals(mDevicePolicyController);
+ }
+}
diff --git a/common/device-side/bedstead/remotedpc/src/library/test/AndroidManifest.xml b/common/device-side/bedstead/remotedpc/src/library/test/AndroidManifest.xml
new file mode 100644
index 0000000..5990e54
--- /dev/null
+++ b/common/device-side/bedstead/remotedpc/src/library/test/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.bedstead.remotedpc.test">
+ <application android:label="RemoteDPC Tests">
+ <uses-library android:name="android.test.runner" />
+ </application>
+ <uses-sdk android:minSdkVersion="27" android:targetSdkVersion="27"/>
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.bedstead.remotedpc.test"
+ android:label="RemoteDPC Tests" />
+</manifest>
diff --git a/common/device-side/bedstead/remotedpc/src/library/test/java/com/android/bedstead/remotedpc/RemoteDpcTest.java b/common/device-side/bedstead/remotedpc/src/library/test/java/com/android/bedstead/remotedpc/RemoteDpcTest.java
new file mode 100644
index 0000000..8e57e1d
--- /dev/null
+++ b/common/device-side/bedstead/remotedpc/src/library/test/java/com/android/bedstead/remotedpc/RemoteDpcTest.java
@@ -0,0 +1,682 @@
+/*
+ * 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.bedstead.remotedpc;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.content.ComponentName;
+import android.os.UserHandle;
+
+import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.devicepolicy.DeviceOwner;
+import com.android.bedstead.nene.devicepolicy.ProfileOwner;
+import com.android.bedstead.nene.exceptions.NeneException;
+import com.android.bedstead.nene.users.UserReference;
+import com.android.bedstead.nene.users.UserType;
+import com.android.bedstead.testapp.TestApp;
+import com.android.bedstead.testapp.TestAppProvider;
+import com.android.eventlib.premade.EventLibDeviceAdminReceiver;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class RemoteDpcTest {
+ // TODO(scottjonathan): Add annotations to ensure that there is no DO/PO on appropriate methods
+ // TODO(180478924): We shouldn't need to hardcode this
+ private static final String DEVICE_ADMIN_TESTAPP_PACKAGE_NAME = "android.DeviceAdminTestApp";
+ private static final ComponentName NON_REMOTE_DPC_COMPONENT =
+ new ComponentName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME,
+ EventLibDeviceAdminReceiver.class.getName());
+
+ private static final TestApis sTestApis = new TestApis();
+ private static TestApp sNonRemoteDpcTestApp;
+ private static final UserReference sUser = sTestApis.users().instrumented();
+ private static final UserReference NON_EXISTING_USER_REFERENCE =
+ sTestApis.users().find(99999);
+ private static final UserHandle NON_EXISTING_USER_HANDLE =
+ NON_EXISTING_USER_REFERENCE.userHandle();
+
+ @BeforeClass
+ public static void setupClass() {
+ sNonRemoteDpcTestApp = new TestAppProvider().query()
+ .withPackageName(DEVICE_ADMIN_TESTAPP_PACKAGE_NAME)
+ .get();
+
+ sNonRemoteDpcTestApp.install(sUser);
+ }
+
+ @AfterClass
+ public static void teardownClass() {
+ sNonRemoteDpcTestApp.reference().uninstall(sUser);
+ }
+
+ @Test
+ public void deviceOwner_noDeviceOwner_returnsNull() {
+ assertThat(RemoteDpc.deviceOwner()).isNull();
+ }
+
+ @Test
+ public void deviceOwner_nonRemoteDpcDeviceOwner_returnsNull() {
+ DeviceOwner deviceOwner =
+ sTestApis.devicePolicy().setDeviceOwner(sUser, NON_REMOTE_DPC_COMPONENT);
+ try {
+ assertThat(RemoteDpc.deviceOwner()).isNull();
+ } finally {
+ deviceOwner.remove();
+ }
+ }
+
+ @Test
+ public void deviceOwner_remoteDpcDeviceOwner_returnsInstance() {
+ RemoteDpc remoteDPC = RemoteDpc.setAsDeviceOwner(sUser);
+
+ try {
+ assertThat(RemoteDpc.deviceOwner()).isNotNull();
+ } finally {
+ remoteDPC.devicePolicyController().remove();
+ }
+ }
+
+ @Test
+ public void profileOwner_noProfileOwner_returnsNull() {
+ assertThat(RemoteDpc.profileOwner()).isNull();
+ }
+
+ @Test
+ public void profileOwner_nonRemoteDpcProfileOwner_returnsNull() {
+ ProfileOwner profileOwner =
+ sTestApis.devicePolicy().setProfileOwner(sUser, NON_REMOTE_DPC_COMPONENT);
+ try {
+ assertThat(RemoteDpc.profileOwner()).isNull();
+ } finally {
+ profileOwner.remove();
+ }
+ }
+
+ @Test
+ public void profileOwner_remoteDpcProfileOwner_returnsInstance() {
+ RemoteDpc remoteDPC = RemoteDpc.setAsProfileOwner(sUser);
+ try {
+ assertThat(RemoteDpc.profileOwner()).isNotNull();
+ } finally {
+ remoteDPC.devicePolicyController().remove();
+ }
+ }
+
+ @Test
+ public void profileOwner_userHandle_null_throwsException() {
+ assertThrows(NullPointerException.class, () -> RemoteDpc.profileOwner((UserHandle) null));
+ }
+
+ @Test
+ public void profileOwner_userHandle_noProfileOwner_returnsNull() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ assertThat(RemoteDpc.profileOwner(profile.userHandle())).isNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void profileOwner_userHandle_nonRemoteDpcProfileOwner_returnsNull() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sNonRemoteDpcTestApp.install(profile);
+ try {
+ sTestApis.devicePolicy().setProfileOwner(profile, NON_REMOTE_DPC_COMPONENT);
+
+ assertThat(RemoteDpc.profileOwner(profile.userHandle())).isNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void profileOwner_userHandle_remoteDpcProfileOwner_returnsInstance() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ RemoteDpc.setAsProfileOwner(profile);
+ try {
+ assertThat(RemoteDpc.profileOwner(profile.userHandle())).isNotNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void profileOwner_userReference_null_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> RemoteDpc.profileOwner((UserReference) null));
+ }
+
+ @Test
+ public void profileOwner_userReference_noProfileOwner_returnsNull() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ assertThat(RemoteDpc.profileOwner(profile)).isNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void profileOwner_userReference_nonRemoteDpcProfileOwner_returnsNull() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sNonRemoteDpcTestApp.install(profile);
+ try {
+ sTestApis.devicePolicy().setProfileOwner(profile, NON_REMOTE_DPC_COMPONENT);
+
+ assertThat(RemoteDpc.profileOwner(profile)).isNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void profileOwner_userReference_remoteDpcProfileOwner_returnsInstance() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ RemoteDpc.setAsProfileOwner(profile);
+ try {
+ assertThat(RemoteDpc.profileOwner(profile)).isNotNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void any_noDeviceOwner_noProfileOwner_returnsNull() {
+ assertThat(RemoteDpc.any()).isNull();
+ }
+
+ @Test
+ public void any_noDeviceOwner_nonRemoteDpcProfileOwner_returnsNull() {
+ ProfileOwner profileOwner = sTestApis.devicePolicy().setProfileOwner(sUser,
+ NON_REMOTE_DPC_COMPONENT);
+
+ try {
+ assertThat(RemoteDpc.any()).isNull();
+ } finally {
+ profileOwner.remove();
+ }
+ }
+
+ @Test
+ public void any_nonRemoteDpcDeviceOwner_noProfileOwner_returnsNull() {
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().setDeviceOwner(sUser,
+ NON_REMOTE_DPC_COMPONENT);
+
+ try {
+ assertThat(RemoteDpc.any()).isNull();
+ } finally {
+ deviceOwner.remove();
+ }
+ }
+
+ @Test
+ public void any_remoteDpcDeviceOwner_returnsDeviceOwner() {
+ RemoteDpc remoteDPC = RemoteDpc.setAsDeviceOwner(sUser);
+
+ try {
+ assertThat(RemoteDpc.any()).isNotNull();
+ } finally {
+ remoteDPC.devicePolicyController().remove();
+ }
+ }
+
+ @Test
+ public void any_remoteDpcProfileOwner_returnsProfileOwner() {
+ RemoteDpc remoteDPC = RemoteDpc.setAsProfileOwner(sUser);
+
+ try {
+ assertThat(RemoteDpc.any()).isNotNull();
+ } finally {
+ remoteDPC.devicePolicyController().remove();
+ }
+ }
+
+ @Test
+ public void any_userHandle_null_throwsException() {
+ assertThrows(NullPointerException.class, () -> RemoteDpc.any((UserHandle) null));
+ }
+
+ @Test
+ public void any_userHandle_noDeviceOwner_noProfileOwner_returnsNull() {
+ assertThat(RemoteDpc.any(sUser.userHandle())).isNull();
+ }
+
+ @Test
+ public void any_userHandle_noDeviceOwner_nonRemoteDpcProfileOwner_returnsNull() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sNonRemoteDpcTestApp.install(profile);
+ try {
+ sTestApis.devicePolicy().setProfileOwner(profile, NON_REMOTE_DPC_COMPONENT);
+
+ assertThat(RemoteDpc.any(profile.userHandle())).isNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void any_userHandle_nonRemoteDpcDeviceOwner_noProfileOwner_returnsNull() {
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().setDeviceOwner(sUser,
+ NON_REMOTE_DPC_COMPONENT);
+
+ try {
+ assertThat(RemoteDpc.any(sUser.userHandle())).isNull();
+ } finally {
+ deviceOwner.remove();
+ }
+ }
+
+ @Test
+ public void any_userHandle_remoteDpcDeviceOwner_returnsDeviceOwner() {
+ RemoteDpc deviceOwner = RemoteDpc.setAsDeviceOwner(sUser);
+
+ try {
+ assertThat(RemoteDpc.any(sUser.userHandle())).isEqualTo(deviceOwner);
+ } finally {
+ deviceOwner.devicePolicyController().remove();
+ }
+ }
+
+ @Test
+ public void any_userHandle_remoteDpcProfileOwner_returnsProfileOwner() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ RemoteDpc profileOwner = RemoteDpc.setAsProfileOwner(profile);
+
+ assertThat(RemoteDpc.any(profile.userHandle())).isEqualTo(profileOwner);
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void any_userReference_null_throwsException() {
+ assertThrows(NullPointerException.class, () -> RemoteDpc.any((UserReference) null));
+ }
+
+ @Test
+ public void any_userReference_noDeviceOwner_noProfileOwner_returnsNull() {
+ assertThat(RemoteDpc.any(sUser)).isNull();
+ }
+
+ @Test
+ public void any_userReference_noDeviceOwner_nonRemoteDpcProfileOwner_returnsNull() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sNonRemoteDpcTestApp.install(profile);
+ try {
+ sTestApis.devicePolicy().setProfileOwner(profile, NON_REMOTE_DPC_COMPONENT);
+
+ assertThat(RemoteDpc.any(profile)).isNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void any_userReference_nonRemoteDpcDeviceOwner_noProfileOwner_returnsNull() {
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().setDeviceOwner(sUser,
+ NON_REMOTE_DPC_COMPONENT);
+
+ try {
+ assertThat(RemoteDpc.any(sUser)).isNull();
+ } finally {
+ deviceOwner.remove();
+ }
+ }
+
+ @Test
+ public void any_userReference_remoteDpcDeviceOwner_returnsDeviceOwner() {
+ RemoteDpc deviceOwner = RemoteDpc.setAsDeviceOwner(sUser);
+
+ try {
+ assertThat(RemoteDpc.any(sUser)).isEqualTo(deviceOwner);
+ } finally {
+ deviceOwner.devicePolicyController().remove();
+ }
+ }
+
+ @Test
+ public void any_userReference_remoteDpcProfileOwner_returnsProfileOwner() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ RemoteDpc profileOwner = RemoteDpc.setAsProfileOwner(profile);
+
+ assertThat(RemoteDpc.any(profile)).isEqualTo(profileOwner);
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setAsDeviceOwner_userHandle_null_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> RemoteDpc.setAsDeviceOwner((UserHandle) null));
+ }
+
+ @Test
+ public void setAsDeviceOwner_userHandle_nonExistingUser_throwsException() {
+ assertThrows(NeneException.class,
+ () -> RemoteDpc.setAsDeviceOwner(NON_EXISTING_USER_HANDLE));
+ }
+
+ @Test
+ public void setAsDeviceOwner_userHandle_alreadySet_doesNothing() {
+ RemoteDpc.setAsDeviceOwner(sUser.userHandle());
+
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ try {
+ RemoteDpc.setAsDeviceOwner(sUser.userHandle());
+
+ deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ assertThat(deviceOwner).isNotNull();
+ } finally {
+ if (deviceOwner != null) {
+ deviceOwner.remove();
+ }
+ }
+ }
+
+ @Test
+ public void setAsDeviceOwner_userHandle_alreadyHasDeviceOwner_replacesDeviceOwner() {
+ sTestApis.devicePolicy().setDeviceOwner(sUser, NON_REMOTE_DPC_COMPONENT);
+
+ try {
+ RemoteDpc remoteDPC = RemoteDpc.setAsDeviceOwner(sUser.userHandle());
+
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ assertThat(deviceOwner).isEqualTo(remoteDPC.devicePolicyController());
+ } finally {
+ sTestApis.devicePolicy().getDeviceOwner().remove();
+ }
+ }
+
+ @Test
+ public void setAsDeviceOwner_userHandle_doesNotHaveDeviceOwner_setsDeviceOwner() {
+ RemoteDpc.setAsDeviceOwner(sUser.userHandle());
+
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ try {
+ assertThat(deviceOwner).isNotNull();
+ } finally {
+ if (deviceOwner != null) {
+ deviceOwner.remove();
+ }
+ }
+ }
+
+ @Test
+ public void setAsDeviceOwner_userReference_null_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> RemoteDpc.setAsDeviceOwner((UserReference) null));
+ }
+
+ @Test
+ public void setAsDeviceOwner_userReference_nonExistingUser_throwsException() {
+ assertThrows(NeneException.class,
+ () -> RemoteDpc.setAsDeviceOwner(NON_EXISTING_USER_REFERENCE));
+ }
+
+ @Test
+ public void setAsDeviceOwner_userReference_alreadySet_doesNothing() {
+ RemoteDpc.setAsDeviceOwner(sUser);
+
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ try {
+ RemoteDpc.setAsDeviceOwner(sUser);
+
+ deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ assertThat(deviceOwner).isNotNull();
+ } finally {
+ if (deviceOwner != null) {
+ deviceOwner.remove();
+ }
+ }
+ }
+
+ @Test
+ public void setAsDeviceOwner_userReference_alreadyHasDeviceOwner_replacesDeviceOwner() {
+ sTestApis.devicePolicy().setDeviceOwner(sUser, NON_REMOTE_DPC_COMPONENT);
+
+ try {
+ RemoteDpc remoteDPC = RemoteDpc.setAsDeviceOwner(sUser);
+
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ assertThat(deviceOwner).isEqualTo(remoteDPC.devicePolicyController());
+ } finally {
+ sTestApis.devicePolicy().getDeviceOwner().remove();
+ }
+ }
+
+ @Test
+ public void setAsDeviceOwner_userReference_doesNotHaveDeviceOwner_setsDeviceOwner() {
+ RemoteDpc.setAsDeviceOwner(sUser);
+
+ DeviceOwner deviceOwner = sTestApis.devicePolicy().getDeviceOwner();
+ try {
+ assertThat(deviceOwner).isNotNull();
+ } finally {
+ if (deviceOwner != null) {
+ deviceOwner.remove();
+ }
+ }
+ }
+
+ @Test
+ public void setAsProfileOwner_userHandle_null_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> RemoteDpc.setAsProfileOwner((UserHandle) null));
+ }
+
+ @Test
+ public void setAsProfileOwner_userHandle_nonExistingUser_throwsException() {
+ assertThrows(NeneException.class,
+ () -> RemoteDpc.setAsProfileOwner(NON_EXISTING_USER_HANDLE));
+ }
+
+ @Test
+ public void setAsProfileOwner_userHandle_alreadySet_doesNothing() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ RemoteDpc.setAsProfileOwner(profile.userHandle());
+
+ RemoteDpc.setAsProfileOwner(profile.userHandle());
+
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile)).isNotNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setAsProfileOwner_userHandle_alreadyHasProfileOwner_replacesProfileOwner() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sNonRemoteDpcTestApp.install(profile);
+ try {
+ sTestApis.devicePolicy().setProfileOwner(profile, NON_REMOTE_DPC_COMPONENT);
+
+ RemoteDpc remoteDPC = RemoteDpc.setAsProfileOwner(profile.userHandle());
+
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile))
+ .isEqualTo(remoteDPC.devicePolicyController());
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setAsProfileOwner_userHandle_doesNotHaveProfileOwner_setsProfileOwner() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ RemoteDpc.setAsProfileOwner(profile.userHandle());
+
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile)).isNotNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setAsProfileOwner_userReference_null_throwsException() {
+ assertThrows(NullPointerException.class,
+ () -> RemoteDpc.setAsProfileOwner((UserReference) null));
+ }
+
+ @Test
+ public void setAsProfileOwner_userReference_nonExistingUser_throwsException() {
+ assertThrows(NeneException.class,
+ () -> RemoteDpc.setAsProfileOwner(NON_EXISTING_USER_REFERENCE));
+ }
+
+ @Test
+ public void setAsProfileOwner_userReference_alreadySet_doesNothing() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ RemoteDpc.setAsProfileOwner(profile);
+
+ RemoteDpc.setAsProfileOwner(profile);
+
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile)).isNotNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setAsProfileOwner_userReference_alreadyHasProfileOwner_replacesProfileOwner() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ sNonRemoteDpcTestApp.install(profile);
+ try {
+ sTestApis.devicePolicy().setProfileOwner(profile, NON_REMOTE_DPC_COMPONENT);
+
+ RemoteDpc remoteDPC = RemoteDpc.setAsProfileOwner(profile);
+
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile))
+ .isEqualTo(remoteDPC.devicePolicyController());
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void setAsProfileOwner_userReference_doesNotHaveProfileOwner_setsProfileOwner() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ RemoteDpc.setAsProfileOwner(profile);
+
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile)).isNotNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ @Test
+ public void devicePolicyController_returnsDevicePolicyController() {
+ RemoteDpc remoteDPC = RemoteDpc.setAsDeviceOwner(sUser);
+
+ try {
+ assertThat(remoteDPC.devicePolicyController())
+ .isEqualTo(sTestApis.devicePolicy().getDeviceOwner());
+ } finally {
+ remoteDPC.remove();
+ }
+ }
+
+ @Test
+ public void remove_deviceOwner_removes() {
+ RemoteDpc remoteDPC = RemoteDpc.setAsDeviceOwner(sUser);
+
+ remoteDPC.remove();
+
+ assertThat(sTestApis.devicePolicy().getDeviceOwner()).isNull();
+ }
+
+ @Test
+ public void remove_profileOwner_removes() {
+ UserReference profile = sTestApis.users().createUser()
+ .parent(sUser)
+ .type(sTestApis.users().supportedType(UserType.MANAGED_PROFILE_TYPE_NAME))
+ .createAndStart();
+ try {
+ RemoteDpc remoteDPC = RemoteDpc.setAsProfileOwner(profile);
+
+ remoteDPC.remove();
+
+ assertThat(sTestApis.devicePolicy().getProfileOwner(profile)).isNull();
+ } finally {
+ profile.remove();
+ }
+ }
+
+ // TODO(scottjonathan): Do we need to support the case where there is both a DO and a PO on
+ // older versions of Android?
+}
diff --git a/common/device-side/bedstead/testapp/manifests/DeviceAdminManifest.xml b/common/device-side/bedstead/testapp/manifests/DeviceAdminManifest.xml
index 6efe8ed..2e21786 100644
--- a/common/device-side/bedstead/testapp/manifests/DeviceAdminManifest.xml
+++ b/common/device-side/bedstead/testapp/manifests/DeviceAdminManifest.xml
@@ -17,9 +17,10 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.deviceadmin">
+ package="android.DeviceAdminTestApp">
<application
- android:appComponentFactory="com.android.eventlib.premade.EventLibAppComponentFactory">
+ android:appComponentFactory="com.android.eventlib.premade.EventLibAppComponentFactory"
+ android:testOnly="true">
</application>
<uses-sdk android:minSdkVersion="27" android:targetSdkVersion="27"/>
</manifest>
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/BlockingBroadcastReceiver.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/BlockingBroadcastReceiver.java
index 2d0ac59..8e54066 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/BlockingBroadcastReceiver.java
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/BlockingBroadcastReceiver.java
@@ -90,6 +90,12 @@
}
}
+ public void registerForAllUsers() {
+ for (String expectedAction : mExpectedActions) {
+ mContext.registerReceiverForAllUsers(this, new IntentFilter(expectedAction), /* broadcastPermission= */ null, /* scheduler= */ null);
+ }
+ }
+
/**
* Wait until the broadcast.
*
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/CtsTouchUtils.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/CtsTouchUtils.java
index 38c0c2a..5a552ed 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/CtsTouchUtils.java
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/CtsTouchUtils.java
@@ -26,6 +26,7 @@
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
import androidx.annotation.Nullable;
import androidx.test.rule.ActivityTestRule;
@@ -524,7 +525,7 @@
* @param viewGroup View group
*/
public static void emulateScrollToBottom(Instrumentation instrumentation,
- ActivityTestRule<?> activityTestRule, ViewGroup viewGroup) {
+ ActivityTestRule<?> activityTestRule, ViewGroup viewGroup) throws Throwable {
final int[] viewGroupOnScreenXY = new int[2];
viewGroup.getLocationOnScreen(viewGroupOnScreenXY);
@@ -540,6 +541,28 @@
emulatedX, emulatedStartY, 0, -swipeAmount, 300, 10);
next = new ViewStateSnapshot(viewGroup);
} while (!prev.equals(next));
+
+ // wait until the overscroll animation completes
+ final boolean[] redrawn = new boolean[1];
+ final boolean[] animationFinished = new boolean[1];
+ final ViewTreeObserver.OnDrawListener onDrawListener = () -> {
+ redrawn[0] = true;
+ };
+
+ activityTestRule.runOnUiThread(() -> {
+ viewGroup.getViewTreeObserver().addOnDrawListener(onDrawListener);
+ });
+ while (!animationFinished[0]) {
+ activityTestRule.runOnUiThread(() -> {
+ if (!redrawn[0]) {
+ animationFinished[0] = true;
+ }
+ redrawn[0] = false;
+ });
+ }
+ activityTestRule.runOnUiThread(() -> {
+ viewGroup.getViewTreeObserver().removeOnDrawListener(onDrawListener);
+ });
}
/**
diff --git a/hostsidetests/appcompat/host/lib/src/android/compat/cts/Change.java b/hostsidetests/appcompat/host/lib/src/android/compat/cts/Change.java
index 8e6c8e7..a91d56a 100644
--- a/hostsidetests/appcompat/host/lib/src/android/compat/cts/Change.java
+++ b/hostsidetests/appcompat/host/lib/src/android/compat/cts/Change.java
@@ -30,7 +30,8 @@
+ "(; (?<disabled>disabled))?"
+ "(; (?<loggingOnly>loggingOnly))?"
+ "(; packageOverrides=(?<overrides>[^\\);]+))?"
- + "(; rawOverrides=(?<rawOverrides>[^\\)]+))?"
+ + "(; rawOverrides=(?<rawOverrides>[^\\);]+))?"
+ + "(; (?<overridable>overridable))?"
+ "\\)");
public long changeId;
public String changeName;
diff --git a/hostsidetests/appsecurity/Android.bp b/hostsidetests/appsecurity/Android.bp
index f14eb57..8d5fdf8 100644
--- a/hostsidetests/appsecurity/Android.bp
+++ b/hostsidetests/appsecurity/Android.bp
@@ -45,6 +45,7 @@
"cts",
"general-tests",
"mts-documentsui",
+ "mts-mainline-infra",
"mts-mediaprovider",
"sts",
],
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/AppDataIsolationTests.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/AppDataIsolationTests.java
index 77b059e..e948237 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/AppDataIsolationTests.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/AppDataIsolationTests.java
@@ -315,7 +315,6 @@
@Test
public void testNormalProcessCannotAccessOtherAppExternalDataDir() throws Exception {
- assumeThatFuseDataIsolationIsEnabled(getDevice());
new InstallMultiple().addFile(APPA_APK).run();
new InstallMultiple().addFile(APPB_APK).run();
@@ -417,13 +416,6 @@
+ " " + packageName));
}
- private static void assumeThatFuseDataIsolationIsEnabled(ITestDevice device)
- throws DeviceNotAvailableException {
- assumeThat(device.executeShellCommand(
- "getprop persist.sys.vold_app_data_isolation_enabled").trim(),
- is("true"));
- }
-
private boolean isFbeModeEmulated() throws Exception {
String mode = getDevice().executeShellCommand("sm get-fbe-mode").trim();
if (mode.equals(FBE_MODE_EMULATED)) {
diff --git a/hostsidetests/appsecurity/test-apps/EncryptionApp/Android.bp b/hostsidetests/appsecurity/test-apps/EncryptionApp/Android.bp
index 2ced026..e504cd5 100644
--- a/hostsidetests/appsecurity/test-apps/EncryptionApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EncryptionApp/Android.bp
@@ -35,6 +35,7 @@
test_suites: [
"cts",
"general-tests",
+ "mts-mainline-infra",
],
certificate: ":cts-testkey1",
}
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/TEST_MAPPING b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/TEST_MAPPING
deleted file mode 100644
index 90a93b0..0000000
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/TEST_MAPPING
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "presubmit": [
- {
- "name": "CtsAppSecurityHostTestCases",
- "options": [
- {
- "include-filter": "android.appsecurity.cts.ExternalStorageHostTest"
- }
- ]
- }
- ]
-}
-
diff --git a/hostsidetests/appsecurity/test-apps/MediaStorageApp/TEST_MAPPING b/hostsidetests/appsecurity/test-apps/MediaStorageApp/TEST_MAPPING
deleted file mode 100644
index 90a93b0..0000000
--- a/hostsidetests/appsecurity/test-apps/MediaStorageApp/TEST_MAPPING
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "presubmit": [
- {
- "name": "CtsAppSecurityHostTestCases",
- "options": [
- {
- "include-filter": "android.appsecurity.cts.ExternalStorageHostTest"
- }
- ]
- }
- ]
-}
-
diff --git a/hostsidetests/appsecurity/test-apps/MediaStorageApp/src/com/android/cts/mediastorageapp/MediaStorageTest.java b/hostsidetests/appsecurity/test-apps/MediaStorageApp/src/com/android/cts/mediastorageapp/MediaStorageTest.java
index 1e07486..8c4f29c 100644
--- a/hostsidetests/appsecurity/test-apps/MediaStorageApp/src/com/android/cts/mediastorageapp/MediaStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/MediaStorageApp/src/com/android/cts/mediastorageapp/MediaStorageTest.java
@@ -58,7 +58,6 @@
import com.google.common.io.ByteStreams;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -525,7 +524,6 @@
assertEquals("0", queryForSingleColumn(red, MediaColumns.IS_TRASHED));
}
- @Ignore("b/181333720")
@Test
public void testMediaEscalation_RequestFavorite() throws Exception {
doMediaEscalation_RequestFavorite(MediaStorageTest::createAudio);
diff --git a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/TEST_MAPPING b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/TEST_MAPPING
deleted file mode 100644
index 90a93b0..0000000
--- a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/TEST_MAPPING
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "presubmit": [
- {
- "name": "CtsAppSecurityHostTestCases",
- "options": [
- {
- "include-filter": "android.appsecurity.cts.ExternalStorageHostTest"
- }
- ]
- }
- ]
-}
-
diff --git a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/arm/CtsShimPrivUpgrade.apk b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/arm/CtsShimPrivUpgrade.apk
index b6f7cd0..9b7eae3 100644
--- a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/arm/CtsShimPrivUpgrade.apk
+++ b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/arm/CtsShimPrivUpgrade.apk
Binary files differ
diff --git a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/arm/CtsShimPrivUpgradeWrongSHA.apk b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/arm/CtsShimPrivUpgradeWrongSHA.apk
index 112b9db..b6baab3 100644
--- a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/arm/CtsShimPrivUpgradeWrongSHA.apk
+++ b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/arm/CtsShimPrivUpgradeWrongSHA.apk
Binary files differ
diff --git a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/x86/CtsShimPrivUpgrade.apk b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/x86/CtsShimPrivUpgrade.apk
index 9f1d735..b34d7a0 100644
--- a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/x86/CtsShimPrivUpgrade.apk
+++ b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/x86/CtsShimPrivUpgrade.apk
Binary files differ
diff --git a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/x86/CtsShimPrivUpgradeWrongSHA.apk b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/x86/CtsShimPrivUpgradeWrongSHA.apk
index a8819be..7e8d3a7 100644
--- a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/x86/CtsShimPrivUpgradeWrongSHA.apk
+++ b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/apk/x86/CtsShimPrivUpgradeWrongSHA.apk
Binary files differ
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/TEST_MAPPING b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/TEST_MAPPING
deleted file mode 100644
index 90a93b0..0000000
--- a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/TEST_MAPPING
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "presubmit": [
- {
- "name": "CtsAppSecurityHostTestCases",
- "options": [
- {
- "include-filter": "android.appsecurity.cts.ExternalStorageHostTest"
- }
- ]
- }
- ]
-}
-
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/Android.bp b/hostsidetests/appsecurity/test-apps/SplitApp/Android.bp
index 1f252fd..1a02f52 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/Android.bp
@@ -62,6 +62,7 @@
test_suites: [
"cts",
"general-tests",
+ "mts-mainline-infra",
],
}
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/TEST_MAPPING b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/TEST_MAPPING
deleted file mode 100644
index 90a93b0..0000000
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/TEST_MAPPING
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "presubmit": [
- {
- "name": "CtsAppSecurityHostTestCases",
- "options": [
- {
- "include-filter": "android.appsecurity.cts.ExternalStorageHostTest"
- }
- ]
- }
- ]
-}
-
diff --git a/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java b/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java
index b2b5cc0..f761e8f 100644
--- a/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java
+++ b/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java
@@ -248,6 +248,10 @@
ThreadModel thread = findThread(result.getModel(), result.getPid());
SliceQueriesKt.iterSlices(thread, (Slice slice) -> {
requiredSections.remove(slice.getName());
+ // Quick hack to handle vsyncId being appended to doFrame
+ if (slice.getName().startsWith("Choreographer#doFrame ")) {
+ requiredSections.remove("Choreographer#doFrame");
+ }
return Unit.INSTANCE;
});
diff --git a/hostsidetests/blobstore/OWNERS b/hostsidetests/blobstore/OWNERS
index bf870975..3a47c48 100644
--- a/hostsidetests/blobstore/OWNERS
+++ b/hostsidetests/blobstore/OWNERS
@@ -1,2 +1,2 @@
-# Bug component: 95221
+# Bug component: 533114
include platform/frameworks/base:/apex/blobstore/OWNERS
diff --git a/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/DirectDelegatedCertInstallerTest.java b/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/DirectDelegatedCertInstallerTest.java
index 7039804..caa08f7 100644
--- a/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/DirectDelegatedCertInstallerTest.java
+++ b/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/DirectDelegatedCertInstallerTest.java
@@ -249,7 +249,7 @@
public void testIsWifiGrant_allowed() {
mDpm.installKeyPair(null, mTestPrivateKey, new Certificate[]{mTestCertificate},
TEST_ALIAS, /* requestAccess= */ false);
- mDpm.grantKeyPairToWifiAuth(TEST_ALIAS);
+ assertTrue(mDpm.grantKeyPairToWifiAuth(TEST_ALIAS));
assertThat(mDpm.isKeyPairGrantedToWifiAuth(TEST_ALIAS)).isTrue();
}
@@ -257,8 +257,8 @@
public void testIsWifiGrant_denied() {
mDpm.installKeyPair(null, mTestPrivateKey, new Certificate[]{mTestCertificate},
TEST_ALIAS, /* requestAccess= */ false);
- mDpm.grantKeyPairToWifiAuth(TEST_ALIAS);
- mDpm.revokeKeyPairFromWifiAuth(TEST_ALIAS);
+ assertTrue(mDpm.grantKeyPairToWifiAuth(TEST_ALIAS));
+ assertTrue(mDpm.revokeKeyPairFromWifiAuth(TEST_ALIAS));
assertThat(mDpm.isKeyPairGrantedToWifiAuth(TEST_ALIAS)).isFalse();
}
diff --git a/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/DelegateTestUtils.java b/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/DelegateTestUtils.java
index 7070841..be2ad73 100644
--- a/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/DelegateTestUtils.java
+++ b/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/DelegateTestUtils.java
@@ -15,17 +15,30 @@
*/
package com.android.cts.delegate;
+import static android.app.admin.SecurityLog.TAG_KEY_DESTRUCTION;
+import static android.app.admin.SecurityLog.TAG_KEY_GENERATED;
+
+import static com.google.common.truth.Truth.assertThat;
+
import static junit.framework.Assert.fail;
import android.app.admin.DelegatedAdminReceiver;
import android.app.admin.DevicePolicyManager;
import android.app.admin.NetworkEvent;
+import android.app.admin.SecurityLog.SecurityEvent;
import android.content.Context;
import android.content.Intent;
+import android.os.Process;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyProperties;
import android.test.MoreAsserts;
+import android.util.Log;
import junit.framework.Assert;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@@ -35,12 +48,25 @@
* Utils class for delegation tests.
*/
public class DelegateTestUtils {
+ // Indices of various fields in SecurityEvent payload.
+ private static final int SUCCESS_INDEX = 0;
+ private static final int ALIAS_INDEX = 1;
+ private static final int UID_INDEX = 2;
+
+ // Value that indicates success in events that have corresponding field in their payload.
+ private static final int SUCCESS_VALUE = 1;
@FunctionalInterface
public interface ExceptionRunnable {
void run() throws Exception;
}
+ /**
+ * A receiver for listening for network logs.
+ *
+ * To use this the sBatchCountDown must be assigned before generating logs.
+ * The receiver will ignore events until sBatchCountDown is assigned.
+ */
public static class NetworkLogsReceiver extends DelegatedAdminReceiver {
private static final long TIMEOUT_MIN = 1;
@@ -51,6 +77,12 @@
@Override
public void onNetworkLogsAvailable(Context context, Intent intent, long batchToken,
int networkLogsCount) {
+ if (sBatchCountDown == null) {
+ // If the latch is not set then nothing will be using the receiver to examine
+ // the logs. Leave the logs unread.
+ return;
+ }
+
DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
final List<NetworkEvent> events = dpm.retrieveNetworkLogs(null, batchToken);
if (events == null || events.size() == 0) {
@@ -78,7 +110,8 @@
try {
r.run();
} catch (Throwable e) {
- Assert.assertTrue("Expected " + expectedExceptionType.getName() + " but caught " + e,
+ Assert.assertTrue("Expected " + expectedExceptionType.getName() + " but caught:"
+ + "\n" + Log.getStackTraceString(e) + "\nTest exception:\n",
expectedExceptionType.isAssignableFrom(e.getClass()));
if (expectedExceptionMessageRegex != null) {
MoreAsserts.assertContainsRegex(expectedExceptionMessageRegex, e.getMessage());
@@ -87,4 +120,89 @@
}
Assert.fail("Expected " + expectedExceptionType.getName() + " was not thrown");
}
+
+ /**
+ * Generates a key for the given key alias, asserts it was created successfully
+ */
+ public static void testGenerateKey(String keyAlias) throws Exception {
+ final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
+ generator.initialize(
+ new KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_SIGN).build());
+ final KeyPair keyPair = generator.generateKeyPair();
+ assertThat(keyPair).isNotNull();
+ }
+
+ /**
+ * Deletes a key for the given key alias
+ */
+ public static void deleteKey(String keyAlias) throws Exception {
+ final KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
+ ks.load(null);
+ ks.deleteEntry(keyAlias);
+ }
+
+
+ /**
+ * Fetches the available security events
+ */
+ public static List<SecurityEvent> getSecurityEvents(DevicePolicyManager dpm)
+ throws Exception {
+ List<SecurityEvent> events = null;
+ // Retry once after seeping for 1 second, in case "dpm force-security-logs" hasn't taken
+ // effect just yet.
+ for (int i = 0; i < 5 && events == null; i++) {
+ events = dpm.retrieveSecurityLogs(null);
+ if (events == null) Thread.sleep(1000);
+ }
+
+ return events;
+ }
+
+ /**
+ * Verifies that the expected keystore events generated by {@link #testGenerateKey} are
+ * present
+ */
+ public static void verifyKeystoreEventsPresent(String generatedKeyAlias,
+ List<SecurityEvent> securityEvents) {
+ int receivedKeyGenerationEvents = 0;
+ int receivedKeyDeletionEvents = 0;
+
+ for (final SecurityEvent currentEvent : securityEvents) {
+ if (currentEvent.getTag() == TAG_KEY_GENERATED) {
+ verifyKeyEvent(currentEvent, generatedKeyAlias);
+ receivedKeyGenerationEvents++;
+ }
+
+ if (currentEvent.getTag() == TAG_KEY_DESTRUCTION) {
+ verifyKeyEvent(currentEvent, generatedKeyAlias);
+ receivedKeyDeletionEvents++;
+ }
+ }
+
+ assertThat(receivedKeyGenerationEvents).isEqualTo(1);
+ assertThat(receivedKeyDeletionEvents).isEqualTo(1);
+ }
+
+ /**
+ * Verifies that a security event represents a successful key modification event for
+ * keyAlias
+ */
+ private static void verifyKeyEvent(SecurityEvent event, String keyAlias) {
+ assertThat(getInt(event, SUCCESS_INDEX)).isEqualTo(SUCCESS_VALUE);
+ assertThat(getString(event, ALIAS_INDEX)).contains(keyAlias);
+ assertThat(getInt(event, UID_INDEX)).isEqualTo(Process.myUid());
+ }
+
+ private static Object getDatum(SecurityEvent event, int index) {
+ final Object[] dataArray = (Object[]) event.getData();
+ return dataArray[index];
+ }
+
+ private static String getString(SecurityEvent event, int index) {
+ return (String) getDatum(event, index);
+ }
+
+ private static int getInt(SecurityEvent event, int index) {
+ return (Integer) getDatum(event, index);
+ }
}
diff --git a/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/SecurityLoggingDelegateTest.java b/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/SecurityLoggingDelegateTest.java
new file mode 100644
index 0000000..e924d41
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/SecurityLoggingDelegateTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.delegate;
+
+import static com.android.cts.delegate.DelegateTestUtils.assertExpectException;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.admin.DevicePolicyManager;
+import android.app.admin.SecurityLog.SecurityEvent;
+import android.content.Context;
+import android.support.test.uiautomator.UiDevice;
+import android.test.InstrumentationTestCase;
+
+import androidx.test.InstrumentationRegistry;
+
+import java.util.List;
+
+/**
+ * Tests that a delegate app with DELEGATION_SECURITY_LOGGING is able to control and access
+ * security logging.
+ */
+public class SecurityLoggingDelegateTest extends InstrumentationTestCase {
+
+ private static final String TAG = "SecurityLoggingDelegateTest";
+
+ private Context mContext;
+ private DevicePolicyManager mDpm;
+ private UiDevice mDevice;
+
+ private static final String GENERATED_KEY_ALIAS = "generated_key_alias";
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ mContext = getInstrumentation().getContext();
+ mDpm = mContext.getSystemService(DevicePolicyManager.class);
+ }
+
+ public void testCannotAccessApis()throws Exception {
+ assertExpectException(SecurityException.class, null,
+ () -> mDpm.isSecurityLoggingEnabled(null));
+
+ assertExpectException(SecurityException.class, null,
+ () -> mDpm.setSecurityLoggingEnabled(null, true));
+
+ assertExpectException(SecurityException.class, null,
+ () -> mDpm.retrieveSecurityLogs(null));
+ }
+
+ /**
+ * Test: Test enabling security logging.
+ * This test has a side effect: security logging is enabled after its execution.
+ */
+ public void testEnablingSecurityLogging() {
+ mDpm.setSecurityLoggingEnabled(null, true);
+
+ assertThat(mDpm.isSecurityLoggingEnabled(null)).isTrue();
+ }
+
+ /**
+ * Generates security events related to Keystore
+ */
+ public void testGenerateLogs() throws Exception {
+ try {
+ DelegateTestUtils.testGenerateKey(GENERATED_KEY_ALIAS);
+ } finally {
+ DelegateTestUtils.deleteKey(GENERATED_KEY_ALIAS);
+ }
+ }
+
+ /**
+ * Test: retrieves security logs and verifies that all events generated as a result of host
+ * side actions and by {@link #testGenerateLogs()} are there.
+ */
+ public void testVerifyGeneratedLogs() throws Exception {
+ final List<SecurityEvent> events = DelegateTestUtils.getSecurityEvents(mDpm);
+ DelegateTestUtils.verifyKeystoreEventsPresent(GENERATED_KEY_ALIAS, events);
+ }
+
+ /**
+ * Test: retrieving security logs should be rate limited - subsequent attempts should return
+ * null.
+ */
+ public void testSecurityLoggingRetrievalRateLimited() {
+ final List<SecurityEvent> logs = mDpm.retrieveSecurityLogs(null);
+ // if logs is null it means that that attempt was rate limited => test PASS
+ if (logs != null) {
+ assertThat(mDpm.retrieveSecurityLogs(null)).isNull();
+ assertThat(mDpm.retrieveSecurityLogs(null)).isNull();
+ }
+ }
+
+ /**
+ * Test: Test disaling security logging.
+ * This test has a side effect: security logging is disabled after its execution.
+ */
+ public void testDisablingSecurityLogging() {
+ mDpm.setSecurityLoggingEnabled(null, false);
+
+ assertThat(mDpm.isSecurityLoggingEnabled(null)).isFalse();
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/WorkProfileSecurityLoggingDelegateTest.java b/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/WorkProfileSecurityLoggingDelegateTest.java
new file mode 100644
index 0000000..e660d1b
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/WorkProfileSecurityLoggingDelegateTest.java
@@ -0,0 +1,121 @@
+/*
+ * 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.delegate;
+
+import static com.android.cts.delegate.DelegateTestUtils.assertExpectException;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.admin.DevicePolicyManager;
+import android.app.admin.SecurityLog.SecurityEvent;
+import android.content.Context;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class WorkProfileSecurityLoggingDelegateTest {
+
+ private static final String TAG = "WorkProfileSecurityLoggingDelegateTest";
+ private static final String CTS_APP_PACKAGE_NAME = "com.android.cts.delegate";
+ private static final String GENERATED_KEY_ALIAS = "generated_key_alias";
+
+ private Context mContext;
+ private DevicePolicyManager mDpm;
+
+ @Before
+ public void setUp() {
+ mContext = InstrumentationRegistry.getContext();
+ mDpm = mContext.getSystemService(DevicePolicyManager.class);
+ }
+
+ @Test
+ public void testCannotAccessApis() {
+ assertExpectException(SecurityException.class, null,
+ () -> mDpm.isSecurityLoggingEnabled(null));
+
+ assertExpectException(SecurityException.class, null,
+ () -> mDpm.setSecurityLoggingEnabled(null, true));
+
+ assertExpectException(SecurityException.class, null,
+ () -> mDpm.retrieveSecurityLogs(null));
+ }
+
+ /**
+ * Test: Test enabling security logging.
+ * This test has a side effect: security logging is enabled after its execution.
+ */
+ @Test
+ public void testEnablingSecurityLogging() {
+ mDpm.setSecurityLoggingEnabled(null, true);
+
+ assertThat(mDpm.isSecurityLoggingEnabled(null)).isTrue();
+ }
+
+ /**
+ * Generates security events related to Keystore
+ */
+ @Test
+ public void testGenerateLogs() throws Exception {
+ try {
+ DelegateTestUtils.testGenerateKey(GENERATED_KEY_ALIAS);
+ } finally {
+ DelegateTestUtils.deleteKey(GENERATED_KEY_ALIAS);
+ }
+ }
+
+ /**
+ * Test: retrieves security logs and verifies that all events generated as a result of host
+ * side actions and by {@link #testGenerateLogs()} are there.
+ */
+ @Test
+ public void testVerifyGeneratedLogs() throws Exception {
+ final List<SecurityEvent> events = DelegateTestUtils.getSecurityEvents(mDpm);
+ DelegateTestUtils.verifyKeystoreEventsPresent(GENERATED_KEY_ALIAS, events);
+ }
+
+ /**
+ * Test: retrieving security logs should be rate limited - subsequent attempts should return
+ * null.
+ */
+ @Test
+ public void testSecurityLoggingRetrievalRateLimited() {
+ final List<SecurityEvent> logs = mDpm.retrieveSecurityLogs(null);
+ // if logs is null it means that that attempt was rate limited => test PASS
+ if (logs != null) {
+ assertThat(mDpm.retrieveSecurityLogs(null)).isNull();
+ assertThat(mDpm.retrieveSecurityLogs(null)).isNull();
+ }
+ }
+
+ /**
+ * Test: Test disaling security logging.
+ * This test has a side effect: security logging is disabled after its execution.
+ */
+ @Test
+ public void testDisablingSecurityLogging() {
+ mDpm.setSecurityLoggingEnabled(null, false);
+
+ assertThat(mDpm.isSecurityLoggingEnabled(null)).isFalse();
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/DelegationTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/DelegationTest.java
index 27b29f0..5def362 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/DelegationTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/DelegationTest.java
@@ -22,6 +22,7 @@
import static android.app.admin.DevicePolicyManager.DELEGATION_CERT_SELECTION;
import static android.app.admin.DevicePolicyManager.DELEGATION_ENABLE_SYSTEM_APP;
import static android.app.admin.DevicePolicyManager.DELEGATION_NETWORK_LOGGING;
+import static android.app.admin.DevicePolicyManager.DELEGATION_SECURITY_LOGGING;
import static android.app.admin.DevicePolicyManager.EXTRA_DELEGATION_SCOPES;
import static com.google.common.truth.Truth.assertThat;
@@ -188,7 +189,8 @@
}
public void testDeviceOwnerOrManagedPoOnlyDelegations() throws Exception {
- final String doOrManagedPoDelegations[] = {DELEGATION_NETWORK_LOGGING};
+ final String [] doOrManagedPoDelegations =
+ { DELEGATION_NETWORK_LOGGING, DELEGATION_SECURITY_LOGGING };
final boolean isDeviceOwner = mDevicePolicyManager.isDeviceOwnerApp(
mContext.getPackageName());
final boolean isManagedProfileOwner = mDevicePolicyManager.getProfileOwner() != null
@@ -214,6 +216,7 @@
DELEGATION_CERT_SELECTION));
if (mDevicePolicyManager.isDeviceOwnerApp(mContext.getPackageName())) {
exclusiveDelegations.add(DELEGATION_NETWORK_LOGGING);
+ exclusiveDelegations.add(DELEGATION_SECURITY_LOGGING);
}
for (String scope : exclusiveDelegations) {
testExclusiveDelegation(scope);
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/DevicePolicyLoggingTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/DevicePolicyLoggingTest.java
index 50cf4ba..eb104f6 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/DevicePolicyLoggingTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/DevicePolicyLoggingTest.java
@@ -186,6 +186,11 @@
mDevicePolicyManager.setUninstallBlocked(ADMIN_RECEIVER_COMPONENT, PACKAGE_NAME, false);
}
+ public void testSetNetworkSlicingEnabledLogged() {
+ mDevicePolicyManager.setNetworkSlicingEnabled(true);
+ mDevicePolicyManager.setNetworkSlicingEnabled(false);
+ }
+
public void testDisallowAdjustVolumeMutedLogged() {
final boolean initialValue =
mDevicePolicyManager.isMasterVolumeMuted(ADMIN_RECEIVER_COMPONENT);
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/KeyManagementTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/KeyManagementTest.java
index 0528615..8b464fe 100755
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/KeyManagementTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/KeyManagementTest.java
@@ -903,7 +903,7 @@
public void testIsWifiGrant_allowed() {
mDevicePolicyManager.installKeyPair(getWho(), mFakePrivKey, new Certificate[]{mFakeCert},
TEST_ALIAS, /* requestAccess= */ false);
- mDevicePolicyManager.grantKeyPairToWifiAuth(TEST_ALIAS);
+ assertTrue(mDevicePolicyManager.grantKeyPairToWifiAuth(TEST_ALIAS));
assertThat(mDevicePolicyManager.isKeyPairGrantedToWifiAuth(TEST_ALIAS)).isTrue();
}
@@ -911,8 +911,8 @@
public void testIsWifiGrant_denied() {
mDevicePolicyManager.installKeyPair(getWho(), mFakePrivKey, new Certificate[]{mFakeCert},
TEST_ALIAS, /* requestAccess= */ false);
- mDevicePolicyManager.grantKeyPairToWifiAuth(TEST_ALIAS);
- mDevicePolicyManager.revokeKeyPairFromWifiAuth(TEST_ALIAS);
+ assertTrue(mDevicePolicyManager.grantKeyPairToWifiAuth(TEST_ALIAS));
+ assertTrue(mDevicePolicyManager.revokeKeyPairFromWifiAuth(TEST_ALIAS));
assertThat(mDevicePolicyManager.isKeyPairGrantedToWifiAuth(TEST_ALIAS)).isFalse();
}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PermissionsTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PermissionsTest.java
index 319a7a0..87ab51a 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PermissionsTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PermissionsTest.java
@@ -473,6 +473,20 @@
}
}
+ public void testStateOfSensorsRelatedPermissionsCannotBeRead() throws Exception {
+ for (String sensorPermission: SENSORS_PERMISSIONS) {
+ // The admin tries to grant the permission.
+ setPermissionGrantState(sensorPermission, PERMISSION_GRANT_STATE_GRANTED);
+
+ // But the user denies it.
+ PermissionUtils.launchActivityAndRequestPermission(mReceiver, mDevice, sensorPermission,
+ PERMISSION_DENIED, PERMISSION_APP_PACKAGE_NAME, PERMISSIONS_ACTIVITY_NAME);
+
+ // And the admin cannot learn of it.
+ assertPermissionGrantState(sensorPermission, PERMISSION_GRANT_STATE_DEFAULT);
+ }
+ }
+
private void assertFailedToSetPermissionGrantState(String permission, int value) {
assertTrue(mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
PERMISSION_APP_PACKAGE_NAME, permission, value));
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecondaryLockscreenTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecondaryLockscreenTest.java
index d639cb9..2ad3a78 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecondaryLockscreenTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecondaryLockscreenTest.java
@@ -67,6 +67,10 @@
mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_SECURE_LOCK_SCREEN));
+ // TODO(b/182994391): Replace with more generic solution to override the supervision
+ // component.
+ mUiDevice.executeShellCommand("settings put global device_policy_constants "
+ + "use_test_admin_as_supervision_component=true");
mUiDevice.executeShellCommand("locksettings set-disabled false");
mUiDevice.executeShellCommand("locksettings set-pin 1234");
@@ -82,6 +86,7 @@
public void tearDown() throws Exception {
mDevicePolicyManager.setSecondaryLockscreenEnabled(ADMIN_RECEIVER_COMPONENT, false);
assertFalse(mDevicePolicyManager.isSecondaryLockscreenEnabled(Process.myUserHandle()));
+ mUiDevice.executeShellCommand("settings delete global device_policy_constants");
mUiDevice.executeShellCommand("locksettings clear --old 1234");
mUiDevice.executeShellCommand("locksettings set-disabled true");
}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecurityLoggingTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecurityLoggingTest.java
index 8c4510d..1a67710 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecurityLoggingTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecurityLoggingTest.java
@@ -61,6 +61,7 @@
import static com.android.cts.devicepolicy.TestCertificates.TEST_CA_SUBJECT;
import static com.google.common.collect.ImmutableList.of;
+import static com.google.common.truth.Truth.assertThat;
import android.app.admin.SecurityLog.SecurityEvent;
import android.content.Context;
@@ -102,6 +103,9 @@
private static final String PREF_NAME = "batchIds";
// system/core/liblog/event.logtags: 1006 liblog (dropped|1)
private static final int TAG_LIBLOG_DROPPED = 1006;
+ private static final String DELEGATE_APP_PKG = "com.android.cts.delegate";
+ private static final String DELEGATION_SECURITY_LOGGING = "delegation-security-logging";
+
// For brevity.
private static final Class<String> S = String.class;
@@ -541,6 +545,23 @@
}
}
+ public void testSetDelegateScope_delegationSecurityLogging() {
+ mDevicePolicyManager.setDelegatedScopes(ADMIN_RECEIVER_COMPONENT, DELEGATE_APP_PKG,
+ Arrays.asList(DELEGATION_SECURITY_LOGGING));
+
+ assertThat(mDevicePolicyManager.getDelegatedScopes(
+ ADMIN_RECEIVER_COMPONENT, DELEGATE_APP_PKG)).contains(DELEGATION_SECURITY_LOGGING);
+ }
+
+ public void testSetDelegateScope_noDelegation() {
+ mDevicePolicyManager.setDelegatedScopes(ADMIN_RECEIVER_COMPONENT, DELEGATE_APP_PKG,
+ Arrays.asList());
+
+ assertThat(mDevicePolicyManager.getDelegatedScopes(
+ ADMIN_RECEIVER_COMPONENT, DELEGATE_APP_PKG))
+ .doesNotContain(DELEGATION_SECURITY_LOGGING);
+ }
+
private void generateKey(String keyAlias) throws Exception {
final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SuspendPackageTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SuspendPackageTest.java
index aede805..41b3cd8 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SuspendPackageTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SuspendPackageTest.java
@@ -18,29 +18,34 @@
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.getDefaultLauncher;
-import android.content.pm.PackageManager.NameNotFoundException;
+import static com.google.common.truth.Truth.assertWithMessage;
+
import android.content.pm.SuspendDialogInfo;
+import android.util.Log;
import java.util.Arrays;
-import java.util.HashSet;
public class SuspendPackageTest extends BaseDeviceAdminTest {
+
+ private static final String TAG = SuspendPackageTest.class.getSimpleName();
private static final String INTENT_RECEIVER_PKG = "com.android.cts.intent.receiver";
- public void testSetPackagesSuspended() throws NameNotFoundException {
- String[] notHandledPackages =
- mDevicePolicyManager.setPackagesSuspended(ADMIN_RECEIVER_COMPONENT, new String[]
- {INTENT_RECEIVER_PKG}, true);
- // all packages should be handled.
- assertEquals(0, notHandledPackages.length);
- // test isPackageSuspended
- boolean isSuspended =
- mDevicePolicyManager.isPackageSuspended(
- ADMIN_RECEIVER_COMPONENT, INTENT_RECEIVER_PKG);
- assertTrue(isSuspended);
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ Log.d(TAG, "Running test on user " + mContext.getUserId());
}
- public void testSetPackagesSuspendedWithPackageManager() throws NameNotFoundException {
+ public void testSetPackagesSuspended() throws Exception {
+ String[] notHandled = setSuspendedPackages(/* suspend= */ true, INTENT_RECEIVER_PKG);
+ // all packages should be handled.
+ assertWithMessage("packages not suspended").that(notHandled).isEmpty();
+
+ assertPackageSuspended(INTENT_RECEIVER_PKG);
+ }
+
+ public void testSetPackagesSuspendedWithPackageManager() throws Exception {
SuspendDialogInfo dialogInfo = new SuspendDialogInfo.Builder()
.setMessage("Test message")
.build();
@@ -49,38 +54,29 @@
mContext.getPackageManager().setPackagesSuspended(
new String[] {INTENT_RECEIVER_PKG}, true, null, null, dialogInfo);
// all packages should be handled.
- assertEquals(0, notHandledPackages.length);
- // test isPackageSuspended
- boolean isSuspended =
- mDevicePolicyManager.isPackageSuspended(
- ADMIN_RECEIVER_COMPONENT, INTENT_RECEIVER_PKG);
- assertTrue(isSuspended);
+ assertWithMessage("notHandlePackages").that(notHandledPackages).isEmpty();
+
+ assertPackageSuspended(INTENT_RECEIVER_PKG);
}
- public void testSetPackagesNotSuspendedWithPackageManager() throws NameNotFoundException {
- String[] notHandledPackages = mContext.getPackageManager().setPackagesSuspended(
+ public void testSetPackagesNotSuspendedWithPackageManager() throws Exception {
+ String[] notHandled = mContext.getPackageManager().setPackagesSuspended(
new String[] {INTENT_RECEIVER_PKG}, false, null, null, (SuspendDialogInfo) null);
// all packages should be handled.
- assertEquals(0, notHandledPackages.length);
+ assertWithMessage("packages not handled").that(notHandled).isEmpty();
+
// test isPackageSuspended
- boolean isSuspended =
- mDevicePolicyManager.isPackageSuspended(
- ADMIN_RECEIVER_COMPONENT, INTENT_RECEIVER_PKG);
- assertFalse(isSuspended);
+ assertPackageNotSuspended(INTENT_RECEIVER_PKG);
}
- public void testSetPackagesNotSuspended() throws NameNotFoundException {
- String[] notHandledPackages = mDevicePolicyManager.setPackagesSuspended(
- ADMIN_RECEIVER_COMPONENT,
- new String[] {INTENT_RECEIVER_PKG},
- false);
+ public void testSetPackagesNotSuspended() throws Exception {
+
+ String[] notHandled = setSuspendedPackages(/* suspend= */ false, INTENT_RECEIVER_PKG);
// all packages should be handled.
- assertEquals(0, notHandledPackages.length);
+ assertWithMessage("packages not suspended").that(notHandled).isEmpty();
+
// test isPackageSuspended
- boolean isSuspended =
- mDevicePolicyManager.isPackageSuspended(
- ADMIN_RECEIVER_COMPONENT, INTENT_RECEIVER_PKG);
- assertFalse(isSuspended);
+ assertPackageNotSuspended(INTENT_RECEIVER_PKG);
}
/**
@@ -89,18 +85,33 @@
public void testSuspendNotSuspendablePackages() throws Exception {
String launcherPackage = getDefaultLauncher(getInstrumentation());
String dpcPackage = ADMIN_RECEIVER_COMPONENT.getPackageName();
- String[] unsuspendablePackages = new String[] {launcherPackage, dpcPackage};
- String[] notHandledPackages = mDevicePolicyManager.setPackagesSuspended(
- ADMIN_RECEIVER_COMPONENT,
- unsuspendablePackages,
- true);
+ String[] notHandledPackages = setSuspendedPackages(/* suspend= */ true,
+ launcherPackage, dpcPackage);
// no package should be handled.
- assertArrayEqualIgnoreOrder(unsuspendablePackages, notHandledPackages);
+ assertWithMessage("not handled pacakges").that(notHandledPackages).asList()
+ .containsExactly(launcherPackage, dpcPackage);
}
- private static <T> void assertArrayEqualIgnoreOrder(T[] a, T[] b) {
- assertEquals(a.length, b.length);
- assertTrue(new HashSet(Arrays.asList(a)).containsAll(new HashSet(Arrays.asList(b))));
+ private String[] setSuspendedPackages(boolean suspend, String... pkgs) {
+ Log.d(TAG, "Calling setPackagesSuspended(" + suspend + ", " + Arrays.toString(pkgs));
+ String[] notHandled =
+ mDevicePolicyManager.setPackagesSuspended(ADMIN_RECEIVER_COMPONENT, pkgs, suspend);
+ Log.d(TAG, "Returning " + Arrays.toString(notHandled));
+ return notHandled;
}
+ private void assertPackageSuspended(String pkg) throws Exception {
+ assertPackageSuspension(pkg, /* expected= */ true);
+ }
+
+ private void assertPackageNotSuspended(String pkg) throws Exception {
+ assertPackageSuspension(pkg, /* expected= */ false);
+ }
+
+ private void assertPackageSuspension(String pkg, boolean expected) throws Exception {
+ boolean actual =
+ mDevicePolicyManager.isPackageSuspended(ADMIN_RECEIVER_COMPONENT, pkg);
+ Log.d(TAG, "isPackageSuspended(" + pkg + "): " + actual);
+ assertWithMessage("package %s suspension", pkg).that(actual).isEqualTo(expected);
+ }
}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/systemupdate/InstallUpdateTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/systemupdate/InstallUpdateTest.java
old mode 100644
new mode 100755
index 3a3a357..205218d
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/systemupdate/InstallUpdateTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/systemupdate/InstallUpdateTest.java
@@ -206,6 +206,7 @@
&& SystemClock.elapsedRealtime() <= startTime + BATTERY_STATE_CHANGE_TIMEOUT_MS) {
Thread.sleep(BATTERY_STATE_CHANGE_SLEEP_PER_CHECK_MS);
}
+ assertTrue("Battery state update timeout", isBatteryState(plugged, level));
}
private boolean isBatteryState(boolean plugged, int level) {
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseAffiliatedProfileOwnerTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseAffiliatedProfileOwnerTest.java
index 9490eff..cbf82cc 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseAffiliatedProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseAffiliatedProfileOwnerTest.java
@@ -19,6 +19,12 @@
import android.content.ComponentName;
import android.test.AndroidTestCase;
+import com.android.bedstead.dpmwrapper.TestAppSystemServiceFactory;
+
+// TODO (b/174859111): evaluate and refactor dependency on this class to have only
+// affiliated profile-owner based tests depends on this class. Tests for Device Owner only,
+// e.g. PackageInstallTest should not depend on this class. Otherwise, tests can easily break
+// in multi-user setup.
/**
* Base class for affiliated profile-owner based tests.
*
@@ -33,8 +39,10 @@
@Override
protected void setUp() throws Exception {
super.setUp();
-
- mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
+ // In headless system user mode, affiliated PO is set on seceondary when DO is setup on
+ // user 0. Therefore, this test will run on user 0.
+ mDevicePolicyManager = TestAppSystemServiceFactory.getDevicePolicyManager(mContext,
+ BasicAdminReceiver.class);
assertDeviceOrAffiliatedProfileOwner();
}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/HeadlessSystemUserTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/HeadlessSystemUserTest.java
index fff65d6..f723885 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/HeadlessSystemUserTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/HeadlessSystemUserTest.java
@@ -23,7 +23,9 @@
import android.annotation.UserIdInt;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
+import android.content.Context;
import android.content.pm.UserInfo;
+import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;
@@ -70,8 +72,11 @@
// Must try a couple times as PO is asynchronously set after user is created.
// TODO(b/178102911): use a callback instead
- eventually(() -> assertProfileOwner(mDevicePolicyManager.getProfileOwnerAsUser(userId),
- userId));
+ Context newUserContext = mContext.createContextAsUser(UserHandle.of(userId),
+ /* flags=*/ 0);
+ DevicePolicyManager newUserDpm = newUserContext
+ .getSystemService(DevicePolicyManager.class);
+ eventually(() -> assertProfileOwner(newUserDpm.getProfileOwner(), userId));
} finally {
if (user != null) {
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/NetworkLoggingTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/NetworkLoggingTest.java
old mode 100644
new mode 100755
index 91c63c9..8bfd25d
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/NetworkLoggingTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/NetworkLoggingTest.java
@@ -310,7 +310,7 @@
Log.d(TAG, "verifyNetworkLogs(): expected " + eventsExpected + ", got "
+ ((networkEvents == null) ? "null" : String.valueOf(networkEvents.size())));
// allow a batch to be slightly smaller or larger.
- assertTrue(Math.abs(eventsExpected - networkEvents.size()) <= 50);
+ assertTrue(Math.abs(eventsExpected - networkEvents.size()) <= 150);
int ctsPackageNameCounter = 0;
// allow a small down margin for verification, to avoid flakiness
final int eventsExpectedWithMargin = eventsExpected - 50;
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/SimpleIntentReceiverActivity.java b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/SimpleIntentReceiverActivity.java
index 5d36980..045ba88 100644
--- a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/SimpleIntentReceiverActivity.java
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/SimpleIntentReceiverActivity.java
@@ -30,6 +30,7 @@
public class SimpleIntentReceiverActivity extends Activity {
private static final String TAG = "SimpleIntentReceiverActivity";
+ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String className = getIntent().getComponent().getClassName();
@@ -40,8 +41,8 @@
(DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
boolean inManagedProfile = dpm.isProfileOwnerApp("com.android.cts.managedprofile");
- Log.i(TAG, "activity " + className + " started, is in managed profile: "
- + inManagedProfile);
+ Log.i(TAG, "activity " + className + " started on user " + getUserId()
+ + ", is in managed profile: " + inManagedProfile);
Intent result = new Intent();
result.putExtra("extra_receiver_class", className);
result.putExtra("extra_in_managed_profile", inManagedProfile);
diff --git a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/IntentSenderActivity.java b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/IntentSenderActivity.java
index eb64d47..b55437c 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/IntentSenderActivity.java
+++ b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/IntentSenderActivity.java
@@ -26,9 +26,9 @@
import android.os.Bundle;
import android.util.Log;
+import java.util.List;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
-import java.util.List;
public class IntentSenderActivity extends Activity {
@@ -52,10 +52,14 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
+
+ Log.d(TAG, "Created on user " + getUserId());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ Log.d(TAG, "onActivityResult(): userId=" + getUserId() + ", requestCode=" + requestCode
+ + ", resultCode=" + resultCode);
if (resultCode == Activity.RESULT_OK) {
try {
mResult.offer(new Result(resultCode, data), 5, TimeUnit.SECONDS);
@@ -68,9 +72,12 @@
public Intent getResult(Intent intent) throws Exception {
Log.d(TAG, "Sending intent " + intent);
startActivityForResult(intent, 42);
- final Result result = mResult.poll(30, TimeUnit.SECONDS);
+ int timeoutSec = 30;
+ Result result = mResult.poll(timeoutSec, TimeUnit.SECONDS);
if (result != null) {
Log.d(TAG, "Result intent: " + result.data);
+ } else {
+ Log.d(TAG, "null result after " + timeoutSec + "s");
}
return (result != null) ? result.data : null;
}
@@ -79,8 +86,7 @@
* This method will send an intent accross profiles to IntentReceiverActivity, and return the
* result intent set by IntentReceiverActivity.
*/
- public Intent getCrossProfileResult(Intent intent)
- throws Exception {
+ public Intent getCrossProfileResult(Intent intent) throws Exception {
PackageManager pm = getPackageManager();
List<ResolveInfo> ris = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
// There should be two matches:
diff --git a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/SuspendPackageTest.java b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/SuspendPackageTest.java
index b769cdc..991bcb3 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/SuspendPackageTest.java
+++ b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/SuspendPackageTest.java
@@ -1,5 +1,7 @@
package com.android.cts.intent.sender;
+import static com.google.common.truth.Truth.assertWithMessage;
+
import android.app.UiAutomation;
import android.content.Context;
import android.content.Intent;
@@ -7,6 +9,7 @@
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Settings;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.BySelector;
@@ -15,8 +18,12 @@
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.Until;
import android.test.InstrumentationTestCase;
+import android.util.Log;
public class SuspendPackageTest extends InstrumentationTestCase {
+
+ private static final String TAG = "IntentSender.SuspendPackageTest";
+
private static final int WAIT_DIALOG_TIMEOUT_IN_MS = 5000;
private static final BySelector POPUP_TITLE_WATCH_SELECTOR = By
.clazz(android.widget.TextView.class.getName())
@@ -33,34 +40,53 @@
private UiAutomation mUiAutomation;
private static final String INTENT_RECEIVER_PKG = "com.android.cts.intent.receiver";
- private static final String TARGET_ACTIVITY_NAME
- = "com.android.cts.intent.receiver.SimpleIntentReceiverActivity";
+ private static final String TARGET_ACTIVITY_NAME =
+ "com.android.cts.intent.receiver.SimpleIntentReceiverActivity";
@Override
protected void setUp() throws Exception {
super.setUp();
mContext = getInstrumentation().getTargetContext();
- mActivity = launchActivity(mContext.getPackageName(), IntentSenderActivity.class, null);
+ String packageName = mContext.getPackageName();
+ int userId = mContext.getUserId();
+ Class<IntentSenderActivity> activityClass = IntentSenderActivity.class;
+ if (temporarilySkipActivityLaunch()) {
+ Log.w(TAG, "setup(): not launching " + activityClass + " on user " + userId
+ + " as launcher on automotive doesn't support suspended apps yet");
+ } else {
+ Log.d(TAG, "setup(): launching " + activityClass + " on user " + userId);
+ mActivity = launchActivity(packageName, activityClass, null);
+ assertWithMessage("activity %s launched on package %s on user %s",
+ activityClass, packageName, userId).that(mActivity).isNotNull();
+ Log.d(TAG, "setup(): launched activity " + mActivity);
+ }
mPackageManager = mContext.getPackageManager();
mUiAutomation = getInstrumentation().getUiAutomation();
}
@Override
public void tearDown() throws Exception {
- mActivity.finish();
+ if (mActivity != null) {
+ mActivity.finish();
+ }
super.tearDown();
}
+ // TODO(b/182387060): STOPSHIP temporarily hack until CarLauncher supports it
+ private boolean temporarilySkipActivityLaunch() {
+ return UserManager.isHeadlessSystemUserMode();
+ }
+
public void testPackageSuspended() throws Exception {
- assertPackageSuspended(true, false);
+ assertPackageSuspended(/* suspended= */ true, /* customDialog= */ false);
}
public void testPackageNotSuspended() throws Exception {
- assertPackageSuspended(false, false);
+ assertPackageSuspended(/* suspended= */ false, /* customDialog= */ false);
}
public void testPackageSuspendedWithPackageManager() throws Exception {
- assertPackageSuspended(true, true);
+ assertPackageSuspended(/* suspended= */ true, /* customDialog= */ true);
}
/**
@@ -70,19 +96,26 @@
private void assertPackageSuspended(boolean suspended, boolean customDialog) throws Exception {
Intent intent = new Intent();
intent.setClassName(INTENT_RECEIVER_PKG, TARGET_ACTIVITY_NAME);
- Intent result = mActivity.getResult(intent);
- if (suspended) {
- if (customDialog) {
- dismissCustomDialog();
+ if (!temporarilySkipActivityLaunch()) {
+ Log.d(TAG, "assertPackageSuspended(suspended=" + suspended
+ + ", customDialog=" + customDialog + "): getting result for activity " + intent
+ + " on user " + mContext.getUserId());
+ Intent result = mActivity.getResult(intent);
+ if (suspended) {
+ if (customDialog) {
+ dismissCustomDialog();
+ } else {
+ dismissPolicyTransparencyDialog();
+ }
+ assertWithMessage("result for activitiy %s", intent).that(result).isNull();
} else {
- dismissPolicyTransparencyDialog();
+ assertWithMessage("result for activitiy %s", intent).that(result).isNotNull();
}
- assertNull(result);
- } else {
- assertNotNull(result);
}
// No matter if it is suspended or not, we should be able to resolve the activity.
- assertNotNull(mPackageManager.resolveActivity(intent, 0));
+ ResolveInfo resolveInfo = mPackageManager.resolveActivity(intent, /* flags= */ 0);
+ assertWithMessage("ResolveInfo for activity %s", intent).that(resolveInfo).isNotNull();
+ Log.d(TAG, "ResolveInfo: " + resolveInfo);
}
/**
@@ -93,15 +126,15 @@
if (isWatch()) {
device.wait(Until.hasObject(POPUP_TITLE_WATCH_SELECTOR), WAIT_DIALOG_TIMEOUT_IN_MS);
final UiObject2 title = device.findObject(POPUP_TITLE_WATCH_SELECTOR);
- assertNotNull("Policy transparency dialog title not found", title);
+ assertWithMessage("Policy transparency dialog title").that(title).isNotNull();
title.swipe(Direction.RIGHT, 1.0f);
} else {
device.wait(Until.hasObject(getPopUpImageSelector()), WAIT_DIALOG_TIMEOUT_IN_MS);
final UiObject2 icon = device.findObject(getPopUpImageSelector());
- assertNotNull("Policy transparency dialog icon not found", icon);
+ assertWithMessage("Policy transparency dialog icon").that(icon).isNotNull();
// "OK" button only present in the dialog if it is blocked by policy.
final UiObject2 button = device.findObject(getPopUpButtonSelector());
- assertNotNull("OK button not found", button);
+ assertWithMessage("OK button").that(button).isNotNull();
button.click();
}
}
@@ -111,7 +144,7 @@
device.wait(Until.hasObject(SUSPEND_BUTTON_SELECTOR), WAIT_DIALOG_TIMEOUT_IN_MS);
final UiObject2 button = device.findObject(SUSPEND_BUTTON_SELECTOR);
- assertNotNull("OK button not found", button);
+ assertWithMessage("OK button").that(button).isNotNull();
}
private boolean isWatch() {
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java
index f47f5a2..7c89468 100644
--- a/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/src/com/android/cts/profileowner/BaseProfileOwnerTest.java
@@ -19,13 +19,32 @@
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.test.AndroidTestCase;
+import android.util.Log;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import com.android.cts.devicepolicy.OperationSafetyChangedCallback;
+import com.android.cts.devicepolicy.OperationSafetyChangedEvent;
public abstract class BaseProfileOwnerTest extends AndroidTestCase {
public static class BasicAdminReceiver extends DeviceAdminReceiver {
+
+ @Override
+ public void onOperationSafetyStateChanged(Context context, int reason, boolean isSafe) {
+ OperationSafetyChangedEvent event = new OperationSafetyChangedEvent(reason, isSafe);
+ Log.d(TAG, "onOperationSafetyStateChanged() on user " + context.getUserId() + ": "
+ + event);
+
+ Intent intent = OperationSafetyChangedCallback.intentFor(event);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+ }
}
+ private static final String TAG = BaseProfileOwnerTest.class.getSimpleName();
+
public static final String PACKAGE_NAME = BaseProfileOwnerTest.class.getPackage().getName();
protected DevicePolicyManager mDevicePolicyManager;
diff --git a/hostsidetests/devicepolicy/app/common/src/com/android/cts/devicepolicy/DevicePolicySafetyCheckerIntegrationTester.java b/hostsidetests/devicepolicy/app/common/src/com/android/cts/devicepolicy/DevicePolicySafetyCheckerIntegrationTester.java
index 1dbac7d..0e53817 100644
--- a/hostsidetests/devicepolicy/app/common/src/com/android/cts/devicepolicy/DevicePolicySafetyCheckerIntegrationTester.java
+++ b/hostsidetests/devicepolicy/app/common/src/com/android/cts/devicepolicy/DevicePolicySafetyCheckerIntegrationTester.java
@@ -169,10 +169,12 @@
// Must force OneTimeSafetyChecker to generate the event by calling the unsafe operation
assertThrows(UnsafeStateException.class, () -> dpm.lockNow());
+ Log.d(TAG, "Waiting isSafe=false event");
assertNextEvent(receiver, reason, /* isSafe= */ false);
// OneTimeSafetyChecker automatically disables itself after one operation, which in turn
// triggers another event
+ Log.d(TAG, "Waiting isSafe=true event");
assertNextEvent(receiver, reason, /* isSafe= */ true);
} finally {
receiver.unregister(context);
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDeviceOwnerTest.java
index 6bbe6c8..0c01de9 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDeviceOwnerTest.java
@@ -42,25 +42,17 @@
installAppAsUser(DEVICE_OWNER_APK, mDeviceOwnerUserId);
mDeviceOwnerSet = setDeviceOwner(DEVICE_OWNER_COMPONENT, mDeviceOwnerUserId,
- /*expectFailure*/ false);
+ /*expectFailure= */ false);
if (!mDeviceOwnerSet) {
removeAdmin(DEVICE_OWNER_COMPONENT, mDeviceOwnerUserId);
getDevice().uninstallPackage(DEVICE_OWNER_PKG);
- fail("Failed to set device owner for user " + mDeviceOwnerUserId);
+ fail("Failed to set device owner on user " + mDeviceOwnerUserId);
}
if (isHeadlessSystemUserMode()) {
affiliateUsers(DEVICE_OWNER_PKG, mDeviceOwnerUserId, mPrimaryUserId);
-
- // TODO(b/176993670): INTERACT_ACROSS_USERS is needd by DevicePolicyManagerWrapper to
- // get the current user; the permission is available on mDeviceOwnerUserId because it
- // was installed with -g, but not on mPrimaryUserId as the app is intalled by code
- // (DPMS.manageUserUnchecked(), which don't grant it (as this is a privileged permission
- // that's not available to 3rd party apps). If we get rid of DevicePolicyManagerWrapper,
- // we won't need to grant it anymore.
- executeShellCommand("pm grant --user %d %s android.permission.INTERACT_ACROSS_USERS",
- mPrimaryUserId, DEVICE_OWNER_PKG);
+ grantDpmWrapperPermissions(DEVICE_OWNER_PKG, mPrimaryUserId);
}
// Enable the notification listener
@@ -72,21 +64,13 @@
public void tearDown() throws Exception {
if (mDeviceOwnerSet && !removeAdmin(DEVICE_OWNER_COMPONENT, mDeviceOwnerUserId)) {
// Don't fail as it could hide the real failure from the test method
- CLog.e("Failed to remove device owner for user " + mDeviceOwnerUserId);
+ CLog.e("Failed to remove device owner on user " + mDeviceOwnerUserId);
}
getDevice().uninstallPackage(DEVICE_OWNER_PKG);
super.tearDown();
}
- void affiliateUsers(String deviceAdminPkg, int userId1, int userId2) throws Exception {
- CLog.d("Affiliating users %d and %d on admin package %s", userId1, userId2, deviceAdminPkg);
- runDeviceTestsAsUser(
- deviceAdminPkg, ".AffiliationTest", "testSetAffiliationId1", userId1);
- runDeviceTestsAsUser(
- deviceAdminPkg, ".AffiliationTest", "testSetAffiliationId1", userId2);
- }
-
protected final void executeDeviceOwnerTest(String testClassName) throws Exception {
String testClass = DEVICE_OWNER_PKG + "." + testClassName;
runDeviceTestsAsUser(DEVICE_OWNER_PKG, testClass, mPrimaryUserId);
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
index d178fed..92c4673 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
@@ -16,8 +16,6 @@
package com.android.cts.devicepolicy;
-import static com.android.cts.devicepolicy.DeviceAdminFeaturesCheckerRule.FEATURE_MANAGED_USERS;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -688,7 +686,6 @@
protected final void assumeCanCreateOneManagedUser() throws DeviceNotAvailableException {
assumeSupportsMultiUser();
- assumeHasDeviceFeature(FEATURE_MANAGED_USERS);
assumeCanCreateAdditionalUsers(1);
}
@@ -871,6 +868,16 @@
assertFalse(setDeviceOwner(componentName, userId, /* expectFailure =*/ true));
}
+
+ protected void affiliateUsers(String deviceAdminPkg, int userId1, int userId2)
+ throws Exception {
+ CLog.d("Affiliating users %d and %d on admin package %s", userId1, userId2, deviceAdminPkg);
+ runDeviceTestsAsUser(
+ deviceAdminPkg, ".AffiliationTest", "testSetAffiliationId1", userId1);
+ runDeviceTestsAsUser(
+ deviceAdminPkg, ".AffiliationTest", "testSetAffiliationId1", userId2);
+ }
+
protected String getSettings(String namespace, String name, int userId)
throws DeviceNotAvailableException {
String command = "settings --user " + userId + " get " + namespace + " " + name;
@@ -1179,6 +1186,19 @@
return "true".equalsIgnoreCase(result);
}
+ protected void grantDpmWrapperPermissions(String deviceAdminPkg, int userId) throws Exception {
+ // TODO(b/176993670): INTERACT_ACROSS_USERS is needed by DevicePolicyManagerWrapper to
+ // get the current user; the permission is available on mDeviceOwnerUserId because it
+ // was installed with -g, but not on mPrimaryUserId as the app is intalled by code
+ // (DPMS.manageUserUnchecked(), which don't grant it (as this is a privileged permission
+ // that's not available to 3rd party apps). If we get rid of DevicePolicyManagerWrapper,
+ // we won't need to grant it anymore.
+ CLog.i("Granting INTERACT_ACROSS_USERS to DO %s on user %d as it will need to send ordered "
+ + "broadcasts to user 0", deviceAdminPkg, userId);
+ executeShellCommand("pm grant --user %d %s android.permission.INTERACT_ACROSS_USERS",
+ userId, deviceAdminPkg);
+ }
+
boolean isTv() throws DeviceNotAvailableException {
return hasDeviceFeature(FEATURE_LEANBACK);
}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
index 1973846..902438f 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
@@ -189,7 +189,7 @@
private static final String NOT_CALLED_FROM_PARENT = "notCalledFromParent";
- // ID of the user all tests are run as. For device owner this will be the primary user, for
+ // ID of the user all tests are run as. For device owner this will be the current user, for
// profile owner it is the user id of the created profile.
protected int mUserId;
@@ -448,6 +448,13 @@
"testSensorsRelatedPermissionsNotGrantedViaPolicy");
}
+ @Test
+ public void testStateOfSensorsRelatedPermissionsCannotBeRead() throws Exception {
+ installAppPermissionAppAsUser();
+ executeDeviceTestMethod(".PermissionsTest",
+ "testStateOfSensorsRelatedPermissionsCannotBeRead");
+ }
+
/**
* Require a device for tests that use the network stack. Headless Androids running in
* data centres might need their network rules un-tampered-with in order to keep the ADB / VNC
@@ -1132,12 +1139,13 @@
@FlakyTest(bugId = 141314026)
@Test
public void testSuspendPackage() throws Exception {
+ CLog.i("runTestSuspendPackage() on user %d", mUserId);
+
installAppAsUser(INTENT_SENDER_APK, mUserId);
installAppAsUser(INTENT_RECEIVER_APK, mUserId);
assertMetricsLogged(getDevice(), () -> {
// Suspend a testing package.
- executeDeviceTestMethod(".SuspendPackageTest",
- "testSetPackagesSuspended");
+ executeDeviceTestMethod(".SuspendPackageTest", "testSetPackagesSuspended");
}, new DevicePolicyEventWrapper.Builder(EventId.SET_PACKAGES_SUSPENDED_VALUE)
.setAdminPackageName(DEVICE_ADMIN_PKG)
.setStrings(INTENT_RECEIVER_PKG)
@@ -1158,6 +1166,8 @@
@FlakyTest(bugId = 141314026)
@Test
public void testSuspendPackageWithPackageManager() throws Exception {
+ CLog.i("runTestSuspendPackageWithPackageManager() on user %d", mUserId);
+
installAppAsUser(INTENT_SENDER_APK, mUserId);
installAppAsUser(INTENT_RECEIVER_APK, mUserId);
// Suspend a testing package with the PackageManager
@@ -1934,8 +1944,7 @@
}
private void executeSuspendPackageTestMethod(String testName) throws Exception {
- runDeviceTestsAsUser(INTENT_SENDER_PKG, ".SuspendPackageTest",
- testName, mUserId);
+ runDeviceTestsAsUser(INTENT_SENDER_PKG, ".SuspendPackageTest", testName, mUserId);
}
private void executeAccountTest(String testName) throws DeviceNotAvailableException {
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
index 63b897b..56ee334 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
@@ -665,7 +665,6 @@
@LargeTest
@Test
- @TemporaryIgnoreOnHeadlessSystemUserMode
public void testPackageInstallCache_multiUser() throws Exception {
assumeCanCreateAdditionalUsers(1);
@@ -721,7 +720,6 @@
}
@Test
- @TemporaryIgnoreOnHeadlessSystemUserMode
public void testAirplaneModeRestriction() throws Exception {
executeDeviceOwnerTest("AirplaneModeRestrictionTest");
}
@@ -893,8 +891,6 @@
"testListForegroundAffiliatedUsers_onlyForegroundUser");
}
- // TODO(b/132260693): createAffiliatedSecondaryUser() is failing on headless user
- @TemporaryIgnoreOnHeadlessSystemUserMode
@Test
public void testListForegroundAffiliatedUsers_extraUser() throws Exception {
assumeCanCreateAdditionalUsers(1);
@@ -904,6 +900,7 @@
"testListForegroundAffiliatedUsers_onlyForegroundUser");
}
+ @TemporaryIgnoreOnHeadlessSystemUserMode
@Test
public void testListForegroundAffiliatedUsers_notAffiliated() throws Exception {
assumeCanCreateAdditionalUsers(1);
@@ -914,7 +911,7 @@
"testListForegroundAffiliatedUsers_empty");
}
- // TODO(b/132260693): createAffiliatedSecondaryUser() is failing on headless user
+ // TODO(b/132260693): Instrumentation run failed due to 'Process crashed'
@TemporaryIgnoreOnHeadlessSystemUserMode
@Test
public void testListForegroundAffiliatedUsers_affiliated() throws Exception {
@@ -938,8 +935,15 @@
private int createAffiliatedSecondaryUser() throws Exception {
final int userId = createUser();
installAppAsUser(INTENT_RECEIVER_APK, userId);
- installAppAsUser(DEVICE_OWNER_APK, userId);
- setProfileOwnerOrFail(DEVICE_OWNER_COMPONENT, userId);
+ // For headless system user mode, after DO is setup, PO is already
+ // set on the secondary user. Meanwhile, it requires additional permission while
+ // using DevicePolicyManagerWrapper while using DPM APIs from secondary user.
+ if (!isHeadlessSystemUserMode()) {
+ installAppAsUser(DEVICE_OWNER_APK, userId);
+ setProfileOwnerOrFail(DEVICE_OWNER_COMPONENT, userId);
+ } else {
+ grantDpmWrapperPermissions(DEVICE_OWNER_APK, userId);
+ }
wakeupAndDismissKeyguard();
// Setting the same affiliation ids on both users
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java
index 9a40ff5..2d2c5c8 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java
@@ -16,9 +16,9 @@
package com.android.cts.devicepolicy;
+import static com.android.cts.devicepolicy.DeviceAdminFeaturesCheckerRule.FEATURE_MANAGED_USERS;
import static com.android.cts.devicepolicy.metrics.DevicePolicyEventLogVerifier.assertMetricsLogged;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.platform.test.annotations.FlakyTest;
@@ -27,7 +27,9 @@
import com.android.cts.devicepolicy.metrics.DevicePolicyEventWrapper;
import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.log.LogUtil.CLog;
+import org.junit.AssumptionViolatedException;
import org.junit.Ignore;
import org.junit.Test;
@@ -49,25 +51,31 @@
private static final String ARG_SECURITY_LOGGING_BATCH_NUMBER = "batchNumber";
private static final int SECURITY_EVENTS_BATCH_SIZE = 100;
+ private boolean mDeviceOwnerSet;
+
@Override
public void setUp() throws Exception {
super.setUp();
mUserId = mPrimaryUserId;
- installAppAsUser(DEVICE_ADMIN_APK, mUserId);
- if (!setDeviceOwner(DEVICE_ADMIN_COMPONENT_FLATTENED, mUserId, /*expectFailure*/
- false)) {
+ installAppAsUser(DEVICE_ADMIN_APK, mDeviceOwnerUserId);
+ mDeviceOwnerSet = setDeviceOwner(DEVICE_ADMIN_COMPONENT_FLATTENED, mDeviceOwnerUserId,
+ /*expectFailure= */ false);
+
+ if (!mDeviceOwnerSet) {
removeAdmin(DEVICE_ADMIN_COMPONENT_FLATTENED, mUserId);
getDevice().uninstallPackage(DEVICE_ADMIN_PKG);
- fail("Failed to set device owner");
+ fail("Failed to set device owner on user " + mDeviceOwnerUserId);
}
}
@Override
public void tearDown() throws Exception {
- assertTrue("Failed to remove device owner",
- removeAdmin(DEVICE_ADMIN_COMPONENT_FLATTENED, mUserId));
+ if (mDeviceOwnerSet && !removeAdmin(DEVICE_ADMIN_COMPONENT_FLATTENED, mDeviceOwnerUserId)) {
+ // Don't fail as it could hide the real failure from the test method
+ CLog.e("Failed to remove device owner on user " + mDeviceOwnerUserId);
+ }
super.tearDown();
}
@@ -276,7 +284,6 @@
.build());
}
- @FlakyTest(bugId = 137093665)
@Test
public void testSecurityLoggingWithSingleUser() throws Exception {
// Backup stay awake setting because testGenerateLogs() will turn it off.
@@ -354,6 +361,61 @@
}
@Test
+ public void testSecurityLoggingDelegate() throws Exception {
+ installAppAsUser(DELEGATE_APP_APK, mUserId);
+ try {
+ // Test that the delegate cannot access the logs already
+ runDeviceTestsAsUser(DELEGATE_APP_PKG, ".SecurityLoggingDelegateTest",
+ "testCannotAccessApis", mUserId);
+
+ // Set security logging delegate
+ runDeviceTestsAsUser(DEVICE_ADMIN_PKG, ".SecurityLoggingTest",
+ "testSetDelegateScope_delegationSecurityLogging", mUserId);
+
+ runSecurityLoggingTests(DELEGATE_APP_PKG,
+ ".SecurityLoggingDelegateTest");
+ } finally {
+ // Remove security logging delegate
+ runDeviceTestsAsUser(DEVICE_ADMIN_PKG, ".SecurityLoggingTest",
+ "testSetDelegateScope_noDelegation", mUserId);
+ }
+ }
+
+ private void runSecurityLoggingTests(String packageName, String testClassName)
+ throws Exception {
+ // Backup stay awake setting because testGenerateLogs() will turn it off.
+ final String stayAwake = getDevice().getSetting("global", "stay_on_while_plugged_in");
+ try {
+ // Turn logging on.
+ runDeviceTestsAsUser(packageName, testClassName,
+ "testEnablingSecurityLogging", mUserId);
+ // Reboot to ensure ro.device_owner is set to true in logd and logging is on.
+ rebootAndWaitUntilReady();
+ waitForUserUnlock(mUserId);
+
+ // Generate various types of events on device side and check that they are logged.
+ runDeviceTestsAsUser(packageName, testClassName,
+ "testGenerateLogs", mUserId);
+ getDevice().executeShellCommand("whoami"); // Generate adb command securty event
+ getDevice().executeShellCommand("dpm force-security-logs");
+ runDeviceTestsAsUser(packageName, testClassName,
+ "testVerifyGeneratedLogs", mUserId);
+
+ // Immediately attempting to fetch events again should fail.
+ runDeviceTestsAsUser(packageName, testClassName,
+ "testSecurityLoggingRetrievalRateLimited", mUserId);
+ } finally {
+ // Turn logging off.
+ runDeviceTestsAsUser(packageName, testClassName,
+ "testDisablingSecurityLogging", mUserId);
+ // Restore stay awake setting.
+ if (stayAwake != null) {
+ getDevice().setSetting("global", "stay_on_while_plugged_in", stayAwake);
+ }
+ }
+ }
+
+ @Test
public void testLocationPermissionGrantNotifies() throws Exception {
installAppPermissionAppAsUser();
configureNotificationListener();
@@ -383,12 +445,48 @@
// Skip for now, re-enable when the code path sets DO as able to grant permissions.
}
+ @Override
+ @Test
+ public void testStateOfSensorsRelatedPermissionsCannotBeRead() throws Exception {
+ // Skip because in DO mode the admin can read permission state.
+ }
+
//TODO(b/180413140) Investigate why the test fails on DO mode.
@Override
@Test
public void testPermissionPrompts() throws Exception {
}
+ @Override
+ public void testSuspendPackage() throws Exception {
+ assumeTestIsNotRedundant();
+
+ super.testSuspendPackage();
+ }
+
+ @Override
+ public void testSuspendPackageWithPackageManager() throws Exception {
+ assumeTestIsNotRedundant();
+
+ super.testSuspendPackageWithPackageManager();
+ }
+
+ /**
+ * Checks whether this test should be skipped because it's redundant.
+ *
+ * <p>For example, {@code setPackagesSuspended()} is meaningless when called from device owner
+ * on headless system user mode as that API suspends activities and the system user runs in the
+ * background for that type of user. In real-life, the DPC would only use that API in the PO, so
+ * in theory it wouldn't need to be tested by this class, as it would be tested by
+ * {@link MixedProfileOwnerTest}, but that will only happen if the device supports managed user.
+ */
+ private void assumeTestIsNotRedundant() throws DeviceNotAvailableException {
+ if (isHeadlessSystemUserMode() && hasDeviceFeature(FEATURE_MANAGED_USERS)) {
+ throw new AssumptionViolatedException("Redundant test on headless system user mode "
+ + "because it will be tested by the equivalent PO test");
+ }
+ }
+
private void configureNotificationListener() throws DeviceNotAvailableException {
getDevice().executeShellCommand("cmd notification allow_listener "
+ "com.android.cts.deviceandprofileowner/.NotificationListener");
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedManagedProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedManagedProfileOwnerTest.java
index 4924f00..61ff932 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedManagedProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedManagedProfileOwnerTest.java
@@ -20,10 +20,13 @@
import android.platform.test.annotations.FlakyTest;
import android.platform.test.annotations.LargeTest;
+import android.stats.devicepolicy.EventId;
import com.android.cts.devicepolicy.DeviceAdminFeaturesCheckerRule.RequiresAdditionalFeatures;
import com.android.cts.devicepolicy.annotations.LockSettingsTest;
import com.android.cts.devicepolicy.annotations.PermissionsTest;
+import com.android.cts.devicepolicy.metrics.DevicePolicyEventLogVerifier;
+import com.android.cts.devicepolicy.metrics.DevicePolicyEventWrapper;
import com.android.tradefed.device.DeviceNotAvailableException;
import org.junit.Test;
@@ -139,6 +142,19 @@
executeDeviceTestMethod(".NetworkSlicingStatusTest", "testGetSetNetworkSlicingStatus");
}
+ @Test
+ public void testSetNetworkSlicingStatusLogged() throws Exception {
+ DevicePolicyEventLogVerifier.assertMetricsLogged(getDevice(), () -> {
+ executeDeviceTestMethod(".DevicePolicyLoggingTest",
+ "testSetNetworkSlicingEnabledLogged");
+ }, new DevicePolicyEventWrapper.Builder(EventId.SET_NETWORK_SLICING_ENABLED_VALUE)
+ .setBoolean(true)
+ .build(),
+ new DevicePolicyEventWrapper.Builder(EventId.SET_NETWORK_SLICING_ENABLED_VALUE)
+ .setBoolean(false)
+ .build());
+ }
+
/** VPN tests don't require physical device for managed profile, thus overriding. */
@FlakyTest
@Override
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/OrgOwnedProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/OrgOwnedProfileOwnerTest.java
index a05eab1..556f6ac 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/OrgOwnedProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/OrgOwnedProfileOwnerTest.java
@@ -226,33 +226,58 @@
.build());
}
- @FlakyTest(bugId = 137093665)
@Test
public void testSecurityLogging() throws Exception {
+ installAppAsUser(DEVICE_ADMIN_APK, mPrimaryUserId);
+ testSecurityLoggingOnWorkProfile(DEVICE_ADMIN_PKG, ".SecurityLoggingTest");
+ }
+
+ @Test
+ public void testSecurityLoggingDelegate() throws Exception {
+ installAppAsUser(DELEGATE_APP_APK, mUserId);
+ installAppAsUser(DEVICE_ADMIN_APK, mPrimaryUserId);
+ try {
+ runDeviceTestsAsUser(DELEGATE_APP_PKG, ".WorkProfileSecurityLoggingDelegateTest",
+ "testCannotAccessApis", mUserId);
+ // Set security logging delegate
+ runDeviceTestsAsUser(DEVICE_ADMIN_PKG, ".SecurityLoggingTest",
+ "testSetDelegateScope_delegationSecurityLogging", mUserId);
+
+ testSecurityLoggingOnWorkProfile(DELEGATE_APP_PKG,
+ ".WorkProfileSecurityLoggingDelegateTest");
+ } finally {
+ // Remove security logging delegate
+ runDeviceTestsAsUser(DEVICE_ADMIN_PKG, ".SecurityLoggingTest",
+ "testSetDelegateScope_noDelegation", mUserId);
+ }
+ }
+
+ private void testSecurityLoggingOnWorkProfile(String packageName, String testClassName)
+ throws Exception {
// Backup stay awake setting because testGenerateLogs() will turn it off.
final String stayAwake = getDevice().getSetting("global", "stay_on_while_plugged_in");
try {
// Turn logging on.
- runDeviceTestsAsUser(DEVICE_ADMIN_PKG, ".SecurityLoggingTest",
+ runDeviceTestsAsUser(packageName, testClassName,
"testEnablingSecurityLogging", mUserId);
// Reboot to ensure ro.device_owner is set to true in logd and logging is on.
rebootAndWaitUntilReady();
waitForUserUnlock(mUserId);
// Generate various types of events on device side and check that they are logged.
- runDeviceTestsAsUser(DEVICE_ADMIN_PKG,".SecurityLoggingTest",
+ runDeviceTestsAsUser(packageName, testClassName,
"testGenerateLogs", mUserId);
getDevice().executeShellCommand("whoami"); // Generate adb command securty event
getDevice().executeShellCommand("dpm force-security-logs");
- runDeviceTestsAsUser(DEVICE_ADMIN_PKG, ".SecurityLoggingTest",
+ runDeviceTestsAsUser(packageName, testClassName,
"testVerifyGeneratedLogs", mUserId);
// Immediately attempting to fetch events again should fail.
- runDeviceTestsAsUser(DEVICE_ADMIN_PKG, ".SecurityLoggingTest",
+ runDeviceTestsAsUser(packageName, testClassName,
"testSecurityLoggingRetrievalRateLimited", mUserId);
} finally {
// Turn logging off.
- runDeviceTestsAsUser(DEVICE_ADMIN_PKG, ".SecurityLoggingTest",
+ runDeviceTestsAsUser(packageName, testClassName,
"testDisablingSecurityLogging", mUserId);
// Restore stay awake setting.
if (stayAwake != null) {
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
index d4c3c14..4ca9e8d 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ProfileOwnerTest.java
@@ -15,14 +15,19 @@
*/
package com.android.cts.devicepolicy;
+import static com.android.cts.devicepolicy.DeviceAdminFeaturesCheckerRule.FEATURE_MANAGED_USERS;
+
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import com.android.cts.devicepolicy.DeviceAdminFeaturesCheckerRule.RequiresAdditionalFeatures;
+
import org.junit.Test;
/**
* Host side tests for profile owner. Run the CtsProfileOwnerApp device side test.
*/
+@RequiresAdditionalFeatures({FEATURE_MANAGED_USERS})
public class ProfileOwnerTest extends BaseDevicePolicyTest {
private static final String PROFILE_OWNER_PKG = "com.android.cts.profileowner";
private static final String PROFILE_OWNER_APK = "CtsProfileOwnerApp.apk";
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/UserRestrictionsTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/UserRestrictionsTest.java
index 5921d2e..301e1e4 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/UserRestrictionsTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/UserRestrictionsTest.java
@@ -15,8 +15,11 @@
*/
package com.android.cts.devicepolicy;
+import static com.android.cts.devicepolicy.DeviceAdminFeaturesCheckerRule.FEATURE_MANAGED_USERS;
+
import static org.junit.Assert.assertTrue;
+import com.android.cts.devicepolicy.DeviceAdminFeaturesCheckerRule.RequiresAdditionalFeatures;
import com.android.tradefed.device.DeviceNotAvailableException;
import org.junit.Test;
@@ -49,7 +52,6 @@
super.setUp();
mRemoveOwnerInTearDown = false;
- mDeviceOwnerUserId = mPrimaryUserId;
}
@Override
@@ -120,6 +122,7 @@
}
// Checks restrictions for managed profile.
+ @RequiresAdditionalFeatures({FEATURE_MANAGED_USERS})
@Test
public void testUserRestrictions_managedProfileOwnerOnly() throws Exception {
assumeCanCreateOneManagedUser();
@@ -146,9 +149,15 @@
assumeSupportsMultiUser();
setDo();
- // Create another user and set PO.
- final int secondaryUserId = createUserAndWaitStart();
- setPoAsUser(secondaryUserId);
+ final int secondaryUserId;
+ if (!isHeadlessSystemUserMode()) {
+ // Create another user and set PO.
+ secondaryUserId = createUserAndWaitStart();
+ setPoAsUser(secondaryUserId);
+ } else {
+ // In headless system user mode, PO is set on primary user when DO is set
+ secondaryUserId = mPrimaryUserId;
+ }
// Ensure that UserManager differentiates its own restrictions from DO restrictions.
runTests("userrestrictions.DeviceOwnerUserRestrictionsTest",
@@ -210,10 +219,15 @@
public void testUserRestrictions_profileGlobalRestrictionsAsDo() throws Exception {
assumeSupportsMultiUser();
setDo();
-
- // Create another user with PO.
- final int secondaryUserId = createUserAndWaitStart();
- setPoAsUser(secondaryUserId);
+ final int secondaryUserId;
+ if (!isHeadlessSystemUserMode()) {
+ // Create another user and set PO.
+ secondaryUserId = createUserAndWaitStart();
+ setPoAsUser(secondaryUserId);
+ } else {
+ // In headless system user mode, PO is set on primary user when DO is set.
+ secondaryUserId = mPrimaryUserId;
+ }
final int[] usersToCheck = {mDeviceOwnerUserId, secondaryUserId};
@@ -225,6 +239,7 @@
* Managed profile owner sets profile global restrictions (only ENSURE_VERIFY_APPS), should
* affect all users.
*/
+ @RequiresAdditionalFeatures({FEATURE_MANAGED_USERS})
@Test
public void testUserRestrictions_ProfileGlobalRestrictionsAsPo() throws Exception {
assumeCanCreateOneManagedUser();
@@ -265,6 +280,11 @@
setDeviceOwner(DEVICE_ADMIN_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS,
mDeviceOwnerUserId, /*expectFailure*/ false));
mRemoveOwnerInTearDown = true;
+
+ if (isHeadlessSystemUserMode()) {
+ affiliateUsers(DEVICE_ADMIN_PKG, mDeviceOwnerUserId, mPrimaryUserId);
+ grantDpmWrapperPermissions(DEVICE_ADMIN_PKG, mPrimaryUserId);
+ }
}
/**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
index 39cadcb..683dc51 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
@@ -352,10 +352,10 @@
while ((endTime - startTime <= timeoutMillis)) {
if (inputConsole.ready()) {
String line = inputConsole.readLine();
- if (line != null && line.toLowerCase().contains(expectedMessage)) {
+ if (line != null && line.toLowerCase().contains(expectedMessage.toLowerCase())) {
CLog.v("Found " + expectedMessage + " in " + line);
return true;
- } else if (line.toLowerCase().contains(CEC_PORT_BUSY)) {
+ } else if (line.toLowerCase().contains(CEC_PORT_BUSY.toLowerCase())) {
throw new CecPortBusyException();
}
}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecStartupTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecStartupTest.java
index ed2aab3..bab9e65 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecStartupTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecStartupTest.java
@@ -18,8 +18,6 @@
import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assume.assumeTrue;
-
import android.hdmicec.cts.BaseHdmiCecCtsTest;
import android.hdmicec.cts.CecOperand;
import android.hdmicec.cts.HdmiCecConstants;
@@ -27,13 +25,12 @@
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.google.common.collect.ImmutableList;
-
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -62,10 +59,12 @@
List<CecOperand> expectedMessages = Collections.singletonList(
CecOperand.REPORT_PHYSICAL_ADDRESS);
- List<CecOperand> allowedMessages = Arrays.asList(CecOperand.VENDOR_COMMAND, CecOperand.GIVE_DEVICE_VENDOR_ID,
- CecOperand.SET_OSD_NAME, CecOperand.GIVE_OSD_NAME, CecOperand.CEC_VERSION,
- CecOperand.DEVICE_VENDOR_ID, CecOperand.GIVE_POWER_STATUS,
- CecOperand.GET_MENU_LANGUAGE);
+ List<CecOperand> allowedMessages = new ArrayList<>(
+ Arrays.asList(CecOperand.VENDOR_COMMAND, CecOperand.GIVE_DEVICE_VENDOR_ID,
+ CecOperand.SET_OSD_NAME, CecOperand.GIVE_OSD_NAME, CecOperand.CEC_VERSION,
+ CecOperand.DEVICE_VENDOR_ID, CecOperand.GIVE_POWER_STATUS,
+ CecOperand.GET_MENU_LANGUAGE));
+ allowedMessages.addAll(expectedMessages);
device.executeShellCommand("reboot");
device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
@@ -75,6 +74,7 @@
List<CecOperand> notPermittedMessages = messagesReceived.stream()
.filter(message -> !allowedMessages.contains(message))
+ .filter(message -> !expectedMessages.contains(message))
.collect(Collectors.toList());
List<CecOperand> requiredMessages = messagesReceived.stream()
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
index 20921a1..93586ec 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
@@ -111,6 +111,7 @@
String previousPowerControlMode = setPowerControlMode("to_tv");
try {
device.executeShellCommand("input keyevent KEYCODE_HOME");
+ TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
@@ -136,6 +137,7 @@
String previousPowerControlMode = setPowerControlMode("to_tv");
try {
device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+ TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
@@ -161,6 +163,7 @@
String previousPowerControlMode = setPowerControlMode("to_tv");
try {
device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+ TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/targetprep/CecPortDiscoverer.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/targetprep/CecPortDiscoverer.java
index d9a3a25..44693dd 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/targetprep/CecPortDiscoverer.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/targetprep/CecPortDiscoverer.java
@@ -173,13 +173,13 @@
"Caught "
+ e.getClass().getSimpleName()
+ ". "
- + "Could not get adapter mapping.");
+ + "Could not get adapter mapping.", e);
} catch (Exception generic) {
throw new TargetSetupError(
"Caught an exception with message '"
+ generic.getMessage()
+ "'. "
- + "Could not get adapter mapping.");
+ + "Could not get adapter mapping.", generic);
}
throw new TargetSetupError("Device not connected to any adapter!");
}
diff --git a/hostsidetests/incident/src/com/android/server/cts/JobSchedulerIncidentTest.java b/hostsidetests/incident/src/com/android/server/cts/JobSchedulerIncidentTest.java
index 3c807fa..27f2c76 100644
--- a/hostsidetests/incident/src/com/android/server/cts/JobSchedulerIncidentTest.java
+++ b/hostsidetests/incident/src/com/android/server/cts/JobSchedulerIncidentTest.java
@@ -19,6 +19,7 @@
import android.app.job.StopReasonEnum;
import android.net.NetworkCapabilitiesProto;
import android.net.NetworkRequestProto;
+import android.net.Transport;
import com.android.server.job.ConstantsProto;
import com.android.server.job.ConstraintEnum;
import com.android.server.job.DataSetProto;
@@ -228,8 +229,8 @@
private static void testNetworkCapabilitesProto(NetworkCapabilitiesProto nc) throws Exception {
assertNotNull(nc);
- for (NetworkCapabilitiesProto.Transport t : nc.getTransportsList()) {
- assertTrue(NetworkCapabilitiesProto.Transport.getDescriptor().getValues()
+ for (Transport t : nc.getTransportsList()) {
+ assertTrue(Transport.getDescriptor().getValues()
.contains(t.getValueDescriptor()));
}
for (NetworkCapabilitiesProto.NetCapability c : nc.getCapabilitiesList()) {
diff --git a/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InlineSuggestionsRequestDeviceTest.java b/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InlineSuggestionsRequestDeviceTest.java
index e405b0c..1042367 100644
--- a/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InlineSuggestionsRequestDeviceTest.java
+++ b/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InlineSuggestionsRequestDeviceTest.java
@@ -48,14 +48,14 @@
* the regular CTS tests.
*/
@Test
- public void imeAutofillDefaultSupportedLocalesIsEmpty_changeEnabled(){
+ public void imeAutofillDefaultSupportedLocalesIsEmpty_changeEnabled() {
assertTrue(CompatChanges.isChangeEnabled(169273070L));
- InlineSuggestionsRequest request =createInlineSuggestionsRequestWithoutLocale();
+ InlineSuggestionsRequest request = createInlineSuggestionsRequestWithoutLocale();
assertEquals(LocaleList.getEmptyLocaleList(), request.getSupportedLocales());
}
@Test
- public void imeAutofillDefaultSupportedLocalesIsEmpty_changeDisabled(){
+ public void imeAutofillDefaultSupportedLocalesIsEmpty_changeDisabled() {
assertFalse(CompatChanges.isChangeEnabled(169273070L));
InlineSuggestionsRequest request = createInlineSuggestionsRequestWithoutLocale();
assertEquals(LocaleList.getDefault(), request.getSupportedLocales());
diff --git a/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java b/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
index 2d95ca2..4833884 100644
--- a/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
+++ b/hostsidetests/inputmethodservice/deviceside/devicetest/src/android/inputmethodservice/cts/devicetest/InputMethodServiceDeviceTest.java
@@ -16,8 +16,6 @@
package android.inputmethodservice.cts.devicetest;
-import static android.content.Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
-import static android.content.Intent.FLAG_RECEIVER_FOREGROUND;
import static android.inputmethodservice.cts.DeviceEvent.isFrom;
import static android.inputmethodservice.cts.DeviceEvent.isNewerThan;
import static android.inputmethodservice.cts.DeviceEvent.isType;
@@ -39,7 +37,6 @@
import static org.junit.Assert.assertTrue;
import android.content.Context;
-import android.content.Intent;
import android.inputmethodservice.cts.DeviceEvent;
import android.inputmethodservice.cts.common.DeviceEventConstants.DeviceEventType;
import android.inputmethodservice.cts.common.EditTextAppConstants;
diff --git a/hostsidetests/scopedstorage/Android.bp b/hostsidetests/scopedstorage/Android.bp
index 1d8a523..edd6f7a 100644
--- a/hostsidetests/scopedstorage/Android.bp
+++ b/hostsidetests/scopedstorage/Android.bp
@@ -21,6 +21,7 @@
manifest: "ScopedStorageTestHelper/TestAppA.xml",
static_libs: ["cts-scopedstorage-lib"],
sdk_version: "test_current",
+ min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
test_suites: ["device-tests", "mts-mediaprovider", "cts"],
@@ -30,6 +31,7 @@
manifest: "ScopedStorageTestHelper/TestAppB.xml",
static_libs: ["cts-scopedstorage-lib"],
sdk_version: "test_current",
+ min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
test_suites: ["device-tests", "mts-mediaprovider", "cts"],
@@ -39,6 +41,7 @@
manifest: "ScopedStorageTestHelper/TestAppC.xml",
static_libs: ["cts-scopedstorage-lib"],
sdk_version: "test_current",
+ min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
test_suites: ["device-tests", "mts-mediaprovider", "cts"],
@@ -49,6 +52,7 @@
static_libs: ["cts-scopedstorage-lib"],
sdk_version: "test_current",
target_sdk_version: "28",
+ min_sdk_version: "28",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
test_suites: ["device-tests", "mts-mediaprovider", "cts"],
@@ -59,6 +63,7 @@
static_libs: ["cts-scopedstorage-lib"],
sdk_version: "test_current",
target_sdk_version: "28",
+ min_sdk_version: "28",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
test_suites: ["device-tests", "mts-mediaprovider", "cts"],
@@ -69,6 +74,7 @@
manifest: "ScopedStorageTestHelper/TestAppFileManager.xml",
static_libs: ["cts-scopedstorage-lib"],
sdk_version: "test_current",
+ min_sdk_version: "30",
srcs: ["ScopedStorageTestHelper/src/**/*.java"],
// Tag as a CTS artifact
test_suites: ["device-tests", "mts-mediaprovider", "cts"],
@@ -80,6 +86,7 @@
static_libs: ["cts-scopedstorage-lib"],
sdk_version: "test_current",
target_sdk_version: "29",
+ min_sdk_version: "29",
srcs: ["legacy/src/**/*.java"],
}
@@ -89,6 +96,7 @@
static_libs: ["cts-scopedstorage-lib"],
sdk_version: "test_current",
target_sdk_version: "30",
+ min_sdk_version: "30",
srcs: ["legacy/src/**/*.java"],
}
@@ -100,6 +108,7 @@
compile_multilib: "both",
test_suites: ["general-tests", "mts-mediaprovider", "cts"],
sdk_version: "test_current",
+ min_sdk_version: "30",
java_resources: [
":CtsScopedStorageTestAppA",
":CtsScopedStorageTestAppB",
@@ -116,6 +125,7 @@
test_suites: ["general-tests", "mts-mediaprovider", "cts"],
sdk_version: "test_current",
target_sdk_version: "29",
+ min_sdk_version: "30",
java_resources: [
":CtsScopedStorageTestAppA",
]
@@ -161,6 +171,7 @@
compile_multilib: "both",
test_suites: ["device-tests", "mts-mediaprovider", "cts"],
sdk_version: "test_current",
+ min_sdk_version: "30",
libs: ["android.test.base", "android.test.mock", "android.test.runner",],
java_resources: [
":CtsScopedStorageTestAppA",
diff --git a/hostsidetests/scopedstorage/device/AndroidTest.xml b/hostsidetests/scopedstorage/device/AndroidTest.xml
index fb8d2bc..7e6f895 100644
--- a/hostsidetests/scopedstorage/device/AndroidTest.xml
+++ b/hostsidetests/scopedstorage/device/AndroidTest.xml
@@ -32,4 +32,8 @@
<option name="package" value="android.scopedstorage.cts.device" />
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
</test>
+
+ <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
+ <option name="mainline-module-package-name" value="com.google.android.mediaprovider" />
+ </object>
</configuration>
diff --git a/hostsidetests/scopedstorage/device/src/android/scopedstorage/cts/device/ScopedStorageDeviceTest.java b/hostsidetests/scopedstorage/device/src/android/scopedstorage/cts/device/ScopedStorageDeviceTest.java
index 74ccec7..d3c7ccb 100644
--- a/hostsidetests/scopedstorage/device/src/android/scopedstorage/cts/device/ScopedStorageDeviceTest.java
+++ b/hostsidetests/scopedstorage/device/src/android/scopedstorage/cts/device/ScopedStorageDeviceTest.java
@@ -109,6 +109,7 @@
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import android.Manifest;
@@ -151,7 +152,9 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
@@ -2610,6 +2613,124 @@
}
}
+ @Test
+ public void testDeferredScanHidesPartialDatabaseRows() throws Exception {
+ ContentValues values = new ContentValues();
+ values.put(MediaStore.MediaColumns.IS_PENDING, 1);
+ // Insert a pending row
+ final Uri targetUri = getContentResolver().insert(getImageContentUri(), values, null);
+ try (InputStream in =
+ getContext().getResources().openRawResource(R.raw.img_with_metadata)) {
+ try (ParcelFileDescriptor pfd =
+ getContentResolver().openFileDescriptor(targetUri, "w")) {
+ // Write image content to the file
+ FileUtils.copy(in, new ParcelFileDescriptor.AutoCloseOutputStream(pfd));
+ }
+ }
+
+ // Verify that metadata is not updated yet.
+ try (Cursor c = getContentResolver().query(targetUri, new String[] {
+ MediaStore.Images.ImageColumns.DATE_TAKEN}, null, null)) {
+ assertThat(c.moveToFirst()).isTrue();
+ assertThat(c.getString(0)).isNull();
+ }
+ // Get file path to use in the next query().
+ final String imageFilePath = getFilePathFromUri(targetUri);
+
+ values.put(MediaStore.MediaColumns.IS_PENDING, 0);
+ Bundle extras = new Bundle();
+ extras.putBoolean(MediaStore.QUERY_ARG_DEFER_SCAN, true);
+ // Publish the file, but, defer the scan on update().
+ assertThat(getContentResolver().update(targetUri, values, extras)).isEqualTo(1);
+
+ // The update() above can return before scanning is complete. Verify that either we don't
+ // see the file in published files or if the file appears in the collection, it means that
+ // deferred scan is now complete, hence verify metadata is intact.
+ try (Cursor c = getContentResolver().query(getImageContentUri(),
+ new String[] {MediaStore.Images.ImageColumns.DATE_TAKEN},
+ MediaStore.Files.FileColumns.DATA + "=?", new String[] {imageFilePath}, null)) {
+ if (c.getCount() == 1) {
+ // If the file appears in media collection as published file, verify that metadata
+ // is correct.
+ assertThat(c.moveToFirst()).isTrue();
+ assertThat(c.getString(0)).isNotNull();
+ Log.i(TAG, "Verified that deferred scan on " + imageFilePath + " is complete"
+ + " and hence metadata is updated");
+
+ } else {
+ assertThat(c.getCount()).isEqualTo(0);
+ Log.i(TAG, "Verified that " + imageFilePath + " was excluded in default query");
+ }
+ }
+ }
+
+ private void testRedactedUriCommon(Uri uri, Uri redactedUri) {
+ assertEquals(redactedUri.getAuthority(), uri.getAuthority());
+ assertEquals(redactedUri.getScheme(), uri.getScheme());
+ assertNotEquals(redactedUri.getPath(), uri.getPath());
+ assertNotEquals(redactedUri.getPathSegments(), uri.getPathSegments());
+
+ final String uriId = redactedUri.getLastPathSegment();
+ assertThat(uriId.startsWith("RUID")).isTrue();
+ assertEquals(uriId.length(), 36);
+ }
+
+ @Test
+ public void testRedactedUri_single() throws Exception {
+ final File img = stageImageFileWithMetadata(IMAGE_FILE_NAME);
+
+ try {
+ final Uri uri = MediaStore.scanFile(getContentResolver(), img);
+ final Uri redactedUri = MediaStore.getRedactedUri(getContentResolver(), uri);
+ testRedactedUriCommon(uri, redactedUri);
+ } finally {
+ img.delete();
+ }
+ }
+
+ @Test
+ public void testRedactedUri_list() throws Exception {
+ List<Uri> uris = new ArrayList<>();
+ List<File> files = new ArrayList<>();
+
+ try {
+ for (int i = 0; i < 10; i++) {
+ File file = stageImageFileWithMetadata("img_metadata" + String.valueOf(
+ System.nanoTime()) + i + ".jpg");
+ files.add(file);
+ uris.add(MediaStore.scanFile(getContentResolver(), file));
+ }
+
+ final Collection<Uri> redactedUris = MediaStore.getRedactedUri(getContentResolver(),
+ uris);
+ int i = 0;
+ for (Uri redactedUri : redactedUris) {
+ Uri uri = uris.get(i++);
+ testRedactedUriCommon(uri, redactedUri);
+ }
+ } finally {
+ files.forEach(file -> file.delete());
+ }
+ }
+
+ private String getStringFromCursor(Cursor c, String colName) {
+ return c.getString(c.getColumnIndex(colName));
+ }
+
+ private File stageImageFileWithMetadata(String name) throws Exception {
+ final File img = new File(
+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), name);
+
+ try (InputStream in =
+ getContext().getResources().openRawResource(R.raw.img_with_metadata);
+ OutputStream out = new FileOutputStream(img)) {
+ // Dump the image we have to external storage
+ FileUtils.copy(in, out);
+ }
+
+ return img;
+ }
+
private void assertCanWriteAndRead(File file, byte[] data) throws Exception {
// Assert we can write to images/videos
try (FileOutputStream fos = new FileOutputStream(file)) {
diff --git a/hostsidetests/seccomp/app/jni/android_seccomp_cts_app_SeccompDeviceTest.cpp b/hostsidetests/seccomp/app/jni/android_seccomp_cts_app_SeccompDeviceTest.cpp
index 99080a1..7a40949 100644
--- a/hostsidetests/seccomp/app/jni/android_seccomp_cts_app_SeccompDeviceTest.cpp
+++ b/hostsidetests/seccomp/app/jni/android_seccomp_cts_app_SeccompDeviceTest.cpp
@@ -29,8 +29,6 @@
#define ALOGI(...) ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)
#define ALOGE(...) ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)
-#define PER_USER_RANGE 100000
-
/*
* Function: testSyscallBlocked
* Purpose: test that the syscall listed is blocked by seccomp
@@ -79,21 +77,17 @@
}
static jboolean testSetresuidBlocked(JNIEnv *, jobject, jint ruid, jint euid, jint suid) {
- jint userId = getuid() / PER_USER_RANGE;
- jint userRuid = userId * PER_USER_RANGE + ruid;
- jint userEuid = userId * PER_USER_RANGE + euid;
- jint userSuid = userId * PER_USER_RANGE + suid;
-
- return doTestSyscallBlocked([&] {ALOGE("Calling setresuid\n"); setresuid(userRuid, userEuid, userSuid);});
+ return doTestSyscallBlocked([&] {
+ ALOGE("Calling setresuid\n");
+ setresuid(ruid, euid, suid);
+ });
}
static jboolean testSetresgidBlocked(JNIEnv *, jobject, jint rgid, jint egid, jint sgid) {
- jint userId = getuid() / PER_USER_RANGE;
- jint userRgid = userId * PER_USER_RANGE + rgid;
- jint userEgid = userId * PER_USER_RANGE + egid;
- jint userSgid = userId * PER_USER_RANGE + sgid;
-
- return doTestSyscallBlocked([&] {ALOGE("Calling setresgid\n"); setresgid(userRgid, userEgid, userSgid);});
+ return doTestSyscallBlocked([&] {
+ ALOGE("Calling setresgid\n");
+ setresgid(rgid, egid, sgid);
+ });
}
static JNINativeMethod gMethods[] = {
diff --git a/hostsidetests/seccomp/app/src/android/seccomp/cts/app/ZygotePreload.java b/hostsidetests/seccomp/app/src/android/seccomp/cts/app/ZygotePreload.java
index fe6053b..021b56b 100644
--- a/hostsidetests/seccomp/app/src/android/seccomp/cts/app/ZygotePreload.java
+++ b/hostsidetests/seccomp/app/src/android/seccomp/cts/app/ZygotePreload.java
@@ -18,6 +18,7 @@
import android.content.pm.ApplicationInfo;
import android.os.Process;
+import android.os.UserHandle;
import android.util.Log;
public class ZygotePreload implements android.app.ZygotePreload {
@@ -26,38 +27,41 @@
static volatile boolean sResult = false;
static volatile int sStartOfIsolatedRange = -1;
- static private boolean testSetResUidGidBlocked(int rid, int eid, int sid) {
- if (!SeccompDeviceTest.testSetresuidBlocked(rid, eid, sid)) {
- Log.e(TAG, "setresuid( " + Integer.toString(rid) + ","
- + Integer.toString(eid) + "," + Integer.toString(sid) + ")"
- + " is wrongly allowed.");
+ static private boolean testSetResUidGidBlocked(int rid, int eid, int sid,
+ boolean expectBlocked, boolean log) {
+ boolean blocked = SeccompDeviceTest.testSetresuidBlocked(rid, eid, sid);
+ if (blocked != expectBlocked) {
+ if (log) {
+ Log.e(TAG, "setresuid( " + Integer.toString(rid) + ","
+ + Integer.toString(eid) + "," + Integer.toString(sid) + ")"
+ + " is wrongly " + (expectBlocked ? "allowed." : "blocked."));
+ }
return false;
}
- if (!SeccompDeviceTest.testSetresgidBlocked(rid, eid, sid)) {
- Log.e(TAG, "setresguid( " + Integer.toString(rid) + ","
- + Integer.toString(eid) + "," + Integer.toString(sid) + ")"
- + " is wrongly allowed.");
+
+ blocked = SeccompDeviceTest.testSetresgidBlocked(rid, eid, sid);
+ if (blocked != expectBlocked) {
+ if (log) {
+ Log.e(TAG, "setresguid( " + Integer.toString(rid) + ","
+ + Integer.toString(eid) + "," + Integer.toString(sid) + ")"
+ + " is wrongly " + (expectBlocked ? "allowed." : "blocked."));
+ }
return false;
}
return true;
}
- static private boolean testSetResUidGidAllowed(int rid, int eid, int sid) {
- if (SeccompDeviceTest.testSetresuidBlocked(rid, eid, sid)) {
- Log.e(TAG, "setresuid( " + Integer.toString(rid) + ","
- + Integer.toString(eid) + "," + Integer.toString(sid) + ")"
- + " is wrongly blocked.");
- return false;
- }
- if (SeccompDeviceTest.testSetresgidBlocked(rid, eid, sid)) {
- Log.e(TAG, "setresguid( " + Integer.toString(rid) + ","
- + Integer.toString(eid) + "," + Integer.toString(sid) + ")"
- + " is wrongly blocked.");
- return false;
- }
+ static private boolean testSetResUidGidBlocked(int rid, int eid, int sid) {
+ return testSetResUidGidBlocked(rid, eid, sid, true /*expectBlocked */, true /* log */);
+ }
- return true;
+ static private boolean testSetResUidGidAllowed(int rid, int eid, int sid) {
+ return testSetResUidGidBlocked(rid, eid, sid, false /*expectBlocked */, true /* log */);
+ }
+
+ static private boolean testSetResUidGidAllowedNoLog(int rid, int eid, int sid) {
+ return testSetResUidGidBlocked(rid, eid, sid, false /*expectBlocked */, false /* log */);
}
static synchronized public boolean getSeccomptestResult() {
@@ -90,25 +94,35 @@
result &= testSetResUidGidBlocked(0, Process.SYSTEM_UID,
Process.SYSTEM_UID);
- // an app uid
- result &= testSetResUidGidBlocked(Process.FIRST_APPLICATION_UID,
- Process.FIRST_APPLICATION_UID, Process.FIRST_APPLICATION_UID);
- result &= testSetResUidGidBlocked(Process.LAST_APPLICATION_UID,
- Process.LAST_APPLICATION_UID, Process.LAST_APPLICATION_UID);
+ // an app uid for the current user, and another user
+ for (int userId = UserHandle.myUserId(); userId <= UserHandle.myUserId() + 1; userId++) {
+ int appStart = UserHandle.getUid(userId, Process.FIRST_APPLICATION_UID);
+ result &= testSetResUidGidBlocked(appStart, appStart, appStart);
+ int appEnd = UserHandle.getUid(userId, Process.LAST_APPLICATION_UID);
+ result &= testSetResUidGidBlocked(appEnd, appEnd, appEnd);
+ }
- // an isolated process uid
- result &= testSetResUidGidBlocked(Process.FIRST_ISOLATED_UID,
- Process.FIRST_ISOLATED_UID, Process.FIRST_ISOLATED_UID);
- result &= testSetResUidGidBlocked(Process.LAST_ISOLATED_UID, Process.LAST_ISOLATED_UID,
- Process.LAST_ISOLATED_UID);
+ // an isolated process uid for the current user, and another user
+ for (int userId = UserHandle.myUserId(); userId <= UserHandle.myUserId() + 1; userId++) {
+ int regularIsolatedStart = UserHandle.getUid(userId, Process.FIRST_ISOLATED_UID);
+ result &= testSetResUidGidBlocked(regularIsolatedStart, regularIsolatedStart,
+ regularIsolatedStart);
+ int regularIsolatedEnd = UserHandle.getUid(userId, Process.LAST_ISOLATED_UID);
+ result &= testSetResUidGidBlocked(regularIsolatedEnd, regularIsolatedEnd,
+ regularIsolatedEnd);
+ }
// Test all ranges of app zygote UIDs; we don't know here which
// isolated UID is assigned to our process, so we will test all ranges,
// and verify only one is allowed; then have the caller verify that
// this was indeed our allowed range.
- for (int i = Process.FIRST_APP_ZYGOTE_ISOLATED_UID;
- i < Process.LAST_APP_ZYGOTE_ISOLATED_UID; i += Process.NUM_UIDS_PER_APP_ZYGOTE) {
- boolean rangeAllowed = testSetResUidGidAllowed(i, i, i);
+ int isolatedUserStart = UserHandle.getUid(UserHandle.myUserId(),
+ Process.FIRST_APP_ZYGOTE_ISOLATED_UID);
+ int isolatedUserEnd = UserHandle.getUid(UserHandle.myUserId(),
+ Process.LAST_APP_ZYGOTE_ISOLATED_UID);
+
+ for (int i = isolatedUserStart; i < isolatedUserEnd; i += Process.NUM_UIDS_PER_APP_ZYGOTE) {
+ boolean rangeAllowed = testSetResUidGidAllowedNoLog(i, i, i);
if (rangeAllowed) {
if (sStartOfIsolatedRange != -1) {
Log.e(TAG, "Found more than one allowed isolated UID range: "
@@ -137,7 +151,6 @@
}
}
- // one over the range
result &= testSetResUidGidBlocked(Process.LAST_APP_ZYGOTE_ISOLATED_UID + 1,
Process.LAST_APP_ZYGOTE_ISOLATED_UID + 1, Process.LAST_APP_ZYGOTE_ISOLATED_UID + 1);
diff --git a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
index 382c931..707c1a0 100644
--- a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
+++ b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
@@ -239,6 +239,8 @@
File systemSepolicyCilFile = File.createTempFile("plat_sepolicy", ".cil");
systemSepolicyCilFile.deleteOnExit();
+ File fileContextsFile = File.createTempFile("file_contexts", ".txt");
+ fileContextsFile.deleteOnExit();
assertTrue(device.pullFile("/system/etc/selinux/plat_sepolicy.cil", systemSepolicyCilFile));
@@ -246,6 +248,7 @@
secilc.getAbsolutePath(),
"-m", "-M", "true", "-c", "30",
"-o", builtPolicyFile.getAbsolutePath(),
+ "-f", fileContextsFile.getAbsolutePath(),
systemSepolicyCilFile.getAbsolutePath());
pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
pb.redirectErrorStream(true);
diff --git a/hostsidetests/securitybulletin/AndroidTest.xml b/hostsidetests/securitybulletin/AndroidTest.xml
index a6b5c79..bd55c9b 100644
--- a/hostsidetests/securitybulletin/AndroidTest.xml
+++ b/hostsidetests/securitybulletin/AndroidTest.xml
@@ -27,7 +27,6 @@
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true" />
- <option name="test-file-name" value="OomCatcher.apk" />
<option name="test-file-name" value="MainlineModuleDetector.apk" />
<option name="test-file-name" value="hotspot.apk" />
</target_preparer>
diff --git a/hostsidetests/securitybulletin/securityPatch/Bug-115739809/poc.cpp b/hostsidetests/securitybulletin/securityPatch/Bug-115739809/poc.cpp
index 16bafe7..f9d9f63 100755
--- a/hostsidetests/securitybulletin/securityPatch/Bug-115739809/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/Bug-115739809/poc.cpp
@@ -160,6 +160,13 @@
outMsg->body.capture.pointerCaptureEnabled = msg.body.capture.pointerCaptureEnabled;
break;
}
+ case InputMessage::Type::DRAG: {
+ outMsg->body.capture.eventId = msg.body.capture.eventId;
+ outMsg->body.drag.isExiting = msg.body.drag.isExiting;
+ outMsg->body.drag.x = msg.body.drag.x;
+ outMsg->body.drag.y = msg.body.drag.y;
+ break;
+ }
}
}
@@ -223,7 +230,7 @@
InputMessage::Type types[] = {
InputMessage::Type::KEY, InputMessage::Type::MOTION, InputMessage::Type::FINISHED,
- InputMessage::Type::FOCUS, InputMessage::Type::CAPTURE,
+ InputMessage::Type::FOCUS, InputMessage::Type::CAPTURE, InputMessage::Type::DRAG,
};
for (InputMessage::Type type : types) {
bool success = checkMessage(*server, *client, type);
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-2460/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2016-2460/Android.bp
index d1c9c15..c58b94d 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2016-2460/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-2460/Android.bp
@@ -28,6 +28,7 @@
"liblog",
"libmedia",
"libgui",
+ "media_permission-aidl-cpp",
],
ldflags: [
"-fPIE",
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-2460/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2016-2460/poc.cpp
index 83a5cf3..ba4c01b 100755
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2016-2460/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-2460/poc.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include <android/media/permission/Identity.h>
#include <binder/IServiceManager.h>
#include <binder/Parcel.h>
#include <fcntl.h>
@@ -37,8 +38,10 @@
sp<IMediaPlayerService> iMPService =
IMediaPlayerService::asInterface(MeidaPlayerService);
ALOGI("Get iMPService instance, 0x%08lx\n", (unsigned long)iMPService.get());
- sp<IMediaRecorder> recorder =
- iMPService->createMediaRecorder(String16("poc"));
+ media::permission::Identity identity;
+ identity.packageName = "poc";
+
+ sp<IMediaRecorder> recorder = iMPService->createMediaRecorder(identity);
ALOGI("Get recorder instance, 0x%08lx\n", (unsigned long)recorder.get());
const char *fileName = "/sdcard/test";
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/Android.bp
index 2a633da..f41f66d 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-3913/Android.bp
@@ -24,6 +24,7 @@
"libbinder",
"libutils",
"libmedia",
+ "media_permission-aidl-cpp",
],
cppflags: [
"-Wno-unused-parameter",
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-8332/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2016-8332/Android.bp
new file mode 100644
index 0000000..bbe6c7b
--- /dev/null
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-8332/Android.bp
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ *
+ */
+cc_test {
+ name: "CVE-2016-8332",
+ defaults: ["cts_hostsidetests_securitybulletin_defaults"],
+ srcs: [
+ "poc.c",
+ ":cts_hostsidetests_securitybulletin_memutils",
+ ],
+ cflags: [
+ "-DCHECK_OVERFLOW",
+ ],
+ shared_libs: [
+ "libpdfium",
+ ],
+ include_dirs: [
+ "external/pdfium/third_party/libopenjpeg20",
+ ],
+}
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-8332/poc.c b/hostsidetests/securitybulletin/securityPatch/CVE-2016-8332/poc.c
new file mode 100644
index 0000000..86cbaec
--- /dev/null
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-8332/poc.c
@@ -0,0 +1,141 @@
+/**
+ * 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.
+ */
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <string.h>
+#include <stdlib.h>
+#include "openjpeg.h"
+#include "opj_includes.h"
+
+#define REPEATVALUES 100000
+
+unsigned char gStartValues[] = { 0xFF, 0x4F, 0xFF, 0x51, 0x00, 0x2F, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x2E,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x01,
+ 0x01, 0x07, 0x01, 0x01, 0x07, 0x01, 0x01, 0xFF, 0x64, 0x00, 0x23, 0x00,
+ 0x01, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x3A, 0x20, 0x4A, 0x61,
+ 0x73, 0x50, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E,
+ 0x20, 0x31, 0x2E, 0x37, 0x30, 0x30, 0x2E, 0x31, 0xFF, 0x52, 0x00, 0x0C,
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x04, 0x04, 0x00, 0x01, 0xFF, 0x5C,
+ 0x00, 0x13, 0x40, 0x40, 0x48, 0x48, 0x50, 0x48, 0x48, 0x50, 0x48, 0x48,
+ 0x50, 0x48, 0x48, 0x50, 0x48, 0x48, 0x50, 0xFF, 0x5D, 0x00, 0x14, 0x01,
+ 0x40, 0x40, 0x48, 0x48, 0x50, 0x48, 0x48, 0x50, 0x48, 0x48, 0x50, 0x48,
+ 0x48, 0x50, 0x48, 0x48, 0x50, 0xFF, 0x5D, 0x00, 0x14, 0x02, 0x40, 0x40,
+ 0x48, 0x48, 0x50, 0x48, 0x48, 0x50, 0x48, 0x48, 0x50, 0x48, 0x48, 0x50,
+ 0x48, 0x48, 0x50 };
+unsigned int gNumStartValues = sizeof(gStartValues) / sizeof(gStartValues[0]);
+
+unsigned char gRepeatValues[] = { 0xFF, 0x75, 0x00, 0x09, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 };
+unsigned int gNumRepeatValues = sizeof(gRepeatValues)
+ / sizeof(gRepeatValues[0]);
+
+unsigned char gLastValues[] = { 0xFF, 0x75, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00 };
+unsigned int gNumLastValues = sizeof(gLastValues) / sizeof(gLastValues[0]);
+
+typedef struct {
+ char* blob;
+ ssize_t blobSize;
+ ssize_t readPos;
+} applicationContext;
+
+opj_stream_t* allocate_stream(void) {
+ opj_stream_private_t * stream = NULL;
+
+ stream = (opj_stream_private_t*) opj_calloc(1, sizeof(opj_stream_private_t));
+ if (!stream) {
+ return NULL;
+ }
+
+ stream->m_buffer_size = OPJ_J2K_STREAM_CHUNK_SIZE;
+ stream->m_stored_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_STREAM_CHUNK_SIZE);
+ if (!stream->m_stored_data) {
+ opj_free(stream);
+ return NULL;
+ }
+
+ stream->m_current_data = stream->m_stored_data;
+ stream->m_status |= OPJ_STREAM_STATUS_INPUT;
+ stream->m_opj_skip = opj_stream_read_skip;
+ stream->m_opj_seek = opj_stream_read_seek;
+ stream->m_read_fn = opj_stream_default_read;
+ stream->m_write_fn = opj_stream_default_write;
+ stream->m_skip_fn = opj_stream_default_skip;
+ stream->m_seek_fn = opj_stream_default_seek;
+
+ return (opj_stream_t *) stream;
+}
+
+static OPJ_SIZE_T ReadHandler(void *buffer, OPJ_SIZE_T length, void *context) {
+ applicationContext* appContext = (applicationContext*) context;
+ ssize_t count = 0;
+ ssize_t rem = 0;
+ if (!appContext) {
+ return ((OPJ_SIZE_T) - 1);
+ }
+ rem = appContext->blobSize - appContext->readPos;
+ if ((ssize_t) length <= rem) {
+ count = length;
+ } else {
+ count = rem;
+ }
+ memcpy(buffer, &appContext->blob[appContext->readPos], count);
+ appContext->readPos += count;
+ return ((OPJ_SIZE_T) length);
+}
+
+int main(void) {
+ ssize_t offset = 0;
+ unsigned int count = 0;
+ applicationContext sContext;
+ opj_j2k_t* codec = NULL;
+ opj_stream_t* stream = NULL;
+ opj_image_t* image = NULL;
+ opj_stream_private_t* private = NULL;
+ opj_event_mgr_t eventMgr;
+ stream = allocate_stream();
+ private = (opj_stream_private_t*)stream;
+
+ sContext.blobSize = gNumStartValues + REPEATVALUES * gNumRepeatValues
+ + gNumLastValues;
+ sContext.blob = (char*) opj_malloc(sContext.blobSize);
+ if (!sContext.blob) {
+ return EXIT_FAILURE;
+ }
+ memset(sContext.blob, 0, sContext.blobSize);
+
+ memcpy(&sContext.blob[offset], gStartValues, gNumStartValues);
+ offset += gNumStartValues;
+ for (count = 0; count < REPEATVALUES; ++count) {
+ memcpy(&sContext.blob[offset], gRepeatValues, gNumRepeatValues);
+ offset += gNumRepeatValues;
+ }
+ memcpy(&sContext.blob[offset], gLastValues, gNumLastValues);
+ offset += gNumLastValues;
+ sContext.readPos = 0;
+ private->m_read_fn = ReadHandler;
+ private->m_user_data = (void*)&sContext;
+ private->m_user_data_length = sContext.blobSize;
+ private->m_free_user_data_fn = NULL;
+ codec = opj_j2k_create_decompress();
+ opj_set_default_event_handler(&eventMgr);
+ opj_j2k_read_header(private,codec,&image,&eventMgr);
+ opj_free(sContext.blob);
+ return EXIT_SUCCESS;
+}
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2017-0479/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2017-0479/Android.bp
index 99a0d23..ebac024 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2017-0479/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2017-0479/Android.bp
@@ -30,5 +30,6 @@
"libaudioclient",
"libaudioclient_aidl_conversion",
"libaudiofoundation",
+ "media_permission-aidl-cpp",
],
}
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2017-0479/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2017-0479/poc.cpp
index 4a2afcf..1edc8f7 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2017-0479/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2017-0479/poc.cpp
@@ -19,9 +19,10 @@
#include <android/media/BnEffectClient.h>
#include <android/media/IEffect.h>
-#include <media/AudioSystem.h>
-#include <media/AidlConversion.h>
+#include <android/media/permission/Identity.h>
#include <hardware/audio_effect.h>
+#include <media/AidlConversion.h>
+#include <media/AudioSystem.h>
#include <media/IAudioFlinger.h>
using namespace android;
@@ -67,7 +68,7 @@
const int32_t priority = 0;
audio_session_t sessionId = (audio_session_t)(128);
const audio_io_handle_t io = AUDIO_IO_HANDLE_NONE;
- const String16 opPackageName("com.exp.poc");
+ const std::string opPackageName("com.exp.poc");
int32_t id;
int i, enabled;
status_t err;
@@ -79,6 +80,9 @@
pthread_t pt;
const sp<IAudioFlinger> &audioFlinger = AudioSystem::get_audio_flinger();
AudioDeviceTypeAddr device;
+ media::permission::Identity identity;
+ identity.packageName = opPackageName;
+ identity.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(getpid()));
for (i=0; i<100; i++) {
media::CreateEffectRequest request;
@@ -89,8 +93,7 @@
request.output = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(io));
request.sessionId = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(sessionId));
request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(device));
- request.opPackageName = VALUE_OR_RETURN_STATUS(legacy2aidl_String16_string(opPackageName));
- request.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(getpid()));
+ request.identity = identity;
request.probe = false;
media::CreateEffectResponse response;
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2018-9561/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2018-9561/Android.bp
index 86b23dc..821444a 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2018-9561/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2018-9561/Android.bp
@@ -15,6 +15,10 @@
*
*/
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
cc_test {
name: "CVE-2018-9561",
defaults: ["cts_hostsidetests_securitybulletin_defaults"],
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2018-9563/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2018-9563/Android.bp
index f625438..933e770 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2018-9563/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2018-9563/Android.bp
@@ -15,6 +15,10 @@
*
*/
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
cc_test {
name: "CVE-2018-9563",
defaults: ["cts_hostsidetests_securitybulletin_defaults"],
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2014/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2014/Android.bp
index b5a7b99..603130e 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2014/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2014/Android.bp
@@ -15,6 +15,10 @@
*
*/
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
cc_test {
name: "CVE-2019-2014",
defaults: ["cts_hostsidetests_securitybulletin_defaults"],
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2035/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2035/Android.bp
index bd2504e..18c960c 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2035/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2035/Android.bp
@@ -15,6 +15,10 @@
*
*/
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
cc_test {
name: "CVE-2019-2035",
defaults: ["cts_hostsidetests_securitybulletin_defaults"],
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2035/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2035/poc.cpp
index a5dfb29..23489ee 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2035/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2035/poc.cpp
@@ -23,43 +23,6 @@
void rw_init(void);
tNFC_STATUS rw_i93_select(uint8_t* p_uid);
-// borrowed from rw_i93.cc
-enum {
- RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
- RW_I93_STATE_IDLE, /* waiting for upper layer API */
- RW_I93_STATE_BUSY, /* waiting for response from tag */
-
- RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
- RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
- RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
- RW_I93_STATE_FORMAT, /* performing format procedure */
- RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
-
- RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
-};
-
-// borrowed from rw_i93.cc
-enum {
- RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
- RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
- RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
- RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
- RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
-
- RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
- RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
- RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
-
- RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
- RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
- RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
- */
-
- RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
- RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
- RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
-};
-
void GKI_freebuf(void*) {
}
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2040/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2040/poc.cpp
index 384c085..b5eed24 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2040/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2040/poc.cpp
@@ -30,43 +30,6 @@
void GKI_stop_timer(uint8_t) {}
-// borrowed from rw_i93.cc
-enum {
- RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
- RW_I93_STATE_IDLE, /* waiting for upper layer API */
- RW_I93_STATE_BUSY, /* waiting for response from tag */
-
- RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
- RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
- RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
- RW_I93_STATE_FORMAT, /* performing format procedure */
- RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
-
- RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
-};
-
-// borrowed from rw_i93.cc
-enum {
- RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
- RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
- RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
- RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
- RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
-
- RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
- RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
- RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
-
- RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
- RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
- RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
- */
-
- RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
- RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
- RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
-};
-
void GKI_freebuf(void *p_buf __attribute__((unused))) {}
int main() {
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2206/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2206/poc.cpp
index f40a7f2..9d5d712 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2019-2206/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2019-2206/poc.cpp
@@ -30,43 +30,6 @@
void rw_init(void);
tNFC_STATUS rw_i93_select(uint8_t *p_uid);
-// borrowed from rw_i93.cc
-enum {
- RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
- RW_I93_STATE_IDLE, /* waiting for upper layer API */
- RW_I93_STATE_BUSY, /* waiting for response from tag */
-
- RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
- RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
- RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
- RW_I93_STATE_FORMAT, /* performing format procedure */
- RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
-
- RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
-};
-
-// borrowed from rw_i93.cc
-enum {
- RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
- RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
- RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
- RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
- RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
-
- RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
- RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
- RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
-
- RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
- RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
- RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
- */
-
- RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
- RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
- RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
-};
-
void GKI_freebuf(void *p_buf __attribute__((unused))) {}
void GKI_start_timer(uint8_t, int32_t, bool) {}
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0006/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0006/poc.cpp
index e90150e..7d4388b 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0006/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0006/poc.cpp
@@ -34,43 +34,6 @@
tNFC_STATUS rw_i93_select(uint8_t* p_uid);
void* vulnerable_ptr;
-// borrowed from rw_i93.cc
-enum {
- RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
- RW_I93_STATE_IDLE, /* waiting for upper layer API */
- RW_I93_STATE_BUSY, /* waiting for response from tag */
-
- RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
- RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
- RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
- RW_I93_STATE_FORMAT, /* performing format procedure */
- RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
-
- RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
-};
-
-// borrowed from rw_i93.cc
-enum {
- RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
- RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
- RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
- RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
- RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
-
- RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
- RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
- RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
-
- RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
- RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
- RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
- */
-
- RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
- RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
- RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
-};
-
void* GKI_getbuf(uint16_t size) {
void* ptr = malloc(size);
if (size == RW_I93_FORMAT_DATA_LEN) {
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0037/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0037/poc.cpp
index 766ee03..ab796be 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0037/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0037/poc.cpp
@@ -34,43 +34,6 @@
bool kIsInitialized = false;
-// borrowed from rw_i93.cc
-enum {
- RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
- RW_I93_STATE_IDLE, /* waiting for upper layer API */
- RW_I93_STATE_BUSY, /* waiting for response from tag */
-
- RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
- RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
- RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
- RW_I93_STATE_FORMAT, /* performing format procedure */
- RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
-
- RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
-};
-
-// borrowed from rw_i93.cc
-enum {
- RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
- RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
- RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
- RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
- RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
-
- RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
- RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
- RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
-
- RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
- RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
- RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
- */
-
- RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
- RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
- RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
-};
-
static void *(*real_GKI_getbuf)(uint16_t size) = nullptr;
static void (*real_GKI_freebuf)(void *ptr) = nullptr;
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0038/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0038/poc.cpp
index 27acfe3..c18331f 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0038/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0038/poc.cpp
@@ -34,43 +34,6 @@
bool kIsInitialized = false;
-// borrowed from rw_i93.cc
-enum {
- RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
- RW_I93_STATE_IDLE, /* waiting for upper layer API */
- RW_I93_STATE_BUSY, /* waiting for response from tag */
-
- RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
- RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
- RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
- RW_I93_STATE_FORMAT, /* performing format procedure */
- RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
-
- RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
-};
-
-// borrowed from rw_i93.cc
-enum {
- RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
- RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
- RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
- RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
- RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
-
- RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
- RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
- RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
-
- RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
- RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
- RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
- */
-
- RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
- RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
- RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
-};
-
static void *(*real_GKI_getbuf)(uint16_t size) = nullptr;
static void (*real_GKI_freebuf)(void *ptr) = nullptr;
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0039/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0039/poc.cpp
index 6ebc3f3..cba5ff5 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0039/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0039/poc.cpp
@@ -34,43 +34,6 @@
bool kIsInitialized = false;
-// borrowed from rw_i93.cc
-enum {
- RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
- RW_I93_STATE_IDLE, /* waiting for upper layer API */
- RW_I93_STATE_BUSY, /* waiting for response from tag */
-
- RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
- RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
- RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
- RW_I93_STATE_FORMAT, /* performing format procedure */
- RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
-
- RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
-};
-
-// borrowed from rw_i93.cc
-enum {
- RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
- RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
- RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
- RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
- RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
-
- RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
- RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
- RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
-
- RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
- RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
- RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
- */
-
- RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
- RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
- RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
-};
-
static void *(*real_GKI_getbuf)(uint16_t size) = nullptr;
static void (*real_GKI_freebuf)(void *ptr) = nullptr;
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/Android.bp
index f45207f..6fb13ed 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/Android.bp
@@ -15,6 +15,10 @@
*
*/
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
cc_test {
name: "CVE-2020-0243",
defaults: ["cts_hostsidetests_securitybulletin_defaults"],
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0450/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0450/poc.cpp
index 8aeaf19..682fb66 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0450/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0450/poc.cpp
@@ -41,43 +41,6 @@
void *kVulnPtr = nullptr;
uint16_t kVulnSize = 0;
-// borrowed from rw_i93.cc
-enum {
- RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
- RW_I93_STATE_IDLE, /* waiting for upper layer API */
- RW_I93_STATE_BUSY, /* waiting for response from tag */
-
- RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
- RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
- RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
- RW_I93_STATE_FORMAT, /* performing format procedure */
- RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
-
- RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
-};
-
-// borrowed from rw_i93.cc
-enum {
- RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
- RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
- RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
- RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
- RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
-
- RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
- RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
- RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
-
- RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
- RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
- RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
- */
-
- RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
- RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
- RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
-};
-
static tNFC_STATUS (*real_rw_i93_send_cmd_write_single_block)(uint16_t block_number,
uint8_t *p_data) = nullptr;
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/AdbUtils.java b/hostsidetests/securitybulletin/src/android/security/cts/AdbUtils.java
index 76bfeb8..eaba89f 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/AdbUtils.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/AdbUtils.java
@@ -23,6 +23,7 @@
import com.android.ddmlib.IShellOutputReceiver;
import com.android.ddmlib.NullOutputReceiver;
import com.android.ddmlib.CollectingOutputReceiver;
+import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.device.NativeDevice;
import com.android.tradefed.log.LogUtil.CLog;
@@ -49,8 +50,9 @@
import java.util.regex.Pattern;
import java.lang.Thread;
+
import static org.junit.Assert.*;
-import junit.framework.Assert;
+import static org.junit.Assume.*;
public class AdbUtils {
@@ -741,5 +743,9 @@
} catch (JSONException e) {}
}
fail(error.toString());
- }
+ }
+
+ public static void assumeHasNfc(ITestDevice device) throws DeviceNotAvailableException {
+ assumeTrue("nfc not available on device", device.hasFeature("android.hardware.nfc"));
+ }
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2016_8332.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2016_8332.java
new file mode 100644
index 0000000..9d032cd
--- /dev/null
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2016_8332.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.cts;
+
+import android.platform.test.annotations.SecurityTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class CVE_2016_8332 extends SecurityTestCase {
+
+ /**
+ * b/37761553
+ * Vulnerability Behaviour: SIGSEGV in self
+ */
+ @SecurityTest(minPatchLevel = "2017-06")
+ @Test
+ public void testPocCVE_2016_8332() throws Exception {
+ AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2016-8332", null, getDevice());
+ }
+}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9558.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9558.java
index d71ebab..6f1c03f 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9558.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9558.java
@@ -33,6 +33,7 @@
@SecurityTest(minPatchLevel = "2018-12")
@Test
public void testPocCVE_2018_9558() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
String binaryName = "CVE-2018-9558";
String signals[] = {CrashUtils.SIGSEGV, CrashUtils.SIGBUS, CrashUtils.SIGABRT};
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9584.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9584.java
index df21402..5d68ce6 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9584.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9584.java
@@ -32,6 +32,7 @@
@SecurityTest(minPatchLevel = "2019-01")
@Test
public void testPocCVE_2018_9584() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2018-9584", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9585.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9585.java
index bf0ff34..f5d19e4 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9585.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2018_9585.java
@@ -32,6 +32,7 @@
@SecurityTest(minPatchLevel = "2019-01")
@Test
public void testPocCVE_2018_9585() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2018-9585", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2013.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2013.java
index b1899ca..d2f60c7 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2013.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2013.java
@@ -32,6 +32,7 @@
@SecurityTest(minPatchLevel = "2019-03")
@Test
public void testPocCVE_2019_2013() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2019-2013", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2019.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2019.java
index a97c679..cd61170 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2019.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2019.java
@@ -31,6 +31,7 @@
@SecurityTest(minPatchLevel = "2019-03")
@Test
public void testPocCVE_2019_2019() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2019-2019", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2040.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2040.java
index 99a9546..2619ed9 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2040.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2040.java
@@ -31,6 +31,7 @@
@SecurityTest(minPatchLevel = "2019-04")
@Test
public void testPocCVE_2019_2040() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2019-2040", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2099.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2099.java
index 149d385..e20bb5c 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2099.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2099.java
@@ -32,6 +32,7 @@
@SecurityTest(minPatchLevel = "2019-06")
@Test
public void testPocCVE_2019_2099() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2019-2099", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2135.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2135.java
index db98e28..6833243 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2135.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2135.java
@@ -33,6 +33,7 @@
@SecurityTest(minPatchLevel = "2019-08")
@Test
public void testPocCVE_2019_2135() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE_2019_2135", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2206.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2206.java
index 2cda8da..20396ac 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2206.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2206.java
@@ -31,6 +31,7 @@
@SecurityTest(minPatchLevel = "2019-11")
@Test
public void testPocCVE_2019_2206() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2019-2206", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2207.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2207.java
index 6f6c1f4..6f4340c 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2207.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2019_2207.java
@@ -31,6 +31,7 @@
@SecurityTest(minPatchLevel = "2019-11")
@Test
public void testPocCVE_2019_2207() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2019-2207", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0006.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0006.java
index 7b3fb17..efd1e54 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0006.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0006.java
@@ -32,6 +32,7 @@
@SecurityTest(minPatchLevel = "2020-01")
@Test
public void testPocCVE_2020_0006() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2020-0006", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0037.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0037.java
index 4e0a4a6..e624134 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0037.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0037.java
@@ -32,6 +32,7 @@
@SecurityTest(minPatchLevel = "2020-03")
@Test
public void testPocCVE_2020_0037() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2020-0037", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0038.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0038.java
index 6759c30..5731c12 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0038.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0038.java
@@ -32,6 +32,7 @@
@SecurityTest(minPatchLevel = "2020-03")
@Test
public void testPocCVE_2020_0038() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2020-0038", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0039.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0039.java
index f0f3323..7d5ae37 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0039.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0039.java
@@ -32,6 +32,7 @@
@SecurityTest(minPatchLevel = "2020-03")
@Test
public void testPocCVE_2020_0039() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2020-0039", null, getDevice());
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0073.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0073.java
index 6596c74..79826e7 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0073.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0073.java
@@ -34,6 +34,7 @@
@SecurityTest(minPatchLevel = "2020-04")
@Test
public void testPocCVE_2020_0073() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
pocPusher.only64();
String binaryName = "CVE-2020-0073";
String signals[] = {CrashUtils.SIGSEGV, CrashUtils.SIGBUS, CrashUtils.SIGABRT};
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/HostsideOomCatcher.java b/hostsidetests/securitybulletin/src/android/security/cts/HostsideOomCatcher.java
deleted file mode 100644
index d97c4db..0000000
--- a/hostsidetests/securitybulletin/src/android/security/cts/HostsideOomCatcher.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.cts;
-
-import com.android.tradefed.device.CollectingOutputReceiver;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.device.BackgroundDeviceAction;
-
-import android.platform.test.annotations.RootPermissionTest;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Scanner;
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.concurrent.ConcurrentHashMap;
-import com.android.ddmlib.MultiLineReceiver;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.TimeoutException;
-import java.lang.ref.WeakReference;
-
-/**
- * A utility to monitor the device lowmemory state and reboot when low. Without this, tests that
- * cause an OOM can sometimes cause ADB to become unresponsive indefinitely. Usage is to create an
- * instance per instance of SecurityTestCase and call start() and stop() matching to
- * SecurityTestCase setup() and teardown().
- */
-public class HostsideOomCatcher {
-
- private static final String LOG_TAG = "HostsideOomCatcher";
-
- private static final long LOW_MEMORY_DEVICE_THRESHOLD_KB = (long)(1.5 * 1024 * 1024); //1.5GB
- private static Map<String, WeakReference<BackgroundDeviceAction>> oomCatchers =
- new ConcurrentHashMap<>();
- private static Map<String, Long> totalMemories = new ConcurrentHashMap<>();
-
- private boolean isLowMemoryDevice = false;
-
- private SecurityTestCase context;
-
- /**
- * test behavior when oom is detected.
- */
- public enum OomBehavior {
- FAIL_AND_LOG, // normal behavior
- PASS_AND_LOG, // skip tests that oom low memory devices
- FAIL_NO_LOG, // tests that check for oom
- }
- private OomBehavior oomBehavior = OomBehavior.FAIL_AND_LOG; // accessed across threads
- private boolean oomDetected = false; // accessed across threads
-
- public HostsideOomCatcher(SecurityTestCase context) {
- this.context = context;
- }
-
- /**
- * Utility to get the device memory total by reading /proc/meminfo and returning MemTotal
- */
- private static long getMemTotal(ITestDevice device) throws DeviceNotAvailableException {
- // cache device TotalMem to avoid an adb shell for every test.
- String serial = device.getSerialNumber();
- Long totalMemory = totalMemories.get(serial);
- if (totalMemory == null) {
- String memInfo = device.executeShellCommand("cat /proc/meminfo");
- Pattern pattern = Pattern.compile("MemTotal:\\s*(.*?)\\s*[kK][bB]");
- Matcher matcher = pattern.matcher(memInfo);
- if (matcher.find()) {
- totalMemory = Long.parseLong(matcher.group(1));
- } else {
- throw new RuntimeException("Could not get device memory total.");
- }
- Log.logAndDisplay(Log.LogLevel.INFO, LOG_TAG,
- "Device " + serial + " has " + totalMemory + "KB total memory.");
- totalMemories.put(serial, totalMemory);
- }
- return totalMemory;
- }
-
- /**
- * Start the hostside oom catcher thread for the test.
- * Match this call to SecurityTestCase.setup().
- */
- public synchronized void start() throws Exception {
- long totalMemory = getMemTotal(getDevice());
- isLowMemoryDevice = totalMemory < LOW_MEMORY_DEVICE_THRESHOLD_KB;
-
- // reset test oom behavior
- // Devices should fail tests that OOM so that they'll be ran again with --retry.
- // If the test OOMs because previous tests used the memory, it will likely pass
- // on a second try.
- oomBehavior = OomBehavior.FAIL_AND_LOG;
- oomDetected = false;
-
- // Cache OOM detection in separate persistent threads for each device.
- WeakReference<BackgroundDeviceAction> reference =
- oomCatchers.get(getDevice().getSerialNumber());
- BackgroundDeviceAction oomCatcher = null;
- if (reference != null) {
- oomCatcher = reference.get();
- }
- if (oomCatcher == null || !oomCatcher.isAlive() || oomCatcher.isCancelled()) {
- AdbUtils.runCommandLine("am start com.android.cts.oomcatcher/.OomCatcher", getDevice());
-
- oomCatcher = new BackgroundDeviceAction(
- "logcat -c && logcat OomCatcher:V *:S",
- "Oom Catcher background thread",
- getDevice(), new OomReceiver(getDevice()), 0);
-
- oomCatchers.put(getDevice().getSerialNumber(), new WeakReference<>(oomCatcher));
- oomCatcher.start();
- }
- }
-
- /**
- * Stop the hostside oom catcher thread.
- * Match this call to SecurityTestCase.setup().
- */
- public static void stop(String serial) {
- WeakReference<BackgroundDeviceAction> reference = oomCatchers.get(serial);
- if (reference != null) {
- BackgroundDeviceAction oomCatcher = reference.get();
- if (oomCatcher != null) {
- oomCatcher.cancel();
- }
- }
- }
-
- /**
- * Check every test teardown to see if the device oomed during the test.
- */
- public synchronized boolean isOomDetected() {
- return oomDetected;
- }
-
- /**
- * Return the current test behavior for when oom is detected.
- */
- public synchronized OomBehavior getOomBehavior() {
- return oomBehavior;
- }
-
- /**
- * Flag meaning the test will likely fail on devices with low memory.
- */
- public synchronized void setHighMemoryTest() {
- if (isLowMemoryDevice) {
- oomBehavior = OomBehavior.PASS_AND_LOG;
- } else {
- oomBehavior = OomBehavior.FAIL_AND_LOG;
- }
- }
-
- /**
- * Flag meaning the test uses the OOM catcher to fail the test because the test vulnerability
- * intentionally OOMs the device.
- */
- public synchronized void setOomTest() {
- oomBehavior = OomBehavior.FAIL_NO_LOG;
- }
-
- private ITestDevice getDevice() {
- return context.getDevice();
- }
-
- /**
- * Read through logcat to find when the OomCatcher app reports low memory. Once detected, reboot
- * the device to prevent a soft reset with the possiblity of ADB becomming unresponsive.
- */
- class OomReceiver extends MultiLineReceiver {
-
- private ITestDevice device = null;
- private boolean isCancelled = false;
-
- public OomReceiver(ITestDevice device) {
- this.device = device;
- }
-
- @Override
- public void processNewLines(String[] lines) {
- for (String line : lines) {
- if (Pattern.matches(".*Low memory.*", line)) {
- // low memory detected, reboot device to clear memory and pass test
- isCancelled = true;
- Log.logAndDisplay(Log.LogLevel.INFO, LOG_TAG,
- "lowmemorykiller detected; rebooting device.");
- synchronized (HostsideOomCatcher.this) { // synchronized for oomDetected
- oomDetected = true; // set HostSideOomCatcher var
- }
- try {
- device.nonBlockingReboot();
- device.waitForDeviceOnline(60 * 2 * 1000); // 2 minutes
- } catch (Exception e) {
- Log.e(LOG_TAG, e.toString());
- }
- return; // we don't need to process remaining lines in the array
- }
- }
- }
-
- @Override
- public boolean isCancelled() {
- return isCancelled;
- }
- }
-}
-
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/Poc16_05.java b/hostsidetests/securitybulletin/src/android/security/cts/Poc16_05.java
index 39b7ada..0895607 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/Poc16_05.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/Poc16_05.java
@@ -44,7 +44,6 @@
@Test
@SecurityTest(minPatchLevel = "2016-05")
public void testPocCVE_2015_1805() throws Exception {
- getOomCatcher().setHighMemoryTest();
AdbUtils.runPoc("CVE-2015-1805", getDevice(), TIMEOUT_NONDETERMINISTIC);
}
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/Poc16_07.java b/hostsidetests/securitybulletin/src/android/security/cts/Poc16_07.java
index 4367a61..835c1cf 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/Poc16_07.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/Poc16_07.java
@@ -58,7 +58,6 @@
@Test
@SecurityTest(minPatchLevel = "2016-07")
public void testPocCVE_2016_3747() throws Exception {
- getOomCatcher().setHighMemoryTest();
AdbUtils.runPocAssertNoCrashes("CVE-2016-3747", getDevice(), "mediaserver");
}
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/Poc18_04.java b/hostsidetests/securitybulletin/src/android/security/cts/Poc18_04.java
index 44b0d89..dc41d7c 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/Poc18_04.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/Poc18_04.java
@@ -33,7 +33,6 @@
@Test
@SecurityTest(minPatchLevel = "2018-04")
public void testPocCVE_2017_13286() throws Exception {
- getOomCatcher().setHighMemoryTest();
LaunchSomeWhere.launchSomeWhere("CVE_2017_13286", getDevice());
}
@@ -44,7 +43,6 @@
@Test
@SecurityTest(minPatchLevel = "2018-04")
public void testPocCVE_2017_13288() throws Exception {
- getOomCatcher().setHighMemoryTest();
LaunchSomeWhere.launchSomeWhere("CVE_2017_13288", getDevice());
}
@@ -55,7 +53,6 @@
@Test
@SecurityTest(minPatchLevel = "2018-04")
public void testPocCVE_2017_13289() throws Exception {
- getOomCatcher().setHighMemoryTest();
LaunchSomeWhere.launchSomeWhere("CVE_2017_13289", getDevice());
}
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/Poc18_05.java b/hostsidetests/securitybulletin/src/android/security/cts/Poc18_05.java
index 6b51f0a..e3128f1 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/Poc18_05.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/Poc18_05.java
@@ -33,7 +33,6 @@
@Test
@SecurityTest(minPatchLevel = "2018-05")
public void testPocCVE_2017_13315() throws Exception {
- getOomCatcher().setHighMemoryTest();
LaunchSomeWhere.launchSomeWhere("CVE_2017_13315", getDevice());
}
@@ -44,7 +43,6 @@
@Test
@SecurityTest(minPatchLevel = "2018-05")
public void testPocCVE_2017_13312() throws Exception {
- getOomCatcher().setHighMemoryTest();
LaunchSomeWhere.launchSomeWhere("CVE_2017_13312", getDevice());
}
}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/SecurityTestCase.java b/hostsidetests/securitybulletin/src/android/security/cts/SecurityTestCase.java
index 64e9633..5dc4590 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/SecurityTestCase.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/SecurityTestCase.java
@@ -58,7 +58,6 @@
private long kernelStartTime;
- private HostsideOomCatcher oomCatcher = new HostsideOomCatcher(this);
private HostsideMainlineModuleDetector mainlineModuleDetector = new HostsideMainlineModuleDetector(this);
@Rule public TestName testName = new TestName();
@@ -80,7 +79,6 @@
// TODO:(badash@): Watch for other things to track.
// Specifically time when app framework starts
- oomCatcher.start();
sBuildInfo.put(getDevice(), getBuild());
sAbi.put(getDevice(), getAbi());
sTestName.put(getDevice(), testName.getMethodName());
@@ -95,8 +93,6 @@
*/
@After
public void tearDown() throws Exception {
- oomCatcher.stop(getDevice().getSerialNumber());
-
try {
getDevice().waitForDeviceAvailable(90 * 1000);
} catch (DeviceNotAvailableException e) {
@@ -105,27 +101,11 @@
getDevice().waitForDeviceAvailable(30 * 1000);
}
- if (oomCatcher.isOomDetected()) {
- // we don't need to check kernel start time if we intentionally rebooted because oom
- updateKernelStartTime();
- switch (oomCatcher.getOomBehavior()) {
- case FAIL_AND_LOG:
- fail("The device ran out of memory.");
- break;
- case PASS_AND_LOG:
- Log.logAndDisplay(Log.LogLevel.INFO, LOG_TAG, "Skipping test.");
- break;
- case FAIL_NO_LOG:
- fail();
- break;
- }
- } else {
- long deviceTime = getDeviceUptime() + kernelStartTime;
- long hostTime = System.currentTimeMillis() / 1000;
- assertTrue("Phone has had a hard reset", (hostTime - deviceTime) < 2);
+ long deviceTime = getDeviceUptime() + kernelStartTime;
+ long hostTime = System.currentTimeMillis() / 1000;
+ assertTrue("Phone has had a hard reset", (hostTime - deviceTime) < 2);
- // TODO(badash@): add ability to catch runtime restart
- }
+ // TODO(badash@): add ability to catch runtime restart
}
public static IBuildInfo getBuildInfo(ITestDevice device) {
@@ -308,10 +288,6 @@
kernelStartTime = (System.currentTimeMillis() / 1000) - uptime;
}
- public HostsideOomCatcher getOomCatcher() {
- return oomCatcher;
- }
-
/**
* Return true if a module is play managed.
*
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/TestMedia.java b/hostsidetests/securitybulletin/src/android/security/cts/TestMedia.java
index 35e46c7..3d4ae46 100644
--- a/hostsidetests/securitybulletin/src/android/security/cts/TestMedia.java
+++ b/hostsidetests/securitybulletin/src/android/security/cts/TestMedia.java
@@ -111,6 +111,7 @@
@SecurityTest(minPatchLevel = "2020-11")
@Test
public void testPocCVE_2020_0450() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2020-0450", null, getDevice());
}
@@ -166,6 +167,7 @@
@SecurityTest(minPatchLevel = "2019-08")
@Test
public void testPocCVE_2019_2133() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2019-2133", null, getDevice());
}
@@ -176,6 +178,7 @@
@SecurityTest(minPatchLevel = "2019-08")
@Test
public void testPocCVE_2019_2134() throws Exception {
+ AdbUtils.assumeHasNfc(getDevice());
AdbUtils.runPocAssertNoCrashesNotVulnerable("CVE-2019-2134", null, getDevice());
}
@@ -517,7 +520,11 @@
String binaryName = "CVE-2018-9537";
String signals[] = {CrashUtils.SIGSEGV, CrashUtils.SIGBUS, CrashUtils.SIGABRT};
AdbUtils.pocConfig testConfig = new AdbUtils.pocConfig(binaryName, getDevice());
- testConfig.config = new CrashUtils.Config().setProcessPatterns(binaryName);
+ // example of check crash to skip:
+ // Abort message: 'frameworks/av/media/extractors/mkv/MatroskaExtractor.cpp:548 CHECK(mCluster) failed.'
+ testConfig.config = new CrashUtils.Config()
+ .setProcessPatterns(binaryName)
+ .appendAbortMessageExcludes("CHECK\\(.*?\\)");
testConfig.config.setSignals(signals);
AdbUtils.runPocAssertNoCrashesNotVulnerable(testConfig);
}
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v1.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v1.apex
index 7b5758d..3019791 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v1.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v1.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2.apex
index dc2c8c9..258eadc 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_additional_file.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_additional_file.apex
index 3cf8175..f72afda 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_additional_file.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_additional_file.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_additional_folder.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_additional_folder.apex
index 5335818..f9aa433 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_additional_folder.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_additional_folder.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex
index 4f0edff..97da742 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_different_certificate.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_different_certificate.apex
index af89d20..876ca57 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_different_certificate.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_different_certificate.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_different_package_name.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_different_package_name.apex
index 12b85e4..4e801f8 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_different_package_name.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_different_package_name.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_no_hashtree.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_no_hashtree.apex
index 00c0c19..b76f639 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_no_hashtree.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_no_hashtree.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_sdk_target_p.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_sdk_target_p.apex
index 50e77bd..d672bc2 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_sdk_target_p.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_sdk_target_p.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob.apex
index 3bde9ba..bf7d8c4 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob_rot.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob_rot.apex
index 26c3f27..ac0d06e 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob_rot.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob_rot.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex
index 81aaecf..405ed92 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_unsigned_payload.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_unsigned_payload.apex
index d2be4a2..1a524fb 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_unsigned_payload.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_unsigned_payload.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_with_post_install_hook.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_with_post_install_hook.apex
index e1f904e..5d294ae 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_with_post_install_hook.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_with_post_install_hook.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_with_pre_install_hook.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_with_pre_install_hook.apex
index c8aa9d9..3f1cde1 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_with_pre_install_hook.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_with_pre_install_hook.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_without_apk_in_apex.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_without_apk_in_apex.apex
index 41c29bf..cd3e8ba 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_without_apk_in_apex.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_without_apk_in_apex.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_wrong_sha.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_wrong_sha.apex
index 1447e7d..9f30c4f 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_wrong_sha.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v2_wrong_sha.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3.apex
index e538f83..aaa0d36 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3_signed_bob.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3_signed_bob.apex
index 86b418e..fdc764b 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3_signed_bob.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3_signed_bob.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3_signed_bob_rot.apex b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3_signed_bob_rot.apex
index 29a0877..b4bafaf 100644
--- a/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3_signed_bob_rot.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/arm/com.android.apex.cts.shim.v3_signed_bob_rot.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v1.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v1.apex
index 04ec92d..fc2a7f8 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v1.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v1.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2.apex
index ff54789..29daf35 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_additional_file.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_additional_file.apex
index 3cf8175..f72afda 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_additional_file.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_additional_file.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_additional_folder.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_additional_folder.apex
index 5335818..f9aa433 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_additional_folder.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_additional_folder.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex
index 4f0edff..97da742 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_different_certificate.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_different_certificate.apex
index af89d20..876ca57 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_different_certificate.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_different_certificate.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_different_package_name.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_different_package_name.apex
index eca1c37..bf5dee0 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_different_package_name.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_different_package_name.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_no_hashtree.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_no_hashtree.apex
index 19da864..145e974 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_no_hashtree.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_no_hashtree.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_sdk_target_p.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_sdk_target_p.apex
index 6b7436b..458dc15 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_sdk_target_p.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_sdk_target_p.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob.apex
index 659f462..1607d35 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob_rot.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob_rot.apex
index c5e2210..31f08a1 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob_rot.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob_rot.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex
index 3ff88a9..0432704 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_unsigned_payload.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_unsigned_payload.apex
index cd70226..0f10c19 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_unsigned_payload.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_unsigned_payload.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_with_post_install_hook.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_with_post_install_hook.apex
index e1f904e..5d294ae 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_with_post_install_hook.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_with_post_install_hook.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_with_pre_install_hook.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_with_pre_install_hook.apex
index c8aa9d9..3f1cde1 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_with_pre_install_hook.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_with_pre_install_hook.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_without_apk_in_apex.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_without_apk_in_apex.apex
index 41c29bf..cd3e8ba 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_without_apk_in_apex.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_without_apk_in_apex.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_wrong_sha.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_wrong_sha.apex
index 1447e7d..9f30c4f 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_wrong_sha.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v2_wrong_sha.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3.apex
index b3ecef7..57a4e8e 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3_signed_bob.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3_signed_bob.apex
index 9281ee3..fe0be5b 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3_signed_bob.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3_signed_bob.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3_signed_bob_rot.apex b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3_signed_bob_rot.apex
index 23b2378..1bd82d0 100644
--- a/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3_signed_bob_rot.apex
+++ b/hostsidetests/stagedinstall/testdata/apex/x86/com.android.apex.cts.shim.v3_signed_bob_rot.apex
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apk/CtsShimTargetPSdk/arm/CtsShimTargetPSdk.apk b/hostsidetests/stagedinstall/testdata/apk/CtsShimTargetPSdk/arm/CtsShimTargetPSdk.apk
index b6afbd0..e852251 100644
--- a/hostsidetests/stagedinstall/testdata/apk/CtsShimTargetPSdk/arm/CtsShimTargetPSdk.apk
+++ b/hostsidetests/stagedinstall/testdata/apk/CtsShimTargetPSdk/arm/CtsShimTargetPSdk.apk
Binary files differ
diff --git a/hostsidetests/stagedinstall/testdata/apk/CtsShimTargetPSdk/x86/CtsShimTargetPSdk.apk b/hostsidetests/stagedinstall/testdata/apk/CtsShimTargetPSdk/x86/CtsShimTargetPSdk.apk
index b6afbd0..e852251 100644
--- a/hostsidetests/stagedinstall/testdata/apk/CtsShimTargetPSdk/x86/CtsShimTargetPSdk.apk
+++ b/hostsidetests/stagedinstall/testdata/apk/CtsShimTargetPSdk/x86/CtsShimTargetPSdk.apk
Binary files differ
diff --git a/hostsidetests/statsdatom/Android.bp b/hostsidetests/statsdatom/Android.bp
index 28f3e8d..737ff68 100644
--- a/hostsidetests/statsdatom/Android.bp
+++ b/hostsidetests/statsdatom/Android.bp
@@ -34,6 +34,7 @@
"src/**/memory/*.java",
"src/**/net/*.java",
"src/**/notification/*.java",
+ "src/**/perfetto/*.java",
"src/**/permissionstate/*.java",
"src/**/settingsstats/*.java",
"src/**/statsd/*.java",
diff --git a/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java b/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
index b6bd3ef..4afe394 100644
--- a/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
+++ b/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
@@ -42,6 +42,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
@@ -55,7 +56,10 @@
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.cts.util.CtsNetUtils;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.net.wifi.WifiNetworkSuggestion;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
@@ -84,8 +88,11 @@
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
@@ -207,8 +214,13 @@
APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_SCHEDULE_EXACT_ALARM, 107);
APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_FINE_LOCATION_SOURCE, 108);
APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_COARSE_LOCATION_SOURCE, 109);
+ APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_MANAGE_MEDIA, 110);
}
+ private static boolean sWasVerboseLoggingEnabled;
+ private static boolean sWasScanThrottleEnabled;
+ private static boolean sWasWifiEnabled;
+
@Test
// Start the isolated service, which logs an AppBreadcrumbReported atom, and then exit.
public void testIsolatedProcessService() throws Exception {
@@ -917,9 +929,11 @@
* Bring up and generate some traffic on cellular data connection.
*/
@Test
- public void testGenerateMobileTraffic() throws Exception {
+ public void testGenerateMobileTraffic() throws IllegalStateException {
final Context context = InstrumentationRegistry.getContext();
- doGenerateNetworkTraffic(context, NetworkCapabilities.TRANSPORT_CELLULAR);
+ if (!doGenerateNetworkTraffic(context, NetworkCapabilities.TRANSPORT_CELLULAR)) {
+ throw new IllegalStateException("Mobile network is not available.");
+ }
}
// Constants which are locally used by doGenerateNetworkTraffic.
@@ -927,21 +941,42 @@
private static final String HTTPS_HOST_URL =
"https://connectivitycheck.gstatic.com/generate_204";
- private void doGenerateNetworkTraffic(@NonNull Context context,
- @NetworkCapabilities.Transport int transport) throws InterruptedException {
+ /**
+ * Returns a Network given a request. The return value is null if the requested Network is
+ * unavailable, and the caller is responsible for logging the error.
+ */
+ private Network getNetworkFromRequest(@NonNull Context context,
+ @NonNull NetworkRequest request) {
final ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
- final NetworkRequest request = new NetworkRequest.Builder().addCapability(
- NetworkCapabilities.NET_CAPABILITY_INTERNET).addTransportType(transport).build();
final CtsNetUtils.TestNetworkCallback callback = new CtsNetUtils.TestNetworkCallback();
+ ShellIdentityUtils.invokeWithShellPermissions(() -> cm.requestNetwork(request, callback));
+ final Network network;
+ try {
+ network = callback.waitForAvailable();
+ return network;
+ } catch (InterruptedException e) {
+ Log.w(TAG, "Caught an InterruptedException while looking for requested network!");
+ return null;
+ } finally {
+ cm.unregisterNetworkCallback(callback);
+ }
+ }
- // Request network, and make http query when the network is available.
- cm.requestNetwork(request, callback);
-
- // If network is not available, throws IllegalStateException.
- final Network network = callback.waitForAvailable();
+ /**
+ * Attempts to generate traffic on a network for with a given NetworkRequest. Returns true if
+ * successful, and false is unsuccessful.
+ */
+ private boolean doGenerateNetworkTraffic(@NonNull Context context,
+ @NonNull NetworkRequest request) throws IllegalStateException {
+ final ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
+ final Network network = getNetworkFromRequest(context, request);
if (network == null) {
- throw new IllegalStateException("network "
- + NetworkCapabilities.transportNameOf(transport) + " is not available.");
+ // Caller should log an error.
+ return false;
+ }
+ if(!cm.bindProcessToNetwork(network)) {
+ Log.e(TAG, "bindProcessToNetwork Failed!");
+ throw new IllegalStateException("bindProcessToNetwork failed!");
}
final long startTime = SystemClock.elapsedRealtime();
@@ -952,9 +987,352 @@
} catch (Exception e) {
Log.e(TAG, "exerciseRemoteHost failed in " + (SystemClock.elapsedRealtime()
- startTime) + " ms: " + e);
- } finally {
- cm.unregisterNetworkCallback(callback);
}
+ return true;
+ }
+
+ /**
+ * Generates traffic on a network with a given transport.
+ */
+ private boolean doGenerateNetworkTraffic(@NonNull Context context,
+ @NetworkCapabilities.Transport int transport) throws IllegalStateException {
+ final NetworkRequest request = new NetworkRequest.Builder().addCapability(
+ NetworkCapabilities.NET_CAPABILITY_INTERNET).addTransportType(transport).build();
+ return doGenerateNetworkTraffic(context, request);
+ }
+
+ /**
+ * Generates traffic on a network with a given set of OEM managed network capabilities.
+ */
+ private boolean doGenerateOemManagedNetworkTraffic(@NonNull Context context,
+ List<Integer> capabilities)
+ throws IllegalStateException {
+ final NetworkRequest.Builder requestBuilder = new NetworkRequest.Builder().addCapability(
+ NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ for (final Integer capability : capabilities) {
+ requestBuilder.addCapability(capability);
+ }
+ final NetworkRequest request = requestBuilder.build();
+ return doGenerateNetworkTraffic(context, request);
+ }
+
+ /**
+ * Assembles a String representation of a list of NetworkCapabilities.
+ */
+ private String oemManagedCapabilitiesToString(@NonNull List<Integer> capabilities) {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("{");
+ for (final Integer capability : capabilities) {
+ sb.append(NetworkCapabilities.capabilityNameOf(capability) + ", ");
+ }
+ // Must have been an empty set of capabilities.
+ if (sb.length() < 3) {
+ sb.append("}");
+ return sb.toString();
+ }
+ // Replace the trailing ", " with a "}".
+ sb.replace(sb.length()-2, sb.length()-1, "}");
+ return sb.toString();
+ }
+ /**
+ * Checks if a network with a given set of OEM managed capabilities (OEM_PAID, for example) is
+ * avaialable.
+ */
+ private boolean isOemManagedNetworkAvailable(@NonNull Context context,
+ List<Integer> capabilities) {
+ final NetworkRequest.Builder requestBuilder = new NetworkRequest.Builder().addCapability(
+ NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ for (final Integer capability : capabilities) {
+ requestBuilder.addCapability(capability);
+ }
+ final NetworkRequest request = requestBuilder.build();
+ final Network network = getNetworkFromRequest(context, request);
+ if (network == null) {
+ return false;
+ }
+ // There's an OEM managed network already available, so use that.
+ return true;
+ }
+
+ /**
+ * Callback WiFi scan results, on which we can await().
+ */
+ private static class TestScanResultsCallback extends WifiManager.ScanResultsCallback {
+ private final CountDownLatch mCountDownLatch;
+ public boolean onAvailableCalled = false;
+
+ TestScanResultsCallback(CountDownLatch countDownLatch) {
+ mCountDownLatch = countDownLatch;
+ }
+
+ @Override
+ public void onScanResultsAvailable() {
+ onAvailableCalled = true;
+ mCountDownLatch.countDown();
+ }
+ }
+
+ /**
+ * Searches for saved WiFi networks, and returns a set of in-range saved WiFi networks.
+ */
+ private Set<WifiConfiguration> getAvailableSavedNetworks(@NonNull Context context,
+ @NonNull WifiManager wifiManager) throws IllegalStateException {
+ final Set<WifiConfiguration> availableNetworks = new HashSet<WifiConfiguration>();
+ final CountDownLatch countDownLatch = new CountDownLatch(1);
+ final TestScanResultsCallback scanCallback = new TestScanResultsCallback(countDownLatch);
+ final List<WifiConfiguration> savedNetworks = ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.getPrivilegedConfiguredNetworks());
+
+ // If there are no saved networks, we can't connect to WiFi.
+ if(savedNetworks.isEmpty()) {
+ throw new IllegalStateException("Device has no saved WiFi networks.");
+ }
+ setUpOemManagedWifi(wifiManager, savedNetworks);
+ wifiManager.registerScanResultsCallback(context.getMainExecutor(), scanCallback);
+ wifiManager.startScan();
+ try {
+ final boolean didFinish = countDownLatch.await(10, TimeUnit.SECONDS);
+ if (!didFinish) {
+ Log.e(TAG, "Failed to get WiFi scan results: operation timed out.");
+ // Empty list.
+ return availableNetworks;
+ }
+ } catch (InterruptedException e) {
+ Log.w(TAG, "Caught InterruptedException while waiting for WiFi scan results!");
+ return availableNetworks;
+ }
+
+ // ScanResult could refer to Bluetooth or WiFi, so it has to be explicitly stated here.
+ final List<android.net.wifi.ScanResult> scanResults = wifiManager.getScanResults();
+ // Search for a saved network in range.
+ for (final WifiConfiguration savedNetwork : savedNetworks) {
+ for (final android.net.wifi.ScanResult scanResult : scanResults) {
+ if (WifiInfo.sanitizeSsid(savedNetwork.SSID).equals(WifiInfo.sanitizeSsid(
+ scanResult.SSID))) {
+ // We found a saved network that's in range.
+ availableNetworks.add(savedNetwork);
+ }
+ }
+ }
+ if(availableNetworks.isEmpty()) {
+ throw new IllegalStateException("No saved networks in range.");
+ }
+ return availableNetworks;
+ }
+
+ /**
+ * Causes WiFi to disconnect and prevents auto-join from reconnecting.
+ */
+ private void disableNetworksAndDisconnectWifi(@NonNull WifiManager wifiManager,
+ @NonNull List<WifiConfiguration> savedNetworks) {
+ // Disable auto-join for our saved networks, and disconnect from them.
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> {
+ for (final WifiConfiguration savedNetwork : savedNetworks) {
+ wifiManager.disableNetwork(savedNetwork.networkId);
+ }
+ wifiManager.disconnect();
+ });
+ }
+
+ /**
+ * Puts the system back in the state we found it before setUpOemManagedWifi was called.
+ */
+ private void tearDownOemManagedWifi(@NonNull WifiManager wifiManager) {
+ // Put the system back the way we found it.
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.setScanThrottleEnabled(sWasScanThrottleEnabled));
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.setVerboseLoggingEnabled(sWasVerboseLoggingEnabled));
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.setWifiEnabled(sWasWifiEnabled));
+ }
+
+ /**
+ * Builds a suggestion based on a saved WiFi network with a given list of OEM managed
+ * capabilities.
+ */
+ private static WifiNetworkSuggestion.Builder createOemManagedSuggestion(
+ @NonNull WifiConfiguration network, List<Integer> capabilities)
+ throws IllegalStateException {
+ final WifiNetworkSuggestion.Builder suggestionBuilder = new WifiNetworkSuggestion.Builder();
+ for (final Integer capability : capabilities) {
+ switch (capability) {
+ case NetworkCapabilities.NET_CAPABILITY_OEM_PAID:
+ suggestionBuilder.setOemPaid(true);
+ break;
+ case NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE:
+ suggestionBuilder.setOemPrivate(true);
+ break;
+ default:
+ throw new IllegalStateException("Unsupported OEM network capability "
+ + NetworkCapabilities.capabilityNameOf(capability));
+ }
+ }
+ suggestionBuilder.setSsid(WifiInfo.sanitizeSsid(network.SSID));
+ if (network.preSharedKey != null) {
+ if (network.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
+ suggestionBuilder.setWpa2Passphrase(WifiInfo.sanitizeSsid(network.preSharedKey));
+ } else if (network.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SAE)) {
+ suggestionBuilder.setWpa3Passphrase(WifiInfo.sanitizeSsid(network.preSharedKey));
+ } else {
+ throw new IllegalStateException("Saved network has unsupported security type");
+ }
+ } else if (network.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE)) {
+ suggestionBuilder.setIsEnhancedOpen(true);
+ } else if (!network.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
+ throw new IllegalStateException("Saved network has unsupported security type");
+ }
+ suggestionBuilder.setIsHiddenSsid(network.hiddenSSID);
+ return suggestionBuilder;
+ }
+
+ /**
+ * Helper function for testGenerateOemManagedTraffic. Handles bringing up a WiFi network with a
+ * given list of OEM managed capabilities, and generates traffic on said network.
+ */
+ private boolean setWifiOemManagedAndGenerateTraffic(@NonNull Context context,
+ @NonNull WifiManager wifiManager, @NonNull WifiConfiguration network,
+ List<Integer> capabilities) throws IllegalStateException {
+ final WifiNetworkSuggestion.Builder oemSuggestionBuilder =
+ createOemManagedSuggestion(network, capabilities);
+ final WifiNetworkSuggestion oemSuggestion = oemSuggestionBuilder.build();
+
+ final int status = ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.addNetworkSuggestions(Arrays.asList(oemSuggestion)));
+ if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
+ throw new IllegalStateException("Adding WifiNetworkSuggestion failed with "
+ + status);
+ }
+
+ // Wait for the suggestion to go through.
+ CountDownLatch suggestionLatch = new CountDownLatch(1);
+ BroadcastReceiver receiver =
+ registerReceiver(context, suggestionLatch, new IntentFilter(
+ wifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION));
+ PendingIntent pendingSuggestionIntent = PendingIntent.getBroadcast(context, 0,
+ new Intent(wifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION),
+ PendingIntent.FLAG_IMMUTABLE);
+ waitForReceiver(context, 1_000, suggestionLatch, receiver);
+
+ if (isOemManagedNetworkAvailable(context, capabilities)) {
+ if (!doGenerateOemManagedNetworkTraffic(context, capabilities)) {
+ throw new IllegalStateException("Network with "
+ + oemManagedCapabilitiesToString(capabilities) + " is not available.");
+ }
+ } else {
+ // Network didn't come up.
+ Log.e(TAG, "isOemManagedNetworkAvailable reported " + network.SSID + " with "
+ + oemManagedCapabilitiesToString(capabilities) + " is unavailable");
+ wifiManager.removeNetworkSuggestions(Arrays.asList(oemSuggestion));
+ return false;
+ }
+ wifiManager.removeNetworkSuggestions(Arrays.asList(oemSuggestion));
+ return true;
+ }
+
+ /**
+ * Does pre-requisite setup steps for testGenerateOemManagedTraffic via WiFi.
+ */
+ private void setUpOemManagedWifi(@NonNull WifiManager wifiManager,
+ @NonNull List<WifiConfiguration> savedNetworks) {
+ // Get the state the system was in before so we can put it back how we found it.
+ sWasWifiEnabled = ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.isWifiEnabled());
+ sWasVerboseLoggingEnabled = ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.isVerboseLoggingEnabled());
+ sWasScanThrottleEnabled = ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.isScanThrottleEnabled());
+
+ // Turn on the wifi.
+ if (!wifiManager.isWifiEnabled()) {
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.setWifiEnabled(true));
+ }
+
+ // Enable logging and disable scan throttling.
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.setVerboseLoggingEnabled(true));
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> wifiManager.setScanThrottleEnabled(false));
+
+ disableNetworksAndDisconnectWifi(wifiManager, savedNetworks);
+ }
+
+ /**
+ * Brings up WiFi networks with specified combinations of OEM managed network capabilities and
+ * generates traffic on said networks.
+ */
+ private void generateWifiOemManagedTraffic(Context context,
+ List<List<Integer>> untestedCapabilities) {
+ final PackageManager packageManager = context.getPackageManager();
+ final WifiManager wifiManager = context.getSystemService(WifiManager.class);
+ if (!packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)) {
+ // If wifi isn't supported, don't bother trying.
+ Log.w(TAG, "Feature WiFi is unavailable!");
+ return;
+ }
+ final Set<WifiConfiguration> availableNetworks = getAvailableSavedNetworks(context,
+ wifiManager);
+
+ boolean foundGoodNetwork = false;
+ // Try to connect to a saved network in range.
+ for (final WifiConfiguration network : availableNetworks) {
+ // Try each of the OEM network capabilities.
+ for (final List<Integer> untestedCapability : untestedCapabilities) {
+ boolean generatedTraffic = setWifiOemManagedAndGenerateTraffic(context, wifiManager,
+ network, untestedCapability);
+ if (foundGoodNetwork && !generatedTraffic) {
+ // This already worked for a prior capability, so something is wrong.
+ Log.e(TAG, network.SSID + " failed to come up with "
+ + oemManagedCapabilitiesToString(untestedCapability));
+ disableNetworksAndDisconnectWifi(wifiManager, Arrays.asList(network));
+ tearDownOemManagedWifi(wifiManager);
+ throw new IllegalStateException(network.SSID + " failed to come up!");
+ } else if (!generatedTraffic) {
+ // This network didn't work, try another one.
+ break;
+ }
+ foundGoodNetwork = true;
+ disableNetworksAndDisconnectWifi(wifiManager, Arrays.asList(network));
+ }
+ if (foundGoodNetwork) {
+ break;
+ }
+ }
+ tearDownOemManagedWifi(wifiManager);
+ if (foundGoodNetwork == false) {
+ throw new IllegalStateException("Couldn't connect to a good WiFi network!");
+ }
+ }
+
+ /**
+ * Bring up and generate some traffic on OEM managed WiFi network.
+ */
+ @Test
+ public void testGenerateOemManagedTraffic() throws Exception {
+ final Context context = InstrumentationRegistry.getContext();
+
+ final List<List<Integer>> oemCapabilities = new LinkedList<>(List.of(
+ List.of(NetworkCapabilities.NET_CAPABILITY_OEM_PAID),
+ List.of(NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE),
+ List.of(NetworkCapabilities.NET_CAPABILITY_OEM_PAID,
+ NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE)));
+ final List<List<Integer>> untestedCapabilities = new LinkedList<>(oemCapabilities);
+
+ // In the event an OEM network exists already, use that to test.
+ for (final List<Integer> oemCapability : oemCapabilities) {
+ if (isOemManagedNetworkAvailable(context, oemCapability)) {
+ doGenerateOemManagedNetworkTraffic(context,
+ oemCapability);
+ // Don't try to test on WiFi if the network already exists.
+ untestedCapabilities.remove(oemCapability);
+ }
+ }
+ if (untestedCapabilities.isEmpty()) return;
+
+ // There are capabilities we still need to test, so use WiFi to simulate it.
+ generateWifiOemManagedTraffic(context, untestedCapabilities);
}
/**
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/memory/IonHeapSizeStatsTests.java b/hostsidetests/statsdatom/src/android/cts/statsdatom/memory/SystemMemoryStatsTests.java
similarity index 61%
rename from hostsidetests/statsdatom/src/android/cts/statsdatom/memory/IonHeapSizeStatsTests.java
rename to hostsidetests/statsdatom/src/android/cts/statsdatom/memory/SystemMemoryStatsTests.java
index 3b3ccbe..2bffcc1 100644
--- a/hostsidetests/statsdatom/src/android/cts/statsdatom/memory/IonHeapSizeStatsTests.java
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/memory/SystemMemoryStatsTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 The Android Open Source Project
+ * 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.
@@ -23,7 +23,6 @@
import android.cts.statsdatom.lib.DeviceUtils;
import android.cts.statsdatom.lib.ReportUtils;
-import com.android.compatibility.common.util.PropertyUtil;
import com.android.os.AtomsProto;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.testtype.DeviceTestCase;
@@ -31,7 +30,7 @@
import java.util.List;
-public class IonHeapSizeStatsTests extends DeviceTestCase implements IBuildReceiver {
+public class SystemMemoryStatsTests extends DeviceTestCase implements IBuildReceiver {
private IBuildInfo mCtsBuild;
@Override
@@ -57,39 +56,21 @@
mCtsBuild = buildInfo;
}
- public void testIonHeapSize_optional() throws Exception {
- if (isIonHeapSizeMandatory()) {
- return;
- }
-
- List<AtomsProto.Atom> atoms = pullIonHeapSizeAsGaugeMetric();
- if (atoms.isEmpty()) {
- // No support.
- return;
- }
- assertIonHeapSize(atoms);
+ public void testSystemMemoryAtom() throws Exception {
+ List<AtomsProto.Atom> atoms = pullSystemMemoryAsGaugeMetric();
+ assertThat(atoms).hasSize(1);
+ AtomsProto.SystemMemory systemMemory = atoms.get(0).getSystemMemory();
+ assertThat(systemMemory.getUnreclaimableSlabKb()).isAtLeast(0);
+ assertThat(systemMemory.getVmallocUsedKb()).isAtLeast(0);
+ assertThat(systemMemory.getPageTablesKb()).isAtLeast(0);
+ assertThat(systemMemory.getKernelStackKb()).isAtLeast(0);
}
- public void testIonHeapSize_mandatory() throws Exception {
- if (!isIonHeapSizeMandatory()) {
- return;
- }
-
- List<AtomsProto.Atom> atoms = pullIonHeapSizeAsGaugeMetric();
- assertIonHeapSize(atoms);
- }
-
- /** Returns whether IonHeapSize atom is supported. */
- private boolean isIonHeapSizeMandatory() throws Exception {
- // Support is guaranteed by libmeminfo VTS.
- return PropertyUtil.getFirstApiLevel(getDevice()) >= 30;
- }
-
- /** Returns IonHeapSize atoms pulled as a simple gauge metric while test app is running. */
- private List<AtomsProto.Atom> pullIonHeapSizeAsGaugeMetric() throws Exception {
- // Get IonHeapSize as a simple gauge metric.
+ /** Returns SystemMemory atoms pulled as a simple gauge metric while test app is running. */
+ private List<AtomsProto.Atom> pullSystemMemoryAsGaugeMetric() throws Exception {
+ // Get SystemMemory as a simple gauge metric.
ConfigUtils.uploadConfigForPulledAtom(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG,
- AtomsProto.Atom.ION_HEAP_SIZE_FIELD_NUMBER);
+ AtomsProto.Atom.SYSTEM_MEMORY_FIELD_NUMBER);
// Start test app and trigger a pull while it is running.
try (AutoCloseable a = DeviceUtils.withActivity(getDevice(),
@@ -101,11 +82,4 @@
return ReportUtils.getGaugeMetricAtoms(getDevice());
}
-
- private static void assertIonHeapSize(List<AtomsProto.Atom> atoms) {
- assertThat(atoms).hasSize(1);
- AtomsProto.IonHeapSize ionHeapSize = atoms.get(0).getIonHeapSize();
- assertThat(ionHeapSize.getTotalSizeKb()).isAtLeast(0);
- }
-
}
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/net/BytesTransferredTest.java b/hostsidetests/statsdatom/src/android/cts/statsdatom/net/BytesTransferredTest.java
index 8e4ca4d..3bd8a77 100644
--- a/hostsidetests/statsdatom/src/android/cts/statsdatom/net/BytesTransferredTest.java
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/net/BytesTransferredTest.java
@@ -35,7 +35,9 @@
import java.util.List;
public class BytesTransferredTest extends DeviceTestCase implements IBuildReceiver {
+ private static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
private static final String FEATURE_TELEPHONY = "android.hardware.telephony";
+ private static final String FEATURE_WIFI = "android.hardware.wifi";
private IBuildInfo mCtsBuild;
@@ -124,20 +126,43 @@
);
}
+ public void testOemManagedBytesTransfer() throws Throwable {
+ doTestOemManagedBytesTransferThat(Atom.OEM_MANAGED_BYTES_TRANSFER_FIELD_NUMBER, true,
+ (atom) -> {
+ final AtomsProto.OemManagedBytesTransfer data =
+ atom.getOemManagedBytesTransfer();
+ return new TransferredBytes(data.getRxBytes(), data.getTxBytes(),
+ data.getRxPackets(), data.getTxPackets(), data.getUid(),
+ data.getOemManagedType(), data.getTransportType());
+ }
+ );
+ }
+
private static class TransferredBytes {
final long mRxBytes;
final long mTxBytes;
final long mRxPackets;
final long mTxPackets;
final long mAppUid;
+ final long mOemManagedType;
+ final long mTransportType;
public TransferredBytes(
long rxBytes, long txBytes, long rxPackets, long txPackets, long appUid) {
+ this(rxBytes, txBytes, rxPackets, txPackets, appUid, /*oemManagedType=*/-1,
+ /*transportType=*/-1);
+ }
+
+ public TransferredBytes(
+ long rxBytes, long txBytes, long rxPackets, long txPackets, long appUid,
+ long oemManagedType, long transportType) {
mRxBytes = rxBytes;
mTxBytes = txBytes;
mRxPackets = rxPackets;
mTxPackets = txPackets;
mAppUid = appUid;
+ mOemManagedType = oemManagedType;
+ mTransportType = transportType;
}
}
@@ -223,6 +248,67 @@
+ " is not found in " + atoms.size() + " atoms.").that(foundAppStats).isTrue();
}
+ private void doTestOemManagedBytesTransferThat(int atomId, boolean isUidAtom,
+ ThrowingPredicate<Atom, Exception> p)
+ throws Throwable {
+ /* PANS is for automotive platforms only, and this test relies on WiFi to simulate OEM
+ * managed networks. */
+ if (!DeviceUtils.hasFeature(getDevice(), FEATURE_AUTOMOTIVE)
+ || !DeviceUtils.hasFeature(getDevice(), FEATURE_WIFI)) return;
+
+ // Upload the config.
+ final StatsdConfig.Builder config = ConfigUtils.createConfigBuilder(
+ DeviceUtils.STATSD_ATOM_TEST_PKG);
+ if (isUidAtom) {
+ ConfigUtils.addGaugeMetricForUidAtom(config, atomId, /*uidInAttributionChain=*/false,
+ DeviceUtils.STATSD_ATOM_TEST_PKG);
+ } else {
+ ConfigUtils.addGaugeMetric(config, atomId);
+ }
+ ConfigUtils.uploadConfig(getDevice(), config);
+ // Generate some mobile traffic.
+ DeviceUtils.runDeviceTests(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG, ".AtomTests",
+ "testGenerateOemManagedTraffic");
+ Thread.sleep(AtomTestUtils.WAIT_TIME_SHORT);
+ // Force poll NetworkStatsService to get most updated network stats from lower layer.
+ DeviceUtils.runActivity(getDevice(), DeviceUtils.STATSD_ATOM_TEST_PKG,
+ "PollNetworkStatsActivity",
+ /*actionKey=*/null, /*actionValue=*/null);
+ Thread.sleep(AtomTestUtils.WAIT_TIME_SHORT);
+ // Trigger atom pull.
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice());
+ Thread.sleep(AtomTestUtils.WAIT_TIME_SHORT);
+ final List<Atom> atoms = ReportUtils.getGaugeMetricAtoms(getDevice(),
+ /*checkTimestampTruncated=*/false);
+
+ assertThat(atoms.size()).isAtLeast(2);
+ boolean foundAppStats = false;
+ for (final Atom atom : atoms) {
+ TransferredBytes transferredBytes = p.accept(atom);
+ if (transferredBytes != null) {
+ foundAppStats = true;
+ // Checks that the uid in the atom corresponds to the app uid and checks that the
+ // bytes and packet data are as expected.
+ if (isUidAtom) {
+ final int appUid = DeviceUtils.getAppUid(getDevice(),
+ DeviceUtils.STATSD_ATOM_TEST_PKG);
+ assertThat(transferredBytes.mAppUid).isEqualTo(appUid);
+ }
+ assertDataUsageAtomDataExpected(
+ transferredBytes.mRxBytes, transferredBytes.mTxBytes,
+ transferredBytes.mRxPackets, transferredBytes.mTxPackets);
+
+ // Make sure we have a value for the OEM managed type.
+ assertThat(transferredBytes.mOemManagedType).isGreaterThan(0);
+ // Make sure there's a NetworkTemplate#MATCH_* value for transport_type.
+ assertThat(transferredBytes.mTransportType).isGreaterThan(0);
+ }
+ }
+ assertWithMessage("Data for uid " + DeviceUtils.getAppUid(getDevice(),
+ DeviceUtils.STATSD_ATOM_TEST_PKG)
+ + " is not found in " + atoms.size() + " atoms.").that(foundAppStats).isTrue();
+ }
+
private void assertDataUsageAtomDataExpected(long rxb, long txb, long rxp, long txp) {
assertThat(rxb).isGreaterThan(0L);
assertThat(txb).isGreaterThan(0L);
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/net/OWNERS b/hostsidetests/statsdatom/src/android/cts/statsdatom/net/OWNERS
index f78f90b..913ef27 100644
--- a/hostsidetests/statsdatom/src/android/cts/statsdatom/net/OWNERS
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/net/OWNERS
@@ -1,4 +1,5 @@
# These atom tests are co-owned by statsd and network team
+chrisweir@google.com
jchalard@google.com
jeffreyhuang@google.com
jtnguyen@google.com
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/perfetto/OWNERS b/hostsidetests/statsdatom/src/android/cts/statsdatom/perfetto/OWNERS
new file mode 100644
index 0000000..6458574
--- /dev/null
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/perfetto/OWNERS
@@ -0,0 +1,6 @@
+# These atom tests are owned by the Perfetto team.
+lalitm@google.com
+hjd@google.com
+primiano@google.com
+fmayer@google.com
+rsavitski@google.com
\ No newline at end of file
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/perfetto/PerfettoTests.java b/hostsidetests/statsdatom/src/android/cts/statsdatom/perfetto/PerfettoTests.java
new file mode 100644
index 0000000..3a1871f
--- /dev/null
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/perfetto/PerfettoTests.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.cts.statsdatom.perfetto;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
+
+import com.android.internal.os.StatsdConfigProto;
+import com.android.internal.os.StatsdConfigProto.Alert;
+import com.android.internal.os.StatsdConfigProto.FieldMatcher;
+import com.android.internal.os.StatsdConfigProto.PerfettoDetails;
+import com.android.internal.os.StatsdConfigProto.StatsdConfig;
+import com.android.internal.os.StatsdConfigProto.Subscription;
+import com.android.internal.os.StatsdConfigProto.TimeUnit;
+import com.android.internal.os.StatsdConfigProto.ValueMetric;
+import com.android.os.AtomsProto;
+import com.android.os.AtomsProto.AppBreadcrumbReported;
+import com.android.os.AtomsProto.Atom;
+import com.android.os.AtomsProto.PerfettoTrigger;
+import com.android.os.AtomsProto.PerfettoUploaded;
+import com.android.os.StatsLog.EventMetricData;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.CommandResult;
+import com.android.tradefed.util.CommandStatus;
+
+import com.google.protobuf.ByteString;
+
+import perfetto.protos.PerfettoConfig.DataSourceConfig;
+import perfetto.protos.PerfettoConfig.FtraceConfig;
+import perfetto.protos.PerfettoConfig.TraceConfig;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class PerfettoTests extends DeviceTestCase implements IBuildReceiver {
+
+ private static final int WAIT_AFTER_START_PERFETTO_MS = 2000;
+
+ // Config constants
+ // These were chosen to match the statsd <-> Perfetto CTS integration
+ // test.
+ private static final int APP_BREADCRUMB_REPORTED_MATCH_START_ID = 1;
+ private static final int METRIC_ID = 8;
+ private static final int ALERT_ID = 11;
+ private static final int SUBSCRIPTION_ID_PERFETTO = 42;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ Thread.sleep(AtomTestUtils.WAIT_TIME_LONG);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ super.tearDown();
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ }
+
+ public void testPerfettoUploadedAtoms() throws Exception {
+ if (DeviceUtils.hasFeature(getDevice(), DeviceUtils.FEATURE_WATCH)) return;
+ resetPerfettoGuardrails();
+
+ StatsdConfig.Builder config = getStatsdConfig();
+ ConfigUtils.addEventMetric(config, AtomsProto.Atom.PERFETTO_UPLOADED_FIELD_NUMBER);
+ ConfigUtils.uploadConfig(getDevice(), config);
+
+ startPerfettoTrace();
+ Thread.sleep(WAIT_AFTER_START_PERFETTO_MS);
+
+ // While the trace would not have finished in this time, we expect at least
+ // the trace to have been started.
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
+ assertThat(extractPerfettoUploadedEvents(data))
+ .containsAtLeast(
+ PerfettoUploaded.Event.PERFETTO_TRACE_BEGIN,
+ PerfettoUploaded.Event.PERFETTO_ON_CONNECT,
+ PerfettoUploaded.Event.PERFETTO_TRACED_ENABLE_TRACING,
+ PerfettoUploaded.Event.PERFETTO_TRACED_START_TRACING);
+ }
+
+ public void testPerfettoTriggerAtoms() throws Exception {
+ if (DeviceUtils.hasFeature(getDevice(), DeviceUtils.FEATURE_WATCH)) return;
+
+ StatsdConfig.Builder config = ConfigUtils.createConfigBuilder("AID_SHELL");
+ ConfigUtils.addEventMetric(config, AtomsProto.Atom.PERFETTO_TRIGGER_FIELD_NUMBER);
+ ConfigUtils.uploadConfig(getDevice(), config);
+
+ runTriggerPerfetto();
+ Thread.sleep(AtomTestUtils.WAIT_TIME_LONG);
+
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
+ assertThat(data).hasSize(1);
+ assertThat(extractPerfettoTriggerEvents(data))
+ .containsExactly(
+ PerfettoTrigger.Event.PERFETTO_TRIGGER_PERFETTO_TRIGGER);
+ }
+
+ /**
+ * Returns a protobuf-encoded perfetto config that enables the kernel ftrace tracer with
+ * sched_switch for 10 seconds.
+ */
+ private ByteString getPerfettoConfig() {
+ TraceConfig.Builder builder = TraceConfig.newBuilder();
+
+ TraceConfig.BufferConfig buffer =
+ TraceConfig.BufferConfig.newBuilder().setSizeKb(128).build();
+ builder.addBuffers(buffer);
+
+ FtraceConfig ftraceConfig =
+ FtraceConfig.newBuilder().addFtraceEvents("sched/sched_switch").build();
+ DataSourceConfig dataSourceConfig =
+ DataSourceConfig.newBuilder()
+ .setName("linux.ftrace")
+ .setTargetBuffer(0)
+ .setFtraceConfig(ftraceConfig)
+ .build();
+ TraceConfig.DataSource dataSource =
+ TraceConfig.DataSource.newBuilder().setConfig(dataSourceConfig).build();
+ builder.addDataSources(dataSource);
+
+ builder.setDurationMs(3000);
+ builder.setAllowUserBuildTracing(true);
+
+ TraceConfig.IncidentReportConfig incident =
+ TraceConfig.IncidentReportConfig.newBuilder()
+ .setDestinationPackage("foo.bar.baz")
+ .build();
+ builder.setIncidentReportConfig(incident);
+
+ // To avoid being hit with guardrails firing in multiple test runs back
+ // to back, we set a unique session key for each config.
+ Random random = new Random();
+ StringBuilder sessionNameBuilder = new StringBuilder("statsd-cts-atom-");
+ sessionNameBuilder.append(random.nextInt() & Integer.MAX_VALUE);
+ builder.setUniqueSessionName(sessionNameBuilder.toString());
+
+ return builder.build().toByteString();
+ }
+
+ private List<PerfettoUploaded.Event> extractPerfettoUploadedEvents(
+ List<EventMetricData> input) {
+ List<PerfettoUploaded.Event> output = new ArrayList<>();
+ for (EventMetricData data : input) {
+ output.add(data.getAtom().getPerfettoUploaded().getEvent());
+ }
+ return output;
+ }
+
+ private List<PerfettoTrigger.Event> extractPerfettoTriggerEvents(
+ List<EventMetricData> input) {
+ List<PerfettoTrigger.Event> output = new ArrayList<>();
+ for (EventMetricData data : input) {
+ output.add(data.getAtom().getPerfettoTrigger().getEvent());
+ }
+ return output;
+ }
+
+ /**
+ * Resets the state of the Perfetto guardrails. This avoids that the test fails if it's run too
+ * close of for too many times and hits the upload limit.
+ */
+ private void runTriggerPerfetto() throws Exception {
+ final String cmd = "trigger_perfetto cts.test.trigger";
+ CommandResult cr = getDevice().executeShellV2Command(cmd);
+ if (cr.getStatus() != CommandStatus.SUCCESS)
+ throw new Exception(
+ String.format(
+ "Error while executing %s: %s %s",
+ cmd, cr.getStdout(), cr.getStderr()));
+ }
+
+ /**
+ * Resets the state of the Perfetto guardrails. This avoids that the test fails if it's run too
+ * close of for too many times and hits the upload limit.
+ */
+ private void resetPerfettoGuardrails() throws Exception {
+ final String cmd = "perfetto --reset-guardrails";
+ CommandResult cr = getDevice().executeShellV2Command(cmd);
+ if (cr.getStatus() != CommandStatus.SUCCESS)
+ throw new Exception(
+ String.format(
+ "Error while executing %s: %s %s",
+ cmd, cr.getStdout(), cr.getStderr()));
+ }
+
+ private void startPerfettoTrace() throws Exception {
+ getDevice()
+ .executeShellCommand(
+ String.format(
+ "cmd stats log-app-breadcrumb %d %d",
+ 1, AppBreadcrumbReported.State.START.ordinal()));
+ }
+
+ private final StatsdConfig.Builder getStatsdConfig() throws Exception {
+ return ConfigUtils.createConfigBuilder("AID_NOBODY")
+ .addSubscription(
+ Subscription.newBuilder()
+ .setId(SUBSCRIPTION_ID_PERFETTO)
+ .setRuleType(Subscription.RuleType.ALERT)
+ .setRuleId(ALERT_ID)
+ .setPerfettoDetails(
+ PerfettoDetails.newBuilder()
+ .setTraceConfig(getPerfettoConfig())))
+ .addValueMetric(
+ ValueMetric.newBuilder()
+ .setId(METRIC_ID)
+ .setWhat(APP_BREADCRUMB_REPORTED_MATCH_START_ID)
+ .setBucket(TimeUnit.ONE_MINUTE)
+ // Get the label field's value:
+ .setValueField(
+ FieldMatcher.newBuilder()
+ .setField(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
+ .addChild(
+ FieldMatcher.newBuilder()
+ .setField(
+ AppBreadcrumbReported
+ .LABEL_FIELD_NUMBER))))
+ .addAtomMatcher(
+ StatsdConfigProto.AtomMatcher.newBuilder()
+ .setId(APP_BREADCRUMB_REPORTED_MATCH_START_ID)
+ .setSimpleAtomMatcher(
+ StatsdConfigProto.SimpleAtomMatcher.newBuilder()
+ .setAtomId(
+ Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
+ .addFieldValueMatcher(
+ ConfigUtils.createFvm(
+ AppBreadcrumbReported
+ .STATE_FIELD_NUMBER)
+ .setEqInt(
+ AppBreadcrumbReported.State
+ .START
+ .ordinal()))))
+ .addAlert(
+ Alert.newBuilder()
+ .setId(ALERT_ID)
+ .setMetricId(METRIC_ID)
+ .setNumBuckets(4)
+ .setRefractoryPeriodSecs(0)
+ .setTriggerIfSumGt(0))
+ .addNoReportMetric(METRIC_ID);
+ }
+}
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/UidAtomTests.java b/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/UidAtomTests.java
index f106b84..c2913d0 100644
--- a/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/UidAtomTests.java
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/UidAtomTests.java
@@ -207,7 +207,9 @@
assertThat(atom.getPackageName()).isEqualTo(DeviceUtils.STATSD_ATOM_TEST_PKG);
assertThat(atom.getErrorSource()).isEqualTo(ErrorSource.DATA_APP);
// TODO(b/172866626): add tests for incremental packages that crashed during loading
- assertFalse(atom.getIsPackageLoading());
+ assertFalse(atom.getIsIncremental());
+ assertTrue((1 - atom.getLoadingProgress()) < 0.001);
+ assertEquals(0, atom.getMillisSinceOldestPendingRead());
}
public void testAppCrashOccurredNative() throws Exception {
@@ -233,7 +235,9 @@
assertThat(atom.getPackageName()).isEqualTo(DeviceUtils.STATSD_ATOM_TEST_PKG);
assertThat(atom.getErrorSource()).isEqualTo(ErrorSource.DATA_APP);
// TODO(b/172866626): add tests for incremental packages that crashed during loading
- assertFalse(atom.getIsPackageLoading());
+ assertFalse(atom.getIsIncremental());
+ assertTrue((1 - atom.getLoadingProgress()) < 0.001);
+ assertEquals(0, atom.getMillisSinceOldestPendingRead());
}
@@ -757,7 +761,9 @@
assertThat(atom.getErrorSource()).isEqualTo(ErrorSource.DATA_APP);
assertThat(atom.getPackageName()).isEqualTo(DeviceUtils.STATSD_ATOM_TEST_PKG);
// TODO(b/172866626): add tests for incremental packages that ANR'd during loading
- assertFalse(atom.getIsPackageLoading());
+ assertFalse(atom.getIsIncremental());
+ assertTrue((1 - atom.getLoadingProgress()) < 0.001);
+ assertEquals(0, atom.getMillisSinceOldestPendingRead());
}
public void testWriteRawTestAtom() throws Exception {
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/wifi/OWNERS b/hostsidetests/statsdatom/src/android/cts/statsdatom/wifi/OWNERS
new file mode 100644
index 0000000..6041c68
--- /dev/null
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/wifi/OWNERS
@@ -0,0 +1,4 @@
+# Owners of the WifiLockStateChanged atom
+patrikf@google.com
+saagarp@google.com
+stroshin@google.com
diff --git a/libs/install/Android.bp b/libs/install/Android.bp
index fcb7051..e344bdd 100644
--- a/libs/install/Android.bp
+++ b/libs/install/Android.bp
@@ -168,6 +168,7 @@
static_libs: [
"cts-install-lib-java",
],
+ min_sdk_version: "30",
}
java_library_host {
diff --git a/tests/AlarmManager/AndroidManifest.xml b/tests/AlarmManager/AndroidManifest.xml
index 8e10be6..b09f0a50 100644
--- a/tests/AlarmManager/AndroidManifest.xml
+++ b/tests/AlarmManager/AndroidManifest.xml
@@ -19,7 +19,8 @@
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
- <application android:label="Cts Alarm Manager Test">
+ <application android:label="Cts Alarm Manager Test"
+ android:debuggable="true">
<uses-library android:name="android.test.runner"/>
<receiver android:name=".AlarmReceiver" />
diff --git a/tests/AlarmManager/src/android/alarmmanager/cts/AppStandbyTests.java b/tests/AlarmManager/src/android/alarmmanager/cts/AppStandbyTests.java
index 3b384c2..e26578b 100644
--- a/tests/AlarmManager/src/android/alarmmanager/cts/AppStandbyTests.java
+++ b/tests/AlarmManager/src/android/alarmmanager/cts/AppStandbyTests.java
@@ -136,6 +136,7 @@
mAlarmManagerDeviceConfigStateHelper =
new DeviceConfigStateHelper(DeviceConfig.NAMESPACE_ALARM_MANAGER);
updateAlarmManagerConstants();
+ updateBackgroundSettleTime();
setBatteryCharging(false);
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(TestAlarmReceiver.ACTION_REPORT_ALARM_EXPIRED);
@@ -253,6 +254,7 @@
public void tearDown() throws Exception {
setPowerWhitelisted(false);
setBatteryCharging(true);
+ resetBackgroundSettleTime();
mAlarmManagerDeviceConfigStateHelper.restoreOriginalValues();
final Intent cancelAlarmsIntent = new Intent(TestAlarmScheduler.ACTION_CANCEL_ALL_ALARMS);
cancelAlarmsIntent.setComponent(mAlarmScheduler);
@@ -279,6 +281,15 @@
}
}
+ private void updateBackgroundSettleTime() throws IOException {
+ mUiDevice.executeShellCommand(
+ "settings put global activity_manager_constants background_settle_time=0");
+ }
+
+ private void resetBackgroundSettleTime() throws IOException {
+ mUiDevice.executeShellCommand("settings delete global activity_manager_constants");
+ }
+
private void setPowerWhitelisted(boolean whitelist) throws IOException {
final StringBuffer cmd = new StringBuffer("cmd deviceidle whitelist ");
cmd.append(whitelist ? "+" : "-");
diff --git a/tests/AlarmManager/src/android/alarmmanager/cts/BackgroundRestrictedAlarmsTest.java b/tests/AlarmManager/src/android/alarmmanager/cts/BackgroundRestrictedAlarmsTest.java
index 4257689..ed18226 100644
--- a/tests/AlarmManager/src/android/alarmmanager/cts/BackgroundRestrictedAlarmsTest.java
+++ b/tests/AlarmManager/src/android/alarmmanager/cts/BackgroundRestrictedAlarmsTest.java
@@ -192,7 +192,7 @@
private void updateBackgroundSettleTime() throws IOException {
mUiDevice.executeShellCommand(
- "settings put global activity_manager_constants background_settle_time=100");
+ "settings put global activity_manager_constants background_settle_time=0");
}
private void resetBackgroundSettleTime() throws IOException {
diff --git a/tests/AlarmManager/src/android/alarmmanager/cts/BasicApiTests.java b/tests/AlarmManager/src/android/alarmmanager/cts/BasicApiTests.java
index 95f69ff..dee9b74 100644
--- a/tests/AlarmManager/src/android/alarmmanager/cts/BasicApiTests.java
+++ b/tests/AlarmManager/src/android/alarmmanager/cts/BasicApiTests.java
@@ -107,6 +107,7 @@
mDeviceConfigHelper.set("min_futurity", "0");
mDeviceConfigHelper.set("min_interval", String.valueOf(REPEAT_PERIOD));
+ mDeviceConfigHelper.set("min_window", "0");
}
@After
diff --git a/tests/AlarmManager/src/android/alarmmanager/cts/WhileIdleAlarmsTest.java b/tests/AlarmManager/src/android/alarmmanager/cts/ExactAlarmsTest.java
similarity index 93%
rename from tests/AlarmManager/src/android/alarmmanager/cts/WhileIdleAlarmsTest.java
rename to tests/AlarmManager/src/android/alarmmanager/cts/ExactAlarmsTest.java
index 05bb876..b6db105 100644
--- a/tests/AlarmManager/src/android/alarmmanager/cts/WhileIdleAlarmsTest.java
+++ b/tests/AlarmManager/src/android/alarmmanager/cts/ExactAlarmsTest.java
@@ -56,9 +56,9 @@
@AppModeFull
@RunWith(AndroidJUnit4.class)
-public class WhileIdleAlarmsTest {
+public class ExactAlarmsTest {
/**
- * TODO (b/171306433): Add tests for the following:
+ * TODO (b/182835530): Add more tests for the following:
*
* Pre-S apps can:
* - use setAlarmClock freely -- no temp-allowlist
@@ -66,10 +66,9 @@
* - use setInexactAndAWI with 7 / hr quota with standby-bucket "ACTIVE" and temp-allowlist
*
* S+ apps with permission can:
- * - use setInexactAWI with low quota + standby and no temp-allowlist.
- * - use setInexactAWI with whitelist if in the whitelist.
+ * - use setInexactAWI with low quota + standby and *no* temp-allowlist.
*/
- private static final String TAG = WhileIdleAlarmsTest.class.getSimpleName();
+ private static final String TAG = ExactAlarmsTest.class.getSimpleName();
private static final int ALLOW_WHILE_IDLE_QUOTA = 5;
private static final long ALLOW_WHILE_IDLE_WINDOW = 10_000;
@@ -231,6 +230,24 @@
getAlarmSender(0, false));
}
+ @Test(expected = SecurityException.class)
+ public void setExactPiWithoutPermissionOrWhitelist() throws IOException {
+ revokeAppOp();
+ mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, 0, getAlarmSender(0, false));
+ }
+
+ @Test(expected = SecurityException.class)
+ public void setExactCallbackWithoutPermissionOrWhitelist() throws IOException {
+ revokeAppOp();
+ mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, 0, "test",
+ new AlarmManager.OnAlarmListener() {
+ @Override
+ public void onAlarm() {
+ Log.e(TAG, "Alarm fired!");
+ }
+ }, null);
+ }
+
@Test
public void setExactAwiWithoutPermissionWithWhitelist() throws Exception {
revokeAppOp();
diff --git a/tests/BlobStore/OWNERS b/tests/BlobStore/OWNERS
index bf870975..3a47c48 100644
--- a/tests/BlobStore/OWNERS
+++ b/tests/BlobStore/OWNERS
@@ -1,2 +1,2 @@
-# Bug component: 95221
+# Bug component: 533114
include platform/frameworks/base:/apex/blobstore/OWNERS
diff --git a/tests/JobScheduler/JobTestApp/AndroidManifest.xml b/tests/JobScheduler/JobTestApp/AndroidManifest.xml
index 866c5d4..9266377 100644
--- a/tests/JobScheduler/JobTestApp/AndroidManifest.xml
+++ b/tests/JobScheduler/JobTestApp/AndroidManifest.xml
@@ -19,7 +19,7 @@
<!-- This application schedules jobs independently of the test instrumentation to make
it possible to test behaviour for different app states, whitelists and device idle modes -->
- <application>
+ <application android:debuggable="true">
<service android:name=".TestJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
<activity android:name=".TestActivity"
diff --git a/tests/MediaProviderTranscode/Android.bp b/tests/MediaProviderTranscode/Android.bp
new file mode 100644
index 0000000..ec479e4
--- /dev/null
+++ b/tests/MediaProviderTranscode/Android.bp
@@ -0,0 +1,57 @@
+android_test {
+ name: "CtsMediaProviderTranscodeTests",
+ test_suites: [
+ "device-tests",
+ "cts",
+ ],
+ compile_multilib: "both",
+
+ manifest: "AndroidManifest.xml",
+
+ srcs: [
+ "src/**/*.java",
+ ],
+
+ libs: [
+ "android.test.base",
+ "android.test.mock",
+ "android.test.runner",
+ ],
+
+ static_libs: [
+ "androidx.test.rules",
+ "cts-install-lib",
+ "collector-device-lib-platform",
+ "mockito-target",
+ "truth-prebuilt",
+ ],
+
+ certificate: "media",
+ java_resources: [":CtsTranscodeTestAppSupportsHevc", ":CtsTranscodeTestAppSupportsSlowMotion"]
+}
+
+android_test_helper_app {
+ name: "CtsTranscodeTestAppSupportsHevc",
+ manifest: "helper/AndroidManifest.xml",
+ sdk_version: "test_current",
+ resource_dirs: ["helper/res-hevc"],
+ srcs: [
+ "helper/src/**/*.java",
+ "src/android/mediaprovidertranscode/cts/TranscodeTestConstants.java"
+ ],
+ static_libs: ["androidx.legacy_legacy-support-v4"],
+ target_sdk_version: "28",
+}
+
+android_test_helper_app {
+ name: "CtsTranscodeTestAppSupportsSlowMotion",
+ manifest: "helper/AndroidManifest.xml",
+ sdk_version: "test_current",
+ resource_dirs: ["helper/res-slow-motion"],
+ srcs: [
+ "helper/src/**/*.java",
+ "src/android/mediaprovidertranscode/cts/TranscodeTestConstants.java"
+ ],
+ static_libs: ["androidx.legacy_legacy-support-v4"],
+ target_sdk_version: "28",
+}
diff --git a/tests/MediaProviderTranscode/AndroidManifest.xml b/tests/MediaProviderTranscode/AndroidManifest.xml
new file mode 100644
index 0000000..50abad9
--- /dev/null
+++ b/tests/MediaProviderTranscode/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.mediaprovidertranscode.cts">
+
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
+
+ <application android:label="MediaProvider Transcode Tests">
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="android.mediaprovidertranscode.cts"
+ android:label="MediaProvider Transcode Tests" />
+
+</manifest>
diff --git a/tests/MediaProviderTranscode/AndroidTest.xml b/tests/MediaProviderTranscode/AndroidTest.xml
new file mode 100644
index 0000000..b1697bd
--- /dev/null
+++ b/tests/MediaProviderTranscode/AndroidTest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<configuration description="Runs CTS Tests for MediaProvder.">
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="test-file-name" value="CtsMediaProviderTranscodeTests.apk" />
+ <option name="install-arg" value="-g" />
+ </target_preparer>
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" />
+
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="cts" />
+ <option name="test-tag" value="MediaProviderTranscodeTests" />
+ <option name="config-descriptor:metadata" key="component" value="framework" />
+ <!-- Instant apps can't access the system providers. -->
+ <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
+ <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+ <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="android.mediaprovidertranscode.cts" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+ <option name="hidden-api-checks" value="false"/>
+ </test>
+</configuration>
diff --git a/tests/MediaProviderTranscode/OWNERS b/tests/MediaProviderTranscode/OWNERS
new file mode 100644
index 0000000..5ee8e8c
--- /dev/null
+++ b/tests/MediaProviderTranscode/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 95221
+include platform/frameworks/base:/core/java/android/os/storage/OWNERS
\ No newline at end of file
diff --git a/tests/MediaProviderTranscode/helper/AndroidManifest.xml b/tests/MediaProviderTranscode/helper/AndroidManifest.xml
new file mode 100644
index 0000000..a9ad768
--- /dev/null
+++ b/tests/MediaProviderTranscode/helper/AndroidManifest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.mediaprovidertranscode.cts.testapp"
+ android:versionCode="1"
+ android:versionName="1.0">
+
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+ <application android:label="Transcode Test App">
+ <property android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
+ android:resource="@xml/media_capabilities" />
+
+ <activity android:name="android.mediaprovidertranscode.cts.testapp.TranscodeTestHelper"
+ android:exported="true" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="android.mediaprovidertranscode.cts.testapp"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/file_paths" />
+ </provider>
+ </application>
+</manifest>
diff --git a/tests/MediaProviderTranscode/helper/res-hevc/xml/file_paths.xml b/tests/MediaProviderTranscode/helper/res-hevc/xml/file_paths.xml
new file mode 100644
index 0000000..2d5ccaf
--- /dev/null
+++ b/tests/MediaProviderTranscode/helper/res-hevc/xml/file_paths.xml
@@ -0,0 +1,3 @@
+<external-paths xmlns:android="http://schemas.android.com/apk/res/android">
+ <external-path name="external_files" path="."/>
+</external-paths>
diff --git a/tests/MediaProviderTranscode/helper/res-hevc/xml/media_capabilities.xml b/tests/MediaProviderTranscode/helper/res-hevc/xml/media_capabilities.xml
new file mode 100644
index 0000000..3bff61e
--- /dev/null
+++ b/tests/MediaProviderTranscode/helper/res-hevc/xml/media_capabilities.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+
+<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
+ <format android:name="HEVC" supported="true"/>
+ <format android:name="HDR10" supported="false"/>
+ <format android:name="SlowMotion" supported="false"/>
+</media-capabilities>
diff --git a/tests/MediaProviderTranscode/helper/res-slow-motion/xml/file_paths.xml b/tests/MediaProviderTranscode/helper/res-slow-motion/xml/file_paths.xml
new file mode 100644
index 0000000..2d5ccaf
--- /dev/null
+++ b/tests/MediaProviderTranscode/helper/res-slow-motion/xml/file_paths.xml
@@ -0,0 +1,3 @@
+<external-paths xmlns:android="http://schemas.android.com/apk/res/android">
+ <external-path name="external_files" path="."/>
+</external-paths>
diff --git a/tests/MediaProviderTranscode/helper/res-slow-motion/xml/media_capabilities.xml b/tests/MediaProviderTranscode/helper/res-slow-motion/xml/media_capabilities.xml
new file mode 100644
index 0000000..e96557e
--- /dev/null
+++ b/tests/MediaProviderTranscode/helper/res-slow-motion/xml/media_capabilities.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+
+<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
+ <format android:name="HEVC" supported="false"/>
+ <format android:name="HDR10" supported="false"/>
+ <format android:name="SlowMotion" supported="true"/>
+</media-capabilities>
diff --git a/tests/MediaProviderTranscode/helper/src/android/mediaprovidertranscode/cts/TranscodeTestHelper.java b/tests/MediaProviderTranscode/helper/src/android/mediaprovidertranscode/cts/TranscodeTestHelper.java
new file mode 100644
index 0000000..65857f7
--- /dev/null
+++ b/tests/MediaProviderTranscode/helper/src/android/mediaprovidertranscode/cts/TranscodeTestHelper.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.mediaprovidertranscode.cts.testapp;
+
+import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_EXTRA_CALLING_PKG;
+import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_EXTRA_PATH;
+import static android.mediaprovidertranscode.cts.TranscodeTestConstants.OPEN_FILE_QUERY;
+import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_QUERY_TYPE;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+
+import androidx.core.content.FileProvider;
+
+import java.io.File;
+
+/**
+ * Helper app for TranscodeTest.
+ *
+ * <p>Used to perform TranscodeTest functions as a different app. Based on the Query type
+ * app can perform different functions and send the result back to host app.
+ */
+public class TranscodeTestHelper extends Activity {
+ private static final String TAG = "TranscodeTestHelper";
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ String queryType = getIntent().getStringExtra(INTENT_QUERY_TYPE);
+ if (!OPEN_FILE_QUERY.equals(queryType)) {
+ throw new IllegalStateException(
+ "Unknown query received from launcher app: " + queryType);
+ }
+
+ final File file = new File(getIntent().getStringExtra(INTENT_EXTRA_PATH));
+ Uri contentUri = FileProvider.getUriForFile(this, getPackageName(), file);
+
+ final Intent intent = new Intent(queryType);
+ intent.putExtra(queryType, contentUri);
+
+ // Grant permission to the calling package
+ getApplicationContext().grantUriPermission(getIntent().getStringExtra(
+ INTENT_EXTRA_CALLING_PKG),
+ contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
+ | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ sendBroadcast(intent);
+ }
+}
diff --git a/tests/MediaProviderTranscode/res/raw/testVideo_HEVC_medium.mp4 b/tests/MediaProviderTranscode/res/raw/testVideo_HEVC_medium.mp4
new file mode 100755
index 0000000..207530c
--- /dev/null
+++ b/tests/MediaProviderTranscode/res/raw/testVideo_HEVC_medium.mp4
Binary files differ
diff --git a/tests/MediaProviderTranscode/res/raw/testVideo_HEVC_small.mp4 b/tests/MediaProviderTranscode/res/raw/testVideo_HEVC_small.mp4
new file mode 100755
index 0000000..f2aa045
--- /dev/null
+++ b/tests/MediaProviderTranscode/res/raw/testVideo_HEVC_small.mp4
Binary files differ
diff --git a/tests/MediaProviderTranscode/res/raw/testVideo_Legacy.mp4 b/tests/MediaProviderTranscode/res/raw/testVideo_Legacy.mp4
new file mode 100755
index 0000000..1c74ffa
--- /dev/null
+++ b/tests/MediaProviderTranscode/res/raw/testVideo_Legacy.mp4
Binary files differ
diff --git a/tests/MediaProviderTranscode/res/raw/testvideo_HEVC.mp4 b/tests/MediaProviderTranscode/res/raw/testvideo_HEVC.mp4
new file mode 100644
index 0000000..8a3dba2
--- /dev/null
+++ b/tests/MediaProviderTranscode/res/raw/testvideo_HEVC.mp4
Binary files differ
diff --git a/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTest.java b/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTest.java
new file mode 100644
index 0000000..e7ef396
--- /dev/null
+++ b/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTest.java
@@ -0,0 +1,1016 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.mediaprovidertranscode.cts;
+
+import static androidx.test.InstrumentationRegistry.getContext;
+
+import static android.mediaprovidertranscode.cts.TranscodeTestUtils.assertFileContent;
+import static android.mediaprovidertranscode.cts.TranscodeTestUtils.assertTranscode;
+import static android.mediaprovidertranscode.cts.TranscodeTestUtils.installAppWithStoragePermissions;
+import static android.mediaprovidertranscode.cts.TranscodeTestUtils.open;
+import static android.mediaprovidertranscode.cts.TranscodeTestUtils.openFileAs;
+import static android.mediaprovidertranscode.cts.TranscodeTestUtils.uninstallApp;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.Manifest;
+import android.media.ApplicationMediaCapabilities;
+import android.media.MediaFormat;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.ParcelFileDescriptor;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.provider.MediaStore;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.cts.install.lib.TestApp;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class TranscodeTest {
+ private static final String TAG = "TranscodeTest";
+ private static final File EXTERNAL_STORAGE_DIRECTORY
+ = Environment.getExternalStorageDirectory();
+ private static final File DIR_CAMERA
+ = new File(EXTERNAL_STORAGE_DIRECTORY, Environment.DIRECTORY_DCIM + "/Camera");
+ // TODO(b/169546642): Test other directories like /sdcard and /sdcard/foo
+ // These are the only transcode unsupported directories we can stage files in given our
+ // test app permissions
+ private static final File[] DIRS_NO_TRANSCODE = {
+ new File(EXTERNAL_STORAGE_DIRECTORY, Environment.DIRECTORY_PICTURES),
+ new File(EXTERNAL_STORAGE_DIRECTORY, Environment.DIRECTORY_MOVIES),
+ new File(EXTERNAL_STORAGE_DIRECTORY, Environment.DIRECTORY_DOWNLOADS),
+ new File(EXTERNAL_STORAGE_DIRECTORY, Environment.DIRECTORY_DCIM),
+ new File(EXTERNAL_STORAGE_DIRECTORY, Environment.DIRECTORY_DOCUMENTS),
+ };
+
+ static final String NONCE = String.valueOf(System.nanoTime());
+ private static final String HEVC_FILE_NAME = "TranscodeTestHEVC_" + NONCE + ".mp4";
+ private static final String SMALL_HEVC_FILE_NAME = "TranscodeTestHevcSmall_" + NONCE + ".mp4";
+ private static final String LEGACY_FILE_NAME = "TranscodeTestLegacy_" + NONCE + ".mp4";
+
+ private static final TestApp TEST_APP_HEVC = new TestApp("TestAppHevc",
+ "android.mediaprovidertranscode.cts.testapp", 1, false,
+ "CtsTranscodeTestAppSupportsHevc.apk");
+
+ private static final TestApp TEST_APP_SLOW_MOTION = new TestApp("TestAppSlowMotion",
+ "android.mediaprovidertranscode.cts.testapp", 1, false,
+ "CtsTranscodeTestAppSupportsSlowMotion.apk");
+
+ @Before
+ public void setUp() throws Exception {
+ TranscodeTestUtils.pollForExternalStorageState();
+ TranscodeTestUtils.grantPermission(getContext().getPackageName(),
+ Manifest.permission.READ_EXTERNAL_STORAGE);
+ TranscodeTestUtils.pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, true);
+ TranscodeTestUtils.enableSeamlessTranscoding();
+ TranscodeTestUtils.disableTranscodingForAllPackages();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ TranscodeTestUtils.disableSeamlessTranscoding();
+ }
+
+ /**
+ * Tests that we return FD of transcoded file for legacy apps
+ * @throws Exception
+ */
+ @Test
+ public void testTranscoded_FilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal = open(modernFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ ParcelFileDescriptor pfdTranscoded = open(modernFile, false);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal, pfdTranscoded, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that we don't transcode files outside DCIM/Camera
+ * @throws Exception
+ */
+ @Test
+ public void testNoTranscodeOutsideCamera_FilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ List<File> noTranscodeFiles = new ArrayList<>();
+ for (File file : DIRS_NO_TRANSCODE) {
+ noTranscodeFiles.add(new File(file, HEVC_FILE_NAME));
+ }
+ noTranscodeFiles.add(new File(getContext().getExternalFilesDir(null), HEVC_FILE_NAME));
+
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ for (File file : noTranscodeFiles) {
+ TranscodeTestUtils.stageHEVCVideoFile(file);
+ }
+ ParcelFileDescriptor pfdOriginal1 = open(modernFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ for (File file : noTranscodeFiles) {
+ pfdOriginal1.seekTo(0);
+ ParcelFileDescriptor pfdOriginal2 = open(file, false);
+ assertFileContent(modernFile, file, pfdOriginal1, pfdOriginal2, true);
+ }
+ } finally {
+ modernFile.delete();
+ for (File file : noTranscodeFiles) {
+ file.delete();
+ }
+ }
+ }
+
+ /**
+ * Tests that same transcoded file is used for multiple open() from same app
+ * @throws Exception
+ */
+ @Test
+ public void testSameTranscoded_FilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ ParcelFileDescriptor pfdTranscoded1 = open(modernFile, false);
+ ParcelFileDescriptor pfdTranscoded2 = open(modernFile, false);
+
+ assertFileContent(modernFile, modernFile, pfdTranscoded1, pfdTranscoded2, true);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that we return FD of transcoded file for legacy apps
+ * @throws Exception
+ */
+ @Test
+ public void testTranscoded_ContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal = open(uri, false, null /* bundle */);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ ParcelFileDescriptor pfdTranscoded = open(uri, false, null /* bundle */);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal, pfdTranscoded, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that we don't transcode files outside DCIM/Camera
+ * @throws Exception
+ */
+ @Test
+ public void testNoTranscodeOutsideCamera_ConentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ List<File> noTranscodeFiles = new ArrayList<>();
+ for (File file : DIRS_NO_TRANSCODE) {
+ noTranscodeFiles.add(new File(file, HEVC_FILE_NAME));
+ }
+
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ ArrayList<Uri> noTranscodeUris = new ArrayList<>();
+ for (File file : noTranscodeFiles) {
+ noTranscodeUris.add(TranscodeTestUtils.stageHEVCVideoFile(file));
+ }
+
+ ParcelFileDescriptor pfdOriginal1 = open(uri, false, null /* bundle */);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ for (int i = 0; i < noTranscodeUris.size(); i++) {
+ pfdOriginal1.seekTo(0);
+ ParcelFileDescriptor pfdOriginal2 =
+ open(noTranscodeUris.get(i), false, null /* bundle */);
+ assertFileContent(modernFile, noTranscodeFiles.get(1), pfdOriginal1, pfdOriginal2,
+ true);
+ }
+ } finally {
+ modernFile.delete();
+ for (File file : noTranscodeFiles) {
+ file.delete();
+ }
+ }
+ }
+
+ /**
+ * Tests that same transcoded file is used for multiple open() from same app
+ * @throws Exception
+ */
+ @Test
+ public void testSameTranscodedFile_ContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ ParcelFileDescriptor pfdTranscoded1 = open(uri, false, null /* bundle */);
+ ParcelFileDescriptor pfdTranscoded2 = open(uri, false, null /* bundle */);
+
+ assertFileContent(modernFile, modernFile, pfdTranscoded1, pfdTranscoded2, true);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that deletes are visible across legacy and modern apps
+ * @throws Exception
+ */
+ @Test
+ public void testDeleteTranscodedFile_FilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTrue(modernFile.delete());
+ assertFalse(modernFile.exists());
+
+ TranscodeTestUtils.disableTranscodingForAllPackages();
+
+ assertFalse(modernFile.exists());
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that renames are visible across legacy and modern apps
+ * @throws Exception
+ */
+ @Test
+ public void testRenameTranscodedFile_FilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ File destFile = new File(DIR_CAMERA, "renamed_" + HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTrue(modernFile.renameTo(destFile));
+ assertTrue(destFile.exists());
+ assertFalse(modernFile.exists());
+
+ TranscodeTestUtils.disableTranscodingForAllPackages();
+
+ assertTrue(destFile.exists());
+ assertFalse(modernFile.exists());
+ } finally {
+ modernFile.delete();
+ destFile.delete();
+ }
+ }
+
+ /**
+ * Tests that transcode doesn't start until read(2)
+ * @throws Exception
+ */
+ @Test
+ public void testLazyTranscodedFile_FilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ assertTranscode(modernFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTranscode(modernFile, true);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that transcode cache is reused after file path transcode
+ * @throws Exception
+ */
+ @Test
+ public void testTranscodedCacheReuse_FilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTranscode(modernFile, true);
+ assertTranscode(modernFile, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that transcode cache is reused after ContentResolver transcode
+ * @throws Exception
+ */
+ @Test
+ public void testTranscodedCacheReuse_ContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTranscode(uri, true);
+ assertTranscode(uri, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that transcode cache is reused after ContentResolver transcode
+ * and file path opens
+ * @throws Exception
+ */
+ @Test
+ public void testTranscodedCacheReuse_ContentResolverFilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTranscode(uri, true);
+ assertTranscode(modernFile, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that transcode cache is reused after file path transcode
+ * and ContentResolver opens
+ * @throws Exception
+ */
+ @Test
+ public void testTranscodedCacheReuse_FilePathContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTranscode(modernFile, true);
+ assertTranscode(uri, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that transcode cache is reused after rename
+ * @throws Exception
+ */
+ @Test
+ public void testTranscodedCacheReuseAfterRename_FilePath() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ File destFile = new File(DIR_CAMERA, "renamed_" + HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTranscode(modernFile, true);
+
+ assertTrue(modernFile.renameTo(destFile));
+
+ assertTranscode(destFile, false);
+ } finally {
+ modernFile.delete();
+ destFile.delete();
+ }
+ }
+
+ @Test
+ public void testExtraAcceptOriginalFormatTrue_ContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(uri, false, null /* bundle */);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(MediaStore.EXTRA_ACCEPT_ORIGINAL_MEDIA_FORMAT, true);
+ ParcelFileDescriptor pfdOriginal2 = open(uri, false, bundle);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdOriginal2, true);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ @Test
+ public void testExtraAcceptOriginalFormatFalse_ContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal = open(uri, false, null /* bundle */);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(MediaStore.EXTRA_ACCEPT_ORIGINAL_MEDIA_FORMAT, false);
+ ParcelFileDescriptor pfdTranscoded = open(uri, false, bundle);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal, pfdTranscoded, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ @Test
+ public void testExtraMediaCapabilitiesHevcSupportedTrue_ContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(uri, false, null /* bundle */);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ Bundle bundle = new Bundle();
+ ApplicationMediaCapabilities capabilities =
+ new ApplicationMediaCapabilities.Builder()
+ .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC).build();
+ bundle.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, capabilities);
+ ParcelFileDescriptor pfdOriginal2 = open(uri, false, bundle);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdOriginal2, true);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ @Test
+ public void testExtraMediaCapabilitiesHevcUnsupportedFalse_ContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(uri, false, null /* bundle */);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ Bundle bundle = new Bundle();
+ ApplicationMediaCapabilities capabilities =
+ new ApplicationMediaCapabilities.Builder()
+ .addUnsupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC).build();
+ bundle.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, capabilities);
+ ParcelFileDescriptor pfdOriginal2 = open(uri, false, bundle);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdOriginal2, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ @Test
+ public void testExtraMediaCapabilitiesHevcUnspecifiedFalse_ContentResolver() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(uri, false, null /* bundle */);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ Bundle bundle = new Bundle();
+ ApplicationMediaCapabilities capabilities =
+ new ApplicationMediaCapabilities.Builder().build();
+ bundle.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, capabilities);
+ ParcelFileDescriptor pfdTranscoded = open(uri, false, bundle);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdTranscoded, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ @Test
+ public void testExtraAcceptOriginalTrueAndMediaCapabilitiesHevcFalse_ContentResolver()
+ throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(uri, false, null /* bundle */);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ Bundle bundle = new Bundle();
+ ApplicationMediaCapabilities capabilities =
+ new ApplicationMediaCapabilities.Builder().build();
+ bundle.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, capabilities);
+ bundle.putBoolean(MediaStore.EXTRA_ACCEPT_ORIGINAL_MEDIA_FORMAT, true);
+ ParcelFileDescriptor pfdOriginal2 = open(uri, false, bundle);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdOriginal2, true);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ @Test
+ public void testMediaCapabilitiesManifestHevc()
+ throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ ParcelFileDescriptor pfdOriginal2 = null;
+ try {
+ installAppWithStoragePermissions(TEST_APP_HEVC);
+
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(modernFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(TEST_APP_HEVC.getPackageName());
+
+ pfdOriginal2 = openFileAs(TEST_APP_HEVC, modernFile);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdOriginal2, true);
+ } finally {
+ // Explicitly close PFD otherwise instrumention might crash when test_app is uninstalled
+ if (pfdOriginal2 != null) {
+ pfdOriginal2.close();
+ }
+ modernFile.delete();
+ uninstallApp(TEST_APP_HEVC);
+ }
+ }
+
+ @Test
+ public void testMediaCapabilitiesManifestSlowMotion()
+ throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ ParcelFileDescriptor pfdOriginal2 = null;
+ try {
+ installAppWithStoragePermissions(TEST_APP_SLOW_MOTION);
+
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(modernFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(TEST_APP_SLOW_MOTION.getPackageName());
+
+ pfdOriginal2 = openFileAs(TEST_APP_SLOW_MOTION, modernFile);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdOriginal2, false);
+ } finally {
+ // Explicitly close PFD otherwise instrumention might crash when test_app is uninstalled
+ if (pfdOriginal2 != null) {
+ pfdOriginal2.close();
+ }
+ modernFile.delete();
+ uninstallApp(TEST_APP_HEVC);
+ }
+ }
+
+ @Test
+ public void testAppCompatNoTranscodeHevc() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ String packageName = TEST_APP_SLOW_MOTION.getPackageName();
+ ParcelFileDescriptor pfdOriginal2 = null;
+ try {
+ installAppWithStoragePermissions(TEST_APP_SLOW_MOTION);
+
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(modernFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(packageName);
+ // App compat takes precedence
+ TranscodeTestUtils.forceEnableAppCompatHevc(packageName);
+
+ Thread.sleep(2000);
+
+ pfdOriginal2 = openFileAs(TEST_APP_SLOW_MOTION, modernFile);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdOriginal2, true);
+ } finally {
+ // Explicitly close PFD otherwise instrumention might crash when test_app is uninstalled
+ if (pfdOriginal2 != null) {
+ pfdOriginal2.close();
+ }
+ modernFile.delete();
+ TranscodeTestUtils.resetAppCompat(packageName);
+ uninstallApp(TEST_APP_HEVC);
+ }
+ }
+
+ @Test
+ public void testAppCompatTranscodeHevc() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ String packageName = TEST_APP_SLOW_MOTION.getPackageName();
+ ParcelFileDescriptor pfdOriginal2 = null;
+ try {
+ installAppWithStoragePermissions(TEST_APP_SLOW_MOTION);
+
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal1 = open(modernFile, false);
+
+ // Transcoding is disabled but app compat enables it (disables hevc support)
+ TranscodeTestUtils.forceDisableAppCompatHevc(packageName);
+
+ pfdOriginal2 = openFileAs(TEST_APP_SLOW_MOTION, modernFile);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal1, pfdOriginal2, false);
+ } finally {
+ // Explicitly close PFD otherwise instrumention might crash when test_app is uninstalled
+ if (pfdOriginal2 != null) {
+ pfdOriginal2.close();
+ }
+ modernFile.delete();
+ TranscodeTestUtils.resetAppCompat(packageName);
+ uninstallApp(TEST_APP_HEVC);
+ }
+ }
+
+ /**
+ * Tests that we never initiate tanscoding for legacy formats.
+ * This test compares the bytes read before and after enabling transcoding for the test app.
+ * @throws Exception
+ */
+ @Test
+ public void testTranscodedNotInitiatedForLegacy_UsingBytesRead() throws Exception {
+ File legacyFile = new File(DIR_CAMERA, LEGACY_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageLegacyVideoFile(legacyFile);
+
+ ParcelFileDescriptor pfdOriginal = open(legacyFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ ParcelFileDescriptor pfdTranscoded = open(legacyFile, false);
+
+ assertFileContent(legacyFile, legacyFile, pfdOriginal, pfdTranscoded, true);
+ } finally {
+ legacyFile.delete();
+ }
+ }
+
+ /**
+ * Tests that we never initiate tanscoding for legacy formats.
+ * This test asserts using the time it took to read after enabling transcoding for the test app.
+ * The reason for keeping this check separately (than
+ * {@link TranscodeTest#testTranscodedNotInitiatedForLegacy_UsingTiming()}) is that this
+ * provides a higher level of suret that the timing wasn't favorable because of any caching
+ * after open().
+ * @throws Exception
+ */
+ @Test
+ public void testTranscodedNotInitiatedForLegacy_UsingTiming() throws Exception {
+ File legacyFile = new File(DIR_CAMERA, LEGACY_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageLegacyVideoFile(legacyFile);
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+
+ assertTranscode(legacyFile, false);
+ } finally {
+ legacyFile.delete();
+ }
+ }
+
+ /**
+ * Tests that we don't timeout while transcoding small HEVC videos.
+ * For instance, due to some calculation errors we might incorrectly make timeout to be 0.
+ * We test this by making sure that a small HEVC video (< 1 sec long and < 1Mb size) gets
+ * transcoded.
+ * @throws Exception
+ */
+ @Test
+ public void testNoTranscodeTimeoutForSmallHevcVideos() throws Exception {
+ File modernFile = new File(DIR_CAMERA, SMALL_HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageSmallHevcVideoFile(modernFile);
+ ParcelFileDescriptor pfdOriginal = open(modernFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ ParcelFileDescriptor pfdTranscoded = open(modernFile, false);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal, pfdTranscoded, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that we transcode an HEVC file when a modern app passes the mediaCapabilitiesUid of a
+ * legacy app that cannot handle an HEVC file.
+ */
+ @Test
+ public void testOriginalCallingUid_modernAppPassLegacyAppUid()
+ throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ ParcelFileDescriptor pfdModernApp = null;
+ ParcelFileDescriptor pfdModernAppPassingLegacyUid = null;
+ try {
+ installAppWithStoragePermissions(TEST_APP_SLOW_MOTION);
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ // pfdModernApp is for original content (without transcoding) since this is a modern
+ // app.
+ pfdModernApp = open(modernFile, false);
+
+ // pfdModernAppPassingLegacyUid is for transcoded content since this modern app is
+ // passing the UID of a legacy app capable of handling HEVC files.
+ Bundle bundle = new Bundle();
+ bundle.putInt(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID,
+ getContext().getPackageManager().getPackageUid(
+ TEST_APP_SLOW_MOTION.getPackageName(), 0));
+ pfdModernAppPassingLegacyUid = open(uri, false, bundle);
+
+ assertTranscode(pfdModernApp, false);
+ assertTranscode(pfdModernAppPassingLegacyUid, true);
+
+ // pfdModernApp and pfdModernAppPassingLegacyUid should be different.
+ assertFileContent(modernFile, modernFile, pfdModernApp, pfdModernAppPassingLegacyUid,
+ false);
+ } finally {
+ if (pfdModernApp != null) {
+ pfdModernApp.close();
+ }
+
+ if (pfdModernAppPassingLegacyUid != null) {
+ pfdModernAppPassingLegacyUid.close();
+ }
+ modernFile.delete();
+ uninstallApp(TEST_APP_SLOW_MOTION);
+ }
+ }
+
+ /**
+ * Tests that we don't transcode an HEVC file when a legacy app passes the mediaCapabilitiesUid
+ * of a modern app that can handle an HEVC file.
+ */
+ @Test
+ public void testOriginalCallingUid_legacyAppPassModernAppUid()
+ throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ ParcelFileDescriptor pfdLegacyApp = null;
+ ParcelFileDescriptor pfdLegacyAppPassingModernUid = null;
+ try {
+ installAppWithStoragePermissions(TEST_APP_HEVC);
+ Uri uri = TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ // pfdLegacyApp is for transcoded content since this is a legacy app.
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ pfdLegacyApp = open(modernFile, false);
+
+ // pfdLegacyAppPassingModernUid is for original content (without transcoding) since this
+ // legacy app is passing the UID of a modern app capable of handling HEVC files.
+ Bundle bundle = new Bundle();
+ bundle.putInt(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID,
+ getContext().getPackageManager().getPackageUid(TEST_APP_HEVC.getPackageName(),
+ 0));
+ pfdLegacyAppPassingModernUid = open(uri, false, bundle);
+
+ assertTranscode(pfdLegacyApp, true);
+ assertTranscode(pfdLegacyAppPassingModernUid, false);
+
+ // pfdLegacyApp and pfdLegacyAppPassingModernUid should be different.
+ assertFileContent(modernFile, modernFile, pfdLegacyApp, pfdLegacyAppPassingModernUid,
+ false);
+ } finally {
+ if (pfdLegacyApp != null) {
+ pfdLegacyApp.close();
+ }
+
+ if (pfdLegacyAppPassingModernUid != null) {
+ pfdLegacyAppPassingModernUid.close();
+ }
+ modernFile.delete();
+ uninstallApp(TEST_APP_HEVC);
+ }
+ }
+
+ /**
+ * Tests that we return FD of original file from
+ * MediaStore#getOriginalMediaFormatFileDescriptor.
+ * @throws Exception
+ */
+ @Test
+ public void testGetOriginalMediaFormatFileDescriptor_returnsOriginalFileDescriptor()
+ throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+
+ ParcelFileDescriptor pfdOriginal = open(modernFile, false);
+
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ ParcelFileDescriptor pfdTranscoded = open(modernFile, false);
+
+ ParcelFileDescriptor pfdOriginalMediaFormat =
+ MediaStore.getOriginalMediaFormatFileDescriptor(getContext(), pfdTranscoded);
+
+ assertFileContent(modernFile, modernFile, pfdOriginal, pfdOriginalMediaFormat, true);
+ assertFileContent(modernFile, modernFile, pfdTranscoded, pfdOriginalMediaFormat, false);
+ } finally {
+ modernFile.delete();
+ }
+ }
+
+ /**
+ * Tests that we can successfully write to a transcoded file.
+ * We check this by writing something to tanscoded content and then read it back.
+ */
+ @Test
+ public void testWriteSuccessfulToTranscodedContent() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ ParcelFileDescriptor pfdTranscodedContent = null;
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ pfdTranscodedContent = open(modernFile, false);
+
+ // read some bytes from some random offset
+ Random random = new Random(System.currentTimeMillis());
+ int byteCount = 512;
+ int fileOffset = random.nextInt((int) pfdTranscodedContent.getStatSize() - byteCount);
+ byte[] readBytes = TranscodeTestUtils.read(pfdTranscodedContent, byteCount, fileOffset);
+
+ // write the bytes at the same offset after some modification
+ pfdTranscodedContent = open(modernFile, true);
+ byte[] writeBytes = new byte[byteCount];
+ for (int i = 0; i < byteCount; ++i) {
+ writeBytes[i] = (byte) ~readBytes[i];
+ }
+ TranscodeTestUtils.write(pfdTranscodedContent, writeBytes, byteCount, fileOffset);
+
+ // read back the same number of bytes from the same offset
+ readBytes = TranscodeTestUtils.read(pfdTranscodedContent, byteCount, fileOffset);
+
+ // assert that read is same as written
+ assertTrue(Arrays.equals(readBytes, writeBytes));
+ } finally {
+ if (pfdTranscodedContent != null) {
+ pfdTranscodedContent.close();
+ }
+ modernFile.delete();
+ }
+ }
+
+ @Test
+ public void testTranscodeDirectoryNotAccessible() throws Exception {
+ File modernFile = new File(DIR_CAMERA, HEVC_FILE_NAME);
+ ParcelFileDescriptor pfdTranscodedContent = null;
+ try {
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ pfdTranscodedContent = open(modernFile, false);
+ TranscodeTestUtils.read(pfdTranscodedContent, 512, 0);
+
+ // Transcode directory must be created now.
+ String transcodeDirPath =
+ "/storage/emulated/" + UserHandle.myUserId() + "/.transforms/transcode";
+ File transcodeDir = new File(transcodeDirPath);
+ assertThat(transcodeDir.exists()).isFalse();
+ } finally {
+ if (pfdTranscodedContent != null) {
+ pfdTranscodedContent.close();
+ }
+ modernFile.delete();
+ }
+ }
+
+ @Test
+ public void testTranscodeMultipleFilesConcurrently_mediumDurationMediumVolume() throws Exception {
+ ModernFileOpenerThread[] modernFileOpenerThreads = new ModernFileOpenerThread[20];
+ for (int i = 0; i < modernFileOpenerThreads.length; ++i) {
+ modernFileOpenerThreads[i] = new ModernFileOpenerThread(
+ ModernFileOpenerThread.FileDurationSeconds.TWENTIES);
+ }
+
+ for (int i = 0; i < modernFileOpenerThreads.length; ++i) {
+ modernFileOpenerThreads[i].start();
+ }
+
+ for (int i = 0; i < modernFileOpenerThreads.length; ++i) {
+ modernFileOpenerThreads[i].join();
+ if (modernFileOpenerThreads[i].mException != null) {
+ throw new Exception("Failed ModernFileOpenerThread - " + i + ": "
+ + modernFileOpenerThreads[i].mException.getMessage(),
+ modernFileOpenerThreads[i].mException);
+ }
+ }
+ }
+
+ @Test
+ public void testTranscodeMultipleFilesConcurrently_lowDurationHighVolume() throws Exception {
+ ModernFileOpenerThread[] modernFileOpenerThreads = new ModernFileOpenerThread[100];
+ for (int i = 0; i < modernFileOpenerThreads.length; ++i) {
+ modernFileOpenerThreads[i] = new ModernFileOpenerThread(
+ ModernFileOpenerThread.FileDurationSeconds.FEW);
+ }
+
+ for (int i = 0; i < modernFileOpenerThreads.length; ++i) {
+ modernFileOpenerThreads[i].start();
+ }
+
+ for (int i = 0; i < modernFileOpenerThreads.length; ++i) {
+ modernFileOpenerThreads[i].join();
+ if (modernFileOpenerThreads[i].mException != null) {
+ throw new Exception("Failed ModernFileOpenerThread - " + i + ": "
+ + modernFileOpenerThreads[i].mException.getMessage(),
+ modernFileOpenerThreads[i].mException);
+ }
+ }
+ }
+
+ private static final class ModernFileOpenerThread extends Thread {
+ private final FileDurationSeconds mFileDurationSeconds;
+ Throwable mException;
+
+ ModernFileOpenerThread(FileDurationSeconds fileDurationSeconds) {
+ mFileDurationSeconds = fileDurationSeconds;
+ }
+
+ @Override
+ public void run() {
+ try {
+ openFile();
+ } catch (Exception exception) {
+ mException = exception;
+ }
+ }
+
+ private void openFile() throws Exception {
+ String fileName = "TranscodeTestHEVC_" + System.nanoTime() + ".mp4";
+ File modernFile = new File(DIR_CAMERA, fileName);
+ ParcelFileDescriptor pfdTranscoded = null;
+ try {
+ switch (mFileDurationSeconds) {
+ case FEW:
+ TranscodeTestUtils.stageHEVCVideoFile(modernFile);
+ break;
+ case TWENTIES:
+ TranscodeTestUtils.stageMediumHevcVideoFile(modernFile);
+ break;
+ default:
+ throw new IllegalStateException(
+ "Unknown mFileDurationSeconds: " + mFileDurationSeconds);
+ }
+ TranscodeTestUtils.enableTranscodingForPackage(getContext().getPackageName());
+ pfdTranscoded = open(modernFile, false);
+ assertTranscode(pfdTranscoded, true);
+ } finally {
+ if (pfdTranscoded != null) {
+ pfdTranscoded.close();
+ }
+ modernFile.delete();
+ }
+ }
+
+ enum FileDurationSeconds {
+ FEW,
+ TWENTIES
+ }
+ }
+}
diff --git a/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestConstants.java b/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestConstants.java
new file mode 100644
index 0000000..546e94f
--- /dev/null
+++ b/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestConstants.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.mediaprovidertranscode.cts;
+
+public final class TranscodeTestConstants {
+ private TranscodeTestConstants() {
+ }
+
+ public static final String INTENT_QUERY_TYPE =
+ "android.mediaprovidertranscode.cts.query_type";
+ public static final String INTENT_EXTRA_CALLING_PKG =
+ "android.mediaprovidertranscode.cts.calling_pkg";
+ public static final String INTENT_EXTRA_PATH = "android.mediaprovidertranscode.cts.path";
+ public static final String OPEN_FILE_QUERY = "android.mediaprovidertranscode.cts.open_file";
+}
diff --git a/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestUtils.java b/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestUtils.java
new file mode 100644
index 0000000..e13dd46
--- /dev/null
+++ b/tests/MediaProviderTranscode/src/android/mediaprovidertranscode/cts/TranscodeTestUtils.java
@@ -0,0 +1,462 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.mediaprovidertranscode.cts;
+
+import static androidx.test.InstrumentationRegistry.getContext;
+
+import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_EXTRA_CALLING_PKG;
+import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_EXTRA_PATH;
+import static android.mediaprovidertranscode.cts.TranscodeTestConstants.OPEN_FILE_QUERY;
+import static android.mediaprovidertranscode.cts.TranscodeTestConstants.INTENT_QUERY_TYPE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+import android.Manifest;
+import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.app.UiAutomation;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.FileUtils;
+import android.os.ParcelFileDescriptor;
+import android.os.SystemClock;
+import android.provider.MediaStore;
+import android.system.Os;
+import android.system.OsConstants;
+import android.util.Log;
+
+import androidx.test.InstrumentationRegistry;
+
+import com.android.cts.install.lib.Install;
+import com.android.cts.install.lib.InstallUtils;
+import com.android.cts.install.lib.TestApp;
+import com.android.cts.install.lib.Uninstall;
+
+import com.google.common.io.ByteStreams;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.util.Arrays;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Supplier;
+
+public class TranscodeTestUtils {
+ private static final String TAG = "TranscodeTestUtils";
+
+ private static final long POLLING_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(20);
+ private static final long POLLING_SLEEP_MILLIS = 100;
+
+ public static Uri stageHEVCVideoFile(File videoFile) throws IOException {
+ return stageVideoFile(videoFile, R.raw.testvideo_HEVC);
+ }
+
+ public static Uri stageSmallHevcVideoFile(File videoFile) throws IOException {
+ return stageVideoFile(videoFile, R.raw.testVideo_HEVC_small);
+ }
+
+ public static Uri stageMediumHevcVideoFile(File videoFile) throws IOException {
+ return stageVideoFile(videoFile, R.raw.testVideo_HEVC_medium);
+ }
+
+ public static Uri stageLegacyVideoFile(File videoFile) throws IOException {
+ return stageVideoFile(videoFile, R.raw.testVideo_Legacy);
+ }
+
+ private static Uri stageVideoFile(File videoFile, int resourceId) throws IOException {
+ if (!videoFile.getParentFile().exists()) {
+ assertTrue(videoFile.getParentFile().mkdirs());
+ }
+ try (InputStream in =
+ getContext().getResources().openRawResource(resourceId);
+ FileOutputStream out = new FileOutputStream(videoFile)) {
+ FileUtils.copy(in, out);
+ // Sync file to disk to ensure file is fully written to the lower fs before scanning
+ // Otherwise, media provider might try to read the file on the lower fs and not see
+ // the fully written bytes
+ out.getFD().sync();
+ }
+ return MediaStore.scanFile(getContext().getContentResolver(), videoFile);
+ }
+
+ public static ParcelFileDescriptor open(File file, boolean forWrite) throws Exception {
+ return ParcelFileDescriptor.open(file, forWrite ? ParcelFileDescriptor.MODE_READ_WRITE
+ : ParcelFileDescriptor.MODE_READ_ONLY);
+ }
+
+ public static ParcelFileDescriptor open(Uri uri, boolean forWrite, Bundle bundle)
+ throws Exception {
+ ContentResolver resolver = getContext().getContentResolver();
+ if (bundle == null) {
+ return resolver.openFileDescriptor(uri, forWrite ? "rw" : "r");
+ } else {
+ return resolver.openTypedAssetFileDescriptor(uri, "*/*", bundle)
+ .getParcelFileDescriptor();
+ }
+ }
+
+ static byte[] read(ParcelFileDescriptor parcelFileDescriptor, int byteCount, int fileOffset)
+ throws Exception {
+ assertThat(byteCount).isGreaterThan(-1);
+ assertThat(fileOffset).isGreaterThan(-1);
+
+ Os.lseek(parcelFileDescriptor.getFileDescriptor(), fileOffset, OsConstants.SEEK_SET);
+
+ byte[] bytes = new byte[byteCount];
+ int numBytesRead = Os.read(parcelFileDescriptor.getFileDescriptor(), bytes,
+ 0 /* byteOffset */, byteCount);
+ assertThat(numBytesRead).isGreaterThan(-1);
+ return bytes;
+ }
+
+ static void write(ParcelFileDescriptor parcelFileDescriptor, byte[] bytes, int byteCount,
+ int fileOffset) throws Exception {
+ assertThat(byteCount).isGreaterThan(-1);
+ assertThat(fileOffset).isGreaterThan(-1);
+
+ Os.lseek(parcelFileDescriptor.getFileDescriptor(), fileOffset, OsConstants.SEEK_SET);
+
+ int numBytesWritten = Os.write(parcelFileDescriptor.getFileDescriptor(), bytes,
+ 0 /* byteOffset */, byteCount);
+ assertThat(numBytesWritten).isNotEqualTo(-1);
+ assertThat(numBytesWritten).isEqualTo(byteCount);
+ }
+
+ public static void enableSeamlessTranscoding() throws Exception {
+ // This is required so that MediaProvider handles device config changes
+ executeShellCommand("setprop sys.fuse.transcode_debug true");
+ // This is required so that setprop changes take precedence over device_config changes
+ executeShellCommand("setprop persist.sys.fuse.transcode_user_control true");
+ executeShellCommand("setprop persist.sys.fuse.transcode_enabled true");
+ executeShellCommand("setprop persist.sys.fuse.transcode_default false");
+ }
+
+ public static void disableSeamlessTranscoding() throws Exception {
+ executeShellCommand("setprop sys.fuse.transcode_debug false");
+ executeShellCommand("setprop persist.sys.fuse.transcode_user_control true");
+ executeShellCommand("setprop persist.sys.fuse.transcode_enabled false");
+ executeShellCommand("setprop persist.sys.fuse.transcode_default false");
+ disableTranscodingForAllPackages();
+ }
+
+ public static void enableTranscodingForPackage(String packageName) throws Exception {
+ executeShellCommand("device_config put storage_native_boot transcode_compat_manifest "
+ + packageName + ",0");
+ }
+
+ public static void forceEnableAppCompatHevc(String packageName) throws IOException {
+ final String command = "am compat enable 174228127 " + packageName;
+ executeShellCommand(command);
+ }
+
+ public static void forceDisableAppCompatHevc(String packageName) throws IOException {
+ final String command = "am compat enable 174227820 " + packageName;
+ executeShellCommand(command);
+ }
+
+ public static void resetAppCompat(String packageName) throws IOException {
+ final String command = "am compat reset-all " + packageName;
+ executeShellCommand(command);
+ }
+
+ public static void disableTranscodingForAllPackages() throws IOException {
+ executeShellCommand("device_config delete storage_native_boot transcode_compat_manifest");
+ }
+
+ /**
+ * Executes a shell command.
+ */
+ public static String executeShellCommand(String command) throws IOException {
+ int attempt = 0;
+ while (attempt++ < 5) {
+ try {
+ return executeShellCommandInternal(command);
+ } catch (InterruptedIOException e) {
+ // Hmm, we had trouble executing the shell command; the best we
+ // can do is try again a few more times
+ Log.v(TAG, "Trouble executing " + command + "; trying again", e);
+ }
+ }
+ throw new IOException("Failed to execute " + command);
+ }
+
+ private static String executeShellCommandInternal(String cmd) throws IOException {
+ UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ try (FileInputStream output = new FileInputStream(
+ uiAutomation.executeShellCommand(cmd).getFileDescriptor())) {
+ return new String(ByteStreams.toByteArray(output));
+ }
+ }
+
+ /**
+ * Polls for external storage to be mounted.
+ */
+ public static void pollForExternalStorageState() throws Exception {
+ pollForCondition(
+ () -> Environment.getExternalStorageState(Environment.getExternalStorageDirectory())
+ .equals(Environment.MEDIA_MOUNTED),
+ "Timed out while waiting for ExternalStorageState to be MEDIA_MOUNTED");
+ }
+
+ private static void pollForCondition(Supplier<Boolean> condition, String errorMessage)
+ throws Exception {
+ for (int i = 0; i < POLLING_TIMEOUT_MILLIS / POLLING_SLEEP_MILLIS; i++) {
+ if (condition.get()) {
+ return;
+ }
+ Thread.sleep(POLLING_SLEEP_MILLIS);
+ }
+ throw new TimeoutException(errorMessage);
+ }
+
+ public static void grantPermission(String packageName, String permission) {
+ UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ uiAutomation.adoptShellPermissionIdentity("android.permission.GRANT_RUNTIME_PERMISSIONS");
+ try {
+ uiAutomation.grantRuntimePermission(packageName, permission);
+ } finally {
+ uiAutomation.dropShellPermissionIdentity();
+ }
+ }
+
+ /**
+ * Polls until we're granted or denied a given permission.
+ */
+ public static void pollForPermission(String perm, boolean granted) throws Exception {
+ pollForCondition(() -> granted == checkPermissionAndAppOp(perm),
+ "Timed out while waiting for permission " + perm + " to be "
+ + (granted ? "granted" : "revoked"));
+ }
+
+
+ /**
+ * Checks if the given {@code permission} is granted and corresponding AppOp is MODE_ALLOWED.
+ */
+ private static boolean checkPermissionAndAppOp(String permission) {
+ final int pid = Os.getpid();
+ final int uid = Os.getuid();
+ final Context context = getContext();
+ final String packageName = context.getPackageName();
+ if (context.checkPermission(permission, pid, uid) != PackageManager.PERMISSION_GRANTED) {
+ return false;
+ }
+
+ final String op = AppOpsManager.permissionToOp(permission);
+ // No AppOp associated with the given permission, skip AppOp check.
+ if (op == null) {
+ return true;
+ }
+
+ final AppOpsManager appOps = context.getSystemService(AppOpsManager.class);
+ try {
+ appOps.checkPackage(uid, packageName);
+ } catch (SecurityException e) {
+ return false;
+ }
+
+ return appOps.unsafeCheckOpNoThrow(op, uid, packageName) == AppOpsManager.MODE_ALLOWED;
+ }
+
+ /**
+ * Installs a {@link TestApp} and grants it storage permissions.
+ */
+ public static void installAppWithStoragePermissions(TestApp testApp)
+ throws Exception {
+ UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ try {
+ final String packageName = testApp.getPackageName();
+ uiAutomation.adoptShellPermissionIdentity(
+ Manifest.permission.INSTALL_PACKAGES, Manifest.permission.DELETE_PACKAGES);
+ if (InstallUtils.getInstalledVersion(packageName) != -1) {
+ Uninstall.packages(packageName);
+ }
+ Install.single(testApp).commit();
+ assertThat(InstallUtils.getInstalledVersion(packageName)).isEqualTo(1);
+
+ grantPermission(packageName, Manifest.permission.WRITE_EXTERNAL_STORAGE);
+ grantPermission(packageName, Manifest.permission.READ_EXTERNAL_STORAGE);
+ } finally {
+ uiAutomation.dropShellPermissionIdentity();
+ }
+ }
+
+ /**
+ * Uninstalls a {@link TestApp}.
+ */
+ public static void uninstallApp(TestApp testApp) throws Exception {
+ UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ try {
+ final String packageName = testApp.getPackageName();
+ uiAutomation.adoptShellPermissionIdentity(Manifest.permission.DELETE_PACKAGES);
+
+ Uninstall.packages(packageName);
+ assertThat(InstallUtils.getInstalledVersion(packageName)).isEqualTo(-1);
+ } catch (Exception e) {
+ Log.e(TAG, "Exception occurred while uninstalling app: " + testApp, e);
+ } finally {
+ uiAutomation.dropShellPermissionIdentity();
+ }
+ }
+
+ /**
+ * Makes the given {@code testApp} open a file for read or write.
+ *
+ * <p>This method drops shell permission identity.
+ */
+ public static ParcelFileDescriptor openFileAs(TestApp testApp, File dirPath)
+ throws Exception {
+ String actionName = getContext().getPackageName() + ".open_file";
+ Bundle bundle = getFromTestApp(testApp, dirPath.getPath(), actionName);
+ return getContext().getContentResolver().openFileDescriptor(
+ bundle.getParcelable(actionName), "rw");
+ }
+
+ /**
+ * <p>This method drops shell permission identity.
+ */
+ private static Bundle getFromTestApp(TestApp testApp, String dirPath, String actionName)
+ throws Exception {
+ final CountDownLatch latch = new CountDownLatch(1);
+ final Bundle[] bundle = new Bundle[1];
+ BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ bundle[0] = intent.getExtras();
+ latch.countDown();
+ }
+ };
+
+ sendIntentToTestApp(testApp, dirPath, actionName, broadcastReceiver, latch);
+ return bundle[0];
+ }
+
+ /**
+ * <p>This method drops shell permission identity.
+ */
+ private static void sendIntentToTestApp(TestApp testApp, String dirPath, String actionName,
+ BroadcastReceiver broadcastReceiver, CountDownLatch latch) throws Exception {
+ final String packageName = testApp.getPackageName();
+ forceStopApp(packageName);
+ // Register broadcast receiver
+ final IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(actionName);
+ intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
+ getContext().registerReceiver(broadcastReceiver, intentFilter);
+
+ // Launch the test app.
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setPackage(packageName);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(INTENT_QUERY_TYPE, actionName);
+ intent.putExtra(INTENT_EXTRA_CALLING_PKG, getContext().getPackageName());
+ intent.putExtra(INTENT_EXTRA_PATH, dirPath);
+ intent.addCategory(Intent.CATEGORY_LAUNCHER);
+ getContext().startActivity(intent);
+ if (!latch.await(POLLING_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
+ final String errorMessage = "Timed out while waiting to receive " + actionName
+ + " intent from " + packageName;
+ throw new TimeoutException(errorMessage);
+ }
+ getContext().unregisterReceiver(broadcastReceiver);
+ }
+
+ /**
+ * <p>This method drops shell permission identity.
+ */
+ private static void forceStopApp(String packageName) throws Exception {
+ UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ try {
+ uiAutomation.adoptShellPermissionIdentity(Manifest.permission.FORCE_STOP_PACKAGES);
+
+ getContext().getSystemService(ActivityManager.class).forceStopPackage(packageName);
+ Thread.sleep(1000);
+ } finally {
+ uiAutomation.dropShellPermissionIdentity();
+ }
+ }
+
+ public static void assertFileContent(File file1, File file2, ParcelFileDescriptor pfd1,
+ ParcelFileDescriptor pfd2, boolean assertSame) throws Exception {
+ final int len = 1024;
+ byte[] bytes1;
+ byte[] bytes2;
+ int size1 = 0;
+ int size2 = 0;
+
+ boolean isSame = true;
+ do {
+ bytes1 = new byte[len];
+ bytes2 = new byte[len];
+
+ size1 = Os.read(pfd1.getFileDescriptor(), bytes1, 0, len);
+ size2 = Os.read(pfd2.getFileDescriptor(), bytes2, 0, len);
+
+ assertTrue(size1 >= 0);
+ assertTrue(size2 >= 0);
+
+ isSame = (size1 == size2) && Arrays.equals(bytes1, bytes2);
+ if (!isSame) {
+ break;
+ }
+ } while (size1 > 0 && size2 > 0);
+
+ String message = String.format("Files: %s and %s. isSame=%b. assertSame=%s",
+ file1, file2, isSame, assertSame);
+ assertEquals(message, isSame, assertSame);
+ }
+
+ public static void assertTranscode(Uri uri, boolean transcode) throws Exception {
+ long start = SystemClock.elapsedRealtimeNanos();
+ assertTranscode(open(uri, true, null /* bundle */), transcode);
+ }
+
+ public static void assertTranscode(File file, boolean transcode) throws Exception {
+ assertTranscode(open(file, false), transcode);
+ }
+
+ public static void assertTranscode(ParcelFileDescriptor pfd, boolean transcode)
+ throws Exception {
+ long start = SystemClock.elapsedRealtimeNanos();
+ assertEquals(10, Os.pread(pfd.getFileDescriptor(), new byte[10], 0, 10, 0));
+ long end = SystemClock.elapsedRealtimeNanos();
+ long readDuration = end - start;
+
+ // With transcoding read(2) > 100ms (usually > 1s)
+ // Without transcoding read(2) < 10ms (usually < 1ms)
+ String message = "readDuration=" + readDuration + "ns";
+ if (transcode) {
+ assertTrue(message, readDuration > TimeUnit.MILLISECONDS.toNanos(100));
+ } else {
+ assertTrue(message, readDuration < TimeUnit.MILLISECONDS.toNanos(10));
+ }
+ }
+}
diff --git a/tests/accessibility/res/xml/speaking_accessibilityservice.xml b/tests/accessibility/res/xml/speaking_accessibilityservice.xml
index 9128309..1cb6c39 100644
--- a/tests/accessibility/res/xml/speaking_accessibilityservice.xml
+++ b/tests/accessibility/res/xml/speaking_accessibilityservice.xml
@@ -26,4 +26,5 @@
android:htmlDescription="@string/html_description_speaking_accessibility_service"
android:summary="@string/some_summary"
android:nonInteractiveUiTimeout="1000"
- android:interactiveUiTimeout="6000"/>
\ No newline at end of file
+ android:interactiveUiTimeout="6000"
+ android:isAccessibilityTool="true"/>
\ No newline at end of file
diff --git a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityServiceInfoTest.java b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityServiceInfoTest.java
index 2fb7916..6250d16 100644
--- a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityServiceInfoTest.java
+++ b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityServiceInfoTest.java
@@ -22,6 +22,7 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
import android.accessibility.cts.common.AccessibilityDumpOnFailureRule;
import android.accessibility.cts.common.InstrumentedAccessibilityServiceTestRule;
@@ -144,5 +145,6 @@
speakingService.getInteractiveUiTimeoutMillis());
assertEquals(/* expected= */ 1000,
speakingService.getNonInteractiveUiTimeoutMillis());
+ assertTrue(speakingService.isAccessibilityTool());
}
}
diff --git a/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java b/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
index a8d93b5..7f481cb 100644
--- a/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
+++ b/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
@@ -121,19 +121,12 @@
Log.w(TAG, "Skipping SetGetNetworkSlicingEnabled");
return;
}
-
-
try {
mDevicePolicyManager.clearProfileOwner(DeviceAdminInfoTest.getProfileOwnerComponent());
assertThrows(SecurityException.class,
() -> mDevicePolicyManager.setNetworkSlicingEnabled(true));
-
assertThrows(SecurityException.class,
() -> mDevicePolicyManager.isNetworkSlicingEnabled());
-
- assertThrows(SecurityException.class,
- () -> mDevicePolicyManager.isNetworkSlicingEnabledForUser(
- Process.myUserHandle()));
} catch (SecurityException se) {
Log.w(TAG, "Test is not a profile owner and there is no need to clear.");
} finally {
@@ -141,7 +134,6 @@
"dpm set-profile-owner --user cur "
+ DeviceAdminInfoTest.getProfileOwnerComponent().flattenToString());
}
-
}
public void testKeyguardDisabledFeatures() {
diff --git a/tests/app/app/src/android/app/stubs/BubbledActivity.java b/tests/app/app/src/android/app/stubs/BubbledActivity.java
index 49f6a0e..79530a5 100644
--- a/tests/app/app/src/android/app/stubs/BubbledActivity.java
+++ b/tests/app/app/src/android/app/stubs/BubbledActivity.java
@@ -18,24 +18,37 @@
import android.app.Activity;
import android.content.Intent;
+import android.content.LocusId;
import android.os.Bundle;
/**
* Used by NotificationManagerTest for testing policy around bubbles, this activity is shown
- * within the bubble.
+ * within the bubble (and sometimes outside too depending on the test).
*/
public class BubbledActivity extends Activity {
boolean mIsBubbled = false;
+ public static final String EXTRA_LOCUS_ID = "EXTRA_ID_LOCUS_ID";
+ private LocusId mLocusId;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
+
mIsBubbled = getIntent().getBooleanExtra(Intent.EXTRA_IS_BUBBLED, false);
+ Bundle b = getIntent().getExtras();
+ String locus = b != null ? b.getString(EXTRA_LOCUS_ID, null) : null;
+ mLocusId = locus != null ? new LocusId(locus) : null;
+ setLocusContext(mLocusId, null /* bundle */);
}
public boolean isBubbled() {
return mIsBubbled;
}
+
+ public LocusId getLocusId() {
+ return mLocusId;
+ }
}
diff --git a/tests/app/app/src/android/app/stubs/SendBubbleActivity.java b/tests/app/app/src/android/app/stubs/SendBubbleActivity.java
index 19b45e3..39ba720 100644
--- a/tests/app/app/src/android/app/stubs/SendBubbleActivity.java
+++ b/tests/app/app/src/android/app/stubs/SendBubbleActivity.java
@@ -16,6 +16,8 @@
package android.app.stubs;
+import static android.app.stubs.BubbledActivity.EXTRA_LOCUS_ID;
+
import android.app.Activity;
import android.app.Notification;
import android.app.Notification.BubbleMetadata;
@@ -24,6 +26,7 @@
import android.app.Person;
import android.content.Context;
import android.content.Intent;
+import android.content.LocusId;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.SystemClock;
@@ -54,45 +57,72 @@
sendBroadcast(i);
}
+ public void startBubbleActivity(int id) {
+ startBubbleActivity(id, true /* addLocusId */);
+ }
+
+ /**
+ * Starts the same activity that is in the bubble produced by this activity.
+ */
+ public void startBubbleActivity(int id, boolean addLocusId) {
+ final Intent intent = new Intent(getApplicationContext(), BubbledActivity.class);
+ // Clear any previous instance of this activity
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
+ if (addLocusId) {
+ intent.putExtra(EXTRA_LOCUS_ID, String.valueOf(id));
+ }
+ startActivity(intent);
+ }
+
/**
* Sends a notification that has bubble metadata but the rest of the notification isn't
* configured correctly so the system won't allow it to bubble.
*/
- public void sendInvalidBubble(boolean autoExpand) {
+ public void sendInvalidBubble(int notifId, boolean autoExpand) {
Context context = getApplicationContext();
- PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(),
+ PendingIntent pendingIntent = PendingIntent.getActivity(context, notifId, new Intent(),
PendingIntent.FLAG_MUTABLE);
Notification n = new Notification.Builder(context, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.black)
.setWhen(System.currentTimeMillis())
- .setContentTitle("notify#" + BUBBLE_NOTIF_ID)
- .setContentText("This is #" + BUBBLE_NOTIF_ID + "notification ")
+ .setContentTitle("notify#" + notifId)
+ .setContentText("This is #" + notifId + "notification ")
.setContentIntent(pendingIntent)
- .setBubbleMetadata(getBubbleMetadata(autoExpand,
+ .setBubbleMetadata(getBubbleMetadata(notifId, autoExpand,
false /* suppressNotification */,
+ false /* suppressBubble */,
false /* useShortcut */))
.build();
NotificationManager noMan = (NotificationManager) context.getSystemService(
Context.NOTIFICATION_SERVICE);
- noMan.notify(BUBBLE_NOTIF_ID, n);
+ noMan.notify(notifId, n);
}
/** Sends a notification that is properly configured to bubble. */
- public void sendBubble(boolean autoExpand, boolean suppressNotification) {
- sendBubble(autoExpand, suppressNotification, false /* useShortcut */);
+ public void sendBubble(int notifId, boolean autoExpand, boolean suppressNotification) {
+ sendBubble(notifId, autoExpand, suppressNotification, false /* suppressBubble */,
+ false /* useShortcut */, true /* setLocusId */);
}
/** Sends a notification that is properly configured to bubble. */
- public void sendBubble(boolean autoExpand, boolean suppressNotification, boolean useShortcut) {
+ public void sendBubble(int notifId, boolean autoExpand, boolean suppressNotification,
+ boolean suppressBubble) {
+ sendBubble(notifId, autoExpand, suppressNotification, suppressBubble,
+ false /* useShortcut */, true /* setLocusId */);
+ }
+
+ /** Sends a notification that is properly configured to bubble. */
+ public void sendBubble(int notifId, boolean autoExpand, boolean suppressNotification,
+ boolean suppressBubble, boolean useShortcut, boolean setLocusId) {
Context context = getApplicationContext();
// Give it a person
Person person = new Person.Builder()
- .setName("bubblebot")
+ .setName("bubblebot" + notifId)
.build();
// Make it messaging style
- Notification n = new Notification.Builder(context, NOTIFICATION_CHANNEL_ID)
+ Notification.Builder nb = new Notification.Builder(context, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.black)
.setContentTitle("Bubble Chat")
.setShortcutId(SHARE_SHORTCUT_ID)
@@ -103,20 +133,29 @@
.addMessage("Is it me you're looking for?",
SystemClock.currentThreadTimeMillis(), person)
)
- .setBubbleMetadata(getBubbleMetadata(autoExpand, suppressNotification, useShortcut))
- .build();
+ .setBubbleMetadata(getBubbleMetadata(notifId,
+ autoExpand,
+ suppressNotification,
+ suppressBubble,
+ useShortcut));
+
+ if (setLocusId) {
+ nb.setLocusId(new LocusId(String.valueOf(notifId)));
+ }
NotificationManager noMan = (NotificationManager) context.getSystemService(
Context.NOTIFICATION_SERVICE);
- noMan.notify(BUBBLE_NOTIF_ID, n);
+ noMan.notify(notifId, nb.build());
}
- private BubbleMetadata getBubbleMetadata(boolean autoExpand,
+ private BubbleMetadata getBubbleMetadata(int notifId, boolean autoExpand,
boolean suppressNotification,
+ boolean suppressBubble,
boolean useShortcut) {
if (useShortcut) {
return new Notification.BubbleMetadata.Builder(SHARE_SHORTCUT_ID)
.setAutoExpandBubble(autoExpand)
+ .setSuppressBubble(suppressBubble)
.setSuppressNotification(suppressNotification)
.build();
} else {
@@ -125,13 +164,14 @@
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_MAIN);
final PendingIntent pendingIntent =
- PendingIntent.getActivity(context, 0, intent,
- PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent.getActivity(context, notifId, intent,
+ PendingIntent.FLAG_MUTABLE);
return new Notification.BubbleMetadata.Builder(pendingIntent,
Icon.createWithResource(context, R.drawable.black))
.setAutoExpandBubble(autoExpand)
.setSuppressNotification(suppressNotification)
+ .setSuppressBubble(suppressBubble)
.build();
}
}
diff --git a/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java b/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java
index 22a47bd..3993cd2 100644
--- a/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java
+++ b/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java
@@ -53,6 +53,7 @@
import androidx.test.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
import com.android.compatibility.common.util.SystemUtil;
@@ -1152,6 +1153,112 @@
}
/**
+ * Test a FGS can start from BG if the process had a visible activity recently.
+ */
+ @LargeTest
+ @Test
+ public void testVisibleActivityGracePeriod() throws Exception {
+ ApplicationInfo app2Info = mContext.getPackageManager().getApplicationInfo(
+ PACKAGE_NAME_APP2, 0);
+ WatchUidRunner uid2Watcher = new WatchUidRunner(mInstrumentation, app2Info.uid,
+ WAITFOR_MSEC);
+ final String namespaceActivityManager = "activity_manager";
+ final String keyFgToBgFgsGraceDuration = "fg_to_bg_fgs_grace_duration";
+ final long[] curFgToBgFgsGraceDuration = {-1};
+ try {
+ // Enable the FGS background startForeground() restriction.
+ enableFgsRestriction(true, true, null);
+ // Allow bg actvity start from APP1.
+ allowBgActivityStart(PACKAGE_NAME_APP1, true);
+
+ SystemUtil.runWithShellPermissionIdentity(() -> {
+ curFgToBgFgsGraceDuration[0] = DeviceConfig.getInt(
+ namespaceActivityManager,
+ keyFgToBgFgsGraceDuration, -1);
+ DeviceConfig.setProperty(namespaceActivityManager,
+ keyFgToBgFgsGraceDuration,
+ Long.toString(WAITFOR_MSEC), false);
+ });
+
+ testVisibleActivityGracePeriodInternal(uid2Watcher, "KEYCODE_HOME");
+ testVisibleActivityGracePeriodInternal(uid2Watcher, "KEYCODE_BACK");
+ } finally {
+ uid2Watcher.finish();
+ // Remove package from AllowList.
+ allowBgActivityStart(PACKAGE_NAME_APP1, false);
+ if (curFgToBgFgsGraceDuration[0] >= 0) {
+ SystemUtil.runWithShellPermissionIdentity(() -> {
+ DeviceConfig.setProperty(namespaceActivityManager,
+ keyFgToBgFgsGraceDuration,
+ Long.toString(curFgToBgFgsGraceDuration[0]), false);
+ });
+ } else {
+ CtsAppTestUtils.executeShellCmd(mInstrumentation,
+ "device_config delete " + namespaceActivityManager
+ + " " + keyFgToBgFgsGraceDuration);
+ }
+ }
+ }
+
+ private void testVisibleActivityGracePeriodInternal(WatchUidRunner uidWatcher, String keyCode)
+ throws Exception {
+ testVisibleActivityGracePeriodInternal(uidWatcher, keyCode, null,
+ () -> uidWatcher.waitFor(WatchUidRunner.CMD_PROCSTATE,
+ WatchUidRunner.STATE_FG_SERVICE), true);
+
+ testVisibleActivityGracePeriodInternal(uidWatcher, keyCode,
+ () -> SystemClock.sleep(WAITFOR_MSEC + 2000), // Wait for the grace period to expire
+ () -> {
+ try {
+ uidWatcher.waitFor(WatchUidRunner.CMD_PROCSTATE,
+ WatchUidRunner.STATE_FG_SERVICE);
+ fail("Service should not enter foreground service state");
+ } catch (Exception e) {
+ // Expected.
+ }
+ }, false);
+ }
+
+ private void testVisibleActivityGracePeriodInternal(WatchUidRunner uidWatcher,
+ String keyCode, Runnable prep, Runnable verifier, boolean stopFgs) throws Exception {
+ // Put APP2 in TOP state.
+ CommandReceiver.sendCommand(mContext,
+ CommandReceiver.COMMAND_START_ACTIVITY,
+ PACKAGE_NAME_APP1, PACKAGE_NAME_APP2, 0, null);
+ uidWatcher.waitFor(WatchUidRunner.CMD_PROCSTATE, WatchUidRunner.STATE_TOP);
+
+ // Take a nap to wait for the UI to settle down.
+ SystemClock.sleep(2000);
+
+ // Now inject key event.
+ CtsAppTestUtils.executeShellCmd(mInstrumentation, "input keyevent " + keyCode);
+
+ // It should go to the cached state.
+ uidWatcher.waitFor(WatchUidRunner.CMD_CACHED, null);
+
+ if (prep != null) {
+ prep.run();
+ }
+
+ // Start FGS from APP2.
+ CommandReceiver.sendCommand(mContext,
+ CommandReceiver.COMMAND_START_FOREGROUND_SERVICE,
+ PACKAGE_NAME_APP2, PACKAGE_NAME_APP2, 0, null);
+
+ if (verifier != null) {
+ verifier.run();
+ }
+
+ if (stopFgs) {
+ // Stop the FGS.
+ CommandReceiver.sendCommand(mContext,
+ CommandReceiver.COMMAND_STOP_FOREGROUND_SERVICE,
+ PACKAGE_NAME_APP2, PACKAGE_NAME_APP2, 0, null);
+ uidWatcher.waitFor(WatchUidRunner.CMD_CACHED, null);
+ }
+ }
+
+ /**
* Turn on the FGS BG-launch restriction. DeviceConfig can turn on restriction on the whole
* device (across all apps). AppCompat can turn on restriction on a single app package.
* @param enable true to turn on restriction, false to turn off.
diff --git a/tests/app/src/android/app/cts/NotificationManagerTest.java b/tests/app/src/android/app/cts/NotificationManagerTest.java
index 926431f..a37144d 100644
--- a/tests/app/src/android/app/cts/NotificationManagerTest.java
+++ b/tests/app/src/android/app/cts/NotificationManagerTest.java
@@ -90,6 +90,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.LocusId;
import android.content.OperationApplicationException;
import android.content.ServiceConnection;
import android.content.pm.PackageInfo;
@@ -250,7 +251,6 @@
protected void tearDown() throws Exception {
super.tearDown();
mNotificationManager.cancelAll();
-
for (String id : mRuleIds) {
mNotificationManager.removeAutomaticZenRule(id);
}
@@ -3294,7 +3294,7 @@
// Start & get the activity
SendBubbleActivity a = startSendBubbleActivity();
// Send a bubble that doesn't fulfill policy from foreground
- a.sendInvalidBubble(false /* autoExpand */);
+ a.sendInvalidBubble(BUBBLE_NOTIF_ID, false /* autoExpand */);
// No foreground bubbles that don't fulfill policy in R (allowed in Q)
verifyNotificationBubbleState(BUBBLE_NOTIF_ID, false /* shouldBeBubble */);
@@ -3330,10 +3330,9 @@
new Instrumentation.ActivityMonitor(clazz.getName(), result, false);
InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
- a.sendBubble(true /* autoExpand */, false /* suppressNotif */);
+ a.sendBubble(BUBBLE_NOTIF_ID, true /* autoExpand */, false /* suppressNotif */);
- boolean shouldBeBubble = !mActivityManager.isLowRamDevice();
- verifyNotificationBubbleState(BUBBLE_NOTIF_ID, shouldBeBubble);
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
@@ -3572,8 +3571,7 @@
.build();
Notification.Builder nb = getConversationNotification();
- boolean shouldBeBubble = !mActivityManager.isLowRamDevice();
- sendAndVerifyBubble(42, nb, data, shouldBeBubble);
+ sendAndVerifyBubble(42, nb, data, true /* shouldBeBubble */);
mListener.resetData();
deleteShortcuts();
@@ -3601,9 +3599,8 @@
SendBubbleActivity a = startSendBubbleActivity();
// send the bubble with notification suppressed
- a.sendBubble(false /* autoExpand */, true /* suppressNotif */);
- boolean shouldBeBubble = !mActivityManager.isLowRamDevice();
- verifyNotificationBubbleState(BUBBLE_NOTIF_ID, shouldBeBubble);
+ a.sendBubble(BUBBLE_NOTIF_ID, false /* autoExpand */, true /* suppressNotif */);
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
// check for the notification
StatusBarNotification sbnSuppressed = mListener.mPosted.get(0);
@@ -3617,8 +3614,8 @@
mListener.resetData();
// send the bubble with notification NOT suppressed
- a.sendBubble(false /* autoExpand */, false /* suppressNotif */);
- verifyNotificationBubbleState(BUBBLE_NOTIF_ID, shouldBeBubble);
+ a.sendBubble(BUBBLE_NOTIF_ID, false /* autoExpand */, false /* suppressNotif */);
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBubble */);
// check for the notification
StatusBarNotification sbnNotSuppressed = mListener.mPosted.get(0);
@@ -3648,8 +3645,14 @@
createDynamicShortcut();
setUpNotifListener();
- // make ourselves foreground so we can auto-expand the bubble
+ // Make a bubble
SendBubbleActivity a = startSendBubbleActivity();
+ a.sendBubble(BUBBLE_NOTIF_ID,
+ false /* autoExpand */,
+ false /* suppressNotif */,
+ true /* suppressBubble */);
+
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
// Prep to find bubbled activity
Class clazz = BubbledActivity.class;
@@ -3659,7 +3662,7 @@
new Instrumentation.ActivityMonitor(clazz.getName(), result, false);
InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
- a.sendBubble(true /* autoExpand */, false /* suppressNotif */);
+ a.sendBubble(BUBBLE_NOTIF_ID, true /* autoExpand */, false /* suppressNotif */);
verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
@@ -3688,8 +3691,14 @@
createDynamicShortcut();
setUpNotifListener();
- // make ourselves foreground so we can auto-expand the bubble
+ // Make a bubble
SendBubbleActivity a = startSendBubbleActivity();
+ a.sendBubble(BUBBLE_NOTIF_ID,
+ false /* autoExpand */,
+ false /* suppressNotif */,
+ true /* suppressBubble */);
+
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
// Prep to find bubbled activity
Class clazz = BubbledActivity.class;
@@ -3699,7 +3708,10 @@
new Instrumentation.ActivityMonitor(clazz.getName(), result, false);
InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
- a.sendBubble(true /* autoExpand */, false /* suppressNotif */, true /* useShortcut */);
+ a.sendBubble(BUBBLE_NOTIF_ID,
+ true /* autoExpand */,
+ false /* suppressNotif */,
+ true /* useShortcut */);
verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
@@ -3713,6 +3725,299 @@
}
}
+ /** Verifies the bubble is suppressed when it should be. */
+ public void testNotificationManagerBubble_setSuppressBubble()
+ throws Exception {
+ if (FeatureUtil.isAutomotive() || FeatureUtil.isTV()
+ || mActivityManager.isLowRamDevice()) {
+ // These do not support bubbles.
+ return;
+ }
+ try {
+ setBubblesGlobal(true);
+ setBubblesAppPref(1 /* all */);
+ setBubblesChannelAllowed(true);
+
+ createDynamicShortcut();
+ setUpNotifListener();
+
+ final int notifId = 3;
+
+ // Make a bubble
+ SendBubbleActivity a = startSendBubbleActivity();
+ a.sendBubble(notifId,
+ false /* autoExpand */,
+ false /* suppressNotif */,
+ true /* suppressBubble */);
+
+ verifyNotificationBubbleState(notifId, true /* shouldBeBubble */);
+
+ // Prep to find bubbled activity
+ Class clazz = BubbledActivity.class;
+ Instrumentation.ActivityResult result =
+ new Instrumentation.ActivityResult(0, new Intent());
+ Instrumentation.ActivityMonitor monitor =
+ new Instrumentation.ActivityMonitor(clazz.getName(), result, false);
+ InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
+
+ // Launch same activity as whats in the bubble
+ a.startBubbleActivity(notifId);
+ BubbledActivity activity = (BubbledActivity) monitor.waitForActivity();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ // It should have the locusId
+ assertEquals(new LocusId(String.valueOf(notifId)),
+ activity.getLocusId());
+
+ // notif gets posted with update, so wait
+ verifyNotificationBubbleState(notifId, true /* shouldBeBubble */);
+
+ // Bubble should have suppressed flag
+ StatusBarNotification sbn = findPostedNotification(notifId, true);
+ assertTrue(sbn.getNotification().getBubbleMetadata().isBubbleSuppressable());
+ assertTrue(sbn.getNotification().getBubbleMetadata().isBubbleSuppressed());
+ } finally {
+ deleteShortcuts();
+ cleanupSendBubbleActivity();
+ }
+ }
+
+ /** Verifies the bubble is not suppressed if dev didn't specify suppressable */
+ public void testNotificationManagerBubble_setSuppressBubble_notSuppressable()
+ throws Exception {
+ if (FeatureUtil.isAutomotive() || FeatureUtil.isTV()
+ || mActivityManager.isLowRamDevice()) {
+ // These do not support bubbles.
+ return;
+ }
+ try {
+ setBubblesGlobal(true);
+ setBubblesAppPref(1 /* all */);
+ setBubblesChannelAllowed(true);
+
+ createDynamicShortcut();
+ setUpNotifListener();
+
+ // Make a bubble
+ SendBubbleActivity a = startSendBubbleActivity();
+ a.sendBubble(BUBBLE_NOTIF_ID,
+ false /* autoExpand */,
+ false /* suppressNotif */,
+ false /* suppressBubble */);
+
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
+
+ // Prep to find bubbled activity
+ Class clazz = BubbledActivity.class;
+ Instrumentation.ActivityResult result =
+ new Instrumentation.ActivityResult(0, new Intent());
+ Instrumentation.ActivityMonitor monitor =
+ new Instrumentation.ActivityMonitor(clazz.getName(), result, false);
+ InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
+
+ // Launch same activity as whats in the bubble
+ a.startBubbleActivity(BUBBLE_NOTIF_ID);
+ BubbledActivity activity = (BubbledActivity) monitor.waitForActivity();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ // It should have the locusId
+ assertEquals(new LocusId(String.valueOf(BUBBLE_NOTIF_ID)),
+ activity.getLocusId());
+
+ // notif gets posted with update, so wait
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
+
+ // Bubble should not be suppressed
+ StatusBarNotification sbn = findPostedNotification(BUBBLE_NOTIF_ID, true);
+ assertFalse(sbn.getNotification().getBubbleMetadata().isBubbleSuppressable());
+ assertFalse(sbn.getNotification().getBubbleMetadata().isBubbleSuppressed());
+ } finally {
+ deleteShortcuts();
+ cleanupSendBubbleActivity();
+ }
+ }
+
+ /** Verifies the bubble is not suppressed if the activity doesn't have a locusId. */
+ public void testNotificationManagerBubble_setSuppressBubble_activityNoLocusId()
+ throws Exception {
+ if (FeatureUtil.isAutomotive() || FeatureUtil.isTV()
+ || mActivityManager.isLowRamDevice()) {
+ // These do not support bubbles.
+ return;
+ }
+ try {
+ setBubblesGlobal(true);
+ setBubblesAppPref(1 /* all */);
+ setBubblesChannelAllowed(true);
+
+ createDynamicShortcut();
+ setUpNotifListener();
+
+ // Make a bubble
+ SendBubbleActivity a = startSendBubbleActivity();
+ a.sendBubble(BUBBLE_NOTIF_ID,
+ false /* autoExpand */,
+ false /* suppressNotif */,
+ true /* suppressBubble */);
+
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
+
+ // Prep to find bubbled activity
+ Class clazz = BubbledActivity.class;
+ Instrumentation.ActivityResult result =
+ new Instrumentation.ActivityResult(0, new Intent());
+ Instrumentation.ActivityMonitor monitor =
+ new Instrumentation.ActivityMonitor(clazz.getName(), result, false);
+ InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
+
+ // Launch same activity as whats in the bubble
+ a.startBubbleActivity(BUBBLE_NOTIF_ID, false /* addLocusId */);
+ BubbledActivity activity = (BubbledActivity) monitor.waitForActivity();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ // It shouldn't have the locusId
+ assertNull(activity.getLocusId());
+
+ // notif gets posted with update, so wait
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
+
+ // Bubble should not be suppressed
+ StatusBarNotification sbn = findPostedNotification(BUBBLE_NOTIF_ID, true);
+ assertTrue(sbn.getNotification().getBubbleMetadata().isBubbleSuppressable());
+ assertFalse(sbn.getNotification().getBubbleMetadata().isBubbleSuppressed());
+ } finally {
+ deleteShortcuts();
+ cleanupSendBubbleActivity();
+ }
+ }
+
+ /** Verifies the bubble is not suppressed if the notification doesn't have a locusId. */
+ public void testNotificationManagerBubble_setSuppressBubble_notificationNoLocusId()
+ throws Exception {
+ if (FeatureUtil.isAutomotive() || FeatureUtil.isTV()
+ || mActivityManager.isLowRamDevice()) {
+ // These do not support bubbles.
+ return;
+ }
+ try {
+ setBubblesGlobal(true);
+ setBubblesAppPref(1 /* all */);
+ setBubblesChannelAllowed(true);
+
+ createDynamicShortcut();
+ setUpNotifListener();
+
+ // Make a bubble
+ SendBubbleActivity a = startSendBubbleActivity();
+ a.sendBubble(BUBBLE_NOTIF_ID,
+ false /* autoExpand */,
+ false /* suppressNotif */,
+ true /* suppressBubble */,
+ false /* useShortcut */,
+ false /* setLocusId */);
+
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
+
+ // Prep to find bubbled activity
+ Class clazz = BubbledActivity.class;
+ Instrumentation.ActivityResult result =
+ new Instrumentation.ActivityResult(0, new Intent());
+ Instrumentation.ActivityMonitor monitor =
+ new Instrumentation.ActivityMonitor(clazz.getName(), result, false);
+ InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
+
+ // Launch same activity as whats in the bubble
+ a.startBubbleActivity(BUBBLE_NOTIF_ID, true /* addLocusId */);
+ BubbledActivity activity = (BubbledActivity) monitor.waitForActivity();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ // Activity has the locus
+ assertNotNull(activity.getLocusId());
+
+ // notif gets posted with update, so wait
+ verifyNotificationBubbleState(BUBBLE_NOTIF_ID, true /* shouldBeBubble */);
+
+ // Bubble should not be suppressed & not have a locusId
+ StatusBarNotification sbn = findPostedNotification(BUBBLE_NOTIF_ID, true);
+ assertNull(sbn.getNotification().getLocusId());
+ assertTrue(sbn.getNotification().getBubbleMetadata().isBubbleSuppressable());
+ assertFalse(sbn.getNotification().getBubbleMetadata().isBubbleSuppressed());
+ } finally {
+ deleteShortcuts();
+ cleanupSendBubbleActivity();
+ }
+ }
+
+ /** Verifies the bubble is unsuppressed when the locus activity is hidden. */
+ public void testNotificationManagerBubble_setSuppressBubble_dismissLocusActivity()
+ throws Exception {
+ if (FeatureUtil.isAutomotive() || FeatureUtil.isTV()
+ || mActivityManager.isLowRamDevice()) {
+ // These do not support bubbles.
+ return;
+ }
+ try {
+ setBubblesGlobal(true);
+ setBubblesAppPref(1 /* all */);
+ setBubblesChannelAllowed(true);
+
+ createDynamicShortcut();
+ setUpNotifListener();
+
+ final int notifId = 2;
+
+ // Make a bubble
+ SendBubbleActivity a = startSendBubbleActivity();
+ a.sendBubble(notifId,
+ false /* autoExpand */,
+ false /* suppressNotif */,
+ true /* suppressBubble */);
+
+ verifyNotificationBubbleState(notifId, true);
+
+ StatusBarNotification sbn = findPostedNotification(notifId, true);
+ assertTrue(sbn.getNotification().getBubbleMetadata().isBubbleSuppressable());
+ assertFalse(sbn.getNotification().getBubbleMetadata().isBubbleSuppressed());
+
+ // Prep to find bubbled activity
+ Class clazz = BubbledActivity.class;
+ Instrumentation.ActivityResult result =
+ new Instrumentation.ActivityResult(0, new Intent());
+ Instrumentation.ActivityMonitor monitor =
+ new Instrumentation.ActivityMonitor(clazz.getName(), result, false);
+ InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
+
+ // Launch same activity as whats in the bubble
+ a.startBubbleActivity(notifId);
+ BubbledActivity activity = (BubbledActivity) monitor.waitForActivity();
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+ // It should have the locusId
+ assertEquals(new LocusId(String.valueOf(notifId)),
+ activity.getLocusId());
+
+ // notif gets posted with update, so wait
+ verifyNotificationBubbleState(notifId, true /* shouldBeBubble */);
+
+ // Bubble should have suppressed flag
+ sbn = findPostedNotification(notifId, true);
+ assertTrue(sbn.getNotification().getBubbleMetadata().isBubbleSuppressable());
+ assertTrue(sbn.getNotification().getBubbleMetadata().isBubbleSuppressed());
+
+ activity.finish();
+
+ // notif gets posted with update, so wait
+ verifyNotificationBubbleState(notifId, true /* shouldBeBubble */);
+
+ sbn = findPostedNotification(notifId, true);
+ assertTrue(sbn.getNotification().getBubbleMetadata().isBubbleSuppressable());
+ assertFalse(sbn.getNotification().getBubbleMetadata().isBubbleSuppressed());
+ } finally {
+ deleteShortcuts();
+ cleanupSendBubbleActivity();
+ }
+ }
+
public void testOriginalChannelImportance() {
NotificationChannel channel = new NotificationChannel(mId, "my channel", IMPORTANCE_HIGH);
diff --git a/tests/app/src/android/app/cts/NotificationTest.java b/tests/app/src/android/app/cts/NotificationTest.java
index e718d10..6c349c7 100644
--- a/tests/app/src/android/app/cts/NotificationTest.java
+++ b/tests/app/src/android/app/cts/NotificationTest.java
@@ -628,12 +628,15 @@
}
public void testBubbleMetadataBuilder() {
- PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
- PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_MUTABLE);
+ PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_IMMUTABLE);
Icon icon = Icon.createWithResource(mContext, 1);
Notification.BubbleMetadata.Builder metadataBuilder =
new Notification.BubbleMetadata.Builder(bubbleIntent, icon)
.setDesiredHeight(BUBBLE_HEIGHT)
+ .setSuppressBubble(false)
.setDeleteIntent(deleteIntent);
Notification.BubbleMetadata data = metadataBuilder.build();
@@ -642,18 +645,22 @@
assertEquals(bubbleIntent, data.getIntent());
assertEquals(deleteIntent, data.getDeleteIntent());
assertFalse(data.isNotificationSuppressed());
+ assertFalse(data.isBubbleSuppressable());
assertFalse(data.getAutoExpandBubble());
}
public void testBubbleMetadata_parcel() {
- PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
- PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_MUTABLE);
+ PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_IMMUTABLE);
Icon icon = Icon.createWithResource(mContext, 1);
Notification.BubbleMetadata metadata =
new Notification.BubbleMetadata.Builder(bubbleIntent, icon)
.setDesiredHeight(BUBBLE_HEIGHT)
.setAutoExpandBubble(true)
.setSuppressNotification(true)
+ .setSuppressBubble(true)
.setDeleteIntent(deleteIntent)
.build();
@@ -664,30 +671,35 @@
assertEquals(deleteIntent, metadata.getDeleteIntent());
assertTrue(metadata.getAutoExpandBubble());
assertTrue(metadata.isNotificationSuppressed());
+ assertTrue(metadata.isBubbleSuppressable());
}
public void testBubbleMetadataBuilder_shortcutId() {
- PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_IMMUTABLE);
Notification.BubbleMetadata.Builder metadataBuilder =
new Notification.BubbleMetadata.Builder(BUBBLE_SHORTCUT_ID)
.setDesiredHeight(BUBBLE_HEIGHT)
+ .setSuppressBubble(true)
.setDeleteIntent(deleteIntent);
Notification.BubbleMetadata data = metadataBuilder.build();
assertEquals(BUBBLE_HEIGHT, data.getDesiredHeight());
assertEquals(BUBBLE_SHORTCUT_ID, data.getShortcutId());
assertEquals(deleteIntent, data.getDeleteIntent());
+ assertTrue(data.isBubbleSuppressable());
assertFalse(data.isNotificationSuppressed());
assertFalse(data.getAutoExpandBubble());
}
public void testBubbleMetadataBuilder_parcelShortcutId() {
- PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
-
+ PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_IMMUTABLE);
Notification.BubbleMetadata metadata =
new Notification.BubbleMetadata.Builder(BUBBLE_SHORTCUT_ID)
.setDesiredHeight(BUBBLE_HEIGHT)
.setAutoExpandBubble(true)
+ .setSuppressBubble(true)
.setSuppressNotification(true)
.setDeleteIntent(deleteIntent)
.build();
@@ -696,12 +708,14 @@
assertEquals(BUBBLE_HEIGHT, metadata.getDesiredHeight());
assertEquals(deleteIntent, metadata.getDeleteIntent());
assertEquals(BUBBLE_SHORTCUT_ID, metadata.getShortcutId());
+ assertTrue(metadata.isBubbleSuppressable());
assertTrue(metadata.getAutoExpandBubble());
assertTrue(metadata.isNotificationSuppressed());
}
public void testBubbleMetadata_parcelResId() {
- PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_IMMUTABLE);
Icon icon = Icon.createWithResource(mContext, 1);
Notification.BubbleMetadata metadata =
new Notification.BubbleMetadata.Builder(bubbleIntent, icon)
@@ -712,6 +726,7 @@
assertEquals(icon, metadata.getIcon());
assertEquals(bubbleIntent, metadata.getIntent());
assertFalse(metadata.getAutoExpandBubble());
+ assertFalse(metadata.isBubbleSuppressable());
assertFalse(metadata.isNotificationSuppressed());
}
@@ -737,7 +752,8 @@
}
public void testBubbleMetadataBuilder_shortcutBuilder_throwsForSetIntent() {
- PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_MUTABLE);
try {
Notification.BubbleMetadata.Builder metadataBuilder =
new Notification.BubbleMetadata.Builder(BUBBLE_SHORTCUT_ID)
@@ -801,7 +817,8 @@
new Canvas(b).drawColor(0xffff0000);
Icon icon = Icon.createWithAdaptiveBitmap(b);
- PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_MUTABLE);
Notification.BubbleMetadata.Builder metadataBuilder =
new Notification.BubbleMetadata.Builder(bubbleIntent, icon);
Notification.BubbleMetadata metadata = metadataBuilder.build();
@@ -812,7 +829,8 @@
public void testBubbleMetadataBuilder_noThrowForNonBitmapIcon() {
Icon icon = Icon.createWithResource(mContext, R.drawable.ic_android);
- PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_MUTABLE);
Notification.BubbleMetadata.Builder metadataBuilder =
new Notification.BubbleMetadata.Builder(bubbleIntent, icon);
Notification.BubbleMetadata metadata = metadataBuilder.build();
@@ -821,8 +839,10 @@
}
public void testBubbleMetadataBuilder_replaceHeightRes() {
- PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
- PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_MUTABLE);
+ PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_IMMUTABLE);
Icon icon = Icon.createWithResource(mContext, 1);
Notification.BubbleMetadata.Builder metadataBuilder =
new Notification.BubbleMetadata.Builder(bubbleIntent, icon)
@@ -838,8 +858,10 @@
}
public void testBubbleMetadataBuilder_replaceHeightDp() {
- PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
- PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(), PendingIntent.FLAG_MUTABLE_UNAUDITED);
+ PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_MUTABLE);
+ PendingIntent deleteIntent = PendingIntent.getActivity(mContext, 0, new Intent(),
+ PendingIntent.FLAG_IMMUTABLE);
Icon icon = Icon.createWithResource(mContext, 1);
Notification.BubbleMetadata.Builder metadataBuilder =
new Notification.BubbleMetadata.Builder(bubbleIntent, icon)
diff --git a/tests/app/src/android/app/cts/SystemFeaturesTest.java b/tests/app/src/android/app/cts/SystemFeaturesTest.java
index 03012c8..19dc7a3 100644
--- a/tests/app/src/android/app/cts/SystemFeaturesTest.java
+++ b/tests/app/src/android/app/cts/SystemFeaturesTest.java
@@ -644,7 +644,7 @@
}
private boolean isAndroidEmulator() {
- return PropertyUtil.propertyEquals("ro.kernel.qemu", "1");
+ return PropertyUtil.propertyEquals("ro.boot.qemu", "1");
}
private void assertFeature(boolean exist, String feature) {
diff --git a/tests/appsearch/src/com/android/cts/appsearch/AppSearchSchemaMigrationCtsTest.java b/tests/appsearch/src/com/android/cts/appsearch/AppSearchSchemaMigrationCtsTest.java
index b6bb7c6..792ef31 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/AppSearchSchemaMigrationCtsTest.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/AppSearchSchemaMigrationCtsTest.java
@@ -24,12 +24,11 @@
import com.google.common.util.concurrent.ListenableFuture;
-
// TODO(b/177266929): Enable this test once schema migration is implemented
public class AppSearchSchemaMigrationCtsTest /* extends AppSearchSchemaMigrationCtsTestBase */ {
// @Override
protected ListenableFuture<AppSearchSessionShim> createSearchSession(@NonNull String dbName) {
return AppSearchSessionShimImpl.createSearchSession(
- new AppSearchManager.SearchContext.Builder().setDatabaseName(dbName).build());
+ new AppSearchManager.SearchContext.Builder(dbName).build());
}
}
diff --git a/tests/appsearch/src/com/android/cts/appsearch/AppSearchSessionCtsTest.java b/tests/appsearch/src/com/android/cts/appsearch/AppSearchSessionCtsTest.java
index 18a0238..54c867d 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/AppSearchSessionCtsTest.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/AppSearchSessionCtsTest.java
@@ -30,14 +30,13 @@
@Override
protected ListenableFuture<AppSearchSessionShim> createSearchSession(@NonNull String dbName) {
return AppSearchSessionShimImpl.createSearchSession(
- new AppSearchManager.SearchContext.Builder().setDatabaseName(dbName).build());
+ new AppSearchManager.SearchContext.Builder(dbName).build());
}
@Override
- protected ListenableFuture<AppSearchSessionShim> createSearchSession(@NonNull String dbName,
- @NonNull ExecutorService executor) {
+ protected ListenableFuture<AppSearchSessionShim> createSearchSession(
+ @NonNull String dbName, @NonNull ExecutorService executor) {
return AppSearchSessionShimImpl.createSearchSession(
- new AppSearchManager.SearchContext.Builder().setDatabaseName(dbName).build(),
- executor);
+ new AppSearchManager.SearchContext.Builder(dbName).build(), executor);
}
}
diff --git a/tests/appsearch/src/com/android/cts/appsearch/GlobalSearchSessionCtsTest.java b/tests/appsearch/src/com/android/cts/appsearch/GlobalSearchSessionCtsTest.java
index ff50832..7df7a51 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/GlobalSearchSessionCtsTest.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/GlobalSearchSessionCtsTest.java
@@ -30,11 +30,11 @@
@Override
protected ListenableFuture<AppSearchSessionShim> createSearchSession(@NonNull String dbName) {
return AppSearchSessionShimImpl.createSearchSession(
- new AppSearchManager.SearchContext.Builder().setDatabaseName(dbName).build());
+ new AppSearchManager.SearchContext.Builder(dbName).build());
}
@Override
protected ListenableFuture<GlobalSearchSessionShim> createGlobalSearchSession() {
return GlobalSearchSessionShimImpl.createGlobalSearchSession();
}
-}
\ No newline at end of file
+}
diff --git a/tests/appsearch/src/com/android/cts/appsearch/GlobalSearchSessionPlatformCtsTest.java b/tests/appsearch/src/com/android/cts/appsearch/GlobalSearchSessionPlatformCtsTest.java
index 49c5446..66afe72 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/GlobalSearchSessionPlatformCtsTest.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/GlobalSearchSessionPlatformCtsTest.java
@@ -95,14 +95,14 @@
private static final String TEXT = "foo";
private static final AppSearchEmail EMAIL_DOCUMENT =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject(TEXT)
.setBody("this is the body of the email")
.build();
- private static final String DB_NAME = AppSearchManager.DEFAULT_DATABASE_NAME;
+ private static final String DB_NAME = "";
private AppSearchSessionShim mDb;
@@ -114,9 +114,7 @@
mDb =
AppSearchSessionShimImpl.createSearchSession(
- new AppSearchManager.SearchContext.Builder()
- .setDatabaseName(DB_NAME)
- .build())
+ new AppSearchManager.SearchContext.Builder(DB_NAME).build())
.get();
cleanup();
}
diff --git a/tests/appsearch/src/com/android/cts/appsearch/external/AppSearchSchemaMigrationCtsTestBase.java b/tests/appsearch/src/com/android/cts/appsearch/external/AppSearchSchemaMigrationCtsTestBase.java
index 74c9407..8b8ba6f 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/external/AppSearchSchemaMigrationCtsTestBase.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/external/AppSearchSchemaMigrationCtsTestBase.java
@@ -25,11 +25,10 @@
import android.annotation.NonNull;
import android.app.appsearch.AppSearchBatchResult;
-import android.app.appsearch.AppSearchManager;
-import android.app.appsearch.AppSearchMigrationHelper;
import android.app.appsearch.AppSearchSchema;
import android.app.appsearch.AppSearchSessionShim;
import android.app.appsearch.GenericDocument;
+import android.app.appsearch.Migrator;
import android.app.appsearch.PutDocumentsRequest;
import android.app.appsearch.SetSchemaRequest;
import android.app.appsearch.SetSchemaResponse;
@@ -40,8 +39,6 @@
import org.junit.Before;
import org.junit.Test;
-import java.util.HashSet;
-import java.util.Set;
import java.util.concurrent.ExecutionException;
/*
@@ -70,15 +67,22 @@
// TODO(b/178060626) add a platform version of this test
public abstract class AppSearchSchemaMigrationCtsTestBase {
- private static final String DB_NAME = AppSearchManager.DEFAULT_DATABASE_NAME;
- private static final AppSearchSchema.Migrator NO_OP_MIGRATOR =
- new AppSearchSchema.Migrator() {
+ private static final String DB_NAME = "";
+ private static final Migrator NO_OP_MIGRATOR =
+ new Migrator() {
+ @NonNull
@Override
- public void onUpgrade(
- int currentVersion,
- int targetVersion,
- @NonNull AppSearchMigrationHelper helper)
- throws Exception {}
+ public GenericDocument onUpgrade(
+ int currentVersion, int targetVersion, @NonNull GenericDocument document) {
+ return null;
+ }
+
+ @NonNull
+ @Override
+ public GenericDocument onDowngrade(
+ int currentVersion, int targetVersion, @NonNull GenericDocument document) {
+ return null;
+ }
};
private AppSearchSessionShim mDb;
@@ -121,7 +125,7 @@
}
@Test
- public void testSetSchema_migration_A_B_C_D() throws Exception {
+ public void testSchemaMigration_A_B_C_D() throws Exception {
// create a backwards compatible schema and update the version
AppSearchSchema B_C_Schema =
new AppSearchSchema.Builder("testSchema")
@@ -149,7 +153,7 @@
}
@Test
- public void testSetSchema_migration_A_B_NC_D() throws Exception {
+ public void testSchemaMigration_A_B_NC_D() throws Exception {
// create a backwards compatible schema but don't update the version
AppSearchSchema B_NC_Schema =
new AppSearchSchema.Builder("testSchema")
@@ -176,7 +180,7 @@
}
@Test
- public void testSetSchema_migration_A_NB_C_D() throws Exception {
+ public void testSchemaMigration_A_NB_C_D() throws Exception {
// create a backwards incompatible schema and update the version
AppSearchSchema NB_C_Schema =
new AppSearchSchema.Builder("testSchema")
@@ -193,7 +197,7 @@
}
@Test
- public void testSetSchema_migration_A_NB_C_ND() throws Exception {
+ public void testSchemaMigration_A_NB_C_ND() throws Exception {
// create a backwards incompatible schema and update the version
AppSearchSchema NB_C_Schema =
new AppSearchSchema.Builder("testSchema")
@@ -210,7 +214,7 @@
}
@Test
- public void testSetSchema_migration_A_NB_NC_D() throws Exception {
+ public void testSchemaMigration_A_NB_NC_D() throws Exception {
// create a backwards incompatible schema but don't update the version
AppSearchSchema NB_NC_Schema = new AppSearchSchema.Builder("testSchema").build();
@@ -224,7 +228,7 @@
}
@Test
- public void testSetSchema_migration_A_NB_NC_ND() throws Exception {
+ public void testSchemaMigration_A_NB_NC_ND() throws Exception {
// create a backwards incompatible schema but don't update the version
AppSearchSchema $B_$C_Schema = new AppSearchSchema.Builder("testSchema").build();
@@ -238,7 +242,7 @@
}
@Test
- public void testSetSchema_migration_NA_B_C_D() throws Exception {
+ public void testSchemaMigration_NA_B_C_D() throws Exception {
// create a backwards compatible schema and update the version
AppSearchSchema B_C_Schema =
new AppSearchSchema.Builder("testSchema")
@@ -265,7 +269,7 @@
}
@Test
- public void testSetSchema_migration_NA_B_NC_D() throws Exception {
+ public void testSchemaMigration_NA_B_NC_D() throws Exception {
// create a backwards compatible schema but don't update the version
AppSearchSchema B_NC_Schema =
new AppSearchSchema.Builder("testSchema")
@@ -292,7 +296,7 @@
}
@Test
- public void testSetSchema_migration_NA_NB_C_D() throws Exception {
+ public void testSchemaMigration_NA_NB_C_D() throws Exception {
// create a backwards incompatible schema and update the version
AppSearchSchema NB_C_Schema =
new AppSearchSchema.Builder("testSchema")
@@ -308,7 +312,7 @@
}
@Test
- public void testSetSchema_migration_NA_NB_C_ND() throws Exception {
+ public void testSchemaMigration_NA_NB_C_ND() throws Exception {
// create a backwards incompatible schema and update the version
AppSearchSchema $B_C_Schema =
new AppSearchSchema.Builder("testSchema")
@@ -331,7 +335,7 @@
}
@Test
- public void testSetSchema_migration_NA_NB_NC_D() throws Exception {
+ public void testSchemaMigration_NA_NB_NC_D() throws Exception {
// create a backwards incompatible schema but don't update the version
AppSearchSchema $B_$C_Schema = new AppSearchSchema.Builder("testSchema").build();
@@ -349,7 +353,7 @@
}
@Test
- public void testSetSchema_migration_NA_NB_NC_ND() throws Exception {
+ public void testSchemaMigration_NA_NB_NC_ND() throws Exception {
// create a backwards incompatible schema but don't update the version
AppSearchSchema $B_$C_Schema = new AppSearchSchema.Builder("testSchema").build();
@@ -369,7 +373,7 @@
}
@Test
- public void testSetSchema_migrate() throws Exception {
+ public void testSchemaMigration() throws Exception {
AppSearchSchema schema =
new AppSearchSchema.Builder("testSchema")
.addProperty(
@@ -403,12 +407,12 @@
.get();
GenericDocument doc1 =
- new GenericDocument.Builder<>("uri1", "testSchema")
+ new GenericDocument.Builder<>("namespace", "uri1", "testSchema")
.setPropertyString("subject", "testPut example1")
.setPropertyString("To", "testTo example1")
.build();
GenericDocument doc2 =
- new GenericDocument.Builder<>("uri2", "testSchema")
+ new GenericDocument.Builder<>("namespace", "uri2", "testSchema")
.setPropertyString("subject", "testPut example2")
.setPropertyString("To", "testTo example2")
.build();
@@ -441,36 +445,45 @@
// set the new schema to AppSearch, the first document will be migrated successfully but the
// second one will be failed.
- AppSearchSchema.Migrator migrator =
- new AppSearchSchema.Migrator() {
+
+ Migrator migrator =
+ new Migrator() {
+ @NonNull
@Override
- public void onUpgrade(
+ public GenericDocument onUpgrade(
int currentVersion,
int targetVersion,
- @NonNull AppSearchMigrationHelper helper)
- throws Exception {
- helper.queryAndTransform(
- "testSchema",
- (currentVersion1, finalVersion1, document) -> {
- if (document.getUri().equals("uri2")) {
- return new GenericDocument.Builder<>(
- document.getUri(), document.getSchemaType())
- .setPropertyString("subject", "testPut example2")
- .setPropertyString(
- "to",
- "Except to fail, property not in the"
- + " schema")
- .build();
- }
- return new GenericDocument.Builder<>(
- document.getUri(), document.getSchemaType())
- .setPropertyString(
- "subject", "testPut example1 migrated")
- .setCreationTimestampMillis(12345L)
- .build();
- });
+ @NonNull GenericDocument document) {
+ if (document.getUri().equals("uri2")) {
+ return new GenericDocument.Builder<>(
+ document.getNamespace(),
+ document.getUri(),
+ document.getSchemaType())
+ .setPropertyString("subject", "testPut example2")
+ .setPropertyString(
+ "to", "Expect to fail, property not in the schema")
+ .build();
+ }
+ return new GenericDocument.Builder<>(
+ document.getNamespace(),
+ document.getUri(),
+ document.getSchemaType())
+ .setPropertyString("subject", "testPut example1 migrated")
+ .setCreationTimestampMillis(12345L)
+ .build();
+ }
+
+ @NonNull
+ @Override
+ public GenericDocument onDowngrade(
+ int currentVersion,
+ int targetVersion,
+ @NonNull GenericDocument document) {
+ throw new IllegalStateException(
+ "Downgrade should not be triggered for this test");
}
};
+
SetSchemaResponse setSchemaResponse =
mDb.setSchema(
new SetSchemaRequest.Builder()
@@ -480,9 +493,7 @@
.get();
// Check the schema has been saved
- Set<AppSearchSchema> actualSchema = new HashSet<>();
- actualSchema.add(newSchema);
- assertThat(actualSchema).isEqualTo(mDb.getSchema().get());
+ assertThat(mDb.getSchema().get()).containsExactly(newSchema);
assertThat(setSchemaResponse.getDeletedTypes()).isEmpty();
assertThat(setSchemaResponse.getIncompatibleTypes()).containsExactly("testSchema");
@@ -490,18 +501,405 @@
// Check migrate the first document is success
GenericDocument expected =
- new GenericDocument.Builder<>("uri1", "testSchema")
+ new GenericDocument.Builder<>("namespace", "uri1", "testSchema")
.setPropertyString("subject", "testPut example1 migrated")
.setCreationTimestampMillis(12345L)
.build();
- assertThat(doGet(mDb, GenericDocument.DEFAULT_NAMESPACE, "uri1")).containsExactly(expected);
+ assertThat(doGet(mDb, "namespace", "uri1")).containsExactly(expected);
// Check migrate the second document is fail.
assertThat(setSchemaResponse.getMigrationFailures()).hasSize(1);
SetSchemaResponse.MigrationFailure migrationFailure =
setSchemaResponse.getMigrationFailures().get(0);
- assertThat(migrationFailure.getNamespace()).isEqualTo(GenericDocument.DEFAULT_NAMESPACE);
+ assertThat(migrationFailure.getNamespace()).isEqualTo("namespace");
assertThat(migrationFailure.getSchemaType()).isEqualTo("testSchema");
assertThat(migrationFailure.getUri()).isEqualTo("uri2");
}
+
+ @Test
+ public void testSchemaMigration_downgrade() throws Exception {
+ AppSearchSchema schema =
+ new AppSearchSchema.Builder("testSchema")
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("subject")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("To")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .setVersion(3)
+ .build();
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .addSchemas(schema)
+ .setForceOverride(true)
+ .build())
+ .get();
+
+ GenericDocument doc1 =
+ new GenericDocument.Builder<>("namespace", "uri1", "testSchema")
+ .setPropertyString("subject", "testPut example1")
+ .setPropertyString("To", "testTo example1")
+ .build();
+
+ AppSearchBatchResult<String, Void> result =
+ checkIsBatchResultSuccess(
+ mDb.put(
+ new PutDocumentsRequest.Builder()
+ .addGenericDocuments(doc1)
+ .build()));
+ assertThat(result.getSuccesses()).containsExactly("uri1", null);
+ assertThat(result.getFailures()).isEmpty();
+
+ // create new schema type and upgrade the version number
+ AppSearchSchema newSchema =
+ new AppSearchSchema.Builder("testSchema")
+ .setVersion(1) // downgrade version
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("subject")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .build();
+
+ // set the new schema to AppSearch
+ Migrator migrator =
+ new Migrator() {
+ @NonNull
+ @Override
+ public GenericDocument onUpgrade(
+ int currentVersion,
+ int targetVersion,
+ @NonNull GenericDocument document) {
+ throw new IllegalStateException(
+ "Upgrade should not be triggered for this test");
+ }
+
+ @NonNull
+ @Override
+ public GenericDocument onDowngrade(
+ int currentVersion,
+ int targetVersion,
+ @NonNull GenericDocument document) {
+ return new GenericDocument.Builder<>(
+ document.getNamespace(),
+ document.getUri(),
+ document.getSchemaType())
+ .setPropertyString("subject", "testPut example1 migrated")
+ .setCreationTimestampMillis(12345L)
+ .build();
+ }
+ };
+
+ SetSchemaResponse setSchemaResponse =
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .addSchemas(newSchema)
+ .setMigrator("testSchema", migrator)
+ .build())
+ .get();
+
+ // Check the schema has been saved
+ assertThat(mDb.getSchema().get()).containsExactly(newSchema);
+
+ assertThat(setSchemaResponse.getDeletedTypes()).isEmpty();
+ assertThat(setSchemaResponse.getIncompatibleTypes()).containsExactly("testSchema");
+ assertThat(setSchemaResponse.getMigratedTypes()).containsExactly("testSchema");
+
+ // Check migrate is success
+ GenericDocument expected =
+ new GenericDocument.Builder<>("namespace", "uri1", "testSchema")
+ .setPropertyString("subject", "testPut example1 migrated")
+ .setCreationTimestampMillis(12345L)
+ .build();
+ assertThat(doGet(mDb, "namespace", "uri1")).containsExactly(expected);
+ }
+
+ @Test
+ public void testSchemaMigration_sameVersion() throws Exception {
+ AppSearchSchema schema =
+ new AppSearchSchema.Builder("testSchema")
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("subject")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("To")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .setVersion(3)
+ .build();
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .addSchemas(schema)
+ .setForceOverride(true)
+ .build())
+ .get();
+
+ GenericDocument doc1 =
+ new GenericDocument.Builder<>("namespace", "uri1", "testSchema")
+ .setPropertyString("subject", "testPut example1")
+ .setPropertyString("To", "testTo example1")
+ .build();
+
+ AppSearchBatchResult<String, Void> result =
+ checkIsBatchResultSuccess(
+ mDb.put(
+ new PutDocumentsRequest.Builder()
+ .addGenericDocuments(doc1)
+ .build()));
+ assertThat(result.getSuccesses()).containsExactly("uri1", null);
+ assertThat(result.getFailures()).isEmpty();
+
+ // create new schema type with the same version number
+ AppSearchSchema newSchema =
+ new AppSearchSchema.Builder("testSchema")
+ .setVersion(3) // same version
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("subject")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .build();
+
+ // set the new schema to AppSearch
+ Migrator migrator =
+ new Migrator() {
+ @NonNull
+ @Override
+ public GenericDocument onUpgrade(
+ int currentVersion,
+ int targetVersion,
+ @NonNull GenericDocument document) {
+ throw new IllegalStateException(
+ "Upgrade should not be triggered for this test");
+ }
+
+ @NonNull
+ @Override
+ public GenericDocument onDowngrade(
+ int currentVersion,
+ int targetVersion,
+ @NonNull GenericDocument document) {
+ throw new IllegalStateException(
+ "Downgrade should not be triggered for this test");
+ }
+ };
+
+ // SetSchema with forceOverride=false
+ ExecutionException exception =
+ expectThrows(
+ ExecutionException.class,
+ () ->
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .addSchemas(newSchema)
+ .setMigrator("testSchema", migrator)
+ .build())
+ .get());
+ assertThat(exception).hasMessageThat().contains("Schema is incompatible.");
+
+ // SetSchema with forceOverride=true
+ SetSchemaResponse setSchemaResponse =
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .addSchemas(newSchema)
+ .setMigrator("testSchema", migrator)
+ .setForceOverride(true)
+ .build())
+ .get();
+
+ assertThat(mDb.getSchema().get()).containsExactly(newSchema);
+
+ assertThat(setSchemaResponse.getDeletedTypes()).isEmpty();
+ assertThat(setSchemaResponse.getIncompatibleTypes()).containsExactly("testSchema");
+ assertThat(setSchemaResponse.getMigratedTypes()).isEmpty();
+ }
+
+ @Test
+ public void testSchemaMigration_noMigration() throws Exception {
+ AppSearchSchema schema =
+ new AppSearchSchema.Builder("testSchema")
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("subject")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("To")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .setVersion(2)
+ .build();
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .addSchemas(schema)
+ .setForceOverride(true)
+ .build())
+ .get();
+
+ GenericDocument doc1 =
+ new GenericDocument.Builder<>("namespace", "uri1", "testSchema")
+ .setPropertyString("subject", "testPut example1")
+ .setPropertyString("To", "testTo example1")
+ .build();
+
+ AppSearchBatchResult<String, Void> result =
+ checkIsBatchResultSuccess(
+ mDb.put(
+ new PutDocumentsRequest.Builder()
+ .addGenericDocuments(doc1)
+ .build()));
+ assertThat(result.getSuccesses()).containsExactly("uri1", null);
+ assertThat(result.getFailures()).isEmpty();
+
+ // create new schema type and upgrade the version number
+ AppSearchSchema newSchema =
+ new AppSearchSchema.Builder("testSchema")
+ .setVersion(4) // upgrade version
+ .addProperty(
+ new AppSearchSchema.StringPropertyConfig.Builder("subject")
+ .setCardinality(
+ AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
+ .setIndexingType(
+ AppSearchSchema.StringPropertyConfig
+ .INDEXING_TYPE_PREFIXES)
+ .setTokenizerType(
+ AppSearchSchema.StringPropertyConfig
+ .TOKENIZER_TYPE_PLAIN)
+ .build())
+ .build();
+
+ // Set start version to be 3 means we won't trigger migration for 2.
+ Migrator migrator =
+ new Migrator(3) {
+ @NonNull
+ @Override
+ public GenericDocument onUpgrade(
+ int currentVersion,
+ int targetVersion,
+ @NonNull GenericDocument document) {
+ throw new IllegalStateException(
+ "Upgrade should not be triggered for this test");
+ }
+
+ @NonNull
+ @Override
+ public GenericDocument onDowngrade(
+ int currentVersion,
+ int targetVersion,
+ @NonNull GenericDocument document) {
+ throw new IllegalStateException(
+ "Downgrade should not be triggered for this test");
+ }
+ };
+
+ // SetSchema with forceOverride=false
+ ExecutionException exception =
+ expectThrows(
+ ExecutionException.class,
+ () ->
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .addSchemas(newSchema)
+ .setMigrator("testSchema", migrator)
+ .build())
+ .get());
+ assertThat(exception).hasMessageThat().contains("Schema is incompatible.");
+ }
+
+ @Test
+ public void testSchemaMigration_nonexistent() throws Exception {
+ // set first version of the schema to AppSearch
+ AppSearchSchema schema = new AppSearchSchema.Builder("testSchema").build();
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .addSchemas(schema)
+ .setForceOverride(true)
+ .build())
+ .get();
+
+ // SetSchema with migrator and forceOverride=false but new schema.
+ ExecutionException exception =
+ expectThrows(
+ ExecutionException.class,
+ () ->
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .setMigrator("testSchema", NO_OP_MIGRATOR)
+ .build())
+ .get());
+ assertThat(exception).hasMessageThat().contains("Schema is incompatible.");
+
+ // SetSchema with migrator and forceOverride=true but new schema.
+ exception =
+ expectThrows(
+ ExecutionException.class,
+ () ->
+ mDb.setSchema(
+ new SetSchemaRequest.Builder()
+ .setMigrator("testSchema", NO_OP_MIGRATOR)
+ .setForceOverride(true)
+ .build())
+ .get());
+ assertThat(exception)
+ .hasMessageThat()
+ .contains(
+ "Receive a migrator for schema type : testSchema, "
+ + "but the schema doesn't exist in the request.");
+ }
}
diff --git a/tests/appsearch/src/com/android/cts/appsearch/external/AppSearchSessionCtsTestBase.java b/tests/appsearch/src/com/android/cts/appsearch/external/AppSearchSessionCtsTestBase.java
index beeaa1b..6fc876a 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/external/AppSearchSessionCtsTestBase.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/external/AppSearchSessionCtsTestBase.java
@@ -29,7 +29,6 @@
import android.annotation.NonNull;
import android.app.appsearch.AppSearchBatchResult;
import android.app.appsearch.AppSearchEmail;
-import android.app.appsearch.AppSearchManager;
import android.app.appsearch.AppSearchResult;
import android.app.appsearch.AppSearchSchema;
import android.app.appsearch.AppSearchSchema.PropertyConfig;
@@ -67,7 +66,7 @@
import java.util.concurrent.ExecutorService;
public abstract class AppSearchSessionCtsTestBase {
- private static final String DB_NAME_1 = AppSearchManager.DEFAULT_DATABASE_NAME;
+ private static final String DB_NAME_1 = "";
private static final String DB_NAME_2 = "testDb2";
private AppSearchSessionShim mDb1;
@@ -220,7 +219,7 @@
// Index a document
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -278,7 +277,9 @@
// Try to index a gift. This should fail as it's not in the schema.
GenericDocument gift =
- new GenericDocument.Builder<>("gift1", "Gift").setPropertyLong("price", 5).build();
+ new GenericDocument.Builder<>("namespace", "gift1", "Gift")
+ .setPropertyLong("price", 5)
+ .build();
AppSearchBatchResult<String, Void> result =
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(gift).build()).get();
assertThat(result.isSuccess()).isFalse();
@@ -298,7 +299,7 @@
// Indexing an email with a body should also work
AppSearchEmail email =
- new AppSearchEmail.Builder("email1")
+ new AppSearchEmail.Builder("namespace", "email1")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
@@ -324,11 +325,12 @@
// Index an email and check it present.
AppSearchEmail email =
- new AppSearchEmail.Builder("email1").setSubject("testPut example").build();
+ new AppSearchEmail.Builder("namespace", "email1")
+ .setSubject("testPut example")
+ .build();
checkIsBatchResultSuccess(
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email).build()));
- List<GenericDocument> outDocuments =
- doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "email1");
+ List<GenericDocument> outDocuments = doGet(mDb1, "namespace", "email1");
assertThat(outDocuments).hasSize(1);
AppSearchEmail outEmail = new AppSearchEmail(outDocuments.get(0));
assertThat(outEmail).isEqualTo(email);
@@ -349,11 +351,7 @@
// Make sure the indexed email is gone.
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(
- new GetByUriRequest.Builder()
- .setNamespace(GenericDocument.DEFAULT_NAMESPACE)
- .addUris("email1")
- .build())
+ mDb1.getByUri(new GetByUriRequest.Builder("namespace").addUris("email1").build())
.get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("email1").getResultCode())
@@ -361,7 +359,9 @@
// Try to index an email again. This should fail as the schema has been removed.
AppSearchEmail email2 =
- new AppSearchEmail.Builder("email2").setSubject("testPut example").build();
+ new AppSearchEmail.Builder("namespace", "email2")
+ .setSubject("testPut example")
+ .build();
AppSearchBatchResult<String, Void> failResult2 =
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email2).build())
.get();
@@ -392,21 +392,24 @@
// Index an email and check it present in database1.
AppSearchEmail email1 =
- new AppSearchEmail.Builder("email1").setSubject("testPut example").build();
+ new AppSearchEmail.Builder("namespace", "email1")
+ .setSubject("testPut example")
+ .build();
checkIsBatchResultSuccess(
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email1).build()));
- List<GenericDocument> outDocuments =
- doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "email1");
+ List<GenericDocument> outDocuments = doGet(mDb1, "namespace", "email1");
assertThat(outDocuments).hasSize(1);
AppSearchEmail outEmail = new AppSearchEmail(outDocuments.get(0));
assertThat(outEmail).isEqualTo(email1);
// Index an email and check it present in database2.
AppSearchEmail email2 =
- new AppSearchEmail.Builder("email2").setSubject("testPut example").build();
+ new AppSearchEmail.Builder("namespace", "email2")
+ .setSubject("testPut example")
+ .build();
checkIsBatchResultSuccess(
mDb2.put(new PutDocumentsRequest.Builder().addGenericDocuments(email2).build()));
- outDocuments = doGet(mDb2, GenericDocument.DEFAULT_NAMESPACE, "email2");
+ outDocuments = doGet(mDb2, "namespace", "email2");
assertThat(outDocuments).hasSize(1);
outEmail = new AppSearchEmail(outDocuments.get(0));
assertThat(outEmail).isEqualTo(email2);
@@ -428,11 +431,7 @@
// Make sure the indexed email is gone in database 1.
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(
- new GetByUriRequest.Builder()
- .setNamespace(GenericDocument.DEFAULT_NAMESPACE)
- .addUris("email1")
- .build())
+ mDb1.getByUri(new GetByUriRequest.Builder("namespace").addUris("email1").build())
.get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("email1").getResultCode())
@@ -440,7 +439,9 @@
// Try to index an email again. This should fail as the schema has been removed.
AppSearchEmail email3 =
- new AppSearchEmail.Builder("email3").setSubject("testPut example").build();
+ new AppSearchEmail.Builder("namespace", "email3")
+ .setSubject("testPut example")
+ .build();
AppSearchBatchResult<String, Void> failResult2 =
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email3).build())
.get();
@@ -452,7 +453,7 @@
+ "/builtin:Email' not found");
// Make sure email in database 2 still present.
- outDocuments = doGet(mDb2, GenericDocument.DEFAULT_NAMESPACE, "email2");
+ outDocuments = doGet(mDb2, "namespace", "email2");
assertThat(outDocuments).hasSize(1);
outEmail = new AppSearchEmail(outDocuments.get(0));
assertThat(outEmail).isEqualTo(email2);
@@ -470,7 +471,7 @@
// Index a document
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -480,14 +481,15 @@
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(inEmail).build()));
// Get the document
- List<GenericDocument> outDocuments = doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1");
+ List<GenericDocument> outDocuments = doGet(mDb1, "namespace", "uri1");
assertThat(outDocuments).hasSize(1);
AppSearchEmail outEmail = new AppSearchEmail(outDocuments.get(0));
assertThat(outEmail).isEqualTo(inEmail);
// Can't get the document in the other instance.
AppSearchBatchResult<String, GenericDocument> failResult =
- mDb2.getByUri(new GetByUriRequest.Builder().addUris("uri1").build()).get();
+ mDb2.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(failResult.isSuccess()).isFalse();
assertThat(failResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
@@ -501,8 +503,7 @@
// Index two documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -510,8 +511,7 @@
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -526,8 +526,7 @@
// Get with type property paths {"Email", ["subject", "to"]}
GetByUriRequest request =
- new GetByUriRequest.Builder()
- .setNamespace("namespace")
+ new GetByUriRequest.Builder("namespace")
.addUris("uri1", "uri2")
.addProjection(
AppSearchEmail.SCHEMA_TYPE, ImmutableList.of("subject", "to"))
@@ -537,15 +536,13 @@
// The two email documents should have been returned with only the "subject" and "to"
// properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -561,8 +558,7 @@
// Index two documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -570,8 +566,7 @@
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -586,8 +581,7 @@
// Get with type property paths {"Email", ["subject", "to"]}
GetByUriRequest request =
- new GetByUriRequest.Builder()
- .setNamespace("namespace")
+ new GetByUriRequest.Builder("namespace")
.addUris("uri1", "uri2")
.addProjection(AppSearchEmail.SCHEMA_TYPE, Collections.emptyList())
.build();
@@ -595,13 +589,11 @@
// The two email documents should have been returned without any properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.build();
assertThat(outDocuments).containsExactly(expected1, expected2);
@@ -615,8 +607,7 @@
// Index two documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -624,8 +615,7 @@
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -640,8 +630,7 @@
// Get with type property paths {"Email", ["subject", "to"]}
GetByUriRequest request =
- new GetByUriRequest.Builder()
- .setNamespace("namespace")
+ new GetByUriRequest.Builder("namespace")
.addUris("uri1", "uri2")
.addProjection("NonExistentType", Collections.emptyList())
.addProjection(
@@ -652,15 +641,13 @@
// The two email documents should have been returned with only the "subject" and "to"
// properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -676,8 +663,7 @@
// Index two documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -685,8 +671,7 @@
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -701,8 +686,7 @@
// Get with type property paths {"Email", ["subject", "to"]}
GetByUriRequest request =
- new GetByUriRequest.Builder()
- .setNamespace("namespace")
+ new GetByUriRequest.Builder("namespace")
.addUris("uri1", "uri2")
.addProjection(
GetByUriRequest.PROJECTION_SCHEMA_TYPE_WILDCARD,
@@ -713,15 +697,13 @@
// The two email documents should have been returned with only the "subject" and "to"
// properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -737,8 +719,7 @@
// Index two documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -746,8 +727,7 @@
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -762,8 +742,7 @@
// Get with type property paths {"Email", ["subject", "to"]}
GetByUriRequest request =
- new GetByUriRequest.Builder()
- .setNamespace("namespace")
+ new GetByUriRequest.Builder("namespace")
.addUris("uri1", "uri2")
.addProjection(
GetByUriRequest.PROJECTION_SCHEMA_TYPE_WILDCARD,
@@ -773,13 +752,11 @@
// The two email documents should have been returned without any properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.build();
assertThat(outDocuments).containsExactly(expected1, expected2);
@@ -793,8 +770,7 @@
// Index two documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -802,8 +778,7 @@
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -818,8 +793,7 @@
// Get with type property paths {"Email", ["subject", "to"]}
GetByUriRequest request =
- new GetByUriRequest.Builder()
- .setNamespace("namespace")
+ new GetByUriRequest.Builder("namespace")
.addUris("uri1", "uri2")
.addProjection("NonExistentType", Collections.emptyList())
.addProjection(
@@ -831,15 +805,13 @@
// The two email documents should have been returned with only the "subject" and "to"
// properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -855,7 +827,7 @@
// Index a document
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -897,7 +869,7 @@
// Index 31 documents
for (int i = 0; i < 31; i++) {
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri" + i)
+ new AppSearchEmail.Builder("namespace", "uri" + i)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -926,7 +898,7 @@
results = searchResults.getNextPage().get();
++pageNumber;
for (SearchResult result : results) {
- documents.add(result.getDocument());
+ documents.add(result.getGenericDocument());
}
} while (results.size() > 0);
@@ -943,8 +915,7 @@
// Index two documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -952,8 +923,7 @@
.setBody("A little lamb, little lamb")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -1017,14 +987,14 @@
// Index a document
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
GenericDocument inDoc =
- new GenericDocument.Builder<>("uri2", "Generic")
+ new GenericDocument.Builder<>("namespace", "uri2", "Generic")
.setPropertyString("foo", "body")
.build();
checkIsBatchResultSuccess(
@@ -1067,7 +1037,7 @@
// Index documents
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("foo")
@@ -1109,16 +1079,14 @@
// Index two documents
AppSearchEmail expectedEmail =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("expectedNamespace")
+ new AppSearchEmail.Builder("expectedNamespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail unexpectedEmail =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("unexpectedNamespace")
+ new AppSearchEmail.Builder("unexpectedNamespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -1162,7 +1130,7 @@
// Index a document
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -1185,10 +1153,10 @@
do {
results = searchResults.getNextPage().get();
for (SearchResult result : results) {
- assertThat(result.getDocument()).isEqualTo(inEmail);
+ assertThat(result.getGenericDocument()).isEqualTo(inEmail);
assertThat(result.getPackageName())
.isEqualTo(ApplicationProvider.getApplicationContext().getPackageName());
- documents.add(result.getDocument());
+ documents.add(result.getGenericDocument());
}
} while (results.size() > 0);
assertThat(documents).hasSize(1);
@@ -1202,7 +1170,7 @@
// Index a document
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -1225,9 +1193,9 @@
do {
results = searchResults.getNextPage().get();
for (SearchResult result : results) {
- assertThat(result.getDocument()).isEqualTo(inEmail);
+ assertThat(result.getGenericDocument()).isEqualTo(inEmail);
assertThat(result.getDatabaseName()).isEqualTo(DB_NAME_1);
- documents.add(result.getDocument());
+ documents.add(result.getGenericDocument());
}
} while (results.size() > 0);
assertThat(documents).hasSize(1);
@@ -1252,9 +1220,9 @@
do {
results = searchResults.getNextPage().get();
for (SearchResult result : results) {
- assertThat(result.getDocument()).isEqualTo(inEmail);
+ assertThat(result.getGenericDocument()).isEqualTo(inEmail);
assertThat(result.getDatabaseName()).isEqualTo(DB_NAME_2);
- documents.add(result.getDocument());
+ documents.add(result.getGenericDocument());
}
} while (results.size() > 0);
assertThat(documents).hasSize(1);
@@ -1298,8 +1266,7 @@
// Index two documents
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -1307,8 +1274,7 @@
.setBody("This is the body of the testPut email")
.build();
GenericDocument note =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1333,15 +1299,13 @@
// The email document should have been returned with only the "body" and "to"
// properties. The note document should have been returned with all of its properties.
AppSearchEmail expectedEmail =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setBody("This is the body of the testPut email")
.build();
GenericDocument expectedNote =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1387,8 +1351,7 @@
// Index two documents
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -1396,8 +1359,7 @@
.setBody("This is the body of the testPut email")
.build();
GenericDocument note =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1421,13 +1383,11 @@
// The email document should have been returned without any properties. The note document
// should have been returned with all of its properties.
AppSearchEmail expectedEmail =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.build();
GenericDocument expectedNote =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1473,8 +1433,7 @@
// Index two documents
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -1482,8 +1441,7 @@
.setBody("This is the body of the testPut email")
.build();
GenericDocument note =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1509,15 +1467,13 @@
// The email document should have been returned with only the "body" and "to" properties.
// The note document should have been returned with all of its properties.
AppSearchEmail expectedEmail =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setBody("This is the body of the testPut email")
.build();
GenericDocument expectedNote =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1563,8 +1519,7 @@
// Index two documents
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -1572,8 +1527,7 @@
.setBody("This is the body of the testPut email")
.build();
GenericDocument note =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1599,15 +1553,13 @@
// The email document should have been returned with only the "body" and "to"
// properties. The note document should have been returned with only the "body" property.
AppSearchEmail expectedEmail =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setBody("This is the body of the testPut email")
.build();
GenericDocument expectedNote =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("body", "Note body")
.build();
@@ -1652,8 +1604,7 @@
// Index two documents
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -1661,8 +1612,7 @@
.setBody("This is the body of the testPut email")
.build();
GenericDocument note =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1687,13 +1637,11 @@
// The email and note documents should have been returned without any properties.
AppSearchEmail expectedEmail =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.build();
GenericDocument expectedNote =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.build();
assertThat(documents).containsExactly(expectedNote, expectedEmail);
@@ -1737,8 +1685,7 @@
// Index two documents
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -1746,8 +1693,7 @@
.setBody("This is the body of the testPut email")
.build();
GenericDocument note =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("title", "Note title")
.setPropertyString("body", "Note body")
@@ -1774,15 +1720,13 @@
// The email document should have been returned with only the "body" and "to"
// properties. The note document should have been returned with only the "body" property.
AppSearchEmail expectedEmail =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setBody("This is the body of the testPut email")
.build();
GenericDocument expectedNote =
- new GenericDocument.Builder<>("uri2", "Note")
- .setNamespace("namespace")
+ new GenericDocument.Builder<>("namespace", "uri2", "Note")
.setCreationTimestampMillis(1000)
.setPropertyString("body", "Note body")
.build();
@@ -1799,7 +1743,7 @@
// Index a document to instance 1.
AppSearchEmail inEmail1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -1810,7 +1754,7 @@
// Index a document to instance 2.
AppSearchEmail inEmail2 =
- new AppSearchEmail.Builder("uri2")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -1860,8 +1804,7 @@
// Index a document
GenericDocument document =
- new GenericDocument.Builder<>("uri", "Generic")
- .setNamespace("document")
+ new GenericDocument.Builder<>("namespace", "uri", "Generic")
.setPropertyString(
"subject",
"A commonly used fake word is foo. "
@@ -1892,10 +1835,10 @@
.isEqualTo(
"A commonly used fake word is foo. "
+ "Another nonsense word that’s used a lot is bar");
- assertThat(matchInfo.getExactMatchPosition())
+ assertThat(matchInfo.getExactMatchRange())
.isEqualTo(new SearchResult.MatchRange(/*lower=*/ 29, /*upper=*/ 32));
assertThat(matchInfo.getExactMatch()).isEqualTo("foo");
- assertThat(matchInfo.getSnippetPosition())
+ assertThat(matchInfo.getSnippetRange())
.isEqualTo(new SearchResult.MatchRange(/*lower=*/ 26, /*upper=*/ 33));
assertThat(matchInfo.getSnippet()).isEqualTo("is foo.");
}
@@ -1908,14 +1851,14 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 2")
@@ -1928,16 +1871,20 @@
.build()));
// Check the presence of the documents
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1")).hasSize(1);
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri2")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri1")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri2")).hasSize(1);
// Delete the document
checkIsBatchResultSuccess(
- mDb1.remove(new RemoveByUriRequest.Builder().addUris("uri1").build()));
+ mDb1.remove(new RemoveByUriRequest.Builder("namespace").addUris("uri1").build()));
// Make sure it's really gone
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1", "uri2").build()).get();
+ mDb1.getByUri(
+ new GetByUriRequest.Builder("namespace")
+ .addUris("uri1", "uri2")
+ .build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
@@ -1945,7 +1892,8 @@
// Test if we delete a nonexistent URI.
AppSearchBatchResult<String, Void> deleteResult =
- mDb1.remove(new RemoveByUriRequest.Builder().addUris("uri1").build()).get();
+ mDb1.remove(new RemoveByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(deleteResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
@@ -1959,14 +1907,14 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("foo")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("bar")
@@ -1979,8 +1927,8 @@
.build()));
// Check the presence of the documents
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1")).hasSize(1);
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri2")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri1")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri2")).hasSize(1);
// Delete the email 1 by query "foo"
mDb1.remove(
@@ -1988,7 +1936,11 @@
new SearchSpec.Builder().setTermMatch(SearchSpec.TERM_MATCH_PREFIX).build())
.get();
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1", "uri2").build()).get();
+ mDb1.getByUri(
+ new GetByUriRequest.Builder("namespace")
+ .addUris("uri1", "uri2")
+ .build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
@@ -1999,7 +1951,9 @@
"bar",
new SearchSpec.Builder().setTermMatch(SearchSpec.TERM_MATCH_PREFIX).build())
.get();
- getResult = mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri2").build()).get();
+ getResult =
+ mDb1.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri2").build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri2").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
@@ -2013,7 +1967,7 @@
// Index documents
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("foo")
@@ -2023,7 +1977,7 @@
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email).build()));
// Check the presence of the documents
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri1")).hasSize(1);
// Try to delete email with query "foo", but restricted to a different package name.
// Won't work and email will still exist.
@@ -2034,7 +1988,7 @@
.addFilterPackageNames("some.other.package")
.build())
.get();
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri1")).hasSize(1);
// Delete the email by query "foo", restricted to the correct package this time.
mDb1.remove(
@@ -2047,7 +2001,11 @@
.build())
.get();
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1", "uri2").build()).get();
+ mDb1.getByUri(
+ new GetByUriRequest.Builder("namespace")
+ .addUris("uri1", "uri2")
+ .build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
@@ -2061,7 +2019,7 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -2071,28 +2029,32 @@
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email1).build()));
// Check the presence of the documents
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri1")).hasSize(1);
// Can't delete in the other instance.
AppSearchBatchResult<String, Void> deleteResult =
- mDb2.remove(new RemoveByUriRequest.Builder().addUris("uri1").build()).get();
+ mDb2.remove(new RemoveByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(deleteResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri1")).hasSize(1);
// Delete the document
checkIsBatchResultSuccess(
- mDb1.remove(new RemoveByUriRequest.Builder().addUris("uri1").build()));
+ mDb1.remove(new RemoveByUriRequest.Builder("namespace").addUris("uri1").build()));
// Make sure it's really gone
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1").build()).get();
+ mDb1.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
// Test if we delete a nonexistent URI.
- deleteResult = mDb1.remove(new RemoveByUriRequest.Builder().addUris("uri1").build()).get();
+ deleteResult =
+ mDb1.remove(new RemoveByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(deleteResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
}
@@ -2110,20 +2072,21 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 2")
.setBody("This is the body of the testPut second email")
.build();
- GenericDocument document1 = new GenericDocument.Builder<>("uri3", "Generic").build();
+ GenericDocument document1 =
+ new GenericDocument.Builder<>("namespace", "uri3", "Generic").build();
checkIsBatchResultSuccess(
mDb1.put(
new PutDocumentsRequest.Builder()
@@ -2131,8 +2094,7 @@
.build()));
// Check the presence of the documents
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1", "uri2", "uri3"))
- .hasSize(3);
+ assertThat(doGet(mDb1, "namespace", "uri1", "uri2", "uri3")).hasSize(3);
// Delete the email type
mDb1.remove(
@@ -2145,7 +2107,10 @@
// Make sure it's really gone
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1", "uri2", "uri3").build())
+ mDb1.getByUri(
+ new GetByUriRequest.Builder("namespace")
+ .addUris("uri1", "uri2", "uri3")
+ .build())
.get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
@@ -2165,14 +2130,14 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 2")
@@ -2184,8 +2149,8 @@
mDb2.put(new PutDocumentsRequest.Builder().addGenericDocuments(email2).build()));
// Check the presence of the documents
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1")).hasSize(1);
- assertThat(doGet(mDb2, GenericDocument.DEFAULT_NAMESPACE, "uri2")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri1")).hasSize(1);
+ assertThat(doGet(mDb2, "namespace", "uri2")).hasSize(1);
// Delete the email type in instance 1
mDb1.remove(
@@ -2198,13 +2163,16 @@
// Make sure it's really gone in instance 1
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1").build()).get();
+ mDb1.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
// Make sure it's still in instance 2.
- getResult = mDb2.getByUri(new GetByUriRequest.Builder().addUris("uri2").build()).get();
+ getResult =
+ mDb2.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri2").build())
+ .get();
assertThat(getResult.isSuccess()).isTrue();
assertThat(getResult.getSuccesses().get("uri2")).isEqualTo(email2);
}
@@ -2231,24 +2199,21 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("email")
+ new AppSearchEmail.Builder("email", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("email")
+ new AppSearchEmail.Builder("email", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 2")
.setBody("This is the body of the testPut second email")
.build();
GenericDocument document1 =
- new GenericDocument.Builder<>("uri3", "Generic")
- .setNamespace("document")
+ new GenericDocument.Builder<>("document", "uri3", "Generic")
.setPropertyString("foo", "bar")
.build();
checkIsBatchResultSuccess(
@@ -2272,11 +2237,7 @@
// Make sure it's really gone
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(
- new GetByUriRequest.Builder()
- .setNamespace("email")
- .addUris("uri1", "uri2")
- .build())
+ mDb1.getByUri(new GetByUriRequest.Builder("email").addUris("uri1", "uri2").build())
.get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
@@ -2284,11 +2245,7 @@
assertThat(getResult.getFailures().get("uri2").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
getResult =
- mDb1.getByUri(
- new GetByUriRequest.Builder()
- .setNamespace("document")
- .addUris("uri3")
- .build())
+ mDb1.getByUri(new GetByUriRequest.Builder("document").addUris("uri3").build())
.get();
assertThat(getResult.isSuccess()).isTrue();
assertThat(getResult.getSuccesses().get("uri3")).isEqualTo(document1);
@@ -2304,16 +2261,14 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("email")
+ new AppSearchEmail.Builder("email", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("email")
+ new AppSearchEmail.Builder("email", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 2")
@@ -2339,24 +2294,14 @@
// Make sure it's really gone in instance 1
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(
- new GetByUriRequest.Builder()
- .setNamespace("email")
- .addUris("uri1")
- .build())
- .get();
+ mDb1.getByUri(new GetByUriRequest.Builder("email").addUris("uri1").build()).get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
// Make sure it's still in instance 2.
getResult =
- mDb2.getByUri(
- new GetByUriRequest.Builder()
- .setNamespace("email")
- .addUris("uri2")
- .build())
- .get();
+ mDb2.getByUri(new GetByUriRequest.Builder("email").addUris("uri2").build()).get();
assertThat(getResult.isSuccess()).isTrue();
assertThat(getResult.getSuccesses().get("uri2")).isEqualTo(email2);
}
@@ -2371,14 +2316,14 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 2")
@@ -2390,8 +2335,8 @@
mDb2.put(new PutDocumentsRequest.Builder().addGenericDocuments(email2).build()));
// Check the presence of the documents
- assertThat(doGet(mDb1, GenericDocument.DEFAULT_NAMESPACE, "uri1")).hasSize(1);
- assertThat(doGet(mDb2, GenericDocument.DEFAULT_NAMESPACE, "uri2")).hasSize(1);
+ assertThat(doGet(mDb1, "namespace", "uri1")).hasSize(1);
+ assertThat(doGet(mDb2, "namespace", "uri2")).hasSize(1);
// Delete the all document in instance 1
mDb1.remove("", new SearchSpec.Builder().setTermMatch(SearchSpec.TERM_MATCH_PREFIX).build())
@@ -2399,13 +2344,16 @@
// Make sure it's really gone in instance 1
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1").build()).get();
+ mDb1.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
// Make sure it's still in instance 2.
- getResult = mDb2.getByUri(new GetByUriRequest.Builder().addUris("uri2").build()).get();
+ getResult =
+ mDb2.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri2").build())
+ .get();
assertThat(getResult.isSuccess()).isTrue();
assertThat(getResult.getSuccesses().get("uri2")).isEqualTo(email2);
}
@@ -2420,28 +2368,28 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.setBody("This is the body of the testPut email")
.build();
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 2")
.setBody("This is the body of the testPut second email")
.build();
AppSearchEmail email3 =
- new AppSearchEmail.Builder("uri3")
+ new AppSearchEmail.Builder("namespace", "uri3")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 3")
.setBody("This is the body of the testPut second email")
.build();
AppSearchEmail email4 =
- new AppSearchEmail.Builder("uri4")
+ new AppSearchEmail.Builder("namespace", "uri4")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example 4")
@@ -2513,8 +2461,7 @@
// Index documents
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -2528,15 +2475,12 @@
// Remove the document
checkIsBatchResultSuccess(
- mDb1.remove(
- new RemoveByUriRequest.Builder()
- .setNamespace("namespace")
- .addUris("uri1")
- .build()));
+ mDb1.remove(new RemoveByUriRequest.Builder("namespace").addUris("uri1").build()));
// Make sure it's really gone
AppSearchBatchResult<String, GenericDocument> getResult =
- mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1").build()).get();
+ mDb1.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
@@ -2546,7 +2490,9 @@
.get();
// Make sure it's still gone
- getResult = mDb1.getByUri(new GetByUriRequest.Builder().addUris("uri1").build()).get();
+ getResult =
+ mDb1.getByUri(new GetByUriRequest.Builder("namespace").addUris("uri1").build())
+ .get();
assertThat(getResult.isSuccess()).isFalse();
assertThat(getResult.getFailures().get("uri1").getResultCode())
.isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
@@ -2560,7 +2506,7 @@
// Index a document
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -2633,8 +2579,8 @@
.get();
// Index two documents.
- AppSearchEmail email1 = new AppSearchEmail.Builder("uri1").build();
- AppSearchEmail email2 = new AppSearchEmail.Builder("uri2").build();
+ AppSearchEmail email1 = new AppSearchEmail.Builder("namespace", "uri1").build();
+ AppSearchEmail email2 = new AppSearchEmail.Builder("namespace", "uri2").build();
checkIsBatchResultSuccess(
mDb1.put(
new PutDocumentsRequest.Builder()
@@ -2643,31 +2589,31 @@
// Email 1 has more usages, but email 2 has more recent usages.
mDb1.reportUsage(
- new ReportUsageRequest.Builder()
+ new ReportUsageRequest.Builder("namespace")
.setUri("uri1")
.setUsageTimeMillis(10)
.build())
.get();
mDb1.reportUsage(
- new ReportUsageRequest.Builder()
+ new ReportUsageRequest.Builder("namespace")
.setUri("uri1")
.setUsageTimeMillis(20)
.build())
.get();
mDb1.reportUsage(
- new ReportUsageRequest.Builder()
+ new ReportUsageRequest.Builder("namespace")
.setUri("uri1")
.setUsageTimeMillis(30)
.build())
.get();
mDb1.reportUsage(
- new ReportUsageRequest.Builder()
+ new ReportUsageRequest.Builder("namespace")
.setUri("uri2")
.setUsageTimeMillis(100)
.build())
.get();
mDb1.reportUsage(
- new ReportUsageRequest.Builder()
+ new ReportUsageRequest.Builder("namespace")
.setUri("uri2")
.setUsageTimeMillis(200)
.build())
@@ -2706,7 +2652,7 @@
// Index a document
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
diff --git a/tests/appsearch/src/com/android/cts/appsearch/external/GenericDocumentCtsTest.java b/tests/appsearch/src/com/android/cts/appsearch/external/GenericDocumentCtsTest.java
index 657d556..121438d 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/external/GenericDocumentCtsTest.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/external/GenericDocumentCtsTest.java
@@ -28,18 +28,20 @@
private static final byte[] sByteArray1 = new byte[] {(byte) 1, (byte) 2, (byte) 3};
private static final byte[] sByteArray2 = new byte[] {(byte) 4, (byte) 5, (byte) 6, (byte) 7};
private static final GenericDocument sDocumentProperties1 =
- new GenericDocument.Builder<>("sDocumentProperties1", "sDocumentPropertiesSchemaType1")
+ new GenericDocument.Builder<>(
+ "namespace", "sDocumentProperties1", "sDocumentPropertiesSchemaType1")
.setCreationTimestampMillis(12345L)
.build();
private static final GenericDocument sDocumentProperties2 =
- new GenericDocument.Builder<>("sDocumentProperties2", "sDocumentPropertiesSchemaType2")
+ new GenericDocument.Builder<>(
+ "namespace", "sDocumentProperties2", "sDocumentPropertiesSchemaType2")
.setCreationTimestampMillis(6789L)
.build();
@Test
public void testDocumentEquals_identical() {
GenericDocument document1 =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setTtlMillis(1L)
.setPropertyLong("longKey1", 1L, 2L, 3L)
@@ -52,7 +54,7 @@
"documentKey1", sDocumentProperties1, sDocumentProperties2)
.build();
GenericDocument document2 =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setTtlMillis(1L)
.setPropertyLong("longKey1", 1L, 2L, 3L)
@@ -71,7 +73,7 @@
@Test
public void testDocumentEquals_differentOrder() {
GenericDocument document1 =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setPropertyLong("longKey1", 1L, 2L, 3L)
.setPropertyBytes("byteKey1", sByteArray1, sByteArray2)
@@ -85,7 +87,7 @@
// Create second document with same parameter but different order.
GenericDocument document2 =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setPropertyBoolean("booleanKey1", true, false, true)
.setPropertyDocument(
@@ -103,14 +105,14 @@
@Test
public void testDocumentEquals_failure() {
GenericDocument document1 =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setPropertyLong("longKey1", 1L, 2L, 3L)
.build();
// Create second document with same order but different value.
GenericDocument document2 =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setPropertyLong("longKey1", 1L, 2L, 4L) // Different
.build();
@@ -121,14 +123,14 @@
@Test
public void testDocumentEquals_repeatedFieldOrder_failure() {
GenericDocument document1 =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setPropertyBoolean("booleanKey1", true, false, true)
.build();
// Create second document with same order but different value.
GenericDocument document2 =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setPropertyBoolean("booleanKey1", true, true, false) // Different
.build();
@@ -139,7 +141,7 @@
@Test
public void testDocumentGetSingleValue() {
GenericDocument document =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setScore(1)
.setTtlMillis(1L)
@@ -168,7 +170,7 @@
@Test
public void testDocumentGetArrayValues() {
GenericDocument document =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setPropertyLong("longKey1", 1L, 2L, 3L)
.setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
@@ -203,7 +205,7 @@
@Test
public void testDocument_toString() {
GenericDocument document =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("", "uri1", "schemaType1")
.setCreationTimestampMillis(5L)
.setPropertyLong("longKey1", 1L, 2L, 3L)
.setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0)
@@ -223,14 +225,14 @@
+ "{ key: 'byteArray' value: [ '4' '5' '6' '7' ] } } "
+ "{ key: 'documentKey1' value: [ '"
+ "{ key: 'creationTimestampMillis' value: 12345 } "
- + "{ key: 'namespace' value: } "
+ + "{ key: 'namespace' value: namespace } "
+ "{ key: 'properties' value: } "
+ "{ key: 'schemaType' value: sDocumentPropertiesSchemaType1 } "
+ "{ key: 'score' value: 0 } "
+ "{ key: 'ttlMillis' value: 0 } "
+ "{ key: 'uri' value: sDocumentProperties1 } ' '"
+ "{ key: 'creationTimestampMillis' value: 6789 } "
- + "{ key: 'namespace' value: } "
+ + "{ key: 'namespace' value: namespace } "
+ "{ key: 'properties' value: } "
+ "{ key: 'schemaType' value: sDocumentPropertiesSchemaType2 } "
+ "{ key: 'score' value: 0 } "
@@ -249,7 +251,7 @@
@Test
public void testDocumentGetValues_differentTypes() {
GenericDocument document =
- new GenericDocument.Builder<>("uri1", "schemaType1")
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1")
.setScore(1)
.setPropertyLong("longKey1", 1L)
.setPropertyBoolean("booleanKey1", true, false, true)
@@ -278,7 +280,8 @@
@Test
public void testDocumentInvalid() {
- GenericDocument.Builder<?> builder = new GenericDocument.Builder<>("uri1", "schemaType1");
+ GenericDocument.Builder<?> builder =
+ new GenericDocument.Builder<>("namespace", "uri1", "schemaType1");
expectThrows(
IllegalArgumentException.class,
() -> builder.setPropertyBoolean("test", new boolean[] {}));
diff --git a/tests/appsearch/src/com/android/cts/appsearch/external/GlobalSearchSessionCtsTestBase.java b/tests/appsearch/src/com/android/cts/appsearch/external/GlobalSearchSessionCtsTestBase.java
index e6b3bed..c00f65c 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/external/GlobalSearchSessionCtsTestBase.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/external/GlobalSearchSessionCtsTestBase.java
@@ -23,7 +23,6 @@
import android.annotation.NonNull;
import android.app.appsearch.AppSearchEmail;
-import android.app.appsearch.AppSearchManager;
import android.app.appsearch.AppSearchSchema;
import android.app.appsearch.AppSearchSchema.PropertyConfig;
import android.app.appsearch.AppSearchSessionShim;
@@ -51,7 +50,7 @@
public abstract class GlobalSearchSessionCtsTestBase {
private AppSearchSessionShim mDb1;
- private static final String DB_NAME_1 = AppSearchManager.DEFAULT_DATABASE_NAME;
+ private static final String DB_NAME_1 = "";
private AppSearchSessionShim mDb2;
private static final String DB_NAME_2 = "testDb2";
@@ -125,7 +124,7 @@
// Index a document
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -163,7 +162,7 @@
// Index a document to instance 1.
AppSearchEmail inEmail1 =
- new AppSearchEmail.Builder("uri1")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -174,7 +173,7 @@
// Index a document to instance 2.
AppSearchEmail inEmail2 =
- new AppSearchEmail.Builder("uri2")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -205,7 +204,7 @@
// Index 31 documents
for (int i = 0; i < 31; i++) {
AppSearchEmail inEmail =
- new AppSearchEmail.Builder("uri" + i)
+ new AppSearchEmail.Builder("namespace", "uri" + i)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -235,7 +234,7 @@
results = searchResults.getNextPage().get();
++pageNumber;
for (SearchResult result : results) {
- documents.add(result.getDocument());
+ documents.add(result.getGenericDocument());
}
} while (results.size() > 0);
@@ -293,7 +292,7 @@
// Index a generic document into db1
GenericDocument genericDocument =
- new GenericDocument.Builder<>("uri2", "Generic")
+ new GenericDocument.Builder<>("namespace", "uri2", "Generic")
.setPropertyString("foo", "body")
.build();
checkIsBatchResultSuccess(
@@ -303,8 +302,7 @@
.build()));
AppSearchEmail email =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -354,8 +352,7 @@
// Index two documents
AppSearchEmail document1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace1")
+ new AppSearchEmail.Builder("namespace1", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -365,8 +362,7 @@
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(document1).build()));
AppSearchEmail document2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace2")
+ new AppSearchEmail.Builder("namespace2", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -417,8 +413,7 @@
// Index two documents
AppSearchEmail document1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace1")
+ new AppSearchEmail.Builder("namespace1", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -428,8 +423,7 @@
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(document1).build()));
AppSearchEmail document2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace2")
+ new AppSearchEmail.Builder("namespace2", "uri1")
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -464,8 +458,7 @@
// Index one document in each database.
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -476,8 +469,7 @@
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email1).build()));
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -501,15 +493,13 @@
// The two email documents should have been returned with only the "subject" and "to"
// properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
@@ -527,8 +517,7 @@
// Index one document in each database.
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -539,8 +528,7 @@
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email1).build()));
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -561,13 +549,11 @@
// The two email documents should have been returned without any properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.build();
assertThat(documents).containsExactly(expected1, expected2);
@@ -583,8 +569,7 @@
// Index one document in each database.
AppSearchEmail email1 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -595,8 +580,7 @@
mDb1.put(new PutDocumentsRequest.Builder().addGenericDocuments(email1).build()));
AppSearchEmail email2 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setFrom("from@example.com")
.setTo("to1@example.com", "to2@example.com")
@@ -621,15 +605,13 @@
// The two email documents should have been returned with only the "subject" and "to"
// properties.
AppSearchEmail expected1 =
- new AppSearchEmail.Builder("uri2")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri2")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
.build();
AppSearchEmail expected2 =
- new AppSearchEmail.Builder("uri1")
- .setNamespace("namespace")
+ new AppSearchEmail.Builder("namespace", "uri1")
.setCreationTimestampMillis(1000)
.setTo("to1@example.com", "to2@example.com")
.setSubject("testPut example")
diff --git a/tests/appsearch/src/com/android/cts/appsearch/external/customer/CustomerDocumentTest.java b/tests/appsearch/src/com/android/cts/appsearch/external/customer/CustomerDocumentTest.java
index 29b5754..debb5b3 100644
--- a/tests/appsearch/src/com/android/cts/appsearch/external/customer/CustomerDocumentTest.java
+++ b/tests/appsearch/src/com/android/cts/appsearch/external/customer/CustomerDocumentTest.java
@@ -35,16 +35,18 @@
private static final byte[] BYTE_ARRAY1 = new byte[] {(byte) 1, (byte) 2, (byte) 3};
private static final byte[] BYTE_ARRAY2 = new byte[] {(byte) 4, (byte) 5, (byte) 6};
private static final GenericDocument DOCUMENT_PROPERTIES1 =
- new GenericDocument.Builder<>("sDocumentProperties1", "sDocumentPropertiesSchemaType1")
+ new GenericDocument.Builder<>(
+ "namespace", "sDocumentProperties1", "sDocumentPropertiesSchemaType1")
.build();
private static final GenericDocument DOCUMENT_PROPERTIES2 =
- new GenericDocument.Builder<>("sDocumentProperties2", "sDocumentPropertiesSchemaType2")
+ new GenericDocument.Builder<>(
+ "namespace", "sDocumentProperties2", "sDocumentPropertiesSchemaType2")
.build();
@Test
public void testBuildCustomerDocument() {
CustomerDocument customerDocument =
- new CustomerDocument.Builder("uri1")
+ new CustomerDocument.Builder("namespace", "uri1")
.setScore(1)
.setCreationTimestampMillis(0)
.setPropertyLong("longKey1", 1L, 2L, 3L)
@@ -57,6 +59,7 @@
"documentKey1", DOCUMENT_PROPERTIES1, DOCUMENT_PROPERTIES2)
.build();
+ assertThat(customerDocument.getNamespace()).isEqualTo("namespace");
assertThat(customerDocument.getUri()).isEqualTo("uri1");
assertThat(customerDocument.getSchemaType()).isEqualTo("customerDocument");
assertThat(customerDocument.getScore()).isEqualTo(1);
@@ -91,8 +94,8 @@
}
public static class Builder extends GenericDocument.Builder<CustomerDocument.Builder> {
- private Builder(@NonNull String uri) {
- super(uri, "customerDocument");
+ private Builder(@NonNull String namespace, @NonNull String uri) {
+ super(namespace, uri, "customerDocument");
}
@Override
diff --git a/tests/autofillservice/Android.bp b/tests/autofillservice/Android.bp
index 5e022ea..f973d0e 100644
--- a/tests/autofillservice/Android.bp
+++ b/tests/autofillservice/Android.bp
@@ -32,6 +32,7 @@
// TODO: remove once Android migrates to JUnit 4.12,
// which provides assertThrows
"testng",
+ "cts-wm-util",
],
srcs: ["src/**/*.java"],
// Tag this module as a cts test artifact
diff --git a/tests/autofillservice/AndroidManifest.xml b/tests/autofillservice/AndroidManifest.xml
index 28d4ebd..58dd553 100644
--- a/tests/autofillservice/AndroidManifest.xml
+++ b/tests/autofillservice/AndroidManifest.xml
@@ -149,6 +149,7 @@
<activity android:name=".activities.SimpleAfterLoginActivity"/>
<activity android:name=".activities.SimpleBeforeLoginActivity"/>
<activity android:name=".activities.NonAutofillableActivity"/>
+ <activity android:name=".activities.ClientSuggestionsActivity"/>
<receiver android:name=".testcore.SelfDestructReceiver"
android:exported="true"
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MultiWindowLoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/MultiWindowLoginActivityTest.java
index 0cff3d2..20437f7 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MultiWindowLoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MultiWindowLoginActivityTest.java
@@ -34,12 +34,14 @@
import android.autofillservice.cts.testcore.AutofillActivityTestRule;
import android.autofillservice.cts.testcore.CannedFillResponse;
import android.autofillservice.cts.testcore.Helper;
-import android.content.Intent;
+import android.graphics.Rect;
import android.platform.test.annotations.AppModeFull;
+import android.server.wm.TestTaskOrganizer;
import android.view.View;
import com.android.compatibility.common.util.AdoptShellPermissionsRule;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.rules.RuleChain;
@@ -52,7 +54,7 @@
extends AutoFillServiceTestCase.AutoActivityLaunch<MultiWindowLoginActivity> {
private LoginActivity mActivity;
- private ActivityTaskManager mAtm;
+ private TestTaskOrganizer mTaskOrganizer;
@Override
protected AutofillActivityTestRule<MultiWindowLoginActivity> getActivityRule() {
@@ -61,7 +63,7 @@
@Override
protected void afterActivityLaunched() {
mActivity = getActivity();
- mAtm = mContext.getSystemService(ActivityTaskManager.class);
+ mTaskOrganizer = new TestTaskOrganizer(mContext);
}
};
}
@@ -82,33 +84,32 @@
ActivityTaskManager.supportsSplitScreenMultiWindow(mActivity));
}
+ @After
+ public void tearDown() {
+ mTaskOrganizer.unregisterOrganizerIfNeeded();
+ }
+
/**
- * Touch a view and exepct autofill window change
+ * Touch a view and expect autofill window change
*/
protected void tapViewAndExpectWindowEvent(View view) throws TimeoutException {
mUiBot.waitForWindowChange(() -> tap(view));
}
- protected String runAmStartActivity(Class<? extends Activity> activityClass, int flags) {
- return runAmStartActivity(activityClass.getName(), flags);
- }
-
- protected String runAmStartActivity(String activity, int flags) {
- return runShellCommand("am start %s/%s -f 0x%s", mPackageName, activity,
- Integer.toHexString(flags));
- }
-
/**
- * Put activity in TOP, will be followed by amStartActivity()
+ * Touch specific position on device display and expect autofill window change.
*/
- protected void splitWindow(Activity activity) {
- mAtm.setTaskWindowingModeSplitScreenPrimary(activity.getTaskId(), true /* toTop */);
+ protected void tapPointAndExpectWindowEvent(int x, int y) {
+ mUiBot.waitForWindowChange(() -> runShellCommand("input touchscreen tap %d %d", x, y));
+ }
+
+ protected String runAmStartActivity(String activity) {
+ return runShellCommand("am start %s/%s", mPackageName, activity);
}
protected void amStartActivity(Class<? extends Activity> activity2) {
// it doesn't work using startActivity(intent), have to go through shell command.
- runAmStartActivity(activity2,
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
+ runAmStartActivity(activity2.getName());
}
@Test
@@ -130,12 +131,13 @@
MultiWindowLoginActivity.expectNewInstance(false);
MultiWindowEmptyActivity.expectNewInstance(true);
- splitWindow(mActivity);
+ mTaskOrganizer.putTaskInSplitPrimary(mActivity.getTaskId());
mUiBot.waitForIdleSync();
MultiWindowLoginActivity loginActivity = MultiWindowLoginActivity.waitNewInstance();
amStartActivity(MultiWindowEmptyActivity.class);
MultiWindowEmptyActivity emptyActivity = MultiWindowEmptyActivity.waitNewInstance();
+ mTaskOrganizer.putTaskInSplitSecondary(emptyActivity.getTaskId());
// Make sure both activities are showing
mUiBot.assertShownByRelativeId(Helper.ID_USERNAME); // MultiWindowLoginActivity
@@ -155,7 +157,10 @@
assertThat(emptyActivity.hasWindowFocus()).isFalse();
// Tap on EmptyActivity and fill ui is gone.
- tapViewAndExpectWindowEvent(emptyActivity.getEmptyView());
+ Rect emptyActivityBounds = mTaskOrganizer.getSecondaryTaskBounds();
+ // Because tap(View) will get wrong physical start position of view while in split screen
+ // and make bot cannot tap on emptyActivity, so use task bounds and tap its center.
+ tapPointAndExpectWindowEvent(emptyActivityBounds.centerX(), emptyActivityBounds.centerY());
mUiBot.assertNoDatasetsEver();
assertThat(emptyActivity.hasWindowFocus()).isTrue();
// LoginActivity username field is still focused but window has no focus
diff --git a/tests/autofillservice/src/android/autofillservice/cts/activities/AuthenticationActivity.java b/tests/autofillservice/src/android/autofillservice/cts/activities/AuthenticationActivity.java
index 0a32981..199e1b1 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/activities/AuthenticationActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/activities/AuthenticationActivity.java
@@ -291,7 +291,8 @@
(id) -> Helper.findNodeByResourceId(structure, id));
}
} else if (dataset != null) {
- result = dataset.asDataset((id) -> Helper.findNodeByResourceId(structure, id));
+ result = dataset.asDatasetWithNodeResolver(
+ (id) -> Helper.findNodeByResourceId(structure, id));
} else {
throw new IllegalStateException("no dataset or response");
}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/activities/ClientSuggestionsActivity.java b/tests/autofillservice/src/android/autofillservice/cts/activities/ClientSuggestionsActivity.java
new file mode 100644
index 0000000..f69aa02
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/activities/ClientSuggestionsActivity.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.autofillservice.cts.activities;
+
+import android.autofillservice.cts.R;
+import android.autofillservice.cts.testcore.ClientAutofillRequestCallback;
+import android.autofillservice.cts.testcore.Helper;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.view.View;
+import android.view.autofill.AutofillId;
+
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+/**
+ * Activity that has the following fields:
+ *
+ * <ul>
+ * <li>Username EditText (id: username, no input-type)
+ * <li>Password EditText (id: "username", input-type textPassword)
+ * <li>Clear Button
+ * <li>Save Button
+ * <li>Login Button
+ * </ul>
+ */
+public class ClientSuggestionsActivity extends LoginActivity {
+ private static final String TAG = "ClientSuggestionsActivity";
+ private Handler mHandler;
+ ClientAutofillRequestCallback mRequestCallback;
+
+ private final Map<String, AutofillId> mMap = new ArrayMap<>();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mHandler = new Handler(Looper.myLooper());
+
+ mMap.put(Helper.ID_USERNAME, findViewById(R.id.username).getAutofillId());
+ mMap.put(Helper.ID_PASSWORD, findViewById(R.id.password).getAutofillId());
+ mHandler = new Handler(Looper.getMainLooper());
+ Executor executor = new Executor(){
+ @Override
+ public void execute(Runnable command) {
+ mHandler.post(command);
+ }
+ };
+ mRequestCallback = new ClientAutofillRequestCallback(mHandler, (id)-> mMap.get(id));
+ getAutofillManager().setAutofillRequestCallback(executor, mRequestCallback);
+ }
+
+ @Override
+ public void addChild(View child) {
+ throw new AssertionError("Uses addChild(View, String) instead");
+ }
+
+ public void addChild(View child, String id) {
+ Log.d(TAG, "addChild(" + child + "): id=" + child.getAutofillId());
+ super.addChild(child);
+
+ mMap.put(id, child.getAutofillId());
+ }
+
+ public ClientAutofillRequestCallback.Replier getReplier() {
+ return mRequestCallback.getReplier();
+ }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/activities/ManualAuthenticationActivity.java b/tests/autofillservice/src/android/autofillservice/cts/activities/ManualAuthenticationActivity.java
index 58b67d7..e3ebd1f 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/activities/ManualAuthenticationActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/activities/ManualAuthenticationActivity.java
@@ -58,7 +58,7 @@
result = sResponse.asFillResponse(/* contexts= */ null,
(id) -> Helper.findNodeByResourceId(structure, id));
} else if (sDataset != null) {
- result = sDataset.asDataset(
+ result = sDataset.asDatasetWithNodeResolver(
(id) -> Helper.findNodeByResourceId(structure, id));
} else {
throw new IllegalStateException("no dataset or response");
diff --git a/tests/autofillservice/src/android/autofillservice/cts/client/ClientSuggestionsInlineTest.java b/tests/autofillservice/src/android/autofillservice/cts/client/ClientSuggestionsInlineTest.java
new file mode 100644
index 0000000..9b5a907
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/client/ClientSuggestionsInlineTest.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.autofillservice.cts.client;
+
+import android.autofillservice.cts.commontests.ClientSuggestionsCommonTestCase;
+
+/**
+ * Tests client suggestions behaviors for the inline mode.
+ */
+public class ClientSuggestionsInlineTest extends ClientSuggestionsCommonTestCase {
+
+ public ClientSuggestionsInlineTest() {
+ super(getInlineUiBot());
+ }
+
+ @Override
+ protected boolean isInlineMode() {
+ return true;
+ }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/client/ClientSuggestionsTest.java b/tests/autofillservice/src/android/autofillservice/cts/client/ClientSuggestionsTest.java
new file mode 100644
index 0000000..895ec3a
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/client/ClientSuggestionsTest.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.autofillservice.cts.client;
+
+import android.autofillservice.cts.commontests.ClientSuggestionsCommonTestCase;
+
+/**
+ * Tests client suggestions behaviors for the dropdown mode.
+ */
+public class ClientSuggestionsTest extends ClientSuggestionsCommonTestCase {
+
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/commontests/AutoFillServiceTestCase.java b/tests/autofillservice/src/android/autofillservice/cts/commontests/AutoFillServiceTestCase.java
index 879aa8e..b206d5b 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/commontests/AutoFillServiceTestCase.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/commontests/AutoFillServiceTestCase.java
@@ -108,7 +108,7 @@
return false;
}
- protected static UiBot getInlineUiBot() {
+ protected static InlineUiBot getInlineUiBot() {
return sDefaultUiBot2;
}
@@ -480,7 +480,7 @@
}
protected static final UiBot sDefaultUiBot = new UiBot();
- protected static final UiBot sDefaultUiBot2 = new InlineUiBot();
+ protected static final InlineUiBot sDefaultUiBot2 = new InlineUiBot();
private AutoFillServiceTestCase() {
throw new UnsupportedOperationException("Contain static stuff only");
diff --git a/tests/autofillservice/src/android/autofillservice/cts/commontests/ClientSuggestionsCommonTestCase.java b/tests/autofillservice/src/android/autofillservice/cts/commontests/ClientSuggestionsCommonTestCase.java
new file mode 100644
index 0000000..af4dea1
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/commontests/ClientSuggestionsCommonTestCase.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.autofillservice.cts.commontests;
+
+import static android.autofillservice.cts.testcore.CannedFillResponse.NO_RESPONSE;
+import static android.autofillservice.cts.testcore.Helper.ID_EMPTY;
+import static android.autofillservice.cts.testcore.Helper.ID_PASSWORD;
+import static android.autofillservice.cts.testcore.Helper.ID_USERNAME;
+
+import android.autofillservice.cts.R;
+import android.autofillservice.cts.activities.ClientSuggestionsActivity;
+import android.autofillservice.cts.testcore.AutofillActivityTestRule;
+import android.autofillservice.cts.testcore.CannedFillResponse.CannedDataset;
+import android.autofillservice.cts.testcore.ClientAutofillRequestCallback;
+import android.autofillservice.cts.testcore.OneTimeTextWatcher;
+import android.autofillservice.cts.testcore.UiBot;
+import android.platform.test.annotations.AppModeFull;
+import android.widget.EditText;
+
+import androidx.annotation.NonNull;
+
+import org.junit.Test;
+
+/**
+ * This is the test case covering most scenarios - other test cases will cover characteristics
+ * specific to that test's activity (for example, custom views).
+ */
+public abstract class ClientSuggestionsCommonTestCase
+ extends AutoFillServiceTestCase.AutoActivityLaunch<ClientSuggestionsActivity> {
+
+ private static final String TAG = "ClientSuggestions";
+ protected ClientSuggestionsActivity mActivity;
+ protected ClientAutofillRequestCallback.Replier mClientReplier;
+
+ protected ClientSuggestionsCommonTestCase() {}
+
+ protected ClientSuggestionsCommonTestCase(UiBot inlineUiBot) {
+ super(inlineUiBot);
+ }
+
+ @Test
+ public void testAutoFillOneDataset() throws Exception {
+ // Set service.
+ enableService();
+
+ // Set expectations.
+ mClientReplier.addResponse(new CannedDataset.Builder()
+ .setField(ID_USERNAME, "dude")
+ .setField(ID_PASSWORD, "sweet")
+ .setPresentation("The Dude", isInlineMode())
+ .build());
+
+ // Trigger autofill.
+ mUiBot.selectByRelativeId(ID_USERNAME);
+ sReplier.assertOnFillRequestNotCalled();
+ mClientReplier.assertReceivedRequest();
+
+ mActivity.expectAutoFill("dude", "sweet");
+
+ // Select the dataset.
+ mUiBot.selectDataset("The Dude");
+
+ // Check the results.
+ mActivity.assertAutoFilled();
+ }
+
+ @Test
+ public void testAutoFillNoDatasets() throws Exception {
+ // Set service.
+ enableService();
+
+ // Set expectations.
+ mClientReplier.addResponse(NO_RESPONSE);
+
+ // Trigger autofill.
+ mUiBot.selectByRelativeId(ID_USERNAME);
+
+ mClientReplier.assertReceivedRequest();
+
+ // Make sure UI is not shown.
+ mUiBot.assertNoDatasetsEver();
+ }
+
+ @Test
+ @AppModeFull(reason = "testAutoFillOneDataset() is enough")
+ public void testNewFieldAddedAfterFirstRequest() throws Exception {
+ // Set service.
+ enableService();
+
+ // Set expectations.
+ mClientReplier.addResponse(NO_RESPONSE);
+
+ // Trigger autofill.
+ mUiBot.selectByRelativeId(ID_USERNAME);
+ mClientReplier.assertReceivedRequest();
+
+ // Make sure UI is not shown.
+ mUiBot.assertNoDatasetsEver();
+
+ // Try again, in a field that was added after the first request
+ final EditText child = new EditText(mActivity);
+ child.setId(R.id.empty);
+ mActivity.addChild(child, ID_EMPTY);
+ final OneTimeTextWatcher watcher = new OneTimeTextWatcher("child", child,
+ "new view on the block");
+ child.addTextChangedListener(watcher);
+ mClientReplier.addResponse(new CannedDataset.Builder()
+ .setField(ID_USERNAME, "dude")
+ .setField(ID_PASSWORD, "sweet")
+ .setField(ID_EMPTY, "new view on the block")
+ .setPresentation("The Dude", isInlineMode())
+ .build());
+
+ mActivity.syncRunOnUiThread(() -> child.requestFocus());
+
+ mClientReplier.assertReceivedRequest();
+ mActivity.expectAutoFill("dude", "sweet");
+
+ // Select the dataset.
+ mUiBot.selectDataset("The Dude");
+
+ // Check the results.
+ // Check username and password fields
+ mActivity.assertAutoFilled();
+ // Check the new added field
+ watcher.assertAutoFilled();
+ }
+
+ @NonNull
+ @Override
+ protected AutofillActivityTestRule<ClientSuggestionsActivity> getActivityRule() {
+ return new AutofillActivityTestRule<ClientSuggestionsActivity>(
+ ClientSuggestionsActivity.class) {
+ @Override
+ protected void afterActivityLaunched() {
+ mActivity = getActivity();
+ mClientReplier = mActivity.getReplier();
+ }
+ };
+ }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/inline/InlineTooltipTest.java b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineTooltipTest.java
new file mode 100644
index 0000000..79095cf
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/inline/InlineTooltipTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.autofillservice.cts.inline;
+
+import static android.autofillservice.cts.testcore.Helper.ID_PASSWORD;
+import static android.autofillservice.cts.testcore.Helper.ID_USERNAME;
+import static android.autofillservice.cts.testcore.Helper.getContext;
+import static android.autofillservice.cts.testcore.InstrumentedAutoFillServiceInlineEnabled.SERVICE_NAME;
+
+import android.autofillservice.cts.commontests.AbstractLoginActivityTestCase;
+import android.autofillservice.cts.testcore.CannedFillResponse;
+import android.autofillservice.cts.testcore.Helper;
+import android.autofillservice.cts.testcore.InlineUiBot;
+
+import org.junit.Test;
+import org.junit.rules.TestRule;
+
+/**
+ * Tests inline suggestions tooltip behaviors.
+ */
+public class InlineTooltipTest extends AbstractLoginActivityTestCase {
+
+ InlineUiBot mInlineUiBot;
+
+ public InlineTooltipTest() {
+ super(getInlineUiBot());
+ mInlineUiBot = getInlineUiBot();
+ }
+
+ @Override
+ protected boolean isInlineMode() {
+ return true;
+ }
+
+ @Override
+ public TestRule getMainTestRule() {
+ return InlineUiBot.annotateRule(super.getMainTestRule());
+ }
+
+ @Override
+ protected void enableService() {
+ Helper.enableAutofillService(getContext(), SERVICE_NAME);
+ }
+
+ @Test
+ public void testShowTooltip() throws Exception {
+ // Set service.
+ enableService();
+
+ final CannedFillResponse.Builder builder = new CannedFillResponse.Builder()
+ .addDataset(new CannedFillResponse.CannedDataset.Builder()
+ .setField(ID_USERNAME, "dude")
+ .setPresentation(createPresentation("The Username"))
+ .setInlinePresentation(createInlinePresentation("The Username"))
+ .setInlineTooltipPresentation(
+ Helper.createInlineTooltipPresentation("The Username Tooltip"))
+ .build());
+
+ sReplier.addResponse(builder.build());
+
+ // Trigger auto-fill.
+ mUiBot.selectByRelativeId(ID_USERNAME);
+ mUiBot.waitForIdleSync();
+ sReplier.getNextFillRequest();
+
+ mUiBot.assertDatasets("The Username");
+ mInlineUiBot.assertTooltipShowing("The Username Tooltip");
+ }
+
+ @Test
+ public void testShowTooltipWithTwoFields() throws Exception {
+ // Set service.
+ enableService();
+
+ final CannedFillResponse.Builder builder = new CannedFillResponse.Builder()
+ .addDataset(new CannedFillResponse.CannedDataset.Builder()
+ .setField(ID_USERNAME, "dude")
+ .setPresentation(createPresentation("The Username"))
+ .setInlinePresentation(createInlinePresentation("The Username"))
+ .setInlineTooltipPresentation(
+ Helper.createInlineTooltipPresentation("The Username Tooltip"))
+ .build())
+ .addDataset(new CannedFillResponse.CannedDataset.Builder()
+ .setField(ID_PASSWORD, "sweet")
+ .setPresentation(createPresentation("The Password"))
+ .setInlinePresentation(createInlinePresentation("The Password"))
+ .build())
+ .addDataset(new CannedFillResponse.CannedDataset.Builder()
+ .setField(ID_PASSWORD, "lollipop")
+ .setPresentation(createPresentation("The Password2"))
+ .setInlinePresentation(createInlinePresentation("The Password2"))
+ .setInlineTooltipPresentation(
+ Helper.createInlineTooltipPresentation("The Password Tooltip"))
+ .build());
+
+ sReplier.addResponse(builder.build());
+
+ // Trigger auto-fill.
+ mUiBot.selectByRelativeId(ID_USERNAME);
+ mUiBot.waitForIdleSync();
+ sReplier.getNextFillRequest();
+
+ mUiBot.assertDatasets("The Username");
+ mInlineUiBot.assertTooltipShowing("The Username Tooltip");
+
+ // Switch focus to password
+ mUiBot.selectByRelativeId(ID_PASSWORD);
+ mUiBot.waitForIdleSync();
+
+ mUiBot.assertDatasets("The Password", "The Password2");
+ mInlineUiBot.assertTooltipShowing("The Password Tooltip");
+
+ // Switch focus back to username
+ mUiBot.selectByRelativeId(ID_USERNAME);
+ mUiBot.waitForIdleSync();
+
+ mUiBot.assertDatasets("The Username");
+ mInlineUiBot.assertTooltipShowing("The Username Tooltip");
+
+ mActivity.expectAutoFill("dude");
+ mUiBot.selectDataset("The Username");
+ mUiBot.waitForIdleSync();
+
+ // Check the results.
+ mActivity.assertAutoFilled();
+ }
+
+ @Test
+ public void testShowTooltipWithSecondDataset() throws Exception {
+ // Set service.
+ enableService();
+
+ final CannedFillResponse.Builder builder = new CannedFillResponse.Builder()
+ .addDataset(new CannedFillResponse.CannedDataset.Builder()
+ .setField(ID_USERNAME, "dude")
+ .setPresentation(createPresentation("The Username"))
+ .setInlinePresentation(createInlinePresentation("The Username"))
+ .build())
+ .addDataset(new CannedFillResponse.CannedDataset.Builder()
+ .setField(ID_USERNAME, "sweet")
+ .setPresentation(createPresentation("The Username2"))
+ .setInlinePresentation(createInlinePresentation("The Username2"))
+ .setInlineTooltipPresentation(
+ Helper.createInlineTooltipPresentation("The Username Tooltip"))
+ .build())
+ .addDataset(new CannedFillResponse.CannedDataset.Builder()
+ .setField(ID_USERNAME, "candy")
+ .setPresentation(createPresentation("The Username3"))
+ .setInlinePresentation(createInlinePresentation("The Username3"))
+ .build());
+
+ sReplier.addResponse(builder.build());
+
+ // Trigger auto-fill.
+ mUiBot.selectByRelativeId(ID_USERNAME);
+ mUiBot.waitForIdleSync();
+ sReplier.getNextFillRequest();
+
+ mUiBot.assertDatasets("The Username", "The Username2", "The Username3");
+ mInlineUiBot.assertTooltipShowing("The Username Tooltip");
+ }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/DisableAutofillTest.java b/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/DisableAutofillTest.java
index e098e87..5eb72f4 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/DisableAutofillTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/DisableAutofillTest.java
@@ -128,7 +128,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/autofillservice/src/android/autofillservice/cts/servicebehavior/WebViewMultiScreenLoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/WebViewMultiScreenLoginActivityTest.java
index 94a88c4..009a9cb 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/WebViewMultiScreenLoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/WebViewMultiScreenLoginActivityTest.java
@@ -24,7 +24,6 @@
import static android.autofillservice.cts.testcore.Helper.ID_USERNAME_LABEL;
import static android.autofillservice.cts.testcore.Helper.assertTextAndValue;
import static android.autofillservice.cts.testcore.Helper.findNodeByHtmlName;
-import static android.autofillservice.cts.testcore.Helper.getAutofillId;
import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_PASSWORD;
import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_USERNAME;
@@ -103,7 +102,7 @@
sReplier.addResponse(new CannedFillResponse.Builder()
.setRequiredSavableIds(SAVE_DATA_TYPE_USERNAME, HTML_NAME_USERNAME)
.setSaveInfoDecorator((builder, nodeResolver) -> {
- final AutofillId usernameId = getAutofillId(nodeResolver, HTML_NAME_USERNAME);
+ final AutofillId usernameId = nodeResolver.apply(HTML_NAME_USERNAME);
final CharSequenceTransformation usernameTrans = new CharSequenceTransformation
.Builder(usernameId, MATCH_ALL, "$1").build();
builder.setCustomDescription(newCustomDescriptionWithUsernameAndPassword()
@@ -155,7 +154,7 @@
sReplier.addResponse(new CannedFillResponse.Builder()
.setRequiredSavableIds(SAVE_DATA_TYPE_PASSWORD, HTML_NAME_PASSWORD)
.setSaveInfoDecorator((builder, nodeResolver) -> {
- final AutofillId passwordId = getAutofillId(nodeResolver, HTML_NAME_PASSWORD);
+ final AutofillId passwordId = nodeResolver.apply(HTML_NAME_PASSWORD);
final CharSequenceTransformation passwordTrans = new CharSequenceTransformation
.Builder(passwordId, MATCH_ALL, "$1").build();
builder.setCustomDescription(newCustomDescriptionWithUsernameAndPassword()
@@ -219,7 +218,7 @@
.setIgnoreFields(HTML_NAME_USERNAME)
.setSaveInfoFlags(SaveInfo.FLAG_DELAY_SAVE)
.setSaveInfoDecorator((builder, nodeResolver) -> {
- usernameId.set(getAutofillId(nodeResolver, HTML_NAME_USERNAME));
+ usernameId.set(nodeResolver.apply(HTML_NAME_USERNAME));
})
.build());
@@ -258,7 +257,7 @@
.setRequiredSavableIds(SAVE_DATA_TYPE_USERNAME | SAVE_DATA_TYPE_PASSWORD,
HTML_NAME_PASSWORD)
.setSaveInfoDecorator((builder, nodeResolver) -> {
- final AutofillId passwordId = getAutofillId(nodeResolver, HTML_NAME_PASSWORD);
+ final AutofillId passwordId = nodeResolver.apply(HTML_NAME_PASSWORD);
final CharSequenceTransformation usernameTrans = new CharSequenceTransformation
.Builder(usernameId.get(), MATCH_ALL, "$1").build();
final CharSequenceTransformation passwordTrans = new CharSequenceTransformation
diff --git a/tests/autofillservice/src/android/autofillservice/cts/testcore/CannedFillResponse.java b/tests/autofillservice/src/android/autofillservice/cts/testcore/CannedFillResponse.java
index 8ef8627..3ec1f12 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/testcore/CannedFillResponse.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/testcore/CannedFillResponse.java
@@ -171,12 +171,28 @@
*/
public FillResponse asFillResponse(@Nullable List<FillContext> contexts,
@NonNull Function<String, ViewNode> nodeResolver) {
+ return asFillResponseWithAutofillId(contexts, (id)-> {
+ ViewNode node = nodeResolver.apply(id);
+ if (node == null) {
+ throw new AssertionError("No node with resource id " + id);
+ }
+ return node.getAutofillId();
+ });
+ }
+
+ /**
+ * Creates a new response, replacing the dataset field ids by the real ids from the assist
+ * structure.
+ */
+ public FillResponse asFillResponseWithAutofillId(@Nullable List<FillContext> contexts,
+ @NonNull Function<String, AutofillId> autofillIdResolver) {
final FillResponse.Builder builder = new FillResponse.Builder()
.setFlags(mFillResponseFlags);
if (mDatasets != null) {
for (CannedDataset cannedDataset : mDatasets) {
- final Dataset dataset = cannedDataset.asDataset(nodeResolver);
- assertWithMessage("Cannot create datase").that(dataset).isNotNull();
+ final Dataset dataset =
+ cannedDataset.asDatasetWithAutofillIdResolver(autofillIdResolver);
+ assertWithMessage("Cannot create dataset").that(dataset).isNotNull();
builder.addDataset(dataset);
}
}
@@ -189,13 +205,14 @@
saveInfoBuilder = mRequiredSavableIds == null || mRequiredSavableIds.length == 0
? new SaveInfo.Builder(mSaveType)
: new SaveInfo.Builder(mSaveType,
- getAutofillIds(nodeResolver, mRequiredSavableIds));
+ getAutofillIds(autofillIdResolver, mRequiredSavableIds));
}
saveInfoBuilder.setFlags(mSaveInfoFlags);
if (mOptionalSavableIds != null) {
- saveInfoBuilder.setOptionalIds(getAutofillIds(nodeResolver, mOptionalSavableIds));
+ saveInfoBuilder.setOptionalIds(
+ getAutofillIds(autofillIdResolver, mOptionalSavableIds));
}
if (mSaveDescription != null) {
saveInfoBuilder.setDescription(mSaveDescription);
@@ -217,7 +234,7 @@
if (saveInfoBuilder != null) {
// TODO: merge decorator and visitor
if (mSaveInfoDecorator != null) {
- mSaveInfoDecorator.decorate(saveInfoBuilder, nodeResolver);
+ mSaveInfoDecorator.decorate(saveInfoBuilder, autofillIdResolver);
}
if (mSaveInfoVisitor != null) {
Log.d(TAG, "Visiting saveInfo " + saveInfoBuilder);
@@ -228,10 +245,10 @@
builder.setSaveInfo(saveInfo);
}
if (mIgnoredIds != null) {
- builder.setIgnoredIds(getAutofillIds(nodeResolver, mIgnoredIds));
+ builder.setIgnoredIds(getAutofillIds(autofillIdResolver, mIgnoredIds));
}
if (mAuthenticationIds != null) {
- builder.setAuthentication(getAutofillIds(nodeResolver, mAuthenticationIds),
+ builder.setAuthentication(getAutofillIds(autofillIdResolver, mAuthenticationIds),
mAuthentication, mPresentation, mInlinePresentation);
}
if (mDisableDuration > 0) {
@@ -246,7 +263,7 @@
builder.setFieldClassificationIds(fieldIds);
} else if (mFieldClassificationIds != null) {
builder.setFieldClassificationIds(
- getAutofillIds(nodeResolver, mFieldClassificationIds));
+ getAutofillIds(autofillIdResolver, mFieldClassificationIds));
}
if (mExtras != null) {
builder.setClientState(mExtras);
@@ -586,9 +603,11 @@
private final Map<String, AutofillValue> mFieldValues;
private final Map<String, RemoteViews> mFieldPresentations;
private final Map<String, InlinePresentation> mFieldInlinePresentations;
+ private final Map<String, InlinePresentation> mFieldInlineTooltipPresentations;
private final Map<String, Pair<Boolean, Pattern>> mFieldFilters;
private final RemoteViews mPresentation;
private final InlinePresentation mInlinePresentation;
+ private final InlinePresentation mInlineTooltipPresentation;
private final IntentSender mAuthentication;
private final String mId;
@@ -596,9 +615,11 @@
mFieldValues = builder.mFieldValues;
mFieldPresentations = builder.mFieldPresentations;
mFieldInlinePresentations = builder.mFieldInlinePresentations;
+ mFieldInlineTooltipPresentations = builder.mFieldInlineTooltipPresentations;
mFieldFilters = builder.mFieldFilters;
mPresentation = builder.mPresentation;
mInlinePresentation = builder.mInlinePresentation;
+ mInlineTooltipPresentation = builder.mInlineTooltipPresentation;
mAuthentication = builder.mAuthentication;
mId = builder.mId;
}
@@ -606,47 +627,80 @@
/**
* Creates a new dataset, replacing the field ids by the real ids from the assist structure.
*/
- public Dataset asDataset(Function<String, ViewNode> nodeResolver) {
+ public Dataset asDatasetWithNodeResolver(Function<String, ViewNode> nodeResolver) {
+ return asDatasetWithAutofillIdResolver((id) -> {
+ ViewNode node = nodeResolver.apply(id);
+ if (node == null) {
+ throw new AssertionError("No node with resource id " + id);
+ }
+ return node.getAutofillId();
+ });
+ }
+
+ /**
+ * Creates a new dataset, replacing the field ids by the real ids from the assist structure.
+ */
+ public Dataset asDatasetWithAutofillIdResolver(
+ Function<String, AutofillId> autofillIdResolver) {
final Dataset.Builder builder = mPresentation != null
- ? mInlinePresentation == null
? new Dataset.Builder(mPresentation)
- : new Dataset.Builder(mPresentation).setInlinePresentation(mInlinePresentation)
- : mInlinePresentation == null
- ? new Dataset.Builder()
- : new Dataset.Builder(mInlinePresentation);
+ : new Dataset.Builder();
+ if (mInlinePresentation != null) {
+ if (mInlineTooltipPresentation != null) {
+ builder.setInlinePresentation(mInlinePresentation, mInlineTooltipPresentation);
+ } else {
+ builder.setInlinePresentation(mInlinePresentation);
+ }
+ }
if (mFieldValues != null) {
for (Map.Entry<String, AutofillValue> entry : mFieldValues.entrySet()) {
final String id = entry.getKey();
- final ViewNode node = nodeResolver.apply(id);
- if (node == null) {
+
+ final AutofillId autofillId = autofillIdResolver.apply(id);
+ if (autofillId == null) {
throw new AssertionError("No node with resource id " + id);
}
- final AutofillId autofillId = node.getAutofillId();
final AutofillValue value = entry.getValue();
final RemoteViews presentation = mFieldPresentations.get(id);
final InlinePresentation inlinePresentation = mFieldInlinePresentations.get(id);
+ final InlinePresentation tooltipPresentation =
+ mFieldInlineTooltipPresentations.get(id);
final Pair<Boolean, Pattern> filter = mFieldFilters.get(id);
if (presentation != null) {
if (filter == null) {
if (inlinePresentation != null) {
- builder.setValue(autofillId, value, presentation,
- inlinePresentation);
+ if (tooltipPresentation != null) {
+ builder.setValue(autofillId, value, presentation,
+ inlinePresentation, tooltipPresentation);
+ } else {
+ builder.setValue(autofillId, value, presentation,
+ inlinePresentation);
+ }
} else {
builder.setValue(autofillId, value, presentation);
}
} else {
if (inlinePresentation != null) {
- builder.setValue(autofillId, value, filter.second, presentation,
- inlinePresentation);
+ if (tooltipPresentation != null) {
+ builder.setValue(autofillId, value, filter.second, presentation,
+ inlinePresentation, tooltipPresentation);
+ } else {
+ builder.setValue(autofillId, value, filter.second, presentation,
+ inlinePresentation);
+ }
} else {
builder.setValue(autofillId, value, filter.second, presentation);
}
}
} else {
if (inlinePresentation != null) {
- builder.setFieldInlinePresentation(autofillId, value,
- filter != null ? filter.second : null, inlinePresentation);
+ if (tooltipPresentation != null) {
+ throw new IllegalStateException("presentation can not be null");
+ } else {
+ builder.setFieldInlinePresentation(autofillId, value,
+ filter != null ? filter.second : null, inlinePresentation);
+ }
} else {
if (filter == null) {
builder.setValue(autofillId, value);
@@ -667,6 +721,7 @@
+ ", hasInlinePresentation=" + (mInlinePresentation != null)
+ ", fieldPresentations=" + (mFieldPresentations)
+ ", fieldInlinePresentations=" + (mFieldInlinePresentations)
+ + ", fieldTooltipInlinePresentations=" + (mFieldInlineTooltipPresentations)
+ ", hasAuthentication=" + (mAuthentication != null)
+ ", fieldValues=" + mFieldValues
+ ", fieldFilters=" + mFieldFilters + "]";
@@ -677,12 +732,15 @@
private final Map<String, RemoteViews> mFieldPresentations = new HashMap<>();
private final Map<String, InlinePresentation> mFieldInlinePresentations =
new HashMap<>();
+ private final Map<String, InlinePresentation> mFieldInlineTooltipPresentations =
+ new HashMap<>();
private final Map<String, Pair<Boolean, Pattern>> mFieldFilters = new HashMap<>();
private RemoteViews mPresentation;
private InlinePresentation mInlinePresentation;
private IntentSender mAuthentication;
private String mId;
+ private InlinePresentation mInlineTooltipPresentation;
public Builder() {
@@ -827,6 +885,21 @@
* {@link IdMode}.
*/
public Builder setField(String id, String text, RemoteViews presentation,
+ InlinePresentation inlinePresentation,
+ InlinePresentation inlineTooltipPresentation) {
+ setField(id, text, presentation, inlinePresentation);
+ mFieldInlineTooltipPresentations.put(id, inlineTooltipPresentation);
+ return this;
+ }
+
+ /**
+ * Sets the canned value of a field based on its {@code id}.
+ *
+ * <p>The meaning of the id is defined by the object using the canned dataset.
+ * For example, {@link InstrumentedAutoFillService.Replier} resolves the id based on
+ * {@link IdMode}.
+ */
+ public Builder setField(String id, String text, RemoteViews presentation,
InlinePresentation inlinePresentation, Pattern filter) {
setField(id, text, presentation, inlinePresentation);
mFieldFilters.put(id, new Pair<>(true, filter));
@@ -834,6 +907,23 @@
}
/**
+ * Sets the canned value of a field based on its {@code id}.
+ *
+ * <p>The meaning of the id is defined by the object using the canned dataset.
+ * For example, {@link InstrumentedAutoFillService.Replier} resolves the id based on
+ * {@link IdMode}.
+ */
+ public Builder setField(String id, String text, RemoteViews presentation,
+ InlinePresentation inlinePresentation,
+ InlinePresentation inlineTooltipPresentation,
+ Pattern filter) {
+ setField(id, text, presentation, inlinePresentation, inlineTooltipPresentation);
+ mFieldFilters.put(id, new Pair<>(true, filter));
+
+ return this;
+ }
+
+ /**
* Sets the view to present the response in the UI.
*/
public Builder setPresentation(RemoteViews presentation) {
@@ -849,6 +939,14 @@
return this;
}
+ /**
+ * Sets the inline tooltip to present the response in the UI.
+ */
+ public Builder setInlineTooltipPresentation(InlinePresentation tooltip) {
+ mInlineTooltipPresentation = tooltip;
+ return this;
+ }
+
public Builder setPresentation(String message, boolean inlineMode) {
mPresentation = createPresentation(message);
if (inlineMode) {
@@ -883,6 +981,6 @@
}
public interface SaveInfoDecorator {
- void decorate(SaveInfo.Builder builder, Function<String, ViewNode> nodeResolver);
+ void decorate(SaveInfo.Builder builder, Function<String, AutofillId> nodeResolver);
}
}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/testcore/ClientAutofillRequestCallback.java b/tests/autofillservice/src/android/autofillservice/cts/testcore/ClientAutofillRequestCallback.java
new file mode 100644
index 0000000..b0a28cd
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/testcore/ClientAutofillRequestCallback.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.autofillservice.cts.testcore;
+
+import static android.autofillservice.cts.testcore.CannedFillResponse.ResponseType.FAILURE;
+import static android.autofillservice.cts.testcore.CannedFillResponse.ResponseType.NULL;
+import static android.autofillservice.cts.testcore.CannedFillResponse.ResponseType.TIMEOUT;
+import static android.autofillservice.cts.testcore.Timeouts.CONNECTION_TIMEOUT;
+import static android.autofillservice.cts.testcore.Timeouts.FILL_TIMEOUT;
+import static android.autofillservice.cts.testcore.Timeouts.RESPONSE_DELAY_MS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.IntentSender;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.service.autofill.AutofillService;
+import android.service.autofill.Dataset;
+import android.service.autofill.FillCallback;
+import android.service.autofill.FillContext;
+import android.service.autofill.FillResponse;
+import android.service.autofill.SaveCallback;
+import android.util.Log;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillRequestCallback;
+import android.view.inputmethod.InlineSuggestionsRequest;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.compatibility.common.util.RetryableException;
+import com.android.compatibility.common.util.TestNameUtils;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+
+/**
+ * Implements an {@link AutofillRequestCallback} for testing client suggestions behavior.
+ */
+public class ClientAutofillRequestCallback implements AutofillRequestCallback {
+ private static final String TAG = "ClientAutofillRequestCallback";
+ private final Handler mHandler;
+ private final @NonNull Function<String, AutofillId> mIdResolver;
+ private final Replier mReplier;
+
+ public ClientAutofillRequestCallback(@NonNull Handler handler,
+ @NonNull Function<String, AutofillId> idResolver) {
+ mHandler = handler;
+ mIdResolver = idResolver;
+ mReplier = new Replier(mIdResolver);
+ }
+
+ @Override
+ public void onFillRequest(InlineSuggestionsRequest inlineSuggestionsRequest,
+ CancellationSignal cancellationSignal, FillCallback callback) {
+
+ if (!TestNameUtils.isRunningTest()) {
+ Log.e(TAG, "onFillRequest(client) called after tests finished");
+ return;
+ }
+
+ mHandler.post(
+ () -> mReplier.onFillRequest(
+ cancellationSignal, callback, inlineSuggestionsRequest));
+ }
+
+ public Replier getReplier() {
+ return mReplier;
+ }
+
+
+ /**
+ * Object used to answer a
+ * {@link AutofillRequestCallback#onFillRequest(InlineSuggestionsRequest, CancellationSignal,
+ * FillCallback)}
+ * on behalf of a unit test method.
+ */
+ public static final class Replier {
+ // TODO: refactor with InstrumentedAutoFillService$Replier
+
+ private final BlockingQueue<CannedFillResponse> mResponses = new LinkedBlockingQueue<>();
+ private final BlockingQueue<InlineSuggestionsRequest> mFillRequests =
+ new LinkedBlockingQueue<>();
+
+ private List<Throwable> mExceptions;
+ private IntentSender mOnSaveIntentSender;
+ private String mAcceptedPackageName;
+
+ private Handler mHandler;
+
+ private boolean mReportUnhandledFillRequest = true;
+ private boolean mReportUnhandledSaveRequest = true;
+ private final @NonNull Function<String, AutofillId> mIdResolver;
+
+ private Replier(@NonNull Function<String, AutofillId> idResolver) {
+ mIdResolver = idResolver;
+ }
+
+ public void acceptRequestsFromPackage(String packageName) {
+ mAcceptedPackageName = packageName;
+ }
+
+ /**
+ * Gets the exceptions thrown asynchronously, if any.
+ */
+ @Nullable
+ public List<Throwable> getExceptions() {
+ return mExceptions;
+ }
+
+ private void addException(@Nullable Throwable e) {
+ if (e == null) return;
+
+ if (mExceptions == null) {
+ mExceptions = new ArrayList<>();
+ }
+ mExceptions.add(e);
+ }
+
+ /**
+ * Sets the expectation for the next {@code onFillRequest} as {@link FillResponse} with
+ * just one {@link Dataset}.
+ */
+ public Replier addResponse(
+ CannedFillResponse.CannedDataset dataset) {
+ return addResponse(new CannedFillResponse.Builder()
+ .addDataset(dataset)
+ .build());
+ }
+
+ /**
+ * Sets the expectation for the next {@code onFillRequest}.
+ */
+ public Replier addResponse(CannedFillResponse response) {
+ if (response == null) {
+ throw new IllegalArgumentException("Cannot be null - use NO_RESPONSE instead");
+ }
+ mResponses.add(response);
+ return this;
+ }
+
+ /**
+ * Sets the {@link IntentSender} that is passed to
+ * {@link SaveCallback#onSuccess(IntentSender)}.
+ */
+ public Replier setOnSave(IntentSender intentSender) {
+ mOnSaveIntentSender = intentSender;
+ return this;
+ }
+
+ /**
+ * Gets the next fill request, in the order received.
+ */
+ public InlineSuggestionsRequest getNextFillRequest() {
+ InlineSuggestionsRequest request;
+ try {
+ request = mFillRequests.poll(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IllegalStateException("Interrupted", e);
+ }
+ if (request == null) {
+ throw new RetryableException(FILL_TIMEOUT, "onFillRequest() not called");
+ }
+ return request;
+ }
+
+ /**
+ * Assets the client had received fill request.
+ */
+ public void assertReceivedRequest() {
+ getNextFillRequest();
+ }
+
+ /**
+ * Asserts that {@link AutofillRequestCallback#onFillRequest(InlineSuggestionsRequest,
+ * CancellationSignal, FillCallback)} was not called.
+ *
+ * <p>Should only be called in cases where it's not expected to be called, as it will
+ * sleep for a few ms.
+ */
+ public void assertOnFillRequestNotCalled() {
+ SystemClock.sleep(FILL_TIMEOUT.getMaxValue());
+ assertThat(mFillRequests).isEmpty();
+ }
+
+ /**
+ * Asserts all {@link AutofillService#onFillRequest(
+ * android.service.autofill.FillRequest, CancellationSignal, FillCallback) fill requests}
+ * received by the service were properly {@link #getNextFillRequest() handled} by the test
+ * case.
+ */
+ public void assertNoUnhandledFillRequests() {
+ if (mFillRequests.isEmpty()) return; // Good job, test case!
+
+ if (!mReportUnhandledFillRequest) {
+ // Just log, so it's not thrown again on @After if already thrown on main body
+ Log.d(TAG, "assertNoUnhandledFillRequests(): already reported, "
+ + "but logging just in case: " + mFillRequests);
+ return;
+ }
+
+ mReportUnhandledFillRequest = false;
+ throw new AssertionError(mFillRequests.size()
+ + " unhandled fill requests: " + mFillRequests);
+ }
+
+ /**
+ * Gets the current number of unhandled requests.
+ */
+ public int getNumberUnhandledFillRequests() {
+ return mFillRequests.size();
+ }
+
+ public void setHandler(Handler handler) {
+ mHandler = handler;
+ }
+
+ /**
+ * Resets its internal state.
+ */
+ public void reset() {
+ mResponses.clear();
+ mFillRequests.clear();
+ mExceptions = null;
+ mOnSaveIntentSender = null;
+ mAcceptedPackageName = null;
+ mReportUnhandledFillRequest = true;
+ mReportUnhandledSaveRequest = true;
+ }
+
+ public void onFillRequest(CancellationSignal cancellationSignal, FillCallback callback,
+ InlineSuggestionsRequest inlineSuggestionsRequest) {
+ try {
+ CannedFillResponse response = null;
+ try {
+ response = mResponses.poll(CONNECTION_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ Log.w(TAG, "Interrupted getting CannedResponse: " + e);
+ Thread.currentThread().interrupt();
+ addException(e);
+ return;
+ }
+ if (response == null) {
+ Log.d(TAG, "response is null");
+ return;
+ }
+ if (response.getResponseType() == NULL) {
+ Log.d(TAG, "onFillRequest(): replying with null");
+ callback.onSuccess(null);
+ return;
+ }
+
+ if (response.getResponseType() == TIMEOUT) {
+ Log.d(TAG, "onFillRequest(): not replying at all");
+ return;
+ }
+
+ if (response.getResponseType() == FAILURE) {
+ Log.d(TAG, "onFillRequest(): replying with failure");
+ callback.onFailure("D'OH!");
+ return;
+ }
+
+ if (response.getResponseType() == CannedFillResponse.ResponseType.NO_MORE) {
+ Log.w(TAG, "onFillRequest(): replying with null when not expecting more");
+ addException(new IllegalStateException("got unexpected request"));
+ callback.onSuccess(null);
+ return;
+ }
+
+ final String failureMessage = response.getFailureMessage();
+ if (failureMessage != null) {
+ Log.v(TAG, "onFillRequest(): failureMessage = " + failureMessage);
+ callback.onFailure(failureMessage);
+ return;
+ }
+
+ final FillResponse fillResponse;
+ fillResponse = response.asFillResponseWithAutofillId(null, mIdResolver);
+
+ if (response.getResponseType() == CannedFillResponse.ResponseType.DELAY) {
+ mHandler.postDelayed(() -> {
+ Log.v(TAG,
+ "onFillRequest(): fillResponse = " + fillResponse);
+ callback.onSuccess(fillResponse);
+ // Add a fill request to let test case know response was sent.
+ Helper.offer(mFillRequests, inlineSuggestionsRequest,
+ CONNECTION_TIMEOUT.ms());
+ }, RESPONSE_DELAY_MS);
+ } else {
+ Log.v(TAG, "onFillRequest(): fillResponse = " + fillResponse);
+ callback.onSuccess(fillResponse);
+ }
+ } catch (Throwable t) {
+ Log.d(TAG, "onFillRequest(): catch a Throwable: " + t);
+ addException(t);
+ } finally {
+ Helper.offer(mFillRequests, inlineSuggestionsRequest, CONNECTION_TIMEOUT.ms());
+ }
+ }
+
+ private void onSaveRequest(List<FillContext> contexts, Bundle data, SaveCallback callback,
+ List<String> datasetIds) {
+ Log.d(TAG, "onSaveRequest(): sender=" + mOnSaveIntentSender);
+
+ try {
+ if (mOnSaveIntentSender != null) {
+ callback.onSuccess(mOnSaveIntentSender);
+ } else {
+ callback.onSuccess();
+ }
+ } finally {
+ //TODO
+ }
+ }
+
+ private void dump(PrintWriter pw) {
+ pw.print("mResponses: "); pw.println(mResponses);
+ pw.print("mFillRequests: "); pw.println(mFillRequests);
+ pw.print("mExceptions: "); pw.println(mExceptions);
+ pw.print("mOnSaveIntentSender: "); pw.println(mOnSaveIntentSender);
+ pw.print("mAcceptedPackageName: "); pw.println(mAcceptedPackageName);
+ pw.print("mAcceptedPackageName: "); pw.println(mAcceptedPackageName);
+ pw.print("mReportUnhandledFillRequest: "); pw.println(mReportUnhandledSaveRequest);
+ }
+ }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/testcore/Helper.java b/tests/autofillservice/src/android/autofillservice/cts/testcore/Helper.java
index 933b8c2..46a613f 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/testcore/Helper.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/testcore/Helper.java
@@ -801,39 +801,19 @@
* Creates an array of {@link AutofillId} mapped from the {@code structure} nodes with the given
* {@code resourceIds}.
*/
- public static AutofillId[] getAutofillIds(Function<String, ViewNode> nodeResolver,
+ public static AutofillId[] getAutofillIds(Function<String, AutofillId> autofillIdResolver,
String[] resourceIds) {
if (resourceIds == null) return null;
final AutofillId[] requiredIds = new AutofillId[resourceIds.length];
for (int i = 0; i < resourceIds.length; i++) {
final String resourceId = resourceIds[i];
- final ViewNode node = nodeResolver.apply(resourceId);
- if (node == null) {
- throw new AssertionError("No node with resourceId " + resourceId);
- }
- requiredIds[i] = node.getAutofillId();
-
+ requiredIds[i] = autofillIdResolver.apply(resourceId);
}
return requiredIds;
}
/**
- * Get an {@link AutofillId} mapped from the {@code structure} node with the given
- * {@code resourceId}.
- */
- public static AutofillId getAutofillId(Function<String, ViewNode> nodeResolver,
- String resourceId) {
- if (resourceId == null) return null;
-
- final ViewNode node = nodeResolver.apply(resourceId);
- if (node == null) {
- throw new AssertionError("No node with resourceId " + resourceId);
- }
- return node.getAutofillId();
- }
-
- /**
* Prevents the screen to rotate by itself
*/
public static void disableAutoRotation(UiBot uiBot) throws Exception {
@@ -1569,6 +1549,22 @@
.build(), /* pinned= */ pinned);
}
+ public static InlinePresentation createInlineTooltipPresentation(
+ @NonNull String message) {
+ final PendingIntent dummyIntent = PendingIntent.getActivity(getContext(), 0, new Intent(),
+ PendingIntent.FLAG_IMMUTABLE);
+ return createInlineTooltipPresentation(message, dummyIntent);
+ }
+
+ private static InlinePresentation createInlineTooltipPresentation(
+ @NonNull String message, @NonNull PendingIntent attribution) {
+ return InlinePresentation.createTooltipPresentation(
+ InlineSuggestionUi.newContentBuilder(attribution)
+ .setTitle(message).build().getSlice(),
+ new InlinePresentationSpec.Builder(new Size(100, 100), new Size(400, 100))
+ .build());
+ }
+
public static void mockSwitchInputMethod(@NonNull Context context) throws Exception {
final ContentResolver cr = context.getContentResolver();
final int subtype = Settings.Secure.getInt(cr, SELECTED_INPUT_METHOD_SUBTYPE);
diff --git a/tests/autofillservice/src/android/autofillservice/cts/testcore/InlineUiBot.java b/tests/autofillservice/src/android/autofillservice/cts/testcore/InlineUiBot.java
index 88f97c2..50892fc 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/testcore/InlineUiBot.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/testcore/InlineUiBot.java
@@ -126,6 +126,13 @@
strip.fling(direction, speed);
}
+ public void assertTooltipShowing(String text) throws Exception {
+ final UiObject2 strip = waitForObject(By.text(text), UI_TIMEOUT);
+ if (strip == null) {
+ throw new AssertionError("not find inline tooltip by text: " + text);
+ }
+ }
+
private UiObject2 findSuggestionStrip(Timeout timeout) throws Exception {
return waitForObject(SUGGESTION_STRIP_SELECTOR, timeout);
}
diff --git a/tests/camera/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/camera/src/android/hardware/camera2/cts/CameraManagerTest.java
index 87b132d..620ccee 100644
--- a/tests/camera/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -676,26 +676,31 @@
// simplicity. This is since when mAdoptShellPerm is false, we can't test for
// onCameraOpened/Closed callbacks (no CAMERA_OPEN_CLOSE_LISTENER permissions).
// So, to test all cameras, we test them when we adopt shell permission identity.
+ super.onCameraAvailable(cameraId);
availableEventQueue.offer(cameraId);
}
@Override
public void onCameraUnavailable(String cameraId) {
+ super.onCameraUnavailable(cameraId);
unavailableEventQueue.offer(cameraId);
}
@Override
public void onPhysicalCameraAvailable(String cameraId, String physicalCameraId) {
+ super.onPhysicalCameraAvailable(cameraId, physicalCameraId);
availablePhysicalCamEventQueue.offer(new Pair<>(cameraId, physicalCameraId));
}
@Override
public void onPhysicalCameraUnavailable(String cameraId, String physicalCameraId) {
+ super.onPhysicalCameraUnavailable(cameraId, physicalCameraId);
unavailablePhysicalCamEventQueue.offer(new Pair<>(cameraId, physicalCameraId));
}
@Override
public void onCameraOpened(String cameraId, String packageId) {
+ super.onCameraOpened(cameraId, packageId);
String curPackageId = mContext.getPackageName();
assertTrue("Opening package should be " + curPackageId + ", was " + packageId,
curPackageId.equals(packageId));
@@ -704,6 +709,7 @@
@Override
public void onCameraClosed(String cameraId) {
+ super.onCameraClosed(cameraId);
onCameraClosedEventQueue.offer(cameraId);
}
diff --git a/tests/camera/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/camera/src/android/hardware/camera2/cts/ImageReaderTest.java
index 1ad21cc..07a0d89 100644
--- a/tests/camera/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -36,6 +36,7 @@
import android.hardware.camera2.cts.helpers.StaticMetadata;
import android.hardware.camera2.cts.rs.BitmapUtils;
import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
+import android.hardware.camera2.params.OutputConfiguration;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.Image;
import android.media.Image.Plane;
@@ -51,6 +52,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Set;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -433,17 +435,38 @@
for (String id : mCameraIdsUnderTest) {
try {
Log.v(TAG, "Private format and protected usage testing for camera " + id);
- if (!mAllStaticInfo.get(id).isCapabilitySupported(
+ List<String> testCameraIds = new ArrayList<>();
+
+ if (mAllStaticInfo.get(id).isCapabilitySupported(
CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA)) {
+ // Test the camera id without using physical camera
+ testCameraIds.add(null);
+ }
+
+ if (mAllStaticInfo.get(id).isLogicalMultiCamera()) {
+ Set<String> physicalIdsSet =
+ mAllStaticInfo.get(id).getCharacteristics().getPhysicalCameraIds();
+ for (String physicalId : physicalIdsSet) {
+ if (mAllStaticInfo.get(physicalId).isCapabilitySupported(
+ CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA)) {
+ testCameraIds.add(physicalId);
+ }
+ }
+ }
+
+ if (testCameraIds.isEmpty()) {
Log.i(TAG, "Camera " + id +
" does not support secure image data capability, skipping");
-
continue;
}
openDevice(id);
- bufferFormatTestByCamera(ImageFormat.PRIVATE, /*setUsageFlag*/ true,
- HardwareBuffer.USAGE_PROTECTED_CONTENT, /*repeating*/ true,
- /*checkSession*/ true, /*validateImageData*/ false);
+
+ for (String testCameraId : testCameraIds) {
+ bufferFormatTestByCamera(ImageFormat.PRIVATE, /*setUsageFlag*/ true,
+ HardwareBuffer.USAGE_PROTECTED_CONTENT, /*repeating*/ true,
+ /*checkSession*/ true, /*validateImageData*/ false,
+ testCameraId);
+ }
} finally {
closeDevice(id);
}
@@ -1057,18 +1080,31 @@
}
private void bufferFormatTestByCamera(int format, boolean setUsageFlag, long usageFlag,
+ boolean repeating, boolean checkSession, boolean validateImageData) throws Exception {
+ bufferFormatTestByCamera(format, setUsageFlag, usageFlag, repeating, checkSession,
+ validateImageData, /*physicalId*/null);
+ }
+
+ private void bufferFormatTestByCamera(int format, boolean setUsageFlag, long usageFlag,
// TODO: Consider having some sort of test configuration class passed to reduce the
// proliferation of parameters ?
- boolean repeating, boolean checkSession, boolean validateImageData)
+ boolean repeating, boolean checkSession, boolean validateImageData, String physicalId)
throws Exception {
- Size[] availableSizes = mStaticInfo.getAvailableSizesForFormatChecked(format,
+ StaticMetadata staticInfo;
+ if (physicalId == null) {
+ staticInfo = mStaticInfo;
+ } else {
+ staticInfo = mAllStaticInfo.get(physicalId);
+ }
+
+ Size[] availableSizes = staticInfo.getAvailableSizesForFormatChecked(format,
StaticMetadata.StreamDirection.Output);
boolean secureTest = setUsageFlag &&
((usageFlag & HardwareBuffer.USAGE_PROTECTED_CONTENT) != 0);
Size secureDataSize = null;
if (secureTest) {
- secureDataSize = mStaticInfo.getCharacteristics().get(
+ secureDataSize = staticInfo.getCharacteristics().get(
CameraCharacteristics.SCALER_DEFAULT_SECURE_IMAGE_SIZE);
}
@@ -1101,11 +1137,19 @@
if (checkSession) {
checkImageReaderSessionConfiguration(
- "Camera capture session validation for format: " + format + "failed");
+ "Camera capture session validation for format: " + format + "failed",
+ physicalId);
}
- // Start capture.
- CaptureRequest request = prepareCaptureRequest();
+ ArrayList<OutputConfiguration> outputConfigs = new ArrayList<>();
+ OutputConfiguration config = new OutputConfiguration(mReader.getSurface());
+ if (physicalId != null) {
+ config.setPhysicalCameraId(physicalId);
+ }
+ outputConfigs.add(config);
+ CaptureRequest request = prepareCaptureRequestForConfigs(
+ outputConfigs, CameraDevice.TEMPLATE_PREVIEW).build();
+
SimpleCaptureCallback listener = new SimpleCaptureCallback();
startCapture(request, repeating, listener, mHandler);
diff --git a/tests/camera/src/android/hardware/camera2/cts/MultiResolutionImageReaderTest.java b/tests/camera/src/android/hardware/camera2/cts/MultiResolutionImageReaderTest.java
index 5d4fe03..32c0a33 100644
--- a/tests/camera/src/android/hardware/camera2/cts/MultiResolutionImageReaderTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/MultiResolutionImageReaderTest.java
@@ -251,7 +251,7 @@
int numFrameVerified = repeating ? NUM_FRAME_VERIFIED : 1;
// Create multi-resolution ImageReader
- mMultiResolutionImageReader = MultiResolutionImageReader.newInstance(
+ mMultiResolutionImageReader = new MultiResolutionImageReader(
multiResolutionStreams, format, MAX_NUM_IMAGES);
mListener = new SimpleMultiResolutionImageReaderListener(
mMultiResolutionImageReader, MAX_NUM_IMAGES, repeating);
diff --git a/tests/camera/src/android/hardware/camera2/cts/MultiResolutionReprocessCaptureTest.java b/tests/camera/src/android/hardware/camera2/cts/MultiResolutionReprocessCaptureTest.java
index 10c1926..95d5661 100644
--- a/tests/camera/src/android/hardware/camera2/cts/MultiResolutionReprocessCaptureTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/MultiResolutionReprocessCaptureTest.java
@@ -342,7 +342,7 @@
}
// create an MultiResolutionImageReader for the regular capture
- mMultiResImageReader = MultiResolutionImageReader.newInstance(inputInfo,
+ mMultiResImageReader = new MultiResolutionImageReader(inputInfo,
inputFormat, maxImages);
mMultiResImageReaderListener = new SimpleMultiResolutionImageReaderListener(
mMultiResImageReader, 1, /*repeating*/false);
@@ -351,7 +351,7 @@
if (!mShareOneReader) {
// create an MultiResolutionImageReader for the reprocess capture
- mSecondMultiResImageReader = MultiResolutionImageReader.newInstance(
+ mSecondMultiResImageReader = new MultiResolutionImageReader(
outputInfo, outputFormat, maxImages);
mSecondMultiResImageReaderListener = new SimpleMultiResolutionImageReaderListener(
mSecondMultiResImageReader, maxImages, /*repeating*/ false);
diff --git a/tests/camera/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java b/tests/camera/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
index 0b50e95..eca4b32 100644
--- a/tests/camera/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
+++ b/tests/camera/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
@@ -429,9 +429,17 @@
}
protected void checkImageReaderSessionConfiguration(String msg) throws Exception {
- List<OutputConfiguration> outputConfigs = new ArrayList<OutputConfiguration>();
- outputConfigs.add(new OutputConfiguration(mReaderSurface));
+ checkImageReaderSessionConfiguration(msg, /*physicalCameraId*/null);
+ }
+ protected void checkImageReaderSessionConfiguration(String msg, String physicalCameraId)
+ throws Exception {
+ List<OutputConfiguration> outputConfigs = new ArrayList<OutputConfiguration>();
+ OutputConfiguration config = new OutputConfiguration(mReaderSurface);
+ if (physicalCameraId != null) {
+ config.setPhysicalCameraId(physicalCameraId);
+ }
+ outputConfigs.add(config);
checkSessionConfigurationSupported(mCamera, mHandler, outputConfigs, /*inputConfig*/ null,
SessionConfiguration.SESSION_REGULAR, /*expectedResult*/ true, msg);
}
diff --git a/tests/camera/utils/src/android/hardware/cts/helpers/CameraUtils.java b/tests/camera/utils/src/android/hardware/cts/helpers/CameraUtils.java
index 69b422b..5b4b485 100644
--- a/tests/camera/utils/src/android/hardware/cts/helpers/CameraUtils.java
+++ b/tests/camera/utils/src/android/hardware/cts/helpers/CameraUtils.java
@@ -88,6 +88,11 @@
Integer facing = ch.get(CameraCharacteristics.LENS_FACING);
switch (facing.intValue()) {
case CameraMetadata.LENS_FACING_EXTERNAL:
+ if (info.facing != Camera.CameraInfo.CAMERA_FACING_FRONT &&
+ info.facing != Camera.CameraInfo.CAMERA_FACING_BACK) {
+ return false;
+ }
+ break;
case CameraMetadata.LENS_FACING_FRONT:
if (info.facing != Camera.CameraInfo.CAMERA_FACING_FRONT) {
return false;
diff --git a/tests/devicepolicy/src/android/devicepolicy/cts/CredentialManagementAppTest.java b/tests/devicepolicy/src/android/devicepolicy/cts/CredentialManagementAppTest.java
index 1aeb91d..ff33035 100644
--- a/tests/devicepolicy/src/android/devicepolicy/cts/CredentialManagementAppTest.java
+++ b/tests/devicepolicy/src/android/devicepolicy/cts/CredentialManagementAppTest.java
@@ -167,6 +167,33 @@
@Postsubmit(reason="new")
@Test
+ public void hasKeyPair_aliasIsNotInAuthenticationPolicy_throwsException() throws Exception {
+ setCredentialManagementApp();
+
+ try {
+ assertThrows(SecurityException.class, () -> mDpm.hasKeyPair(NOT_IN_USER_POLICY_ALIAS));
+ } finally {
+ removeCredentialManagementApp();
+ }
+ }
+
+ @Postsubmit(reason="new")
+ @Test
+ public void hasKeyPair_isCredentialManagementApp_success() throws Exception {
+ setCredentialManagementApp();
+ try {
+ mDpm.installKeyPair(/* admin = */ null, PRIVATE_KEY, CERTIFICATES, ALIAS,
+ /* flags = */0);
+
+ assertThat(mDpm.hasKeyPair(ALIAS)).isTrue();
+ } finally {
+ mDpm.removeKeyPair(/* admin = */ null, ALIAS);
+ removeCredentialManagementApp();
+ }
+ }
+
+ @Postsubmit(reason="new")
+ @Test
public void removeKeyPair_isCredentialManagementApp_success() throws Exception {
setCredentialManagementApp();
try {
@@ -288,6 +315,21 @@
}
}
+ @Postsubmit(reason="new")
+ @Test
+ public void unregisterAsCredentialManagementApp_returnTrue()
+ throws Exception {
+ setCredentialManagementApp();
+
+ try {
+ assertTrue(KeyChain.removeCredentialManagementApp(CONTEXT));
+
+ assertFalse(KeyChain.isCredentialManagementApp(CONTEXT));
+ } catch (Exception e) {
+ removeCredentialManagementApp();
+ }
+ }
+
// TODO(scottjonathan): Using either code generation or reflection we could remove the need for
// these boilerplate classes
private static class KeyChainAliasCallback extends BlockingCallback<String> implements
diff --git a/tests/devicestate/AndroidTest.xml b/tests/devicestate/AndroidTest.xml
index 5933532..3b7eadd 100644
--- a/tests/devicestate/AndroidTest.xml
+++ b/tests/devicestate/AndroidTest.xml
@@ -19,7 +19,7 @@
<option name="config-descriptor:metadata" key="component" value="framework" />
- <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+ <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
diff --git a/tests/devicestate/src/android/hardware/devicestate/cts/DeviceStateManagerTests.java b/tests/devicestate/src/android/hardware/devicestate/cts/DeviceStateManagerTests.java
index 80ebecb..f67c5cd 100644
--- a/tests/devicestate/src/android/hardware/devicestate/cts/DeviceStateManagerTests.java
+++ b/tests/devicestate/src/android/hardware/devicestate/cts/DeviceStateManagerTests.java
@@ -32,14 +32,12 @@
import android.hardware.devicestate.DeviceStateRequest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.FlakyTest;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
/** CTS tests for {@link DeviceStateManager} API(s). */
-@FlakyTest(bugId = 181996170)
@RunWith(AndroidJUnit4.class)
public class DeviceStateManagerTests extends DeviceStateManagerTestBase {
/**
diff --git a/tests/framework/base/biometrics/apps/biometrics/AndroidManifest.xml b/tests/framework/base/biometrics/apps/biometrics/AndroidManifest.xml
index c721983..33ff7b5 100644
--- a/tests/framework/base/biometrics/apps/biometrics/AndroidManifest.xml
+++ b/tests/framework/base/biometrics/apps/biometrics/AndroidManifest.xml
@@ -25,6 +25,8 @@
android:exported="true"/>
<activity android:name="android.server.biometrics.Class2BiometricActivity"
android:exported="true"/>
+ <activity android:name="android.server.biometrics.Class3BiometricActivity"
+ android:exported="true"/>
</application>
</manifest>
\ No newline at end of file
diff --git a/tests/framework/base/biometrics/apps/biometrics/src/android/server/biometrics/Class3BiometricActivity.java b/tests/framework/base/biometrics/apps/biometrics/src/android/server/biometrics/Class3BiometricActivity.java
new file mode 100644
index 0000000..2aaf49c
--- /dev/null
+++ b/tests/framework/base/biometrics/apps/biometrics/src/android/server/biometrics/Class3BiometricActivity.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.server.biometrics;
+
+import android.app.Activity;
+import android.hardware.biometrics.BiometricManager;
+import android.hardware.biometrics.BiometricPrompt;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.Nullable;
+
+import java.util.concurrent.Executor;
+
+public class Class3BiometricActivity extends Activity {
+ private static final String TAG = "Class3BiometricActivity";
+
+ @Override
+ protected void onCreate(@Nullable Bundle bundle) {
+ super.onCreate(bundle);
+ final Handler handler = new Handler(Looper.getMainLooper());
+ final Executor executor = handler::post;
+ final BiometricCallbackHelper callbackHelper = new BiometricCallbackHelper(this);
+
+ final BiometricPrompt bp = new BiometricPrompt.Builder(this)
+ .setTitle("Title")
+ .setSubtitle("Subtitle")
+ .setDescription("Description")
+ .setNegativeButton("Negative Button", executor, (dialog, which) -> {
+ callbackHelper.onNegativeButtonPressed();
+ })
+ .setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_STRONG)
+ .build();
+
+ bp.authenticate(new CancellationSignal(), executor, callbackHelper);
+ }
+}
diff --git a/tests/framework/base/biometrics/src/android/server/biometrics/BiometricServiceTest.java b/tests/framework/base/biometrics/src/android/server/biometrics/BiometricServiceTest.java
index dfd68e5..8c91f3f 100644
--- a/tests/framework/base/biometrics/src/android/server/biometrics/BiometricServiceTest.java
+++ b/tests/framework/base/biometrics/src/android/server/biometrics/BiometricServiceTest.java
@@ -45,6 +45,9 @@
import android.hardware.biometrics.BiometricTestSession;
import android.hardware.biometrics.SensorProperties;
import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.Handler;
+import android.os.Looper;
import android.os.PowerManager;
import android.platform.test.annotations.Presubmit;
import android.server.wm.TestJournalProvider.TestJournal;
@@ -68,8 +71,11 @@
import org.junit.Test;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.Executor;
@Presubmit
public class BiometricServiceTest extends BiometricTestBase {
@@ -180,6 +186,20 @@
return false;
}
+ private void successfullyAuthenticate(@NonNull BiometricTestSession session, int userId)
+ throws Exception {
+ session.acceptAuthentication(userId);
+ mInstrumentation.waitForIdleSync();
+ waitForStateNotEqual(STATE_AUTH_STARTED_UI_SHOWING);
+ BiometricServiceState state = getCurrentState();
+ Log.d(TAG, "State after acceptAuthentication: " + state);
+ if (state.mState == STATE_AUTH_PENDING_CONFIRM) {
+ findAndPressButton(BUTTON_ID_CONFIRM);
+ mInstrumentation.waitForIdleSync();
+ waitForState(STATE_AUTH_IDLE);
+ }
+ }
+
private void waitForAllUnenrolled() throws Exception {
for (int i = 0; i < 20; i++) {
if (anyEnrollmentsExist()) {
@@ -192,6 +212,38 @@
fail("Some sensors still have enrollments. State: " + getCurrentState());
}
+ private void showBiometricPromptAndAuth(@NonNull BiometricTestSession session, int sensorId,
+ int userId) throws Exception {
+ final Handler handler = new Handler(Looper.getMainLooper());
+ final Executor executor = handler::post;
+ final BiometricPrompt prompt = new BiometricPrompt.Builder(mContext)
+ .setTitle("Title")
+ .setSubtitle("Subtitle")
+ .setDescription("Description")
+ .setNegativeButton("Negative Button", executor, (dialog, which) -> {
+ Log.d(TAG, "Negative button pressed");
+ })
+ .setAllowBackgroundAuthentication(true)
+ .setAllowedSensorIds(new ArrayList<>(Collections.singletonList(sensorId)))
+ .build();
+ prompt.authenticate(new CancellationSignal(), executor,
+ new BiometricPrompt.AuthenticationCallback() {
+ @Override
+ public void onAuthenticationError(int errorCode, CharSequence errString) {
+ Log.d(TAG, "onAuthenticationError: " + errorCode);
+ }
+
+ @Override
+ public void onAuthenticationSucceeded(
+ BiometricPrompt.AuthenticationResult result) {
+ Log.d(TAG, "onAuthenticationSucceeded");
+ }
+ });
+
+ waitForState(STATE_AUTH_STARTED_UI_SHOWING);
+ successfullyAuthenticate(session, userId);
+ }
+
@NonNull
private static BiometricCallbackHelper.State getCallbackState(@NonNull TestJournal journal) {
waitFor("Waiting for authentication callback",
@@ -327,7 +379,8 @@
waitForIdleService();
final BiometricServiceState state = getCurrentState();
- assertEquals(1, state.mSensorStates.sensorStates
+ assertEquals("Sensor: " + sensorId + " should have exactly one enrollment",
+ 1, state.mSensorStates.sensorStates
.get(sensorId).getUserStates().get(userId).numEnrolled);
}
@@ -372,18 +425,7 @@
assertEquals(callbackState.toString(), 0, callbackState.mErrorsReceived.size());
// Auth and check again now
- session.acceptAuthentication(userId);
- mInstrumentation.waitForIdleSync();
-
- waitForStateNotEqual(STATE_AUTH_STARTED_UI_SHOWING);
-
- state = getCurrentState();
- Log.d(TAG, "State after acceptAuthentication: " + state);
- if (state.mState == STATE_AUTH_PENDING_CONFIRM) {
- findAndPressButton(BUTTON_ID_CONFIRM);
- mInstrumentation.waitForIdleSync();
- waitForState(STATE_AUTH_IDLE);
- }
+ successfullyAuthenticate(session, userId);
mInstrumentation.waitForIdleSync();
callbackState = getCallbackState(journal);
@@ -692,6 +734,206 @@
}
}
+ @Test
+ public void testLockoutResetRequestedAfterCredentialUnlock() throws Exception {
+ // ResetLockout only really needs to be applied when enrollments exist. Furthermore, some
+ // interfaces may take this a step further and ignore resetLockout requests when no
+ // enrollments exist.
+ List<BiometricTestSession> biometricSessions = new ArrayList<>();
+ for (SensorProperties prop : mSensorProperties) {
+ BiometricTestSession session = mBiometricManager.createTestSession(prop.getSensorId());
+ enrollForSensor(session, prop.getSensorId());
+ biometricSessions.add(session);
+ }
+
+ try (CredentialSession credentialSession = new CredentialSession()) {
+ credentialSession.setCredential();
+
+ // Explicitly clear the state so we can check exact number below
+ final BiometricServiceState clearState = getCurrentStateAndClearSchedulerLog();
+ credentialSession.verifyCredential();
+
+ waitFor("Waiting for password verification and resetLockout completion", () -> {
+ try {
+ BiometricServiceState state = getCurrentState();
+ // All sensors have processed exactly one resetLockout request. Use a boolean
+ // to track this so we have better logging
+ boolean allResetOnce = true;
+ for (SensorProperties prop : mSensorProperties) {
+ final int numResetLockouts = Utils.numberOfSpecifiedOperations(state,
+ prop.getSensorId(), BiometricsProto.CM_RESET_LOCKOUT);
+ Log.d(TAG, "Sensor: " + prop.getSensorId()
+ + ", numResetLockouts: " + numResetLockouts);
+ if (numResetLockouts != 1) {
+ allResetOnce = false;
+ }
+ }
+ return allResetOnce;
+ } catch (Exception e) {
+ return false;
+ }
+ }, unused -> fail("All sensors must receive and process exactly one resetLockout"));
+ }
+
+ for (BiometricTestSession session : biometricSessions) {
+ session.close();
+ }
+ }
+
+ @Test
+ public void testLockoutResetRequestedAfterBiometricUnlock_whenStrong() throws Exception {
+ assumeTrue(mSensorProperties.size() > 1);
+
+ // ResetLockout only really needs to be applied when enrollments exist. Furthermore, some
+ // interfaces may take this a step further and ignore resetLockout requests when no
+ // enrollments exist.
+ Map<Integer, BiometricTestSession> biometricSessions = new HashMap<>();
+ for (SensorProperties prop : mSensorProperties) {
+ BiometricTestSession session = mBiometricManager.createTestSession(prop.getSensorId());
+ enrollForSensor(session, prop.getSensorId());
+ biometricSessions.put(prop.getSensorId(), session);
+ }
+
+ // When a strong biometric sensor authenticates, all other biometric sensors that:
+ // 1) Do not require HATs for resetLockout (e.g. IBiometricsFingerprint@2.1) or
+ // 2) Require HATs but do not require challenges (e.g. IFingerprint@1.0, IFace@1.0)
+ // schedule and complete a resetLockout operation.
+ //
+ // To be more explicit, sensors that require HATs AND challenges (IBiometricsFace@1.0)
+ // do not schedule resetLockout, since the interface has no way of generating multiple
+ // HATs with a single authentication (e.g. if the user requested to unlock an auth-bound
+ // key, the only HAT returned would have the keystore operationId within).
+ for (SensorProperties prop : mSensorProperties) {
+ if (prop.getSensorStrength() != SensorProperties.STRENGTH_STRONG) {
+ Log.d(TAG, "Skipping sensor: " + prop.getSensorId()
+ + ", strength: " + prop.getSensorStrength());
+ continue;
+ }
+ testLockoutResetRequestedAfterBiometricUnlock_whenStrong_forSensor(
+ prop.getSensorId(), biometricSessions.get(prop.getSensorId()));
+ }
+
+ for (BiometricTestSession session : biometricSessions.values()) {
+ session.close();
+ }
+ }
+
+ private void testLockoutResetRequestedAfterBiometricUnlock_whenStrong_forSensor(int sensorId,
+ @NonNull BiometricTestSession session)
+ throws Exception {
+ Log.d(TAG, "testLockoutResetRequestedAfterBiometricUnlock_whenStrong_forSensor: "
+ + sensorId);
+ final int userId = 0;
+
+ BiometricServiceState state = getCurrentState();
+ final List<Integer> eligibleSensorsToReset = new ArrayList<>();
+ final List<Integer> ineligibleSensorsToReset = new ArrayList<>();
+ for (SensorProperties prop : mSensorProperties) {
+ if (prop.getSensorId() == sensorId) {
+ // Do not need to resetLockout for self
+ continue;
+ }
+
+ SensorState sensorState = state.mSensorStates.sensorStates.get(prop.getSensorId());
+ final boolean supportsChallengelessHat =
+ sensorState.isResetLockoutRequiresHardwareAuthToken()
+ && !sensorState.isResetLockoutRequiresChallenge();
+ final boolean doesNotRequireHat =
+ !sensorState.isResetLockoutRequiresHardwareAuthToken();
+ Log.d(TAG, "SensorId: " + prop.getSensorId()
+ + ", supportsChallengelessHat: " + supportsChallengelessHat
+ + ", doesNotRequireHat: " + doesNotRequireHat);
+ if (supportsChallengelessHat || doesNotRequireHat) {
+ Log.d(TAG, "Adding eligible sensor: " + prop.getSensorId());
+ eligibleSensorsToReset.add(prop.getSensorId());
+ } else {
+ Log.d(TAG, "Adding ineligible sensor: " + prop.getSensorId());
+ ineligibleSensorsToReset.add(prop.getSensorId());
+ }
+ }
+
+ // Explicitly clear the log so that we can check the exact number of resetLockout operations
+ // below.
+ state = getCurrentStateAndClearSchedulerLog();
+
+ // Request authentication with the specified sensorId that was passed in
+ showBiometricPromptAndAuth(session, sensorId, userId);
+
+ // Check that all eligible sensors have resetLockout in their scheduler history
+ state = getCurrentState();
+ for (Integer id : eligibleSensorsToReset) {
+ assertEquals("Sensor: " + id + " should have exactly one resetLockout", 1,
+ Utils.numberOfSpecifiedOperations(state, id, BiometricsProto.CM_RESET_LOCKOUT));
+ }
+
+ // Check that all ineligible sensors do not have resetLockout in their scheduler history
+ for (Integer id : ineligibleSensorsToReset) {
+ assertEquals("Sensor: " + id + " should have no resetLockout", 0,
+ Utils.numberOfSpecifiedOperations(state, id, BiometricsProto.CM_RESET_LOCKOUT));
+ }
+ }
+
+ @Test
+ public void testLockoutResetNotRequestedAfterBiometricUnlock_whenNotStrong() throws Exception {
+ assumeTrue(mSensorProperties.size() > 1);
+
+ // ResetLockout only really needs to be applied when enrollments exist. Furthermore, some
+ // interfaces may take this a step further and ignore resetLockout requests when no
+ // enrollments exist.
+ Map<Integer, BiometricTestSession> biometricSessions = new HashMap<>();
+ for (SensorProperties prop : mSensorProperties) {
+ BiometricTestSession session = mBiometricManager.createTestSession(prop.getSensorId());
+ enrollForSensor(session, prop.getSensorId());
+ biometricSessions.put(prop.getSensorId(), session);
+ }
+
+ // Sensors that do not meet BIOMETRIC_STRONG are not allowed to resetLockout for other
+ // sensors.
+ // TODO: Note that we are only testing STRENGTH_WEAK for now, since STRENGTH_CONVENIENCE is
+ // not exposed to BiometricPrompt. In other words, we currently do not have a way to
+ // request and finish authentication for STRENGTH_CONVENIENCE sensors.
+ for (SensorProperties prop : mSensorProperties) {
+ if (prop.getSensorStrength() != SensorProperties.STRENGTH_WEAK) {
+ Log.d(TAG, "Skipping sensor: " + prop.getSensorId()
+ + ", strength: " + prop.getSensorStrength());
+ continue;
+ }
+
+ testLockoutResetNotRequestedAfterBiometricUnlock_whenNotStrong_forSensor(
+ prop.getSensorId(), biometricSessions.get(prop.getSensorId()));
+ }
+
+ // Cleanup
+ for (BiometricTestSession s : biometricSessions.values()) {
+ s.close();
+ }
+ }
+
+ private void testLockoutResetNotRequestedAfterBiometricUnlock_whenNotStrong_forSensor(
+ int sensorId, @NonNull BiometricTestSession session) throws Exception {
+ Log.d(TAG, "testLockoutResetNotRequestedAfterBiometricUnlock_whenNotStrong_forSensor: "
+ + sensorId);
+ final int userId = 0;
+
+ // Explicitly clear the log so that we can check the exact number of resetLockout operations
+ // below.
+ BiometricServiceState state = getCurrentStateAndClearSchedulerLog();
+
+ // Request authentication with the specified sensorId that was passed in
+ showBiometricPromptAndAuth(session, sensorId, userId);
+
+ // Check that no other sensors have resetLockout in their queue
+ for (SensorProperties prop : mSensorProperties) {
+ if (prop.getSensorId() == sensorId) {
+ continue;
+ }
+ state = getCurrentState();
+ assertEquals("Sensor: " + prop.getSensorId() + " should have no resetLockout", 0,
+ Utils.numberOfSpecifiedOperations(state, prop.getSensorId(),
+ BiometricsProto.CM_RESET_LOCKOUT));
+ }
+ }
+
@Override
protected SensorStates getSensorStates() throws Exception {
return getCurrentState().mSensorStates;
diff --git a/tests/framework/base/biometrics/src/android/server/biometrics/BiometricTestBase.java b/tests/framework/base/biometrics/src/android/server/biometrics/BiometricTestBase.java
index f641de5..2532d2e 100644
--- a/tests/framework/base/biometrics/src/android/server/biometrics/BiometricTestBase.java
+++ b/tests/framework/base/biometrics/src/android/server/biometrics/BiometricTestBase.java
@@ -21,8 +21,10 @@
import android.util.Log;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
/**
* Base class for biometric tests, containing common useful logic.
@@ -62,8 +64,14 @@
}
protected static void waitFor(@NonNull String message, @NonNull BooleanSupplier condition) {
+ waitFor(message, condition, null /* onFailure */);
+ }
+
+ protected static void waitFor(@NonNull String message, @NonNull BooleanSupplier condition,
+ @Nullable Consumer<Object> onFailure) {
Condition.waitFor(new Condition<>(message, condition)
.setRetryIntervalMs(500)
- .setRetryLimit(20));
+ .setRetryLimit(20)
+ .setOnFailure(onFailure));
}
}
diff --git a/tests/framework/base/biometrics/src/android/server/biometrics/Components.java b/tests/framework/base/biometrics/src/android/server/biometrics/Components.java
index 970e11a..8734436 100644
--- a/tests/framework/base/biometrics/src/android/server/biometrics/Components.java
+++ b/tests/framework/base/biometrics/src/android/server/biometrics/Components.java
@@ -24,6 +24,8 @@
component("Class2BiometricOrCredentialActivity");
public static final ComponentName CLASS_2_BIOMETRIC_ACTIVITY =
component("Class2BiometricActivity");
+ public static final ComponentName CLASS_3_BIOMETRIC_ACTIVITY =
+ component("Class3BiometricActivity");
private static ComponentName component(String className) {
return component(Components.class, className);
diff --git a/tests/framework/base/biometrics/src/android/server/biometrics/CredentialSession.java b/tests/framework/base/biometrics/src/android/server/biometrics/CredentialSession.java
index b60a661..c8e4871 100644
--- a/tests/framework/base/biometrics/src/android/server/biometrics/CredentialSession.java
+++ b/tests/framework/base/biometrics/src/android/server/biometrics/CredentialSession.java
@@ -20,11 +20,16 @@
private static final String SET_PASSWORD = "locksettings set-pin 1234";
private static final String CLEAR_PASSWORD = "locksettings clear --old 1234";
+ private static final String VERIFY_CREDENTIAL = "locksettings verify --old 1234";
public void setCredential() {
Utils.executeShellCommand(SET_PASSWORD);
}
+ public void verifyCredential() {
+ Utils.executeShellCommand(VERIFY_CREDENTIAL);
+ }
+
@Override
public void close() throws Exception {
Utils.executeShellCommand(CLEAR_PASSWORD);
diff --git a/tests/framework/base/biometrics/src/android/server/biometrics/SensorStates.java b/tests/framework/base/biometrics/src/android/server/biometrics/SensorStates.java
index 0e86403..f0b5cf2 100644
--- a/tests/framework/base/biometrics/src/android/server/biometrics/SensorStates.java
+++ b/tests/framework/base/biometrics/src/android/server/biometrics/SensorStates.java
@@ -72,12 +72,18 @@
private final SchedulerState mSchedulerState;
private final int mModality;
@NonNull private final Map<Integer, UserState> mUserStates;
+ private final boolean mResetLockoutRequiresHardwareAuthToken;
+ private final boolean mResetLockoutRequiresChallenge;
public SensorState(@NonNull SchedulerState schedulerState, int modality,
- @NonNull Map<Integer, UserState> userStates) {
+ @NonNull Map<Integer, UserState> userStates,
+ boolean resetLockoutRequiresHardwareAuthToken,
+ boolean resetLockoutRequiresChallenge) {
this.mSchedulerState = schedulerState;
this.mModality = modality;
this.mUserStates = userStates;
+ this.mResetLockoutRequiresHardwareAuthToken = resetLockoutRequiresHardwareAuthToken;
+ this.mResetLockoutRequiresChallenge = resetLockoutRequiresChallenge;
}
public SchedulerState getSchedulerState() {
@@ -95,6 +101,14 @@
@NonNull public Map<Integer, UserState> getUserStates() {
return mUserStates;
}
+
+ public boolean isResetLockoutRequiresHardwareAuthToken() {
+ return mResetLockoutRequiresHardwareAuthToken;
+ }
+
+ public boolean isResetLockoutRequiresChallenge() {
+ return mResetLockoutRequiresChallenge;
+ }
}
public static class UserState {
@@ -118,7 +132,9 @@
final SchedulerState schedulerState =
SchedulerState.parseFrom(sensorStateProto.scheduler);
final SensorState sensorState = new SensorState(schedulerState,
- sensorStateProto.modality, userStates);
+ sensorStateProto.modality, userStates,
+ sensorStateProto.resetLockoutRequiresHardwareAuthToken,
+ sensorStateProto.resetLockoutRequiresChallenge);
sensorStates.put(sensorStateProto.sensorId, sensorState);
}
diff --git a/tests/framework/base/windowmanager/Android.bp b/tests/framework/base/windowmanager/Android.bp
index 7e254e3..820168c 100644
--- a/tests/framework/base/windowmanager/Android.bp
+++ b/tests/framework/base/windowmanager/Android.bp
@@ -66,6 +66,7 @@
"truth-prebuilt",
"cts-wm-overlayapp-base",
"cts-wm-shared",
+ "platform-compat-test-rules",
],
test_suites: [
diff --git a/tests/framework/base/windowmanager/AndroidManifest.xml b/tests/framework/base/windowmanager/AndroidManifest.xml
index 8809f30..1867d75 100644
--- a/tests/framework/base/windowmanager/AndroidManifest.xml
+++ b/tests/framework/base/windowmanager/AndroidManifest.xml
@@ -167,6 +167,7 @@
<activity android:name="android.server.wm.MultiDisplaySystemDecorationTests$ImeTestActivity"
android:resizeableActivity="true"
+ android:theme="@style/no_starting_window"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"/>
<activity android:name="android.server.wm.MultiDisplaySystemDecorationTests$ImeTestActivity2"/>
<activity android:name="android.server.wm.MultiDisplaySystemDecorationTests$ImeTestActivityWithBrokenContextWrapper"/>
@@ -257,6 +258,8 @@
<activity android:name="android.server.wm.intent.Activities$SingleTaskActivity2"
android:launchMode="singleTask"
android:taskAffinity=".t1"/>
+ <activity android:name="android.server.wm.intent.Activities$SingleInstancePerTaskActivity"
+ android:launchMode="singleInstancePerTask"/>
<activity android:name="android.server.wm.intent.Activities$TaskAffinity1Activity"
android:allowTaskReparenting="true"
android:launchMode="standard"
@@ -301,7 +304,8 @@
</service>
<activity android:name="android.server.wm.AlertWindowsAppOpsTestsActivity"/>
- <activity android:name="android.server.wm.CloseOnOutsideTestActivity" />
+ <activity android:name="android.server.wm.CloseOnOutsideTestActivity"
+ android:theme="@style/no_starting_window"/>
<activity android:name="android.server.wm.DialogFrameTestActivity" />
<activity android:name="android.server.wm.DisplayCutoutTests$TestActivity"
android:configChanges="orientation|screenSize"
@@ -354,7 +358,8 @@
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"/>
<activity android:name="android.app.Activity"/>
<activity android:name="android.server.wm.WindowInsetsLayoutTests$TestActivity"/>
- <activity android:name="android.server.wm.WindowInsetsControllerTests$TestActivity"/>
+ <activity android:name="android.server.wm.WindowInsetsControllerTests$TestActivity"
+ android:theme="@style/no_starting_window"/>
<activity android:name="android.server.wm.WindowInsetsControllerTests$TestHideOnCreateActivity"/>
<activity android:name="android.server.wm.WindowInsetsControllerTests$TestShowOnCreateActivity"/>
@@ -447,6 +452,24 @@
<activity android:name="android.server.wm.DisplayHashManagerTest$TestActivity"
android:exported="true"/>
+
+ <activity android:name="android.server.wm.CompatChangeTests$ResizeablePortraitActivity"
+ android:resizeableActivity="true"
+ android:screenOrientation="portrait"
+ android:exported="true"/>
+
+ <activity android:name="android.server.wm.CompatChangeTests$NonResizeablePortraitActivity"
+ android:resizeableActivity="false"
+ android:screenOrientation="portrait"
+ android:exported="true"/>
+
+ <activity android:name="android.server.wm.CompatChangeTests$SupportsSizeChangesPortraitActivity"
+ android:resizeableActivity="false"
+ android:screenOrientation="portrait"
+ android:exported="true">
+ <meta-data android:name="android.supports_size_changes"
+ android:value="true"/>
+ </activity>
</application>
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
diff --git a/tests/framework/base/windowmanager/app/AndroidManifest.xml b/tests/framework/base/windowmanager/app/AndroidManifest.xml
index 3709eb0..942644d 100755
--- a/tests/framework/base/windowmanager/app/AndroidManifest.xml
+++ b/tests/framework/base/windowmanager/app/AndroidManifest.xml
@@ -360,6 +360,24 @@
android:theme="@style/SplashscreenTheme"
android:exported="true"/>
+ <activity android:name=".DisablePreviewActivity"
+ android:theme="@style/NoPreview"
+ android:exported="true"/>
+ <activity android:name=".ShowWhenLockedNoPreviewActivity"
+ android:theme="@style/NoPreview"
+ android:exported="true"/>
+ <activity android:name=".ShowWhenLockedAttrNoPreviewActivity"
+ android:showWhenLocked="true"
+ android:theme="@style/NoPreview"
+ android:exported="true"/>
+ <activity android:name=".ShowWhenLockedAttrRemoveAttrNoPreviewActivity"
+ android:showWhenLocked="true"
+ android:theme="@style/NoPreview"
+ android:exported="true"/>
+ <activity android:name=".ShowWhenLockedWithDialogNoPreviewActivity"
+ android:theme="@style/NoPreview"
+ android:exported="true"/>
+
<activity android:name=".NoHistoryActivity"
android:noHistory="true"
android:exported="true"/>
@@ -565,11 +583,18 @@
android:launchMode="singleTop"
android:exported="true"/>
<activity android:name=".HideOverlayWindowsActivity" android:exported="true"/>
+ <activity android:name=".BackgroundImageActivity"
+ android:theme="@style/BackgroundImage"
+ android:exported="true"/>
<activity android:name=".BlurActivity"
android:exported="true"
- android:theme="@style/Theme.Tinted.Translucent.Dialog"/>
- <activity android:name=".BackgroundImageActivity"
- android:exported="true"/>
+ android:theme="@style/TranslucentDialog"/>
+ <activity android:name=".BlurAttributesActivity"
+ android:exported="true"
+ android:theme="@style/BlurryDialog"/>
+ <activity android:name=".BadBlurActivity"
+ android:exported="true"
+ android:theme="@style/BadBlurryDialog"/>
<activity android:name=".HandleSplashScreenExitActivity"
android:theme="@style/ShowBrandingTheme"
diff --git a/tests/framework/base/windowmanager/app/res/drawable/image.jpg b/tests/framework/base/windowmanager/app/res/drawable/image.jpg
deleted file mode 100644
index b46587b..0000000
--- a/tests/framework/base/windowmanager/app/res/drawable/image.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/framework/base/windowmanager/app/res/layout/background_image.xml b/tests/framework/base/windowmanager/app/res/layout/background_image.xml
new file mode 100644
index 0000000..ffab16b
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/res/layout/background_image.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+
+ <View
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#0000FF" />
+
+ <View
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#FF0000" />
+</LinearLayout>
diff --git a/tests/framework/base/windowmanager/app/res/layout/blur_activity.xml b/tests/framework/base/windowmanager/app/res/layout/blur_activity.xml
index db6594d..b8926e5 100644
--- a/tests/framework/base/windowmanager/app/res/layout/blur_activity.xml
+++ b/tests/framework/base/windowmanager/app/res/layout/blur_activity.xml
@@ -16,6 +16,6 @@
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="200dp"
- android:layout_height="100dp">
+ android:layout_width="50dp"
+ android:layout_height="50dp">
</FrameLayout>
diff --git a/tests/framework/base/windowmanager/app/res/values/dimens.xml b/tests/framework/base/windowmanager/app/res/values/dimens.xml
new file mode 100644
index 0000000..1ab7c3b
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/res/values/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources>
+ <dimen name="test_background_blur_radius">50dp</dimen>
+ <dimen name="test_blur_behind_radius">25dp</dimen>
+</resources>
diff --git a/tests/framework/base/windowmanager/app/res/values/styles.xml b/tests/framework/base/windowmanager/app/res/values/styles.xml
index 8f15cf4..5c8e4f8 100644
--- a/tests/framework/base/windowmanager/app/res/values/styles.xml
+++ b/tests/framework/base/windowmanager/app/res/values/styles.xml
@@ -48,10 +48,31 @@
<item name="android:windowSplashscreenContent">@drawable/red</item>
</style>
- <style name="Theme.Tinted.Translucent.Dialog" parent="@android:style/Theme.Material.Dialog">
- <item name="android:windowIsTranslucent">true</item>
- <item name="android:windowBackground">#20FFFFFF</item>
+ <style name="BackgroundImage" parent="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
<item name="android:windowNoTitle">true</item>
+ <item name="android:windowLayoutInDisplayCutoutMode">always</item>
+ </style>
+
+ <style name="TranslucentDialog" parent="@android:style/Theme.Material.Dialog">
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:backgroundDimEnabled">false</item>
+ <item name="android:windowBlurBehindEnabled">true</item>
+ <item name="android:windowDisablePreview">true</item>
+ <item name="android:windowElevation">0dp</item>
+ <item name="android:windowLayoutInDisplayCutoutMode">always</item>
+ </style>
+
+ <style name="BlurryDialog" parent="TranslucentDialog">
+ <item name="android:windowBackgroundBlurRadius">@dimen/test_background_blur_radius</item>
+ <item name="android:windowBlurBehindRadius">@dimen/test_blur_behind_radius</item>
+ <item name="android:windowBlurBehindEnabled">true</item>
+ </style>
+
+ <style name="BadBlurryDialog" parent="TranslucentDialog">
+ <item name="android:windowIsTranslucent">false</item>
+ <item name="android:windowBlurBehindEnabled">false</item>
</style>
<style name="ReplaceIconTheme" parent="@android:style/Theme.Material.NoActionBar">
@@ -61,5 +82,6 @@
</style>
<style name="ShowBrandingTheme" parent="@android:style/Theme.Material.NoActionBar">
<item name="android:windowSplashScreenBrandingImage">@drawable/branding</item>
+ <item name="android:windowSplashScreenIconBackgroundColor">@drawable/blue</item>
</style>
</resources>
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/BackgroundImageActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BackgroundImageActivity.java
index 9e67138..c101557 100644
--- a/tests/framework/base/windowmanager/app/src/android/server/wm/app/BackgroundImageActivity.java
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BackgroundImageActivity.java
@@ -16,15 +16,18 @@
package android.server.wm.app;
+import static android.view.WindowInsets.Type.systemBars;
+
import android.app.Activity;
import android.os.Bundle;
-
public class BackgroundImageActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.image));
+ setContentView(R.layout.background_image);
+ getWindow().setDecorFitsSystemWindows(false);
+ getWindow().getInsetsController().hide(systemBars());
}
}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/BadBlurActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BadBlurActivity.java
new file mode 100644
index 0000000..e885fec
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BadBlurActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.server.wm.app;
+
+/**
+ * This activity is used to test 2 things:
+ * 1. Blur behind does not work if WindowManager.LayoutParams.FLAG_BLUR_BEHIND is not set,
+ * respectively if windowBlurBehindEnabled is not set.
+ * 2. Background blur does not work for opaque activities (where windowIsTranslucent is false)
+ *
+ * In the style of this activity windowBlurBehindEnabled is false and windowIsTranslucent is false.
+ * As a result, we expect that neither blur behind, nor background blur is rendered, even though
+ * they are requested with setBlurBehindRadius and setBackgroundBlurRadius.
+ */
+public class BadBlurActivity extends BlurActivity {
+}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/BlurActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BlurActivity.java
index 52ffd51..5da590b 100644
--- a/tests/framework/base/windowmanager/app/src/android/server/wm/app/BlurActivity.java
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BlurActivity.java
@@ -16,25 +16,67 @@
package android.server.wm.app;
-import static android.server.wm.app.Components.BlurActivity.ACTION_FINISH;
+import static android.server.wm.app.Components.BlurActivity.EXTRA_NO_BLUR_BACKGROUND_COLOR;
import static android.server.wm.app.Components.BlurActivity.EXTRA_BACKGROUND_BLUR_RADIUS_PX;
+import static android.server.wm.app.Components.BlurActivity.EXTRA_BLUR_BEHIND_RADIUS_PX;
+import static android.view.WindowInsets.Type.systemBars;
import android.app.Activity;
import android.os.Bundle;
-import android.content.BroadcastReceiver;
-import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
import android.server.wm.app.BroadcastReceiverActivity;
+import android.view.WindowManager;
+import android.view.Window;
+import java.util.function.Consumer;
public class BlurActivity extends BroadcastReceiverActivity {
+ private int mNoBlurBackgroundColor;
+ private int mBackgroundBlurRadius;
+ private int mBlurBehindRadius;
+
+ private Consumer<Boolean> mCrossWindowBlurEnabledListener = enabled -> {
+ final Window window = getWindow();
+ if (enabled) {
+ if (mBackgroundBlurRadius > 0) {
+ window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+ window.setBackgroundBlurRadius(mBackgroundBlurRadius);
+ } else {
+ window.setBackgroundDrawable(new ColorDrawable(mNoBlurBackgroundColor));
+ }
+ window.getAttributes().setBlurBehindRadius(mBlurBehindRadius);
+ } else {
+ window.setBackgroundDrawable(new ColorDrawable(mNoBlurBackgroundColor));
+ window.getAttributes().setBlurBehindRadius(0);
+ }
+ getWindowManager().updateViewLayout(window.getDecorView(), window.getAttributes());
+
+ };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.blur_activity);
- getWindow().setBackgroundBlurRadius(
- getIntent().getIntExtra(EXTRA_BACKGROUND_BLUR_RADIUS_PX, 0));
+ getWindow().setDecorFitsSystemWindows(false);
+ getWindow().getInsetsController().hide(systemBars());
+
+ mBlurBehindRadius = getIntent().getIntExtra(EXTRA_BLUR_BEHIND_RADIUS_PX, 0);
+ mBackgroundBlurRadius = getIntent().getIntExtra(EXTRA_BACKGROUND_BLUR_RADIUS_PX, 0);
+ mNoBlurBackgroundColor =
+ getIntent().getIntExtra(EXTRA_NO_BLUR_BACKGROUND_COLOR, Color.GREEN);
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ getWindowManager().addCrossWindowBlurEnabledListener(mCrossWindowBlurEnabledListener);
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ getWindowManager().removeCrossWindowBlurEnabledListener(mCrossWindowBlurEnabledListener);
}
}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/BlurAttributesActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BlurAttributesActivity.java
new file mode 100644
index 0000000..79712e0
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BlurAttributesActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.server.wm.app;
+
+import static android.view.WindowInsets.Type.systemBars;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+
+public class BlurAttributesActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.blur_activity);
+ getWindow().setDecorFitsSystemWindows(false);
+ getWindow().getInsetsController().hide(systemBars());
+ getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+ }
+
+}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/Components.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/Components.java
index b35468b..09bb346 100644
--- a/tests/framework/base/windowmanager/app/src/android/server/wm/app/Components.java
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/Components.java
@@ -132,6 +132,17 @@
public static final ComponentName SINGLE_TOP_ACTIVITY = component("SingleTopActivity");
public static final ComponentName SLOW_CREATE_ACTIVITY = component("SlowCreateActivity");
public static final ComponentName SPLASHSCREEN_ACTIVITY = component("SplashscreenActivity");
+ public static final ComponentName DISABLE_PREVIEW_ACTIVITY =
+ component("DisablePreviewActivity");
+ public static final ComponentName SHOW_WHEN_LOCKED_NO_PREVIEW_ACTIVITY =
+ component("ShowWhenLockedNoPreviewActivity");
+ public static final ComponentName SHOW_WHEN_LOCKED_ATTR_NO_PREVIEW_ACTIVITY =
+ component("ShowWhenLockedAttrNoPreviewActivity");
+ public static final ComponentName SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY =
+ component("ShowWhenLockedAttrRemoveAttrNoPreviewActivity");
+ public static final ComponentName SHOW_WHEN_LOCKED_WITH_DIALOG_NO_PREVIEW_ACTIVITY =
+ component("ShowWhenLockedWithDialogNoPreviewActivity");
+
public static final ComponentName TEST_ACTIVITY = component("TestActivity");
public static final ComponentName TOAST_ACTIVITY = component("ToastActivity");
public static final ComponentName TOP_ACTIVITY = component("TopActivity");
@@ -235,11 +246,17 @@
public static final ComponentName OVERLAY_TEST_SERVICE =
component("OverlayTestService");
+ public static final ComponentName BACKGROUND_IMAGE_ACTIVITY =
+ component("BackgroundImageActivity");
+
public static final ComponentName BLUR_ACTIVITY =
component("BlurActivity");
- public static final ComponentName BACKGROUND_IMAGE_ACTIVITY =
- component("BackgroundImageActivity");
+ public static final ComponentName BLUR_ATTRIBUTES_ACTIVITY =
+ component("BlurAttributesActivity");
+
+ public static final ComponentName BAD_BLUR_ACTIVITY =
+ component("BadBlurActivity");
/**
* Action and extra key constants for {@link #INPUT_METHOD_TEST_ACTIVITY}.
@@ -258,6 +275,7 @@
public static final String RECEIVE_SPLASH_SCREEN_EXIT = "receive_splash_screen_exit";
public static final String CONTAINS_CENTER_VIEW = "contains_center_view";
public static final String CONTAINS_BRANDING_VIEW = "contains_branding_view";
+ public static final String ICON_BACKGROUND_COLOR = "icon_background_color";
public static final String ICON_ANIMATION_DURATION = "icon_animation_duration";
public static final String ICON_ANIMATION_START = "icon_animation_start";
@@ -420,8 +438,9 @@
* Extra constants for {@link android.server.wm.app.BlurActivity}.
*/
public static class BlurActivity {
+ public static final String EXTRA_NO_BLUR_BACKGROUND_COLOR = "no_blur_background_color";
public static final String EXTRA_BACKGROUND_BLUR_RADIUS_PX = "background_blur_radius";
- public static final String ACTION_FINISH = "android.server.wm.app.BlurActivity.finish";
+ public static final String EXTRA_BLUR_BEHIND_RADIUS_PX = "blur_behind_radius";
}
/**
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/DisablePreviewActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/DisablePreviewActivity.java
new file mode 100644
index 0000000..f3c6de3
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/DisablePreviewActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.server.wm.app;
+
+import android.app.Activity;
+
+public class DisablePreviewActivity extends Activity {
+
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/HandleSplashScreenExitActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/HandleSplashScreenExitActivity.java
index bf82ea2..ad0e5ae 100644
--- a/tests/framework/base/windowmanager/app/src/android/server/wm/app/HandleSplashScreenExitActivity.java
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/HandleSplashScreenExitActivity.java
@@ -22,6 +22,7 @@
import static android.server.wm.app.Components.TestStartingWindowKeys.CONTAINS_CENTER_VIEW;
import static android.server.wm.app.Components.TestStartingWindowKeys.GET_NIGHT_MODE_ACTIVITY_CHANGED;
import static android.server.wm.app.Components.TestStartingWindowKeys.HANDLE_SPLASH_SCREEN_EXIT;
+import static android.server.wm.app.Components.TestStartingWindowKeys.ICON_BACKGROUND_COLOR;
import static android.server.wm.app.Components.TestStartingWindowKeys.RECEIVE_SPLASH_SCREEN_EXIT;
import static android.server.wm.app.Components.TestStartingWindowKeys.REQUEST_HANDLE_EXIT_ON_CREATE;
import static android.server.wm.app.Components.TestStartingWindowKeys.REQUEST_HANDLE_EXIT_ON_RESUME;
@@ -61,10 +62,12 @@
final boolean containsCenter = view.getIconView() != null;
final boolean containsBranding = view.getBrandingView() != null
&& view.getBrandingView().getBackground() != null;
+ final int iconBackground = view.getIconBackgroundColor();
TestJournalProvider.putExtras(baseContext, HANDLE_SPLASH_SCREEN_EXIT, bundle -> {
bundle.putBoolean(RECEIVE_SPLASH_SCREEN_EXIT, true);
bundle.putBoolean(CONTAINS_CENTER_VIEW, containsCenter);
bundle.putBoolean(CONTAINS_BRANDING_VIEW, containsBranding);
+ bundle.putInt(ICON_BACKGROUND_COLOR, iconBackground);
});
view.postDelayed(view::remove, 500);
};
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedAttrNoPreviewActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedAttrNoPreviewActivity.java
new file mode 100644
index 0000000..6db6a81
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedAttrNoPreviewActivity.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.server.wm.app;
+
+public class ShowWhenLockedAttrNoPreviewActivity extends AbstractLifecycleLogActivity {
+}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedAttrRemoveAttrNoPreviewActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedAttrRemoveAttrNoPreviewActivity.java
new file mode 100644
index 0000000..16589cf
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedAttrRemoveAttrNoPreviewActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.server.wm.app;
+
+public class ShowWhenLockedAttrRemoveAttrNoPreviewActivity extends AbstractLifecycleLogActivity {
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ setShowWhenLocked(false);
+ }
+}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedNoPreviewActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedNoPreviewActivity.java
new file mode 100644
index 0000000..68c7b80
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedNoPreviewActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.server.wm.app;
+
+import android.os.Bundle;
+import android.view.WindowManager;
+
+public class ShowWhenLockedNoPreviewActivity extends BroadcastReceiverActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+ }
+}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedWithDialogNoPreviewActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedWithDialogNoPreviewActivity.java
new file mode 100644
index 0000000..443aca6
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/ShowWhenLockedWithDialogNoPreviewActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.server.wm.app;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+public class ShowWhenLockedWithDialogNoPreviewActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+ new AlertDialog.Builder(this)
+ .setTitle("Dialog")
+ .show();
+ }
+}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/SplashScreenReplaceIconActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/SplashScreenReplaceIconActivity.java
index 8db71ef..15c31d8 100644
--- a/tests/framework/base/windowmanager/app/src/android/server/wm/app/SplashScreenReplaceIconActivity.java
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/SplashScreenReplaceIconActivity.java
@@ -45,6 +45,7 @@
mSSM = getSplashScreen();
if (getIntent().getBooleanExtra(REQUEST_HANDLE_EXIT_ON_CREATE, false)) {
mSSM.setOnExitAnimationListener(mSplashScreenExitHandler);
+ SystemClock.sleep(500);
}
if (getIntent().getBooleanExtra(DELAY_RESUME, false)) {
SystemClock.sleep(5000);
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 0b91a9f..f67be77 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
@@ -290,6 +290,35 @@
}
@Test
+ public void testActivityNotBlockedFromBgActivityInFgTask() {
+ // Launch Activity A, B in the same task with different processes.
+ final Intent intent = new Intent()
+ .setComponent(APP_A_FOREGROUND_ACTIVITY)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ mWmState.waitForValidState(APP_A_FOREGROUND_ACTIVITY);
+ mContext.sendBroadcast(getLaunchActivitiesBroadcast(APP_B_FOREGROUND_ACTIVITY));
+ mWmState.waitForValidState(APP_B_FOREGROUND_ACTIVITY);
+ assertTaskStack(new ComponentName[]{APP_B_FOREGROUND_ACTIVITY, APP_A_FOREGROUND_ACTIVITY},
+ APP_A_FOREGROUND_ACTIVITY);
+
+ // Refresh last-stop-app-switch-time by returning to home and then make the task foreground.
+ pressHomeAndResumeAppSwitch();
+ mContext.startActivity(intent);
+ mWmState.waitForValidState(APP_B_FOREGROUND_ACTIVITY);
+ // Though process A is in background, it is in a visible Task (top is B) so it should be
+ // able to start activity successfully.
+ mContext.sendBroadcast(new Intent(ACTION_LAUNCH_BACKGROUND_ACTIVITIES)
+ .putExtra(LAUNCH_INTENTS_EXTRA, new Intent[]{ new Intent()
+ .setComponent(APP_A_BACKGROUND_ACTIVITY)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) }));
+ mWmState.waitForValidState(APP_A_BACKGROUND_ACTIVITY);
+ mWmState.assertFocusedActivity(
+ "The background activity must be able to launch from a visible task",
+ APP_A_BACKGROUND_ACTIVITY);
+ }
+
+ @Test
@FlakyTest(bugId = 130800326)
@Ignore // TODO(b/145981637): Make this test work
public void testActivityBlockedWhenForegroundActivityRestartsItself() throws Exception {
diff --git a/tests/framework/base/windowmanager/dndtargetapp/res/layout/target_activity.xml b/tests/framework/base/windowmanager/dndtargetapp/res/layout/target_activity.xml
index ddcdf33..66a8154 100644
--- a/tests/framework/base/windowmanager/dndtargetapp/res/layout/target_activity.xml
+++ b/tests/framework/base/windowmanager/dndtargetapp/res/layout/target_activity.xml
@@ -25,4 +25,11 @@
android:layout_height="match_parent"
android:gravity="center">
</TextView>
+ <EditText
+ android:id="@+id/editable_drag_target"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:visibility="gone">
+ </EditText>
</LinearLayout>
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/dndtargetapp/src/android/server/wm/dndtargetapp/DropTarget.java b/tests/framework/base/windowmanager/dndtargetapp/src/android/server/wm/dndtargetapp/DropTarget.java
index 0500ef4..ceb8816 100644
--- a/tests/framework/base/windowmanager/dndtargetapp/src/android/server/wm/dndtargetapp/DropTarget.java
+++ b/tests/framework/base/windowmanager/dndtargetapp/src/android/server/wm/dndtargetapp/DropTarget.java
@@ -25,8 +25,10 @@
import android.os.Bundle;
import android.os.PersistableBundle;
import android.server.wm.TestLogClient;
+import android.view.ContentInfo;
import android.view.DragAndDropPermissions;
import android.view.DragEvent;
+import android.view.OnReceiveContentListener;
import android.view.View;
import android.widget.TextView;
@@ -66,6 +68,7 @@
setUpDropTarget("request_write", new OnDragUriWriteListener());
setUpDropTarget("request_read_nested", new OnDragUriReadPrefixListener());
setUpDropTarget("request_take_persistable", new OnDragUriTakePersistableListener());
+ setUpDropTarget("on_receive_content_listener", new UriReadOnReceiveContentListener());
}
private void setUpDropTarget(String mode, OnDragUriListener listener) {
@@ -77,6 +80,20 @@
mTextView.setOnDragListener(listener);
}
+ private void setUpDropTarget(String mode, OnReceiveContentListener listener) {
+ if (!mode.equals(getIntent().getStringExtra("mode"))) {
+ return;
+ }
+ // Use an EditText widget when testing OnReceiveContentListener, since a TextView must
+ // be editable in order to accept DragEvents by default.
+ TextView nonEditableTextView = findViewById(R.id.drag_target);
+ nonEditableTextView.setVisibility(View.GONE);
+ mTextView = findViewById(R.id.editable_drag_target);
+ mTextView.setVisibility(View.VISIBLE);
+ mTextView.setText(mode);
+ mTextView.setOnReceiveContentListener(new String[] {"text/*", "image/*"}, listener);
+ }
+
private String checkExtraValue(DragEvent event) {
PersistableBundle extras = event.getClipDescription().getExtras();
if (extras == null) {
@@ -306,4 +323,33 @@
return RESULT_OK;
}
}
+
+ private class UriReadOnReceiveContentListener implements OnReceiveContentListener {
+ @Override
+ public ContentInfo onReceiveContent(View view, ContentInfo payload) {
+ String result;
+ try {
+ result = accessContent(payload.getClip().getItemAt(0).getUri());
+ } catch (SecurityException e) {
+ result = RESULT_EXCEPTION;
+ logResult(RESULT_KEY_DETAILS, e.getMessage());
+ }
+ logResult(RESULT_KEY_DROP_RESULT, result);
+ return null;
+ }
+
+ private String accessContent(Uri uri) {
+ try (Cursor cursor = getContentResolver().query(uri, null, null, null, null)) {
+ if (cursor == null) {
+ return "Null Cursor";
+ }
+ cursor.moveToPosition(0);
+ String value = cursor.getString(0);
+ if (!MAGIC_VALUE.equals(value)) {
+ return "Wrong value: " + value;
+ }
+ return RESULT_OK;
+ }
+ }
+ }
}
diff --git a/tests/framework/base/windowmanager/intent_tests/newDocumentCases/test-13.json b/tests/framework/base/windowmanager/intent_tests/newDocumentCases/test-13.json
new file mode 100644
index 0000000..e840860
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/newDocumentCases/test-13.json
@@ -0,0 +1,49 @@
+{
+ "comment": "Verify that a new task should not be created when the DocumentLaunchNeverActivity was started, even if the Intent contains FLAG_ACTIVITY_NEW_DOCUMENT and FLAG_ACTIVITY_MULTIPLE_TASK",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_DOCUMENT | FLAG_ACTIVITY_MULTIPLE_TASK",
+ "class": "android.server.wm.intent.Activities$DocumentLaunchNeverActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$DocumentLaunchNeverActivity",
+ "state": "RESUMED"
+ },
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/newDocumentCases/test-14.json b/tests/framework/base/windowmanager/intent_tests/newDocumentCases/test-14.json
new file mode 100644
index 0000000..76e16fa
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/newDocumentCases/test-14.json
@@ -0,0 +1,69 @@
+{
+ "comment": "Verify that reuse the existing DocumentLaunchNeverActivity while launch the activity again",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$DocumentLaunchNeverActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ },
+ {
+ "flags": "",
+ "class": "android.server.wm.intent.Activities$SingleInstanceActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_DOCUMENT",
+ "class": "android.server.wm.intent.Activities$DocumentLaunchNeverActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstanceActivity",
+ "state": "RESUMED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$DocumentLaunchNeverActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$DocumentLaunchNeverActivity",
+ "state": "RESUMED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstanceActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-1.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-1.json
new file mode 100644
index 0000000..92481c9
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-1.json
@@ -0,0 +1,53 @@
+{
+ "comment": "Verify the SingleInstancePerTaskActivity is created in a new task when being started without FLAG_ACTIVITY_NEW_TASK",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-2.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-2.json
new file mode 100644
index 0000000..bc6ae8f
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-2.json
@@ -0,0 +1,53 @@
+{
+ "comment": "Verify that a new task should be created when the SingleInstancePerTaskActivity was started for result",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": true
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-3.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-3.json
new file mode 100644
index 0000000..ddcc3a0
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-3.json
@@ -0,0 +1,67 @@
+{
+ "comment": "Verify that the SingleInstancePerTaskActivity can be created in multiple tasks",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ },
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "STOPPED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-4.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-4.json
new file mode 100644
index 0000000..9f273ff
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-4.json
@@ -0,0 +1,65 @@
+{
+ "comment": "Verify that the task should be reused (vs. the affinity task on top) while start the activity again",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ },
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ },
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-5.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-5.json
new file mode 100644
index 0000000..766af41
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-5.json
@@ -0,0 +1,73 @@
+{
+ "comment": "Verify that the a new task should be created when FLAG_ACTIVITY_MULTIPLE_TASK is applied (vs. reusing the existing task) while start the activity again",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ },
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ },
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "STOPPED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-6.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-6.json
new file mode 100644
index 0000000..93d6671
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-6.json
@@ -0,0 +1,49 @@
+{
+ "comment": "Verify that a regular activity can be launched on the same task of a singleInstancePerTask activity",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$RegularActivity",
+ "package": "android.server.wm.cts",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$RegularActivity",
+ "state": "RESUMED"
+ },
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-7.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-7.json
new file mode 100644
index 0000000..324c39f
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-7.json
@@ -0,0 +1,47 @@
+{
+ "comment": "Verify that reusing the same activity even launched with different Uri.",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "data": "https://www.google.com/",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "data": "https://www.youtube.com/",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-8.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-8.json
new file mode 100644
index 0000000..65718a2
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-8.json
@@ -0,0 +1,47 @@
+{
+ "comment": "Verify that reusing the same activity even launched with same Uri.",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "data": "https://www.google.com/",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "data": "https://www.google.com/",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-9.json b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-9.json
new file mode 100644
index 0000000..fc49d3a
--- /dev/null
+++ b/tests/framework/base/windowmanager/intent_tests/singleInstancePerTask/test-9.json
@@ -0,0 +1,55 @@
+{
+ "comment": "Verify that a new activity instance be created when FLAG_ACTIVITY_MULTIPLE_TASK is applied, even launched with same Uri.",
+ "setup": {
+ "initialIntents": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "data": "https://www.google.com/",
+ "startForResult": false
+ }
+ ],
+ "act": [
+ {
+ "flags": "FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK",
+ "class": "android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "package": "android.server.wm.cts",
+ "data": "https://www.google.com/",
+ "startForResult": false
+ }
+ ]
+ },
+ "initialState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ }
+ ]
+ },
+ "endState": {
+ "tasks": [
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "RESUMED"
+ }
+ ]
+ },
+ {
+ "activities": [
+ {
+ "name": "android.server.wm.cts/android.server.wm.intent.Activities$SingleInstancePerTaskActivity",
+ "state": "STOPPED"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/BlurTests.java b/tests/framework/base/windowmanager/src/android/server/wm/BlurTests.java
index ac826a4..d82c003 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/BlurTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/BlurTests.java
@@ -18,54 +18,339 @@
import static android.app.ActivityTaskManager.INVALID_STACK_ID;
import static android.server.wm.CliIntentExtra.extraInt;
+import static android.server.wm.ComponentNameUtils.getWindowName;
+import static android.server.wm.app.Components.BAD_BLUR_ACTIVITY;
import static android.server.wm.app.Components.BLUR_ACTIVITY;
+import static android.server.wm.app.Components.BLUR_ATTRIBUTES_ACTIVITY;
import static android.server.wm.app.Components.BACKGROUND_IMAGE_ACTIVITY;
-import static android.server.wm.app.Components.BlurActivity.ACTION_FINISH;
+import static android.server.wm.app.Components.BlurActivity.EXTRA_NO_BLUR_BACKGROUND_COLOR;
import static android.server.wm.app.Components.BlurActivity.EXTRA_BACKGROUND_BLUR_RADIUS_PX;
+import static android.server.wm.app.Components.BlurActivity.EXTRA_BLUR_BEHIND_RADIUS_PX;
-import static org.junit.Assert.assertFalse;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assume.assumeTrue;
+import android.content.ComponentName;
import android.platform.test.annotations.Presubmit;
import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.view.WindowManager;
import androidx.test.filters.FlakyTest;
+import com.android.compatibility.common.util.ColorUtils;
+
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@Presubmit
@FlakyTest(detail = "Promote once confirmed non-flaky")
public class BlurTests extends ActivityManagerTestBase {
+ private static final int BACKGROUND_BLUR_PX = dpToPx(50);
+ private static final int BLUR_BEHIND_PX = dpToPx(25);
+ private static final int NO_BLUR_BACKGROUND_COLOR = Color.BLACK;
+ private static final int BLUR_BEHIND_DYNAMIC_UPDATE_WAIT_TIME = 300;
+ private static final int BACKGROUND_BLUR_DYNAMIC_UPDATE_WAIT_TIME = 100;
@Before
public void setUp() {
assumeTrue(supportsBlur());
+ assumeTrue(usesSkiaRenderEngine());
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(false);
launchActivity(BACKGROUND_IMAGE_ACTIVITY);
mWmState.waitForValidState(BACKGROUND_IMAGE_ACTIVITY);
+ verifyOnlyBackgroundImageVisible();
+ }
+
+ @After
+ public void tearDown() {
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(false);
}
@Test
- public void testBackgroundBlurDifferentRadius() throws Exception {
- launchActivity(BLUR_ACTIVITY, extraInt(EXTRA_BACKGROUND_BLUR_RADIUS_PX, 5));
- mWmState.waitForValidState(BLUR_ACTIVITY);
+ public void testBackgroundBlurSimple() {
+ startTestActivity(BLUR_ACTIVITY,
+ extraInt(EXTRA_BACKGROUND_BLUR_RADIUS_PX, BACKGROUND_BLUR_PX));
- final int stackId = mWmState.getStackIdByActivity(BLUR_ACTIVITY);
- assertNotEquals(stackId, INVALID_STACK_ID);
- final Bitmap lowBlur = takeScreenshot();
+ final Rect windowFrame = getWindowFrame(BLUR_ACTIVITY);
+ assertBackgroundBlur(takeScreenshot(), windowFrame);
+ }
+
+ @Test
+ public void testBlurBehindSimple() {
+ startTestActivity(BLUR_ACTIVITY,
+ extraInt(EXTRA_BLUR_BEHIND_RADIUS_PX, BLUR_BEHIND_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, NO_BLUR_BACKGROUND_COLOR));
+
+ final Bitmap screenshot = takeScreenshot();
+ final Rect windowFrame = getWindowFrame(BLUR_ACTIVITY);
+ assertBlurBehind(screenshot, windowFrame);
+ assertNoBackgroundBlur(screenshot, windowFrame);
+ }
+
+ @Test
+ public void testNoBackgroundBlurWhenBlurDisabled() {
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(true);
+ startTestActivity(BLUR_ACTIVITY,
+ extraInt(EXTRA_BACKGROUND_BLUR_RADIUS_PX, BACKGROUND_BLUR_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, Color.TRANSPARENT));
+ verifyOnlyBackgroundImageVisible();
+ }
+
+ @Test
+ public void testNoBackgroundBlurForNonTranslucentWindow() {
+ startTestActivity(BAD_BLUR_ACTIVITY,
+ extraInt(EXTRA_BACKGROUND_BLUR_RADIUS_PX, BACKGROUND_BLUR_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, Color.TRANSPARENT));
+ verifyOnlyBackgroundImageVisible();
+ }
+
+ @Test
+ public void testNoBlurBehindWhenBlurDisabled() {
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(true);
+ startTestActivity(BLUR_ACTIVITY,
+ extraInt(EXTRA_BLUR_BEHIND_RADIUS_PX, BLUR_BEHIND_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, Color.TRANSPARENT));
+ verifyOnlyBackgroundImageVisible();
+ }
+
+ @Test
+ public void testNoBlurBehindWhenFlagNotSet() {
+ startTestActivity(BAD_BLUR_ACTIVITY,
+ extraInt(EXTRA_BLUR_BEHIND_RADIUS_PX, BLUR_BEHIND_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, Color.TRANSPARENT));
+ verifyOnlyBackgroundImageVisible();
+ }
+
+ @Test
+ public void testBackgroundBlurActivatesFallbackDynamically() throws Exception {
+ startTestActivity(BLUR_ACTIVITY,
+ extraInt(EXTRA_BACKGROUND_BLUR_RADIUS_PX, BACKGROUND_BLUR_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, NO_BLUR_BACKGROUND_COLOR));
+ final Rect windowFrame = getWindowFrame(BLUR_ACTIVITY);
+
+ Bitmap screenshot = takeScreenshot();
+ assertBackgroundBlur(takeScreenshot(), windowFrame);
+ assertNoBlurBehind(screenshot, windowFrame);
+
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(true);
+ Thread.sleep(BACKGROUND_BLUR_DYNAMIC_UPDATE_WAIT_TIME);
+
+ screenshot = takeScreenshot();
+ assertNoBackgroundBlur(screenshot, windowFrame);
+ assertNoBlurBehind(screenshot, windowFrame);
+
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(false);
+ Thread.sleep(BACKGROUND_BLUR_DYNAMIC_UPDATE_WAIT_TIME);
+
+ screenshot = takeScreenshot();
+ assertBackgroundBlur(takeScreenshot(), windowFrame);
+ assertNoBlurBehind(screenshot, windowFrame);
+ }
+
+ @Test
+ public void testBlurBehindDisabledDynamically() throws Exception {
+ startTestActivity(BLUR_ACTIVITY,
+ extraInt(EXTRA_BLUR_BEHIND_RADIUS_PX, BLUR_BEHIND_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, NO_BLUR_BACKGROUND_COLOR));
+ final Rect windowFrame = getWindowFrame(BLUR_ACTIVITY);
+
+ Bitmap screenshot = takeScreenshot();
+ assertBlurBehind(screenshot, windowFrame);
+ assertNoBackgroundBlur(screenshot, windowFrame);
+
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(true);
+ Thread.sleep(BLUR_BEHIND_DYNAMIC_UPDATE_WAIT_TIME);
+
+ screenshot = takeScreenshot();
+ assertNoBackgroundBlur(screenshot, windowFrame);
+ assertNoBlurBehind(screenshot, windowFrame);
+
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(false);
+ Thread.sleep(BLUR_BEHIND_DYNAMIC_UPDATE_WAIT_TIME);
+
+ screenshot = takeScreenshot();
+ assertBlurBehind(screenshot, windowFrame);
+ assertNoBackgroundBlur(screenshot, windowFrame);
+ }
+
+ @Test
+ public void testBlurBehindAndBackgroundBlur() throws Exception {
+ startTestActivity(BLUR_ACTIVITY,
+ extraInt(EXTRA_BLUR_BEHIND_RADIUS_PX, BLUR_BEHIND_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, NO_BLUR_BACKGROUND_COLOR),
+ extraInt(EXTRA_BACKGROUND_BLUR_RADIUS_PX, BACKGROUND_BLUR_PX));
+ final Rect windowFrame = getWindowFrame(BLUR_ACTIVITY);
+
+ Bitmap screenshot = takeScreenshot();
+ assertBlurBehind(screenshot, windowFrame);
+ assertBackgroundBlur(screenshot, windowFrame);
+
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(true);
+ Thread.sleep(BLUR_BEHIND_DYNAMIC_UPDATE_WAIT_TIME);
+
+ screenshot = takeScreenshot();
+ assertNoBackgroundBlur(screenshot, windowFrame);
+ assertNoBlurBehind(screenshot, windowFrame);
+
+ mContext.getSystemService(WindowManager.class).setForceCrossWindowBlurDisabled(false);
+ Thread.sleep(BLUR_BEHIND_DYNAMIC_UPDATE_WAIT_TIME);
+
+ screenshot = takeScreenshot();
+ assertBlurBehind(screenshot, windowFrame);
+ assertBackgroundBlur(screenshot, windowFrame);
+ }
+
+ @Test
+ public void testBlurBehindAndBackgroundBlurSetWithAttributes() {
+ startTestActivity(BLUR_ATTRIBUTES_ACTIVITY);
+ final Rect windowFrame = getWindowFrame(BLUR_ATTRIBUTES_ACTIVITY);
+ final Bitmap screenshot = takeScreenshot();
+
+ assertBlurBehind(screenshot, windowFrame);
+ assertBackgroundBlur(screenshot, windowFrame);
+ }
+
+ @Test
+ public void testBlurDestroyedAfterActivityFinished() {
+ startTestActivity(BLUR_ACTIVITY,
+ extraInt(EXTRA_BLUR_BEHIND_RADIUS_PX, BLUR_BEHIND_PX),
+ extraInt(EXTRA_NO_BLUR_BACKGROUND_COLOR, NO_BLUR_BACKGROUND_COLOR),
+ extraInt(EXTRA_BACKGROUND_BLUR_RADIUS_PX, BACKGROUND_BLUR_PX));
+ final Rect windowFrame = getWindowFrame(BLUR_ACTIVITY);
+ Bitmap screenshot = takeScreenshot();
+
+ assertBlurBehind(screenshot, windowFrame);
+ assertBackgroundBlur(screenshot, windowFrame);
mBroadcastActionTrigger.finishBroadcastReceiverActivity();
+ mWmState.waitAndAssertActivityRemoved(BLUR_ACTIVITY);
- launchActivity(BLUR_ACTIVITY, extraInt(EXTRA_BACKGROUND_BLUR_RADIUS_PX, 150));
- mWmState.waitForValidState(BLUR_ACTIVITY);
+ verifyOnlyBackgroundImageVisible();
+ }
- final int stackId2 = mWmState.getStackIdByActivity(BLUR_ACTIVITY);
- assertNotEquals(stackId2, INVALID_STACK_ID);
- final Bitmap highBlur = takeScreenshot();
+ private void startTestActivity(ComponentName activityName, final CliIntentExtra... extras) {
+ launchActivity(activityName, extras);
+ assertNotEquals(mWmState.getStackIdByActivity(activityName), INVALID_STACK_ID);
+ }
- assertFalse(lowBlur.sameAs(highBlur));
- //TODO(b/179990440): Add more tests for blurs in window manager
+ private Rect getWindowFrame(ComponentName activityName) {
+ String windowName = getWindowName(activityName);
+ mWmState.computeState(activityName);
+ return mWmState.getMatchingVisibleWindowState(windowName).get(0).getFrame();
+ }
+
+ private void verifyOnlyBackgroundImageVisible() {
+ final Bitmap screenshot = takeScreenshot();
+ final int height = screenshot.getHeight();
+ final int width = screenshot.getWidth();
+
+ final int blueWidth = width / 2;
+
+ for (int x = 0; x < width; x++) {
+ for (int y = 0; y < height; y++) {
+ if (x < blueWidth) {
+ ColorUtils.verifyColor("failed for pixel (x, y) = (" + x + ", " + y + ")",
+ Color.BLUE, screenshot.getPixel(x, y), 0);
+ } else {
+ ColorUtils.verifyColor("failed for pixel (x, y) = (" + x + ", " + y + ")",
+ Color.RED, screenshot.getPixel(x, y), 0);
+ }
+ }
+ }
+ }
+
+ private static int dpToPx(int dp) {
+ final float density =
+ getInstrumentation().getContext().getResources().getDisplayMetrics().density;
+ return (int) (dp * density + 0.5f);
+ }
+
+ private static void assertBlurBehind(Bitmap screenshot, Rect windowFrame) {
+ assertBlur(screenshot, BLUR_BEHIND_PX, 0, windowFrame.top);
+ assertBlur(screenshot, BLUR_BEHIND_PX, windowFrame.bottom, screenshot.getHeight());
+ }
+
+ private static void assertBackgroundBlur(Bitmap screenshot, Rect windowFrame) {
+ assertBlur(screenshot, BACKGROUND_BLUR_PX, windowFrame.top, windowFrame.bottom);
+ }
+
+ private static void assertNoBlurBehind(Bitmap screenshot, Rect windowFrame) {
+ for (int x = 0; x < screenshot.getWidth(); x++) {
+ for (int y = 0; y < screenshot.getHeight(); y++) {
+ if (x < windowFrame.left) {
+ ColorUtils.verifyColor("failed for pixel (x, y) = (" + x + ", " + y + ")",
+ Color.BLUE, screenshot.getPixel(x, y), 0);
+ } else if (x < screenshot.getWidth() / 2) {
+ if (y < windowFrame.top || y > windowFrame.bottom) {
+ ColorUtils.verifyColor("failed for pixel (x, y) = (" + x + ", " + y + ")",
+ Color.BLUE, screenshot.getPixel(x, y), 0);
+ }
+ } else if (x <= windowFrame.right) {
+ if (y < windowFrame.top || y > windowFrame.bottom) {
+ ColorUtils.verifyColor("failed for pixel (x, y) = (" + x + ", " + y + ")",
+ Color.RED, screenshot.getPixel(x, y), 0);
+ }
+ } else if (x > windowFrame.right) {
+ ColorUtils.verifyColor("failed for pixel (x, y) = (" + x + ", " + y + ")",
+ Color.RED, screenshot.getPixel(x, y), 0);
+ }
+
+ }
+ }
+ }
+
+ private static void assertNoBackgroundBlur(Bitmap screenshot, Rect windowFrame) {
+ for (int y = windowFrame.top; y < windowFrame.bottom; y++) {
+ for (int x = windowFrame.left; x < windowFrame.right; x++) {
+ ColorUtils.verifyColor("failed for pixel (x, y) = (" + x + ", " + y + ")",
+ NO_BLUR_BACKGROUND_COLOR, screenshot.getPixel(x, y), 0);
+ }
+ }
+ }
+
+ private static void assertBlur(Bitmap screenshot, int blurRadius, int startHeight,
+ int endHeight) {
+ final int width = screenshot.getWidth();
+
+ // Adjust the test to check a smaller part of the blurred area in order to accept various
+ // blur algorithm approximations used in RenderEngine
+ final int kawaseOffset = (int) (blurRadius * 0.7f);
+ final int blurAreaStartX = width / 2 - blurRadius + kawaseOffset;
+ final int blurAreaEndX = width / 2 + blurRadius - kawaseOffset;
+ final int stepSize = kawaseOffset / 4;
+
+ Color previousColor;
+ Color currentColor;
+ final int unaffectedBluePixelX = width / 2 - blurRadius - 1;
+ final int unaffectedRedPixelX = width / 2 + blurRadius + 1;
+ for (int y = startHeight; y < endHeight; y++) {
+ ColorUtils.verifyColor(
+ "failed for pixel (x, y) = (" + unaffectedBluePixelX + ", " + y + ")",
+ Color.BLUE, screenshot.getPixel(unaffectedBluePixelX, y), 0);
+ previousColor = Color.valueOf(Color.BLUE);
+ for (int x = blurAreaStartX; x <= blurAreaEndX; x += stepSize) {
+ currentColor = screenshot.getColor(x, y);
+ assertTrue("assertBlur failed for blue for pixel (x, y) = (" + x + ", " + y + ");"
+ + " previousColor blue: " + previousColor.blue()
+ + ", currentColor blue: " + currentColor.blue()
+ , previousColor.blue() > currentColor.blue());
+ assertTrue("assertBlur failed for red for pixel (x, y) = (" + x + ", " + y + ");"
+ + " previousColor red: " + previousColor.red()
+ + ", currentColor red: " + currentColor.red(),
+ previousColor.red() < currentColor.red());
+
+ previousColor = currentColor;
+ }
+ ColorUtils.verifyColor(
+ "failed for pixel (x, y) = (" + unaffectedRedPixelX + ", " + y + ")",
+ Color.RED, screenshot.getPixel(unaffectedRedPixelX, y), 0);
+ }
}
}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java b/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
new file mode 100644
index 0000000..55acbda
--- /dev/null
+++ b/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.server.wm;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
+
+import android.app.Activity;
+import android.compat.testing.PlatformCompatChangeRule;
+import android.content.ComponentName;
+import android.content.pm.ActivityInfo;
+import android.platform.test.annotations.Presubmit;
+import android.server.wm.app.AbstractLifecycleLogActivity;
+
+import androidx.test.filters.FlakyTest;
+
+import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+
+/**
+ * The test is focused on compatibility changes that have an effect on WM logic, and tests that
+ * enabling these changes has the correct effect.
+ *
+ * This is achieved by launching a custom activity with certain properties (e.g., a resizeable
+ * portrait activity) that behaves in a certain way (e.g., enter size compat mode after resizing the
+ * display) and enabling a compatibility change (e.g., {@link ActivityInfo#FORCE_RESIZE_APP}) that
+ * changes that behavior (e.g., not enter size compat mode).
+ *
+ * The behavior without enabling a compatibility change is also tested as a baseline.
+ *
+ * <p>Build/Install/Run:
+ * atest CtsWindowManagerDeviceTestCases:CompatChangeTests
+ */
+@Presubmit
+@FlakyTest(bugId = 182185145)
+public final class CompatChangeTests extends MultiDisplayTestBase {
+ private static final ComponentName RESIZEABLE_PORTRAIT_ACTIVITY =
+ component(ResizeablePortraitActivity.class);
+ private static final ComponentName NON_RESIZEABLE_PORTRAIT_ACTIVITY =
+ component(NonResizeablePortraitActivity.class);
+ private static final ComponentName SUPPORTS_SIZE_CHANGES_PORTRAIT_ACTIVITY =
+ component(SupportsSizeChangesPortraitActivity.class);
+
+ @Rule
+ public TestRule compatChangeRule = new PlatformCompatChangeRule();
+
+ private DisplayMetricsSession mDisplayMetricsSession;
+
+ @Before
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ mDisplayMetricsSession =
+ createManagedDisplayMetricsSession(DEFAULT_DISPLAY);
+ }
+
+ /**
+ * Test that a non-resizeable portrait activity enters size compat mode after resizing the
+ * display.
+ */
+ @Test
+ public void testSizeCompatForNonResizeableActivity() {
+ runSizeCompatTest(
+ NON_RESIZEABLE_PORTRAIT_ACTIVITY, /* inSizeCompatModeAfterResize= */ true);
+ }
+
+ /**
+ * Test that a non-resizeable portrait activity doesn't enter size compat mode after resizing
+ * the display, when the {@link ActivityInfo#FORCE_RESIZE_APP} compat change is enabled.
+ */
+ @Test
+ @EnableCompatChanges({ActivityInfo.FORCE_RESIZE_APP})
+ public void testSizeCompatForNonResizeableActivityForceResizeEnabled() {
+ runSizeCompatTest(
+ NON_RESIZEABLE_PORTRAIT_ACTIVITY, /* inSizeCompatModeAfterResize= */ false);
+ }
+
+ /**
+ * Test that a resizeable portrait activity doesn't enter size compat mode after resizing
+ * the display.
+ */
+ @Test
+ public void testSizeCompatForResizeableActivity() {
+ runSizeCompatTest(RESIZEABLE_PORTRAIT_ACTIVITY, /* inSizeCompatModeAfterResize= */ false);
+ }
+
+ /**
+ * Test that a non-resizeable portrait activity that supports size changes doesn't enter size
+ * compat mode after resizing the display.
+ */
+ @Test
+ public void testSizeCompatForSupportsSizeChangesActivity() {
+ runSizeCompatTest(
+ SUPPORTS_SIZE_CHANGES_PORTRAIT_ACTIVITY, /* inSizeCompatModeAfterResize= */ false);
+ }
+
+ /**
+ * Test that a resizeable portrait activity enters size compat mode after resizing
+ * the display, when the {@link ActivityInfo#FORCE_NON_RESIZE_APP} compat change is enabled.
+ */
+ @Test
+ @EnableCompatChanges({ActivityInfo.FORCE_NON_RESIZE_APP})
+ public void testSizeCompatForResizeableActivityForceNonResizeEnabled() {
+ runSizeCompatTest(RESIZEABLE_PORTRAIT_ACTIVITY, /* inSizeCompatModeAfterResize= */ true);
+ }
+
+ /**
+ * Test that a non-resizeable portrait activity that supports size changes enters size compat
+ * mode after resizing the display, when the {@link ActivityInfo#FORCE_NON_RESIZE_APP} compat
+ * change is enabled.
+ */
+ @Test
+ @EnableCompatChanges({ActivityInfo.FORCE_NON_RESIZE_APP})
+ public void testSizeCompatForSupportsSizeChangesActivityForceNonResizeEnabled() {
+ runSizeCompatTest(
+ SUPPORTS_SIZE_CHANGES_PORTRAIT_ACTIVITY, /* inSizeCompatModeAfterResize= */ true);
+ }
+
+ private void runSizeCompatTest(ComponentName activity, boolean inSizeCompatModeAfterResize) {
+ runSizeCompatTest(activity, /* resizeRatio= */ 0.5, inSizeCompatModeAfterResize);
+ mDisplayMetricsSession.restoreDisplayMetrics();
+ runSizeCompatTest(activity, /* resizeRatio= */ 2, inSizeCompatModeAfterResize);
+ }
+
+ private void runSizeCompatTest(ComponentName activity, double resizeRatio,
+ boolean inSizeCompatModeAfterResize) {
+ launchActivityOnDisplay(activity, DEFAULT_DISPLAY);
+
+ assertSizeCompatMode(activity, /* expectedInSizeCompatMode= */ false);
+
+ resizeDisplay(activity, resizeRatio);
+
+ assertSizeCompatMode(activity, inSizeCompatModeAfterResize);
+ }
+
+ private void assertSizeCompatMode(ComponentName activity, boolean expectedInSizeCompatMode) {
+ WindowManagerState.Activity activityContainer = mWmState.getActivity(activity);
+ assertNotNull(activityContainer);
+ if (expectedInSizeCompatMode) {
+ assertTrue("The Window should be in size compat mode",
+ activityContainer.inSizeCompatMode());
+ } else {
+ assertFalse("The Window should not be in size compat mode",
+ activityContainer.inSizeCompatMode());
+ }
+ }
+
+ private void resizeDisplay(ComponentName activity, double sizeRatio) {
+ mDisplayMetricsSession.changeDisplayMetrics(sizeRatio, /* densityRatio= */ 1);
+ mWmState.computeState(new WaitForValidActivityState(activity));
+ }
+
+ private static ComponentName component(Class<? extends Activity> activity) {
+ return new ComponentName(getInstrumentation().getContext(), activity);
+ }
+
+ public static class ResizeablePortraitActivity extends AbstractLifecycleLogActivity {
+ }
+
+ public static class NonResizeablePortraitActivity extends AbstractLifecycleLogActivity {
+ }
+
+ public static class SupportsSizeChangesPortraitActivity extends AbstractLifecycleLogActivity {
+ }
+}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/CompatScaleTests.java b/tests/framework/base/windowmanager/src/android/server/wm/CompatScaleTests.java
index dce47ab..54fa189 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/CompatScaleTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/CompatScaleTests.java
@@ -89,14 +89,14 @@
// state.
launchActivity();
mAppSizesNormal = getActivityReportedSizes();
- mWindowStateNormal = getActivityWindowState();
+ mWindowStateNormal = getPackageWindowState();
// Now launch the same activity with downscaling *enabled* and get the sizes it reports and
// its Window state.
enableDownscaling(mCompatChangeName);
launchActivity();
mAppSizesDownscaled = getActivityReportedSizes();
- mWindowStateDownscaled = getActivityWindowState();
+ mWindowStateDownscaled = getPackageWindowState();
}
/**
@@ -183,14 +183,14 @@
public void test_windowState_inCompatDownscalingMode() {
// Check the "normal" window's state for disabled compat mode and appropriate global scale.
assertFalse("The Window should not be in the size compat mode",
- mWindowStateNormal.isInSizeCompatMode());
+ mWindowStateNormal.hasCompatScale());
assertEquals("The window should not be scaled",
1f, mWindowStateNormal.getGlobalScale(), EPSILON_GLOBAL_SCALE);
// Check the "downscaled" window's state for enabled compat mode and appropriate global
// scale.
assertTrue("The Window should be in the size compat mode",
- mWindowStateDownscaled.isInSizeCompatMode());
+ mWindowStateDownscaled.hasCompatScale());
assertEquals("The window should have global scale of " + mInvCompatScale,
mInvCompatScale, mWindowStateDownscaled.getGlobalScale(), EPSILON_GLOBAL_SCALE);
@@ -222,12 +222,8 @@
return details;
}
- private WindowManagerState.WindowState getActivityWindowState() {
- final int TYPE_BASE_APPLICATION = 1; // from WindowManager.java
- final WindowManagerState.WindowState window =
- mWmState.getWindowByPackageName(PACKAGE_UNDER_TEST, TYPE_BASE_APPLICATION);
- assertNotNull(window);
- return window;
+ private WindowManagerState.WindowState getPackageWindowState() {
+ return getPackageWindowState(PACKAGE_UNDER_TEST);
}
private static void enableDownscaling(String compatChangeName) {
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/CrossAppDragAndDropTests.java b/tests/framework/base/windowmanager/src/android/server/wm/CrossAppDragAndDropTests.java
index e9de061..2befd739 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/CrossAppDragAndDropTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/CrossAppDragAndDropTests.java
@@ -73,6 +73,7 @@
private static final String REQUEST_READ_NESTED = "request_read_nested";
private static final String REQUEST_TAKE_PERSISTABLE = "request_take_persistable";
private static final String REQUEST_WRITE = "request_write";
+ private static final String TARGET_ON_RECEIVE_CONTENT_LISTENER = "on_receive_content_listener";
private static final String SOURCE_LOG_TAG = "DragSource";
private static final String TARGET_LOG_TAG = "DropTarget";
@@ -226,11 +227,16 @@
mTargetResults = TestLogService.getResultsForClient(mTargetLogTag, 1000);
assertTargetResult(RESULT_KEY_DROP_RESULT, expectedDropResult);
- if (!RESULT_MISSING.equals(expectedDropResult)) {
- assertTargetResult(RESULT_KEY_ACCESS_BEFORE, RESULT_EXCEPTION);
- assertTargetResult(RESULT_KEY_ACCESS_AFTER, RESULT_EXCEPTION);
+
+ // Skip the following assertions when testing OnReceiveContentListener, since it only
+ // handles drop events.
+ if (!TARGET_ON_RECEIVE_CONTENT_LISTENER.equals(targetMode)) {
+ if (!RESULT_MISSING.equals(expectedDropResult)) {
+ assertTargetResult(RESULT_KEY_ACCESS_BEFORE, RESULT_EXCEPTION);
+ assertTargetResult(RESULT_KEY_ACCESS_AFTER, RESULT_EXCEPTION);
+ }
+ assertListenerResults(expectedListenerResults);
}
- assertListenerResults(expectedListenerResults);
}
private void assertListenerResults(String expectedResult) throws Exception {
@@ -353,4 +359,14 @@
public void testGrantWriteRequestWrite() throws Exception {
assertDropResult(GRANT_WRITE, REQUEST_WRITE, RESULT_OK);
}
+
+ @Test
+ public void testOnReceiveContentListener_GrantRead() throws Exception {
+ assertDropResult(GRANT_READ, TARGET_ON_RECEIVE_CONTENT_LISTENER, RESULT_OK);
+ }
+
+ @Test
+ public void testOnReceiveContentListener_GrantNone() throws Exception {
+ assertDropResult(GRANT_NONE, TARGET_ON_RECEIVE_CONTENT_LISTENER, RESULT_EXCEPTION);
+ }
}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/DisplayHashManagerTest.java b/tests/framework/base/windowmanager/src/android/server/wm/DisplayHashManagerTest.java
index be916e8..e73bd0c 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/DisplayHashManagerTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/DisplayHashManagerTest.java
@@ -21,6 +21,7 @@
import static android.view.displayhash.DisplayHashResultCallback.DISPLAY_HASH_ERROR_INVALID_HASH_ALGORITHM;
import static android.view.displayhash.DisplayHashResultCallback.DISPLAY_HASH_ERROR_NOT_VISIBLE_ON_SCREEN;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
@@ -57,11 +58,7 @@
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
-/*
@Presubmit
-TODO: This currently fails because the hash logic expects a specific size. Re-enable once
-DisplayHashParams are merged
-*/
public class DisplayHashManagerTest {
private final Point mTestViewSize = new Point(200, 300);
@@ -283,6 +280,29 @@
}
@Test
+ public void testVerifyDisplayHash_ValidDisplayHash() {
+ mInstrumentation.runOnMainSync(() -> {
+ final RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(mTestViewSize.x,
+ mTestViewSize.y);
+ mTestView = new View(mActivity);
+ mTestView.setBackgroundColor(Color.BLUE);
+ mMainView.addView(mTestView, p);
+ mMainView.invalidate();
+ });
+ mInstrumentation.waitForIdleSync();
+
+ DisplayHash displayHash = generateDisplayHash(null);
+ VerifiedDisplayHash verifiedDisplayHash = mDisplayHashManager.verifyDisplayHash(
+ displayHash);
+
+ assertNotNull(verifiedDisplayHash);
+ assertEquals(displayHash.getTimeMillis(), verifiedDisplayHash.getTimeMillis());
+ assertEquals(displayHash.getBoundsInWindow(), verifiedDisplayHash.getBoundsInWindow());
+ assertEquals(displayHash.getHashAlgorithm(), verifiedDisplayHash.getHashAlgorithm());
+ assertArrayEquals(displayHash.getImageHash(), verifiedDisplayHash.getImageHash());
+ }
+
+ @Test
public void testVerifyDisplayHash_InvalidDisplayHash() {
mInstrumentation.runOnMainSync(() -> {
final RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(mTestViewSize.x,
@@ -300,9 +320,25 @@
displayHash.getHashAlgorithm(), new byte[32], displayHash.getHmac());
VerifiedDisplayHash verifiedDisplayHash = mDisplayHashManager.verifyDisplayHash(
fakeDisplayHash);
+
assertNull(verifiedDisplayHash);
}
+ @Test
+ public void testVerifiedDisplayHash() {
+ long timeMillis = 1000;
+ Rect boundsInWindow = new Rect(0, 0, 50, 100);
+ String hashAlgorithm = "hashAlgorithm";
+ byte[] imageHash = new byte[]{2, 4, 1, 5, 6, 2};
+ VerifiedDisplayHash verifiedDisplayHash = new VerifiedDisplayHash(timeMillis,
+ boundsInWindow, hashAlgorithm, imageHash);
+
+ assertEquals(timeMillis, verifiedDisplayHash.getTimeMillis());
+ assertEquals(boundsInWindow, verifiedDisplayHash.getBoundsInWindow());
+ assertEquals(hashAlgorithm, verifiedDisplayHash.getHashAlgorithm());
+ assertArrayEquals(imageHash, verifiedDisplayHash.getImageHash());
+ }
+
private DisplayHash generateDisplayHash(Rect bounds) {
mTestView.generateDisplayHash(mFirstHashAlgorithm, bounds, mExecutor,
mSyncDisplayHashResultCallback);
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTransitionTests.java b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTransitionTests.java
index f06ed9f..c6c277c 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTransitionTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTransitionTests.java
@@ -22,11 +22,11 @@
import static android.server.wm.WindowManagerState.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
import static android.server.wm.WindowManagerState.TRANSIT_KEYGUARD_OCCLUDE;
import static android.server.wm.WindowManagerState.TRANSIT_KEYGUARD_UNOCCLUDE;
-import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_ACTIVITY;
-import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_ATTR_ACTIVITY;
-import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY;
-import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_WITH_DIALOG_ACTIVITY;
-import static android.server.wm.app.Components.TEST_ACTIVITY;
+import static android.server.wm.app.Components.DISABLE_PREVIEW_ACTIVITY;
+import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_ATTR_NO_PREVIEW_ACTIVITY;
+import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY;
+import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_NO_PREVIEW_ACTIVITY;
+import static android.server.wm.app.Components.SHOW_WHEN_LOCKED_WITH_DIALOG_NO_PREVIEW_ACTIVITY;
import static android.server.wm.app.Components.WALLPAPAER_ACTIVITY;
import static org.junit.Assert.assertEquals;
@@ -58,9 +58,9 @@
@Test
public void testUnlock() {
final LockScreenSession lockScreenSession = createManagedLockScreenSession();
- launchActivity(TEST_ACTIVITY);
+ launchActivity(DISABLE_PREVIEW_ACTIVITY);
lockScreenSession.gotoKeyguard().unlockDevice();
- mWmState.computeState(TEST_ACTIVITY);
+ mWmState.computeState(DISABLE_PREVIEW_ACTIVITY);
assertEquals("Picked wrong transition", TRANSIT_KEYGUARD_GOING_AWAY,
mWmState.getDefaultDisplayLastTransition());
}
@@ -78,8 +78,8 @@
@Test
public void testOcclude() {
createManagedLockScreenSession().gotoKeyguard();
- launchActivity(SHOW_WHEN_LOCKED_ACTIVITY);
- mWmState.computeState(SHOW_WHEN_LOCKED_ACTIVITY);
+ launchActivity(SHOW_WHEN_LOCKED_NO_PREVIEW_ACTIVITY);
+ mWmState.computeState(SHOW_WHEN_LOCKED_NO_PREVIEW_ACTIVITY);
assertEquals("Picked wrong transition", TRANSIT_KEYGUARD_OCCLUDE,
mWmState.getDefaultDisplayLastTransition());
}
@@ -87,8 +87,8 @@
@Test
public void testUnocclude() {
createManagedLockScreenSession().gotoKeyguard();
- launchActivity(SHOW_WHEN_LOCKED_ACTIVITY);
- launchActivity(TEST_ACTIVITY);
+ launchActivity(SHOW_WHEN_LOCKED_NO_PREVIEW_ACTIVITY);
+ launchActivity(DISABLE_PREVIEW_ACTIVITY);
mWmState.waitForKeyguardShowingAndNotOccluded();
mWmState.computeState();
assertEquals("Picked wrong transition", TRANSIT_KEYGUARD_UNOCCLUDE,
@@ -98,10 +98,10 @@
@Test
public void testNewActivityDuringOccluded() {
final LockScreenSession lockScreenSession = createManagedLockScreenSession();
- launchActivity(SHOW_WHEN_LOCKED_ACTIVITY);
- lockScreenSession.gotoKeyguard(SHOW_WHEN_LOCKED_ACTIVITY);
- launchActivity(SHOW_WHEN_LOCKED_WITH_DIALOG_ACTIVITY);
- mWmState.computeState(SHOW_WHEN_LOCKED_WITH_DIALOG_ACTIVITY);
+ launchActivity(SHOW_WHEN_LOCKED_NO_PREVIEW_ACTIVITY);
+ lockScreenSession.gotoKeyguard(SHOW_WHEN_LOCKED_NO_PREVIEW_ACTIVITY);
+ launchActivity(SHOW_WHEN_LOCKED_WITH_DIALOG_NO_PREVIEW_ACTIVITY);
+ mWmState.computeState(SHOW_WHEN_LOCKED_WITH_DIALOG_NO_PREVIEW_ACTIVITY);
assertEquals("Picked wrong transition", TRANSIT_ACTIVITY_OPEN,
mWmState.getDefaultDisplayLastTransition());
}
@@ -111,11 +111,11 @@
final LockScreenSession lockScreenSession = createManagedLockScreenSession();
lockScreenSession.gotoKeyguard();
separateTestJournal();
- launchActivity(SHOW_WHEN_LOCKED_ATTR_ACTIVITY);
- mWmState.computeState(SHOW_WHEN_LOCKED_ATTR_ACTIVITY);
+ launchActivity(SHOW_WHEN_LOCKED_ATTR_NO_PREVIEW_ACTIVITY);
+ mWmState.computeState(SHOW_WHEN_LOCKED_ATTR_NO_PREVIEW_ACTIVITY);
assertEquals("Picked wrong transition", TRANSIT_KEYGUARD_OCCLUDE,
mWmState.getDefaultDisplayLastTransition());
- assertSingleLaunch(SHOW_WHEN_LOCKED_ATTR_ACTIVITY);
+ assertSingleLaunch(SHOW_WHEN_LOCKED_ATTR_NO_PREVIEW_ACTIVITY);
}
@Test
@@ -123,31 +123,32 @@
final LockScreenSession lockScreenSession = createManagedLockScreenSession();
lockScreenSession.gotoKeyguard();
separateTestJournal();
- launchActivity(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY);
- mWmState.computeState(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY);
+ launchActivity(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY);
+ mWmState.computeState(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY);
assertEquals("Picked wrong transition", TRANSIT_KEYGUARD_OCCLUDE,
mWmState.getDefaultDisplayLastTransition());
- assertSingleLaunch(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY);
+ assertSingleLaunch(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY);
// Waiting for the standard keyguard since
- // {@link SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY} called
+ // {@link SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY} called
// {@link Activity#showWhenLocked(boolean)} and removed the attribute.
lockScreenSession.gotoKeyguard();
separateTestJournal();
- // Waiting for {@link SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY} stopped since it
+ // Waiting for {@link SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY} stopped since it
// already lost show-when-locked attribute.
- launchActivityNoWait(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY);
- mWmState.waitForActivityState(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY, STATE_STOPPED);
- assertSingleStartAndStop(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_ACTIVITY);
+ launchActivityNoWait(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY);
+ mWmState.waitForActivityState(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY,
+ STATE_STOPPED);
+ assertSingleStartAndStop(SHOW_WHEN_LOCKED_ATTR_REMOVE_ATTR_NO_PREVIEW_ACTIVITY);
}
@Test
public void testNewActivityDuringOccludedWithAttr() {
final LockScreenSession lockScreenSession = createManagedLockScreenSession();
- launchActivity(SHOW_WHEN_LOCKED_ATTR_ACTIVITY);
- lockScreenSession.gotoKeyguard(SHOW_WHEN_LOCKED_ATTR_ACTIVITY);
- launchActivity(SHOW_WHEN_LOCKED_WITH_DIALOG_ACTIVITY);
- mWmState.computeState(SHOW_WHEN_LOCKED_WITH_DIALOG_ACTIVITY);
+ launchActivity(SHOW_WHEN_LOCKED_ATTR_NO_PREVIEW_ACTIVITY);
+ lockScreenSession.gotoKeyguard(SHOW_WHEN_LOCKED_ATTR_NO_PREVIEW_ACTIVITY);
+ launchActivity(SHOW_WHEN_LOCKED_WITH_DIALOG_NO_PREVIEW_ACTIVITY);
+ mWmState.computeState(SHOW_WHEN_LOCKED_WITH_DIALOG_NO_PREVIEW_ACTIVITY);
assertEquals("Picked wrong transition", TRANSIT_ACTIVITY_OPEN,
mWmState.getDefaultDisplayLastTransition());
}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayActivityLaunchTests.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayActivityLaunchTests.java
index 4edc6bb..4d44076 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayActivityLaunchTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayActivityLaunchTests.java
@@ -163,7 +163,9 @@
}
/**
- * Tests launching an existing activity from an activity that resided on secondary display.
+ * Tests launching an existing activity from an activity that resides on secondary display. An
+ * existing activity on a different display should be moved to the display of the launching
+ * activity.
*/
@Test
public void testLaunchActivityFromSecondaryDisplay() {
@@ -183,14 +185,14 @@
"Activity should be resumed on secondary display");
mBroadcastActionTrigger.launchActivityNewTask(getActivityName(TEST_ACTIVITY));
- waitAndAssertTopResumedActivity(TEST_ACTIVITY, DEFAULT_DISPLAY,
- "Activity should be the top resumed on default display");
+ waitAndAssertTopResumedActivity(TEST_ACTIVITY, newDisplayId,
+ "Activity should be resumed on secondary display");
getLaunchActivityBuilder().setUseInstrumentation()
.setTargetActivity(TEST_ACTIVITY).setNewTask(true)
- .setDisplayId(newDisplayId).execute();
- waitAndAssertTopResumedActivity(TEST_ACTIVITY, newDisplay.mId,
- "Activity should be resumed on secondary display");
+ .setDisplayId(DEFAULT_DISPLAY).execute();
+ waitAndAssertTopResumedActivity(TEST_ACTIVITY, DEFAULT_DISPLAY,
+ "Activity should be the top resumed on default display");
}
/**
@@ -199,6 +201,11 @@
*/
@Test
public void testLaunchExternalDisplayActivityWhilePrimaryOff() {
+ if (isOperatorTierDevice()) {
+ // This test is not applicable for the device who uses launch_after_boot configuration
+ return;
+ }
+
// Launch something on the primary display so we know there is a resumed activity there
launchActivity(RESIZEABLE_ACTIVITY);
waitAndAssertTopResumedActivity(RESIZEABLE_ACTIVITY, DEFAULT_DISPLAY,
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
index 49d31ea..c1273e5 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
@@ -656,6 +656,8 @@
// display.
final DisplayContent defDisplay = mWmState.getDisplay(DEFAULT_DISPLAY);
tapOnDisplayCenter(defDisplay.mId);
+ mWmState.waitForAppTransitionIdleOnDisplay(DEFAULT_DISPLAY);
+ mWmState.assertValidity();
// Reparent ImeTestActivity from virtual display to default display.
getLaunchActivityBuilder()
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
index 1b0d933..3183c75 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
@@ -278,9 +278,13 @@
mInitialDisplayMetrics.setDisplayMetrics(size, density);
}
+ void restoreDisplayMetrics() {
+ mInitialDisplayMetrics.restoreDisplayMetrics();
+ }
+
@Override
public void close() {
- mInitialDisplayMetrics.restoreDisplayMetrics();
+ restoreDisplayMetrics();
}
}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/SplashscreenTests.java b/tests/framework/base/windowmanager/src/android/server/wm/SplashscreenTests.java
index 3ba2f6d..e08229e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SplashscreenTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SplashscreenTests.java
@@ -34,6 +34,7 @@
import static android.server.wm.app.Components.TestStartingWindowKeys.HANDLE_SPLASH_SCREEN_EXIT;
import static android.server.wm.app.Components.TestStartingWindowKeys.ICON_ANIMATION_DURATION;
import static android.server.wm.app.Components.TestStartingWindowKeys.ICON_ANIMATION_START;
+import static android.server.wm.app.Components.TestStartingWindowKeys.ICON_BACKGROUND_COLOR;
import static android.server.wm.app.Components.TestStartingWindowKeys.RECEIVE_SPLASH_SCREEN_EXIT;
import static android.server.wm.app.Components.TestStartingWindowKeys.REPLACE_ICON_EXIT;
import static android.server.wm.app.Components.TestStartingWindowKeys.REQUEST_HANDLE_EXIT_ON_CREATE;
@@ -191,6 +192,8 @@
() -> expectResult == journal.extras.getBoolean(RECEIVE_SPLASH_SCREEN_EXIT));
assertEquals(expectResult, journal.extras.getBoolean(CONTAINS_CENTER_VIEW));
assertEquals(expectResult, journal.extras.getBoolean(CONTAINS_BRANDING_VIEW));
+ assertEquals(expectResult ? Color.BLUE : Color.TRANSPARENT,
+ journal.extras.getInt(ICON_BACKGROUND_COLOR));
}
@Test
@@ -241,7 +244,7 @@
() -> journal.extras.getBoolean(RECEIVE_SPLASH_SCREEN_EXIT));
assertTrue(journal.extras.getBoolean(CONTAINS_CENTER_VIEW));
final long iconAnimationStart = journal.extras.getLong(ICON_ANIMATION_START);
- final int iconAnimationDuration = journal.extras.getInt(ICON_ANIMATION_DURATION);
+ final long iconAnimationDuration = journal.extras.getLong(ICON_ANIMATION_DURATION);
assertTrue(iconAnimationStart != 0);
assertEquals(iconAnimationDuration, 500);
assertFalse(journal.extras.getBoolean(CONTAINS_BRANDING_VIEW));
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/StartActivityTests.java b/tests/framework/base/windowmanager/src/android/server/wm/StartActivityTests.java
index cd9e38c..da18c69 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/StartActivityTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/StartActivityTests.java
@@ -45,7 +45,6 @@
import android.server.wm.CommandSession.ActivitySession;
import android.server.wm.intent.Activities;
-
import org.junit.Test;
import java.util.Arrays;
@@ -60,20 +59,21 @@
@Test
public void testStartHomeIfNoActivities() {
if (!hasHomeScreen()) {
- return;
- }
+ return;
+ }
+
final ComponentName defaultHome = getDefaultHomeComponent();
final int[] allActivityTypes = Arrays.copyOf(ALL_ACTIVITY_TYPE_BUT_HOME,
ALL_ACTIVITY_TYPE_BUT_HOME.length + 1);
allActivityTypes[allActivityTypes.length - 1] = WindowConfiguration.ACTIVITY_TYPE_HOME;
removeRootTasksWithActivityTypes(allActivityTypes);
- waitAndAssertTopResumedActivity(defaultHome, DEFAULT_DISPLAY,
+ waitAndAssertResumedActivity(defaultHome,
"Home activity should be restarted after force-finish");
stopTestPackage(defaultHome.getPackageName());
- waitAndAssertTopResumedActivity(defaultHome, DEFAULT_DISPLAY,
+ waitAndAssertResumedActivity(defaultHome,
"Home activity should be restarted after force-stop");
}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/TransitionSelectionTests.java b/tests/framework/base/windowmanager/src/android/server/wm/TransitionSelectionTests.java
index c6778a8..2ca333e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/TransitionSelectionTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/TransitionSelectionTests.java
@@ -198,7 +198,7 @@
@Test
public void testCloseActivity_BothWallpaper_Translucent() {
testCloseActivityTranslucent(true /*bottomWallpaper*/, true /*topWallpaper*/,
- TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE);
+ TRANSIT_WALLPAPER_INTRA_CLOSE);
}
@Test
@@ -216,7 +216,7 @@
@Test
public void testCloseTask_BothWallpaper_Translucent() {
testCloseTaskTranslucent(true /*bottomWallpaper*/, true /*topWallpaper*/,
- TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE);
+ TRANSIT_WALLPAPER_INTRA_CLOSE);
}
//------------------------------------------------------------------------//
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsControllerTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsControllerTests.java
index 79fe362..536f27e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsControllerTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsControllerTests.java
@@ -402,7 +402,8 @@
// Swiping from top of display can show bars.
dragFromTopToCenter(rootView);
- PollingCheck.waitFor(TIMEOUT, () -> rootView.getRootWindowInsets().isVisible(types));
+ PollingCheck.waitFor(TIMEOUT, () -> rootView.getRootWindowInsets().isVisible(types)
+ && rootView.getSystemUiVisibility() != targetFlags);
// Use flags to hide status bar again.
ANIMATION_CALLBACK.reset();
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/intent/Activities.java b/tests/framework/base/windowmanager/src/android/server/wm/intent/Activities.java
index e4cb869..a9cfac9 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/intent/Activities.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/intent/Activities.java
@@ -57,6 +57,9 @@
public static class SingleTaskActivity2 extends BaseActivity {
}
+ public static class SingleInstancePerTaskActivity extends BaseActivity {
+ }
+
public static class TaskAffinity1Activity extends BaseActivity {
}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/intent/LaunchSequence.java b/tests/framework/base/windowmanager/src/android/server/wm/intent/LaunchSequence.java
index 69a1f31..5552e3d 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/intent/LaunchSequence.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/intent/LaunchSequence.java
@@ -143,7 +143,7 @@
* intent.
*/
static LaunchIntent intent(Class<? extends android.app.Activity> activity) {
- return new LaunchIntent(Lists.newArrayList(), createComponent(activity), false);
+ return new LaunchIntent(Lists.newArrayList(), createComponent(activity), null, false);
}
@@ -154,7 +154,7 @@
* @param activity the activity to create an intent for.
*/
static LaunchIntent intentForResult(Class<? extends android.app.Activity> activity) {
- return new LaunchIntent(Lists.newArrayList(), createComponent(activity), true);
+ return new LaunchIntent(Lists.newArrayList(), createComponent(activity), null, true);
}
String packageName = getInstrumentation().getTargetContext().getPackageName();
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/intent/Persistence.java b/tests/framework/base/windowmanager/src/android/server/wm/intent/Persistence.java
index 5d80e32..457e709 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/intent/Persistence.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/intent/Persistence.java
@@ -20,6 +20,7 @@
import android.content.ComponentName;
import android.content.Intent;
+import android.net.Uri;
import android.server.wm.WindowManagerState;
import com.google.common.collect.Lists;
@@ -225,22 +226,29 @@
private static final String FLAGS_KEY = "flags";
private static final String PACKAGE_KEY = "package";
private static final String CLASS_KEY = "class";
+ private static final String DATA_KEY = "data";
private static final String START_FOR_RESULT_KEY = "startForResult";
private final List<IntentFlag> mIntentFlags;
private final ComponentName mComponentName;
+ private final String mData;
private final boolean mStartForResult;
- public LaunchIntent(List<IntentFlag> intentFlags, ComponentName componentName,
+ public LaunchIntent(List<IntentFlag> intentFlags, ComponentName componentName, String data,
boolean startForResult) {
mIntentFlags = intentFlags;
mComponentName = componentName;
+ mData = data;
mStartForResult = startForResult;
}
@Override
public Intent getActualIntent() {
- return new Intent().setComponent(mComponentName).setFlags(buildFlag());
+ final Intent intent = new Intent().setComponent(mComponentName).setFlags(buildFlag());
+ if (mData != null && !mData.isEmpty()) {
+ intent.setData(Uri.parse(mData));
+ }
+ return intent;
}
@Override
@@ -272,11 +280,13 @@
List<IntentFlag> flags = IntentFlag.parse(table, fakeIntent.getString(FLAGS_KEY));
boolean startForResult = fakeIntent.optBoolean(START_FOR_RESULT_KEY, false);
+ String uri = fakeIntent.optString(DATA_KEY);
return new LaunchIntent(flags,
new ComponentName(
fakeIntent.getString(PACKAGE_KEY),
- fakeIntent.getString(CLASS_KEY)), startForResult);
-
+ fakeIntent.getString(CLASS_KEY)),
+ uri,
+ startForResult);
}
@Override
@@ -290,7 +300,7 @@
public LaunchIntent withFlags(IntentFlag... flags) {
List<IntentFlag> intentFlags = Lists.newArrayList(mIntentFlags);
Collections.addAll(intentFlags, flags);
- return new LaunchIntent(intentFlags, mComponentName, mStartForResult);
+ return new LaunchIntent(intentFlags, mComponentName, mData, mStartForResult);
}
public List<IntentFlag> getIntentFlags() {
@@ -300,10 +310,6 @@
public ComponentName getComponentName() {
return mComponentName;
}
-
- public boolean isStartForResult() {
- return mStartForResult;
- }
}
/**
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/ActivityManagerTestBase.java b/tests/framework/base/windowmanager/util/src/android/server/wm/ActivityManagerTestBase.java
index aa6f8b5..764e097 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/ActivityManagerTestBase.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/ActivityManagerTestBase.java
@@ -98,6 +98,7 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.Surface.ROTATION_0;
+import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
@@ -142,6 +143,7 @@
import android.server.wm.CommandSession.LaunchProxy;
import android.server.wm.CommandSession.SizeInfo;
import android.server.wm.TestJournalProvider.TestJournalContainer;
+import android.server.wm.WindowManagerState.WindowState;
import android.server.wm.settings.SettingsSession;
import android.util.DisplayMetrics;
import android.util.EventLog;
@@ -1016,8 +1018,12 @@
}
protected boolean supportsBlur() {
- return SystemProperties.get("ro.surface_flinger.supports_background_blur", "default")
- .equals("1");
+ return SystemProperties.get("ro.surface_flinger.supports_background_blur", "default")
+ .equals("1");
+ }
+
+ protected boolean usesSkiaRenderEngine() {
+ return SystemProperties.get("debug.renderengine.backend", "default").contains("skia");
}
protected boolean isWatch() {
@@ -1033,6 +1039,10 @@
return mContext.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
+ protected boolean isOperatorTierDevice() {
+ return hasDeviceFeature("com.google.android.tv.operator_tier");
+ }
+
protected void waitAndAssertActivityState(ComponentName activityName,
String state, String message) {
mWmState.waitForActivityState(activityName, state);
@@ -1049,16 +1059,12 @@
public void waitAndAssertTopResumedActivity(ComponentName activityName, int displayId,
String message) {
- mWmState.waitForValidState(activityName);
- mWmState.waitForActivityState(activityName, STATE_RESUMED);
final String activityClassName = getActivityName(activityName);
mWmState.waitForWithAmState(state -> activityClassName.equals(state.getFocusedActivity()),
"activity to be on top");
-
- mWmState.assertValidity();
+ waitAndAssertResumedActivity(activityName, "Activity must be resumed");
mWmState.assertFocusedActivity(message, activityName);
- assertTrue("Activity must be resumed",
- mWmState.hasActivityState(activityName, STATE_RESUMED));
+
final int frontRootTaskId = mWmState.getFrontRootTaskId(displayId);
WindowManagerState.ActivityTask frontRootTaskOnDisplay =
mWmState.getRootTask(frontRootTaskId);
@@ -1068,6 +1074,20 @@
frontRootTaskOnDisplay.isLeafTask() ? frontRootTaskOnDisplay.mResumedActivity
: frontRootTaskOnDisplay.getTopTask().mResumedActivity);
mWmState.assertFocusedStack("Top activity's rootTask must also be on top", frontRootTaskId);
+ }
+
+ /**
+ * Waits and asserts that the activity represented by the given activity name is resumed and
+ * visible, but is not necessarily the top activity.
+ *
+ * @param activityName the activity name
+ * @param message the error message
+ */
+ public void waitAndAssertResumedActivity(ComponentName activityName, String message) {
+ mWmState.waitForValidState(activityName);
+ mWmState.waitForActivityState(activityName, STATE_RESUMED);
+ mWmState.assertValidity();
+ assertTrue(message, mWmState.hasActivityState(activityName, STATE_RESUMED));
mWmState.assertVisibility(activityName, true /* visible */);
}
@@ -2051,6 +2071,13 @@
return counts;
}
+ WindowState getPackageWindowState(String packageName) {
+ final WindowManagerState.WindowState window =
+ mWmState.getWindowByPackageName(packageName, TYPE_BASE_APPLICATION);
+ assertNotNull(window);
+ return window;
+ }
+
static class ActivityLifecycleCounts {
private final int[] mCounts = new int[ActivityCallback.SIZE];
private final int[] mFirstIndexes = new int[ActivityCallback.SIZE];
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/TestTaskOrganizer.java b/tests/framework/base/windowmanager/util/src/android/server/wm/TestTaskOrganizer.java
index 2e23f5e..ff5a31f 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/TestTaskOrganizer.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/TestTaskOrganizer.java
@@ -51,7 +51,7 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
-class TestTaskOrganizer extends TaskOrganizer {
+public class TestTaskOrganizer extends TaskOrganizer {
private static final String TAG = TestTaskOrganizer.class.getSimpleName();
public static final int INVALID_TASK_ID = -1;
@@ -79,7 +79,7 @@
WINDOWING_MODE_UNDEFINED
};
- TestTaskOrganizer(Context context) {
+ public TestTaskOrganizer(Context context) {
super();
mContext = context;
}
@@ -158,7 +158,7 @@
mRegistered = true;
}
- void unregisterOrganizerIfNeeded() {
+ public void unregisterOrganizerIfNeeded() {
synchronized (this) {
if (!mRegistered) return;
mRegistered = false;
@@ -180,7 +180,7 @@
}
}
- void putTaskInSplitPrimary(int taskId) {
+ public void putTaskInSplitPrimary(int taskId) {
NestedShellPermission.run(() -> {
synchronized (this) {
registerOrganizerIfNeeded();
@@ -202,7 +202,7 @@
});
}
- void putTaskInSplitSecondary(int taskId) {
+ public void putTaskInSplitSecondary(int taskId) {
NestedShellPermission.run(() -> {
synchronized (this) {
registerOrganizerIfNeeded();
@@ -272,6 +272,14 @@
setTaskBounds(mRootSecondary.getToken(), bounds);
}
+ public Rect getPrimaryTaskBounds() {
+ return mPrimaryBounds;
+ }
+
+ public Rect getSecondaryTaskBounds() {
+ return mSecondaryBounds;
+ }
+
private void setTaskBounds(WindowContainerToken container, Rect bounds) {
synchronized (this) {
NestedShellPermission.run(() -> {
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
index 6f2a30d..9f6141a 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
@@ -836,11 +836,21 @@
private ActivityTask getTaskByActivity(ComponentName activityName, int windowingMode,
int excludeTaskId) {
+ Activity activity = getActivity(activityName, windowingMode, excludeTaskId);
+ return activity == null ? null : activity.task;
+ }
+
+ public Activity getActivity(ComponentName activityName) {
+ return getActivity(activityName, WINDOWING_MODE_UNDEFINED, -1);
+ }
+
+ private Activity getActivity(ComponentName activityName, int windowingMode,
+ int excludeTaskId) {
for (ActivityTask stack : mRootTasks) {
if (windowingMode == WINDOWING_MODE_UNDEFINED
|| windowingMode == stack.getWindowingMode()) {
Activity activity = stack.getActivity(activityName, excludeTaskId);
- if (activity != null) return activity.task;
+ if (activity != null) return activity;
}
}
return null;
@@ -1418,6 +1428,7 @@
String state;
boolean visible;
boolean frontOfTask;
+ boolean inSizeCompatMode;
int procId = -1;
public boolean translucent;
ActivityTask task;
@@ -1429,6 +1440,7 @@
state = proto.state;
visible = proto.visible;
frontOfTask = proto.frontOfTask;
+ inSizeCompatMode = proto.inSizeCompatMode;
if (proto.procId != 0) {
procId = proto.procId;
}
@@ -1442,6 +1454,10 @@
public String getState() {
return state;
}
+
+ public boolean inSizeCompatMode() {
+ return inSizeCompatMode;
+ }
}
static abstract class ActivityContainer extends WindowContainer {
@@ -1705,7 +1721,7 @@
private Rect mSurfaceInsets = new Rect();
private Rect mGivenContentInsets = new Rect();
private Rect mCrop = new Rect();
- private boolean mInSizeCompatMode;
+ private boolean mHasCompatScale;
private float mGlobalScale;
private int mRequestedWidth;
private int mRequestedHeight;
@@ -1748,7 +1764,7 @@
mWindowType = 0;
}
collectDescendantsOfType(WindowState.class, this, mSubWindows);
- mInSizeCompatMode = proto.inSizeCompatMode;
+ mHasCompatScale = proto.hasCompatScale;
mGlobalScale = proto.globalScale;
mRequestedWidth = proto.requestedWidth;
mRequestedHeight = proto.requestedHeight;
@@ -1810,8 +1826,8 @@
return mType;
}
- public boolean isInSizeCompatMode() {
- return mInSizeCompatMode;
+ public boolean hasCompatScale() {
+ return mHasCompatScale;
}
public float getGlobalScale() {
diff --git a/tests/inputmethod/AndroidTest.xml b/tests/inputmethod/AndroidTest.xml
index 4941b79..40616c0 100644
--- a/tests/inputmethod/AndroidTest.xml
+++ b/tests/inputmethod/AndroidTest.xml
@@ -45,6 +45,15 @@
<option name="force-install-mode" value="FULL"/>
<option name="test-file-name" value="CtsMockSpellChecker.apk" />
</target_preparer>
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <!--
+ SpellCheckingIme always needs to be instaleld as a full package, even when CTS is
+ running for instant apps.
+ -->
+ <option name="force-install-mode" value="FULL"/>
+ <option name="test-file-name" value="CtsSpellCheckingIme.apk" />
+ </target_preparer>
<!--
TODO(yukawa): come up with a proper way to take care of devices that do not support
installable IMEs. Ideally target_preparer should have an option to annotate required
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
index 01e4a82..182bb11 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
@@ -865,8 +865,12 @@
presentationSpecs.add(new InlinePresentationSpec.Builder(new Size(100, 100),
new Size(400, 100)).setStyle(styles).build());
+ final InlinePresentationSpec tooltipSpec =
+ new InlinePresentationSpec.Builder(new Size(100, 100),
+ new Size(400, 100)).setStyle(styles).build();
final InlineSuggestionsRequest.Builder builder =
new InlineSuggestionsRequest.Builder(presentationSpecs)
+ .setInlineTooltipPresentationSpec(tooltipSpec)
.setMaxSuggestionCount(6);
if (mInlineSuggestionsExtras != null) {
builder.setExtras(mInlineSuggestionsExtras.deepCopy());
diff --git a/tests/inputmethod/mockspellchecker/src/com/android/cts/mockspellchecker/MockSpellChecker.kt b/tests/inputmethod/mockspellchecker/src/com/android/cts/mockspellchecker/MockSpellChecker.kt
index 8b04640..acc030b 100644
--- a/tests/inputmethod/mockspellchecker/src/com/android/cts/mockspellchecker/MockSpellChecker.kt
+++ b/tests/inputmethod/mockspellchecker/src/com/android/cts/mockspellchecker/MockSpellChecker.kt
@@ -18,6 +18,7 @@
import android.content.ComponentName
import android.service.textservice.SpellCheckerService
import android.util.Log
+import android.view.textservice.SentenceSuggestionsInfo
import android.view.textservice.SuggestionsInfo
import android.view.textservice.TextInfo
import com.android.cts.mockspellchecker.MockSpellCheckerProto.MockSpellCheckerConfiguration
@@ -54,6 +55,34 @@
override fun onCreate() = withLog("MockSpellCheckerSession.onCreate") {
}
+ override fun onGetSentenceSuggestionsMultiple(
+ textInfos: Array<out TextInfo>?,
+ suggestionsLimit: Int
+ ): Array<SentenceSuggestionsInfo> = withLog(
+ "MockSpellCheckerSession.onGetSuggestionsMultiple " +
+ "${textInfos?.map { it.text }?.joinToString(":")}") {
+ if (textInfos == null) return emptyArray()
+ val configuration = MockSpellCheckerConfiguration.parseFrom(
+ SharedPrefsProvider.get(contentResolver, KEY_CONFIGURATION))
+ if (configuration.matchSentence)
+ return textInfos.map { matchSentenceSuggestion(configuration, it) }.toTypedArray()
+ return super.onGetSentenceSuggestionsMultiple(textInfos, suggestionsLimit)
+ }
+
+ private fun matchSentenceSuggestion(
+ configuration: MockSpellCheckerConfiguration,
+ textInfo: TextInfo
+ ): SentenceSuggestionsInfo {
+ return configuration.suggestionRulesList.find { it.match == textInfo.text }
+ ?.let {
+ SentenceSuggestionsInfo(
+ arrayOf(suggestionsInfo(it, textInfo.cookie, textInfo.sequence)),
+ intArrayOf(0),
+ intArrayOf(textInfo.text.length))
+ }
+ ?: SentenceSuggestionsInfo(emptyArray(), intArrayOf(), intArrayOf())
+ }
+
override fun onGetSuggestions(
textInfo: TextInfo?,
suggestionsLimit: Int
@@ -69,9 +98,17 @@
}
private fun suggestionsInfo(rule: SuggestionRule): SuggestionsInfo {
+ return suggestionsInfo(rule, 0, 0)
+ }
+
+ private fun suggestionsInfo(
+ rule: SuggestionRule,
+ cookie: Int,
+ sequence: Int
+ ): SuggestionsInfo {
// Only use attrs in supportedAttributes
val attrs = rule.attributes and supportedAttributes
- return SuggestionsInfo(attrs, rule.suggestionsList.toTypedArray())
+ return SuggestionsInfo(attrs, rule.suggestionsList.toTypedArray(), cookie, sequence)
}
private fun emptySuggestionsInfo() = SuggestionsInfo(0, arrayOf())
@@ -82,4 +119,4 @@
fun getId(): String =
ComponentName(PACKAGE, MockSpellChecker::class.java.name).flattenToShortString()
}
-}
+}
\ No newline at end of file
diff --git a/tests/inputmethod/mockspellchecker/src/com/android/cts/mockspellchecker/mockspellchecker.proto b/tests/inputmethod/mockspellchecker/src/com/android/cts/mockspellchecker/mockspellchecker.proto
index 58b127f..35574ba 100644
--- a/tests/inputmethod/mockspellchecker/src/com/android/cts/mockspellchecker/mockspellchecker.proto
+++ b/tests/inputmethod/mockspellchecker/src/com/android/cts/mockspellchecker/mockspellchecker.proto
@@ -31,4 +31,5 @@
// Represents a MockSpellChecker configuration.
message MockSpellCheckerConfiguration {
repeated SuggestionRule suggestion_rules = 1;
+ optional bool match_sentence = 2;
};
diff --git a/tests/inputmethod/spellcheckingime/Android.bp b/tests/inputmethod/spellcheckingime/Android.bp
new file mode 100644
index 0000000..d486750
--- /dev/null
+++ b/tests/inputmethod/spellcheckingime/Android.bp
@@ -0,0 +1,33 @@
+// 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.
+
+android_test_helper_app {
+ name: "CtsSpellCheckingIme",
+ srcs: ["src/**/*.java"],
+ defaults: ["cts_defaults"],
+ optimize: {
+ enabled: false,
+ },
+ sdk_version: "current",
+ min_sdk_version: "19",
+ // tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ "mts",
+ ],
+ static_libs: [
+ "androidx.annotation_annotation",
+ ],
+}
diff --git a/tests/inputmethod/spellcheckingime/AndroidManifest.xml b/tests/inputmethod/spellcheckingime/AndroidManifest.xml
new file mode 100644
index 0000000..08faffa
--- /dev/null
+++ b/tests/inputmethod/spellcheckingime/AndroidManifest.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.cts.spellcheckingime">
+
+ <application android:multiArch="true"
+ android:supportsRtl="true">
+
+ <meta-data android:name="instantapps.clients.allowed"
+ android:value="true"/>
+
+ <service android:name=".SpellCheckingIme"
+ android:label="Spell Checking IME"
+ android:permission="android.permission.BIND_INPUT_METHOD"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.view.InputMethod"/>
+ </intent-filter>
+ <meta-data android:name="android.view.im"
+ android:resource="@xml/method"/>
+ </service>
+
+ </application>
+</manifest>
diff --git a/tests/inputmethod/spellcheckingime/res/xml/method.xml b/tests/inputmethod/spellcheckingime/res/xml/method.xml
new file mode 100644
index 0000000..fa2d8f4
--- /dev/null
+++ b/tests/inputmethod/spellcheckingime/res/xml/method.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<input-method xmlns:android="http://schemas.android.com/apk/res/android"
+ android:suppressesSpellChecker="true">
+</input-method>
diff --git a/tests/inputmethod/spellcheckingime/src/com/android/cts/spellcheckingime/SpellCheckingIme.java b/tests/inputmethod/spellcheckingime/src/com/android/cts/spellcheckingime/SpellCheckingIme.java
new file mode 100644
index 0000000..33b717f
--- /dev/null
+++ b/tests/inputmethod/spellcheckingime/src/com/android/cts/spellcheckingime/SpellCheckingIme.java
@@ -0,0 +1,32 @@
+/*
+ * 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.spellcheckingime;
+
+import android.inputmethodservice.InputMethodService;
+import android.view.View;
+import android.widget.LinearLayout;
+
+/**
+ * Mock IME with android:suppressesSpellChecker="true".
+ */
+public final class SpellCheckingIme extends InputMethodService {
+
+ @Override
+ public View onCreateInputView() {
+ return new LinearLayout(this);
+ }
+}
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/KeyboardVisibilityControlTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/KeyboardVisibilityControlTest.java
index 428ac60..ade0464 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/KeyboardVisibilityControlTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/KeyboardVisibilityControlTest.java
@@ -87,7 +87,6 @@
import com.android.cts.mockime.ImeSettings;
import com.android.cts.mockime.MockImeSession;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/PackageVisibilityTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/PackageVisibilityTest.java
index 4f2dbeb..afc41e6 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/PackageVisibilityTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/PackageVisibilityTest.java
@@ -52,7 +52,6 @@
import com.android.cts.mockime.ImeSettings;
import com.android.cts.mockime.MockImeSession;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/SpellCheckerTest.kt b/tests/inputmethod/src/android/view/inputmethod/cts/SpellCheckerTest.kt
index b5ca08a..fe67b1e 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/SpellCheckerTest.kt
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/SpellCheckerTest.kt
@@ -16,24 +16,33 @@
package android.view.inputmethod.cts
import android.app.Instrumentation
+import android.app.UiAutomation
import android.content.Context
+import android.os.Looper
import android.provider.Settings
import android.text.style.SuggestionSpan
import android.text.style.SuggestionSpan.FLAG_GRAMMAR_ERROR
import android.text.style.SuggestionSpan.FLAG_MISSPELLED
+import android.text.style.SuggestionSpan.SUGGESTIONS_MAX_SIZE
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import android.view.inputmethod.InputMethodInfo
+import android.view.inputmethod.InputMethodManager
import android.view.inputmethod.cts.util.EndToEndImeTestBase
import android.view.inputmethod.cts.util.InputMethodVisibilityVerifier
import android.view.inputmethod.cts.util.TestActivity
import android.view.inputmethod.cts.util.TestUtils.runOnMainSync
import android.view.inputmethod.cts.util.TestUtils.waitOnMainUntil
import android.view.inputmethod.cts.util.UnlockScreenRule
+import android.view.textservice.SentenceSuggestionsInfo
+import android.view.textservice.SpellCheckerSession
import android.view.textservice.SpellCheckerSubtype
+import android.view.textservice.SuggestionsInfo
import android.view.textservice.SuggestionsInfo.RESULT_ATTR_DONT_SHOW_UI_FOR_SUGGESTIONS
import android.view.textservice.SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY
import android.view.textservice.SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_GRAMMAR_ERROR
import android.view.textservice.SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO
+import android.view.textservice.TextInfo
import android.view.textservice.TextServicesManager
import android.widget.EditText
import android.widget.LinearLayout
@@ -45,6 +54,7 @@
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.Until
import com.android.compatibility.common.util.CtsTouchUtils
+import com.android.compatibility.common.util.PollingCheck
import com.android.compatibility.common.util.SettingsStateChangerRule
import com.android.cts.mockime.ImeEventStreamTestUtils.expectCommand
import com.android.cts.mockime.MockImeSession
@@ -53,12 +63,16 @@
import com.android.cts.mockspellchecker.MockSpellCheckerProto
import com.android.cts.mockspellchecker.MockSpellCheckerProto.MockSpellCheckerConfiguration
import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.fail
import org.junit.Assume
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
+import java.util.Locale
+import java.util.concurrent.Executor
import java.util.concurrent.TimeUnit
+import kotlin.collections.ArrayList
private val TIMEOUT = TimeUnit.SECONDS.toMillis(5)
@@ -66,9 +80,13 @@
@RunWith(AndroidJUnit4::class)
class SpellCheckerTest : EndToEndImeTestBase() {
+ private val SPELL_CHECKING_IME_ID = "com.android.cts.spellcheckingime/.SpellCheckingIme"
+ private val TIMEOUT = TimeUnit.SECONDS.toMillis(5)
+
private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
private val context: Context = instrumentation.getTargetContext()
private val uiDevice: UiDevice = UiDevice.getInstance(instrumentation)
+ private val uiAutomation: UiAutomation = instrumentation.uiAutomation
@Rule
fun unlockScreenRule() = UnlockScreenRule()
@@ -228,22 +246,201 @@
val tsm = context.getSystemService(TextServicesManager::class.java)!!
assertThat(tsm).isNotNull()
assertThat(tsm!!.isSpellCheckerEnabled()).isTrue()
- val spellCheckerInfo = tsm.getCurrentSpellChecker()
+ val spellCheckerInfo = tsm.getCurrentSpellCheckerInfo()
assertThat(spellCheckerInfo).isNotNull()
assertThat(spellCheckerInfo!!.getPackageName()).isEqualTo(
- "com.android.cts.mockspellchecker")
+ "com.android.cts.mockspellchecker")
assertThat(spellCheckerInfo!!.getSubtypeCount()).isEqualTo(1)
- val spellCheckerSubtypeAllowImplicitlySelected = tsm.getCurrentSpellCheckerSubtype(true)
- assertThat(spellCheckerSubtypeAllowImplicitlySelected).isNotNull()
- assertThat(spellCheckerSubtypeAllowImplicitlySelected!!.getLanguageTag()).isEqualTo("en-US")
- assertThat(spellCheckerSubtypeAllowImplicitlySelected!!.getLocale()).isEqualTo("en")
- assertThat(spellCheckerSubtypeAllowImplicitlySelected!!.getExtraValue()).isEmpty()
- val spellCheckerSubtypeNotAllowImplicitlySelected =
- tsm.getCurrentSpellCheckerSubtype(false)
- assertThat(spellCheckerSubtypeNotAllowImplicitlySelected).isNull()
- assertThat(tsm.getEnabledSpellCheckersList()!!.size).isAtLeast(1)
- assertThat(tsm.getEnabledSpellCheckersList()!!.map { it.getPackageName() })
- .contains("com.android.cts.mockspellchecker")
+ assertThat(tsm.getEnabledSpellCheckerInfos()!!.size).isAtLeast(1)
+ assertThat(tsm.getEnabledSpellCheckerInfos()!!.map { it.getPackageName() })
+ .contains("com.android.cts.mockspellchecker")
+ }
+
+ @Test
+ fun newSpellCheckerSession() {
+ val configuration = MockSpellCheckerConfiguration.newBuilder()
+ .addSuggestionRules(
+ MockSpellCheckerProto.SuggestionRule.newBuilder()
+ .setMatch("match")
+ .addSuggestions("suggestion")
+ .setAttributes(RESULT_ATTR_LOOKS_LIKE_TYPO)
+ ).build()
+ MockSpellCheckerClient.create(context, configuration).use {
+ val tsm = context.getSystemService(TextServicesManager::class.java)
+ assertThat(tsm).isNotNull()
+ val fakeListener = FakeSpellCheckerSessionListener()
+ val fakeExecutor = FakeExecutor()
+ var session: SpellCheckerSession? = tsm?.newSpellCheckerSession(Locale.US, false,
+ RESULT_ATTR_LOOKS_LIKE_TYPO, null, fakeExecutor, fakeListener)
+ assertThat(session).isNotNull()
+ session?.getSentenceSuggestions(arrayOf(TextInfo("match")), 5)
+ waitOnMainUntil({ fakeExecutor.runnables.size == 1 }, TIMEOUT)
+ fakeExecutor.runnables[0].run()
+
+ assertThat(fakeListener.getSentenceSuggestionsResults).hasSize(1)
+ assertThat(fakeListener.getSentenceSuggestionsResults[0]).hasLength(1)
+ val sentenceSuggestionsInfo = fakeListener.getSentenceSuggestionsResults[0]!![0]
+ assertThat(sentenceSuggestionsInfo.suggestionsCount).isEqualTo(1)
+ assertThat(sentenceSuggestionsInfo.getOffsetAt(0)).isEqualTo(0)
+ assertThat(sentenceSuggestionsInfo.getLengthAt(0)).isEqualTo("match".length)
+ val suggestionsInfo = sentenceSuggestionsInfo.getSuggestionsInfoAt(0)
+ assertThat(suggestionsInfo.suggestionsCount).isEqualTo(1)
+ assertThat(suggestionsInfo.getSuggestionAt(0)).isEqualTo("suggestion")
+
+ assertThat(fakeListener.getSentenceSuggestionsResults).hasSize(1)
+ assertThat(fakeListener.getSentenceSuggestionsCallingThreads).hasSize(1)
+ assertThat(fakeListener.getSentenceSuggestionsCallingThreads[0])
+ .isEqualTo(Thread.currentThread())
+ }
+ }
+
+ @Test
+ fun newSpellCheckerSession_implicitExecutor() {
+ val configuration = MockSpellCheckerConfiguration.newBuilder()
+ .addSuggestionRules(
+ MockSpellCheckerProto.SuggestionRule.newBuilder()
+ .setMatch("match")
+ .addSuggestions("suggestion")
+ .setAttributes(RESULT_ATTR_LOOKS_LIKE_TYPO)
+ ).build()
+ MockSpellCheckerClient.create(context, configuration).use {
+ val tsm = context.getSystemService(TextServicesManager::class.java)
+ assertThat(tsm).isNotNull()
+ val fakeListener = FakeSpellCheckerSessionListener()
+ var session: SpellCheckerSession? = null
+ runOnMainSync {
+ session = tsm?.newSpellCheckerSession(null /* bundle */, Locale.US,
+ fakeListener, false /* referToSpellCheckerLanguageSettings */)
+ }
+ assertThat(session).isNotNull()
+ session?.getSentenceSuggestions(arrayOf(TextInfo("match")), 5)
+ waitOnMainUntil({
+ fakeListener.getSentenceSuggestionsCallingThreads.size > 0
+ }, TIMEOUT)
+ runOnMainSync {
+ assertThat(fakeListener.getSentenceSuggestionsCallingThreads).hasSize(1)
+ assertThat(fakeListener.getSentenceSuggestionsCallingThreads[0])
+ .isEqualTo(Looper.getMainLooper().thread)
+ }
+ }
+ }
+
+ @Test
+ fun suppressesSpellChecker() {
+ val configuration = MockSpellCheckerConfiguration.newBuilder()
+ .addSuggestionRules(
+ MockSpellCheckerProto.SuggestionRule.newBuilder()
+ .setMatch("match")
+ .addSuggestions("suggestion")
+ .setAttributes(RESULT_ATTR_LOOKS_LIKE_TYPO)
+ ).build()
+ // SpellCheckingIme should have android:suppressesSpellChecker="true"
+ ImeSession(SPELL_CHECKING_IME_ID).use {
+ assertThat(getCurrentInputMethodInfo().suppressesSpellChecker()).isTrue()
+
+ MockSpellCheckerClient.create(context, configuration).use {
+ val (activity, editText) = startTestActivity()
+ CtsTouchUtils.emulateTapOnViewCenter(instrumentation, null, editText)
+ waitOnMainUntil({ editText.hasFocus() }, TIMEOUT)
+ val imm = activity.getSystemService(InputMethodManager::class.java)
+ assertThat(imm?.isInputMethodSuppressingSpellChecker).isTrue()
+
+ // SpellCheckerSession should return empty results if suppressed.
+ val tsm = activity.getSystemService(TextServicesManager::class.java)
+ val listener = FakeSpellCheckerSessionListener()
+ var session: SpellCheckerSession? = null
+ runOnMainSync {
+ session = tsm?.newSpellCheckerSession(null, Locale.US, listener, false)
+ }
+ assertThat(session).isNotNull()
+ val suggestions: Array<SentenceSuggestionsInfo>? =
+ getSentenceSuggestions(session!!, listener, "match")
+ assertThat(suggestions).isNotNull()
+ assertThat(suggestions!!.size).isEqualTo(0)
+ }
+ }
+ }
+
+ @Test
+ fun suppressesSpellChecker_false() {
+ MockImeSession.create(context).use {
+ assertThat(getCurrentInputMethodInfo().suppressesSpellChecker()).isFalse()
+
+ val (activity, editText) = startTestActivity()
+ CtsTouchUtils.emulateTapOnViewCenter(instrumentation, null, editText)
+ waitOnMainUntil({ editText.hasFocus() }, TIMEOUT)
+ val imm = activity.getSystemService(InputMethodManager::class.java)
+ assertThat(imm?.isInputMethodSuppressingSpellChecker).isFalse()
+ }
+ }
+
+ @Test
+ fun trailingPunctuation() {
+ // Set up a rule that matches the sentence "match?" and marks it as grammar error.
+ val configuration = MockSpellCheckerConfiguration.newBuilder()
+ .setMatchSentence(true)
+ .addSuggestionRules(
+ MockSpellCheckerProto.SuggestionRule.newBuilder()
+ .setMatch("match?")
+ .addSuggestions("suggestion.")
+ .setAttributes(RESULT_ATTR_LOOKS_LIKE_GRAMMAR_ERROR)
+ ).build()
+ MockImeSession.create(context).use { session ->
+ MockSpellCheckerClient.create(context, configuration).use { client ->
+ val (_, editText) = startTestActivity()
+ CtsTouchUtils.emulateTapOnViewCenter(instrumentation, null, editText)
+ waitOnMainUntil({ editText.hasFocus() }, TIMEOUT)
+ InputMethodVisibilityVerifier.expectImeVisible(TIMEOUT)
+ session.callCommitText("match", 1)
+ // The trailing punctuation "?" is also sent in the next spell check, and the
+ // sentence "match?" will be marked as FLAG_GRAMMAR_ERROR according to the
+ // configuration.
+ session.callCommitText("?", 1)
+ waitOnMainUntil({
+ findSuggestionSpanWithFlags(editText, FLAG_GRAMMAR_ERROR) != null
+ }, TIMEOUT)
+ }
+ }
+ }
+
+ @Test
+ fun respectSentenceBoundary() {
+ // Set up two rules:
+ // - Matches the sentence "Preceding text?" and marks it as grammar error.
+ // - Matches the sentence "match?" and marks it as misspelled.
+ val configuration = MockSpellCheckerConfiguration.newBuilder()
+ .setMatchSentence(true)
+ .addSuggestionRules(
+ MockSpellCheckerProto.SuggestionRule.newBuilder()
+ .setMatch("Preceding text?")
+ .addSuggestions("suggestion.")
+ .setAttributes(RESULT_ATTR_LOOKS_LIKE_GRAMMAR_ERROR)
+ ).addSuggestionRules(
+ MockSpellCheckerProto.SuggestionRule.newBuilder()
+ .setMatch("match?")
+ .addSuggestions("suggestion.")
+ .setAttributes(RESULT_ATTR_LOOKS_LIKE_TYPO)
+ ).build()
+ MockImeSession.create(context).use { session ->
+ MockSpellCheckerClient.create(context, configuration).use { client ->
+ val (_, editText) = startTestActivity()
+ CtsTouchUtils.emulateTapOnViewCenter(instrumentation, null, editText)
+ waitOnMainUntil({ editText.hasFocus() }, TIMEOUT)
+ InputMethodVisibilityVerifier.expectImeVisible(TIMEOUT)
+ session.callCommitText("Preceding text", 1)
+ session.callCommitText("?", 1)
+ waitOnMainUntil({
+ findSuggestionSpanWithFlags(editText, FLAG_GRAMMAR_ERROR) != null
+ }, TIMEOUT)
+ // The next spell check only contains the text after "Preceding text?". According
+ // to our configuration, the sentence "match?" will be marked as FLAG_MISSPELLED.
+ session.callCommitText("match", 1)
+ session.callCommitText("?", 1)
+ waitOnMainUntil({
+ findSuggestionSpanWithFlags(editText, FLAG_MISSPELLED) != null
+ }, TIMEOUT)
+ }
+ }
}
private fun findSuggestionSpanWithFlags(editText: EditText, flags: Int): SuggestionSpan? =
@@ -280,4 +477,66 @@
}
return Pair(activity, editText!!)
}
-}
\ No newline at end of file
+
+ private fun getCurrentInputMethodInfo(): InputMethodInfo {
+ val curId = Settings.Secure.getString(context.getContentResolver(),
+ Settings.Secure.DEFAULT_INPUT_METHOD)
+ val imm = context.getSystemService(InputMethodManager::class.java)
+ val info = imm?.inputMethodList?.find { it.id == curId }
+ assertThat(info).isNotNull()
+ return info!!
+ }
+
+ private fun getSentenceSuggestions(
+ session: SpellCheckerSession,
+ listener: FakeSpellCheckerSessionListener,
+ text: String
+ ): Array<SentenceSuggestionsInfo>? {
+ val prevSize = listener.getSentenceSuggestionsResults.size
+ session.getSentenceSuggestions(arrayOf(TextInfo(text)), SUGGESTIONS_MAX_SIZE)
+ waitOnMainUntil({
+ listener.getSentenceSuggestionsResults.size == prevSize + 1
+ }, TIMEOUT)
+ return listener.getSentenceSuggestionsResults[prevSize]
+ }
+
+ private inner class ImeSession(val imeId: String) : AutoCloseable {
+
+ init {
+ uiAutomation.executeShellCommand("ime enable $imeId")
+ uiAutomation.executeShellCommand("ime set $imeId")
+ PollingCheck.check("Make sure that $imeId is selected", TIMEOUT) {
+ getCurrentInputMethodInfo().id == imeId
+ }
+ }
+
+ override fun close() {
+ uiAutomation.executeShellCommand("ime reset")
+ }
+ }
+
+ private class FakeSpellCheckerSessionListener :
+ SpellCheckerSession.SpellCheckerSessionListener {
+ val getSentenceSuggestionsResults = ArrayList<Array<SentenceSuggestionsInfo>?>()
+ val getSentenceSuggestionsCallingThreads = ArrayList<Thread>()
+
+ override fun onGetSuggestions(results: Array<SuggestionsInfo>?) {
+ fail("Not expected")
+ }
+
+ override fun onGetSentenceSuggestions(results: Array<SentenceSuggestionsInfo>?) {
+ getSentenceSuggestionsResults.add(results)
+ getSentenceSuggestionsCallingThreads.add(Thread.currentThread())
+ }
+ }
+
+ private class FakeExecutor : Executor {
+ @get:Synchronized
+ val runnables = ArrayList<Runnable>()
+
+ @Synchronized
+ override fun execute(r: Runnable) {
+ runnables.add(r)
+ }
+ }
+}
diff --git a/tests/jdwp/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java b/tests/jdwp/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
index 4546535..274da25 100644
--- a/tests/jdwp/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
+++ b/tests/jdwp/runner/host-side/src/com/android/compatibility/testtype/DalvikTest.java
@@ -17,7 +17,6 @@
package com.android.compatibility.testtype;
import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.ddmlib.IShellOutputReceiver;
import com.android.ddmlib.Log;
import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.MultiLineReceiver;
@@ -26,9 +25,13 @@
import com.android.tradefed.config.OptionCopier;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.invoker.TestInformation;
import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
+import com.android.tradefed.result.FailureDescription;
import com.android.tradefed.result.ITestInvocationListener;
import com.android.tradefed.result.TestDescription;
+import com.android.tradefed.result.proto.TestRecordProto.FailureStatus;
import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
@@ -52,9 +55,9 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
@@ -343,7 +346,7 @@
* {@inheritDoc}
*/
@Override
- public void run(final ITestInvocationListener listener) throws DeviceNotAvailableException {
+ public void run(final TestInformation testInfo, final ITestInvocationListener listener) throws DeviceNotAvailableException {
String abiName = mAbi.getName();
String bitness = AbiUtils.getBitness(abiName);
mIsAdbConnection = isAdbconnection(getDevice());
@@ -419,56 +422,14 @@
ArrayUtil.join(File.pathSeparator, mClasspath),
dalvikArgs, abiName, runnerArgs,
includeFilters, excludeFilters, includeFile, excludeFile, collectTestsOnlyString);
- IShellOutputReceiver receiver = new MultiLineReceiver() {
- private TestDescription test;
-
- @Override
- public boolean isCancelled() {
- return false;
- }
-
- @Override
- public void processNewLines(String[] lines) {
- for (String line : lines) {
- String[] parts = line.split(":", 2);
- String tag = parts[0];
- if (tag.equals(START_RUN)) {
- listener.testRunStarted(mRunName, Integer.parseInt(parts[1]));
- Log.logAndDisplay(LogLevel.INFO, TAG, command);
- } else if (tag.equals(END_RUN)) {
- listener.testRunEnded(Integer.parseInt(parts[1]),
- Collections.<String, String>emptyMap());
- } else if (tag.equals(START_TEST)) {
- test = getTestDescription(parts[1]);
- listener.testStarted(test);
- } else if (tag.equals(FAILURE)) {
- listener.testFailed(test, processSerializedValue(parts[1]));
- } else if (tag.equals(END_TEST)) {
- listener.testEnded(getTestDescription(parts[1]),
- Collections.<String, String>emptyMap());
- }
- // Always log the output for debugging
- CLog.d(line);
- }
- }
-
- private String processSerializedValue(String input) {
- // Opposite of stringify.
- return input.replace("^~^", "\n");
- }
-
- private TestDescription getTestDescription(String name) {
- String[] parts = name.split("#");
- String className = parts[0];
- String testName = "";
- if (parts.length > 1) {
- testName = parts[1];
- }
- return new TestDescription(className, testName);
- }
-
- };
- mDevice.executeShellCommand(command, receiver, mPerTestTimeout, TimeUnit.MINUTES, 1);
+ Log.logAndDisplay(LogLevel.INFO, TAG, command);
+ DalvikOutputParser receiver = new DalvikOutputParser(listener);
+ try {
+ mDevice.executeShellCommand(command, receiver, mPerTestTimeout, TimeUnit.MINUTES, 1);
+ } finally {
+ receiver.flush();
+ receiver.completeEvents();
+ }
}
/*
@@ -610,4 +571,77 @@
return null;
}
}
+
+ private class DalvikOutputParser extends MultiLineReceiver {
+
+ private final ITestInvocationListener mListener;
+ private TestDescription mTest;
+ private Long mStartTime;
+
+ public DalvikOutputParser(ITestInvocationListener listener) {
+ this.mListener = listener;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return false;
+ }
+
+ @Override
+ public void processNewLines(String[] lines) {
+ for (String line : lines) {
+ String[] parts = line.split(":", 2);
+ String tag = parts[0];
+ if (tag.equals(START_RUN)) {
+ mListener.testRunStarted(mRunName, Integer.parseInt(parts[1]));
+ mStartTime = System.currentTimeMillis();
+ } else if (tag.equals(END_RUN)) {
+ mListener.testRunEnded(Integer.parseInt(parts[1]),
+ Collections.<String, String>emptyMap());
+ mStartTime = null;
+ } else if (tag.equals(START_TEST)) {
+ mTest = getTestDescription(parts[1]);
+ mListener.testStarted(mTest);
+ } else if (tag.equals(FAILURE)) {
+ mListener.testFailed(mTest, processSerializedValue(parts[1]));
+ } else if (tag.equals(END_TEST)) {
+ mListener.testEnded(getTestDescription(parts[1]),
+ Collections.<String, String>emptyMap());
+ mTest = null;
+ }
+ // Always log the output for debugging
+ CLog.d(line);
+ }
+ }
+
+ private String processSerializedValue(String input) {
+ // Opposite of stringify.
+ return input.replace("^~^", "\n");
+ }
+
+ private TestDescription getTestDescription(String name) {
+ String[] parts = name.split("#");
+ String className = parts[0];
+ String testName = "";
+ if (parts.length > 1) {
+ testName = parts[1];
+ }
+ return new TestDescription(className, testName);
+ }
+
+ /**
+ * In case some inconsistent events are left, close them for proper reporting.
+ */
+ private void completeEvents() {
+ if (mTest != null) {
+ mListener.testFailed(mTest, "Test started but no end events received.");
+ mListener.testEnded(mTest, new HashMap<String, Metric>());
+ }
+ if (mStartTime != null) {
+ mListener.testRunFailed(
+ FailureDescription.create("Dalvik test session did not properly terminate.").setFailureStatus(FailureStatus.TEST_FAILURE));
+ mListener.testRunEnded(System.currentTimeMillis() - mStartTime, new HashMap<String, Metric>());
+ }
+ }
+ }
}
diff --git a/tests/location/location_fine/src/android/location/cts/fine/LocationManagerFineTest.java b/tests/location/location_fine/src/android/location/cts/fine/LocationManagerFineTest.java
index 5deb22b..e00fdf7 100644
--- a/tests/location/location_fine/src/android/location/cts/fine/LocationManagerFineTest.java
+++ b/tests/location/location_fine/src/android/location/cts/fine/LocationManagerFineTest.java
@@ -91,6 +91,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -1524,6 +1525,7 @@
mManager.setTestProviderEnabled(TEST_PROVIDER, true);
}
+ @Ignore("b/181693958")
@Test
public void testLocationAttributionTagBlaming() {
// No tag set
diff --git a/tests/location/location_fine/src/android/location/cts/fine/ScanningSettingsTest.java b/tests/location/location_fine/src/android/location/cts/fine/ScanningSettingsTest.java
index af4bb57..f915b87 100644
--- a/tests/location/location_fine/src/android/location/cts/fine/ScanningSettingsTest.java
+++ b/tests/location/location_fine/src/android/location/cts/fine/ScanningSettingsTest.java
@@ -63,7 +63,8 @@
private PackageManager mPackageManager;
@Override
- protected void setUp() {
+ protected void setUp() throws Exception {
+ super.setUp();
// Can't use assumeTrue / assumeFalse because this is not a junit test, and so doesn't
// support using these keywords to trigger assumption failure and skip test.
if (FeatureUtil.isTV() || FeatureUtil.isAutomotive() || FeatureUtil.isWatch()) {
@@ -86,7 +87,8 @@
if (FeatureUtil.isTV() || FeatureUtil.isAutomotive() || FeatureUtil.isWatch()) {
return;
}
- launchScanningSettings();
+ launchLocationServicesSettings();
+ launchScanningSettingsFragment(WIFI_SCANNING_TITLE_RES);
final Resources res = mPackageManager.getResourcesForApplication(SETTINGS_PACKAGE);
final int resId = res.getIdentifier(WIFI_SCANNING_TITLE_RES, "string", SETTINGS_PACKAGE);
@@ -118,12 +120,14 @@
if (FeatureUtil.isTV() || FeatureUtil.isAutomotive() || FeatureUtil.isWatch()) {
return;
}
- launchScanningSettings();
+ launchLocationServicesSettings();
+ launchScanningSettingsFragment(BLUETOOTH_SCANNING_TITLE_RES);
+
toggleSettingAndVerify(BLUETOOTH_SCANNING_TITLE_RES,
Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE);
}
- private void launchScanningSettings() {
+ private void launchLocationServicesSettings() {
// Start from the home screen
mDevice.pressHome();
mDevice.wait(Until.hasObject(By.pkg(mLauncherPackage).depth(0)), TIMEOUT);
@@ -137,6 +141,18 @@
mDevice.wait(Until.hasObject(By.pkg(SETTINGS_PACKAGE).depth(0)), TIMEOUT);
}
+ private void launchScanningSettingsFragment(String name)
+ throws PackageManager.NameNotFoundException {
+ final Resources res = mPackageManager.getResourcesForApplication(SETTINGS_PACKAGE);
+ int resId = res.getIdentifier(name, "string", SETTINGS_PACKAGE);
+ UiObject2 pref = mDevice.findObject(By.text(res.getString(resId)));
+ // Click the preference to show the Scanning fragment
+ pref.click();
+
+ // Wait for the Scanning fragment to appear
+ mDevice.wait(Until.hasObject(By.pkg(SETTINGS_PACKAGE).depth(1)), TIMEOUT);
+ }
+
private void clickAndWaitForSettingChange(UiObject2 pref, ContentResolver resolver,
String settingKey) {
final CountDownLatch latch = new CountDownLatch(1);
diff --git a/tests/media/jni/NativeCodecEncoderSurfaceTest.cpp b/tests/media/jni/NativeCodecEncoderSurfaceTest.cpp
index 012a592..b8825bc 100644
--- a/tests/media/jni/NativeCodecEncoderSurfaceTest.cpp
+++ b/tests/media/jni/NativeCodecEncoderSurfaceTest.cpp
@@ -28,7 +28,6 @@
class CodecEncoderSurfaceTest {
private:
- const long kQDeQTimeOutUs = 5000;
const char* mMime;
ANativeWindow* mWindow;
AMediaExtractor* mExtractor;
@@ -322,8 +321,8 @@
}
}
} else {
- if (retry > 10) return false;
- usleep(timeOutUs);
+ if (retry > kRetryLimit) return false;
+ usleep(kQDeQTimeOutUs);
retry ++;
}
}
diff --git a/tests/media/jni/NativeCodecTestBase.h b/tests/media/jni/NativeCodecTestBase.h
index c950d86..fca570b 100644
--- a/tests/media/jni/NativeCodecTestBase.h
+++ b/tests/media/jni/NativeCodecTestBase.h
@@ -124,7 +124,6 @@
class CodecTestBase {
protected:
- const long kQDeQTimeOutUs = 5000;
const char* mMime;
bool mIsAudio;
CodecAsyncHandler mAsyncHandle;
diff --git a/tests/media/jni/NativeMediaCommon.cpp b/tests/media/jni/NativeMediaCommon.cpp
index 90540e0..6d87084 100644
--- a/tests/media/jni/NativeMediaCommon.cpp
+++ b/tests/media/jni/NativeMediaCommon.cpp
@@ -46,6 +46,10 @@
const char* TBD_AMEDIACODEC_PARAMETER_KEY_MAX_B_FRAMES = "max-bframes";
const char* TBD_AMEDIAFORMAT_KEY_BIT_RATE_MODE = "bitrate-mode";
+// NDK counterpart of Q_DEQ_TIMEOUT_US and RETRY_LIMIT of CodecTestBase class
+const long kQDeQTimeOutUs = 5000; // block at most 5ms while looking for io buffers
+const int kRetryLimit = 100; // max poll counter before test aborts and returns error
+
bool isCSDIdentical(AMediaFormat* refFormat, AMediaFormat* testFormat) {
for (int i = 0;; i++) {
std::pair<void*, size_t> refCsd;
diff --git a/tests/media/jni/NativeMediaCommon.h b/tests/media/jni/NativeMediaCommon.h
index b74eb17..9db5af0 100644
--- a/tests/media/jni/NativeMediaCommon.h
+++ b/tests/media/jni/NativeMediaCommon.h
@@ -35,6 +35,9 @@
extern const char* AMEDIA_MIMETYPE_AUDIO_VORBIS;
extern const char* AMEDIA_MIMETYPE_AUDIO_OPUS;
+extern const long kQDeQTimeOutUs;
+extern const int kRetryLimit;
+
// TODO(b/146420990)
typedef enum {
OUTPUT_FORMAT_START = 0,
diff --git a/tests/media/src/android/mediav2/cts/AdaptivePlaybackTest.java b/tests/media/src/android/mediav2/cts/AdaptivePlaybackTest.java
new file mode 100644
index 0000000..f95fa54
--- /dev/null
+++ b/tests/media/src/android/mediav2/cts/AdaptivePlaybackTest.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.mediav2.cts;
+
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import static org.junit.Assert.fail;
+
+@RunWith(Parameterized.class)
+public class AdaptivePlaybackTest extends CodecDecoderTestBase {
+ private final String mMime;
+ private final String[] mSrcFiles;
+ private final int mSupport;
+
+ private long mMaxPts = 0;
+
+ public AdaptivePlaybackTest(String mime, String[] srcFiles, int support) {
+ super(mime, null);
+ mMime = mime;
+ mSrcFiles = srcFiles;
+ mSupport = support;
+ }
+
+ @Rule
+ public ActivityTestRule<CodecTestActivity> mActivityRule =
+ new ActivityTestRule<>(CodecTestActivity.class);
+
+ @Parameterized.Parameters(name = "{index}({0})")
+ public static Collection<Object[]> input() {
+ final boolean isEncoder = false;
+ final boolean needAudio = false;
+ final boolean needVideo = true;
+ // mime, array list of test files we'll play, codec should support adaptive feature
+ final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
+ {MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+ "bbb_800x640_768kbps_30fps_avc_2b.mp4",
+ "bbb_800x640_768kbps_30fps_avc_nob.mp4",
+ "bbb_1280x720_1mbps_30fps_avc_2b.mp4",
+ "bbb_640x360_512kbps_30fps_avc_nob.mp4",
+ "bbb_1280x720_1mbps_30fps_avc_nob.mp4",
+ "bbb_640x360_512kbps_30fps_avc_2b.mp4",
+ "bbb_1280x720_1mbps_30fps_avc_nob.mp4",
+ "bbb_640x360_512kbps_30fps_avc_nob.mp4",
+ "bbb_640x360_512kbps_30fps_avc_2b.mp4"}, CODEC_ALL},
+ {MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+ "bbb_800x640_768kbps_30fps_hevc_2b.mp4",
+ "bbb_800x640_768kbps_30fps_hevc_nob.mp4",
+ "bbb_1280x720_1mbps_30fps_hevc_2b.mp4",
+ "bbb_640x360_512kbps_30fps_hevc_nob.mp4",
+ "bbb_1280x720_1mbps_30fps_hevc_nob.mp4",
+ "bbb_640x360_512kbps_30fps_hevc_2b.mp4",
+ "bbb_1280x720_1mbps_30fps_hevc_nob.mp4",
+ "bbb_640x360_512kbps_30fps_hevc_nob.mp4",
+ "bbb_640x360_512kbps_30fps_hevc_2b.mp4"}, CODEC_ALL},
+ {MediaFormat.MIMETYPE_VIDEO_VP8, new String[]{
+ "bbb_800x640_768kbps_30fps_vp8.webm",
+ "bbb_1280x720_1mbps_30fps_vp8.webm",
+ "bbb_640x360_512kbps_30fps_vp8.webm"}, CODEC_ALL},
+ {MediaFormat.MIMETYPE_VIDEO_VP9, new String[]{
+ "bbb_800x640_768kbps_30fps_vp9.webm",
+ "bbb_1280x720_1mbps_30fps_vp9.webm",
+ "bbb_640x360_512kbps_30fps_vp9.webm"}, CODEC_ALL},
+ {MediaFormat.MIMETYPE_VIDEO_MPEG4, new String[]{
+ "bbb_128x96_64kbps_12fps_mpeg4.mp4",
+ "bbb_176x144_192kbps_15fps_mpeg4.mp4",
+ "bbb_128x96_64kbps_12fps_mpeg4.mp4"}, CODEC_ALL},
+ {MediaFormat.MIMETYPE_VIDEO_AV1, new String[]{
+ "bbb_800x640_768kbps_30fps_av1.webm",
+ "bbb_1280x720_1mbps_30fps_av1.webm",
+ "bbb_640x360_512kbps_30fps_av1.webm"}, CODEC_ALL},
+ {MediaFormat.MIMETYPE_VIDEO_MPEG2, new String[]{
+ "bbb_800x640_768kbps_30fps_mpeg2_2b.mp4",
+ "bbb_800x640_768kbps_30fps_mpeg2_nob.mp4",
+ "bbb_1280x720_1mbps_30fps_mpeg2_2b.mp4",
+ "bbb_640x360_512kbps_30fps_mpeg2_nob.mp4",
+ "bbb_1280x720_1mbps_30fps_mpeg2_nob.mp4",
+ "bbb_640x360_512kbps_30fps_mpeg2_2b.mp4",
+ "bbb_1280x720_1mbps_30fps_mpeg2_nob.mp4",
+ "bbb_640x360_512kbps_30fps_mpeg2_nob.mp4",
+ "bbb_640x360_512kbps_30fps_mpeg2_2b.mp4"}, CODEC_ALL},
+ });
+ return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
+ }
+
+ @Override
+ void dequeueOutput(int bufferIndex, MediaCodec.BufferInfo info) {
+ if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+ mSawOutputEOS = true;
+ }
+ if (info.size > 0 && (info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0) {
+ mOutputBuff.saveOutPTS(info.presentationTimeUs);
+ mOutputCount++;
+ }
+ mCodec.releaseOutputBuffer(bufferIndex, mSurface != null);
+ }
+
+ private MediaFormat createInputList(MediaFormat format, ByteBuffer buffer,
+ ArrayList<MediaCodec.BufferInfo> list, int offset, long ptsOffset) {
+ if (hasCSD(format)) {
+ MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
+ bufferInfo.offset = offset;
+ bufferInfo.size = 0;
+ bufferInfo.presentationTimeUs = 0;
+ bufferInfo.flags = MediaCodec.BUFFER_FLAG_CODEC_CONFIG;
+ for (int i = 0; ; i++) {
+ String csdKey = "csd-" + i;
+ if (format.containsKey(csdKey)) {
+ ByteBuffer csdBuffer = format.getByteBuffer(csdKey);
+ bufferInfo.size += csdBuffer.limit();
+ buffer.put(csdBuffer);
+ format.removeKey(csdKey);
+ } else break;
+ }
+ list.add(bufferInfo);
+ offset += bufferInfo.size;
+ }
+ while (true) {
+ MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
+ bufferInfo.size = mExtractor.readSampleData(buffer, offset);
+ if (bufferInfo.size < 0) break;
+ bufferInfo.offset = offset;
+ bufferInfo.presentationTimeUs = ptsOffset + mExtractor.getSampleTime();
+ mMaxPts = Math.max(mMaxPts, bufferInfo.presentationTimeUs);
+ int flags = mExtractor.getSampleFlags();
+ bufferInfo.flags = 0;
+ if ((flags & MediaExtractor.SAMPLE_FLAG_SYNC) != 0) {
+ bufferInfo.flags |= MediaCodec.BUFFER_FLAG_KEY_FRAME;
+ }
+ list.add(bufferInfo);
+ mExtractor.advance();
+ offset += bufferInfo.size;
+ }
+ buffer.clear();
+ buffer.position(offset);
+ return format;
+ }
+
+ @LargeTest
+ @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+ public void testAdaptivePlayback() throws IOException, InterruptedException {
+ CodecTestActivity activity = mActivityRule.getActivity();
+ setUpSurface(activity);
+ ArrayList<MediaFormat> formats = new ArrayList<>();
+ if (mSupport != CODEC_ALL) {
+ formats = new ArrayList<>();
+ for (String file : mSrcFiles) {
+ formats.add(setUpSource(file));
+ mExtractor.release();
+ }
+ }
+ ArrayList<String> listOfDecoders = selectCodecs(mMime, formats,
+ new String[]{MediaCodecInfo.CodecCapabilities.FEATURE_AdaptivePlayback}, false);
+ if (listOfDecoders.isEmpty()) {
+ tearDownSurface();
+ if (mSupport == CODEC_OPTIONAL) return;
+ else fail("no suitable codecs found for mime: " + mMime);
+ }
+ formats.clear();
+ int totalSize = 0;
+ for (String srcFile : mSrcFiles) {
+ File file = new File(mInpPrefix + srcFile);
+ totalSize += (int) file.length();
+ }
+ totalSize <<= 1;
+ long ptsOffset = 0;
+ int buffOffset = 0;
+ ArrayList<MediaCodec.BufferInfo> list = new ArrayList<>();
+ ByteBuffer buffer = ByteBuffer.allocate(totalSize);
+ for (String file : mSrcFiles) {
+ formats.add(createInputList(setUpSource(file), buffer, list, buffOffset, ptsOffset));
+ mExtractor.release();
+ ptsOffset = mMaxPts + 1000000L;
+ buffOffset = (list.get(list.size() - 1).offset) + (list.get(list.size() - 1).size);
+ }
+ boolean[] boolStates = {false, true};
+ mOutputBuff = new OutputManager();
+ for (String decoder : listOfDecoders) {
+ mCodec = MediaCodec.createByCodecName(decoder);
+ MediaFormat format = formats.get(0);
+ activity.setScreenParams(getWidth(format), getHeight(format), true);
+ for (boolean isAsync : boolStates) {
+ mOutputBuff.reset();
+ configureCodec(format, isAsync, false, false);
+ mCodec.start();
+ doWork(buffer, list);
+ queueEOS();
+ waitForAllOutputs();
+ mCodec.reset();
+ }
+ }
+ tearDownSurface();
+ }
+}
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderValidationTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderValidationTest.java
index ba2a3ea..42fad3c 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderValidationTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderValidationTest.java
@@ -107,6 +107,20 @@
".webm"}, null, -1.0f, 156928091L, CODEC_ALL},
{MediaFormat.MIMETYPE_VIDEO_VP9, new String[]{"bbb_1280x720_2000kbps_30fps_vp9" +
".webm"}, null, -1.0f, 3902485256L, CODEC_ALL},
+ {MediaFormat.MIMETYPE_VIDEO_MPEG2, new String[]{
+ "bbb_642x642_2mbps_30fps_mpeg2.mp4"}, null, -1.0f, -1L, CODEC_ANY},
+ {MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+ "bbb_642x642_1mbps_30fps_avc.mp4"}, null, -1.0f, 3947092788L, CODEC_ANY},
+ {MediaFormat.MIMETYPE_VIDEO_VP8, new String[]{
+ "bbb_642x642_1mbps_30fps_vp8.webm"}, null, -1.0f, 516982978L, CODEC_ANY},
+ {MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+ "bbb_642x642_768kbps_30fps_hevc.mp4"}, null, -1.0f, 3018465268L, CODEC_ANY},
+ {MediaFormat.MIMETYPE_VIDEO_VP9, new String[]{
+ "bbb_642x642_768kbps_30fps_vp9.webm"}, null, -1.0f, 4032809269L, CODEC_ANY},
+ {MediaFormat.MIMETYPE_VIDEO_AV1, new String[]{
+ "bbb_642x642_768kbps_30fps_av1.mp4"}, null, -1.0f, 3684481474L, CODEC_ANY},
+ {MediaFormat.MIMETYPE_VIDEO_MPEG4, new String[]{
+ "bbb_130x130_192kbps_15fps_mpeg4.mp4"}, null, -1.0f, -1L, CODEC_ANY},
});
return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
}
diff --git a/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java b/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
index 7ef5713..8a578f7 100644
--- a/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
@@ -273,9 +273,11 @@
return;
}
} else {
- if (retry > 10) throw new InterruptedException(
- "did not receive output format changed for encoder");
- Thread.sleep(timeOutUs / 1000);
+ if (retry > CodecTestBase.RETRY_LIMIT) throw new InterruptedException(
+ "did not receive output format changed for encoder after " +
+ CodecTestBase.Q_DEQ_TIMEOUT_US * CodecTestBase.RETRY_LIMIT +
+ " us");
+ Thread.sleep(CodecTestBase.Q_DEQ_TIMEOUT_US / 1000);
retry ++;
}
}
diff --git a/tests/media/src/android/mediav2/cts/CodecTestBase.java b/tests/media/src/android/mediav2/cts/CodecTestBase.java
index 720e7d3..795ff91 100644
--- a/tests/media/src/android/mediav2/cts/CodecTestBase.java
+++ b/tests/media/src/android/mediav2/cts/CodecTestBase.java
@@ -510,11 +510,13 @@
static final boolean ENABLE_LOGS = false;
static final int PER_TEST_TIMEOUT_LARGE_TEST_MS = 300000;
static final int PER_TEST_TIMEOUT_SMALL_TEST_MS = 60000;
- static final long Q_DEQ_TIMEOUT_US = 5000;
static final int UNSPECIFIED = 0;
static final int CODEC_ALL = 0; // All codecs should support
static final int CODEC_ANY = 1; // Atleast one codec should support
static final int CODEC_OPTIONAL = 2; // Codec support is optional
+ // Maintain Timeouts in sync with their counterpart in NativeMediaCommon.h
+ static final long Q_DEQ_TIMEOUT_US = 5000; // block at most 5ms while looking for io buffers
+ static final int RETRY_LIMIT = 100; // max poll counter before test aborts and returns error
static final String mInpPrefix = WorkDir.getMediaDirString();
static final PackageManager pm =
InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
diff --git a/tests/mediapc/Android.bp b/tests/mediapc/Android.bp
new file mode 100644
index 0000000..5230413
--- /dev/null
+++ b/tests/mediapc/Android.bp
@@ -0,0 +1,37 @@
+// 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.
+
+android_test {
+ name: "CtsMediaPerformanceClassTestCases",
+ defaults: ["cts_defaults"],
+ compile_multilib: "both",
+ static_libs: [
+ "compatibility-device-util-axt",
+ "ctstestrunner-axt",
+ "ctstestserver",
+ ],
+ libs: [
+ "org.apache.http.legacy",
+ "android.test.runner",
+ "android.test.base",
+ ],
+ platform_apis: true,
+ srcs: ["src/**/*.java"],
+ // Tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+ min_sdk_version: "30",
+}
diff --git a/tests/mediapc/AndroidManifest.xml b/tests/mediapc/AndroidManifest.xml
new file mode 100644
index 0000000..5f47d2b
--- /dev/null
+++ b/tests/mediapc/AndroidManifest.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.mediapc.cts">
+
+ <!--uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /-->
+ <!--uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /-->
+
+ <application
+ android:requestLegacyExternalStorage="true"
+ android:usesCleartextTraffic="true">
+ <uses-library android:name="android.test.runner" />
+ <uses-library android:name="org.apache.http.legacy" />
+ <activity android:name="android.mediapc.cts.TestActivity" />
+ </application>
+ <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="30" />
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="android.mediapc.cts"
+ android:label="CTS MediaPerformanceClass tests of android.media" >
+ <meta-data
+ android:name="listener"
+ android:value="com.android.cts.runner.CtsTestRunListener" />
+ </instrumentation>
+</manifest>
diff --git a/tests/mediapc/OWNERS b/tests/mediapc/OWNERS
new file mode 100644
index 0000000..091c4df
--- /dev/null
+++ b/tests/mediapc/OWNERS
@@ -0,0 +1,14 @@
+# Bug component: 1344
+# include media developers and framework video team
+include platform/frameworks/av:/media/OWNERS
+chz@google.com
+dichenzhang@google.com
+essick@google.com
+gokrishnan@google.com
+lajos@google.com
+taklee@google.com
+wonsik@google.com
+
+# LON
+olly@google.com
+andrewlewis@google.com
diff --git a/tests/mediapc/res/layout/media_decoder_surface_layout.xml b/tests/mediapc/res/layout/media_decoder_surface_layout.xml
new file mode 100644
index 0000000..bff09bb
--- /dev/null
+++ b/tests/mediapc/res/layout/media_decoder_surface_layout.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * Copyright (C) 2020 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ <SurfaceView android:id="@+id/surface"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ </SurfaceView>
+</LinearLayout>
diff --git a/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java b/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
new file mode 100644
index 0000000..f7cd97f
--- /dev/null
+++ b/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.mediapc.cts;
+
+import android.os.Build;
+import android.content.pm.PackageManager;
+import android.util.Log;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Test;
+import org.junit.experimental.runners.Enclosed;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests the basic aspects of the media performance class.
+ */
+public class PerformanceClassTest {
+ private static final String TAG = "PerformanceClassTest";
+
+ private boolean isHandheld() {
+ // handheld nature is not exposed to package manager, for now
+ // we check for touchscreen and NOT watch and NOT tv
+ PackageManager pm =
+ InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
+ return pm.hasSystemFeature(pm.FEATURE_TOUCHSCREEN)
+ && !pm.hasSystemFeature(pm.FEATURE_WATCH)
+ && !pm.hasSystemFeature(pm.FEATURE_TELEVISION)
+ && !pm.hasSystemFeature(pm.FEATURE_AUTOMOTIVE);
+ }
+
+ @SmallTest
+ @Test
+ public void testMediaPerformanceClass() throws Exception {
+ int pc = Build.VERSION.MEDIA_PERFORMANCE_CLASS;
+
+ Log.d(TAG, "performance class is " + pc);
+
+ // if device is not of a performance class, we are done.
+ if (pc == 0) {
+ return;
+ }
+
+ if (pc == Build.VERSION_CODES.R + 1 /* TODO: make this S */) {
+ }
+ }
+
+ // Tests S specific basic requirements
+ private void testS() throws Exception {
+ assertTrue("performance class is only defined for Handheld devices",
+ isHandheld());
+
+ // TODO: add more tests
+ }
+}
+
diff --git a/tests/mediapc/src/android/mediapc/cts/TestActivity.java b/tests/mediapc/src/android/mediapc/cts/TestActivity.java
new file mode 100644
index 0000000..bd93df0
--- /dev/null
+++ b/tests/mediapc/src/android/mediapc/cts/TestActivity.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.mediapc.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.ViewGroup;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class TestActivity extends Activity implements SurfaceHolder.Callback {
+ private static final String LOG_TAG = TestActivity.class.getSimpleName();
+ private SurfaceView mSurfaceView;
+ private SurfaceHolder mHolder;
+ private Surface mSurface;
+ private final Lock mLock = new ReentrantLock();
+ private final Condition mCondition = mLock.newCondition();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.media_decoder_surface_layout);
+ mSurfaceView = findViewById(R.id.surface);
+ mHolder = mSurfaceView.getHolder();
+ mHolder.addCallback(this);
+ }
+
+ @Override
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.v(LOG_TAG, "surface created");
+ mLock.lock();
+ mSurface = mHolder.getSurface();
+ mLock.unlock();
+ }
+
+ @Override
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ Log.v(LOG_TAG, "surface changed " + format + " " + width + " " + height);
+ }
+
+ @Override
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.v(LOG_TAG, "surface deleted");
+ mLock.lock();
+ mSurface = null;
+ mLock.unlock();
+ }
+
+ public void waitTillSurfaceIsCreated() throws InterruptedException {
+ final long mWaitTimeMs = 1000;
+ final int retries = 3;
+ mLock.lock();
+ final long start = SystemClock.elapsedRealtime();
+ while ((SystemClock.elapsedRealtime() - start) < (retries * mWaitTimeMs) &&
+ mSurface == null) {
+ mCondition.await(mWaitTimeMs, TimeUnit.MILLISECONDS);
+ }
+ mLock.unlock();
+ if (mSurface == null) {
+ throw new InterruptedException("Taking too long to attach a SurfaceView to a window.");
+ }
+ }
+
+ public Surface getSurface() {
+ return mSurface;
+ }
+
+ public void setScreenParams(int width, int height, boolean noStretch) {
+ ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();
+ final DisplayMetrics dm = getResources().getDisplayMetrics();
+ if (noStretch && width <= dm.widthPixels && height <= dm.heightPixels) {
+ lp.width = width;
+ lp.height = height;
+ } else {
+ int a = dm.widthPixels * height / width;
+ if (a <= dm.heightPixels) {
+ lp.width = dm.widthPixels;
+ lp.height = a;
+ } else {
+ lp.width = dm.heightPixels * width / height;
+ lp.height = dm.heightPixels;
+ }
+ }
+ runOnUiThread(() -> mSurfaceView.setLayoutParams(lp));
+ }
+}
diff --git a/tests/musicrecognition/Android.bp b/tests/musicrecognition/Android.bp
index 39b8826..1b7298a 100644
--- a/tests/musicrecognition/Android.bp
+++ b/tests/musicrecognition/Android.bp
@@ -25,7 +25,6 @@
"ctstestrunner-axt",
"truth-prebuilt",
],
- sdk_version: "system_current",
srcs: ["src/**/*.java"],
// Tag this module as a cts test artifact
test_suites: [
diff --git a/tests/musicrecognition/AndroidManifest.xml b/tests/musicrecognition/AndroidManifest.xml
index c4b6df2..7734a9b 100644
--- a/tests/musicrecognition/AndroidManifest.xml
+++ b/tests/musicrecognition/AndroidManifest.xml
@@ -21,6 +21,16 @@
<uses-permission android:name="android.permission.MANAGE_MUSIC_RECOGNITION" />
+ <!-- Attribution for MusicRecognitionManagerService. -->
+ <attribution android:tag="MusicRecognitionManagerService"
+ android:label="@string/music_recognition_manager_service"/>
+
+ <!-- Attribution for CTS MusicRecognitionService. In this test, music recognition
+ manager and service are in the same process. Otherwise this tag needs to exist
+ in a separate manifest file (in the app implementing MusicRecognitionService). -->
+ <attribution android:tag="CtsMusicRecognitionAttributionTag"
+ android:label="@string/cts_music_recognition_service"/>
+
<application>
<uses-library android:name="android.test.runner"/>
diff --git a/tests/musicrecognition/res/values/strings.xml b/tests/musicrecognition/res/values/strings.xml
new file mode 100644
index 0000000..44f6432
--- /dev/null
+++ b/tests/musicrecognition/res/values/strings.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
+ <!-- Attribution for MusicRecognitionManagerService. [CHAR LIMIT=NONE]-->
+ <string name="music_recognition_manager_service">Music Recognition Manager Service</string>
+ <!-- Attribution for CtsMusicRecognitionService. [CHAR LIMIT=NONE]-->
+ <string name="cts_music_recognition_service">CTS Music Recognition Service</string>
+</resources>
diff --git a/tests/musicrecognition/src/android/musicrecognition/cts/CtsMusicRecognitionService.java b/tests/musicrecognition/src/android/musicrecognition/cts/CtsMusicRecognitionService.java
index f8ebaac..4813005 100644
--- a/tests/musicrecognition/src/android/musicrecognition/cts/CtsMusicRecognitionService.java
+++ b/tests/musicrecognition/src/android/musicrecognition/cts/CtsMusicRecognitionService.java
@@ -27,6 +27,7 @@
import android.util.Log;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.google.common.io.ByteStreams;
@@ -63,6 +64,11 @@
}
}
+ @Override
+ public @Nullable String getAttributionTag() {
+ return "CtsMusicRecognitionAttributionTag";
+ }
+
private byte[] readStream(ParcelFileDescriptor stream) {
ParcelFileDescriptor.AutoCloseInputStream fis =
new ParcelFileDescriptor.AutoCloseInputStream(stream);
diff --git a/tests/musicrecognition/src/android/musicrecognition/cts/MusicRecognitionManagerTest.java b/tests/musicrecognition/src/android/musicrecognition/cts/MusicRecognitionManagerTest.java
index 9a9ed7b..6c92f79 100644
--- a/tests/musicrecognition/src/android/musicrecognition/cts/MusicRecognitionManagerTest.java
+++ b/tests/musicrecognition/src/android/musicrecognition/cts/MusicRecognitionManagerTest.java
@@ -37,6 +37,8 @@
import static org.mockito.Mockito.verify;
import android.app.AppOpsManager;
+import android.app.AppOpsManager.OnOpStartedListener;
+
import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioFormat;
@@ -76,7 +78,7 @@
public class MusicRecognitionManagerTest {
private static final String TAG = MusicRecognitionManagerTest.class.getSimpleName();
private static final long VERIFY_TIMEOUT_MS = 40_000;
- private static final long VERIFY_APPOP_CHANGE_TIMEOUT_MS = 2000;
+ private static final long VERIFY_APPOP_CHANGE_TIMEOUT_MS = 10000;
@Rule public TestName mTestName = new TestName();
@Rule
@@ -187,16 +189,26 @@
final String packageName = CtsMusicRecognitionService.SERVICE_PACKAGE;
final int uid = Process.myUid();
- final AppOpsManager appOpsManager = getInstrumentation().getContext()
- .getSystemService(AppOpsManager.class);
+
+ final Context context = getInstrumentation().getContext();
+
+ final AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
final AppOpsManager.OnOpActiveChangedListener listener = mock(
AppOpsManager.OnOpActiveChangedListener.class);
+
// Assert the app op is not started
assertFalse(appOpsManager.isOpActive(AppOpsManager.OPSTR_RECORD_AUDIO, uid, packageName));
// Start watching for record audio op
appOpsManager.startWatchingActive(new String[] { AppOpsManager.OPSTR_RECORD_AUDIO },
- getInstrumentation().getContext().getMainExecutor(), listener);
+ context.getMainExecutor(), listener);
+
+ // Started listener used just for verifying attribution tag.
+ final AppOpsManager.OnOpStartedListener startedListener = mock(
+ AppOpsManager.OnOpStartedListener.class);
+
+ appOpsManager.startWatchingStarted(new int[] { AppOpsManager.OP_RECORD_AUDIO },
+ startedListener);
// Invoke API
RecognitionRequest request = invokeMusicRecognitionApi();
@@ -206,6 +218,11 @@
.only()).onOpActiveChanged(eq(AppOpsManager.OPSTR_RECORD_AUDIO),
eq(uid), eq(packageName), eq(true));
+ String expectedAttributionTag = "CtsMusicRecognitionAttributionTag";
+ verify(startedListener, timeout(VERIFY_APPOP_CHANGE_TIMEOUT_MS)
+ .only()).onOpStarted(eq(AppOpsManager.OP_RECORD_AUDIO),
+ eq(uid), eq(packageName), eq(expectedAttributionTag), anyInt(), anyInt());
+
// Wait for streaming to finish.
reset(listener);
try {
@@ -234,6 +251,8 @@
private RecognitionRequest invokeMusicRecognitionApi() {
+ Log.d(TAG, "Invoking service.");
+
AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.MIC, 16_000,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, 256_000);
@@ -251,6 +270,7 @@
request,
MoreExecutors.directExecutor(),
mCallback);
+ Log.d(TAG, "Invoking service done.");
return request;
}
diff --git a/tests/sensor/sensorratepermission/DebuggableAPI31/src/android/sensorratepermission/cts/debuggableapi31/DebuggableAPI31Test.java b/tests/sensor/sensorratepermission/DebuggableAPI31/src/android/sensorratepermission/cts/debuggableapi31/DebuggableAPI31Test.java
index 2f92157..e501f0c 100644
--- a/tests/sensor/sensorratepermission/DebuggableAPI31/src/android/sensorratepermission/cts/debuggableapi31/DebuggableAPI31Test.java
+++ b/tests/sensor/sensorratepermission/DebuggableAPI31/src/android/sensorratepermission/cts/debuggableapi31/DebuggableAPI31Test.java
@@ -107,6 +107,7 @@
| HardwareBuffer.USAGE_SENSOR_DIRECT_DATA);
SensorDirectChannel channel = mSensorManager.createDirectChannel(hardwareBuffer);
channel.configure(s, rateLevel);
+ hardwareBuffer.close();
fail("Should have thrown a SecurityException");
} catch (SecurityException e) {
// Expected
diff --git a/tests/sensor/sensorratepermission/DirectReportAPI30/src/android/sensorratepermission/cts/directreportapi30/DirectReportAPI30Test.java b/tests/sensor/sensorratepermission/DirectReportAPI30/src/android/sensorratepermission/cts/directreportapi30/DirectReportAPI30Test.java
index b97a2cc..f294fc2 100644
--- a/tests/sensor/sensorratepermission/DirectReportAPI30/src/android/sensorratepermission/cts/directreportapi30/DirectReportAPI30Test.java
+++ b/tests/sensor/sensorratepermission/DirectReportAPI30/src/android/sensorratepermission/cts/directreportapi30/DirectReportAPI30Test.java
@@ -171,6 +171,7 @@
mDirectReportTestHelper.readEventsFromHardwareBuffer(token,
hardwareBuffer, sensorEventCount);
channel.close();
+ hardwareBuffer.close();
// Check the sampling rates when the mic toggle were on and off
double rateWhenMicToggleOn =
diff --git a/tests/sensor/src/android/hardware/cts/helpers/SensorRatePermissionDirectReportTestHelper.java b/tests/sensor/src/android/hardware/cts/helpers/SensorRatePermissionDirectReportTestHelper.java
index e0289fe..d39c5a5 100644
--- a/tests/sensor/src/android/hardware/cts/helpers/SensorRatePermissionDirectReportTestHelper.java
+++ b/tests/sensor/src/android/hardware/cts/helpers/SensorRatePermissionDirectReportTestHelper.java
@@ -53,8 +53,7 @@
Sensor.TYPE_MAGNETIC_FIELD,
Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED
);
- // Use same parameters like in all other tests in this sensor module
- public static final int TEST_RUN_TIME_PERIOD_MILLISEC = 5000; // 1024 * 5 ms
+ public static final int TEST_RUN_TIME_PERIOD_MILLISEC = 1000;
public static final int SENSORS_EVENT_SIZE = 104;
static {
@@ -155,7 +154,7 @@
*/
public List<SensorDirectReportTest.DirectReportSensorEvent> getSensorEvents(int rateLevel)
throws InterruptedException {
- int sensorEventCount = 10240; // 800 Hz * 5s + extra
+ int sensorEventCount = 2000; // 800 Hz * 2.2 * 1s + extra
int sharedMemorySize = sensorEventCount * SENSORS_EVENT_SIZE;
HardwareBuffer hardwareBuffer = HardwareBuffer.create(
sharedMemorySize, 1, HardwareBuffer.BLOB, 1,
@@ -169,6 +168,7 @@
List<SensorDirectReportTest.DirectReportSensorEvent> events =
readEventsFromHardwareBuffer(token, hardwareBuffer, sensorEventCount);
channel.close();
+ hardwareBuffer.close();
return events;
}
diff --git a/tests/signature/TEST_MAPPING b/tests/signature/TEST_MAPPING
index d8f5985..183d131 100644
--- a/tests/signature/TEST_MAPPING
+++ b/tests/signature/TEST_MAPPING
@@ -35,10 +35,6 @@
},
{
"name": "CtsSharedLibsApiSignatureTestCases"
- },
- {
- "name": "signature-host-tests",
- "host" : true
}
],
"postsubmit": [
diff --git a/tests/signature/tests/Android.bp b/tests/signature/tests/Android.bp
index 0269746..1359b8e 100644
--- a/tests/signature/tests/Android.bp
+++ b/tests/signature/tests/Android.bp
@@ -23,5 +23,4 @@
"junit",
"signature-hostside",
],
- test_suites: ["general-tests"],
}
diff --git a/tests/signature/tests/AndroidTest.xml b/tests/signature/tests/AndroidTest.xml
deleted file mode 100644
index dc776eb..0000000
--- a/tests/signature/tests/AndroidTest.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 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.
--->
-<!-- Note: This should not be necessary, as autogeneration should work.
- However, atest does not find the module without it. -->
-<configuration description="Runs signature host tests">
- <option name="test-suite-tag" value="apct" />
- <option name="test-suite-tag" value="apct-junit" />
- <test class="com.android.tradefed.testtype.HostTest" >
- <option name="jar" value="signature-host-tests.jar" />
- </test>
-</configuration>
diff --git a/tests/signature/tests/run_unit_tests.sh b/tests/signature/tests/run_unit_tests.sh
deleted file mode 100755
index 63f0bc0..0000000
--- a/tests/signature/tests/run_unit_tests.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/bin/bash
-# Copyright (C) 2014 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.
-
-# helper script for running the signature unit tests
-
-checkFile() {
- if [ ! -f "$1" ]; then
- echo "Unable to locate $1"
- exit
- fi;
-}
-
-# check if in Android build env
-if [ ! -z ${ANDROID_BUILD_TOP} ]; then
- HOST=`uname`
- if [ "$HOST" == "Linux" ]; then
- OS="linux-x86"
- elif [ "$HOST" == "Darwin" ]; then
- OS="darwin-x86"
- else
- echo "Unrecognized OS"
- exit
- fi;
-fi;
-
-JAR_DIR=${ANDROID_BUILD_TOP}/out/host/$OS/framework
-JARS="tradefed.jar signature-host-tests.jar"
-
-for JAR in $JARS; do
- checkFile ${JAR_DIR}/${JAR}
- JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}
-done
-
-java $RDBG_FLAG \
- -cp ${JAR_PATH} com.android.tradefed.command.Console run singleCommand host -n --class android.signature.cts.tests.AllTests "$@"
-
diff --git a/tests/smartspace/Android.bp b/tests/smartspace/Android.bp
new file mode 100644
index 0000000..33b33c5
--- /dev/null
+++ b/tests/smartspace/Android.bp
@@ -0,0 +1,31 @@
+// Copyright (C) 2019 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.
+
+android_test {
+ name: "CtsSmartspaceServiceTestCases",
+ defaults: ["cts_defaults"],
+ static_libs: [
+ "androidx.annotation_annotation",
+ "compatibility-device-util-axt",
+ "ctstestrunner-axt",
+ "truth-prebuilt",
+ ],
+ srcs: ["src/**/*.java"],
+ // Tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+ sdk_version: "test_current",
+}
diff --git a/tests/smartspace/AndroidManifest.xml b/tests/smartspace/AndroidManifest.xml
new file mode 100644
index 0000000..4a0658d
--- /dev/null
+++ b/tests/smartspace/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2019 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.smartspace.cts"
+ android:targetSandboxVersion="2">
+
+ <uses-permission android:name="android.permission.MANAGE_SMARTSPACE"/>
+
+ <application>
+ <service android:name=".CtsSmartspaceService"
+ android:exported="true"
+ android:label="CtsDummySmartspaceService">
+ <intent-filter>
+ <!-- This constant must match SmartspaceService.SERVICE_INTERFACE -->
+ <action android:name="android.service.smartspace.SmartspaceService"/>
+ </intent-filter>
+ </service>
+
+ <!-- TODO(b/111701043): Update with required permissions -->
+ <uses-library android:name="android.test.runner"/>
+
+ </application>
+
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:label="CTS tests for the App Prediction Framework APIs."
+ android:targetPackage="android.smartspace.cts">
+ </instrumentation>
+
+</manifest>
diff --git a/tests/smartspace/AndroidTest.xml b/tests/smartspace/AndroidTest.xml
new file mode 100644
index 0000000..ad3aeeb
--- /dev/null
+++ b/tests/smartspace/AndroidTest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<configuration description="Config for Smartspace CTS tests.">
+ <option name="test-suite-tag" value="cts"/>
+ <option name="config-descriptor:metadata" key="component" value="framework"/>
+ <option name="config-descriptor:metadata" key="parameter" value="not_instant_app"/>
+ <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi"/>
+ <option name="config-descriptor:metadata" key="parameter" value="secondary_user"/>
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true"/>
+ <option name="test-file-name" value="CtsSmartspaceServiceTestCases.apk"/>
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+ <option name="package" value="android.smartspace.cts"/>
+ <!-- 20x default timeout of 600sec -->
+ <option name="shell-timeout" value="12000000"/>
+ </test>
+
+</configuration>
diff --git a/tests/smartspace/OWNERS b/tests/smartspace/OWNERS
new file mode 100644
index 0000000..4a61d75
--- /dev/null
+++ b/tests/smartspace/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 487497
+srazdan@google.com
+alexmang@google.com
diff --git a/tests/smartspace/TEST_MAPPING b/tests/smartspace/TEST_MAPPING
new file mode 100644
index 0000000..58b65d1
--- /dev/null
+++ b/tests/smartspace/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsSmartspaceServiceTestCases"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/smartspace/src/android/smartspace/cts/CtsSmartspaceService.java b/tests/smartspace/src/android/smartspace/cts/CtsSmartspaceService.java
new file mode 100644
index 0000000..a285511
--- /dev/null
+++ b/tests/smartspace/src/android/smartspace/cts/CtsSmartspaceService.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.smartspace.cts;
+
+import android.app.smartspace.SmartspaceConfig;
+import android.app.smartspace.SmartspaceSessionId;
+import android.app.smartspace.SmartspaceTarget;
+import android.app.smartspace.SmartspaceTargetEvent;
+import android.os.Process;
+import android.service.smartspace.SmartspaceService;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+public class CtsSmartspaceService extends SmartspaceService {
+
+ private static final boolean DEBUG = true;
+ public static final String EXTRA_REPORTER = "extra_reporter";
+ public static final String MY_PACKAGE = "android.smartspace.cts";
+ public static final String SERVICE_NAME = MY_PACKAGE + "/."
+ + CtsSmartspaceService.class.getSimpleName();
+ private static final String TAG = CtsSmartspaceService.class.getSimpleName();
+
+ private static Watcher sWatcher;
+
+ private final ArrayMap<SmartspaceSessionId, List<SmartspaceTarget>> targets = new ArrayMap<>();
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// Log.d(TAG, "onCreate mSessionCallbacks: " + mSessionCallbacks);
+ if (DEBUG) Log.d(TAG, "onCreate");
+ }
+
+ @Override
+ public void onCreateSmartspaceSession(SmartspaceConfig config, SmartspaceSessionId sessionId) {
+// Log.d(TAG, "onCreateSmartspaceSession mSessionCallbacks: " + mSessionCallbacks);
+ if (DEBUG) Log.d(TAG, "onCreateSmartspaceSession");
+
+ if (sWatcher.verifier != null) {
+ Log.e(TAG, "onCreateSmartspaceSession, trying to set verifier when it already exists");
+ }
+ targets.put(sessionId, new ArrayList<>());
+ sWatcher.verifier = Mockito.mock(CtsSmartspaceService.class);
+ sWatcher.created.countDown();
+ }
+
+ @Override
+ public void notifySmartspaceEvent(SmartspaceSessionId sessionId, SmartspaceTargetEvent event) {
+// Log.d(TAG, "notifySmartspaceEvent mSessionCallbacks: " + mSessionCallbacks);
+ if (DEBUG){
+ Log.d(TAG, "notifySmartspaceEvent sessionId=" + sessionId + ", event=" + event.toString());
+ }
+ if(event.getSmartspaceTarget() != null) {
+ targets.get(sessionId).add(event.getSmartspaceTarget());
+ }
+ sWatcher.verifier.notifySmartspaceEvent(sessionId, event);
+ }
+
+ @Override
+ public void onRequestSmartspaceUpdate(SmartspaceSessionId sessionId) {
+// Log.d(TAG, "onRequestSmartspaceUpdate mSessionCallbacks: " + mSessionCallbacks);
+ if (DEBUG){
+ Log.d(TAG, "onRequestSmartspaceUpdate sessionId=" + sessionId);
+ }
+ List<SmartspaceTarget> returnList = targets.get(sessionId);
+ if(returnList == null) {
+ returnList = new ArrayList<>();
+ }
+ updateSmartspaceTargets(sessionId, returnList);
+ sWatcher.verifier.onRequestSmartspaceUpdate(sessionId);
+ }
+
+ @Override
+ public void onDestroySmartspaceSession(SmartspaceSessionId sessionId) {
+// Log.d(TAG, "onDestroySmartspaceSession mSessionCallbacks: " + mSessionCallbacks);
+ if (DEBUG) Log.d(TAG, "onDestroySmartspaceSession");
+ targets.remove(sessionId);
+ super.onDestroy();
+ sWatcher.destroyed.countDown();
+ }
+
+ @Override
+ public void onDestroy(SmartspaceSessionId sessionId) {
+// Log.d(TAG, "onDestroy mSessionCallbacks: " + mSessionCallbacks);
+ if (DEBUG) Log.d(TAG, "onDestroy");
+ super.onDestroy();
+ sWatcher.destroyed.countDown();
+ }
+
+
+ public static Watcher setWatcher() {
+ if (DEBUG) {
+ Log.d(TAG, "");
+ Log.d(TAG, "----------------------------------------------");
+ Log.d(TAG, " setWatcher");
+ }
+ if (sWatcher != null) {
+ throw new IllegalStateException("Set watcher with watcher already set");
+ }
+ sWatcher = new Watcher();
+ return sWatcher;
+ }
+
+ public static void clearWatcher() {
+ if (DEBUG) Log.d(TAG, "clearWatcher");
+ sWatcher = null;
+ }
+
+ public static final class Watcher {
+ public CountDownLatch created = new CountDownLatch(1);
+ public CountDownLatch destroyed = new CountDownLatch(1);
+ public CountDownLatch queried = new CountDownLatch(1);
+ public CountDownLatch queriedTwice = new CountDownLatch(2);
+
+ /**
+ * Can be used to verify that API specific service methods are called. Not a real mock as
+ * the system isn't talking to this directly, it has calls proxied to it.
+ */
+ public CtsSmartspaceService verifier;
+
+ public List<SmartspaceTarget> mSmartspaceTargets;
+
+ public void setTargets(List<SmartspaceTarget> targets) {
+ mSmartspaceTargets = targets;
+ }
+ }
+}
diff --git a/tests/smartspace/src/android/smartspace/cts/SmartspaceManagerTest.java b/tests/smartspace/src/android/smartspace/cts/SmartspaceManagerTest.java
new file mode 100644
index 0000000..936a835
--- /dev/null
+++ b/tests/smartspace/src/android/smartspace/cts/SmartspaceManagerTest.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.smartspace.cts;
+
+import static androidx.test.InstrumentationRegistry.getContext;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+
+import android.app.smartspace.SmartspaceConfig;
+import android.app.smartspace.SmartspaceManager;
+import android.app.smartspace.SmartspaceSession;
+import android.app.smartspace.SmartspaceTarget;
+import android.app.smartspace.SmartspaceTargetEvent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Process;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.compatibility.common.util.RequiredServiceRule;
+import com.android.compatibility.common.util.SystemUtil;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+/**
+ * Tests for {@link SmartspaceManager}
+ *
+ * atest CtsSearchUiServiceTestCases
+ */
+@RunWith(AndroidJUnit4.class)
+public class SmartspaceManagerTest {
+
+ private static final String TAG = "SmartspaceManagerTest";
+ private static final boolean DEBUG = false;
+
+ private static final long VERIFY_TIMEOUT_MS = 5_000;
+ private static final long SERVICE_LIFECYCLE_TIMEOUT_MS = 20_000;
+ private static final String TEST_UI_SURFACE = "homescreen";
+ private static final String SMARTSPACE_ACTION_ID = "dummy_action_id";
+ private static final int TEST_NUM_PREDICTIONS = 10;
+ private static final String TEST_LAUNCH_LOCATION = "testCollapsedLocation";
+ private static final int TEST_ACTION = 2;
+
+ @Rule
+ public final RequiredServiceRule mRequiredServiceRule =
+ new RequiredServiceRule(Context.SMARTSPACE_SERVICE);
+
+ private SmartspaceManager mManager;
+ private SmartspaceSession mClient;
+ private CtsSmartspaceService.Watcher mWatcher;
+
+ @Before
+ public void setUp() throws Exception {
+ mWatcher = CtsSmartspaceService.setWatcher();
+ mManager = getContext().getSystemService(SmartspaceManager.class);
+ setService(CtsSmartspaceService.SERVICE_NAME);
+ SmartspaceConfig config = createSmartspaceConfig(TEST_UI_SURFACE);
+ mClient = createSmartspaceSession(config);
+ await(mWatcher.created, "Waiting for onCreate()");
+ reset(mWatcher.verifier);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ Log.d(TAG, "Starting tear down, watcher is: " + mWatcher);
+ mClient.destroy();
+ setService(null);
+ await(mWatcher.destroyed, "Waiting for onDestroy()");
+
+ mWatcher = null;
+ CtsSmartspaceService.clearWatcher();
+ }
+
+ @Test
+ public void testCreateSmartspaceSession() {
+ assertNotNull(mClient);
+ assertNotNull(mWatcher.verifier);
+ }
+
+ @Test
+ public void testDestroySession() {
+ SmartspaceSession localClient = createSmartspaceSession(createSmartspaceConfig("surface"));
+ localClient.destroy();
+ await(mWatcher.destroyed, "Waiting for onDestroy()");
+ }
+
+ @Test
+ public void testRequestSmartspaceUpdate() {
+ // Send a request for a smartspace update
+ SmartspaceTarget testTarget = SmartspaceTestUtils.getBasicSmartspaceTarget("id",
+ SmartspaceTestUtils.getTestComponentName(), Process.myUserHandle());
+ SmartspaceTargetEvent testEvent = new SmartspaceTargetEvent.Builder(
+ SmartspaceTargetEvent.EVENT_TARGET_INTERACTION).setSmartspaceTarget(
+ testTarget).setSmartspaceActionId("id").build();
+ mClient.notifySmartspaceEvent(testEvent);
+ mClient.registerSmartspaceUpdates(Executors.newSingleThreadExecutor(),
+ targets -> {
+ if (targets.size() > 0 && targets.get(0).equals(testTarget)) {
+ mWatcher.queried.countDown();
+ }
+ });
+ mClient.requestSmartspaceUpdate();
+ // Verify that the API received it
+ verify(mWatcher.verifier, timeout(VERIFY_TIMEOUT_MS).times(2))
+ .onRequestSmartspaceUpdate(any());
+ await(mWatcher.queried, "Waiting for updateSmartspaceTargets()");
+ }
+
+ @Test
+ public void testRequestSmartspaceUpdateForMultipleSessions() {
+ SmartspaceTarget testTarget = SmartspaceTestUtils.getBasicSmartspaceTarget("id",
+ SmartspaceTestUtils.getTestComponentName(), Process.myUserHandle());
+ SmartspaceTargetEvent testEvent = new SmartspaceTargetEvent.Builder(
+ SmartspaceTargetEvent.EVENT_TARGET_INTERACTION).setSmartspaceTarget(
+ testTarget).setSmartspaceActionId("id").build();
+
+ SmartspaceConfig config1 = createSmartspaceConfig("surface 1");
+ SmartspaceSession client1 = createSmartspaceSession(config1);
+ SmartspaceConfig config2 = createSmartspaceConfig("surface 2");
+ SmartspaceSession client2 = createSmartspaceSession(config2);
+ client1.registerSmartspaceUpdates(Executors.newSingleThreadExecutor(),
+ targets -> {
+ // Counting down only if the returned list only contains test target.
+ if (targets.size() > 0 && targets.get(0).equals(testTarget)) {
+ mWatcher.queriedTwice.countDown();
+ }
+ });
+ client2.registerSmartspaceUpdates(Executors.newSingleThreadExecutor(),
+ targets -> {
+ // Counting down only if the returned list is empty.
+ if (targets.isEmpty()) {
+ mWatcher.queriedTwice.countDown();
+ }
+ });
+ // Notifying the event only for client1.
+ client1.notifySmartspaceEvent(testEvent);
+ // Requesting update for both the clients
+ client1.requestSmartspaceUpdate();
+ client2.requestSmartspaceUpdate();
+ // Verify that the API received it 4 times, twice for each client, once while registering
+ // and once while requesting.
+ verify(mWatcher.verifier, timeout(VERIFY_TIMEOUT_MS).times(4))
+ .onRequestSmartspaceUpdate(any());
+ await(mWatcher.queriedTwice, "Waiting for updateSmartspaceTargets() to be called twice");
+ }
+
+ @Test
+ public void testNotifySmartspaceEvent() {
+ ComponentName componentName = new ComponentName("package_name", "class_name");
+ SmartspaceTarget target = new SmartspaceTarget.Builder("id",
+ componentName, Process.myUserHandle()).build();
+
+ SmartspaceTargetEvent smartspaceTargetEvent = new SmartspaceTargetEvent.Builder(
+ SmartspaceTargetEvent.EVENT_TARGET_BLOCK).setSmartspaceActionId(
+ SMARTSPACE_ACTION_ID).setSmartspaceTarget(target).build();
+
+ ArgumentCaptor<SmartspaceTargetEvent> arg = ArgumentCaptor.forClass(
+ SmartspaceTargetEvent.class);
+ // Send a request to notifySmartspaceUpdate
+ mClient.notifySmartspaceEvent(smartspaceTargetEvent);
+ // Verify that the API received it.
+ verify(mWatcher.verifier, timeout(VERIFY_TIMEOUT_MS))
+ .notifySmartspaceEvent(any(), arg.capture());
+ assertEquals(arg.getValue().getSmartspaceActionId(), SMARTSPACE_ACTION_ID);
+ assertEquals(arg.getValue().getEventType(), SmartspaceTargetEvent.EVENT_TARGET_BLOCK);
+ assertEquals(arg.getValue().getSmartspaceTarget().getComponentName(), componentName);
+ assertEquals(arg.getValue().getSmartspaceTarget().getUserHandle(), Process.myUserHandle());
+ assertEquals(arg.getValue().getSmartspaceTarget().getSmartspaceTargetId(), "id");
+
+ }
+
+ private void setService(String service) {
+ Log.d(TAG, "Setting smartspace service to " + service);
+ int userId = Process.myUserHandle().getIdentifier();
+ if (service != null) {
+ runShellCommand("cmd smartspace set temporary-service "
+ + userId + " " + service + " 60000");
+ } else {
+ runShellCommand("cmd smartspace set temporary-service " + userId);
+ }
+ }
+
+ private SmartspaceSession createSmartspaceSession(SmartspaceConfig config) {
+ return mManager.createSmartspaceSession(config);
+ }
+
+ private SmartspaceConfig createSmartspaceConfig(String uiSurface) {
+ return new SmartspaceConfig.Builder(
+ InstrumentationRegistry.getTargetContext(),
+ uiSurface).setSmartspaceTargetCount(TEST_NUM_PREDICTIONS).build();
+ }
+
+ private void await(@NonNull CountDownLatch latch, @NonNull String message) {
+ try {
+ assertWithMessage(message).that(
+ latch.await(SERVICE_LIFECYCLE_TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IllegalStateException("Interrupted while: " + message);
+ }
+ }
+
+ private void runShellCommand(String command) {
+ Log.d(TAG, "runShellCommand(): " + command);
+ try {
+ SystemUtil.runShellCommand(InstrumentationRegistry.getInstrumentation(), command);
+ } catch (Exception e) {
+ throw new RuntimeException("Command '" + command + "' failed: ", e);
+ }
+ }
+
+ public static class ConsumerVerifier implements
+ Consumer<List<SmartspaceTarget>> {
+
+ private static List<SmartspaceTarget> mExpectedTargets;
+
+ public ConsumerVerifier(List<SmartspaceTarget> targets) {
+ mExpectedTargets = targets;
+ }
+
+ @Override
+ public void accept(List<SmartspaceTarget> actualTargets) {
+ if (DEBUG) {
+ Log.d(TAG, "ConsumerVerifier.accept targets.size= " + actualTargets.size());
+ Log.d(TAG, "ConsumerVerifier.accept target(1).packageName=" + actualTargets.get(
+ 0).getComponentName().getPackageName());
+ }
+ Assert.assertArrayEquals(actualTargets.toArray(), mExpectedTargets.toArray());
+ }
+ }
+
+ private static class RequestVerifier implements SmartspaceSession.Callback {
+ @Override
+ public void onTargetsAvailable(List<SmartspaceTarget> targets) {
+
+ }
+ }
+}
diff --git a/tests/smartspace/src/android/smartspace/cts/SmartspaceTestUtils.java b/tests/smartspace/src/android/smartspace/cts/SmartspaceTestUtils.java
new file mode 100644
index 0000000..d2a5ffb
--- /dev/null
+++ b/tests/smartspace/src/android/smartspace/cts/SmartspaceTestUtils.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.smartspace.cts;
+
+import android.app.smartspace.SmartspaceTarget;
+import android.content.ComponentName;
+import android.os.UserHandle;
+
+public class SmartspaceTestUtils {
+ public static SmartspaceTarget getBasicSmartspaceTarget(String id, ComponentName componentName, UserHandle userHandle){
+ return new SmartspaceTarget.Builder(id, componentName, userHandle).build();
+ }
+
+ public static ComponentName getTestComponentName() {
+ return new ComponentName("package name", "class name");
+ }
+}
diff --git a/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java b/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
index 6c71597..dd19deb 100644
--- a/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
+++ b/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
@@ -45,6 +45,7 @@
import android.content.pm.PackageManager;
import android.os.IBinder;
import android.os.Parcel;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
@@ -237,6 +238,26 @@
@AppModeFull(reason = "No usage events access in instant apps")
@Test
+ public void testLastTimeComponentUsed_launchActivity() throws Exception {
+ mUiDevice.wakeUp();
+ dismissKeyguard(); // also want to start out with the keyguard dismissed.
+
+ final long startTime = System.currentTimeMillis();
+ final Class clazz = Activities.ActivityOne.class;
+ launchSubActivity(clazz);
+ final long endTime = System.currentTimeMillis();
+
+ final Map<String, UsageStats> map = mUsageStatsManager.queryAndAggregateUsageStats(
+ startTime, endTime);
+ final UsageStats stats = map.get(mTargetPackage);
+ assertNotNull(stats);
+ final long lastTimeComponentUsed = stats.getLastTimeComponentUsed();
+ assertLessThan(startTime, lastTimeComponentUsed);
+ assertLessThan(lastTimeComponentUsed, endTime);
+ }
+
+ @AppModeFull(reason = "No usage events access in instant apps")
+ @Test
public void testOrderedActivityLaunchSequenceInEventLog() throws Exception {
@SuppressWarnings("unchecked")
Class<? extends Activity>[] activitySequence = new Class[] {
@@ -245,6 +266,7 @@
Activities.ActivityThree.class,
};
mUiDevice.wakeUp();
+ dismissKeyguard(); // also want to start out with the keyguard dismissed.
final long startTime = System.currentTimeMillis();
// Launch the series of Activities.
diff --git a/tests/tests/appenumeration/AndroidTest.xml b/tests/tests/appenumeration/AndroidTest.xml
index 26f6b90..7dd2c67 100644
--- a/tests/tests/appenumeration/AndroidTest.xml
+++ b/tests/tests/appenumeration/AndroidTest.xml
@@ -52,6 +52,8 @@
<option name="test-file-name" value="CtsAppEnumerationQueriesPackage.apk" />
<option name="test-file-name" value="CtsAppEnumerationQueriesNothingTargetsQ.apk" />
<option name="test-file-name" value="CtsAppEnumerationQueriesNothingHasPermission.apk" />
+ <option name="test-file-name" value="CtsAppEnumerationQueriesNothingUsesLibrary.apk" />
+ <option name="test-file-name" value="CtsAppEnumerationQueriesNothingUsesOptionalLibrary.apk" />
<option name="test-file-name" value="CtsAppEnumerationQueriesNothingHasProvider.apk" />
<option name="test-file-name" value="CtsAppEnumerationWildcardBrowsableActivitySource.apk" />
<option name="test-file-name" value="CtsAppEnumerationWildcardContactsActivitySource.apk" />
@@ -59,6 +61,8 @@
<option name="test-file-name" value="CtsAppEnumerationWildcardShareActivitySource.apk" />
<option name="test-file-name" value="CtsAppEnumerationWildcardWebActivitySource.apk" />
<option name="test-file-name" value="CtsAppEnumerationWildcardBrowserActivitySource.apk" />
+ <option name="test-file-name" value="CtsAppEnumerationSyncadapterTarget.apk" />
+ <option name="test-file-name" value="CtsAppEnumerationSyncadapterSharedUidTarget.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
@@ -70,7 +74,11 @@
<!-- Create place to store apks -->
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="run-command" value="mkdir -p /data/local/tmp/cts/appenumeration" />
+ <option name="run-command" value="am compat enable ALLOW_TEST_API_ACCESS android.appenumeration.queries.nothing" />
+ <option name="run-command" value="am compat enable ALLOW_TEST_API_ACCESS android.appenumeration.queries.nothing.haspermission" />
<option name="teardown-command" value="rm -rf /data/local/tmp/cts"/>
+ <option name="teardown-command" value="am compat reset ALLOW_TEST_API_ACCESS android.appenumeration.queries.nothing" />
+ <option name="teardown-command" value="am compat reset ALLOW_TEST_API_ACCESS android.appenumeration.queries.nothing.haspermission" />
</target_preparer>
<!-- Load additional APKs onto device -->
diff --git a/tests/tests/appenumeration/app/source/Android.bp b/tests/tests/appenumeration/app/source/Android.bp
index d2901e0..deee2f4 100644
--- a/tests/tests/appenumeration/app/source/Android.bp
+++ b/tests/tests/appenumeration/app/source/Android.bp
@@ -189,6 +189,28 @@
}
android_test_helper_app {
+ name: "CtsAppEnumerationQueriesNothingUsesLibrary",
+ manifest: "AndroidManifest-queriesNothing-usesLibrary.xml",
+ defaults: ["CtsAppEnumerationQueriesDefaults"],
+ // Tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+}
+
+android_test_helper_app {
+ name: "CtsAppEnumerationQueriesNothingUsesOptionalLibrary",
+ manifest: "AndroidManifest-queriesNothing-usesOptionalLibrary.xml",
+ defaults: ["CtsAppEnumerationQueriesDefaults"],
+ // Tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+}
+
+android_test_helper_app {
name: "CtsAppEnumerationQueriesNothingHasProvider",
manifest: "AndroidManifest-queriesNothing-hasProvider.xml",
defaults: ["CtsAppEnumerationQueriesDefaults"],
diff --git a/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-hasPermission.xml b/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-hasPermission.xml
index f8fcea4..7e84769 100644
--- a/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-hasPermission.xml
+++ b/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-hasPermission.xml
@@ -20,7 +20,7 @@
<permission android:name="android.appenumeration.queries.nothing.haspermission.READ" />
<uses-permission android:name="android.appenumeration.queries.nothing.haspermission.READ" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
- <application>
+ <application android:debuggable="true">
<uses-library android:name="android.test.runner" />
<activity android:name="android.appenumeration.cts.query.TestActivity"
android:exported="true" />
diff --git a/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-usesLibrary.xml b/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-usesLibrary.xml
new file mode 100644
index 0000000..99edef0
--- /dev/null
+++ b/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-usesLibrary.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.appenumeration.queries.nothing.useslibrary">
+ <application>
+ <uses-library android:name="android.test.runner" />
+ <uses-library android:name="com.android.cts.ctsshim.shared_library" />
+ <activity android:name="android.appenumeration.cts.query.TestActivity"
+ android:exported="true" />
+ </application>
+</manifest>
diff --git a/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-usesOptionalLibrary.xml b/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-usesOptionalLibrary.xml
new file mode 100644
index 0000000..87b7738
--- /dev/null
+++ b/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing-usesOptionalLibrary.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.appenumeration.queries.nothing.usesoptionallibrary">
+ <application>
+ <uses-library android:name="android.test.runner" />
+ <uses-library android:name="com.android.cts.ctsshim.shared_library"
+ android:required="false" />
+ <activity android:name="android.appenumeration.cts.query.TestActivity"
+ android:exported="true" />
+ </application>
+</manifest>
diff --git a/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing.xml b/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing.xml
index b5a88a8..e5e160a 100644
--- a/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing.xml
+++ b/tests/tests/appenumeration/app/source/AndroidManifest-queriesNothing.xml
@@ -17,7 +17,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.appenumeration.queries.nothing">
- <application>
+ <application android:debuggable="true">
<uses-library android:name="android.test.runner" />
<activity android:name="android.appenumeration.cts.query.TestActivity"
android:exported="true" />
diff --git a/tests/tests/appenumeration/app/source/AndroidManifest-queriesPackage.xml b/tests/tests/appenumeration/app/source/AndroidManifest-queriesPackage.xml
index d06e632..ce27bed 100644
--- a/tests/tests/appenumeration/app/source/AndroidManifest-queriesPackage.xml
+++ b/tests/tests/appenumeration/app/source/AndroidManifest-queriesPackage.xml
@@ -21,6 +21,7 @@
<queries>
<package android:name="android.appenumeration.noapi" />
<package android:name="android.appenumeration.noapi.shareduid" />
+ <package android:name="android.appenumeration.syncadapter" />
</queries>
<application>
diff --git a/tests/tests/appenumeration/app/source/src/android/appenumeration/cts/query/TestActivity.java b/tests/tests/appenumeration/app/source/src/android/appenumeration/cts/query/TestActivity.java
index 9dd3920..a78574b 100644
--- a/tests/tests/appenumeration/app/source/src/android/appenumeration/cts/query/TestActivity.java
+++ b/tests/tests/appenumeration/app/source/src/android/appenumeration/cts/query/TestActivity.java
@@ -16,9 +16,13 @@
package android.appenumeration.cts.query;
+import static android.appenumeration.cts.Constants.ACTION_CHECK_SIGNATURES;
import static android.appenumeration.cts.Constants.ACTION_GET_INSTALLED_PACKAGES;
+import static android.appenumeration.cts.Constants.ACTION_GET_NAMES_FOR_UIDS;
+import static android.appenumeration.cts.Constants.ACTION_GET_NAME_FOR_UID;
import static android.appenumeration.cts.Constants.ACTION_GET_PACKAGES_FOR_UID;
import static android.appenumeration.cts.Constants.ACTION_GET_PACKAGE_INFO;
+import static android.appenumeration.cts.Constants.ACTION_HAS_SIGNING_CERTIFICATE;
import static android.appenumeration.cts.Constants.ACTION_JUST_FINISH;
import static android.appenumeration.cts.Constants.ACTION_QUERY_ACTIVITIES;
import static android.appenumeration.cts.Constants.ACTION_QUERY_PROVIDERS;
@@ -27,10 +31,14 @@
import static android.appenumeration.cts.Constants.ACTION_START_DIRECTLY;
import static android.appenumeration.cts.Constants.ACTION_START_FOR_RESULT;
import static android.appenumeration.cts.Constants.ACTION_START_SENDER_FOR_RESULT;
+import static android.appenumeration.cts.Constants.EXTRA_CERT;
+import static android.appenumeration.cts.Constants.EXTRA_DATA;
import static android.appenumeration.cts.Constants.EXTRA_ERROR;
import static android.appenumeration.cts.Constants.EXTRA_FLAGS;
import static android.appenumeration.cts.Constants.EXTRA_REMOTE_CALLBACK;
import static android.content.Intent.EXTRA_RETURN_RESULT;
+import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509;
+import static android.os.Process.INVALID_UID;
import android.app.Activity;
import android.app.PendingIntent;
@@ -39,11 +47,13 @@
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.ServiceConnection;
+import android.content.SyncAdapterType;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.Cursor;
@@ -52,6 +62,7 @@
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
+import android.os.Parcelable;
import android.os.PatternMatcher;
import android.os.RemoteCallback;
import android.util.SparseArray;
@@ -93,8 +104,23 @@
final String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
sendPackageInfo(remoteCallback, packageName);
} else if (ACTION_GET_PACKAGES_FOR_UID.equals(action)) {
- final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
+ final int uid = intent.getIntExtra(Intent.EXTRA_UID, INVALID_UID);
sendPackagesForUid(remoteCallback, uid);
+ } else if (ACTION_GET_NAME_FOR_UID.equals(action)) {
+ final int uid = intent.getIntExtra(Intent.EXTRA_UID, INVALID_UID);
+ sendNameForUid(remoteCallback, uid);
+ } else if (ACTION_GET_NAMES_FOR_UIDS.equals(action)) {
+ final int uid = intent.getIntExtra(Intent.EXTRA_UID, INVALID_UID);
+ sendNamesForUids(remoteCallback, uid);
+ } else if (ACTION_CHECK_SIGNATURES.equals(action)) {
+ final int uid1 = getPackageManager().getApplicationInfo(
+ getPackageName(), /* flags */ 0).uid;
+ final int uid2 = intent.getIntExtra(Intent.EXTRA_UID, INVALID_UID);
+ sendCheckSignatures(remoteCallback, uid1, uid2);
+ } else if (ACTION_HAS_SIGNING_CERTIFICATE.equals(action)) {
+ final int uid = intent.getIntExtra(Intent.EXTRA_UID, INVALID_UID);
+ final byte[] cert = intent.getBundleExtra(EXTRA_DATA).getByteArray(EXTRA_CERT);
+ sendHasSigningCertificate(remoteCallback, uid, cert, CERT_INPUT_RAW_X509);
} else if (ACTION_START_FOR_RESULT.equals(action)) {
final String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
int requestCode = RESULT_FIRST_USER + callbacks.size();
@@ -156,6 +182,8 @@
} else if (Constants.ACTION_BIND_SERVICE.equals(action)) {
final String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
bindService(remoteCallback, packageName);
+ } else if (Constants.ACTION_GET_SYNCADAPTER_TYPES.equals(action)) {
+ sendSyncAdapterTypes(remoteCallback);
} else {
sendError(remoteCallback, new Exception("unknown action " + action));
}
@@ -174,7 +202,7 @@
@Override
public void onReceive(Context context, Intent intent) {
final Bundle result = new Bundle();
- result.putString(Constants.EXTRA_DATA, intent.getDataString());
+ result.putString(EXTRA_DATA, intent.getDataString());
remoteCallback.sendResult(result);
mainHandler.removeCallbacksAndMessages(token);
finish();
@@ -288,6 +316,56 @@
finish();
}
+ private void sendNameForUid(RemoteCallback remoteCallback, int uid) {
+ final String name = getPackageManager().getNameForUid(uid);
+ final Bundle result = new Bundle();
+ result.putString(EXTRA_RETURN_RESULT, name);
+ remoteCallback.sendResult(result);
+ finish();
+ }
+
+ private void sendNamesForUids(RemoteCallback remoteCallback, int uid) {
+ final String[] names = getPackageManager().getNamesForUids(new int[]{uid});
+ final Bundle result = new Bundle();
+ result.putStringArray(EXTRA_RETURN_RESULT, names);
+ remoteCallback.sendResult(result);
+ finish();
+ }
+
+ private void sendCheckSignatures(RemoteCallback remoteCallback, int uid1, int uid2) {
+ final int signatureResult = getPackageManager().checkSignatures(uid1, uid2);
+ final Bundle result = new Bundle();
+ result.putInt(EXTRA_RETURN_RESULT, signatureResult);
+ remoteCallback.sendResult(result);
+ finish();
+ }
+
+ private void sendHasSigningCertificate(RemoteCallback remoteCallback, int uid, byte[] cert,
+ int type) {
+ final boolean signatureResult = getPackageManager().hasSigningCertificate(uid, cert, type);
+ final Bundle result = new Bundle();
+ result.putBoolean(EXTRA_RETURN_RESULT, signatureResult);
+ remoteCallback.sendResult(result);
+ finish();
+ }
+
+ /**
+ * Instead of sending a list of package names, this function sends a List of
+ * {@link SyncAdapterType}, since the {@link SyncAdapterType#getPackageName()} is a test api
+ * which can only be invoked in the instrumentation.
+ */
+ private void sendSyncAdapterTypes(RemoteCallback remoteCallback) {
+ final SyncAdapterType[] types = ContentResolver.getSyncAdapterTypes();
+ final ArrayList<Parcelable> parcelables = new ArrayList<>();
+ for (SyncAdapterType type : types) {
+ parcelables.add(type);
+ }
+ final Bundle result = new Bundle();
+ result.putParcelableArrayList(EXTRA_RETURN_RESULT, parcelables);
+ remoteCallback.sendResult(result);
+ finish();
+ }
+
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
diff --git a/tests/tests/appenumeration/app/target/Android.bp b/tests/tests/appenumeration/app/target/Android.bp
index 55f08c4..5b35711 100644
--- a/tests/tests/appenumeration/app/target/Android.bp
+++ b/tests/tests/appenumeration/app/target/Android.bp
@@ -158,3 +158,31 @@
],
sdk_version: "test_current",
}
+
+android_test_helper_app {
+ name: "CtsAppEnumerationSyncadapterTarget",
+ manifest: "AndroidManifest-syncadapter.xml",
+ defaults: ["cts_support_defaults"],
+ srcs: ["src/**/*.java"],
+ resource_dirs: ["res"],
+ // Tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+ sdk_version: "test_current",
+}
+
+android_test_helper_app {
+ name: "CtsAppEnumerationSyncadapterSharedUidTarget",
+ manifest: "AndroidManifest-syncadapter-sharedUser.xml",
+ defaults: ["cts_support_defaults"],
+ srcs: ["src/**/*.java"],
+ resource_dirs: ["res"],
+ // Tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+ sdk_version: "test_current",
+}
diff --git a/tests/tests/appenumeration/app/target/AndroidManifest-syncadapter-sharedUser.xml b/tests/tests/appenumeration/app/target/AndroidManifest-syncadapter-sharedUser.xml
new file mode 100644
index 0000000..158067d
--- /dev/null
+++ b/tests/tests/appenumeration/app/target/AndroidManifest-syncadapter-sharedUser.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.appenumeration.syncadapter.shareduid"
+ android:sharedUserId="android.appenumeration.shareduid">
+ <application>
+ <uses-library android:name="android.test.runner" />
+
+ <service android:name="android.appenumeration.MockSyncAdapterService"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.content.SyncAdapter"/>
+ </intent-filter>
+ <meta-data android:name="android.content.SyncAdapter"
+ android:resource="@xml/syncadapter_shareduser"/>
+ </service>
+ </application>
+</manifest>
diff --git a/tests/tests/appenumeration/app/target/AndroidManifest-syncadapter.xml b/tests/tests/appenumeration/app/target/AndroidManifest-syncadapter.xml
new file mode 100644
index 0000000..f1177df
--- /dev/null
+++ b/tests/tests/appenumeration/app/target/AndroidManifest-syncadapter.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.appenumeration.syncadapter">
+ <application>
+ <uses-library android:name="android.test.runner" />
+
+ <service android:name="android.appenumeration.MockSyncAdapterService"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.content.SyncAdapter"/>
+ </intent-filter>
+ <meta-data android:name="android.content.SyncAdapter"
+ android:resource="@xml/syncadapter"/>
+ </service>
+ </application>
+</manifest>
diff --git a/tests/tests/appenumeration/app/target/res/xml/syncadapter.xml b/tests/tests/appenumeration/app/target/res/xml/syncadapter.xml
new file mode 100644
index 0000000..325690a
--- /dev/null
+++ b/tests/tests/appenumeration/app/target/res/xml/syncadapter.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
+ android:contentAuthority="android.appenumeration.syncadapter.authority"
+ android:accountType="android.appenumeration.account.type"
+/>
diff --git a/tests/tests/appenumeration/app/target/res/xml/syncadapter_shareduser.xml b/tests/tests/appenumeration/app/target/res/xml/syncadapter_shareduser.xml
new file mode 100644
index 0000000..fd47011
--- /dev/null
+++ b/tests/tests/appenumeration/app/target/res/xml/syncadapter_shareduser.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
+ android:contentAuthority="android.appenumeration.syncadapter.shareduid.authority"
+ android:accountType="android.appenumeration.account.type"
+/>
diff --git a/tests/tests/appenumeration/lib/src/android/appenumeration/cts/Constants.java b/tests/tests/appenumeration/lib/src/android/appenumeration/cts/Constants.java
index 3b9616d..5a3c12e 100644
--- a/tests/tests/appenumeration/lib/src/android/appenumeration/cts/Constants.java
+++ b/tests/tests/appenumeration/lib/src/android/appenumeration/cts/Constants.java
@@ -60,6 +60,12 @@
PKG_BASE + "queries.nothing.sees.installer";
/** A package that queries nothing, but is part of a shared user */
public static final String QUERIES_NOTHING_SHARED_USER = PKG_BASE + "queries.nothing.shareduid";
+ /** A package that queries nothing, but uses a shared library */
+ public static final String QUERIES_NOTHING_USES_LIBRARY =
+ PKG_BASE + "queries.nothing.useslibrary";
+ /** A package that queries nothing, but uses a shared library */
+ public static final String QUERIES_NOTHING_USES_OPTIONAL_LIBRARY =
+ PKG_BASE + "queries.nothing.usesoptionallibrary";
/** A package that queries via wildcard action. */
public static final String QUERIES_WILDCARD_ACTION = PKG_BASE + "queries.wildcard.action";
/** A package that queries for all BROWSABLE intents. */
@@ -100,6 +106,12 @@
public static final String TARGET_BROWSER = PKG_BASE + "browser.activity";
/** A package that offers an activity acts as a browser, but uses a wildcard for host */
public static final String TARGET_BROWSER_WILDCARD = PKG_BASE + "browser.wildcard.activity";
+ /** A package that offers a shared library */
+ public static final String TARGET_SHARED_LIBRARY_PACKAGE = "com.android.cts.ctsshim";
+ /** A package that exposes itself as a syncadapter. */
+ public static final String TARGET_SYNCADAPTER = PKG_BASE + "syncadapter";
+ /** A package that exposes itself as a syncadapter with a shared uid. */
+ public static final String TARGET_SYNCADAPTER_SHARED_USER = PKG_BASE + "syncadapter.shareduid";
private static final String BASE_PATH = "/data/local/tmp/cts/appenumeration/";
public static final String TARGET_NO_API_APK = BASE_PATH + "CtsAppEnumerationNoApi.apk";
@@ -136,6 +148,13 @@
public static final String ACTION_GET_PACKAGE_INFO = PKG_BASE + "cts.action.GET_PACKAGE_INFO";
public static final String ACTION_GET_PACKAGES_FOR_UID =
PKG_BASE + "cts.action.GET_PACKAGES_FOR_UID";
+ public static final String ACTION_GET_NAME_FOR_UID =
+ PKG_BASE + "cts.action.GET_NAME_FOR_UID";
+ public static final String ACTION_GET_NAMES_FOR_UIDS =
+ PKG_BASE + "cts.action.GET_NAMES_FOR_UIDS";
+ public static final String ACTION_CHECK_SIGNATURES = PKG_BASE + "cts.action.CHECK_SIGNATURES";
+ public static final String ACTION_HAS_SIGNING_CERTIFICATE =
+ PKG_BASE + "cts.action.HAS_SIGNING_CERTIFICATE";
public static final String ACTION_START_FOR_RESULT = PKG_BASE + "cts.action.START_FOR_RESULT";
public static final String ACTION_START_DIRECTLY = PKG_BASE + "cts.action.START_DIRECTLY";
public static final String ACTION_JUST_FINISH = PKG_BASE + "cts.action.JUST_FINISH";
@@ -157,10 +176,13 @@
public static final String ACTION_QUERY_RESOLVER =
PKG_BASE + "cts.action.QUERY_RESOLVER_FOR_VISIBILITY";
public static final String ACTION_BIND_SERVICE = PKG_BASE + "cts.action.BIND_SERVICE";
+ public static final String ACTION_GET_SYNCADAPTER_TYPES =
+ PKG_BASE + "cts.action.GET_SYNCADAPTER_TYPES";
public static final String EXTRA_REMOTE_CALLBACK = "remoteCallback";
public static final String EXTRA_ERROR = "error";
public static final String EXTRA_FLAGS = "flags";
public static final String EXTRA_DATA = "data";
+ public static final String EXTRA_CERT = "cert";
public static final String EXTRA_AUTHORITY = "authority";
}
diff --git a/tests/tests/appenumeration/src/android/appenumeration/cts/AppEnumerationTests.java b/tests/tests/appenumeration/src/android/appenumeration/cts/AppEnumerationTests.java
index e063c04..a1adf19 100644
--- a/tests/tests/appenumeration/src/android/appenumeration/cts/AppEnumerationTests.java
+++ b/tests/tests/appenumeration/src/android/appenumeration/cts/AppEnumerationTests.java
@@ -17,9 +17,14 @@
package android.appenumeration.cts;
import static android.appenumeration.cts.Constants.ACTION_BIND_SERVICE;
+import static android.appenumeration.cts.Constants.ACTION_CHECK_SIGNATURES;
import static android.appenumeration.cts.Constants.ACTION_GET_INSTALLED_PACKAGES;
+import static android.appenumeration.cts.Constants.ACTION_GET_NAMES_FOR_UIDS;
+import static android.appenumeration.cts.Constants.ACTION_GET_NAME_FOR_UID;
import static android.appenumeration.cts.Constants.ACTION_GET_PACKAGES_FOR_UID;
import static android.appenumeration.cts.Constants.ACTION_GET_PACKAGE_INFO;
+import static android.appenumeration.cts.Constants.ACTION_GET_SYNCADAPTER_TYPES;
+import static android.appenumeration.cts.Constants.ACTION_HAS_SIGNING_CERTIFICATE;
import static android.appenumeration.cts.Constants.ACTION_JUST_FINISH;
import static android.appenumeration.cts.Constants.ACTION_MANIFEST_ACTIVITY;
import static android.appenumeration.cts.Constants.ACTION_MANIFEST_PROVIDER;
@@ -32,6 +37,7 @@
import static android.appenumeration.cts.Constants.ACTION_START_FOR_RESULT;
import static android.appenumeration.cts.Constants.ACTIVITY_CLASS_DUMMY_ACTIVITY;
import static android.appenumeration.cts.Constants.ACTIVITY_CLASS_TEST;
+import static android.appenumeration.cts.Constants.EXTRA_CERT;
import static android.appenumeration.cts.Constants.EXTRA_DATA;
import static android.appenumeration.cts.Constants.EXTRA_ERROR;
import static android.appenumeration.cts.Constants.EXTRA_FLAGS;
@@ -46,6 +52,8 @@
import static android.appenumeration.cts.Constants.QUERIES_NOTHING_SEES_INSTALLER;
import static android.appenumeration.cts.Constants.QUERIES_NOTHING_SEES_INSTALLER_APK;
import static android.appenumeration.cts.Constants.QUERIES_NOTHING_SHARED_USER;
+import static android.appenumeration.cts.Constants.QUERIES_NOTHING_USES_LIBRARY;
+import static android.appenumeration.cts.Constants.QUERIES_NOTHING_USES_OPTIONAL_LIBRARY;
import static android.appenumeration.cts.Constants.QUERIES_PACKAGE;
import static android.appenumeration.cts.Constants.QUERIES_PROVIDER_ACTION;
import static android.appenumeration.cts.Constants.QUERIES_PROVIDER_AUTH;
@@ -71,15 +79,23 @@
import static android.appenumeration.cts.Constants.TARGET_FORCEQUERYABLE_NORMAL;
import static android.appenumeration.cts.Constants.TARGET_NO_API;
import static android.appenumeration.cts.Constants.TARGET_SHARE;
+import static android.appenumeration.cts.Constants.TARGET_SHARED_LIBRARY_PACKAGE;
import static android.appenumeration.cts.Constants.TARGET_SHARED_USER;
+import static android.appenumeration.cts.Constants.TARGET_SYNCADAPTER;
+import static android.appenumeration.cts.Constants.TARGET_SYNCADAPTER_SHARED_USER;
import static android.appenumeration.cts.Constants.TARGET_WEB;
+import static android.content.pm.PackageManager.GET_SIGNING_CERTIFICATES;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
+import static android.content.pm.PackageManager.SIGNATURE_MATCH;
+import static android.content.pm.PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
import static android.os.Process.INVALID_UID;
import static com.android.compatibility.common.util.ShellUtils.runShellCommand;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.hasItemInArray;
+import static org.hamcrest.Matchers.not;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
@@ -89,8 +105,10 @@
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Intent;
+import android.content.SyncAdapterType;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.Signature;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
@@ -115,13 +133,19 @@
import org.junit.rules.TestName;
import org.junit.runner.RunWith;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Stream;
@RunWith(AndroidJUnit4.class)
public class AppEnumerationTests {
@@ -130,6 +154,8 @@
private static boolean sGlobalFeatureEnabled;
+ private static PackageManager sPm;
+
@Rule
public TestName name = new TestName();
@@ -151,6 +177,8 @@
sResponseThread = new HandlerThread("response");
sResponseThread.start();
sResponseHandler = new Handler(sResponseThread.getLooper());
+
+ sPm = InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
}
@AfterClass
@@ -407,13 +435,137 @@
}
@Test
- public void queriesNothing_cannotSeeSharedUserMembers() throws Exception {
- assertNotVisible(QUERIES_NOTHING, TARGET_SHARED_USER);
+ public void queriesNothing_cannotSeeLibraryPackage() throws Exception {
+ assertNotVisible(QUERIES_NOTHING, TARGET_SHARED_LIBRARY_PACKAGE);
}
@Test
- public void queriesNothingHasPermission_canSeeSharedUserMembers() throws Exception {
- assertVisible(QUERIES_NOTHING_PERM, TARGET_SHARED_USER);
+ public void queriesNothingUsesLibrary_canSeeLibraryPackage() throws Exception {
+ assertVisible(QUERIES_NOTHING_USES_LIBRARY, TARGET_SHARED_LIBRARY_PACKAGE);
+ }
+
+ @Test
+ public void queriesNothing_cannotSeeOptionalLibraryPackage() throws Exception {
+ assertNotVisible(QUERIES_NOTHING, TARGET_SHARED_LIBRARY_PACKAGE);
+ }
+
+ @Test
+ public void queriesNothingUsesOptionalLibrary_canSeeLibraryPackage() throws Exception {
+ assertVisible(QUERIES_NOTHING_USES_OPTIONAL_LIBRARY, TARGET_SHARED_LIBRARY_PACKAGE);
+ }
+
+ @Test
+ public void queriesNothing_getPackagesForUid_consistentVisibility()
+ throws Exception {
+ final int targetSharedUid = sPm.getPackageUid(TARGET_SHARED_USER, /* flags */ 0);
+ final int targetUid = sPm.getPackageUid(TARGET_FILTERS, /* flags */ 0);
+ Assert.assertNull(getPackagesForUid(QUERIES_NOTHING, targetSharedUid));
+ Assert.assertNull(getPackagesForUid(QUERIES_NOTHING, targetUid));
+ }
+
+ @Test
+ public void queriesNothingHasPermission_getPackagesForUid_consistentVisibility()
+ throws Exception {
+ final int targetSharedUid = sPm.getPackageUid(TARGET_SHARED_USER, /* flags */ 0);
+ final int targetUid = sPm.getPackageUid(TARGET_FILTERS, /* flags */ 0);
+ Assert.assertNotNull(getPackagesForUid(QUERIES_NOTHING_PERM, targetSharedUid));
+ Assert.assertNotNull(getPackagesForUid(QUERIES_NOTHING_PERM, targetUid));
+ }
+
+ @Test
+ public void queriesNothing_getNameForUid_consistentVisibility()
+ throws Exception {
+ final int targetSharedUid = sPm.getPackageUid(TARGET_SHARED_USER, /* flags */ 0);
+ final int targetUid = sPm.getPackageUid(TARGET_FILTERS, /* flags */ 0);
+ Assert.assertNull(getNameForUid(QUERIES_NOTHING, targetSharedUid));
+ Assert.assertNull(getNameForUid(QUERIES_NOTHING, targetUid));
+ }
+
+ @Test
+ public void queriesNothingHasPermission_getNameForUid_consistentVisibility()
+ throws Exception {
+ final int targetSharedUid = sPm.getPackageUid(TARGET_SHARED_USER, /* flags */ 0);
+ final int targetUid = sPm.getPackageUid(TARGET_FILTERS, /* flags */ 0);
+ Assert.assertNotNull(getNameForUid(QUERIES_NOTHING_PERM, targetSharedUid));
+ Assert.assertNotNull(getNameForUid(QUERIES_NOTHING_PERM, targetUid));
+ }
+
+ @Test
+ public void queriesNothing_getNamesForUids_consistentVisibility()
+ throws Exception {
+ final int targetSharedUid = sPm.getPackageUid(TARGET_SHARED_USER, /* flags */ 0);
+ final int targetUid = sPm.getPackageUid(TARGET_FILTERS, /* flags */ 0);
+ Assert.assertNull(getNamesForUids(QUERIES_NOTHING, targetSharedUid)[0]);
+ Assert.assertNull(getNamesForUids(QUERIES_NOTHING, targetUid)[0]);
+ }
+
+ @Test
+ public void queriesNothingHasPermission_getNamesForUids_consistentVisibility()
+ throws Exception {
+ final int targetSharedUid = sPm.getPackageUid(TARGET_SHARED_USER, /* flags */ 0);
+ final int targetUid = sPm.getPackageUid(TARGET_FILTERS, /* flags */ 0);
+ Assert.assertNotNull(getNamesForUids(QUERIES_NOTHING_PERM, targetSharedUid)[0]);
+ Assert.assertNotNull(getNamesForUids(QUERIES_NOTHING_PERM, targetUid)[0]);
+ }
+
+ @Test
+ public void queriesNothing_checkSignatures_consistentVisibility()
+ throws Exception {
+ final int targetSharedUid = sPm.getPackageUid(TARGET_SHARED_USER, /* flags */ 0);
+ final int targetUid = sPm.getPackageUid(TARGET_FILTERS, /* flags */ 0);
+ Assert.assertEquals(SIGNATURE_UNKNOWN_PACKAGE,
+ checkSignatures(QUERIES_NOTHING, targetSharedUid));
+ Assert.assertEquals(SIGNATURE_UNKNOWN_PACKAGE,
+ checkSignatures(QUERIES_NOTHING, targetUid));
+ }
+
+ @Test
+ public void queriesNothingHasPermission_checkSignatures_consistentVisibility()
+ throws Exception {
+ final int targetSharedUid = sPm.getPackageUid(TARGET_SHARED_USER, /* flags */ 0);
+ final int targetUid = sPm.getPackageUid(TARGET_FILTERS, /* flags */ 0);
+ Assert.assertEquals(SIGNATURE_MATCH,
+ checkSignatures(QUERIES_NOTHING_PERM, targetSharedUid));
+ Assert.assertEquals(SIGNATURE_MATCH, checkSignatures(QUERIES_NOTHING_PERM, targetUid));
+ }
+
+ @Test
+ public void queriesNothing_hasSigningCertificate_consistentVisibility() throws Exception {
+ final PackageInfo targetSharedUidInfo = sPm.getPackageInfo(TARGET_SHARED_USER,
+ GET_SIGNING_CERTIFICATES);
+ final PackageInfo targetUidInfo = sPm.getPackageInfo(TARGET_FILTERS,
+ GET_SIGNING_CERTIFICATES);
+ final byte[] targetSharedCert = convertSignaturesToCertificates(
+ targetSharedUidInfo.signingInfo.getApkContentsSigners()).get(0).getEncoded();
+ final byte[] targetCert = convertSignaturesToCertificates(
+ targetUidInfo.signingInfo.getApkContentsSigners()).get(0).getEncoded();
+
+ Assert.assertFalse(
+ hasSigningCertificate(QUERIES_NOTHING, targetSharedUidInfo.applicationInfo.uid,
+ targetSharedCert));
+ Assert.assertFalse(
+ hasSigningCertificate(QUERIES_NOTHING, targetUidInfo.applicationInfo.uid,
+ targetCert));
+ }
+
+ @Test
+ public void queriesNothingHasPermission_hasSigningCertificate_consistentVisibility()
+ throws Exception {
+ final PackageInfo targetSharedUidInfo = sPm.getPackageInfo(TARGET_SHARED_USER,
+ GET_SIGNING_CERTIFICATES);
+ final PackageInfo targetUidInfo = sPm.getPackageInfo(TARGET_FILTERS,
+ GET_SIGNING_CERTIFICATES);
+ final byte[] targetSharedCert = convertSignaturesToCertificates(
+ targetSharedUidInfo.signingInfo.getApkContentsSigners()).get(0).getEncoded();
+ final byte[] targetCert = convertSignaturesToCertificates(
+ targetUidInfo.signingInfo.getApkContentsSigners()).get(0).getEncoded();
+
+ Assert.assertTrue(
+ hasSigningCertificate(QUERIES_NOTHING_PERM, targetSharedUidInfo.applicationInfo.uid,
+ targetSharedCert));
+ Assert.assertTrue(
+ hasSigningCertificate(QUERIES_NOTHING_PERM, targetUidInfo.applicationInfo.uid,
+ targetCert));
}
@Test
@@ -466,10 +618,6 @@
private void assertVisible(String sourcePackageName, String targetPackageName)
throws Exception {
if (!sGlobalFeatureEnabled) return;
- final int targetUid = InstrumentationRegistry.getInstrumentation().getContext()
- .getPackageManager().getPackageUid(targetPackageName, /* flags */ 0);
- Assert.assertTrue(isAppInPackageNamesArray(targetPackageName,
- getPackagesForUid(sourcePackageName, targetUid)));
Assert.assertNotNull(sourcePackageName + " should be able to see " + targetPackageName,
getPackageInfo(sourcePackageName, targetPackageName));
}
@@ -555,13 +703,27 @@
assertServiceNotVisible(QUERIES_NOTHING, TARGET_FILTERS);
}
+ @Test
+ public void queriesPackage_canSeeSyncadapterTarget() throws Exception {
+ assertVisible(QUERIES_PACKAGE, TARGET_SYNCADAPTER, this::getSyncAdapterTypes);
+ }
+
+ @Test
+ public void queriesNothing_cannotSeeSyncadapterTarget() throws Exception {
+ assertNotVisible(QUERIES_NOTHING, TARGET_SYNCADAPTER, this::getSyncAdapterTypes);
+ assertNotVisible(QUERIES_NOTHING, TARGET_SYNCADAPTER_SHARED_USER,
+ this::getSyncAdapterTypes);
+ }
+
+ @Test
+ public void queriesNothingSharedUser_canSeeSyncadapterSharedUserTarget() throws Exception {
+ assertVisible(QUERIES_NOTHING_SHARED_USER, TARGET_SYNCADAPTER_SHARED_USER,
+ this::getSyncAdapterTypes);
+ }
+
private void assertNotVisible(String sourcePackageName, String targetPackageName)
throws Exception {
if (!sGlobalFeatureEnabled) return;
- final int targetUid = InstrumentationRegistry.getInstrumentation().getContext()
- .getPackageManager().getPackageUid(targetPackageName, /* flags */ 0);
- Assert.assertFalse(isAppInPackageNamesArray(targetPackageName,
- getPackagesForUid(sourcePackageName, targetUid)));
try {
getPackageInfo(sourcePackageName, targetPackageName);
fail(sourcePackageName + " should not be able to see " + targetPackageName);
@@ -581,15 +743,14 @@
assertFalse(bindService(sourcePackageName, targetPackageName));
}
- private boolean isAppInPackageNamesArray(String packageName, String[] packageNames) {
- return packageNames != null && Stream.of(packageNames).anyMatch(
- name -> name.equals(packageName));
- }
-
interface ThrowingBiFunction<T, U, R> {
R apply(T arg1, U arg2) throws Exception;
}
+ interface ThrowingFunction<T, R> {
+ R apply(T arg1) throws Exception;
+ }
+
private void assertNotQueryable(String sourcePackageName, String targetPackageName,
String intentAction, ThrowingBiFunction<String, Intent, String[]> commandMethod)
throws Exception {
@@ -619,6 +780,22 @@
+ intentAction);
}
+ private void assertVisible(String sourcePackageName, String targetPackageName,
+ ThrowingFunction<String, String[]> commandMethod) throws Exception {
+ if (!sGlobalFeatureEnabled) return;
+ final String[] packageNames = commandMethod.apply(sourcePackageName);
+ assertThat(sourcePackageName + " should be able to see " + targetPackageName,
+ packageNames, hasItemInArray(targetPackageName));
+ }
+
+ private void assertNotVisible(String sourcePackageName, String targetPackageName,
+ ThrowingFunction<String, String[]> commandMethod) throws Exception {
+ if (!sGlobalFeatureEnabled) return;
+ final String[] packageNames = commandMethod.apply(sourcePackageName);
+ assertThat(sourcePackageName + " should not be able to see " + targetPackageName,
+ packageNames, not(hasItemInArray(targetPackageName)));
+ }
+
private PackageInfo getPackageInfo(String sourcePackageName, String targetPackageName)
throws Exception {
Bundle response = sendCommandBlocking(sourcePackageName, targetPackageName,
@@ -628,11 +805,50 @@
private String[] getPackagesForUid(String sourcePackageName, int targetUid)
throws Exception {
- Bundle response = sendCommandBlocking(sourcePackageName, targetUid, /* intentExtra */ null,
- ACTION_GET_PACKAGES_FOR_UID);
+ final Bundle response = sendCommandBlocking(sourcePackageName, targetUid,
+ /* intentExtra */ null, ACTION_GET_PACKAGES_FOR_UID);
return response.getStringArray(Intent.EXTRA_RETURN_RESULT);
}
+ private String getNameForUid(String sourcePackageName, int targetUid) throws Exception {
+ final Bundle response = sendCommandBlocking(sourcePackageName, targetUid,
+ /* intentExtra */ null, ACTION_GET_NAME_FOR_UID);
+ return response.getString(Intent.EXTRA_RETURN_RESULT);
+ }
+
+ private String[] getNamesForUids(String sourcePackageName, int targetUid) throws Exception {
+ final Bundle response = sendCommandBlocking(sourcePackageName, targetUid,
+ /* intentExtra */ null, ACTION_GET_NAMES_FOR_UIDS);
+ return response.getStringArray(Intent.EXTRA_RETURN_RESULT);
+ }
+
+ private int checkSignatures(String sourcePackageName, int targetUid) throws Exception {
+ final Bundle response = sendCommandBlocking(sourcePackageName, targetUid,
+ /* intentExtra */ null, ACTION_CHECK_SIGNATURES);
+ return response.getInt(Intent.EXTRA_RETURN_RESULT);
+ }
+
+ private boolean hasSigningCertificate(String sourcePackageName, int targetUid, byte[] cert)
+ throws Exception {
+ final Bundle extra = new Bundle();
+ extra.putByteArray(EXTRA_CERT, cert);
+ final Bundle response = sendCommandBlocking(sourcePackageName, targetUid, extra,
+ ACTION_HAS_SIGNING_CERTIFICATE);
+ return response.getBoolean(Intent.EXTRA_RETURN_RESULT);
+ }
+
+ private List<Certificate> convertSignaturesToCertificates(Signature[] signatures)
+ throws Exception {
+ final CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ ArrayList<Certificate> certs = new ArrayList<>(signatures.length);
+ for (Signature signature : signatures) {
+ final InputStream is = new ByteArrayInputStream(signature.toByteArray());
+ final X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
+ certs.add(cert);
+ }
+ return certs;
+ }
+
private PackageInfo startForResult(String sourcePackageName, String targetPackageName)
throws Exception {
Bundle response = sendCommandBlocking(sourcePackageName, targetPackageName,
@@ -708,6 +924,17 @@
return response.getBoolean(Intent.EXTRA_RETURN_RESULT);
}
+ private String[] getSyncAdapterTypes(String sourcePackageName) throws Exception {
+ final Bundle response = sendCommandBlocking(sourcePackageName, /* targetPackageName */ null,
+ /* intentExtra */ null, ACTION_GET_SYNCADAPTER_TYPES);
+ final List<Parcelable> parcelables = response.getParcelableArrayList(
+ Intent.EXTRA_RETURN_RESULT);
+ return parcelables.stream()
+ .map(parcelable -> ((SyncAdapterType) parcelable).getPackageName())
+ .distinct()
+ .toArray(String[]::new);
+ }
+
interface Result {
Bundle await() throws Exception;
}
@@ -731,6 +958,8 @@
intent.putExtra(Intent.EXTRA_INTENT, intentExtra);
} else if (intentExtra instanceof PendingIntent) {
intent.putExtra("pendingIntent", intentExtra);
+ } else if (intentExtra instanceof Bundle) {
+ intent.putExtra(EXTRA_DATA, intentExtra);
}
}
diff --git a/tests/tests/appop/Android.bp b/tests/tests/appop/Android.bp
index 94bbfbd..d4547f5 100644
--- a/tests/tests/appop/Android.bp
+++ b/tests/tests/appop/Android.bp
@@ -37,6 +37,25 @@
],
}
+cc_test_library {
+ name: "libNDKCtsAppOpsTestCases_jni",
+
+ stl: "libc++_static",
+ gtest: false,
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-unused-parameter",
+ ],
+
+ srcs: ["ndk-jni/**/*.cpp"],
+
+ header_libs: ["jni_headers"],
+ shared_libs: [
+ "libaaudio",
+ ],
+}
+
android_test {
name: "CtsAppOpsTestCases",
@@ -91,6 +110,7 @@
"libziparchive",
"libz",
"libCtsAppOpsTestCases_jni",
+ "libNDKCtsAppOpsTestCases_jni",
],
test_suites: [
diff --git a/tests/tests/appop/AndroidManifest.xml b/tests/tests/appop/AndroidManifest.xml
index 065b0af..434821e 100644
--- a/tests/tests/appop/AndroidManifest.xml
+++ b/tests/tests/appop/AndroidManifest.xml
@@ -38,6 +38,8 @@
<uses-permission android:name="android.permission.CAMERA" />
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
diff --git a/tests/tests/appop/AndroidTest.xml b/tests/tests/appop/AndroidTest.xml
index fc5c0bf..b80faaf 100644
--- a/tests/tests/appop/AndroidTest.xml
+++ b/tests/tests/appop/AndroidTest.xml
@@ -45,6 +45,7 @@
<option name="push-file" key="AppWithAttributionInheritingFromSelf.apk" value="/data/local/tmp/cts/appops/AppWithAttributionInheritingFromSelf.apk" />
<option name="push-file" key="AppWithLongAttributionTag.apk" value="/data/local/tmp/cts/appops/AppWithLongAttributionTag.apk" />
<option name="push-file" key="AppWithTooManyAttributions.apk" value="/data/local/tmp/cts/appops/AppWithTooManyAttributions.apk" />
+ <option name="push-file" key="CtsAppWithReceiverAttribution.apk" value="/data/local/tmp/cts/appops/CtsAppWithReceiverAttribution.apk" />
</target_preparer>
<!-- Remove additional apps if installed -->
diff --git a/tests/tests/appop/AppWithReceiverAttribution/Android.bp b/tests/tests/appop/AppWithReceiverAttribution/Android.bp
new file mode 100644
index 0000000..3aa5569
--- /dev/null
+++ b/tests/tests/appop/AppWithReceiverAttribution/Android.bp
@@ -0,0 +1,29 @@
+// 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test_helper_app {
+ name: "CtsAppWithReceiverAttribution",
+
+ srcs: ["src/**/*.java"],
+
+ test_suites: [
+ "cts",
+ "general-tests",
+ "mts",
+ ]
+}
diff --git a/tests/tests/appop/AppWithReceiverAttribution/AndroidManifest.xml b/tests/tests/appop/AppWithReceiverAttribution/AndroidManifest.xml
new file mode 100644
index 0000000..6c15184
--- /dev/null
+++ b/tests/tests/appop/AppWithReceiverAttribution/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.app.appops.cts.appwithreceiverattribution"
+ android:version="1">
+ <attribution android:tag="attribution1" android:label="@string/dummyLabel" />
+ <attribution android:tag="attribution2" android:label="@string/dummyLabel" />
+ <attribution android:tag="attribution3" android:label="@string/dummyLabel" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
+
+ <application android:debuggable="true">
+ <receiver android:name=".TestReceiver" android:attributionTags="attribution1|attribution2"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="ACTION_TEST" />
+ </intent-filter>
+ </receiver>
+ </application>
+
+</manifest>
diff --git a/tests/tests/appop/AppWithReceiverAttribution/res/values/strings.xml b/tests/tests/appop/AppWithReceiverAttribution/res/values/strings.xml
new file mode 100644
index 0000000..2d02f14
--- /dev/null
+++ b/tests/tests/appop/AppWithReceiverAttribution/res/values/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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.
+ -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dummyLabel">A feature</string>
+</resources>
diff --git a/tests/tests/appop/AppWithReceiverAttribution/src/android/app/appops/cts/appwithreceiverattribution/TestReceiver.java b/tests/tests/appop/AppWithReceiverAttribution/src/android/app/appops/cts/appwithreceiverattribution/TestReceiver.java
new file mode 100644
index 0000000..998192e
--- /dev/null
+++ b/tests/tests/appop/AppWithReceiverAttribution/src/android/app/appops/cts/appwithreceiverattribution/TestReceiver.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.appops.cts.appwithreceiverattribution;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class TestReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ }
+}
diff --git a/tests/tests/appop/jni/android/app/appops/cts/AppOpsLoggingTest.cpp b/tests/tests/appop/jni/android/app/appops/cts/AppOpsLoggingTest.cpp
index b5af257..dd98bc9 100644
--- a/tests/tests/appop/jni/android/app/appops/cts/AppOpsLoggingTest.cpp
+++ b/tests/tests/appop/jni/android/app/appops/cts/AppOpsLoggingTest.cpp
@@ -60,4 +60,4 @@
if (jMessage != nullptr) {
env->ReleaseStringUTFChars(jMessage, nativeMessage);
}
-}
+}
\ No newline at end of file
diff --git a/tests/tests/appop/ndk-jni/android/app/appops/cts/NDKAppOpsLoggingTest.cpp b/tests/tests/appop/ndk-jni/android/app/appops/cts/NDKAppOpsLoggingTest.cpp
new file mode 100644
index 0000000..3abfe79
--- /dev/null
+++ b/tests/tests/appop/ndk-jni/android/app/appops/cts/NDKAppOpsLoggingTest.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#include <jni.h>
+#include <aaudio/AAudio.h>
+
+// Start and stop audio stream from native code
+extern "C" JNIEXPORT void JNICALL
+Java_android_app_appops_cts_AppOpsLoggingTestKt_nativeStartStopAudioRecord(JNIEnv* env, jobject obj,
+ jboolean jIsShared, jboolean jIsLowLatency, jstring jPackageName, jstring jAttributionTag) {
+ jclass exception = env->FindClass("java/lang/RuntimeException");
+
+ const char *nativePackageName = env->GetStringUTFChars(jPackageName, 0);
+
+ const char *nativeAttributionTag;
+ if (jAttributionTag != nullptr) {
+ nativeAttributionTag = env->GetStringUTFChars(jAttributionTag, 0);
+ } else {
+ nativeAttributionTag = nullptr;
+ }
+
+ AAudioStreamBuilder *builder;
+ aaudio_result_t result = AAudio_createStreamBuilder(&builder);
+ if (result != AAUDIO_OK) {
+ env->ThrowNew(exception, "Failed to create audio stream builder");
+ goto release_jni_strings_then_return;
+ }
+
+ // Just some valid parameters
+ AAudioStreamBuilder_setDirection(builder, AAUDIO_DIRECTION_INPUT);
+
+ if (jIsLowLatency) {
+ AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
+ } else {
+ AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_NONE);
+ }
+
+ if (jIsShared) {
+ AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_SHARED);
+ } else {
+ AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_EXCLUSIVE);
+ }
+ // Set app-ops logging related parameters
+ AAudioStreamBuilder_setPackageName(builder, nativePackageName);
+ AAudioStreamBuilder_setAttributionTag(builder, nativeAttributionTag);
+
+ AAudioStream *stream;
+ result = AAudioStreamBuilder_openStream(builder, &stream);
+ if (result != AAUDIO_OK) {
+ env->ThrowNew(exception, "Failed to create audio stream");
+ goto delete_builder_then_return;
+ }
+
+ result = AAudioStream_requestStart(stream);
+ if (result != AAUDIO_OK) {
+ env->ThrowNew(exception, "Failed to start audio stream");
+ goto close_stream_then_return;
+ }
+
+close_stream_then_return:
+ AAudioStream_requestStop(stream);
+ AAudioStream_close(stream);
+
+delete_builder_then_return:
+ AAudioStreamBuilder_delete(builder);
+
+release_jni_strings_then_return:
+ env->ReleaseStringUTFChars(jPackageName, nativePackageName);
+
+ if (jAttributionTag != nullptr) {
+ env->ReleaseStringUTFChars(jAttributionTag, nativeAttributionTag);
+ }
+}
\ No newline at end of file
diff --git a/tests/tests/appop/src/android/app/appops/cts/AppOpsLoggingTest.kt b/tests/tests/appop/src/android/app/appops/cts/AppOpsLoggingTest.kt
index 4d0e2b1..20565e1 100644
--- a/tests/tests/appop/src/android/app/appops/cts/AppOpsLoggingTest.kt
+++ b/tests/tests/appop/src/android/app/appops/cts/AppOpsLoggingTest.kt
@@ -29,6 +29,7 @@
import android.app.AppOpsManager.OPSTR_GET_USAGE_STATS
import android.app.AppOpsManager.OPSTR_READ_CONTACTS
import android.app.AppOpsManager.OPSTR_READ_EXTERNAL_STORAGE
+import android.app.AppOpsManager.OPSTR_RECORD_AUDIO
import android.app.AppOpsManager.OPSTR_SEND_SMS
import android.app.AppOpsManager.OPSTR_WRITE_CONTACTS
import android.app.AppOpsManager.OnOpNotedCallback
@@ -57,6 +58,9 @@
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
+import android.media.AudioAttributes
+import android.media.AudioRecord
+import android.media.MediaRecorder
import android.net.wifi.WifiManager
import android.os.Bundle
import android.os.DropBoxManager
@@ -97,6 +101,13 @@
message: String? = null
)
+private external fun nativeStartStopAudioRecord(
+ isShared: Boolean,
+ isLowLatency: Boolean,
+ packageName: String,
+ attributionTag: String? = null
+)
+
@AppModeFull(reason = "Test relies on other app to connect to. Instant apps can't see other apps")
class AppOpsLoggingTest {
private val context = InstrumentationRegistry.getInstrumentation().targetContext as Context
@@ -136,6 +147,7 @@
@Before
fun loadNativeCode() {
System.loadLibrary("CtsAppOpsTestCases_jni")
+ System.loadLibrary("NDKCtsAppOpsTestCases_jni")
}
@Before
@@ -648,6 +660,93 @@
assertThat(noted[0].second.map { it.methodName }).contains("getCellInfo")
}
+ /**
+ * Realistic end-to-end test for recording audio
+ */
+ @Test
+ fun recordAudio() {
+ val ar = AudioRecord.Builder()
+ .setContext(context.createAttributionContext(TEST_ATTRIBUTION_TAG)).build()
+ try {
+ ar.startRecording()
+ ar.stop()
+ } finally {
+ ar.release()
+ }
+
+ eventually {
+ assertThat(asyncNoted[0].op).isEqualTo(OPSTR_RECORD_AUDIO)
+ assertThat(asyncNoted[0].attributionTag).isEqualTo(TEST_ATTRIBUTION_TAG)
+ }
+ }
+
+ /**
+ * Realistic end-to-end test for recording low latency audio
+ */
+ @Test
+ fun recordAudioLowLatency() {
+ val ar = AudioRecord.Builder()
+ .setAudioAttributes(AudioAttributes.Builder()
+ .setFlags(AudioAttributes.FLAG_LOW_LATENCY)
+ .setCapturePreset(MediaRecorder.AudioSource.DEFAULT).build())
+ .setContext(context.createAttributionContext(TEST_ATTRIBUTION_TAG)).build()
+ try {
+ ar.startRecording()
+ ar.stop()
+ } finally {
+ ar.release()
+ }
+
+ eventually {
+ assertThat(asyncNoted[0].op).isEqualTo(OPSTR_RECORD_AUDIO)
+ assertThat(asyncNoted[0].attributionTag).isEqualTo(TEST_ATTRIBUTION_TAG)
+ }
+ }
+
+ /**
+ * Realistic end-to-end test for recording using the public native API with shared, low latency
+ */
+ @Test
+ fun recordAudioNativeLowLatencyShared() {
+ nativeStartStopAudioRecord(isShared = true, isLowLatency = true,
+ packageName = context.packageName, attributionTag = TEST_ATTRIBUTION_TAG)
+
+ eventually {
+ assertThat(asyncNoted[0].op).isEqualTo(OPSTR_RECORD_AUDIO)
+ assertThat(asyncNoted[0].attributionTag).isEqualTo(TEST_ATTRIBUTION_TAG)
+ }
+ }
+
+ /**
+ * Realistic end-to-end test for recording using the public native API in exclusive low latency
+ * mode
+ */
+ @Test
+ fun recordAudioNativeLowLatencyExclusive() {
+ nativeStartStopAudioRecord(isShared = false, isLowLatency = true,
+ packageName = context.packageName, attributionTag = TEST_ATTRIBUTION_TAG)
+
+ eventually {
+ assertThat(asyncNoted[0].op).isEqualTo(OPSTR_RECORD_AUDIO)
+ assertThat(asyncNoted[0].attributionTag).isEqualTo(TEST_ATTRIBUTION_TAG)
+ }
+ }
+
+ /**
+ * Realistic end-to-end test for recording using the public native API in shared normal latency
+ * mode
+ */
+ @Test
+ fun recordAudioNativeShared() {
+ nativeStartStopAudioRecord(isShared = true, isLowLatency = false,
+ packageName = context.packageName, attributionTag = TEST_ATTRIBUTION_TAG)
+
+ eventually {
+ assertThat(asyncNoted[0].op).isEqualTo(OPSTR_RECORD_AUDIO)
+ assertThat(asyncNoted[0].attributionTag).isEqualTo(TEST_ATTRIBUTION_TAG)
+ }
+ }
+
private fun openCamera(context: Context) {
val cameraManager = context.getSystemService(CameraManager::class.java)
@@ -688,7 +787,7 @@
*/
@Test
fun openCameraWithDefaultAttribution() {
- openCamera(context.createAttributionContext(null))
+ openCamera(context)
}
/**
diff --git a/tests/tests/appop/src/android/app/appops/cts/AttributionTest.kt b/tests/tests/appop/src/android/app/appops/cts/AttributionTest.kt
index 8aba608..d8fc252 100644
--- a/tests/tests/appop/src/android/app/appops/cts/AttributionTest.kt
+++ b/tests/tests/appop/src/android/app/appops/cts/AttributionTest.kt
@@ -17,9 +17,12 @@
package android.app.appops.cts
import android.app.AppOpsManager
+import android.app.AppOpsManager.OPSTR_READ_CONTACTS
import android.app.AppOpsManager.OPSTR_WIFI_SCAN
import android.app.AppOpsManager.OP_FLAGS_ALL
import android.app.AppOpsManager.SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE
+import android.content.Intent
+import android.content.ComponentName
import android.platform.test.annotations.AppModeFull
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
@@ -43,6 +46,7 @@
class AttributionTest {
private val instrumentation = InstrumentationRegistry.getInstrumentation()
private val context = instrumentation.targetContext
+ private val uiAutomation = instrumentation.getUiAutomation()
private val appOpsManager = context.getSystemService(AppOpsManager::class.java)
private val appUid by lazy { context.packageManager.getPackageUid(APP_PKG, 0) }
@@ -67,6 +71,47 @@
}
@Test
+ fun manifestReceiverTagging() {
+ val PKG = "android.app.appops.cts.appwithreceiverattribution"
+
+ installApk("CtsAppWithReceiverAttribution.apk")
+ val uid = context.packageManager.getPackageUid(PKG, 0)
+
+ val intent = Intent("ACTION_TEST")
+ intent.setComponent(ComponentName.createRelative(PKG, ".TestReceiver"))
+ intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND)
+
+ runWithShellPermissionIdentity {
+ uiAutomation.grantRuntimePermission(PKG, android.Manifest.permission.READ_CONTACTS)
+ appOpsManager.noteOp(OPSTR_READ_CONTACTS, uid, PKG, ATTRIBUTION_1, null)
+ appOpsManager.noteOp(OPSTR_READ_CONTACTS, uid, PKG, ATTRIBUTION_2, null)
+ appOpsManager.noteOp(OPSTR_READ_CONTACTS, uid, PKG, ATTRIBUTION_3, null)
+ }
+
+ sleep(1)
+ val before = getOpEntry(uid, PKG, OPSTR_READ_CONTACTS)!!
+ context.sendBroadcast(intent, android.Manifest.permission.READ_CONTACTS)
+ sleep(1)
+
+ eventually {
+ // 1 and 2 should be attributed for the broadcast, 3 should not.
+ val after = getOpEntry(uid, PKG, OPSTR_READ_CONTACTS)!!
+ assertThat(after.attributedOpEntries[ATTRIBUTION_1]!!
+ .getLastAccessTime(OP_FLAGS_ALL))
+ .isNotEqualTo(before.attributedOpEntries[ATTRIBUTION_1]!!
+ .getLastAccessTime(OP_FLAGS_ALL))
+ assertThat(after.attributedOpEntries[ATTRIBUTION_2]!!
+ .getLastAccessTime(OP_FLAGS_ALL))
+ .isNotEqualTo(before.attributedOpEntries[ATTRIBUTION_2]!!
+ .getLastAccessTime(OP_FLAGS_ALL))
+ assertThat(after.attributedOpEntries[ATTRIBUTION_3]!!
+ .getLastAccessTime(OP_FLAGS_ALL))
+ .isEqualTo(before.attributedOpEntries[ATTRIBUTION_3]!!
+ .getLastAccessTime(OP_FLAGS_ALL))
+ }
+ }
+
+ @Test
fun inheritNotedAppOpsOnUpgrade() {
noteForAttribution(ATTRIBUTION_1)
noteForAttribution(ATTRIBUTION_2)
@@ -147,4 +192,4 @@
fun cannotUseTooManyAttributions() {
installApk("AppWithTooManyAttributions.apk")
}
-}
\ No newline at end of file
+}
diff --git a/tests/tests/assist/common/src/android/assist/common/Utils.java b/tests/tests/assist/common/src/android/assist/common/Utils.java
index 50e4d42..86062b2 100755
--- a/tests/tests/assist/common/src/android/assist/common/Utils.java
+++ b/tests/tests/assist/common/src/android/assist/common/Utils.java
@@ -48,6 +48,7 @@
public static final String ASSIST_STRUCTURE_KEY = "assist_structure";
public static final String ASSIST_CONTENT_KEY = "assist_content";
public static final String ASSIST_BUNDLE_KEY = "assist_bundle";
+ public static final String ASSIST_IS_ACTIVITY_ID_NULL = "assist_is_activity_id_null";
public static final String ASSIST_SCREENSHOT_KEY = "assist_screenshot";
public static final String SCREENSHOT_COLOR_KEY = "set_screenshot_color";
public static final String COMPARE_SCREENSHOT_KEY = "compare_screenshot";
@@ -55,6 +56,7 @@
public static final String DISPLAY_HEIGHT_KEY = "dislay_height";
public static final String SCROLL_X_POSITION = "scroll_x_position";
public static final String SCROLL_Y_POSITION = "scroll_y_position";
+ public static final String SHOW_SESSION_FLAGS_TO_SET = "show_session_flags_to_set";
/** Lifecycle Test intent constants */
public static final String LIFECYCLE_PREFIX = ACTION_PREFIX + "lifecycle_";
diff --git a/tests/tests/assist/service/src/android/assist/service/MainInteractionService.java b/tests/tests/assist/service/src/android/assist/service/MainInteractionService.java
index d5e3a6d..5b468e4 100644
--- a/tests/tests/assist/service/src/android/assist/service/MainInteractionService.java
+++ b/tests/tests/assist/service/src/android/assist/service/MainInteractionService.java
@@ -16,6 +16,7 @@
package android.assist.service;
+import static android.assist.common.Utils.SHOW_SESSION_FLAGS_TO_SET;
import static android.service.voice.VoiceInteractionSession.SHOW_WITH_ASSIST;
import static android.service.voice.VoiceInteractionSession.SHOW_WITH_SCREENSHOT;
@@ -118,11 +119,12 @@
if (extras == null) {
extras = new Bundle();
}
-
+ int showSessionFlags = extras.getInt(SHOW_SESSION_FLAGS_TO_SET,
+ SHOW_WITH_ASSIST | SHOW_WITH_SCREENSHOT);
extras.putString(Utils.TESTCASE_TYPE, mIntent.getStringExtra(Utils.TESTCASE_TYPE));
extras.putParcelable(Utils.EXTRA_REMOTE_CALLBACK, mRemoteCallback);
MainInteractionService.this.showSession(
- extras, SHOW_WITH_ASSIST | SHOW_WITH_SCREENSHOT);
+ extras, showSessionFlags);
} else {
Log.e(TAG, "MainInteractionServiceBroadcastReceiver: invalid action " + action);
}
diff --git a/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java b/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
index ad8815f..6a0b7f9 100644
--- a/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
+++ b/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
@@ -149,6 +149,12 @@
}
@Override
+ public void onHandleAssist(AssistState state) {
+ mAssistData.putBoolean(Utils.ASSIST_IS_ACTIVITY_ID_NULL, state.getActivityId() == null);
+ super.onHandleAssist(state);
+ }
+
+ @Override
@SuppressWarnings("deprecation")
public void onHandleAssist(/*@Nullable */Bundle data, /*@Nullable*/ AssistStructure structure,
/*@Nullable*/ AssistContent content) {
diff --git a/tests/tests/assist/src/android/assist/cts/AssistTestBase.java b/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
index 2aecbd6..8c25dea 100644
--- a/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
+++ b/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
@@ -65,7 +65,6 @@
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
-import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.rules.RuleChain;
import org.junit.runner.RunWith;
@@ -120,6 +119,7 @@
protected ActivityManager mActivityManager;
private TestStartActivity mTestActivity;
+ protected boolean mIsActivityIdNull;
protected AssistContent mAssistContent;
protected AssistStructure mAssistStructure;
protected boolean mScreenshot;
@@ -163,6 +163,7 @@
mAssistStructure = null;
mAssistContent = null;
mAssistBundle = null;
+ mIsActivityIdNull = false;
mActionLatchReceiver = new ActionLatchReceiver();
@@ -293,7 +294,11 @@
* Send broadcast to MainInteractionService to start a session
*/
protected AutoResetLatch startSession() {
- return startSession(mTestName, new Bundle());
+ return startSession(new Bundle());
+ }
+
+ protected AutoResetLatch startSession(Bundle extras) {
+ return startSession(mTestName, extras);
}
protected AutoResetLatch startSession(String testName, Bundle extras) {
@@ -331,6 +336,19 @@
}
/**
+ * Checks the nullness of the received
+ * {@link android.service.voice.VoiceInteractionSession.ActivityId}.
+ *
+ * @param isActivityIdNull True if activityId should be null.
+ */
+ protected void verifyActivityIdNullness(boolean isActivityIdNull) {
+ if (mIsActivityIdNull != isActivityIdNull) {
+ fail(String.format("Should %s have been null - ActivityId: %s",
+ isActivityIdNull ? "" : "not", mIsActivityIdNull));
+ }
+ }
+
+ /**
* Checks that the nullness of values are what we expect.
*
* @param isBundleNull True if assistBundle should be null.
@@ -645,6 +663,7 @@
}
protected void setAssistResults(Bundle assistData) {
+ mIsActivityIdNull = assistData.getBoolean(Utils.ASSIST_IS_ACTIVITY_ID_NULL);;
mAssistBundle = assistData.getBundle(Utils.ASSIST_BUNDLE_KEY);
mAssistStructure = assistData.getParcelable(Utils.ASSIST_STRUCTURE_KEY);
mAssistContent = assistData.getParcelable(Utils.ASSIST_CONTENT_KEY);
diff --git a/tests/tests/assist/src/android/assist/cts/ExtraAssistDataTest.java b/tests/tests/assist/src/android/assist/cts/ExtraAssistDataTest.java
index d465880..74468ff 100644
--- a/tests/tests/assist/src/android/assist/cts/ExtraAssistDataTest.java
+++ b/tests/tests/assist/src/android/assist/cts/ExtraAssistDataTest.java
@@ -15,6 +15,8 @@
*/
package android.assist.cts;
+import static android.assist.common.Utils.SHOW_SESSION_FLAGS_TO_SET;
+
import android.assist.common.AutoResetLatch;
import android.assist.common.Utils;
import android.content.Intent;
@@ -67,4 +69,23 @@
assertWithMessage("Wrong value for EXTRA_ASSIST_UID").that(actualUid)
.isEqualTo(expectedUid);
}
+
+ @Test
+ public void testAssistContentAndDataNullWhenNoFlagsToShowSession() throws Exception {
+ if (mActivityManager.isLowRamDevice()) {
+ Log.d(TAG, "Not running assist tests on low-RAM device.");
+ return;
+ }
+ startTest(TEST_CASE_TYPE);
+ waitForAssistantToBeReady();
+ start3pApp(TEST_CASE_TYPE);
+
+ Bundle bundle = new Bundle();
+ bundle.putInt(SHOW_SESSION_FLAGS_TO_SET, 0);
+ final AutoResetLatch latch = startSession(bundle);
+ waitForContext(latch);
+
+ verifyActivityIdNullness(/* isActivityIdNull = */ false);
+ verifyAssistDataNullness(true, true, true, true);
+ }
}
diff --git a/tests/tests/batterysaving/src/android/os/cts/powerexemption/PowerExemptionTest.java b/tests/tests/batterysaving/src/android/os/cts/powerexemption/PowerExemptionTest.java
new file mode 100644
index 0000000..c5a73ed
--- /dev/null
+++ b/tests/tests/batterysaving/src/android/os/cts/powerexemption/PowerExemptionTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os.cts.powerexemption;
+
+
+import static org.junit.Assert.assertNotNull;
+
+import android.content.Context;
+import android.os.PowerExemptionManager;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class PowerExemptionTest {
+
+ @Test
+ public void testPowerExemptionManager_WithClass() {
+ Context context = InstrumentationRegistry.getInstrumentation().getContext();
+ assertNotNull(context.getSystemService(PowerExemptionManager.class));
+ }
+
+ @Test
+ public void testPowerExemptionManager_WithContextString() {
+ Context context = InstrumentationRegistry.getInstrumentation().getContext();
+ assertNotNull(context.getSystemService(Context.POWER_EXEMPTION_SERVICE));
+ }
+}
diff --git a/tests/tests/bionic/Android.build.copy.libs.mk b/tests/tests/bionic/Android.build.copy.libs.mk
index 8900a75..628eeed 100644
--- a/tests/tests/bionic/Android.build.copy.libs.mk
+++ b/tests/tests/bionic/Android.build.copy.libs.mk
@@ -22,6 +22,12 @@
elftls_dlopen_ie_error_helper/elftls_dlopen_ie_error_helper \
exec_linker_helper/exec_linker_helper \
exec_linker_helper_lib.so \
+ heap_tagging_async_helper/heap_tagging_async_helper \
+ heap_tagging_disabled_helper/heap_tagging_disabled_helper \
+ heap_tagging_static_sync_helper/heap_tagging_static_sync_helper \
+ heap_tagging_static_async_helper/heap_tagging_static_async_helper \
+ heap_tagging_static_disabled_helper/heap_tagging_static_disabled_helper \
+ heap_tagging_sync_helper/heap_tagging_sync_helper \
inaccessible_libs/libtestshared.so \
inaccessible_libs/libtestshared.so \
ld_config_test_helper/ld_config_test_helper \
diff --git a/tests/tests/car/src/android/car/cts/CarPowerManagerTest.java b/tests/tests/car/src/android/car/cts/CarPowerManagerTest.java
index 71dcf72..6be92b6 100644
--- a/tests/tests/car/src/android/car/cts/CarPowerManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarPowerManagerTest.java
@@ -62,10 +62,10 @@
*/
@Test
public void testApplyNewPowerPolicy() throws Exception {
- PowerPolicyChangeListenerImpl listenerAudioOne = new PowerPolicyChangeListenerImpl();
- PowerPolicyChangeListenerImpl listenerAudioTwo = new PowerPolicyChangeListenerImpl();
- PowerPolicyChangeListenerImpl listenerWifi = new PowerPolicyChangeListenerImpl();
- PowerPolicyChangeListenerImpl listenerLocation = new PowerPolicyChangeListenerImpl();
+ PowerPolicyListenerImpl listenerAudioOne = new PowerPolicyListenerImpl();
+ PowerPolicyListenerImpl listenerAudioTwo = new PowerPolicyListenerImpl();
+ PowerPolicyListenerImpl listenerWifi = new PowerPolicyListenerImpl();
+ PowerPolicyListenerImpl listenerLocation = new PowerPolicyListenerImpl();
CarPowerPolicyFilter filterAudio = new CarPowerPolicyFilter.Builder()
.setComponents(PowerComponent.AUDIO).build();
CarPowerPolicyFilter filterWifi = new CarPowerPolicyFilter.Builder()
@@ -75,16 +75,16 @@
String policyId = "audio_on_wifi_off";
definePowerPolicy(policyId, "AUDIO", "WIFI");
- mCarPowerManager.addPowerPolicyChangeListener(mExecutor, listenerAudioOne, filterAudio);
- mCarPowerManager.addPowerPolicyChangeListener(mExecutor, listenerAudioTwo, filterAudio);
- mCarPowerManager.addPowerPolicyChangeListener(mExecutor, listenerWifi, filterWifi);
- mCarPowerManager.addPowerPolicyChangeListener(mExecutor, listenerLocation, filterLocation);
- mCarPowerManager.removePowerPolicyChangeListener(listenerAudioTwo);
+ mCarPowerManager.addPowerPolicyListener(mExecutor, filterAudio, listenerAudioOne);
+ mCarPowerManager.addPowerPolicyListener(mExecutor, filterAudio, listenerAudioTwo);
+ mCarPowerManager.addPowerPolicyListener(mExecutor, filterWifi, listenerWifi);
+ mCarPowerManager.addPowerPolicyListener(mExecutor, filterLocation, listenerLocation);
+ mCarPowerManager.removePowerPolicyListener(listenerAudioTwo);
applyPowerPolicy(policyId);
CarPowerPolicy policy = mCarPowerManager.getCurrentPowerPolicy();
assertWithMessage("Current power policy").that(policy).isNotNull();
- assertWithMessage("Current power policy ID").that(policy.policyId).isEqualTo(policyId);
+ assertWithMessage("Current power policy ID").that(policy.getPolicyId()).isEqualTo(policyId);
assertWithMessage("Added audio listener's current policy ID")
.that(listenerAudioOne.getCurrentPolicyId(LISTENER_WAIT_TIME_MS))
.isEqualTo(policyId);
@@ -123,15 +123,15 @@
"cmd car_service apply-power-policy %s", policyId);
}
- private final class PowerPolicyChangeListenerImpl implements
- CarPowerManager.CarPowerPolicyChangeListener {
+ private final class PowerPolicyListenerImpl implements
+ CarPowerManager.CarPowerPolicyListener {
private final CountDownLatch mLatch = new CountDownLatch(1);
private String mCurrentPolicyId;
@Override
public void onPolicyChanged(CarPowerPolicy policy) {
- mCurrentPolicyId = policy.policyId;
+ mCurrentPolicyId = policy.getPolicyId();
mLatch.countDown();
}
diff --git a/tests/tests/car/src/android/car/cts/CarWatchdogManagerTest.java b/tests/tests/car/src/android/car/cts/CarWatchdogManagerTest.java
new file mode 100644
index 0000000..5e81672
--- /dev/null
+++ b/tests/tests/car/src/android/car/cts/CarWatchdogManagerTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.cts;
+
+import android.car.Car;
+import android.car.watchdog.CarWatchdogManager;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class CarWatchdogManagerTest extends CarApiTestBase {
+ private static String TAG = CarWatchdogManagerTest.class.getSimpleName();
+
+ private CarWatchdogManager mCarWatchdogManager;
+
+ @Override
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ mCarWatchdogManager = (CarWatchdogManager) getCar().getCarManager(Car.CAR_WATCHDOG_SERVICE);
+ }
+
+ @Test
+ public void testListenIoOveruse() {
+ /**
+ * TODO(b/178199164): Listen for disk I/O overuse.
+ * 1. Add resource overuse listener for I/O resource.
+ * 2. Write huge amount of data to disk such that it exceeds the threshold.
+ * 3. Fetch the I/O overuse stats and check whether the written bytes are >= total written
+ * bytes.
+ * 4. Check whether the resource overuse listener is called and the provided written bytes
+ * are >= total written bytes.
+ * 5. Remove the resource overuse listener.
+ */
+ }
+}
diff --git a/tests/tests/content/Android.bp b/tests/tests/content/Android.bp
index 7f04d85..77eb483 100644
--- a/tests/tests/content/Android.bp
+++ b/tests/tests/content/Android.bp
@@ -35,6 +35,7 @@
"android.test.mock",
],
static_libs: [
+ "apache-commons-compress",
"compatibility-device-util-axt",
"ctstestrunner-axt",
"services.core",
@@ -48,6 +49,7 @@
"androidx.test.core",
"cts-install-lib",
"ShortcutManagerTestUtils",
+ "libincfs-prebuilt",
],
// Use multi-dex as the compatibility-common-util-devicesidelib dependency
// on compatibility-device-util-axt pushes us beyond 64k methods.
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
index 8ae80df..5ed1de3 100644
--- a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
@@ -446,6 +446,10 @@
}
}
+ public void testRequestManageMedia() {
+ assertCanBeHandled(new Intent(Settings.ACTION_REQUEST_MANAGE_MEDIA));
+ }
+
public void testInteractAcrossProfilesSettings() {
PackageManager packageManager = mContext.getPackageManager();
if (packageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_PROFILES)) {
@@ -553,6 +557,10 @@
assertCanBeHandled(new Intent(Settings.ACTION_WIFI_ADD_NETWORKS));
}
+ public void testManageUnusedAppsIntent() {
+ assertCanBeHandled(new Intent(Intent.ACTION_MANAGE_UNUSED_APPS));
+ }
+
private boolean isHandheld() {
// handheld nature is not exposed to package manager, for now
// we check for touchscreen and NOT watch, NOT tv and NOT car
diff --git a/tests/tests/content/src/android/content/cts/ClipDescriptionTest.java b/tests/tests/content/src/android/content/cts/ClipDescriptionTest.java
index fa4eea0..6c33f4a 100644
--- a/tests/tests/content/src/android/content/cts/ClipDescriptionTest.java
+++ b/tests/tests/content/src/android/content/cts/ClipDescriptionTest.java
@@ -32,12 +32,16 @@
import android.support.test.uiautomator.Until;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
+import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextLinks;
import androidx.test.InstrumentationRegistry;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.google.common.collect.Range;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -55,6 +59,9 @@
private UiDevice mUiDevice;
private Context mContext;
+ private static final String SIXTY_CHARS =
+ "Hello this is a string of sixty characters in length exactly";
+
@Before
public void setUp() throws Exception {
mContext = InstrumentationRegistry.getTargetContext();
@@ -133,6 +140,95 @@
assertThat(clipboardManager.getPrimaryClipDescription().isStyledText()).isFalse();
}
+ @Test
+ public void testClassificationNotCompletedBeforeCopy() {
+ ClipDescription clipDescription = new ClipDescription(
+ "label", new String[] { ClipDescription.MIMETYPE_TEXT_PLAIN });
+ assertThat(clipDescription.getClassificationStatus())
+ .isEqualTo(ClipDescription.CLASSIFICATION_NOT_COMPLETE);
+
+ ClipData clipData = ClipData.newPlainText("label", "Just some text");
+ assertThat(clipDescription.getClassificationStatus())
+ .isEqualTo(ClipDescription.CLASSIFICATION_NOT_COMPLETE);
+ }
+
+ @Test
+ public void testClassificationNotPerformedForVeryLongText() {
+ StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < 100; i++) {
+ builder.append(SIXTY_CHARS);
+ }
+ String longString = builder.toString();
+ ClipData clipData = ClipData.newPlainText("label", longString);
+
+ ClipboardManager clipboardManager = (ClipboardManager)
+ InstrumentationRegistry.getTargetContext().getSystemService(
+ Context.CLIPBOARD_SERVICE);
+ clipboardManager.setPrimaryClip(clipData);
+ ClipDescription description = clipboardManager.getPrimaryClipDescription();
+ assertThat(description.getClassificationStatus())
+ .isEqualTo(ClipDescription.CLASSIFICATION_NOT_PERFORMED);
+ assertThat(clipboardManager.getPrimaryClip().getItemAt(0).getTextLinks())
+ .isNull();
+ }
+
+ @Test
+ public void testClassificationConfidenceValuesAreValid() throws InterruptedException {
+ ClipData clipData = ClipData.newPlainText(
+ "label", "Hi Sam, try www.android.com on 05/04/2021 then visit "
+ + "221B Baker Street, London and email test@example.com");
+ ClipboardManager clipboardManager = (ClipboardManager)
+ InstrumentationRegistry.getTargetContext().getSystemService(
+ Context.CLIPBOARD_SERVICE);
+ clipboardManager.setPrimaryClip(clipData);
+
+ ClipDescription description = clipboardManager.getPrimaryClipDescription();
+ for (int i = 0; i < 10; i++) {
+ description = clipboardManager.getPrimaryClipDescription();
+ if (description.getClassificationStatus()
+ != ClipDescription.CLASSIFICATION_NOT_COMPLETE) {
+ break;
+ }
+ Thread.sleep(1000);
+ }
+
+ if (description.getClassificationStatus() == ClipDescription.CLASSIFICATION_NOT_PERFORMED) {
+ return;
+ }
+
+ float urlConfidence = description.getConfidenceScore(TextClassifier.TYPE_URL);
+ float dateConfidence = description.getConfidenceScore(TextClassifier.TYPE_DATE);
+ float addressConfidence = description.getConfidenceScore(TextClassifier.TYPE_ADDRESS);
+ float emailConfidence = description.getConfidenceScore(TextClassifier.TYPE_EMAIL);
+
+ assertThat(urlConfidence).isIn(Range.closed(0f, 1f));
+ assertThat(dateConfidence).isIn(Range.closed(0f, 1f));
+ assertThat(addressConfidence).isIn(Range.closed(0f, 1f));
+ assertThat(emailConfidence).isIn(Range.closed(0f, 1f));
+
+ if (urlConfidence > 0 || dateConfidence > 0 || addressConfidence > 0
+ || emailConfidence > 0) {
+ TextLinks textLinks =
+ clipboardManager.getPrimaryClip().getItemAt(0).getTextLinks();
+ assertThat(getHighestConfidence(TextClassifier.TYPE_URL, textLinks))
+ .isEqualTo(urlConfidence);
+ assertThat(getHighestConfidence(TextClassifier.TYPE_DATE, textLinks))
+ .isEqualTo(dateConfidence);
+ assertThat(getHighestConfidence(TextClassifier.TYPE_ADDRESS, textLinks))
+ .isEqualTo(addressConfidence);
+ assertThat(getHighestConfidence(TextClassifier.TYPE_EMAIL, textLinks))
+ .isEqualTo(emailConfidence);
+ }
+ }
+
+ private float getHighestConfidence(String entity, TextLinks textLinks) {
+ float result = 0;
+ for (TextLinks.TextLink textLink : textLinks.getLinks()) {
+ result = Math.max(result, textLink.getConfidenceScore(entity));
+ }
+ return result;
+ }
+
/**
* Convert a System.currentTimeMillis() value to a time of day value like
* that printed in logs. MM-DD-YY HH:MM:SS.MMM
diff --git a/tests/tests/content/src/android/content/cts/ClipboardManagerTest.java b/tests/tests/content/src/android/content/cts/ClipboardManagerTest.java
index f507272..b2379aa 100644
--- a/tests/tests/content/src/android/content/cts/ClipboardManagerTest.java
+++ b/tests/tests/content/src/android/content/cts/ClipboardManagerTest.java
@@ -23,6 +23,7 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
import android.Manifest;
import android.app.Activity;
@@ -34,6 +35,7 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
@@ -53,13 +55,13 @@
@RunWith(AndroidJUnit4.class)
//@AppModeFull // TODO(Instant) Should clip board data be visible?
public class ClipboardManagerTest {
- private Context mContext;
+ private final Context mContext = InstrumentationRegistry.getTargetContext();
private ClipboardManager mClipboardManager;
private UiDevice mUiDevice;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
+ assumeTrue("Skipping Test: Wear-Os does not support ClipboardService", hasAutoFillFeature());
mClipboardManager = mContext.getSystemService(ClipboardManager.class);
mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
mUiDevice.wakeUp();
@@ -398,4 +400,9 @@
assertNull(item.getUri());
}
}
+
+ private boolean hasAutoFillFeature() {
+ return mContext.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_AUTOFILL);
+ }
}
diff --git a/tests/tests/content/src/android/content/cts/ContentProviderTest.java b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
index 0e1172a..1bc4ddc 100644
--- a/tests/tests/content/src/android/content/cts/ContentProviderTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
@@ -16,11 +16,13 @@
package android.content.cts;
+import static org.testng.Assert.assertThrows;
+
import android.content.ContentProvider;
+import android.content.ContentProvider.CallingIdentity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
-import android.content.ContentProvider.CallingIdentity;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.database.Cursor;
@@ -28,10 +30,9 @@
import android.net.Uri;
import android.os.Binder;
import android.os.ParcelFileDescriptor;
+import android.os.UserHandle;
import android.test.AndroidTestCase;
-import android.content.cts.R;
-
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -260,6 +261,31 @@
provider.checkUriPermission(uri, android.os.Process.myUid(), 0));
}
+ public void testCreateContentUriAsUser_nullUri_throwsNPE() {
+ assertThrows(
+ NullPointerException.class,
+ () -> ContentProvider.createContentUriAsUser(null, UserHandle.of(7)));
+ }
+
+ public void testCreateContentUriAsUser_nonContentUri_throwsIAE() {
+ final Uri uri = Uri.parse("notcontent://test");
+ assertThrows(
+ IllegalArgumentException.class,
+ () -> ContentProvider.createContentUriAsUser(uri, UserHandle.of(7)));
+ }
+
+ public void testCreateContentUriAsUser_UriWithDifferentUserID_throwsIAE() {
+ final Uri uri = Uri.parse("content://07@test");
+ assertThrows(
+ IllegalArgumentException.class,
+ () -> ContentProvider.createContentUriAsUser(uri, UserHandle.of(7)));
+ }
+
+ public void testCreateContentUriAsUser_UriWithUserID_unchanged() {
+ final Uri uri = Uri.parse("content://7@test");
+ assertEquals(uri, ContentProvider.createContentUriAsUser(uri, UserHandle.of(7)));
+ }
+
private class MockContentProvider extends ContentProvider {
private int mInsertCount = 0;
diff --git a/tests/tests/content/src/android/content/cts/ContextTest.java b/tests/tests/content/src/android/content/cts/ContextTest.java
index 3a7edf1..a5a9e48 100644
--- a/tests/tests/content/src/android/content/cts/ContextTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextTest.java
@@ -203,6 +203,38 @@
assertEquals(null, mContext.getAttributionTag());
}
+ public void testContextParams() throws Exception {
+ final ContextParams params = new ContextParams.Builder()
+ .setAttributionTag("foo")
+ .setReceiverPackage("bar", "baz")
+ .setRenouncedPermissions(new HashSet<>(Arrays.asList(GRANTED_PERMISSION))).build();
+
+ assertEquals("foo", params.getAttributionTag());
+ assertEquals("bar", params.getReceiverPackage());
+ assertEquals("baz", params.getReceiverAttributionTag());
+ assertEquals(new HashSet<>(Arrays.asList(GRANTED_PERMISSION)),
+ params.getRenouncedPermissions());
+ }
+
+ public void testContextParams_Inherit() throws Exception {
+ final ContextParams orig = new ContextParams.Builder()
+ .setAttributionTag("foo").build();
+ {
+ final ContextParams params = new ContextParams.Builder(orig).build();
+ assertEquals("foo", params.getAttributionTag());
+ }
+ {
+ final ContextParams params = new ContextParams.Builder(orig)
+ .setAttributionTag("bar").build();
+ assertEquals("bar", params.getAttributionTag());
+ }
+ {
+ final ContextParams params = new ContextParams.Builder(orig)
+ .setAttributionTag(null).build();
+ assertEquals(null, params.getAttributionTag());
+ }
+ }
+
public void testCreateContext_WithRenouncedPermissions() throws Exception {
final Context attrib = mContext.createContext(new ContextParams.Builder()
.setRenouncedPermissions(
diff --git a/tests/tests/content/src/android/content/pm/cts/IncrementalDeviceConnection.java b/tests/tests/content/src/android/content/pm/cts/IncrementalDeviceConnection.java
new file mode 100644
index 0000000..a4b6cd7
--- /dev/null
+++ b/tests/tests/content/src/android/content/pm/cts/IncrementalDeviceConnection.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm.cts;
+
+import static android.system.OsConstants.EAGAIN;
+import static android.system.OsConstants.EINTR;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import android.annotation.NonNull;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ServiceManager;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+import android.system.StructPollfd;
+import android.util.Slog;
+
+import com.android.incfs.install.IDeviceConnection;
+import com.android.incfs.install.ILogger;
+
+import libcore.io.IoUtils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+
+public class IncrementalDeviceConnection implements IDeviceConnection {
+ private static final String TAG = "IncrementalDeviceConnection";
+ private static final boolean DEBUG = true;
+
+ private static final int POLL_TIMEOUT_MS = 300000;
+
+ enum ConnectionType {
+ RELIABLE,
+ UNRELIABLE,
+ }
+
+ private ConnectionType mConnectionType;
+ private final Thread mShellCommand;
+ private final ParcelFileDescriptor mPfd;
+ private final FileDescriptor mFd;
+ private final StructPollfd[] mPollfds = new StructPollfd[]{
+ new StructPollfd()
+ };
+
+ private IncrementalDeviceConnection(ConnectionType connectionType, Thread shellCommand,
+ ParcelFileDescriptor pfd) {
+ mConnectionType = connectionType;
+ mShellCommand = shellCommand;
+ mPfd = pfd;
+ mFd = pfd.getFileDescriptor();
+
+ mPollfds[0].fd = mFd;
+ mPollfds[0].events = (short) OsConstants.POLLIN;
+ mPollfds[0].revents = 0;
+ mPollfds[0].userData = null;
+
+ mShellCommand.start();
+ }
+
+ @Override
+ public int read(ByteBuffer buffer, long timeoutMs) throws IOException {
+ final boolean blocking = buffer.position() == 0;
+ while (true) {
+ try {
+ int res = Os.poll(mPollfds, blocking ? POLL_TIMEOUT_MS : 0);
+ if (res < 0) {
+ return res;
+ }
+ if (res == 0) {
+ if (blocking) {
+ throw new IOException("timeout");
+ }
+ return 0;
+ }
+ return Os.read(mFd, buffer);
+ } catch (ErrnoException e) {
+ if (e.errno == EINTR) {
+ continue;
+ }
+ if (mConnectionType == ConnectionType.UNRELIABLE) {
+ e.rethrowAsIOException();
+ }
+ if (e.errno == EAGAIN) {
+ if (!blocking) {
+ return 0;
+ }
+ continue;
+ }
+ e.rethrowAsIOException();
+ }
+ }
+ }
+
+ @Override
+ public int write(ByteBuffer buffer, long timeoutMs) throws IOException {
+ try {
+ return Os.write(mFd, buffer);
+ } catch (ErrnoException e) {
+ e.rethrowAsIOException();
+ }
+ return 0;
+ }
+
+ @Override
+ public void close() throws Exception {
+ IoUtils.closeQuietly(mPfd);
+ mShellCommand.join();
+ }
+
+ static class Logger implements ILogger {
+ @Override
+ public void error(Throwable t, String msgFormat, Object... args) {
+ Slog.e(TAG, String.format(msgFormat, args), t);
+ }
+
+ @Override
+ public void warning(String msgFormat, Object... args) {
+ Slog.w(TAG, String.format(msgFormat, args));
+ }
+
+ @Override
+ public void info(String msgFormat, Object... args) {
+ Slog.i(TAG, String.format(msgFormat, args));
+ }
+
+ @Override
+ public void verbose(String msgFormat, Object... args) {
+ if (!DEBUG) {
+ return;
+ }
+ Slog.v(TAG, String.format(msgFormat, args));
+ }
+ }
+
+ static class Factory implements IDeviceConnection.Factory {
+ private final ConnectionType mConnectionType;
+
+ Factory(ConnectionType connectionType) {
+ mConnectionType = connectionType;
+ }
+
+ @Override
+ public IDeviceConnection connectToService(@NonNull String service,
+ @NonNull String[] parameters) throws IOException {
+ ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createSocketPair();
+ IoUtils.setBlocking(pipe[0].getFileDescriptor(), false);
+ IoUtils.setBlocking(pipe[1].getFileDescriptor(), false);
+
+ final ParcelFileDescriptor localPfd = pipe[0];
+ final ParcelFileDescriptor processPfd = pipe[1];
+
+ final ResultReceiver resultReceiver;
+ if (mConnectionType == ConnectionType.RELIABLE) {
+ resultReceiver = new ResultReceiver(null) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ if (resultCode == 0) {
+ return;
+ }
+ try {
+ final String message = readFullStream(
+ new ParcelFileDescriptor.AutoCloseInputStream(localPfd));
+ assertEquals(message, 0, resultCode);
+ } catch (IOException e) {
+ assertNull("Failed to pull error from failed command: " + resultCode
+ + ", exception: " + e, e);
+ }
+ }
+ };
+ } else {
+ resultReceiver = new ResultReceiver(null) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ try {
+ readFullStream(new ParcelFileDescriptor.AutoCloseInputStream(localPfd));
+ } catch (IOException ignored) {
+ }
+ }
+ };
+ }
+
+ final Thread shellCommand = new Thread(() -> {
+ try {
+ final FileDescriptor processFd = processPfd.getFileDescriptor();
+ ServiceManager.getService(service).shellCommand(processFd, processFd, processFd,
+ parameters, null, resultReceiver);
+ } catch (RemoteException e) {
+ if (mConnectionType == ConnectionType.RELIABLE) {
+ assertNull(e);
+ }
+ } finally {
+ IoUtils.closeQuietly(processPfd);
+ }
+ });
+ return new IncrementalDeviceConnection(mConnectionType, shellCommand, localPfd);
+ }
+ }
+
+ private static String readFullStream(InputStream inputStream) throws IOException {
+ try (ByteArrayOutputStream result = new ByteArrayOutputStream()) {
+ final byte[] buffer = new byte[1024];
+ int length;
+ while ((length = inputStream.read(buffer)) != -1) {
+ result.write(buffer, 0, length);
+ }
+ return result.toString("UTF-8");
+ }
+ }
+}
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
index 858d87c..9e14260 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
@@ -21,6 +21,7 @@
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
+import android.annotation.NonNull;
import android.app.UiAutomation;
import android.content.ComponentName;
import android.content.Context;
@@ -44,6 +45,13 @@
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.incfs.install.IBlockTransformer;
+import com.android.incfs.install.IncrementalInstallSession;
+import com.android.incfs.install.PendingBlock;
+
+import libcore.io.IoUtils;
+
+import org.apache.commons.compress.compressors.lz4.BlockLZ4CompressorOutputStream;
import org.junit.After;
import org.junit.Assert;
import org.junit.Assume;
@@ -59,12 +67,17 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.file.Paths;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;
import java.util.Scanner;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
@@ -93,6 +106,8 @@
private static final long EXPECTED_READ_TIME = 1000L;
+ IncrementalInstallSession mSession = null;
+
private static UiAutomation getUiAutomation() {
return InstrumentationRegistry.getInstrumentation().getUiAutomation();
}
@@ -117,13 +132,13 @@
}
private void checkIncrementalDeliveryFeature() throws Exception {
- Assume.assumeTrue(getContext().getPackageManager().hasSystemFeature(
+ Assume.assumeTrue(getPackageManager().hasSystemFeature(
PackageManager.FEATURE_INCREMENTAL_DELIVERY));
}
private void checkIncrementalDeliveryV2Feature() throws Exception {
checkIncrementalDeliveryFeature();
- Assume.assumeTrue(getContext().getPackageManager().hasSystemFeature(
+ Assume.assumeTrue(getPackageManager().hasSystemFeature(
PackageManager.FEATURE_INCREMENTAL_DELIVERY, 2));
}
@@ -131,7 +146,7 @@
public void testAndroid12RequiresIncFsV2() throws Exception {
final boolean v2Required = (SystemProperties.getInt("ro.product.first_api_level", 0) > 30);
if (v2Required) {
- Assert.assertTrue(getContext().getPackageManager().hasSystemFeature(
+ Assert.assertTrue(getPackageManager().hasSystemFeature(
PackageManager.FEATURE_INCREMENTAL_DELIVERY, 2));
}
}
@@ -188,6 +203,145 @@
assertEquals("base, config.mdpi", getSplits(TEST_APP_PACKAGE));
}
+ @LargeTest
+ @Test
+ public void testInstallWithStreaming() throws Exception {
+ final String apk = createApkPath(TEST_APK);
+ final String idsig = createApkPath(TEST_APK_IDSIG);
+ mSession =
+ new IncrementalInstallSession.Builder()
+ .addApk(Paths.get(apk), Paths.get(idsig))
+ .addExtraArgs("-t", "-i", CTS_PACKAGE_NAME)
+ .setLogger(new IncrementalDeviceConnection.Logger())
+ .build();
+ getUiAutomation().adoptShellPermissionIdentity();
+ try {
+ mSession.start(
+ Executors.newSingleThreadExecutor(),
+ new IncrementalDeviceConnection.Factory(
+ IncrementalDeviceConnection.ConnectionType.RELIABLE));
+ mSession.waitForInstallCompleted(30, TimeUnit.SECONDS);
+ } finally {
+ getUiAutomation().dropShellPermissionIdentity();
+ }
+ assertTrue(isAppInstalled(TEST_APP_PACKAGE));
+ }
+
+ /**
+ * Compress the data if the compressed size is < original size, otherwise return the original
+ * data.
+ */
+ private static ByteBuffer maybeCompressPage(ByteBuffer pageData) {
+ pageData.mark();
+ ByteArrayOutputStream compressedByteStream = new ByteArrayOutputStream();
+ try (BlockLZ4CompressorOutputStream compressor =
+ new BlockLZ4CompressorOutputStream(compressedByteStream)) {
+ Channels.newChannel(compressor).write(pageData);
+ // This is required to make sure the bytes are written to the output
+ compressor.finish();
+ } catch (IOException impossible) {
+ throw new AssertionError(impossible);
+ } finally {
+ pageData.reset();
+ }
+
+ byte[] compressedBytes = compressedByteStream.toByteArray();
+ if (compressedBytes.length < pageData.remaining()) {
+ return ByteBuffer.wrap(compressedBytes);
+ }
+ return pageData;
+ }
+
+ static final class CompressedPendingBlock extends PendingBlock {
+ final ByteBuffer mPageData;
+
+ CompressedPendingBlock(PendingBlock block) throws IOException {
+ super(block);
+
+ final ByteBuffer buffer = ByteBuffer.allocate(super.getBlockSize());
+ super.readBlockData(buffer);
+ buffer.flip(); // switch to read mode
+
+ if (super.getType() == Type.APK_DATA) {
+ mPageData = maybeCompressPage(buffer);
+ } else {
+ mPageData = buffer;
+ }
+ }
+
+ public Compression getCompression() {
+ return this.getBlockSize() < super.getBlockSize() ? Compression.LZ4 : Compression.NONE;
+ }
+
+ public short getBlockSize() {
+ return (short) mPageData.remaining();
+ }
+
+ public void readBlockData(ByteBuffer buffer) throws IOException {
+ mPageData.mark();
+ buffer.put(mPageData);
+ mPageData.reset();
+ }
+ }
+
+ static final class CompressingBlockTransformer implements IBlockTransformer {
+ @Override
+ @NonNull
+ public PendingBlock transform(@NonNull PendingBlock block) throws IOException {
+ return new CompressedPendingBlock(block);
+ }
+ }
+
+ @LargeTest
+ @Test
+ public void testInstallWithStreamingAndCompression() throws Exception {
+ final String apk = createApkPath(TEST_APK);
+ final String idsig = createApkPath(TEST_APK_IDSIG);
+ mSession =
+ new IncrementalInstallSession.Builder()
+ .addApk(Paths.get(apk), Paths.get(idsig))
+ .addExtraArgs("-t", "-i", CTS_PACKAGE_NAME)
+ .setLogger(new IncrementalDeviceConnection.Logger())
+ .setBlockTransformer(new CompressingBlockTransformer())
+ .build();
+ getUiAutomation().adoptShellPermissionIdentity();
+ try {
+ mSession.start(
+ Executors.newSingleThreadExecutor(),
+ new IncrementalDeviceConnection.Factory(
+ IncrementalDeviceConnection.ConnectionType.RELIABLE));
+ mSession.waitForInstallCompleted(30, TimeUnit.SECONDS);
+ } finally {
+ getUiAutomation().dropShellPermissionIdentity();
+ }
+ assertTrue(isAppInstalled(TEST_APP_PACKAGE));
+ }
+
+ @LargeTest
+ @Test
+ public void testInstallWithStreamingUnreliableConnection() throws Exception {
+ final String apk = createApkPath(TEST_APK);
+ final String idsig = createApkPath(TEST_APK_IDSIG);
+ mSession =
+ new IncrementalInstallSession.Builder()
+ .addApk(Paths.get(apk), Paths.get(idsig))
+ .addExtraArgs("-t", "-i", CTS_PACKAGE_NAME)
+ .setLogger(new IncrementalDeviceConnection.Logger())
+ .build();
+ getUiAutomation().adoptShellPermissionIdentity();
+ try {
+ mSession.start(
+ Executors.newSingleThreadExecutor(),
+ new IncrementalDeviceConnection.Factory(
+ IncrementalDeviceConnection.ConnectionType.UNRELIABLE));
+ mSession.waitForInstallCompleted(30, TimeUnit.SECONDS);
+ } catch (Exception ignored) {
+ // Ignore, we are looking for crashes anyway.
+ } finally {
+ getUiAutomation().dropShellPermissionIdentity();
+ }
+ }
+
@Test
public void testInstallWithIdSigInvalidLength() throws Exception {
File file = new File(createApkPath(TEST_APK));
@@ -220,34 +374,70 @@
@LargeTest
@Test
- @Ignore("Pending fix in IncFs")
public void testInstallWithIdSigNoMissingPages() throws Exception {
- // Overall timeout of 3secs in 100ms intervals.
- final int atraceDumpIterations = 30;
- final int atraceDumpDelayMs = 100;
- final String unexpected = "|missing_page_reads:";
+ final int installIterations = 1;
+ final int atraceDumpIterations = 3;
+ final int atraceDumpDelayMs = 1000;
+ final String missingPageReads = "|missing_page_reads: count=";
- assertFalse(
- "Missing page reads found (" + unexpected + ") in atrace dump",
- checkSysTrace(
- atraceDumpIterations,
- atraceDumpDelayMs,
- () -> {
- // Install multiple splits so that digesters won't kick in.
- installPackage(TEST_APK);
- installSplit(TEST_APK_SPLIT0);
- installSplit(TEST_APK_SPLIT1);
- installSplit(TEST_APK_SPLIT2);
- // Now read splits as fast as we can.
- readSplitAndReportTime("split_config.mdpi.apk", 1000);
- readSplitAndReportTime("split_config.hdpi.apk", 1000);
- readSplitAndReportTime("split_config.xhdpi.apk", 1000);
- return null;
- },
- (stdout) -> stdout.contains(unexpected)));
+ final ArrayList<String> missingPages = new ArrayList<>();
+
+ checkSysTrace(
+ installIterations,
+ atraceDumpIterations,
+ atraceDumpDelayMs,
+ () -> {
+ // Install multiple splits so that digesters won't kick in.
+ installPackage(TEST_APK);
+ installSplit(TEST_APK_SPLIT0);
+ installSplit(TEST_APK_SPLIT1);
+ installSplit(TEST_APK_SPLIT2);
+ // Now read it as fast as we can.
+ readSplitInChunks("base.apk");
+ readSplitInChunks("split_config.mdpi.apk");
+ readSplitInChunks("split_config.hdpi.apk");
+ readSplitInChunks("split_config.xhdpi.apk");
+ return null;
+ },
+ (stdout) -> {
+ try (Scanner scanner = new Scanner(stdout)) {
+ ReadLogEntry prevLogEntry = null;
+ while (scanner.hasNextLine()) {
+ final String line = scanner.nextLine();
+
+ final ReadLogEntry readLogEntry = ReadLogEntry.parse(line);
+ if (readLogEntry != null) {
+ prevLogEntry = readLogEntry;
+ continue;
+ }
+
+ int missingPageIdx = line.indexOf(missingPageReads);
+ if (missingPageIdx == -1) {
+ continue;
+ }
+ String missingBlocks = line.substring(
+ missingPageIdx + missingPageReads.length());
+
+ int prvTimestamp = prevLogEntry != null ? extractTimestamp(
+ prevLogEntry.line) : -1;
+ int curTimestamp = extractTimestamp(line);
+ if (prvTimestamp == -1 || curTimestamp == -1) {
+ missingPages.add("count=" + missingBlocks);
+ continue;
+ }
+
+ int delta = curTimestamp - prvTimestamp;
+ missingPages.add(
+ "count=" + missingBlocks + ", timestamp delta=" + delta + "ms");
+ }
+ return false;
+ }
+ });
+
+ assertTrue("Missing page reads found in atrace dump: " + String.join("\n", missingPages),
+ missingPages.isEmpty());
}
-
static class ReadLogEntry {
public final String line;
public final int blockIdx;
@@ -320,7 +510,6 @@
parseInt(line, userIdIdx, USER_ID_PREFIX.length(), -1));
}
}
- ;
@Test
public void testReadLogParser() throws Exception {
@@ -355,6 +544,36 @@
.toString());
}
+ static int extractTimestamp(String line) {
+ final String timestampEnd = ": tracing_mark_write:";
+ int timestampEndIdx = line.indexOf(timestampEnd);
+ if (timestampEndIdx == -1) {
+ return -1;
+ }
+
+ int timestampBegIdx = timestampEndIdx - 1;
+ for (; timestampBegIdx >= 0; --timestampBegIdx) {
+ char ch = line.charAt(timestampBegIdx);
+ if ('0' <= ch && ch <= '9' || ch == '.') {
+ continue;
+ }
+ break;
+ }
+ double timestamp = Double.parseDouble(line.substring(timestampBegIdx, timestampEndIdx));
+ return (int) (timestamp * 1000);
+ }
+
+ @Test
+ public void testExtractTimestamp() throws Exception {
+ assertEquals(-1, extractTimestamp("# tracer: nop\n"));
+ assertEquals(14255168, extractTimestamp(
+ "<...>-10355 ( 1636) [006] .... 14255.168694: tracing_mark_write: "
+ + "B|1636|page_read: index=1 count=16 file=0 appid=10184 userid=0"));
+ assertEquals(2764243, extractTimestamp(
+ "<...>-2777 ( 1639) [006] .... 2764.243225: tracing_mark_write: "
+ + "B|1639|missing_page_reads: count=132"));
+ }
+
static class AppReads {
public final String packageName;
public final int reads;
@@ -370,6 +589,7 @@
@Ignore("Pending fix in GMSCore")
public void testInstallWithIdSigNoDigesting() throws Exception {
// Overall timeout of 3secs in 100ms intervals.
+ final int installIterations = 1;
final int atraceDumpIterations = 30;
final int atraceDumpDelayMs = 100;
final int blockSize = 4096;
@@ -381,7 +601,11 @@
final ArrayMap<Integer, Integer> uids = new ArrayMap<>();
final AtomicInteger totalTouchedBlocks = new AtomicInteger(0);
- checkSysTrace(atraceDumpIterations, atraceDumpDelayMs, () -> installPackage(TEST_APK),
+ checkSysTrace(
+ installIterations,
+ atraceDumpIterations,
+ atraceDumpDelayMs,
+ () -> installPackage(TEST_APK),
(stdout) -> {
try (Scanner scanner = new Scanner(stdout)) {
while (scanner.hasNextLine()) {
@@ -464,55 +688,49 @@
@LargeTest
@Test
- @Ignore("flaky in the lab")
public void testInstallWithIdSigStreamPerUidTimeoutsIncompleteData() throws Exception {
checkIncrementalDeliveryV2Feature();
+
+ mSession =
+ new IncrementalInstallSession.Builder()
+ .addApk(Paths.get(createApkPath(TEST_APK)),
+ Paths.get(createApkPath(TEST_APK_IDSIG)))
+ .addApk(Paths.get(createApkPath(TEST_APK_SPLIT0)),
+ Paths.get(createApkPath(TEST_APK_SPLIT0_IDSIG)))
+ .addApk(Paths.get(createApkPath(TEST_APK_SPLIT1)),
+ Paths.get(createApkPath(TEST_APK_SPLIT1_IDSIG)))
+ .addExtraArgs("-t", "-i", CTS_PACKAGE_NAME)
+ .setLogger(new IncrementalDeviceConnection.Logger())
+ .build();
+
executeShellCommand("atrace --async_start -b 1024 -c adb");
try {
setDeviceProperty("incfs_default_timeouts", "5000000:5000000:5000000");
setDeviceProperty("known_digesters_list", CTS_PACKAGE_NAME);
- // First fully install the apk and a split0.
- {
- final Result stateListenerResult = startListeningForBroadcast();
- installPackage(TEST_APK);
- assertTrue(stateListenerResult.await());
- assertTrue(isAppInstalled(TEST_APP_PACKAGE));
- installSplit(TEST_APK_SPLIT0);
- assertEquals("base, config.mdpi", getSplits(TEST_APP_PACKAGE));
- installSplit(TEST_APK_SPLIT1);
+ final int beforeReadDelayMs = 1000;
+ Thread.currentThread().sleep(beforeReadDelayMs);
+
+ // Partially install the apk+split0+split1.
+ getUiAutomation().adoptShellPermissionIdentity();
+ try {
+ mSession.start(
+ Executors.newSingleThreadExecutor(),
+ new IncrementalDeviceConnection.Factory(
+ IncrementalDeviceConnection.ConnectionType.RELIABLE));
+ mSession.waitForInstallCompleted(30, TimeUnit.SECONDS);
assertEquals("base, config.hdpi, config.mdpi", getSplits(TEST_APP_PACKAGE));
+ } finally {
+ getUiAutomation().dropShellPermissionIdentity();
}
// Try to read a split and see if we are throttled.
- final File apkToRead = new File(getCodePath(TEST_APP_PACKAGE), "split_config.mdpi.apk");
+ final File apkToRead = getSplit("split_config.mdpi.apk");
final long readTime0 = readAndReportTime(apkToRead, 1000);
- // Install another split, interrupt in the middle, and measure read time.
- File splitfile = new File(createApkPath(TEST_APK_SPLIT2));
- long splitLength = splitfile.length();
- // Don't fully stream the split.
- long newSplitLength =
- splitLength - (splitLength % 1024 == 0 ? 1024 : splitLength % 1024);
- final Result stateListenerResult = startListeningForBroadcast();
-
- try (InputStream inputStream = executeShellCommandRw(
- "pm install-incremental -t -g -p " + TEST_APP_PACKAGE + " -S " + newSplitLength,
- new File[]{splitfile}, new long[]{splitLength})) {
-
- // While 'installing', let's try and read the base apk.
- final long readTime1 = readAndReportTime(apkToRead, 1000);
- assertTrue("Must take longer than " + EXPECTED_READ_TIME + "ms: time0=" + readTime0
- + "ms, time1=" + readTime1 + "ms",
- readTime0 >= EXPECTED_READ_TIME || readTime1 >= EXPECTED_READ_TIME);
-
- // apk
- assertTrue(readFullStream(inputStream).contains("Failure"));
- }
-
- assertFalse(stateListenerResult.await());
- assertTrue(isAppInstalled(TEST_APP_PACKAGE));
- assertEquals("base, config.hdpi, config.mdpi", getSplits(TEST_APP_PACKAGE));
+ assertTrue(
+ "Must take longer than " + EXPECTED_READ_TIME + "ms: time0=" + readTime0 + "ms",
+ readTime0 >= EXPECTED_READ_TIME);
} finally {
executeShellCommand("atrace --async_stop");
}
@@ -542,7 +760,7 @@
Thread.currentThread().sleep(beforeReadDelayMs);
// Try to read a split and see if we are throttled.
- final long readTime = readSplitAndReportTime("split_config.mdpi.apk", 1000);
+ final long readTime = readAndReportTime(getSplit("split_config.mdpi.apk"), 1000);
assertTrue("Must take less than " + EXPECTED_READ_TIME + "ms vs " + readTime + "ms",
readTime < EXPECTED_READ_TIME);
}
@@ -593,7 +811,9 @@
private boolean checkSysTraceForSubstring(String testApk, final String expected,
int atraceDumpIterations, int atraceDumpDelayMs) throws Exception {
+ final int installIterations = 3;
return checkSysTrace(
+ installIterations,
atraceDumpIterations,
atraceDumpDelayMs,
() -> installPackage(testApk),
@@ -601,6 +821,7 @@
}
private boolean checkSysTrace(
+ int installIterations,
int atraceDumpIterations,
int atraceDumpDelayMs,
final Callable<Void> installer,
@@ -611,7 +832,7 @@
final CompletableFuture<Boolean> result = new CompletableFuture<>();
final Thread readFromProcess = new Thread(() -> {
try {
- executeShellCommand("atrace --async_start -b 1024 -c adb");
+ executeShellCommand("atrace --async_start -b 10240 -c adb");
try {
for (int i = 0; i < atraceDumpIterations; ++i) {
final String stdout = executeShellCommand("atrace --async_dump");
@@ -632,7 +853,7 @@
});
readFromProcess.start();
- for (int i = 0; i < 3; ++i) {
+ for (int i = 0; i < installIterations; ++i) {
installer.call();
assertTrue(isAppInstalled(TEST_APP_PACKAGE));
Thread.currentThread().sleep(beforeReadDelayMs);
@@ -675,6 +896,10 @@
return parsePackageDump(packageName, " codePath=");
}
+ private File getSplit(String splitName) throws Exception {
+ return new File(getCodePath(TEST_APP_PACKAGE), splitName);
+ }
+
private String parsePackageDump(String packageName, String prefix) throws IOException {
final String commandResult = executeShellCommand("pm dump " + packageName);
final int prefixLength = prefix.length();
@@ -710,14 +935,36 @@
assertTrue(stateListenerResult.await());
}
- private long readSplitAndReportTime(String split, long borderTime) throws Exception {
- final File apkToRead = new File(getCodePath(TEST_APP_PACKAGE), split);
- return readAndReportTime(apkToRead, 1000);
+ private void readSplitInChunks(String splitName) throws Exception {
+ final int chunks = 2;
+ final int waitBetweenChunksMs = 100;
+ final File file = getSplit(splitName);
+
+ assertTrue(file.toString(), file.exists());
+ final long totalSize = file.length();
+ final long chunkSize = totalSize / chunks;
+ try (InputStream baseApkStream = new FileInputStream(file)) {
+ final byte[] buffer = new byte[4 * 1024];
+ long readSoFar = 0;
+ long maxToRead = 0;
+ for (int i = 0; i < chunks; ++i) {
+ maxToRead += chunkSize;
+ int length;
+ while ((length = baseApkStream.read(buffer)) != -1) {
+ readSoFar += length;
+ if (readSoFar >= maxToRead) {
+ break;
+ }
+ }
+ if (readSoFar < totalSize) {
+ Thread.currentThread().sleep(waitBetweenChunksMs);
+ }
+ }
+ }
}
private long readAndReportTime(File file, long borderTime) throws Exception {
assertTrue(file.toString(), file.exists());
-
final long startTime = SystemClock.uptimeMillis();
long readTime = 0;
try (InputStream baseApkStream = new FileInputStream(file)) {
@@ -847,6 +1094,8 @@
assertEquals(null, getSplits(TEST_APP_PACKAGE));
setDeviceProperty("incfs_default_timeouts", null);
setDeviceProperty("known_digesters_list", null);
+ IoUtils.closeQuietly(mSession);
+ mSession = null;
}
private void setDeviceProperty(String name, String value) {
diff --git a/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java b/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
index 48e85b8..e6cceb7 100644
--- a/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
@@ -31,6 +31,8 @@
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.Typeface.Builder;
+import android.os.SharedMemory;
+import android.system.ErrnoException;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -45,7 +47,9 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.HashMap;
import java.util.Locale;
+import java.util.Map;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -804,4 +808,64 @@
assertEquals(100, typeface.getWeight());
assertFalse(typeface.isItalic());
}
+
+ @Test
+ public void testSharedMemoryReadonly() {
+ SharedMemory shm = Typeface.getSystemFontMapSharedMemory();
+ if (shm == null) {
+ return; // Likely ENABLE_LAZY_TYPEFACE_INITIALIZATION is disabled.
+ }
+ try {
+ shm.mapReadWrite();
+ fail("The Typeface map should be read-only.");
+ } catch (ErrnoException e) {
+ // expected
+ }
+ }
+
+ @Test
+ public void testSharedMemoryReadonly_fromMap() {
+ HashMap<String, Typeface> map = new HashMap<>();
+
+ map.put("sans-serif", Typeface.SANS_SERIF);
+ map.put("serif", Typeface.SERIF);
+ map.put("monospace", Typeface.MONOSPACE);
+ SharedMemory shm;
+ try {
+ shm = Typeface.serializeFontMap(map);
+ } catch (ErrnoException | IOException e) {
+ throw new RuntimeException(e);
+ }
+ assertNotNull(shm);
+ try {
+ shm.mapReadWrite();
+ fail("The Typeface map should be read-only.");
+ } catch (ErrnoException e) {
+ // expected
+ }
+ }
+
+ @Test
+ public void testSharedMemoryReadonly_serializeDeserialize() throws Exception {
+ HashMap<String, Typeface> map = new HashMap<>();
+
+ map.put("sans-serif", Typeface.SANS_SERIF);
+ map.put("serif", Typeface.SERIF);
+ map.put("monospace", Typeface.MONOSPACE);
+ SharedMemory shm;
+ try {
+ shm = Typeface.serializeFontMap(map);
+ } catch (ErrnoException | IOException e) {
+ throw new RuntimeException(e);
+ }
+ assertNotNull(shm);
+
+ Map<String, Typeface> reversedMap = Typeface.deserializeFontMap(shm.mapReadOnly());
+
+ // Typeface equality doesn't work here since the backing native object is different.
+ assertEquals(3, reversedMap.size());
+ assertTrue(reversedMap.containsKey("sans-serif"));
+ assertTrue(reversedMap.containsKey("serif"));
+ assertTrue(reversedMap.containsKey("monospace"));
+ }
}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/RippleDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/RippleDrawableTest.java
index dc24514..30afaf9 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/RippleDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/RippleDrawableTest.java
@@ -17,7 +17,6 @@
package android.graphics.drawable.cts;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -126,21 +125,6 @@
}
@Test
- public void testStyle() {
- final int invalid = -1;
- RippleDrawable dr = new RippleDrawable(ColorStateList.valueOf(Color.RED), null, null);
- assertEquals(RippleDrawable.STYLE_SOLID, dr.getRippleStyle());
- dr.setRippleStyle(RippleDrawable.STYLE_PATTERNED);
- assertEquals(RippleDrawable.STYLE_PATTERNED, dr.getRippleStyle());
- try {
- dr.setRippleStyle(invalid);
- fail();
- } catch (IllegalArgumentException e) {
- assertEquals(RippleDrawable.STYLE_PATTERNED, dr.getRippleStyle());
- }
- }
-
- @Test
public void testSetColor() {
Drawable.Callback cb = mock(Drawable.Callback.class);
RippleDrawable dr = new RippleDrawable(ColorStateList.valueOf(Color.RED), null, null);
diff --git a/tests/tests/graphics/src/android/graphics/fonts/FontFamilyUpdateRequestTest.java b/tests/tests/graphics/src/android/graphics/fonts/FontFamilyUpdateRequestTest.java
index 859022c..1d35d6c 100644
--- a/tests/tests/graphics/src/android/graphics/fonts/FontFamilyUpdateRequestTest.java
+++ b/tests/tests/graphics/src/android/graphics/fonts/FontFamilyUpdateRequestTest.java
@@ -78,22 +78,24 @@
new FontFamilyUpdateRequest.Font("Test",
new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_ITALIC),
Collections.emptyList()));
- FontFamilyUpdateRequest.FontFamily fontFamily = new FontFamilyUpdateRequest.FontFamily(
- name, fonts);
+ FontFamilyUpdateRequest.FontFamily fontFamily =
+ new FontFamilyUpdateRequest.FontFamily.Builder(name, fonts).build();
assertThat(fontFamily.getName()).isEqualTo(name);
assertThat(fontFamily.getFonts()).containsExactlyElementsIn(fonts).inOrder();
// Invalid parameters
assertThrows(NullPointerException.class, () ->
- new FontFamilyUpdateRequest.FontFamily(null, fonts));
+ new FontFamilyUpdateRequest.FontFamily.Builder(null, fonts).build());
assertThrows(IllegalArgumentException.class, () ->
- new FontFamilyUpdateRequest.FontFamily("", fonts));
+ new FontFamilyUpdateRequest.FontFamily.Builder("", fonts).build());
assertThrows(NullPointerException.class, () ->
- new FontFamilyUpdateRequest.FontFamily(name, null));
+ new FontFamilyUpdateRequest.FontFamily.Builder(name, null).build());
assertThrows(IllegalArgumentException.class, () ->
- new FontFamilyUpdateRequest.FontFamily(name, Collections.emptyList()));
+ new FontFamilyUpdateRequest.FontFamily.Builder(name,
+ Collections.emptyList()).build());
assertThrows(NullPointerException.class, () ->
- new FontFamilyUpdateRequest.FontFamily(name, Collections.singletonList(null)));
+ new FontFamilyUpdateRequest.FontFamily.Builder(name,
+ Collections.singletonList(null)).build());
}
@Test
@@ -112,10 +114,10 @@
new FontFamilyUpdateRequest.Font("Roboto-Regular",
new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_ITALIC),
Collections.emptyList()));
- FontFamilyUpdateRequest.FontFamily fontFamily1 = new FontFamilyUpdateRequest.FontFamily(
- "test-roboto1", fonts);
- FontFamilyUpdateRequest.FontFamily fontFamily2 = new FontFamilyUpdateRequest.FontFamily(
- "test-roboto2", fonts);
+ FontFamilyUpdateRequest.FontFamily fontFamily1 =
+ new FontFamilyUpdateRequest.FontFamily.Builder("test-roboto1", fonts).build();
+ FontFamilyUpdateRequest.FontFamily fontFamily2 =
+ new FontFamilyUpdateRequest.FontFamily.Builder("test-roboto2", fonts).build();
FontFamilyUpdateRequest request = new FontFamilyUpdateRequest.Builder()
.addFontFileUpdateRequest(fontFileUpdateRequest)
diff --git a/tests/tests/graphics/src/android/graphics/fonts/FontManagerTest.java b/tests/tests/graphics/src/android/graphics/fonts/FontManagerTest.java
index 807e192..22bef5d 100644
--- a/tests/tests/graphics/src/android/graphics/fonts/FontManagerTest.java
+++ b/tests/tests/graphics/src/android/graphics/fonts/FontManagerTest.java
@@ -23,6 +23,8 @@
import static org.junit.Assert.fail;
+import android.Manifest;
+import android.app.UiAutomation;
import android.content.Context;
import android.os.ParcelFileDescriptor;
import android.text.FontConfig;
@@ -67,12 +69,23 @@
return fallbackNames;
}
+ private FontConfig getFontConfig() {
+ UiAutomation ui = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+
+ ui.adoptShellPermissionIdentity(Manifest.permission.UPDATE_FONTS);
+ try {
+ FontManager fm = getContext().getSystemService(FontManager.class);
+ assertThat(fm).isNotNull();
+
+ return fm.getFontConfig();
+ } finally {
+ ui.dropShellPermissionIdentity();
+ }
+ }
+
@Test
public void fontManager_getFontConfig_checkFamilies() {
- FontManager fm = getContext().getSystemService(FontManager.class);
- assertThat(fm).isNotNull();
-
- FontConfig config = fm.getFontConfig();
+ FontConfig config = getFontConfig();
// To expect name availability, collect all fallback names.
Set<String> fallbackNames = getFallbackNameSet(config);
@@ -107,10 +120,7 @@
@Test
public void fontManager_getFontConfig_checkAlias() {
- FontManager fm = getContext().getSystemService(FontManager.class);
- assertThat(fm).isNotNull();
-
- FontConfig config = fm.getFontConfig();
+ FontConfig config = getFontConfig();
assertThat(config).isNotNull();
// To expect name availability, collect all fallback names.
Set<String> fallbackNames = getFallbackNameSet(config);
@@ -217,11 +227,11 @@
try {
fm.updateFontFamily(new FontFamilyUpdateRequest.Builder()
- .addFontFamily(new FontFamilyUpdateRequest.FontFamily("test", Arrays.asList(
- new FontFamilyUpdateRequest.Font(
+ .addFontFamily(new FontFamilyUpdateRequest.FontFamily.Builder("test",
+ Arrays.asList(new FontFamilyUpdateRequest.Font(
"Roboto-Regular",
new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT),
- Collections.emptyList()))))
+ Collections.emptyList()))).build())
.build(), -1);
fail("IllegalArgumentException is expected.");
} catch (IllegalArgumentException e) {
@@ -237,11 +247,11 @@
try {
fm.updateFontFamily(new FontFamilyUpdateRequest.Builder()
- .addFontFamily(new FontFamilyUpdateRequest.FontFamily("test", Arrays.asList(
- new FontFamilyUpdateRequest.Font(
+ .addFontFamily(new FontFamilyUpdateRequest.FontFamily.Builder("test",
+ Arrays.asList(new FontFamilyUpdateRequest.Font(
"Roboto-Regular",
new FontStyle(FONT_WEIGHT_NORMAL, FONT_SLANT_UPRIGHT),
- Collections.emptyList()))))
+ Collections.emptyList()))).build())
.build(), fm.getFontConfig().getConfigVersion());
fail("SecurityException is expected.");
} catch (SecurityException e) {
diff --git a/tests/tests/hardware/src/android/hardware/biometrics/cts/BiometricManagerTest.java b/tests/tests/hardware/src/android/hardware/biometrics/cts/BiometricManagerTest.java
index 825db56..ea6c028 100644
--- a/tests/tests/hardware/src/android/hardware/biometrics/cts/BiometricManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/biometrics/cts/BiometricManagerTest.java
@@ -18,7 +18,6 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import android.app.KeyguardManager;
@@ -68,7 +67,7 @@
@Test
public void test_getButtonLabel_isDifferentForBiometricAndCredential() {
- // Ensure that labels for biometrics and credential are different (if non-empty).
+ // Ensure labels for biometrics and credential are different (if non-empty).
final CharSequence biometricLabel =
mBiometricManager.getButtonLabel(Authenticators.BIOMETRIC_WEAK);
final CharSequence credentialLabel =
@@ -80,8 +79,9 @@
}
@Test
- public void test_getButtonLabel_matchesOneForAllowedAuthType() {
- // Ensure label for biometrics|credential matches one for biometrics or for credential.
+ public void test_getButtonLabel_isNonEmptyIfPresentForSubAuthType() {
+ // Ensure label for biometrics|credential is non-empty if one for biometrics or credential
+ // (or both) is non-empty.
final CharSequence biometricOrCredentialLabel =
mBiometricManager.getButtonLabel(
Authenticators.BIOMETRIC_WEAK | Authenticators.DEVICE_CREDENTIAL);
@@ -89,32 +89,38 @@
mBiometricManager.getButtonLabel(Authenticators.BIOMETRIC_WEAK);
final CharSequence credentialLabel =
mBiometricManager.getButtonLabel(Authenticators.DEVICE_CREDENTIAL);
- if (TextUtils.isEmpty(biometricOrCredentialLabel)) {
- assertTrue("Label should not be empty if an allowed authenticator label is non-empty",
- TextUtils.isEmpty(biometricLabel) && TextUtils.isEmpty(credentialLabel));
- } else {
- assertTrue("Label should match one of the allowed authenticator labels",
- TextUtils.equals(biometricOrCredentialLabel, biometricLabel)
- || TextUtils.equals(biometricOrCredentialLabel, credentialLabel));
- }
+ final boolean isLabelPresentForSubAuthType =
+ !TextUtils.isEmpty(biometricLabel) || !TextUtils.isEmpty(credentialLabel);
+ assertFalse("Label should not be empty if one for an authenticator sub-type is non-empty",
+ TextUtils.isEmpty(biometricOrCredentialLabel) && isLabelPresentForSubAuthType);
}
@Test
- public void test_getPromptMessage_isDifferentForBiometricAndCredential() {
- // Ensure that messages for biometrics and credential are different (if non-empty).
+ public void test_getPromptMessage_isDifferentForDifferentAuthenticators() {
+ // Ensure messages for biometrics, credential, and biometrics|credential are different.
final CharSequence biometricMessage =
mBiometricManager.getPromptMessage(Authenticators.BIOMETRIC_WEAK);
final CharSequence credentialMessage =
mBiometricManager.getPromptMessage(Authenticators.DEVICE_CREDENTIAL);
- if (!TextUtils.isEmpty(biometricMessage) || !TextUtils.isEmpty(credentialMessage)) {
+ final CharSequence biometricOrCredentialMessage =
+ mBiometricManager.getPromptMessage(
+ Authenticators.BIOMETRIC_WEAK | Authenticators.DEVICE_CREDENTIAL);
+ if (!TextUtils.isEmpty(biometricMessage)
+ || !TextUtils.isEmpty(credentialMessage)
+ || !TextUtils.isEmpty(biometricOrCredentialMessage)) {
assertFalse("Biometric and credential prompt messages should not match",
TextUtils.equals(biometricMessage, credentialMessage));
+ assertFalse("Biometric and biometric|credential prompt messages should not match",
+ TextUtils.equals(biometricMessage, biometricOrCredentialMessage));
+ assertFalse("Credential and biometric|credential prompt messages should not match",
+ TextUtils.equals(credentialMessage, biometricOrCredentialMessage));
}
}
@Test
- public void test_getPromptMessage_matchesOneForAllowedAuthType() {
- // Ensure message for biometrics|credential matches one for biometrics or for credential.
+ public void test_getPromptMessage_isNonEmptyIfPresentForSubAuthType() {
+ // Ensure message for biometrics|credential is non-empty if one for biometrics or credential
+ // (or both) is non-empty.
final CharSequence biometricOrCredentialMessage =
mBiometricManager.getPromptMessage(
Authenticators.BIOMETRIC_WEAK | Authenticators.DEVICE_CREDENTIAL);
@@ -122,15 +128,10 @@
mBiometricManager.getPromptMessage(Authenticators.BIOMETRIC_WEAK);
final CharSequence credentialMessage =
mBiometricManager.getPromptMessage(Authenticators.DEVICE_CREDENTIAL);
- if (TextUtils.isEmpty(biometricOrCredentialMessage)) {
- assertTrue(
- "Message should not be empty if an allowed authenticator message is non-empty",
- TextUtils.isEmpty(biometricMessage) && TextUtils.isEmpty(credentialMessage));
- } else {
- assertTrue("Message should match one of the allowed authenticator messages",
- TextUtils.equals(biometricOrCredentialMessage, biometricMessage)
- || TextUtils.equals(biometricOrCredentialMessage, credentialMessage));
- }
+ final boolean isMessagePresentForSubAuthType =
+ !TextUtils.isEmpty(biometricMessage) || !TextUtils.isEmpty(credentialMessage);
+ assertFalse("Message should not be empty if one for an authenticator sub-type is non-empty",
+ TextUtils.isEmpty(biometricOrCredentialMessage) && isMessagePresentForSubAuthType);
}
@Test
diff --git a/tests/tests/hardware/src/android/hardware/hdmi/cts/HdmiControlManagerTest.java b/tests/tests/hardware/src/android/hardware/hdmi/cts/HdmiControlManagerTest.java
index a3ae1a1..8bd230d 100644
--- a/tests/tests/hardware/src/android/hardware/hdmi/cts/HdmiControlManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/hdmi/cts/HdmiControlManagerTest.java
@@ -46,6 +46,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@RunWith(AndroidJUnit4.class)
@@ -53,7 +54,7 @@
public class HdmiControlManagerTest {
private static final int DEVICE_TYPE_SWITCH = 6;
- private static final int TIMEOUT_CONTENT_CHANGE_SEC = 3;
+ private static final int TIMEOUT_CONTENT_CHANGE_SEC = 13;
private HdmiControlManager mHdmiControlManager;
@@ -185,7 +186,10 @@
};
try {
mHdmiControlManager.setHdmiCecEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
- mHdmiControlManager.addHdmiCecEnabledChangeListener(listener);
+ TimeUnit.SECONDS.sleep(1);
+ mHdmiControlManager.addHdmiCecEnabledChangeListener(
+ Executors.newSingleThreadExecutor(), listener);
+ TimeUnit.SECONDS.sleep(3);
mHdmiControlManager.setHdmiCecEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
if (!notifyLatch1.await(TIMEOUT_CONTENT_CHANGE_SEC, TimeUnit.SECONDS)) {
fail("Timed out waiting for the notify callback");
@@ -195,6 +199,8 @@
notifyLatch2.await(TIMEOUT_CONTENT_CHANGE_SEC, TimeUnit.SECONDS);
assertThat(notifyLatch2.getCount()).isEqualTo(1);
} finally {
+ // Remove listener in case not yet removed.
+ mHdmiControlManager.removeHdmiCecEnabledChangeListener(listener);
// Restore original value
mHdmiControlManager.setHdmiCecEnabled(originalValue);
assertThat(mHdmiControlManager.getHdmiCecEnabled()).isEqualTo(originalValue);
@@ -223,6 +229,28 @@
}
@Test
+ public void testHdmiCecConfig_HdmiCecVolumeControlEnabled() throws Exception {
+ // Save original value
+ int originalValue = mHdmiControlManager.getHdmiCecVolumeControlEnabled();
+ if (!mHdmiControlManager.getUserCecSettings().contains(
+ HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)) {
+ return;
+ }
+ try {
+ for (int value : mHdmiControlManager.getAllowedCecSettingIntValues(
+ HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)) {
+ mHdmiControlManager.setHdmiCecVolumeControlEnabled(value);
+ assertThat(mHdmiControlManager.getHdmiCecVolumeControlEnabled()).isEqualTo(value);
+ }
+ } finally {
+ // Restore original value
+ mHdmiControlManager.setHdmiCecVolumeControlEnabled(originalValue);
+ assertThat(mHdmiControlManager.getHdmiCecVolumeControlEnabled()).isEqualTo(
+ originalValue);
+ }
+ }
+
+ @Test
public void testHdmiCecConfig_PowerControlMode() throws Exception {
// Save original value
String originalValue = mHdmiControlManager.getPowerControlMode();
@@ -286,4 +314,48 @@
assertThat(mHdmiControlManager.getSystemAudioModeMuting()).isEqualTo(originalValue);
}
}
+
+ @Test
+ public void testHdmiCecConfig_TvWakeOnOneTouchPlay() throws Exception {
+ // Save original value
+ int originalValue = mHdmiControlManager.getTvWakeOnOneTouchPlay();
+ if (!mHdmiControlManager.getUserCecSettings().contains(
+ HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY)) {
+ return;
+ }
+ try {
+ for (int value : mHdmiControlManager.getAllowedCecSettingIntValues(
+ HdmiControlManager.CEC_SETTING_NAME_TV_WAKE_ON_ONE_TOUCH_PLAY)) {
+ mHdmiControlManager.setTvWakeOnOneTouchPlay(value);
+ assertThat(mHdmiControlManager.getTvWakeOnOneTouchPlay()).isEqualTo(value);
+ }
+ } finally {
+ // Restore original value
+ mHdmiControlManager.setTvWakeOnOneTouchPlay(originalValue);
+ assertThat(mHdmiControlManager.getTvWakeOnOneTouchPlay()).isEqualTo(
+ originalValue);
+ }
+ }
+
+ @Test
+ public void testHdmiCecConfig_TvTvSendStandbyOnSleep() throws Exception {
+ // Save original value
+ int originalValue = mHdmiControlManager.getTvSendStandbyOnSleep();
+ if (!mHdmiControlManager.getUserCecSettings().contains(
+ HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP)) {
+ return;
+ }
+ try {
+ for (int value : mHdmiControlManager.getAllowedCecSettingIntValues(
+ HdmiControlManager.CEC_SETTING_NAME_TV_SEND_STANDBY_ON_SLEEP)) {
+ mHdmiControlManager.setTvSendStandbyOnSleep(value);
+ assertThat(mHdmiControlManager.getTvSendStandbyOnSleep()).isEqualTo(value);
+ }
+ } finally {
+ // Restore original value
+ mHdmiControlManager.setTvSendStandbyOnSleep(originalValue);
+ assertThat(mHdmiControlManager.getTvSendStandbyOnSleep()).isEqualTo(
+ originalValue);
+ }
+ }
}
diff --git a/tests/tests/icu/CtsIcu4cTestCases.xml b/tests/tests/icu/CtsIcu4cTestCases.xml
index c216b3a..3ef1629 100644
--- a/tests/tests/icu/CtsIcu4cTestCases.xml
+++ b/tests/tests/icu/CtsIcu4cTestCases.xml
@@ -36,8 +36,8 @@
<option name="push" value="icu4c_test_data.zip->/data/local/tmp/icu4c_test_data.zip" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
- <option name="run-command" value="mkdir -p /data/local/tmp/test/testdata && unzip -o -d /data/local/tmp/test/testdata /data/local/tmp/icu4c_test_data.zip" />
- <option name="teardown-command" value="rm -r /data/local/tmp/test/testdata" />
+ <option name="run-command" value="unzip -o -d /data/local/tmp/ /data/local/tmp/icu4c_test_data.zip" />
+ <option name="teardown-command" value="rm -r /data/local/tmp/test /data/local/tmp/data" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
diff --git a/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt b/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt
index e68fcd9..1b1535a 100644
--- a/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt
+++ b/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt
@@ -2,14 +2,6 @@
* This file contains expectations for tests that are known to fail.
*/
[
-// Uncomment this to exclude all tests and then add result: "SUCCESS" to any specific tests that
-// need to be run.
-/*
-{
- description: "Exclude all tests",
- name: "android.icu.dev.test"
-},
-*/
{
description: "Serialized forms have not been converted to use repackaged classes",
name: "android.icu.dev.test.format.NumberFormatRegressionTest#TestSerialization",
@@ -19,22 +11,5 @@
description: "Checks differences in DecimalFormat classes from ICU4J and JDK but on Android java.text.DecimalFormat is implemented in terms of ICU4J",
name: "android.icu.dev.test.format.NumberFormatTest#TestDataDrivenJDK",
bug: "27711713"
-},
-{
- description: "Collation rules data has been removed from ICU4J data on Android",
- names: [
- "android.icu.dev.test.collator.CollationCreationMethodTest#TestRuleVsLocaleCreationMonkey",
- "android.icu.dev.test.collator.CollationMiscTest#TestImport",
- "android.icu.dev.test.collator.CollationMiscTest#TestImportWithType",
- "android.icu.dev.test.collator.CollationMiscTest#TestUCARules",
- "android.icu.dev.test.collator.CollationTest#TestDataDriven",
- "android.icu.dev.test.collator.G7CollationTest#TestG7Data"
- ],
- bug: "27552651"
-},
-{
- description: "Unknown Language != Unknown language",
- name: "android.icu.dev.test.TestLocaleNamePackaging#testLanguageDisplayNames",
- bug: "33447162"
}
]
diff --git a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
index 08267cc..796fbd8 100644
--- a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
+++ b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
@@ -82,7 +82,8 @@
private final static String[] PUBLIC_ART_LIBRARIES = {
"libicui18n.so",
"libicuuc.so",
- "libnativehelper.so"
+ "libnativehelper.so",
+ "libsigchain.so"
};
// The grey-list.
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyStoreTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyStoreTest.java
index ab9cec7..383e483 100644
--- a/tests/tests/keystore/src/android/keystore/cts/KeyStoreTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyStoreTest.java
@@ -815,20 +815,15 @@
try {
keyStore.setKeyEntry(null, null, null, null);
fail(keyStore.getType());
- } catch (Exception e) {
- if (e.getClass() != NullPointerException.class
- && e.getClass() != KeyStoreException.class) {
- throw e;
- }
+ } catch (NullPointerException | KeyStoreException expected) {
+ // ignored
}
+
try {
keyStore.setKeyEntry(null, null, PASSWORD_KEY, null);
fail(keyStore.getType());
- } catch (Exception e) {
- if (e.getClass() != NullPointerException.class
- && e.getClass() != KeyStoreException.class) {
- throw e;
- }
+ } catch (NullPointerException | KeyStoreException expected) {
+ // ignored
}
try {
keyStore.setKeyEntry(ALIAS_PRIVATE,
diff --git a/tests/tests/media/DynamicConfig.xml b/tests/tests/media/DynamicConfig.xml
index 4548620..942ab80 100644
--- a/tests/tests/media/DynamicConfig.xml
+++ b/tests/tests/media/DynamicConfig.xml
@@ -14,12 +14,6 @@
-->
<dynamicConfig>
- <entry key="decoder_test_audio_url">
- <value>http://redirector.gvt1.com/videoplayback?id=c80658495af60617&itag=18&source=youtube&ip=0.0.0.0&ipbits=0&expire=19000000000&sparams=ip,ipbits,expire,id,itag,source&signature=46A04ED550CA83B79B60060BA80C79FDA5853D26.49582D382B4A9AFAA163DED38D2AE531D85603C0&key=ik0&user=android-device-test</value>
- </entry>
- <entry key="decoder_test_video_url">
- <value>http://redirector.gvt1.com/videoplayback?id=c80658495af60617&itag=18&source=youtube&ip=0.0.0.0&ipbits=0&expire=19000000000&sparams=ip,ipbits,expire,id,itag,source&signature=46A04ED550CA83B79B60060BA80C79FDA5853D26.49582D382B4A9AFAA163DED38D2AE531D85603C0&key=ik0&user=android-device-test</value>
- </entry>
<entry key="media_codec_capabilities_test_avc_baseline12">
<value>http://redirector.gvt1.com/videoplayback?id=271de9756065677e&itag=160&source=youtube&user=android-device-test&sparams=ip,ipbits,expire,id,itag,source,user&ip=0.0.0.0&ipbits=0&expire=19000000000&signature=9EDCA0B395B8A949C511FD5E59B9F805CFF797FD.702DE9BA7AF96785FD6930AD2DD693A0486C880E&key=ik0</value>
</entry>
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index 7b97fc6..d09c7b8 100755
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -2961,6 +2961,241 @@
}
}
+ /*
+ * The following helpers and tests are used to test setting
+ * and getting the start threshold in frames.
+ *
+ * See Android CDD 5.6 [C-1-2] Cold output latency
+ */
+ private static final int START_THRESHOLD_SLEEP_MILLIS = 500;
+
+ /**
+ * Helper test that validates setting the start threshold.
+ *
+ * @param track
+ * @param startThresholdInFrames
+ * @throws Exception
+ */
+ private static void validateSetStartThresholdInFrames(
+ AudioTrack track, int startThresholdInFrames) throws Exception {
+ assertEquals(startThresholdInFrames,
+ track.setStartThresholdInFrames(startThresholdInFrames));
+ assertEquals(startThresholdInFrames,
+ track.getStartThresholdInFrames());
+ }
+
+ /**
+ * Helper that tests that the head position eventually equals expectedFrames.
+ *
+ * Exponential backoff to ~ 2 x START_THRESHOLD_SLEEP_MILLIS
+ *
+ * @param track
+ * @param expectedFrames
+ * @param message
+ * @throws Exception
+ */
+ private static void validatePlaybackHeadPosition(
+ AudioTrack track, int expectedFrames, String message) throws Exception {
+ int cumulativeMillis = 0;
+ int playbackHeadPosition = 0;
+ for (double testMillis = START_THRESHOLD_SLEEP_MILLIS * 0.125;
+ testMillis <= START_THRESHOLD_SLEEP_MILLIS; // this is exact for IEEE binary double
+ testMillis *= 2.) {
+ Thread.sleep((int)testMillis);
+ playbackHeadPosition = track.getPlaybackHeadPosition();
+ if (playbackHeadPosition == expectedFrames) return;
+ cumulativeMillis += (int)testMillis;
+ }
+ fail(message + ": expected track playbackHeadPosition: " + expectedFrames
+ + " actual playbackHeadPosition: " + playbackHeadPosition
+ + " wait time: " + cumulativeMillis + "ms");
+ }
+
+ /**
+ * Helper test that sets the start threshold to frames, and validates
+ * writing exactly frames amount of data is needed to start the
+ * track streaming.
+ *
+ * @param track
+ * @param frames
+ * @throws Exception
+ */
+ private static void validateWriteStartsStream(
+ AudioTrack track, int frames) throws Exception {
+ assertEquals(1, track.getChannelCount()); // must be MONO
+ final short[] data = new short[frames];
+
+ // The track must be idle/underrun or the test will fail.
+ int expectedFrames = track.getPlaybackHeadPosition();
+
+ // Set our threshold to frames.
+ validateSetStartThresholdInFrames(track, frames);
+
+ Thread.sleep(START_THRESHOLD_SLEEP_MILLIS);
+ assertEquals("Changing start threshold doesn't start if it is larger than buffer data",
+ expectedFrames, track.getPlaybackHeadPosition());
+
+ // Write a small amount of data, this isn't enough to start the track.
+ final int PARTIAL_WRITE_IN_FRAMES = frames - 1;
+ track.write(data, 0 /* offsetInShorts */, PARTIAL_WRITE_IN_FRAMES);
+
+ // Ensure the track hasn't started.
+ Thread.sleep(START_THRESHOLD_SLEEP_MILLIS);
+ assertEquals("Track needs enough frames to start",
+ expectedFrames, track.getPlaybackHeadPosition());
+
+ // Write exactly threshold frames out, this should kick the playback off.
+ track.write(data, 0 /* offsetInShorts */, data.length - PARTIAL_WRITE_IN_FRAMES);
+
+ // Verify that we have processed the data now.
+ expectedFrames += frames;
+ Thread.sleep(frames * 1000L / track.getSampleRate()); // accommodate for #frames.
+ validatePlaybackHeadPosition(track, expectedFrames,
+ "Writing buffer data to start threshold should start streaming");
+ }
+
+ /**
+ * Helper that tests reducing the start threshold to frames will start track
+ * streaming when frames of data are written to it. (Presumes the
+ * previous start threshold was greater than frames).
+ *
+ * @param track
+ * @param frames
+ * @throws Exception
+ */
+ private static void validateSetStartThresholdStartsStream(
+ AudioTrack track, int frames) throws Exception {
+ assertTrue(track.getStartThresholdInFrames() > frames);
+ assertEquals(1, track.getChannelCount()); // must be MONO
+ final short[] data = new short[frames];
+
+ // The track must be idle/underrun or the test will fail.
+ int expectedFrames = track.getPlaybackHeadPosition();
+
+ // This write is too small for now.
+ track.write(data, 0 /* offsetInShorts */, data.length);
+
+ Thread.sleep(START_THRESHOLD_SLEEP_MILLIS);
+ assertEquals("Track needs enough frames to start",
+ expectedFrames, track.getPlaybackHeadPosition());
+
+ // Reduce our start threshold. This should start streaming.
+ validateSetStartThresholdInFrames(track, frames);
+
+ // Verify that we have processed the data now.
+ expectedFrames += frames;
+ Thread.sleep(frames * 1000L / track.getSampleRate()); // accommodate for #frames.
+ validatePlaybackHeadPosition(track, expectedFrames,
+ "Changing start threshold to buffer data level should start streaming");
+ }
+
+ // Start threshold levels that we check.
+ private enum ThresholdLevel { LOW, MEDIUM, HIGH };
+ @Test
+ public void testStartThresholdInFrames() throws Exception {
+ if (!hasAudioOutput()) {
+ return;
+ }
+
+ for (ThresholdLevel level : new ThresholdLevel[] {
+ ThresholdLevel.LOW, ThresholdLevel.MEDIUM, ThresholdLevel.HIGH}) {
+ AudioTrack audioTrack = null;
+ try {
+ // Build our audiotrack
+ audioTrack = new AudioTrack.Builder()
+ .setAudioFormat(new AudioFormat.Builder()
+ .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+ .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
+ .build())
+ .build();
+
+ // Initially the start threshold must be the same as the buffer size in frames.
+ final int bufferSizeInFrames = audioTrack.getBufferSizeInFrames();
+ assertEquals("At start, getBufferSizeInFrames should equal getStartThresholdInFrames",
+ bufferSizeInFrames,
+ audioTrack.getStartThresholdInFrames());
+
+ final int TARGET_THRESHOLD_IN_FRAMES; // threshold level to verify
+ switch (level) {
+ default:
+ case LOW:
+ TARGET_THRESHOLD_IN_FRAMES = 2;
+ break;
+ case MEDIUM:
+ TARGET_THRESHOLD_IN_FRAMES = bufferSizeInFrames / 2;
+ break;
+ case HIGH:
+ TARGET_THRESHOLD_IN_FRAMES = bufferSizeInFrames - 1;
+ break;
+ }
+
+ // Skip extreme cases that don't need testing.
+ if (TARGET_THRESHOLD_IN_FRAMES < 2
+ || TARGET_THRESHOLD_IN_FRAMES >= bufferSizeInFrames) continue;
+
+ // Start the AudioTrack. Now the track is waiting for data.
+ audioTrack.play();
+
+ validateWriteStartsStream(audioTrack, TARGET_THRESHOLD_IN_FRAMES);
+
+ // Try a condition that requires buffers to be filled again.
+ if (false) {
+ // Only a deep underrun when the track becomes inactive requires a refill.
+ // Disabled as this is dependent on underlying MixerThread timeouts.
+ Thread.sleep(5000 /* millis */);
+ } else {
+ // Flushing will require a refill (this does not require timing).
+ audioTrack.pause();
+ audioTrack.flush();
+ audioTrack.play();
+ }
+
+ // Check that reducing to a smaller threshold will start the track streaming.
+ validateSetStartThresholdStartsStream(audioTrack, TARGET_THRESHOLD_IN_FRAMES - 1);
+ } finally {
+ if (audioTrack != null) {
+ audioTrack.release();
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testStartThresholdInFramesExceptions() throws Exception {
+ if (!hasAudioOutput()) {
+ return;
+ }
+ AudioTrack audioTrack = null;
+ try {
+ // Build our audiotrack
+ audioTrack = new AudioTrack.Builder()
+ .setAudioFormat(new AudioFormat.Builder()
+ .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+ .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
+ .build())
+ .build();
+
+ // Test setting invalid start threshold.
+ final AudioTrack track = audioTrack; // make final for lambda
+ assertThrows(IllegalArgumentException.class, () -> {
+ track.setStartThresholdInFrames(-1 /* startThresholdInFrames */);
+ });
+ } finally {
+ if (audioTrack != null) {
+ audioTrack.release();
+ }
+ }
+ // If we're here audioTrack should be non-null but released,
+ // so calls should return an IllegalStateException.
+ final AudioTrack track = audioTrack; // make final for lambda
+ assertThrows(IllegalStateException.class, () -> {
+ track.getStartThresholdInFrames();
+ });
+ assertThrows(IllegalStateException.class, () -> {
+ track.setStartThresholdInFrames(1 /* setStartThresholdInFrames */);
+ });
+ }
+
/* Do not run in JB-MR1. will be re-opened in the next platform release.
public void testResourceLeakage() throws Exception {
final int BUFFER_SIZE = 600 * 1024;
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index ffc69e9..d6126bc 100644
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -95,8 +95,6 @@
private static final int SLEEP_TIME_MS = 1000;
private static final long PLAY_TIME_MS = TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES);
- private static final String AUDIO_URL_KEY = "decoder_test_audio_url";
- private static final String VIDEO_URL_KEY = "decoder_test_video_url";
private static final String MODULE_NAME = "CtsMediaTestCases";
private DynamicConfigDeviceSide dynamicConfig;
private DisplayManager mDisplayManager;
@@ -3595,14 +3593,17 @@
return (codecName == null) ? false : true;
}
-
/**
* Test tunneled video playback mode if supported
+ *
+ * TODO(b/182915887): Test all the codecs advertised by the DUT for the provided test content
*/
- public void testTunneledVideoPlayback() throws Exception {
- if (!isVideoFeatureSupported(MediaFormat.MIMETYPE_VIDEO_AVC,
+ private void tunneledVideoPlayback(String mimeType, String videoName) throws Exception {
+ if (!isVideoFeatureSupported(mimeType,
CodecCapabilities.FEATURE_TunneledPlayback)) {
- MediaUtils.skipTest(TAG, "No tunneled video playback codec found!");
+ MediaUtils.skipTest(
+ TAG,
+ "No tunneled video playback codec found for MIME " + mimeType);
return;
}
@@ -3610,10 +3611,9 @@
mMediaCodecPlayer = new MediaCodecTunneledPlayer(
getActivity().getSurfaceHolder(), true, am.generateAudioSessionId());
- Uri audioUri = Uri.parse(dynamicConfig.getValue(AUDIO_URL_KEY));
- Uri videoUri = Uri.parse(dynamicConfig.getValue(VIDEO_URL_KEY));
- mMediaCodecPlayer.setAudioDataSource(audioUri, null);
- mMediaCodecPlayer.setVideoDataSource(videoUri, null);
+ Uri mediaUri = Uri.fromFile(new File(mInpPrefix, videoName));
+ mMediaCodecPlayer.setAudioDataSource(mediaUri, null);
+ mMediaCodecPlayer.setVideoDataSource(mediaUri, null);
assertTrue("MediaCodecPlayer.start() failed!", mMediaCodecPlayer.start());
assertTrue("MediaCodecPlayer.prepare() failed!", mMediaCodecPlayer.prepare());
@@ -3639,12 +3639,40 @@
}
/**
- * Test tunneled video playback flush if supported
+ * Test tunneled video playback mode with HEVC if supported
*/
- public void testTunneledVideoFlush() throws Exception {
- if (!isVideoFeatureSupported(MediaFormat.MIMETYPE_VIDEO_AVC,
- CodecCapabilities.FEATURE_TunneledPlayback)) {
- MediaUtils.skipTest(TAG, "No tunneled video playback codec found!");
+ public void testTunneledVideoPlaybackHevc() throws Exception {
+ tunneledVideoPlayback(MediaFormat.MIMETYPE_VIDEO_HEVC,
+ "video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz.mkv");
+ }
+
+ /**
+ * Test tunneled video playback mode with AVC if supported
+ */
+ public void testTunneledVideoPlaybackAvc() throws Exception {
+ tunneledVideoPlayback(MediaFormat.MIMETYPE_VIDEO_AVC,
+ "video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4");
+ }
+
+ /**
+ * Test tunneled video playback mode with VP9 if supported
+ */
+ public void testTunneledVideoPlaybackVp9() throws Exception {
+ tunneledVideoPlayback(MediaFormat.MIMETYPE_VIDEO_VP9,
+ "bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm");
+ }
+
+ /**
+ * Test tunneled video playback flush if supported
+
+ * TODO(b/182915887): Test all the codecs advertised by the DUT for the provided test content
+ */
+ private void testTunneledVideoFlush(String mimeType, String videoName) throws Exception {
+ if (!isVideoFeatureSupported(mimeType,
+ CodecCapabilities.FEATURE_TunneledPlayback)) {
+ MediaUtils.skipTest(
+ TAG,
+ "No tunneled video playback codec found for MIME " + mimeType);
return;
}
@@ -3652,10 +3680,9 @@
mMediaCodecPlayer = new MediaCodecTunneledPlayer(
getActivity().getSurfaceHolder(), true, am.generateAudioSessionId());
- Uri audioUri = Uri.parse(dynamicConfig.getValue(AUDIO_URL_KEY));
- Uri videoUri = Uri.parse(dynamicConfig.getValue(VIDEO_URL_KEY));
- mMediaCodecPlayer.setAudioDataSource(audioUri, null);
- mMediaCodecPlayer.setVideoDataSource(videoUri, null);
+ Uri mediaUri = Uri.fromFile(new File(mInpPrefix, videoName));
+ mMediaCodecPlayer.setAudioDataSource(mediaUri, null);
+ mMediaCodecPlayer.setVideoDataSource(mediaUri, null);
assertTrue("MediaCodecPlayer.start() failed!", mMediaCodecPlayer.start());
assertTrue("MediaCodecPlayer.prepare() failed!", mMediaCodecPlayer.prepare());
@@ -3668,6 +3695,30 @@
}
/**
+ * Test tunneled video playback flush with HEVC if supported
+ */
+ public void testTunneledVideoFlushHevc() throws Exception {
+ testTunneledVideoFlush(MediaFormat.MIMETYPE_VIDEO_HEVC,
+ "video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz.mkv");
+ }
+
+ /**
+ * Test tunneled video playback flush with AVC if supported
+ */
+ public void testTunneledVideoFlushAvc() throws Exception {
+ testTunneledVideoFlush(MediaFormat.MIMETYPE_VIDEO_AVC,
+ "video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4");
+ }
+
+ /**
+ * Test tunneled video playback flush with VP9 if supported
+ */
+ public void testTunneledVideoFlushVp9() throws Exception {
+ testTunneledVideoFlush(MediaFormat.MIMETYPE_VIDEO_VP9,
+ "bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm");
+ }
+
+ /**
* Returns list of CodecCapabilities advertising support for the given MIME type.
*/
private static List<CodecCapabilities> getCodecCapabilitiesForMimeType(String mimeType) {
diff --git a/tests/tests/media/src/android/media/cts/MediaDrmClearkeyTest.java b/tests/tests/media/src/android/media/cts/MediaDrmClearkeyTest.java
index 9945d8c..497b999 100644
--- a/tests/tests/media/src/android/media/cts/MediaDrmClearkeyTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaDrmClearkeyTest.java
@@ -107,6 +107,8 @@
private Looper mLooper;
private MediaDrm mDrm = null;
private final Object mLock = new Object();
+ private boolean mEventListenerCalled;
+ private boolean mExpirationUpdateReceived;
private boolean mLostStateReceived;
public MediaDrmClearkeyTest() {
@@ -282,9 +284,21 @@
synchronized(mLock) {
mDrm.setOnEventListener(new MediaDrm.OnEventListener() {
@Override
- public void onEvent(MediaDrm md, byte[] sessionId, int event,
+ public void onEvent(MediaDrm md, byte[] sid, int event,
int extra, byte[] data) {
- if (event == MediaDrm.EVENT_KEY_REQUIRED) {
+ if (md != mDrm) {
+ Log.e(TAG, "onEvent callback: drm object mismatch");
+ return;
+ } else if (!Arrays.equals(mSessionId, sid)) {
+ Log.e(TAG, "onEvent callback: sessionId mismatch: |" +
+ Arrays.toString(mSessionId) + "| vs |" + Arrays.toString(sid) + "|");
+ return;
+ }
+
+ mEventListenerCalled = true;
+ if (event == MediaDrm.EVENT_PROVISION_REQUIRED) {
+ Log.i(TAG, "MediaDrm event: Provision required");
+ } else if (event == MediaDrm.EVENT_KEY_REQUIRED) {
Log.i(TAG, "MediaDrm event: Key required");
getKeys(mDrm, initDataType, mSessionId, mDrmInitData,
keyType, clearKeyIds);
@@ -292,11 +306,28 @@
Log.i(TAG, "MediaDrm event: Key expired");
getKeys(mDrm, initDataType, mSessionId, mDrmInitData,
keyType, clearKeyIds);
+ } else if (event == MediaDrm.EVENT_VENDOR_DEFINED) {
+ Log.i(TAG, "MediaDrm event: Vendor defined");
+ } else if (event == MediaDrm.EVENT_SESSION_RECLAIMED) {
+ Log.i(TAG, "MediaDrm event: Session reclaimed");
} else {
- Log.e(TAG, "Events not supported" + event);
+ Log.e(TAG, "MediaDrm event not supported: " + event);
}
}
});
+ mDrm.setOnExpirationUpdateListener(new MediaDrm.OnExpirationUpdateListener() {
+ @Override
+ public void onExpirationUpdate(MediaDrm md, byte[] sid, long expirationTime) {
+ if (md != mDrm) {
+ Log.e(TAG, "onExpirationUpdate callback: drm object mismatch");
+ } else if (!Arrays.equals(mSessionId, sid)) {
+ Log.e(TAG, "onExpirationUpdate callback: sessionId mismatch: |" +
+ Arrays.toString(mSessionId) + "| vs |" + Arrays.toString(sid) + "|");
+ } else {
+ mExpirationUpdateReceived = true;
+ }
+ }
+ }, null);
mDrm.setOnSessionLostStateListener(new MediaDrm.OnSessionLostStateListener() {
@Override
public void onSessionLostState(MediaDrm md, byte[] sid) {
@@ -330,7 +361,6 @@
keyStatus = keyInformation.get(2);
assertTrue(Arrays.equals(keyStatus.getKeyId(), new byte[] {0x0, 0x1, 0x2}));
assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_USABLE_IN_FUTURE);
-
}
}, null);
@@ -402,6 +432,7 @@
if (!preparePlayback(videoMime, videoFeatures, audioUrl, audioEncrypted, videoUrl,
videoEncrypted, videoWidth, videoHeight, scrambled, mSessionId, getSurfaces())) {
+ // TODO(b/182626189) investigate why cuttlefish does not support the requested media codec
return;
}
@@ -1189,6 +1220,240 @@
}
/**
+ * Test sendExpirationUpdate and onExpirationUpdateListener
+ *
+ * Expected behavior: the EXPIRATION_UPDATE event arrives
+ * at the onExpirationUpdateListener with the expiry time
+ */
+ @Presubmit
+ public void testOnExpirationUpdateListener() {
+
+ if (watchHasNoClearkeySupport()) {
+ return;
+ }
+
+ MediaDrm drm = null;
+ mSessionId = null;
+ mExpirationUpdateReceived = false;
+
+ // provideKeyResponse calls sendExpirationUpdate method
+ // for testing purpose, we therefore start a license request
+ // which calls provideKeyResonpse
+ byte[][] clearKeyIds = new byte[][] { CLEAR_KEY_CENC };
+ int keyType = MediaDrm.KEY_TYPE_STREAMING;
+ String initDataType = new String("cenc");
+
+ drm = startDrm(clearKeyIds, initDataType, CLEARKEY_SCHEME_UUID, keyType);
+ mSessionId = openSession(drm);
+ try {
+ if (!preparePlayback(
+ MIME_VIDEO_AVC,
+ new String[] { CodecCapabilities.FEATURE_SecurePlayback },
+ Uri.parse(Utils.getMediaPath() + CENC_AUDIO_PATH), false /* audioEncrypted */ ,
+ Uri.parse(Utils.getMediaPath() + CENC_VIDEO_PATH), true /* videoEncrypted */,
+ VIDEO_WIDTH_CENC, VIDEO_HEIGHT_CENC, false /* scrambled */,
+ mSessionId, getSurfaces())) {
+ closeSession(drm, mSessionId);
+ stopDrm(drm);
+ return;
+ }
+ } catch (Exception e) {
+ throw new Error("Unexpected exception ", e);
+ }
+
+ mDrmInitData = mMediaCodecPlayer.getDrmInitData();
+ getKeys(drm, initDataType, mSessionId, mDrmInitData,
+ keyType, clearKeyIds);
+
+ // wait for the event to arrive
+ try {
+ closeSession(drm, mSessionId);
+ // wait up to 2 seconds for event
+ for (int i = 0; i < 20 && !mExpirationUpdateReceived; i++) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ }
+ if (!mExpirationUpdateReceived) {
+ throw new Error("EXPIRATION_UPDATE event was not received by the listener");
+ }
+ } catch (MediaDrmStateException e) {
+ throw new Error("Unexpected exception from closing session: ", e);
+ } finally {
+ stopDrm(drm);
+ }
+ }
+
+ /**
+ * Test that the onExpirationUpdateListener
+ * listener is not called after
+ * clearOnExpirationUpdateListener is called.
+ */
+ @Presubmit
+ public void testClearOnExpirationUpdateListener() {
+
+ if (watchHasNoClearkeySupport()) {
+ return;
+ }
+
+ MediaDrm drm = null;
+ mSessionId = null;
+ mExpirationUpdateReceived = false;
+
+ // provideKeyResponse calls sendExpirationUpdate method
+ // for testing purpose, we therefore start a license request
+ // which calls provideKeyResonpse
+ byte[][] clearKeyIds = new byte[][] { CLEAR_KEY_CENC };
+ int keyType = MediaDrm.KEY_TYPE_STREAMING;
+ String initDataType = new String("cenc");
+
+ drm = startDrm(clearKeyIds, initDataType, CLEARKEY_SCHEME_UUID, keyType);
+ mSessionId = openSession(drm);
+ try {
+ if (!preparePlayback(
+ MIME_VIDEO_AVC,
+ new String[] { CodecCapabilities.FEATURE_SecurePlayback },
+ Uri.parse(Utils.getMediaPath() + CENC_AUDIO_PATH), false /* audioEncrypted */ ,
+ Uri.parse(Utils.getMediaPath() + CENC_VIDEO_PATH), true /* videoEncrypted */,
+ VIDEO_WIDTH_CENC, VIDEO_HEIGHT_CENC, false /* scrambled */,
+ mSessionId, getSurfaces())) {
+ closeSession(drm, mSessionId);
+ stopDrm(drm);
+ return;
+ }
+ } catch (Exception e) {
+ throw new Error("Unexpected exception ", e);
+ }
+
+ // clear the expiration update listener
+ drm.clearOnExpirationUpdateListener();
+ mDrmInitData = mMediaCodecPlayer.getDrmInitData();
+ getKeys(drm, initDataType, mSessionId, mDrmInitData,
+ keyType, clearKeyIds);
+
+ // wait for the event, it should not arrive
+ // because the expiration update listener has been cleared
+ try {
+ closeSession(drm, mSessionId);
+ // wait up to 2 seconds for event
+ for (int i = 0; i < 20 && !mExpirationUpdateReceived; i++) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ }
+ if (mExpirationUpdateReceived) {
+ throw new Error("onExpirationUpdateListener should not be called");
+ }
+ } catch (MediaDrmStateException e) {
+ throw new Error("Unexpected exception from closing session: ", e);
+ } finally {
+ stopDrm(drm);
+ }
+ }
+
+ /**
+ * Test that after onClearEventListener is called,
+ * MediaDrm's event listener is not called.
+ *
+ * Clearkey plugin's provideKeyResponse method sends a
+ * vendor defined event to the media drm event listener
+ * for testing purpose. Check that after onClearEventListener
+ * is called, the event listener is not called.
+ */
+ @Presubmit
+ public void testClearOnEventListener() {
+
+ if (watchHasNoClearkeySupport()) {
+ return;
+ }
+
+ MediaDrm drm = null;
+ mSessionId = null;
+ mEventListenerCalled = false;
+
+ // provideKeyResponse in clearkey plugin sends a
+ // vendor defined event to test the event listener;
+ // we therefore start a license request which will
+ // call provideKeyResonpse
+ byte[][] clearKeyIds = new byte[][] { CLEAR_KEY_CENC };
+ int keyType = MediaDrm.KEY_TYPE_STREAMING;
+ String initDataType = new String("cenc");
+
+ drm = startDrm(clearKeyIds, initDataType, CLEARKEY_SCHEME_UUID, keyType);
+ mSessionId = openSession(drm);
+ try {
+ if (!preparePlayback(
+ MIME_VIDEO_AVC,
+ new String[] { CodecCapabilities.FEATURE_SecurePlayback },
+ Uri.parse(Utils.getMediaPath() + CENC_AUDIO_PATH), false /* audioEncrypted */ ,
+ Uri.parse(Utils.getMediaPath() + CENC_VIDEO_PATH), true /* videoEncrypted */,
+ VIDEO_WIDTH_CENC, VIDEO_HEIGHT_CENC, false /* scrambled */,
+ mSessionId, getSurfaces())) {
+ closeSession(drm, mSessionId);
+ stopDrm(drm);
+ return;
+ }
+ } catch (Exception e) {
+ throw new Error("Unexpected exception ", e);
+ }
+
+ // test that the onEvent listener is called
+ mDrmInitData = mMediaCodecPlayer.getDrmInitData();
+ getKeys(drm, initDataType, mSessionId, mDrmInitData,
+ keyType, clearKeyIds);
+
+ // wait for the vendor defined event, it should not arrive
+ // because the event listener is cleared
+ try {
+ // wait up to 2 seconds for event
+ for (int i = 0; i < 20 && !mEventListenerCalled; i++) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ }
+ if (!mEventListenerCalled) {
+ closeSession(drm, mSessionId);
+ stopDrm(drm);
+ throw new Error("onEventListener should be called");
+ }
+ } catch (MediaDrmStateException e) {
+ closeSession(drm, mSessionId);
+ stopDrm(drm);
+ throw new Error("Unexpected exception from closing session: ", e);
+ }
+
+ // clear the drm event listener
+ // and test that the onEvent listener is not called
+ mEventListenerCalled = false;
+ drm.clearOnEventListener();
+ getKeys(drm, initDataType, mSessionId, mDrmInitData,
+ keyType, clearKeyIds);
+
+ // wait for the vendor defined event, it should not arrive
+ // because the event listener is cleared
+ try {
+ closeSession(drm, mSessionId);
+ // wait up to 2 seconds for event
+ for (int i = 0; i < 20 && !mEventListenerCalled; i++) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ }
+ if (mEventListenerCalled) {
+ throw new Error("onEventListener should not be called");
+ }
+ } catch (MediaDrmStateException e) {
+ throw new Error("Unexpected exception from closing session: ", e);
+ } finally {
+ stopDrm(drm);
+ }
+ }
+
+ /**
* Test that the framework handles a device returning invoking
* the ::android::hardware::drm@1.2::sendSessionLostState callback
* Expected behavior: OnSessionLostState is called with
@@ -1238,6 +1503,61 @@
}
}
+ /**
+ * Test that the framework handles a device ignoring
+ * events for the onSessionLostStateListener after
+ * clearOnSessionLostStateListener is called.
+ *
+ * Expected behavior: OnSessionLostState is not called with
+ * the sessionId
+ */
+ @Presubmit
+ public void testClearOnSessionLostStateListener() {
+
+ if (watchHasNoClearkeySupport()) {
+ return;
+ }
+
+ boolean gotException = false;
+ mLostStateReceived = false;
+
+ MediaDrm drm = startDrm(new byte[][] { CLEAR_KEY_CENC }, "cenc",
+ CLEARKEY_SCHEME_UUID, MediaDrm.KEY_TYPE_STREAMING);
+
+ mDrm.setPropertyString("drmErrorTest", "lostState");
+ mSessionId = openSession(drm);
+
+ // Simulates session lost state here, event is sent from closeSession.
+ // The session lost state should not arrive in the listener
+ // after clearOnSessionLostStateListener() is called.
+ try {
+ try {
+ mDrm.clearOnSessionLostStateListener();
+ Thread.sleep(2000);
+ closeSession(drm, mSessionId);
+ } catch (MediaDrmStateException e) {
+ gotException = true; // expected for lost state
+ }
+ // wait up to 2 seconds for event
+ for (int i = 0; i < 20 && !mLostStateReceived; i++) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ }
+ }
+ if (mLostStateReceived) {
+ throw new Error("Should not receive callback for OnSessionLostStateListener");
+ }
+ } catch(Exception e) {
+ throw new Error("Unexpected exception ", e);
+ } finally {
+ stopDrm(drm);
+ }
+ if (!gotException) {
+ throw new Error("Didn't receive expected MediaDrmStateException");
+ }
+ }
+
@Presubmit
public void testIsCryptoSchemeSupportedWithSecurityLevel() {
if (watchHasNoClearkeySupport()) {
diff --git a/tests/tests/media/src/android/media/cts/MediaFormatTest.java b/tests/tests/media/src/android/media/cts/MediaFormatTest.java
index 2beae2b..fb27c56 100644
--- a/tests/tests/media/src/android/media/cts/MediaFormatTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaFormatTest.java
@@ -589,12 +589,16 @@
public void testMediaFormatConstructors() {
MediaFormat format;
{
- format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 48000, 6);
- assertEquals(MediaFormat.MIMETYPE_AUDIO_AAC, format.getString(MediaFormat.KEY_MIME));
- assertEquals(48000, format.getInteger(MediaFormat.KEY_SAMPLE_RATE));
- assertEquals(6, format.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
- assertEquals(3, format.getKeys().size());
- assertEquals(0, format.getFeatures().size());
+ String[] audioMimeTypes = { MediaFormat.MIMETYPE_AUDIO_AAC,
+ MediaFormat.MIMETYPE_AUDIO_MPEGH_MHA1, MediaFormat.MIMETYPE_AUDIO_MPEGH_MHM1 };
+ for (String mime : audioMimeTypes) {
+ format = MediaFormat.createAudioFormat(mime, 48000, 6);
+ assertEquals(mime, format.getString(MediaFormat.KEY_MIME));
+ assertEquals(48000, format.getInteger(MediaFormat.KEY_SAMPLE_RATE));
+ assertEquals(6, format.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
+ assertEquals(3, format.getKeys().size());
+ assertEquals(0, format.getFeatures().size());
+ }
}
{
diff --git a/tests/tests/media/src/android/media/cts/SoundPoolTest.java b/tests/tests/media/src/android/media/cts/SoundPoolTest.java
index e4df4ac..c345816 100644
--- a/tests/tests/media/src/android/media/cts/SoundPoolTest.java
+++ b/tests/tests/media/src/android/media/cts/SoundPoolTest.java
@@ -16,26 +16,32 @@
package android.media.cts;
-import android.media.cts.R;
-
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
+import android.media.cts.R;
import android.platform.test.annotations.AppModeFull;
-import android.test.AndroidTestCase;
-
+import androidx.test.InstrumentationRegistry;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicInteger;
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
@AppModeFull(reason = "TODO: evaluate and port to instant")
-abstract class SoundPoolTest extends AndroidTestCase {
+@RunWith(JUnitParamsRunner.class)
+abstract class SoundPoolTest {
private static final int SOUNDPOOL_STREAMS = 4;
private static final int PRIORITY = 1;
@@ -71,20 +77,22 @@
return sounds;
}
+ private static Context getContext() {
+ return InstrumentationRegistry.getInstrumentation().getTargetContext();
+ }
+
protected AudioAttributes getAudioAttributes() {
return new AudioAttributes.Builder()
.setLegacyStreamType(AudioManager.STREAM_MUSIC).build();
}
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mFile = new File(mContext.getFilesDir(), getFileName());
+ @Before
+ public void setUp() throws Exception {
+ mFile = new File(getContext().getFilesDir(), getFileName());
}
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
+ @After
+ public void tearDown() throws Exception {
if (mFile.exists()) {
mFile.delete();
}
@@ -95,15 +103,16 @@
}
}
+ @Test
public void testLoad() throws Exception {
mSoundPool = new SoundPool.Builder().setMaxStreams(SOUNDPOOL_STREAMS)
.setAudioAttributes(getAudioAttributes()).build();
- int sampleId1 = mSoundPool.load(mContext, getSoundA(), PRIORITY);
+ int sampleId1 = mSoundPool.load(getContext(), getSoundA(), PRIORITY);
waitUntilLoaded(sampleId1);
// should return true, but returns false
mSoundPool.unload(sampleId1);
- AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(getSoundCs());
+ AssetFileDescriptor afd = getContext().getResources().openRawResourceFd(getSoundCs());
int sampleId2;
sampleId2 = mSoundPool.load(afd, PRIORITY);
waitUntilLoaded(sampleId2);
@@ -129,7 +138,7 @@
FileOutputStream fOutput = null;
try {
fOutput = new FileOutputStream(f);
- InputStream is = mContext.getResources().openRawResource(getSoundA());
+ InputStream is = getContext().getResources().openRawResource(getSoundA());
byte[] buffer = new byte[1024];
int length = is.read(buffer);
while (length != -1) {
@@ -144,8 +153,14 @@
}
}
- public void testSoundPoolOp() throws Exception {
- mSoundPool = new SoundPool.Builder().setMaxStreams(SOUNDPOOL_STREAMS)
+ /**
+ * Parameterized tests consider 1, 2, 4 streams in the SoundPool.
+ */
+
+ @Test
+ @Parameters({"1", "2", "4"})
+ public void testSoundPoolOp(int streamCount) throws Exception {
+ mSoundPool = new SoundPool.Builder().setMaxStreams(streamCount)
.setAudioAttributes(getAudioAttributes()).build();
int sampleID = loadSampleSync(getSoundA(), PRIORITY);
@@ -187,8 +202,10 @@
mSoundPool.unload(sampleID);
}
- public void testMultiSound() throws Exception {
- mSoundPool = new SoundPool.Builder().setMaxStreams(SOUNDPOOL_STREAMS)
+ @Test
+ @Parameters({"1", "2", "4"})
+ public void testMultiSound(int streamCount) throws Exception {
+ mSoundPool = new SoundPool.Builder().setMaxStreams(streamCount)
.setAudioAttributes(getAudioAttributes()).build();
int sampleID1 = loadSampleSync(getSoundA(), PRIORITY);
int sampleID2 = loadSampleSync(getSoundCs(), PRIORITY);
@@ -217,8 +234,10 @@
mSoundPool = null;
}
- public void testLoadMore() throws Exception {
- mSoundPool = new SoundPool.Builder().setMaxStreams(SOUNDPOOL_STREAMS)
+ @Test
+ @Parameters({"1", "2", "4"})
+ public void testLoadMore(int streamCount) throws Exception {
+ mSoundPool = new SoundPool.Builder().setMaxStreams(streamCount)
.setAudioAttributes(getAudioAttributes()).build();
int[] sounds = getSounds();
int[] soundIds = new int[sounds.length];
@@ -241,6 +260,7 @@
mSoundPool.release();
}
+ @Test
public void testAutoPauseResume() throws Exception {
// The number of possible SoundPool streams simultaneously active is limited by
// track resources. Generally this is no greater than 32, but the actual
@@ -283,7 +303,7 @@
// initiate loading
final int[] soundIds = new int[TEST_STREAMS];
for (int i = 0; i < soundIds.length; i++) {
- soundIds[i] = soundPool.load(mContext, sounds[i % sounds.length], PRIORITY);
+ soundIds[i] = soundPool.load(getContext(), sounds[i % sounds.length], PRIORITY);
}
// wait for all sounds to load,
@@ -346,7 +366,7 @@
* @throws InterruptedException
*/
private int loadSampleSync(int sampleId, int prio) throws InterruptedException {
- int sample = mSoundPool.load(mContext, sampleId, prio);
+ int sample = mSoundPool.load(getContext(), sampleId, prio);
waitUntilLoaded(sample);
return sample;
}
diff --git a/tests/tests/media/src/android/media/cts/StubMediaRoute2ProviderService.java b/tests/tests/media/src/android/media/cts/StubMediaRoute2ProviderService.java
index af02d16..efe4859 100644
--- a/tests/tests/media/src/android/media/cts/StubMediaRoute2ProviderService.java
+++ b/tests/tests/media/src/android/media/cts/StubMediaRoute2ProviderService.java
@@ -35,6 +35,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import javax.annotation.concurrent.GuardedBy;
@@ -58,6 +59,7 @@
public static final String ROUTE_ID_SPECIAL_FEATURE = "route_special_feature";
public static final String ROUTE_NAME_SPECIAL_FEATURE = "Special Feature Route";
+ public static final int INITIAL_VOLUME = 30;
public static final int VOLUME_MAX = 100;
public static final int SESSION_VOLUME_MAX = 50;
public static final int SESSION_VOLUME_INITIAL = 20;
@@ -122,6 +124,7 @@
new MediaRoute2Info.Builder(ROUTE_ID_VARIABLE_VOLUME, ROUTE_NAME_VARIABLE_VOLUME)
.addFeature(FEATURE_SAMPLE)
.setVolumeHandling(PLAYBACK_VOLUME_VARIABLE)
+ .setVolume(INITIAL_VOLUME)
.setVolumeMax(VOLUME_MAX)
.build();
@@ -383,6 +386,28 @@
publishRoutes();
}
+ /**
+ * Adds a route and publishes it. It could replace a route in the provider if
+ * they have the same route id.
+ */
+ public void addRoute(@NonNull MediaRoute2Info route) {
+ Objects.requireNonNull(route, "route must not be null");
+ mRoutes.put(route.getOriginalId(), route);
+ publishRoutes();
+ }
+
+ /**
+ * Removes a route and publishes it.
+ */
+ public void removeRoute(@NonNull String routeId) {
+ Objects.requireNonNull(routeId, "routeId must not be null");
+ MediaRoute2Info route = mRoutes.get(routeId);
+ if (route != null) {
+ mRoutes.remove(routeId);
+ publishRoutes();
+ }
+ }
+
void maybeDeselectRoute(String routeId, long requestId) {
if (!mRouteIdToSessionId.containsKey(routeId)) {
return;
diff --git a/tests/tests/media/src/android/media/cts/SystemMediaRouter2Test.java b/tests/tests/media/src/android/media/cts/SystemMediaRouter2Test.java
new file mode 100644
index 0000000..8e09880
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/SystemMediaRouter2Test.java
@@ -0,0 +1,1040 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import static android.content.Context.AUDIO_SERVICE;
+import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO;
+import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE;
+import static android.media.cts.StubMediaRoute2ProviderService.FEATURE_SAMPLE;
+import static android.media.cts.StubMediaRoute2ProviderService.FEATURE_SPECIAL;
+import static android.media.cts.StubMediaRoute2ProviderService.ROUTE_ID1;
+import static android.media.cts.StubMediaRoute2ProviderService.ROUTE_ID2;
+import static android.media.cts.StubMediaRoute2ProviderService.ROUTE_ID3_SESSION_CREATION_FAILED;
+import static android.media.cts.StubMediaRoute2ProviderService.ROUTE_ID4_TO_SELECT_AND_DESELECT;
+import static android.media.cts.StubMediaRoute2ProviderService.ROUTE_ID5_TO_TRANSFER_TO;
+import static android.media.cts.StubMediaRoute2ProviderService.ROUTE_ID_VARIABLE_VOLUME;
+import static android.media.cts.StubMediaRoute2ProviderService.ROUTE_NAME2;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.MediaRoute2Info;
+import android.media.MediaRouter2;
+import android.media.MediaRouter2.ControllerCallback;
+import android.media.MediaRouter2.RouteCallback;
+import android.media.MediaRouter2.RoutingController;
+import android.media.MediaRouter2.TransferCallback;
+import android.media.MediaRouter2Manager;
+import android.media.RouteDiscoveryPreference;
+import android.media.RoutingSessionInfo;
+import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.LargeTest;
+import android.text.TextUtils;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.compatibility.common.util.PollingCheck;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "The system should be able to bind to StubMediaRoute2ProviderService")
+@LargeTest
+@NonMediaMainlineTest
+public class SystemMediaRouter2Test {
+ private static final String TAG = "SystemMR2Test";
+ Context mContext;
+ private MediaRouter2 mSystemRouter2ForCts;
+ private MediaRouter2 mAppRouter2;
+
+ private Executor mExecutor;
+ private AudioManager mAudioManager;
+ private StubMediaRoute2ProviderService mService;
+
+ private static final int TIMEOUT_MS = 5000;
+ private static final int WAIT_MS = 2000;
+
+ private RouteCallback mAppRouterPlaceHolderCallback = new RouteCallback() {};
+
+ private final List<RouteCallback> mRouteCallbacks = new ArrayList<>();
+ private final List<TransferCallback> mTransferCallbacks = new ArrayList<>();
+
+ public static final List<String> FEATURES_ALL = new ArrayList();
+ public static final List<String> FEATURES_SPECIAL = new ArrayList();
+
+ static {
+ FEATURES_ALL.add(FEATURE_SAMPLE);
+ FEATURES_ALL.add(FEATURE_SPECIAL);
+ FEATURES_ALL.add(FEATURE_LIVE_AUDIO);
+
+ FEATURES_SPECIAL.add(FEATURE_SPECIAL);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mExecutor = Executors.newSingleThreadExecutor();
+ mAudioManager = (AudioManager) mContext.getSystemService(AUDIO_SERVICE);
+ MediaRouter2TestActivity.startActivity(mContext);
+
+ mSystemRouter2ForCts = MediaRouter2.getInstance(mContext, mContext.getPackageName());
+ mSystemRouter2ForCts.startScan();
+
+ mAppRouter2 = MediaRouter2.getInstance(mContext);
+ // In order to make the system bind to the test service,
+ // set a non-empty discovery preference.
+ List<String> features = new ArrayList<>();
+ features.add("A test feature");
+ RouteDiscoveryPreference preference =
+ new RouteDiscoveryPreference.Builder(features, false).build();
+ mRouteCallbacks.add(mAppRouterPlaceHolderCallback);
+ mAppRouter2.registerRouteCallback(mExecutor, mAppRouterPlaceHolderCallback, preference);
+
+ new PollingCheck(TIMEOUT_MS) {
+ @Override
+ protected boolean check() {
+ StubMediaRoute2ProviderService service =
+ StubMediaRoute2ProviderService.getInstance();
+ if (service != null) {
+ mService = service;
+ return true;
+ }
+ return false;
+ }
+ }.run();
+ mService.initializeRoutes();
+ mService.publishRoutes();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ mSystemRouter2ForCts.stopScan();
+
+ MediaRouter2TestActivity.finishActivity();
+ if (mService != null) {
+ mService.clear();
+ mService = null;
+ }
+
+ // order matters (callbacks should be cleared at the last)
+ releaseAllSessions();
+ // unregister callbacks
+ clearCallbacks();
+ }
+
+ @Test
+ public void testGetInstanceWithInvalidPackageName() {
+ assertNull(MediaRouter2.getInstance(mContext, "com.non.existent.package.name"));
+ }
+
+ @Test
+ public void testGetInstanceReturnsSameInstance() {
+ assertSame(mSystemRouter2ForCts,
+ MediaRouter2.getInstance(mContext, mContext.getPackageName()));
+ }
+
+ @Test
+ public void testGetClientPackageName() {
+ assertEquals(mContext.getPackageName(), mSystemRouter2ForCts.getClientPackageName());
+ }
+
+ @Test
+ public void testGetSystemController() {
+ RoutingController controller = mSystemRouter2ForCts.getSystemController();
+ assertNotNull(controller);
+ // getSystemController() should always return the same instance.
+ assertSame(controller, mSystemRouter2ForCts.getSystemController());
+ }
+
+ @Test
+ public void testGetControllerReturnsNullForUnknownId() {
+ assertNull(mSystemRouter2ForCts.getController("nonExistentControllerId"));
+ }
+
+ @Test
+ public void testGetController() {
+ String systemControllerId = mSystemRouter2ForCts.getSystemController().getId();
+ RoutingController controllerById = mSystemRouter2ForCts.getController(systemControllerId);
+ assertNotNull(controllerById);
+ assertEquals(systemControllerId, controllerById.getId());
+ }
+
+ @Test
+ public void testGetAllRoutes() throws Exception {
+ waitAndGetRoutes(FEATURE_SPECIAL);
+
+ // Regardless of whether the app router registered its preference,
+ // getAllRoutes() will return all the routes.
+ boolean routeFound = false;
+ for (MediaRoute2Info route : mSystemRouter2ForCts.getAllRoutes()) {
+ if (route.getFeatures().contains(FEATURE_SPECIAL)) {
+ routeFound = true;
+ break;
+ }
+ }
+ assertTrue(routeFound);
+ }
+
+ @Test
+ public void testGetRoutes() throws Exception {
+ // Since the app router haven't registered any preference yet,
+ // only the system routes will come out after creation.
+ assertTrue(mSystemRouter2ForCts.getRoutes().isEmpty());
+
+ waitAndGetRoutes(FEATURE_SPECIAL);
+
+ boolean routeFound = false;
+ for (MediaRoute2Info route : mSystemRouter2ForCts.getRoutes()) {
+ if (route.getFeatures().contains(FEATURE_SPECIAL)) {
+ routeFound = true;
+ break;
+ }
+ }
+ assertTrue(routeFound);
+ }
+
+ @Test
+ public void testRouteCallbackOnRoutesAdded() throws Exception {
+ mAppRouter2.registerRouteCallback(mExecutor, mAppRouterPlaceHolderCallback,
+ new RouteDiscoveryPreference.Builder(FEATURES_ALL, true).build());
+
+ MediaRoute2Info routeToAdd = new MediaRoute2Info.Builder("testRouteId", "testRouteName")
+ .addFeature(FEATURE_SAMPLE)
+ .build();
+
+ CountDownLatch addedLatch = new CountDownLatch(1);
+ RouteCallback routeCallback = new RouteCallback() {
+ @Override
+ public void onRoutesAdded(List<MediaRoute2Info> routes) {
+ for (MediaRoute2Info route : routes) {
+ if (route.getOriginalId().equals(routeToAdd.getOriginalId())
+ && route.getName().equals(routeToAdd.getName())) {
+ addedLatch.countDown();
+ }
+ }
+ }
+ };
+ mRouteCallbacks.add(routeCallback);
+ mSystemRouter2ForCts.registerRouteCallback(mExecutor, routeCallback,
+ RouteDiscoveryPreference.EMPTY);
+
+ mService.addRoute(routeToAdd);
+ assertTrue(addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ }
+
+ @Test
+ public void testRouteCallbackOnRoutesRemoved() throws Exception {
+ mAppRouter2.registerRouteCallback(mExecutor, mAppRouterPlaceHolderCallback,
+ new RouteDiscoveryPreference.Builder(FEATURES_ALL, true).build());
+
+ waitAndGetRoutes(FEATURE_SAMPLE);
+
+ CountDownLatch removedLatch = new CountDownLatch(1);
+ RouteCallback routeCallback = new RouteCallback() {
+ @Override
+ public void onRoutesRemoved(List<MediaRoute2Info> routes) {
+ for (MediaRoute2Info route : routes) {
+ if (route.getOriginalId().equals(ROUTE_ID2)
+ && route.getName().equals(ROUTE_NAME2)) {
+ removedLatch.countDown();
+ break;
+ }
+ }
+ }
+ };
+ mRouteCallbacks.add(routeCallback);
+ mSystemRouter2ForCts.registerRouteCallback(mExecutor, routeCallback,
+ RouteDiscoveryPreference.EMPTY);
+
+ mService.removeRoute(ROUTE_ID2);
+ assertTrue(removedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ }
+
+ @Test
+ public void testRouteCallbackOnRoutesChanged() throws Exception {
+ mAppRouter2.registerRouteCallback(mExecutor, mAppRouterPlaceHolderCallback,
+ new RouteDiscoveryPreference.Builder(FEATURES_ALL, true).build());
+
+ waitAndGetRoutes(FEATURE_SAMPLE);
+
+ MediaRoute2Info routeToChangeVolume = null;
+ for (MediaRoute2Info route : mSystemRouter2ForCts.getAllRoutes()) {
+ if (TextUtils.equals(ROUTE_ID_VARIABLE_VOLUME, route.getOriginalId())) {
+ routeToChangeVolume = route;
+ break;
+ }
+ }
+ assertNotNull(routeToChangeVolume);
+
+ int targetVolume = routeToChangeVolume.getVolume() + 1;
+ CountDownLatch changedLatch = new CountDownLatch(1);
+ RouteCallback routeCallback = new RouteCallback() {
+ @Override
+ public void onRoutesChanged(List<MediaRoute2Info> routes) {
+ for (MediaRoute2Info route : routes) {
+ if (route.getOriginalId().equals(ROUTE_ID_VARIABLE_VOLUME)
+ && route.getVolume() == targetVolume) {
+ changedLatch.countDown();
+ break;
+ }
+ }
+ }
+ };
+ mRouteCallbacks.add(routeCallback);
+ mSystemRouter2ForCts.registerRouteCallback(mExecutor, routeCallback,
+ RouteDiscoveryPreference.EMPTY);
+
+ mSystemRouter2ForCts.setRouteVolume(routeToChangeVolume, targetVolume);
+ assertTrue(changedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ }
+
+
+ @Test
+ public void testRouteCallbackOnRoutesChanged_whenLocalVolumeChanged() throws Exception {
+ if (mAudioManager.isVolumeFixed()) {
+ return;
+ }
+
+ waitAndGetRoutes(FEATURE_LIVE_AUDIO);
+
+ final int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ final int minVolume = mAudioManager.getStreamMinVolume(AudioManager.STREAM_MUSIC);
+ final int originalVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
+
+ MediaRoute2Info selectedSystemRoute =
+ mSystemRouter2ForCts.getSystemController().getSelectedRoutes().get(0);
+
+ assertEquals(maxVolume, selectedSystemRoute.getVolumeMax());
+ assertEquals(originalVolume, selectedSystemRoute.getVolume());
+ assertEquals(PLAYBACK_VOLUME_VARIABLE, selectedSystemRoute.getVolumeHandling());
+
+ final int targetVolume = originalVolume == minVolume
+ ? originalVolume + 1 : originalVolume - 1;
+ final CountDownLatch latch = new CountDownLatch(1);
+ RouteCallback routeCallback = new RouteCallback() {
+ @Override
+ public void onRoutesChanged(List<MediaRoute2Info> routes) {
+ for (MediaRoute2Info route : routes) {
+ if (route.getId().equals(selectedSystemRoute.getId())
+ && route.getVolume() == targetVolume) {
+ latch.countDown();
+ break;
+ }
+ }
+ }
+ };
+
+ mSystemRouter2ForCts.registerRouteCallback(mExecutor, routeCallback,
+ RouteDiscoveryPreference.EMPTY);
+
+ try {
+ mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, targetVolume, 0);
+ assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ mSystemRouter2ForCts.unregisterRouteCallback(routeCallback);
+ mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, originalVolume, 0);
+ }
+ }
+
+ @Test
+ public void testRouteCallbackOnPreferredFeaturesChanged() throws Exception {
+ String testFeature = "testFeature";
+ List<String> testFeatures = new ArrayList<>();
+ testFeatures.add(testFeature);
+
+ CountDownLatch featuresChangedLatch = new CountDownLatch(1);
+ RouteCallback routeCallback = new RouteCallback() {
+ @Override
+ public void onPreferredFeaturesChanged(List<String> preferredFeatures) {
+ if (preferredFeatures.contains(testFeature)) {
+ featuresChangedLatch.countDown();
+ }
+ }
+ };
+ mRouteCallbacks.add(routeCallback);
+ mSystemRouter2ForCts.registerRouteCallback(mExecutor, routeCallback,
+ RouteDiscoveryPreference.EMPTY);
+
+ mAppRouter2.registerRouteCallback(mExecutor, mAppRouterPlaceHolderCallback,
+ new RouteDiscoveryPreference.Builder(testFeatures, true).build());
+ assertTrue(featuresChangedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ }
+
+ @Test
+ public void testTransferTo_succeeds_onTransferCalled() throws Exception {
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info route = routes.get(ROUTE_ID1);
+ assertNotNull(route);
+
+ final CountDownLatch successLatch = new CountDownLatch(1);
+ final CountDownLatch failureLatch = new CountDownLatch(1);
+ final List<RoutingController> controllers = new ArrayList<>();
+
+ // Create session with this route
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ assertEquals(mSystemRouter2ForCts.getSystemController(), oldController);
+ assertTrue(createRouteMap(newController.getSelectedRoutes()).containsKey(
+ ROUTE_ID1));
+ controllers.add(newController);
+ successLatch.countDown();
+ }
+
+ @Override
+ public void onTransferFailure(MediaRoute2Info requestedRoute) {
+ failureLatch.countDown();
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.transferTo(route);
+ assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ List<RoutingController> controllersFromGetControllers =
+ mSystemRouter2ForCts.getControllers();
+ assertEquals(2, controllersFromGetControllers.size());
+ assertTrue(createRouteMap(controllersFromGetControllers.get(1).getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+
+ // onSessionCreationFailed should not be called.
+ assertFalse(failureLatch.await(WAIT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(controllers);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+ }
+
+ @Test
+ public void testTransferTo_fails_onTransferFailureCalled() throws Exception {
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info route = routes.get(ROUTE_ID3_SESSION_CREATION_FAILED);
+ assertNotNull(route);
+
+ final CountDownLatch successLatch = new CountDownLatch(1);
+ final CountDownLatch failureLatch = new CountDownLatch(1);
+ final List<RoutingController> controllers = new ArrayList<>();
+
+ // Create session with this route
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ controllers.add(newController);
+ successLatch.countDown();
+ }
+
+ @Override
+ public void onTransferFailure(MediaRoute2Info requestedRoute) {
+ assertEquals(route, requestedRoute);
+ failureLatch.countDown();
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.transferTo(route);
+ assertTrue(failureLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ // onTransfer should not be called.
+ assertFalse(successLatch.await(WAIT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(controllers);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+ }
+
+ @Test
+ public void testTransferToTwice() throws Exception {
+ final CountDownLatch successLatch1 = new CountDownLatch(1);
+ final CountDownLatch successLatch2 = new CountDownLatch(1);
+ final CountDownLatch failureLatch = new CountDownLatch(1);
+ final CountDownLatch stopLatch = new CountDownLatch(1);
+ final CountDownLatch onReleaseSessionLatch = new CountDownLatch(1);
+
+ final List<RoutingController> createdControllers = new ArrayList<>();
+
+ // Create session with this route
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ createdControllers.add(newController);
+ if (successLatch1.getCount() > 0) {
+ successLatch1.countDown();
+ } else {
+ successLatch2.countDown();
+ }
+ }
+
+ @Override
+ public void onTransferFailure(MediaRoute2Info requestedRoute) {
+ failureLatch.countDown();
+ }
+
+ @Override
+ public void onStop(RoutingController controller) {
+ stopLatch.countDown();
+ }
+ };
+
+ StubMediaRoute2ProviderService service = mService;
+ if (service != null) {
+ service.setProxy(new StubMediaRoute2ProviderService.Proxy() {
+ @Override
+ public void onReleaseSession(long requestId, String sessionId) {
+ onReleaseSessionLatch.countDown();
+ }
+ });
+ }
+
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info route1 = routes.get(ROUTE_ID1);
+ MediaRoute2Info route2 = routes.get(ROUTE_ID2);
+ assertNotNull(route1);
+ assertNotNull(route2);
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.transferTo(route1);
+ assertTrue(successLatch1.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ mSystemRouter2ForCts.transferTo(route2);
+ assertTrue(successLatch2.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ // onTransferFailure/onStop should not be called.
+ assertFalse(failureLatch.await(WAIT_MS, TimeUnit.MILLISECONDS));
+ assertFalse(stopLatch.await(WAIT_MS, TimeUnit.MILLISECONDS));
+
+ // Created controllers should have proper info
+ assertEquals(2, createdControllers.size());
+ RoutingController controller1 = createdControllers.get(0);
+ RoutingController controller2 = createdControllers.get(1);
+
+ assertNotEquals(controller1.getId(), controller2.getId());
+ assertTrue(createRouteMap(controller1.getSelectedRoutes()).containsKey(
+ ROUTE_ID1));
+ assertTrue(createRouteMap(controller2.getSelectedRoutes()).containsKey(
+ ROUTE_ID2));
+
+ // Should be able to release transferred controllers.
+ controller1.release();
+ assertTrue(onReleaseSessionLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(createdControllers);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+ }
+
+ // Same test with testTransferTo_succeeds_onTransferCalled,
+ // but with MediaRouter2#transfer(controller, route) instead of transferTo(route).
+ @Test
+ public void testTransfer_succeeds_onTransferCalled() throws Exception {
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info route = routes.get(ROUTE_ID1);
+ assertNotNull(route);
+
+ final CountDownLatch successLatch = new CountDownLatch(1);
+ final CountDownLatch failureLatch = new CountDownLatch(1);
+ final List<RoutingController> controllers = new ArrayList<>();
+
+ // Create session with this route
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ assertEquals(mSystemRouter2ForCts.getSystemController(), oldController);
+ assertTrue(createRouteMap(newController.getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+ controllers.add(newController);
+ successLatch.countDown();
+ }
+
+ @Override
+ public void onTransferFailure(MediaRoute2Info requestedRoute) {
+ failureLatch.countDown();
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.transfer(mSystemRouter2ForCts.getSystemController(), route);
+ assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ List<RoutingController> controllersFromGetControllers =
+ mSystemRouter2ForCts.getControllers();
+ assertEquals(2, controllersFromGetControllers.size());
+ assertTrue(createRouteMap(controllersFromGetControllers.get(1).getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+
+ // onSessionCreationFailed should not be called.
+ assertFalse(failureLatch.await(WAIT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(controllers);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+ }
+
+ @Test
+ public void testStop() throws Exception {
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info route = routes.get(ROUTE_ID1);
+ assertNotNull(route);
+
+ final CountDownLatch onTransferLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatch = new CountDownLatch(1);
+ final CountDownLatch onStopLatch = new CountDownLatch(1);
+ final List<RoutingController> controllers = new ArrayList<>();
+
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ assertEquals(mSystemRouter2ForCts.getSystemController(), oldController);
+ assertTrue(createRouteMap(newController.getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+ controllers.add(newController);
+ onTransferLatch.countDown();
+ }
+ @Override
+ public void onStop(RoutingController controller) {
+ if (onTransferLatch.getCount() != 0
+ || !TextUtils.equals(controllers.get(0).getId(), controller.getId())) {
+ return;
+ }
+ onStopLatch.countDown();
+ }
+ };
+
+ ControllerCallback controllerCallback = new ControllerCallback() {
+ @Override
+ public void onControllerUpdated(RoutingController controller) {
+ if (onTransferLatch.getCount() != 0
+ || !TextUtils.equals(controllers.get(0).getId(), controller.getId())) {
+ return;
+ }
+ onControllerUpdatedLatch.countDown();
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.registerControllerCallback(mExecutor, controllerCallback);
+ mSystemRouter2ForCts.transferTo(route);
+ assertTrue(onTransferLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ assertEquals(1, controllers.size());
+ RoutingController controller = controllers.get(0);
+
+ mSystemRouter2ForCts.stop();
+
+ // Select ROUTE_ID4_TO_SELECT_AND_DESELECT
+ MediaRoute2Info routeToSelect = routes.get(ROUTE_ID4_TO_SELECT_AND_DESELECT);
+ assertNotNull(routeToSelect);
+
+ // This call should be ignored.
+ // The onControllerUpdated() shouldn't be called.
+ controller.selectRoute(routeToSelect);
+ assertFalse(onControllerUpdatedLatch.await(WAIT_MS, TimeUnit.MILLISECONDS));
+
+ // onStop should be called.
+ assertTrue(onStopLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(controllers);
+ mSystemRouter2ForCts.unregisterControllerCallback(controllerCallback);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+ }
+
+ @Test
+ public void testRoutingControllerSelectAndDeselectRoute() throws Exception {
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info routeToBegin = routes.get(ROUTE_ID1);
+ assertNotNull(routeToBegin);
+
+ final CountDownLatch onTransferLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatchForSelect = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatchForDeselect = new CountDownLatch(1);
+ final List<RoutingController> controllers = new ArrayList<>();
+
+ // Create session with ROUTE_ID1
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ assertEquals(mSystemRouter2ForCts.getSystemController(), oldController);
+ assertTrue(createRouteMap(newController.getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+ controllers.add(newController);
+ onTransferLatch.countDown();
+ }
+ };
+
+ ControllerCallback controllerCallback = new ControllerCallback() {
+ @Override
+ public void onControllerUpdated(RoutingController controller) {
+ if (onTransferLatch.getCount() != 0
+ || !TextUtils.equals(controllers.get(0).getId(), controller.getId())) {
+ return;
+ }
+
+ if (onControllerUpdatedLatchForSelect.getCount() != 0) {
+ assertEquals(2, controller.getSelectedRoutes().size());
+ assertTrue(createRouteMap(controller.getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+ assertTrue(createRouteMap(controller.getSelectedRoutes())
+ .containsKey(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+ assertFalse(createRouteMap(controller.getSelectableRoutes())
+ .containsKey(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+ assertTrue(createRouteMap(controller.getDeselectableRoutes())
+ .containsKey(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+
+ controllers.add(controller);
+ onControllerUpdatedLatchForSelect.countDown();
+ } else {
+ assertEquals(1, controller.getSelectedRoutes().size());
+ assertTrue(createRouteMap(controller.getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+ assertFalse(createRouteMap(controller.getSelectedRoutes())
+ .containsKey(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+ assertTrue(createRouteMap(controller.getSelectableRoutes())
+ .containsKey(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+ assertFalse(createRouteMap(controller.getDeselectableRoutes())
+ .containsKey(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+
+ onControllerUpdatedLatchForDeselect.countDown();
+ }
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.registerControllerCallback(mExecutor, controllerCallback);
+ mSystemRouter2ForCts.transferTo(routeToBegin);
+ assertTrue(onTransferLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ assertEquals(1, controllers.size());
+ RoutingController controller = controllers.get(0);
+ assertTrue(createRouteMap(controller.getSelectableRoutes())
+ .containsKey(ROUTE_ID4_TO_SELECT_AND_DESELECT));
+
+ // Select ROUTE_ID4_TO_SELECT_AND_DESELECT
+ MediaRoute2Info routeToSelectAndDeselect = routes.get(
+ ROUTE_ID4_TO_SELECT_AND_DESELECT);
+ assertNotNull(routeToSelectAndDeselect);
+
+ controller.selectRoute(routeToSelectAndDeselect);
+ assertTrue(onControllerUpdatedLatchForSelect.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ // Note that the updated controller is a different instance.
+ assertEquals(2, controllers.size());
+ assertEquals(controllers.get(0).getId(), controllers.get(1).getId());
+ RoutingController updatedController = controllers.get(1);
+ updatedController.deselectRoute(routeToSelectAndDeselect);
+ assertTrue(onControllerUpdatedLatchForDeselect.await(
+ TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(controllers);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ mSystemRouter2ForCts.unregisterControllerCallback(controllerCallback);
+ }
+ }
+
+ @Test
+ public void testRoutingControllerTransferToRoute() throws Exception {
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info routeToBegin = routes.get(ROUTE_ID1);
+ assertNotNull(routeToBegin);
+
+ final CountDownLatch onTransferLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatch = new CountDownLatch(1);
+ final List<RoutingController> controllers = new ArrayList<>();
+
+ // Create session with ROUTE_ID1
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ assertEquals(mSystemRouter2ForCts.getSystemController(), oldController);
+ assertTrue(createRouteMap(newController.getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+ controllers.add(newController);
+ onTransferLatch.countDown();
+ }
+ };
+
+ ControllerCallback controllerCallback = new ControllerCallback() {
+ @Override
+ public void onControllerUpdated(RoutingController controller) {
+ if (onTransferLatch.getCount() != 0
+ || !TextUtils.equals(controllers.get(0).getId(), controller.getId())) {
+ return;
+ }
+ assertEquals(1, controller.getSelectedRoutes().size());
+ assertFalse(createRouteMap(controller.getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+ assertTrue(createRouteMap(controller.getSelectedRoutes())
+ .containsKey(ROUTE_ID5_TO_TRANSFER_TO));
+ onControllerUpdatedLatch.countDown();
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.registerControllerCallback(mExecutor, controllerCallback);
+ mSystemRouter2ForCts.transferTo(routeToBegin);
+ assertTrue(onTransferLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ assertEquals(1, controllers.size());
+ RoutingController controller = controllers.get(0);
+
+ // Transfer to ROUTE_ID5_TO_TRANSFER_TO
+ MediaRoute2Info routeToTransferTo = routes.get(ROUTE_ID5_TO_TRANSFER_TO);
+ assertNotNull(routeToTransferTo);
+
+ mSystemRouter2ForCts.transferTo(routeToTransferTo);
+ assertTrue(onControllerUpdatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(controllers);
+ mSystemRouter2ForCts.unregisterControllerCallback(controllerCallback);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+ }
+
+ @Test
+ public void testRoutingControllerSetSessionVolume() throws Exception {
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info route = routes.get(ROUTE_ID1);
+ assertNotNull(route);
+
+ CountDownLatch successLatch = new CountDownLatch(1);
+ CountDownLatch volumeChangedLatch = new CountDownLatch(1);
+
+ List<RoutingController> controllers = new ArrayList<>();
+
+ // Create session with this route
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ controllers.add(newController);
+ successLatch.countDown();
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.transferTo(route);
+
+ assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+
+ assertEquals(1, controllers.size());
+
+ // test setSessionVolume
+ RoutingController targetController = controllers.get(0);
+ assertEquals(PLAYBACK_VOLUME_VARIABLE, targetController.getVolumeHandling());
+ int currentVolume = targetController.getVolume();
+ int maxVolume = targetController.getVolumeMax();
+ int targetVolume = (currentVolume == maxVolume) ? currentVolume - 1 : (currentVolume + 1);
+
+ ControllerCallback controllerCallback = new ControllerCallback() {
+ @Override
+ public void onControllerUpdated(MediaRouter2.RoutingController controller) {
+ if (!TextUtils.equals(targetController.getId(), controller.getId())) {
+ return;
+ }
+ if (controller.getVolume() == targetVolume) {
+ volumeChangedLatch.countDown();
+ }
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerControllerCallback(mExecutor, controllerCallback);
+ targetController.setVolume(targetVolume);
+ assertTrue(volumeChangedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(controllers);
+ mSystemRouter2ForCts.unregisterControllerCallback(controllerCallback);
+ }
+ }
+
+ @Test
+ public void testRoutingControllerRelease() throws Exception {
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutes(FEATURE_SAMPLE);
+ MediaRoute2Info route = routes.get(ROUTE_ID1);
+ assertNotNull(route);
+
+ final CountDownLatch onTransferLatch = new CountDownLatch(1);
+ final CountDownLatch onControllerUpdatedLatch = new CountDownLatch(1);
+ final CountDownLatch onStopLatch = new CountDownLatch(1);
+ final List<RoutingController> controllers = new ArrayList<>();
+
+ TransferCallback transferCallback = new TransferCallback() {
+ @Override
+ public void onTransfer(RoutingController oldController,
+ RoutingController newController) {
+ assertEquals(mSystemRouter2ForCts.getSystemController(), oldController);
+ assertTrue(createRouteMap(newController.getSelectedRoutes())
+ .containsKey(ROUTE_ID1));
+ controllers.add(newController);
+ onTransferLatch.countDown();
+ }
+ @Override
+ public void onStop(RoutingController controller) {
+ if (onTransferLatch.getCount() != 0
+ || !TextUtils.equals(controllers.get(0).getId(), controller.getId())) {
+ return;
+ }
+ onStopLatch.countDown();
+ }
+ };
+
+ ControllerCallback controllerCallback = new ControllerCallback() {
+ @Override
+ public void onControllerUpdated(RoutingController controller) {
+ if (onTransferLatch.getCount() != 0
+ || !TextUtils.equals(controllers.get(0).getId(), controller.getId())) {
+ return;
+ }
+ onControllerUpdatedLatch.countDown();
+ }
+ };
+
+ try {
+ mSystemRouter2ForCts.registerTransferCallback(mExecutor, transferCallback);
+ mSystemRouter2ForCts.registerControllerCallback(mExecutor, controllerCallback);
+ mSystemRouter2ForCts.transferTo(route);
+ assertTrue(onTransferLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ assertEquals(1, controllers.size());
+ RoutingController controller = controllers.get(0);
+
+ // Release controller. Future calls should be ignored.
+ controller.release();
+
+ // Select ROUTE_ID5_TO_TRANSFER_TO
+ MediaRoute2Info routeToSelect = routes.get(ROUTE_ID4_TO_SELECT_AND_DESELECT);
+ assertNotNull(routeToSelect);
+
+ // This call should be ignored.
+ // The onControllerUpdated() shouldn't be called.
+ controller.selectRoute(routeToSelect);
+ assertFalse(onControllerUpdatedLatch.await(WAIT_MS, TimeUnit.MILLISECONDS));
+
+ // onStop should be called.
+ assertTrue(onStopLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ } finally {
+ releaseControllers(controllers);
+ mSystemRouter2ForCts.unregisterControllerCallback(controllerCallback);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+ }
+
+ private Map<String, MediaRoute2Info> waitAndGetRoutes(String feature) throws Exception {
+ List<String> features = new ArrayList<>();
+ features.add(feature);
+
+ mAppRouter2.registerRouteCallback(mExecutor, mAppRouterPlaceHolderCallback,
+ new RouteDiscoveryPreference.Builder(features, true).build());
+
+ CountDownLatch latch = new CountDownLatch(1);
+ RouteCallback routeCallback = new RouteCallback() {
+ @Override
+ public void onRoutesAdded(List<MediaRoute2Info> routes) {
+ for (MediaRoute2Info route : routes) {
+ if (route.getFeatures().contains(feature)) {
+ latch.countDown();
+ break;
+ }
+ }
+ }
+ };
+
+ mSystemRouter2ForCts.registerRouteCallback(mExecutor, routeCallback,
+ RouteDiscoveryPreference.EMPTY);
+
+ try {
+ // Note: The routes can be added before registering the callback,
+ // therefore no assertTrue() here.
+ latch.await(WAIT_MS, TimeUnit.MILLISECONDS);
+ return createRouteMap(mSystemRouter2ForCts.getRoutes());
+ } finally {
+ mSystemRouter2ForCts.unregisterRouteCallback(routeCallback);
+ }
+ }
+
+ // Helper for getting routes easily. Uses original ID as a key
+ private static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) {
+ Map<String, MediaRoute2Info> routeMap = new HashMap<>();
+ for (MediaRoute2Info route : routes) {
+ routeMap.put(route.getOriginalId(), route);
+ }
+ return routeMap;
+ }
+
+ private void releaseAllSessions() {
+ MediaRouter2Manager manager = MediaRouter2Manager.getInstance(mContext);
+ for (RoutingSessionInfo session : manager.getActiveSessions()) {
+ manager.releaseSession(session);
+ }
+ }
+
+ private void clearCallbacks() {
+ for (RouteCallback routeCallback : mRouteCallbacks) {
+ mAppRouter2.unregisterRouteCallback(routeCallback);
+ mSystemRouter2ForCts.unregisterRouteCallback(routeCallback);
+ }
+ mRouteCallbacks.clear();
+
+ for (TransferCallback transferCallback : mTransferCallbacks) {
+ mAppRouter2.unregisterTransferCallback(transferCallback);
+ mSystemRouter2ForCts.unregisterTransferCallback(transferCallback);
+ }
+ mTransferCallbacks.clear();
+ }
+
+ static void releaseControllers(List<RoutingController> controllers) {
+ for (RoutingController controller : controllers) {
+ controller.release();
+ }
+ }
+}
diff --git a/tests/tests/mediaparser/AndroidManifest.xml b/tests/tests/mediaparser/AndroidManifest.xml
index e3a26e0..f0f6d97 100644
--- a/tests/tests/mediaparser/AndroidManifest.xml
+++ b/tests/tests/mediaparser/AndroidManifest.xml
@@ -19,6 +19,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.media.mediaparser.cts">
+ <uses-sdk android:minSdkVersion="29"
+ android:targetSdkVersion="29"/>
<application>
<uses-library android:name="android.test.runner" />
</application>
diff --git a/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodeManagerTest.java b/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodeManagerTest.java
index 6e31c44..8225e0c 100644
--- a/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodeManagerTest.java
+++ b/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodeManagerTest.java
@@ -28,6 +28,7 @@
import android.media.MediaTranscodeManager;
import android.media.MediaTranscodeManager.TranscodingRequest;
import android.media.MediaTranscodeManager.TranscodingSession;
+import android.media.MediaTranscodeManager.VideoTranscodingRequest;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
@@ -178,13 +179,9 @@
return;
}
assertThrows(IllegalArgumentException.class, () -> {
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(mSourceHEVCVideoUri)
- .setDestinationUri(null)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
- .setVideoTrackFormat(createMediaFormat())
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(mSourceHEVCVideoUri, null,
+ createMediaFormat())
.build();
});
}
@@ -197,14 +194,10 @@
return;
}
assertThrows(IllegalArgumentException.class, () -> {
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(mSourceHEVCVideoUri)
- .setDestinationUri(mDestinationUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(mSourceHEVCVideoUri, mDestinationUri,
+ createMediaFormat())
.setClientPid(-1)
- .setVideoTrackFormat(createMediaFormat())
.build();
});
}
@@ -217,14 +210,10 @@
return;
}
assertThrows(IllegalArgumentException.class, () -> {
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(mSourceHEVCVideoUri)
- .setDestinationUri(mDestinationUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(mSourceHEVCVideoUri, mDestinationUri,
+ createMediaFormat())
.setClientUid(-1)
- .setVideoTrackFormat(createMediaFormat())
.build();
});
}
@@ -237,12 +226,8 @@
return;
}
assertThrows(IllegalArgumentException.class, () -> {
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(null)
- .setDestinationUri(mDestinationUri)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(null, mDestinationUri, createMediaFormat())
.build();
});
}
@@ -254,13 +239,9 @@
if (shouldSkip()) {
return;
}
- assertThrows(UnsupportedOperationException.class, () -> {
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setDestinationUri(mDestinationUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
- .setVideoTrackFormat(createMediaFormat())
+ assertThrows(IllegalArgumentException.class, () -> {
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(null, mDestinationUri, createMediaFormat())
.build();
});
}
@@ -272,13 +253,10 @@
if (shouldSkip()) {
return;
}
- assertThrows(UnsupportedOperationException.class, () -> {
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(mSourceHEVCVideoUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
- .setVideoTrackFormat(createMediaFormat())
+ assertThrows(IllegalArgumentException.class, () -> {
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(mSourceHEVCVideoUri, null,
+ createMediaFormat())
.build();
});
}
@@ -291,13 +269,9 @@
if (shouldSkip()) {
return;
}
- assertThrows(UnsupportedOperationException.class, () -> {
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(mSourceHEVCVideoUri)
- .setDestinationUri(mDestinationUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
+ assertThrows(IllegalArgumentException.class, () -> {
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(mSourceHEVCVideoUri, mDestinationUri, null)
.build();
});
}
@@ -309,13 +283,8 @@
}
Semaphore transcodeCompleteSemaphore = new Semaphore(0);
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(srcUri)
- .setDestinationUri(dstUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
- .setVideoTrackFormat(createMediaFormat())
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(srcUri, dstUri, createMediaFormat())
.build();
Executor listenerExecutor = Executors.newSingleThreadExecutor();
@@ -480,11 +449,10 @@
ApplicationMediaCapabilities clientCaps =
new ApplicationMediaCapabilities.Builder().build();
- TranscodingRequest.MediaFormatResolver
- resolver = new TranscodingRequest.MediaFormatResolver()
- .setSourceVideoFormatHint(MediaFormat.createVideoFormat(
- MediaFormat.MIMETYPE_VIDEO_HEVC, WIDTH, HEIGHT))
- .setClientCapabilities(clientCaps);
+ TranscodingRequest.VideoFormatResolver
+ resolver = new TranscodingRequest.VideoFormatResolver(clientCaps,
+ MediaFormat.createVideoFormat(
+ MediaFormat.MIMETYPE_VIDEO_HEVC, WIDTH, HEIGHT));
assertTrue(resolver.shouldTranscode());
MediaFormat videoTrackFormat = resolver.resolveVideoFormat();
assertNotNull(videoTrackFormat);
@@ -492,15 +460,10 @@
int pid = android.os.Process.myPid();
int uid = android.os.Process.myUid();
- TranscodingRequest.Builder builder =
- new TranscodingRequest.Builder()
- .setSourceUri(fileUri)
- .setDestinationUri(destinationUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
+ VideoTranscodingRequest.Builder builder =
+ new VideoTranscodingRequest.Builder(fileUri, destinationUri, videoTrackFormat)
.setClientPid(pid)
- .setClientUid(uid)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
- .setVideoTrackFormat(videoTrackFormat);
+ .setClientUid(uid);
if (testFileDescriptor) {
// Open source Uri.
@@ -574,13 +537,9 @@
Uri destinationUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
+ mContext.getCacheDir().getAbsolutePath() + "/HevcTranscode.mp4");
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(mSourceHEVCVideoUri)
- .setDestinationUri(destinationUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
- .setVideoTrackFormat(createMediaFormat())
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(mSourceHEVCVideoUri, destinationUri,
+ createMediaFormat())
.build();
Executor listenerExecutor = Executors.newSingleThreadExecutor();
@@ -663,13 +622,9 @@
Uri destinationUri = Uri.parse(ContentResolver.SCHEME_FILE + "://"
+ mContext.getCacheDir().getAbsolutePath() + "/HevcTranscode.mp4");
- TranscodingRequest request =
- new TranscodingRequest.Builder()
- .setSourceUri(mSourceHEVCVideoUri)
- .setDestinationUri(destinationUri)
- .setType(MediaTranscodeManager.TRANSCODING_TYPE_VIDEO)
- .setPriority(MediaTranscodeManager.PRIORITY_REALTIME)
- .setVideoTrackFormat(createMediaFormat())
+ VideoTranscodingRequest request =
+ new VideoTranscodingRequest.Builder(mSourceHEVCVideoUri, destinationUri,
+ createMediaFormat())
.build();
Executor listenerExecutor = Executors.newSingleThreadExecutor();
diff --git a/tests/tests/nativehardware/OWNERS b/tests/tests/nativehardware/OWNERS
index 094065b..c4777f0 100644
--- a/tests/tests/nativehardware/OWNERS
+++ b/tests/tests/nativehardware/OWNERS
@@ -3,4 +3,3 @@
jreck@google.com
krzysio@google.com
lpy@google.com
-zzyiwei@google.com
diff --git a/tests/tests/nativemedia/aaudio/Android.mk b/tests/tests/nativemedia/aaudio/Android.mk
index ed3814d..e2c5569 100644
--- a/tests/tests/nativemedia/aaudio/Android.mk
+++ b/tests/tests/nativemedia/aaudio/Android.mk
@@ -33,6 +33,8 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+
LOCAL_SDK_VERSION := current
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/nativemedia/aaudio/AndroidManifest.xml b/tests/tests/nativemedia/aaudio/AndroidManifest.xml
index d8c422a..83d44aa 100644
--- a/tests/tests/nativemedia/aaudio/AndroidManifest.xml
+++ b/tests/tests/nativemedia/aaudio/AndroidManifest.xml
@@ -17,6 +17,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.nativemedia.aaudio">
+ <attribution android:tag="validTag" android:label="@string/attributionTag" />
+
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application>
diff --git a/tests/tests/nativemedia/aaudio/jni/test_aaudio_attributes.cpp b/tests/tests/nativemedia/aaudio/jni/test_aaudio_attributes.cpp
index 4d9194f..c3a1fa7 100644
--- a/tests/tests/nativemedia/aaudio/jni/test_aaudio_attributes.cpp
+++ b/tests/tests/nativemedia/aaudio/jni/test_aaudio_attributes.cpp
@@ -29,6 +29,7 @@
constexpr int kChannelCount = 2;
constexpr int32_t DONT_SET = -1000;
+constexpr const char *DONT_SET_STR = "don't set";
static void checkAttributes(aaudio_performance_mode_t perfMode,
aaudio_usage_t usage,
@@ -36,7 +37,9 @@
aaudio_input_preset_t preset = DONT_SET,
aaudio_allowed_capture_policy_t capturePolicy = DONT_SET,
int privacyMode = DONT_SET,
- aaudio_direction_t direction = AAUDIO_DIRECTION_OUTPUT) {
+ aaudio_direction_t direction = AAUDIO_DIRECTION_OUTPUT,
+ const char *packageName = DONT_SET_STR,
+ const char *attributionTag = DONT_SET_STR) {
if (direction == AAUDIO_DIRECTION_INPUT
&& !deviceSupportsFeature(FEATURE_RECORDING)) return;
else if (direction == AAUDIO_DIRECTION_OUTPUT
@@ -70,6 +73,12 @@
if (privacyMode != DONT_SET) {
AAudioStreamBuilder_setPrivacySensitive(aaudioBuilder, (bool)privacyMode);
}
+ if (packageName != DONT_SET_STR) {
+ AAudioStreamBuilder_setPackageName(aaudioBuilder, packageName);
+ }
+ if (attributionTag != DONT_SET_STR) {
+ AAudioStreamBuilder_setAttributionTag(aaudioBuilder, attributionTag);
+ }
// Create an AAudioStream using the Builder.
ASSERT_EQ(AAUDIO_OK, AAudioStreamBuilder_openStream(aaudioBuilder, &aaudioStream));
@@ -181,6 +190,17 @@
true,
};
+static const char *sPackageNames[] = {
+ DONT_SET_STR,
+ "android.nativemedia.aaudio",
+};
+
+static const char *sAttributionTags[] = {
+ DONT_SET_STR,
+ "validTag",
+ NULL,
+};
+
static void checkAttributesUsage(aaudio_performance_mode_t perfMode) {
for (aaudio_usage_t usage : sUsages) {
// There can be a race condition when switching between devices,
@@ -231,6 +251,45 @@
}
}
+TEST(test_attributes, package_name) {
+ for (const char *packageName : sPackageNames) {
+ checkAttributes(AAUDIO_PERFORMANCE_MODE_NONE,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ AAUDIO_DIRECTION_INPUT,
+ packageName);
+ }
+}
+
+TEST(test_attributes_low_latency, package_name) {
+ for (const char *packageName : sPackageNames) {
+ checkAttributes(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ AAUDIO_DIRECTION_INPUT,
+ packageName);
+ }
+}
+
+TEST(test_attributes, attribution_tag) {
+ for (const char *attributionTag : sAttributionTags) {
+ checkAttributes(AAUDIO_PERFORMANCE_MODE_NONE,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ DONT_SET,
+ AAUDIO_DIRECTION_INPUT,
+ DONT_SET_STR,
+ attributionTag);
+ }
+}
TEST(test_attributes, aaudio_usage_perfnone) {
checkAttributesUsage(AAUDIO_PERFORMANCE_MODE_NONE);
diff --git a/tests/tests/nativemedia/aaudio/res/values/strings.xml b/tests/tests/nativemedia/aaudio/res/values/strings.xml
new file mode 100644
index 0000000..c07cdf2
--- /dev/null
+++ b/tests/tests/nativemedia/aaudio/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 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.
+ -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="attributionTag">A tag</string>
+</resources>
+
diff --git a/tests/tests/nativemedia/resourceobserver/Android.bp b/tests/tests/nativemedia/resourceobserver/Android.bp
new file mode 100644
index 0000000..d4d77b0
--- /dev/null
+++ b/tests/tests/nativemedia/resourceobserver/Android.bp
@@ -0,0 +1,45 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+cc_test {
+ name: "ResourceObserverNativeTest",
+
+ compile_multilib: "both",
+ multilib: {
+ lib32: {
+ suffix: "32",
+ },
+ lib64: {
+ suffix: "64",
+ },
+ },
+
+ srcs: ["src/ResourceObserverNativeTest.cpp"],
+
+ shared_libs: [
+ "libbinder_ndk",
+ "liblog",
+ "libmediandk",
+ ],
+
+ static_libs: [
+ "libbase_ndk",
+ "libgtest",
+ "resourceobserver_aidl_interface-V1-ndk",
+ ],
+ whole_static_libs: [
+ "libnativetesthelper_jni"
+ ],
+
+ // Tag this module as a cts test artifact
+ test_suites: [
+ "cts",
+ "general-tests",
+ ],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ ],
+}
diff --git a/tests/tests/nativemedia/resourceobserver/AndroidTest.xml b/tests/tests/nativemedia/resourceobserver/AndroidTest.xml
new file mode 100644
index 0000000..1f1b6bd
--- /dev/null
+++ b/tests/tests/nativemedia/resourceobserver/AndroidTest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<configuration description="Config for CTS ResourceObserver test cases">
+ <option name="test-suite-tag" value="cts" />
+ <option name="config-descriptor:metadata" key="component" value="media" />
+ <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+ <option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
+ <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+ <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
+ <option name="cleanup" value="true" />
+ <option name="push" value="ResourceObserverNativeTest->/data/local/tmp/ResourceObserverNativeTest" />
+ <option name="append-bitness" value="true" />
+ </target_preparer>
+ <test class="com.android.tradefed.testtype.GTest" >
+ <option name="native-test-device-path" value="/data/local/tmp" />
+ <option name="module-name" value="ResourceObserverNativeTest" />
+ <option name="runtime-hint" value="1m" />
+ </test>
+ <!-- Controller that will skip the module if a native bridge situation is detected -->
+ <!-- For example: module wants to run arm and device is x86 -->
+ <object type="module_controller" class="com.android.tradefed.testtype.suite.module.NativeBridgeModuleController" />
+</configuration>
diff --git a/tests/tests/nativemedia/resourceobserver/OWNERS b/tests/tests/nativemedia/resourceobserver/OWNERS
new file mode 100644
index 0000000..5679184
--- /dev/null
+++ b/tests/tests/nativemedia/resourceobserver/OWNERS
@@ -0,0 +1,4 @@
+# Bug component: 1344
+chz@google.com
+wonsik@google.com
+lajos@google.com
diff --git a/tests/tests/nativemedia/resourceobserver/src/ResourceObserverNativeTest.cpp b/tests/tests/nativemedia/resourceobserver/src/ResourceObserverNativeTest.cpp
new file mode 100644
index 0000000..1bdffad
--- /dev/null
+++ b/tests/tests/nativemedia/resourceobserver/src/ResourceObserverNativeTest.cpp
@@ -0,0 +1,207 @@
+/*
+ * 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.
+ */
+
+// #define LOG_NDEBUG 0
+#define LOG_TAG "ResourceObserverNativeTest"
+
+#include <aidl/android/media/BnResourceObserver.h>
+#include <aidl/android/media/IResourceObserverService.h>
+#include <android-base/logging.h>
+#include <android/binder_ibinder.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <gtest/gtest.h>
+
+#include "media/NdkMediaCodec.h"
+
+using namespace android;
+using Status = ::ndk::ScopedAStatus;
+using ::aidl::android::media::BnResourceObserver;
+using ::aidl::android::media::IResourceObserverService;
+using ::aidl::android::media::MediaObservableEvent;
+using ::aidl::android::media::MediaObservableFilter;
+using ::aidl::android::media::MediaObservableParcel;
+using ::aidl::android::media::MediaObservableType;
+
+static const char* MIMETYPE_AVC = "video/avc";
+
+static std::string toString(const MediaObservableParcel& observable) {
+ return "{" + ::aidl::android::media::toString(observable.type) + ", " +
+ std::to_string(observable.value) + "}";
+}
+
+class ResourceObserverNativeTest : public ::testing::Test {
+public:
+ void SetUp() override { ABinderProcess_startThreadPool(); }
+ void TearDown() override {}
+
+ struct StatusChangeEvent {
+ MediaObservableEvent event;
+ int32_t uid;
+ int32_t pid;
+ std::vector<MediaObservableParcel> observables;
+ };
+ struct ResourceObserver : public BnResourceObserver {
+ explicit ResourceObserver() {}
+
+ // IResourceObserver
+ ::ndk::ScopedAStatus onStatusChanged(
+ MediaObservableEvent event, int32_t uid, int32_t pid,
+ const std::vector<MediaObservableParcel>& observables) override {
+ LOG(INFO) << ::aidl::android::media::toString(event) << ", uid: " << uid
+ << ", pid: " << pid << ", " << toString(observables[0]).c_str();
+
+ std::scoped_lock lock{mLock};
+ mLastEvent.event = event;
+ mLastEvent.uid = uid;
+ mLastEvent.pid = pid;
+ mLastEvent.observables = observables;
+ mStatusChangeCalled = true;
+ mCondition.notify_one();
+ return ::ndk::ScopedAStatus::ok();
+ }
+ // ~IResourceObserver
+
+ bool waitForEvent(StatusChangeEvent& event, int64_t timeoutUs = 0) {
+ std::unique_lock lock{mLock};
+ if (!mStatusChangeCalled && timeoutUs > 0) {
+ mCondition.wait_for(lock, std::chrono::microseconds(timeoutUs));
+ }
+ if (!mStatusChangeCalled) {
+ return false;
+ }
+ event = mLastEvent;
+ mStatusChangeCalled = false;
+ return true;
+ }
+ std::mutex mLock;
+ std::condition_variable mCondition;
+ bool mStatusChangeCalled = false;
+ StatusChangeEvent mLastEvent;
+ };
+
+ void testResourceObserver(MediaObservableEvent eventType) {
+ ::ndk::SpAIBinder binder(AServiceManager_getService("media.resource_observer"));
+ std::shared_ptr<IResourceObserverService> service =
+ IResourceObserverService::fromBinder(binder);
+
+ EXPECT_NE(service, nullptr);
+
+ std::shared_ptr<ResourceObserver> observer = ::ndk::SharedRefBase::make<ResourceObserver>();
+ std::vector<MediaObservableFilter> filters = {{MediaObservableType::kVideoSecureCodec,
+ eventType},
+ {MediaObservableType::kVideoNonSecureCodec,
+ eventType}};
+
+ Status status = service->registerObserver(observer, filters);
+ EXPECT_TRUE(status.isOk());
+
+ AMediaCodec* dec = AMediaCodec_createDecoderByType(MIMETYPE_AVC);
+
+ // We only test this if the AVC non-secure decoder can be created.
+ if (dec != nullptr) {
+ StatusChangeEvent event;
+ if ((uint64_t)eventType & (uint64_t)MediaObservableEvent::kBusy) {
+ EXPECT_TRUE(observer->waitForEvent(event, 100000));
+ verifyEvent(event, MediaObservableEvent::kBusy,
+ MediaObservableType::kVideoNonSecureCodec);
+ } else {
+ // Should not receive any event, wait 1 second to confirm.
+ EXPECT_FALSE(observer->waitForEvent(event, 1000000));
+ }
+
+ AMediaCodec_delete(dec);
+
+ if ((uint64_t)eventType & (uint64_t)MediaObservableEvent::kIdle) {
+ EXPECT_TRUE(observer->waitForEvent(event, 100000));
+ verifyEvent(event, MediaObservableEvent::kIdle,
+ MediaObservableType::kVideoNonSecureCodec);
+ } else {
+ // Should not receive any event, wait 1 second to confirm.
+ EXPECT_FALSE(observer->waitForEvent(event, 1000000));
+ }
+ }
+
+ status = service->unregisterObserver(observer);
+ EXPECT_TRUE(status.isOk());
+ }
+
+ void verifyEvent(const StatusChangeEvent& event, MediaObservableEvent expectedEventType,
+ MediaObservableType expectedObservableType) {
+ EXPECT_EQ(event.event, expectedEventType);
+ EXPECT_EQ(event.pid, getpid());
+ EXPECT_EQ(event.uid, getuid());
+ EXPECT_EQ(event.observables.size(), 1);
+ EXPECT_EQ(event.observables[0].type, expectedObservableType);
+ EXPECT_EQ(event.observables[0].value, 1);
+ }
+};
+
+//-------------------------------------------------------------------------------------------------
+TEST_F(ResourceObserverNativeTest, testInvalidParameters) {
+ LOG(INFO) << "testInvalidParameters";
+
+ ::ndk::SpAIBinder binder(AServiceManager_getService("media.resource_observer"));
+ std::shared_ptr<IResourceObserverService> service =
+ IResourceObserverService::fromBinder(binder);
+
+ EXPECT_NE(service, nullptr);
+
+ std::shared_ptr<ResourceObserver> observer = ::ndk::SharedRefBase::make<ResourceObserver>();
+ std::vector<MediaObservableFilter> filters = {{MediaObservableType::kVideoSecureCodec,
+ MediaObservableEvent::kAll},
+ {MediaObservableType::kVideoNonSecureCodec,
+ MediaObservableEvent::kAll}};
+ std::vector<MediaObservableFilter> emptyFilters;
+
+ // Test register with null observer fails.
+ Status status = service->registerObserver(nullptr, filters);
+ EXPECT_FALSE(status.isOk());
+ EXPECT_EQ(status.getServiceSpecificError(), BAD_VALUE);
+
+ // Test register with empty filter list fails.
+ status = service->registerObserver(observer, emptyFilters);
+ EXPECT_FALSE(status.isOk());
+ EXPECT_EQ(status.getServiceSpecificError(), BAD_VALUE);
+
+ // Test register duplicate observer fails.
+ status = service->registerObserver(observer, filters);
+ EXPECT_TRUE(status.isOk());
+ status = service->registerObserver(observer, filters);
+ EXPECT_FALSE(status.isOk());
+ EXPECT_EQ(status.getServiceSpecificError(), ALREADY_EXISTS);
+
+ status = service->unregisterObserver(observer);
+ EXPECT_TRUE(status.isOk());
+}
+
+TEST_F(ResourceObserverNativeTest, testResourceObserverBusy) {
+ LOG(INFO) << "testResourceObserverBusy";
+
+ testResourceObserver(MediaObservableEvent::kBusy);
+}
+
+TEST_F(ResourceObserverNativeTest, testResourceObserverIdle) {
+ LOG(INFO) << "testResourceObserverIdle";
+
+ testResourceObserver(MediaObservableEvent::kIdle);
+}
+
+TEST_F(ResourceObserverNativeTest, testResourceObserverAll) {
+ LOG(INFO) << "testResourceObserverAll";
+
+ testResourceObserver(MediaObservableEvent::kAll);
+}
diff --git a/tests/tests/neuralnetworks/tflite_delegate/Android.mk b/tests/tests/neuralnetworks/tflite_delegate/Android.mk
index 39e6e4f..785f7bd 100644
--- a/tests/tests/neuralnetworks/tflite_delegate/Android.mk
+++ b/tests/tests/neuralnetworks/tflite_delegate/Android.mk
@@ -23,6 +23,7 @@
tensorflow/lite/delegates/nnapi/nnapi_delegate_test.cc \
tensorflow/lite/kernels/test_util.cc \
tensorflow/core/platform/default/logging.cc \
+ tensorflow/core/platform/default/env_time.cc \
tensorflow/lite/kernels/acceleration_test_util.cc \
tensorflow/lite/kernels/acceleration_test_util_internal.cc \
tensorflow/lite/delegates/nnapi/acceleration_test_list.cc \
@@ -31,6 +32,7 @@
LOCAL_C_INCLUDES += external/flatbuffers/include
LOCAL_C_INCLUDES += external/tensorflow
+LOCAL_C_INCLUDES += external/ruy
LOCAL_CFLAGS := \
-DPLATFORM_POSIX_ANDROID \
@@ -44,7 +46,7 @@
LOCAL_SHARED_LIBRARIES := libandroid liblog libneuralnetworks
LOCAL_STATIC_LIBRARIES := libgtest_ndk_c++ libgmock_ndk libtflite_static
-LOCAL_HEADER_LIBRARIES := libeigen gemmlowp_headers
+LOCAL_HEADER_LIBRARIES := libeigen gemmlowp_headers libtflite_schema_headers
LOCAL_SDK_VERSION := current
LOCAL_NDK_STL_VARIANT := c++_static
include $(BUILD_STATIC_LIBRARY)
diff --git a/tests/tests/notificationlegacy/notificationlegacy29/src/android/app/notification/legacy29/cts/NotificationAssistantServiceTest.java b/tests/tests/notificationlegacy/notificationlegacy29/src/android/app/notification/legacy29/cts/NotificationAssistantServiceTest.java
index e46b709..36d52e6 100644
--- a/tests/tests/notificationlegacy/notificationlegacy29/src/android/app/notification/legacy29/cts/NotificationAssistantServiceTest.java
+++ b/tests/tests/notificationlegacy/notificationlegacy29/src/android/app/notification/legacy29/cts/NotificationAssistantServiceTest.java
@@ -68,7 +68,7 @@
final String TAG = "NotAsstServiceTest";
final String NOTIFICATION_CHANNEL_ID = "NotificationAssistantServiceTest";
final int ICON_ID = android.R.drawable.sym_def_app_icon;
- final long SLEEP_TIME = 500; // milliseconds
+ final long SLEEP_TIME = 1000; // milliseconds
private TestNotificationAssistant mNotificationAssistantService;
private TestNotificationListener mNotificationListenerService;
diff --git a/tests/tests/os/AndroidManifest.xml b/tests/tests/os/AndroidManifest.xml
index 02db91c..fb3ad25 100644
--- a/tests/tests/os/AndroidManifest.xml
+++ b/tests/tests/os/AndroidManifest.xml
@@ -80,7 +80,14 @@
</intent-filter>
</activity>
- <activity android:name="android.os.cts.SimpleTestActivity"/>
+ <activity android:name="android.os.cts.SimpleTestActivity"
+ android:exported="false">
+ <intent-filter>
+ <action android:name="android.os.cts.BROWSABLE_INTENT_LAUNCH" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ </intent-filter>
+ </activity>
<activity android:name="android.os.cts.IntentLaunchActivity"
android:exported="false" />
diff --git a/tests/tests/os/CompanionTestApp/AndroidManifest.xml b/tests/tests/os/CompanionTestApp/AndroidManifest.xml
index eda1292..9cb2b99 100644
--- a/tests/tests/os/CompanionTestApp/AndroidManifest.xml
+++ b/tests/tests/os/CompanionTestApp/AndroidManifest.xml
@@ -26,6 +26,7 @@
<uses-permission android:name="android.permission.MANAGE_ONGOING_CALLS" />
<uses-permission android:name="android.permission.USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER" />
<uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />
+ <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_WATCH" />
<uses-feature android:name="android.software.companion_device_setup" />
diff --git a/tests/tests/os/src/android/os/cts/AppHibernationIntegrationTest.kt b/tests/tests/os/src/android/os/cts/AppHibernationIntegrationTest.kt
index cd4f7c8..074e76d 100644
--- a/tests/tests/os/src/android/os/cts/AppHibernationIntegrationTest.kt
+++ b/tests/tests/os/src/android/os/cts/AppHibernationIntegrationTest.kt
@@ -16,10 +16,14 @@
package android.os.cts
+import android.app.Instrumentation
import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION
+import android.support.test.uiautomator.By
+import android.support.test.uiautomator.BySelector
+import android.support.test.uiautomator.UiObject2
import androidx.test.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
import com.android.compatibility.common.util.SystemUtil.runShellCommandOrThrow
@@ -43,6 +47,7 @@
const val WAIT_TIME_MS = 1000L
}
private val context: Context = InstrumentationRegistry.getTargetContext()
+ private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
private lateinit var packageManager: PackageManager
@@ -83,8 +88,16 @@
packageManager.getApplicationInfo(APK_PACKAGE_NAME_S_APP, 0 /* flags */)
val stopped = ((ai.flags and ApplicationInfo.FLAG_STOPPED) != 0)
assertTrue(stopped)
+ runShellCommandOrThrow("cmd statusbar expand-notifications")
+ waitFindObject(By.textContains("unused app"))
+ .click()
+ waitFindObject(By.text(APK_PACKAGE_NAME_S_APP))
}
}
}
}
+
+ private fun waitFindObject(selector: BySelector): UiObject2 {
+ return waitFindObject(instrumentation.uiAutomation, selector)
+ }
}
diff --git a/tests/tests/os/src/android/os/cts/AppHibernationUtils.kt b/tests/tests/os/src/android/os/cts/AppHibernationUtils.kt
index d3b9fed..091211f 100644
--- a/tests/tests/os/src/android/os/cts/AppHibernationUtils.kt
+++ b/tests/tests/os/src/android/os/cts/AppHibernationUtils.kt
@@ -19,10 +19,13 @@
import android.app.ActivityManager
import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_TOP_SLEEPING
import android.app.Instrumentation
+import android.app.UiAutomation
import android.content.Context
import android.os.ParcelFileDescriptor
import android.os.Process
import android.provider.DeviceConfig
+import android.support.test.uiautomator.BySelector
+import android.support.test.uiautomator.UiObject2
import androidx.test.InstrumentationRegistry
import com.android.compatibility.common.util.LogcatInspector
import com.android.compatibility.common.util.SystemUtil.eventually
@@ -30,6 +33,10 @@
import com.android.compatibility.common.util.SystemUtil.runShellCommandOrThrow
import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
import com.android.compatibility.common.util.ThrowingSupplier
+import com.android.compatibility.common.util.UiAutomatorUtils
+import com.android.compatibility.common.util.click
+import com.android.compatibility.common.util.depthFirstSearch
+import com.android.compatibility.common.util.textAsString
import org.hamcrest.CoreMatchers
import org.hamcrest.Matcher
import org.hamcrest.Matchers
@@ -117,6 +124,30 @@
waitForIdle()
}
+fun waitFindObject(uiAutomation: UiAutomation, selector: BySelector): UiObject2 {
+ try {
+ return UiAutomatorUtils.waitFindObject(selector)
+ } catch (e: RuntimeException) {
+ val ui = uiAutomation.rootInActiveWindow
+
+ val title = ui.depthFirstSearch { node ->
+ node.viewIdResourceName?.contains("alertTitle") == true
+ }
+ val okButton = ui.depthFirstSearch { node ->
+ node.textAsString?.equals("OK", ignoreCase = true) ?: false
+ }
+
+ if (title?.text?.toString() == "Android System" && okButton != null) {
+ // Auto dismiss occasional system dialogs to prevent interfering with the test
+ android.util.Log.w(AutoRevokeTest.LOG_TAG, "Ignoring exception", e)
+ okButton.click()
+ return UiAutomatorUtils.waitFindObject(selector)
+ } else {
+ throw e
+ }
+ }
+}
+
class Logcat() : LogcatInspector() {
override fun executeShellCommand(command: String?): InputStream {
val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
diff --git a/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt b/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
index c2ffcd0..faf698d 100644
--- a/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
+++ b/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
@@ -43,7 +43,6 @@
import com.android.compatibility.common.util.SystemUtil.runShellCommandOrThrow
import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
import com.android.compatibility.common.util.UI_ROOT
-import com.android.compatibility.common.util.UiAutomatorUtils
import com.android.compatibility.common.util.click
import com.android.compatibility.common.util.depthFirstSearch
import com.android.compatibility.common.util.lowestCommonAncestor
@@ -385,27 +384,7 @@
}
private fun waitFindObject(selector: BySelector): UiObject2 {
- try {
- return UiAutomatorUtils.waitFindObject(selector)
- } catch (e: RuntimeException) {
- val ui = instrumentation.uiAutomation.rootInActiveWindow
-
- val title = ui.depthFirstSearch { node ->
- node.viewIdResourceName?.contains("alertTitle") == true
- }
- val okButton = ui.depthFirstSearch { node ->
- node.textAsString?.equals("OK", ignoreCase = true) ?: false
- }
-
- if (title?.text?.toString() == "Android System" && okButton != null) {
- // Auto dismiss occasional system dialogs to prevent interfering with the test
- android.util.Log.w(LOG_TAG, "Ignoring exception", e)
- okButton.click()
- return UiAutomatorUtils.waitFindObject(selector)
- } else {
- throw e
- }
- }
+ return waitFindObject(instrumentation.uiAutomation, selector)
}
}
@@ -431,13 +410,21 @@
/**
* For some reason waitFindObject sometimes fails to find UI that is present in the view hierarchy
*/
-fun waitFindNode(matcher: Matcher<AccessibilityNodeInfo>): AccessibilityNodeInfo {
+fun waitFindNode(
+ matcher: Matcher<AccessibilityNodeInfo>,
+ failMsg: String? = null
+): AccessibilityNodeInfo {
return getEventually {
val ui = UI_ROOT
ui.depthFirstSearch { node ->
matcher.matches(node)
}.assertNotNull {
- "No view found matching $matcher:\n\n${uiDump(ui)}"
+ buildString {
+ if (failMsg != null) {
+ appendLine(failMsg)
+ }
+ appendLine("No view found matching $matcher:\n\n${uiDump(ui)}")
+ }
}
}
}
diff --git a/tests/tests/os/src/android/os/cts/BuildTest.java b/tests/tests/os/src/android/os/cts/BuildTest.java
index b0a1a5e..e84b984 100644
--- a/tests/tests/os/src/android/os/cts/BuildTest.java
+++ b/tests/tests/os/src/android/os/cts/BuildTest.java
@@ -331,6 +331,27 @@
Build.VERSION.SDK_INT >= Build.VERSION.FIRST_SDK_INT);
}
+ /**
+ * Verify that MEDIA_PERFORMANCE_CLASS are bounded by both high and low expected values.
+ */
+ public void testMediaPerformanceClass() {
+ // media performance class value of 0 is valid
+ if (Build.VERSION.MEDIA_PERFORMANCE_CLASS == 0) {
+ return;
+ }
+
+ assertTrue(
+ "Media Performance Class " + Build.VERSION.MEDIA_PERFORMANCE_CLASS
+ + " is invalid; must be at least VERSION_CODES.S",
+ // TODO: flip this once VERSION_CODES.S is finalized
+ Build.VERSION.MEDIA_PERFORMANCE_CLASS > Build.VERSION_CODES.R);
+ assertTrue(
+ "Media Performance Class " + Build.VERSION.MEDIA_PERFORMANCE_CLASS
+ + " is invalid; must be at most VERSION.SDK_INT",
+ // we use RESOURCES_SDK_INT to account for active development versions
+ Build.VERSION.MEDIA_PERFORMANCE_CLASS <= Build.VERSION.RESOURCES_SDK_INT);
+ }
+
static final String RO_DEBUGGABLE = "ro.debuggable";
private static final String RO_SECURE = "ro.secure";
diff --git a/tests/tests/os/src/android/os/cts/CompanionDeviceManagerTest.kt b/tests/tests/os/src/android/os/cts/CompanionDeviceManagerTest.kt
index 0620626..3076607 100644
--- a/tests/tests/os/src/android/os/cts/CompanionDeviceManagerTest.kt
+++ b/tests/tests/os/src/android/os/cts/CompanionDeviceManagerTest.kt
@@ -20,14 +20,26 @@
import android.content.pm.PackageManager.FEATURE_COMPANION_DEVICE_SETUP
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.net.MacAddress
+import android.os.Binder
+import android.os.Bundle
+import android.os.Parcelable
import android.os.UserHandle
import android.platform.test.annotations.AppModeFull
import android.test.InstrumentationTestCase
+import android.util.Size
+import android.util.SizeF
+import android.util.SparseArray
+import android.view.accessibility.AccessibilityNodeInfo
+import android.view.accessibility.AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE
+import android.view.accessibility.AccessibilityNodeInfo.ACTION_SET_TEXT
+import android.widget.EditText
import android.widget.TextView
import androidx.test.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
+import com.android.compatibility.common.util.MatcherUtils
import com.android.compatibility.common.util.MatcherUtils.hasIdThat
import com.android.compatibility.common.util.SystemUtil.eventually
+import com.android.compatibility.common.util.SystemUtil.getEventually
import com.android.compatibility.common.util.SystemUtil.runShellCommand
import com.android.compatibility.common.util.SystemUtil.runShellCommandOrThrow
import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
@@ -35,7 +47,10 @@
import com.android.compatibility.common.util.UiAutomatorUtils.waitFindObject
import com.android.compatibility.common.util.children
import com.android.compatibility.common.util.click
+import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.CoreMatchers.containsString
+import org.hamcrest.CoreMatchers.equalTo
+import org.hamcrest.Matcher
import org.hamcrest.Matchers.empty
import org.hamcrest.Matchers.not
import org.junit.Assert.assertThat
@@ -43,6 +58,7 @@
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import java.io.Serializable
const val COMPANION_APPROVE_WIFI_CONNECTIONS =
"android.permission.COMPANION_APPROVE_WIFI_CONNECTIONS"
@@ -140,12 +156,20 @@
installApk("/data/local/tmp/cts/os/CtsCompanionTestApp.apk")
startApp(packageName)
+ waitFindNode(hasClassThat(`is`(equalTo(EditText::class.java.name))))
+ .performAction(ACTION_SET_TEXT,
+ bundleOf(ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE to ""))
+ waitForIdle()
+
click("Watch")
- click("Associate")
- val device = waitFindNode(hasIdThat(containsString("device_list")))
- .children
- .find { it.className == TextView::class.java.name }
- assumeTrue("Test requires a discoverable bluetooth device nearby", device != null)
+ val device = getEventually({
+ click("Associate")
+ waitFindNode(hasIdThat(containsString("device_list")),
+ failMsg = "Test requires a discoverable bluetooth device nearby")
+ .children
+ .find { it.className == TextView::class.java.name }
+ .assertNotNull { "Empty device list" }
+ }, 30_000)
device!!.click()
eventually {
@@ -174,4 +198,46 @@
private fun click(label: String) {
waitFindObject(byTextIgnoreCase(label)).click()
waitForIdle()
+}
+
+fun hasClassThat(condition: Matcher<in String?>?): Matcher<AccessibilityNodeInfo> {
+ return MatcherUtils.propertyMatches(
+ "class",
+ { obj: AccessibilityNodeInfo -> obj.className },
+ condition)
+}
+
+fun bundleOf(vararg entries: Pair<String, Any>) = Bundle().apply {
+ entries.forEach { (k, v) -> set(k, v) }
+}
+
+operator fun Bundle.set(key: String, value: Any?) {
+ if (value is Array<*> && value.isArrayOf<Parcelable>()) {
+ putParcelableArray(key, value as Array<Parcelable>)
+ return
+ }
+ if (value is Array<*> && value.isArrayOf<CharSequence>()) {
+ putCharSequenceArray(key, value as Array<CharSequence>)
+ return
+ }
+ when (value) {
+ is Byte -> putByte(key, value)
+ is Char -> putChar(key, value)
+ is Short -> putShort(key, value)
+ is Float -> putFloat(key, value)
+ is CharSequence -> putCharSequence(key, value)
+ is Parcelable -> putParcelable(key, value)
+ is Size -> putSize(key, value)
+ is SizeF -> putSizeF(key, value)
+ is ArrayList<*> -> putParcelableArrayList(key, value as ArrayList<Parcelable>)
+ is SparseArray<*> -> putSparseParcelableArray(key, value as SparseArray<Parcelable>)
+ is Serializable -> putSerializable(key, value)
+ is ByteArray -> putByteArray(key, value)
+ is ShortArray -> putShortArray(key, value)
+ is CharArray -> putCharArray(key, value)
+ is FloatArray -> putFloatArray(key, value)
+ is Bundle -> putBundle(key, value)
+ is Binder -> putBinder(key, value)
+ else -> throw IllegalArgumentException("" + value)
+ }
}
\ No newline at end of file
diff --git a/tests/tests/os/src/android/os/cts/IntentLaunchActivity.java b/tests/tests/os/src/android/os/cts/IntentLaunchActivity.java
index dabd5d3..12be1e6 100644
--- a/tests/tests/os/src/android/os/cts/IntentLaunchActivity.java
+++ b/tests/tests/os/src/android/os/cts/IntentLaunchActivity.java
@@ -19,14 +19,21 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
+import android.util.Log;
+
+import java.net.URISyntaxException;
/**
* Activity used to verify an UnsafeIntentLaunch StrictMode violation is reported when an Intent
* is unparceled from the delivered Intent and used to start another activity.
*/
public class IntentLaunchActivity extends Activity {
- private static final String INNER_INTENT_KEY = "inner-intent";
+ private static final String TAG = "IntentLaunchActivity";
+
+ private static final String EXTRA_INNER_INTENT = "inner-intent";
+ private static final String EXTRA_INNER_INTENT_URI_STRING = "inner-intent-uri-string";
private static final String ACTION_UNSAFE_INTENT_LAUNCH = "android.os.cts.UNSAFE_INTENT_LAUNCH";
private static final String ACTION_UNSAFE_DATA_COPY_FROM_INTENT =
@@ -35,6 +42,13 @@
"android.os.cts.DATA_COPY_FROM_DELIVERED_INTENT_WITH_UNPARCELED_EXTRAS";
private static final String ACTION_UNSAFE_DATA_COPY_FROM_EXTRAS =
"android.os.cts.UNSAFE_DATA_COPY_FROM_EXTRAS";
+ private static final String ACTION_UNSAFE_INTENT_FROM_URI_LAUNCH =
+ "android.os.cts.UNSAFE_INTENT_FROM_URI_LAUNCH";
+ private static final String ACTION_SAFE_INTENT_FROM_URI_LAUNCH =
+ "android.os.cts.SAFE_INTENT_FROM_URI_LAUNCH";
+
+ private static final String ACTION_BROWSABLE_INTENT_LAUNCH =
+ "android.os.cts.BROWSABLE_INTENT_LAUNCH";
private static final String EXTRA_TEST_KEY = "android.os.cts.TEST_KEY";
@@ -88,7 +102,7 @@
*/
private static Intent getTestIntentWithExtrasInParceledIntent(Context context, String action) {
Intent intent = getTestIntent(context, action);
- Intent innerIntent = intent.getParcelableExtra(INNER_INTENT_KEY);
+ Intent innerIntent = intent.getParcelableExtra(EXTRA_INNER_INTENT);
// Add an extra to the Intent so that it contains the extras Bundle; the data itself is not
// important, just the fact that there is data to be copied without sanitation / validation.
innerIntent.putExtra(EXTRA_TEST_KEY, "TEST_VALUE");
@@ -96,6 +110,41 @@
}
/**
+ * Returns an Intent containing an Intent encoded as a URI in the extras; the returned Intent
+ * can be used to start this Activity and verify the StrictMode UnsafeIntentLaunch violation is
+ * reported as expected when launching an Intent parsed from a URI.
+ */
+ public static Intent getUnsafeIntentFromUriLaunchTestIntent(Context context) {
+ return getTestIntentWithUriIntentInExtras(context, ACTION_UNSAFE_INTENT_FROM_URI_LAUNCH);
+ }
+
+ /**
+ * Returns an Intent containing an Intent encoded as a URI in the extras; the returned Intent
+ * can be used to start this Activity and verify the StrictMode UnsafeIntentLaunch violation is
+ * not reported when launching an Intent parsed from a URI with the browsable category and
+ * without an explicit component.
+ */
+ public static Intent getSafeIntentFromUriLaunchTestIntent(Context context) {
+ return getTestIntentWithUriIntentInExtras(context, ACTION_SAFE_INTENT_FROM_URI_LAUNCH);
+ }
+
+ /**
+ * Returns an Intent with the specified {@code action} set and containing an Intent encoded as a
+ * URI in the extras.
+ */
+ private static Intent getTestIntentWithUriIntentInExtras(Context context, String action) {
+ Intent intent = getTestIntent(context, action);
+ Intent innerIntent = intent.getParcelableExtra(EXTRA_INNER_INTENT);
+ innerIntent.addCategory(Intent.CATEGORY_BROWSABLE);
+ innerIntent.setAction(ACTION_BROWSABLE_INTENT_LAUNCH);
+ innerIntent.setPackage(context.getPackageName());
+ String intentUriString = innerIntent.toUri(Intent.URI_ANDROID_APP_SCHEME);
+ intent.putExtra(EXTRA_INNER_INTENT_URI_STRING, intentUriString);
+ intent.removeExtra(EXTRA_INNER_INTENT);
+ return intent;
+ }
+
+ /**
* Returns an Intent with the specified {@code action} set and a parceled Intent.
*/
private static Intent getTestIntent(Context context, String action) {
@@ -103,7 +152,7 @@
intent.setAction(action);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent innerIntent = new Intent(context, SimpleTestActivity.class);
- intent.putExtra(INNER_INTENT_KEY, innerIntent);
+ intent.putExtra(EXTRA_INNER_INTENT, innerIntent);
return intent;
}
@@ -111,8 +160,9 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent deliveredIntent = getIntent();
- Intent innerIntent = deliveredIntent.getParcelableExtra(INNER_INTENT_KEY);
- switch (deliveredIntent.getAction()) {
+ Intent innerIntent = deliveredIntent.getParcelableExtra(EXTRA_INNER_INTENT);
+ String action = deliveredIntent.getAction();
+ switch (action) {
case ACTION_UNSAFE_INTENT_LAUNCH: {
if (innerIntent != null) {
startActivity(innerIntent);
@@ -143,6 +193,27 @@
startActivity(intent);
break;
}
+ case ACTION_UNSAFE_INTENT_FROM_URI_LAUNCH:
+ case ACTION_SAFE_INTENT_FROM_URI_LAUNCH: {
+ String intentUriString = deliveredIntent.getStringExtra(
+ EXTRA_INNER_INTENT_URI_STRING);
+ if (intentUriString != null) {
+ try {
+ Intent intent = Intent.parseUri(intentUriString,
+ Intent.URI_ANDROID_APP_SCHEME);
+ // If this is a safe intent from URI launch then clear the component as a
+ // browsable Intent without a component set should not result in a
+ // violation.
+ if (ACTION_SAFE_INTENT_FROM_URI_LAUNCH.equals(action)) {
+ intent.setComponent(null);
+ }
+ startActivity(intent);
+ } catch (URISyntaxException e) {
+ Log.e(TAG, "Exception parsing URI: " + intentUriString, e);
+ }
+ }
+ break;
+ }
default:
throw new IllegalArgumentException(
"An unexpected action of " + deliveredIntent.getAction()
diff --git a/tests/tests/os/src/android/os/cts/StrictModeTest.java b/tests/tests/os/src/android/os/cts/StrictModeTest.java
index b8c3de9..9c1eb8d 100644
--- a/tests/tests/os/src/android/os/cts/StrictModeTest.java
+++ b/tests/tests/os/src/android/os/cts/StrictModeTest.java
@@ -28,6 +28,7 @@
import android.app.Activity;
import android.app.Instrumentation;
+import android.app.WallpaperManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -661,6 +662,10 @@
fail("Failed because of " + e);
}
});
+
+ assertViolation("Tried to access UI related API:",
+ () -> applicationContext.getSystemService(WallpaperManager.class)
+ .getDesiredMinimumWidth());
}
@Presubmit
@@ -691,6 +696,10 @@
fail("Failed because of " + e);
}
});
+
+ assertViolation("Tried to access UI related API:",
+ () -> displayContext.getSystemService(WallpaperManager.class)
+ .getDesiredMinimumWidth());
}
@Presubmit
@@ -715,6 +724,9 @@
fail("Failed because of " + e);
}
});
+
+ assertNoViolation(() -> windowContext.getSystemService(WallpaperManager.class)
+ .getDesiredMinimumWidth());
}
@Presubmit
@@ -741,6 +753,9 @@
fail("Failed because of " + e);
}
});
+
+ assertNoViolation(() -> activity.getSystemService(WallpaperManager.class)
+ .getDesiredMinimumWidth());
}
@Presubmit
@@ -785,6 +800,9 @@
fail("Failed because of " + e);
}
});
+
+ assertNoViolation(() -> uiDerivedConfigContext.getSystemService(WallpaperManager.class)
+ .getDesiredMinimumWidth());
}
@Presubmit
@@ -815,6 +833,10 @@
fail("Failed because of " + e);
}
});
+
+ assertViolation("Tried to access UI related API:",
+ () -> uiDerivedDisplayContext.getSystemService(WallpaperManager.class)
+ .getDesiredMinimumWidth());
}
@Test
@@ -975,6 +997,44 @@
assertNoViolation(() -> context.startActivity(intent));
}
+ @Test
+ public void testUnsafeIntentLaunch_UnsafeIntentFromUriLaunch_ThrowsViolation()
+ throws Exception {
+ // Intents can also be delivered as URI strings and parsed with Intent#parseUri. This test
+ // verifies if an Intent is parsed from a URI string and launched without any additional
+ // sanitation / validation then a violation is reported.
+ StrictMode.setVmPolicy(
+ new StrictMode.VmPolicy.Builder()
+ .detectUnsafeIntentLaunch()
+ .penaltyLog()
+ .build());
+ Context context = getContext();
+ Intent intent =
+ IntentLaunchActivity.getUnsafeIntentFromUriLaunchTestIntent(context);
+
+ assertViolation(UNSAFE_INTENT_LAUNCH, () -> context.startActivity(intent));
+ }
+
+ @Test
+ public void testUnsafeIntentLaunch_SafeIntentFromUriLaunch_NoViolation() throws Exception {
+ // The documentation for Intent#URI_ALLOW_UNSAFE recommend using the CATEGORY_BROWSABLE
+ // when launching an Intent parsed from a URI; while an explicit Intent will still be
+ // delivered to the target component with this category set an implicit Intent will be
+ // limited to components with Intent-filters that handle this category. This test verifies
+ // an implicit Intent parsed from a URI with the browsable category set does not result in
+ // an UnsafeIntentLaunch StrictMode violation.
+ StrictMode.setVmPolicy(
+ new StrictMode.VmPolicy.Builder()
+ .detectUnsafeIntentLaunch()
+ .penaltyLog()
+ .build());
+ Context context = getContext();
+ Intent intent =
+ IntentLaunchActivity.getSafeIntentFromUriLaunchTestIntent(context);
+
+ assertNoViolation(() -> context.startActivity(intent));
+ }
+
private Context createWindowContext() {
final Display display = getContext().getSystemService(DisplayManager.class)
.getDisplay(DEFAULT_DISPLAY);
diff --git a/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java b/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
index 720d317..8ab63c3 100644
--- a/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
+++ b/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
@@ -800,6 +800,7 @@
StorageManager.convert(UUID.fromString("fafafafa-fafa-5afa-8afa-fafadeadbeef")));
}
+ @AppModeFull(reason = "Instant apps cannot hold MANAGE_EXTERNAL_STORAGE permission")
public void testGetManageSpaceActivityIntent() throws Exception {
String packageName = "android.os.cts";
int REQUEST_CODE = 1;
diff --git a/tests/tests/packageinstaller/install/src/android/packageinstaller/install/cts/PackageInstallerTestBase.kt b/tests/tests/packageinstaller/install/src/android/packageinstaller/install/cts/PackageInstallerTestBase.kt
index 32a47c5..f006c1b 100644
--- a/tests/tests/packageinstaller/install/src/android/packageinstaller/install/cts/PackageInstallerTestBase.kt
+++ b/tests/tests/packageinstaller/install/src/android/packageinstaller/install/cts/PackageInstallerTestBase.kt
@@ -17,6 +17,7 @@
package android.packageinstaller.install.cts
import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_MUTABLE
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.content.BroadcastReceiver
import android.content.Context
@@ -32,18 +33,17 @@
import android.content.pm.PackageInstaller.SessionParams.MODE_FULL_INSTALL
import android.content.pm.PackageManager
import android.support.test.uiautomator.By
-import androidx.test.InstrumentationRegistry
-import androidx.test.rule.ActivityTestRule
import android.support.test.uiautomator.UiDevice
import android.support.test.uiautomator.Until
import androidx.core.content.FileProvider
+import androidx.test.InstrumentationRegistry
+import androidx.test.rule.ActivityTestRule
import com.android.compatibility.common.util.FutureResultActivity
import org.junit.After
import org.junit.Assert
import org.junit.Before
import org.junit.Rule
import java.io.File
-import java.lang.IllegalArgumentException
import java.util.concurrent.CompletableFuture
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.TimeUnit
@@ -158,7 +158,7 @@
// Commit session
val dialog = FutureResultActivity.doAndAwaitStart {
val pendingIntent = PendingIntent.getBroadcast(context, 0, Intent(INSTALL_ACTION_CB),
- FLAG_UPDATE_CURRENT)
+ FLAG_UPDATE_CURRENT or FLAG_MUTABLE)
session.commit(pendingIntent.intentSender)
}
diff --git a/tests/tests/packageinstaller/tapjacking/src/android/packageinstaller/tapjacking/cts/TapjackingTest.java b/tests/tests/packageinstaller/tapjacking/src/android/packageinstaller/tapjacking/cts/TapjackingTest.java
index e5fda9b..5aa9c5d 100644
--- a/tests/tests/packageinstaller/tapjacking/src/android/packageinstaller/tapjacking/cts/TapjackingTest.java
+++ b/tests/tests/packageinstaller/tapjacking/src/android/packageinstaller/tapjacking/cts/TapjackingTest.java
@@ -23,6 +23,7 @@
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.net.Uri;
import android.platform.test.annotations.AppModeFull;
import android.support.test.uiautomator.By;
@@ -40,6 +41,11 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.AssumptionViolatedException;
+import org.junit.Rule;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
import java.io.IOException;
@@ -57,13 +63,16 @@
private static final long WAIT_FOR_UI_TIMEOUT = 5000;
- private Context mContext;
+ private Context mContext = InstrumentationRegistry.getTargetContext();
private String mPackageName;
private UiDevice mUiDevice;
+ boolean isWatch = mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
+
+ @Rule
+ public final RequiredRule mRequiredRule = new RequiredRule(isWatch);
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
mPackageName = mContext.getPackageName();
mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
if (!mUiDevice.isScreenOn()) {
@@ -114,4 +123,24 @@
public void tearDown() throws Exception {
mUiDevice.pressHome();
}
+
+ private static final class RequiredRule implements TestRule {
+ boolean mIsWatch;
+ RequiredRule(boolean isWatch) {
+ mIsWatch = isWatch;
+ }
+ @Override
+ public Statement apply(Statement base, Description description) {
+ return new Statement() {
+
+ @Override
+ public void evaluate() throws Throwable {
+ if (mIsWatch) {
+ throw new AssumptionViolatedException("Install/uninstall feature is not supported on WearOs");
+ }
+ base.evaluate();
+ }
+ };
+ }
+ }
}
diff --git a/tests/tests/packagewatchdog/Android.bp b/tests/tests/packagewatchdog/Android.bp
index 53e5efb..46ec52d 100644
--- a/tests/tests/packagewatchdog/Android.bp
+++ b/tests/tests/packagewatchdog/Android.bp
@@ -38,4 +38,5 @@
"src/**/*.java",
],
sdk_version: "test_current",
+ min_sdk_version: "30",
}
diff --git a/tests/tests/packagewatchdog/AndroidManifest.xml b/tests/tests/packagewatchdog/AndroidManifest.xml
index d0d2f81..a43b80b 100644
--- a/tests/tests/packagewatchdog/AndroidManifest.xml
+++ b/tests/tests/packagewatchdog/AndroidManifest.xml
@@ -18,6 +18,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.packagewatchdog.cts">
+ <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="31" />
+
<application android:label="PackageWatchdog TestCase">
<uses-library android:name="android.test.runner" />
</application>
diff --git a/tests/tests/permission/StorageEscalationApp29Full/Android.bp b/tests/tests/permission/StorageEscalationApp29Full/Android.bp
index 66ad07a..daf8472 100644
--- a/tests/tests/permission/StorageEscalationApp29Full/Android.bp
+++ b/tests/tests/permission/StorageEscalationApp29Full/Android.bp
@@ -24,5 +24,6 @@
test_suites: [
"cts",
"general-tests",
+ "mts",
],
}
diff --git a/tests/tests/permission/StorageEscalationApp29Scoped/Android.bp b/tests/tests/permission/StorageEscalationApp29Scoped/Android.bp
index 92beca5..7789919 100644
--- a/tests/tests/permission/StorageEscalationApp29Scoped/Android.bp
+++ b/tests/tests/permission/StorageEscalationApp29Scoped/Android.bp
@@ -24,5 +24,6 @@
test_suites: [
"cts",
"general-tests",
+ "mts",
],
}
diff --git a/tests/tests/permission2/res/raw/android_manifest.xml b/tests/tests/permission2/res/raw/android_manifest.xml
index 954c90f..0668d7e 100644
--- a/tests/tests/permission2/res/raw/android_manifest.xml
+++ b/tests/tests/permission2/res/raw/android_manifest.xml
@@ -93,6 +93,7 @@
<protected-broadcast android:name="android.intent.action.USER_SWITCHED" />
<protected-broadcast android:name="android.intent.action.USER_INITIALIZE" />
<protected-broadcast android:name="android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION" />
+ <protected-broadcast android:name="android.intent.action.DOMAINS_NEED_VERIFICATION" />
<protected-broadcast android:name="android.intent.action.OVERLAY_ADDED" />
<protected-broadcast android:name="android.intent.action.OVERLAY_CHANGED" />
<protected-broadcast android:name="android.intent.action.OVERLAY_REMOVED" />
@@ -321,9 +322,14 @@
<protected-broadcast android:name="android.net.nsd.STATE_CHANGED" />
+ <!-- For OMAPI -->
+ <protected-broadcast android:name="android.se.omapi.action.SECURE_ELEMENT_STATE_CHANGED" />
+
<protected-broadcast android:name="android.nfc.action.ADAPTER_STATE_CHANGED" />
+ <protected-broadcast android:name="android.nfc.action.ALWAYS_ON_STATE_CHANGED" />
<protected-broadcast android:name="android.nfc.action.PREFERRED_PAYMENT_CHANGED" />
<protected-broadcast android:name="android.nfc.action.TRANSACTION_DETECTED" />
+ <protected-broadcast android:name="android.nfc.action.REQUIRE_UNLOCK_FOR_NFC" />
<protected-broadcast android:name="com.android.nfc.action.LLCP_UP" />
<protected-broadcast android:name="com.android.nfc.action.LLCP_DOWN" />
<protected-broadcast android:name="com.android.nfc.cardemulation.action.CLOSE_TAP_DIALOG" />
@@ -393,6 +399,7 @@
<protected-broadcast android:name="android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST" />
<protected-broadcast android:name="android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION" />
<protected-broadcast android:name="android.net.wifi.action.PASSPOINT_LAUNCH_OSU_VIEW" />
+ <protected-broadcast android:name="android.net.wifi.action.REFRESH_USER_PROVISIONING" />
<protected-broadcast android:name="android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION" />
<protected-broadcast android:name="android.net.wifi.action.WIFI_SCAN_AVAILABILITY_CHANGED" />
<protected-broadcast android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
@@ -433,6 +440,8 @@
<protected-broadcast android:name="android.location.PROVIDERS_CHANGED" />
<protected-broadcast android:name="android.location.MODE_CHANGED" />
+ <protected-broadcast android:name="android.location.action.GNSS_CAPABILITIES_CHANGED" />
+
<protected-broadcast android:name="android.net.proxy.PAC_REFRESH" />
<protected-broadcast android:name="android.telecom.action.DEFAULT_DIALER_CHANGED" />
@@ -497,6 +506,8 @@
<protected-broadcast android:name="android.app.action.ACTION_PASSWORD_FAILED" />
<protected-broadcast android:name="android.app.action.ACTION_PASSWORD_SUCCEEDED" />
<protected-broadcast android:name="com.android.server.ACTION_EXPIRED_PASSWORD_NOTIFICATION" />
+ <protected-broadcast android:name="com.android.server.ACTION_PROFILE_OFF_DEADLINE" />
+ <protected-broadcast android:name="com.android.server.ACTION_TURN_PROFILE_ON_NOTIFICATION" />
<protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_ADDED" />
<protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_UNLOCKED" />
@@ -681,6 +692,10 @@
<!-- Made protected in S (was added in R) -->
<protected-broadcast android:name="com.android.internal.intent.action.BUGREPORT_REQUESTED" />
+ <!-- Added in S -->
+ <protected-broadcast android:name="android.intent.action.REBOOT_READY" />
+ <protected-broadcast android:name="android.app.action.DEVICE_POLICY_CONSTANTS_CHANGED" />
+
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
<!-- ====================================================================== -->
@@ -973,6 +988,23 @@
android:permissionGroup="android.permission-group.UNDEFINED"
android:protectionLevel="signature|appop|preinstalled" />
+ <!-- Allows an application to modify and delete media files on this device or any connected
+ storage device without user confirmation. Applications must already be granted the
+ {@link #READ_EXTERNAL_STORAGE} or {@link #MANAGE_EXTERNAL_STORAGE}} permissions for this
+ permission to take effect.
+ <p>Even if applications are granted this permission, if applications want to modify or
+ delete media files, they also must get the access by calling
+ {@link android.provider.MediaStore#createWriteRequest(ContentResolver, Collection)},
+ {@link android.provider.MediaStore#createDeleteRequest(ContentResolver, Collection)}, or
+ {@link android.provider.MediaStore#createTrashRequest(ContentResolver, Collection, boolean)}.
+ <p>This permission doesn't give read or write access directly. It only prevents the user
+ confirmation dialog for these requests.
+ <p>If applications are not granted {@link #ACCESS_MEDIA_LOCATION}, the system also pops up
+ the user confirmation dialog for the write request.
+ <p>Protection level: signature|appop|preinstalled -->
+ <permission android:name="android.permission.MANAGE_MEDIA"
+ android:protectionLevel="signature|appop|preinstalled" />
+
<!-- ====================================================================== -->
<!-- Permissions for accessing the device location -->
<!-- ====================================================================== -->
@@ -1272,7 +1304,8 @@
android:backgroundPermission="android.permission.RECORD_BACKGROUND_AUDIO"
android:protectionLevel="dangerous|instant" />
- <!-- @SystemApi Allows an application to record audio while in the background.
+ <!-- @SystemApi @TestApi Allows an application to record audio while in the background.
+ This permission is not intended to be held by apps.
<p>Protection level: internal
@hide -->
<permission android:name="android.permission.RECORD_BACKGROUND_AUDIO"
@@ -1303,7 +1336,7 @@
android:protectionLevel="dangerous|instant" />
<!-- ====================================================================== -->
- <!-- Permissions for accessing the UCE Service -->
+ <!-- Permissions for accessing the vendor UCE Service -->
<!-- ====================================================================== -->
<!-- @hide Allows an application to Access UCE-Presence.
@@ -1355,14 +1388,15 @@
android:backgroundPermission="android.permission.BACKGROUND_CAMERA"
android:protectionLevel="dangerous|instant" />
- <!-- @SystemApi Required to be able to access the camera device in the background.
+ <!-- @SystemApi @TestApi Required to be able to access the camera device in the background.
+ This permission is not intended to be held by apps.
<p>Protection level: internal
@hide -->
<permission android:name="android.permission.BACKGROUND_CAMERA"
- android:permissionGroup="android.permission-group.UNDEFINED"
- android:label="@string/permlab_backgroundCamera"
- android:description="@string/permdesc_backgroundCamera"
- android:protectionLevel="internal" />
+ android:permissionGroup="android.permission-group.UNDEFINED"
+ android:label="@string/permlab_backgroundCamera"
+ android:description="@string/permdesc_backgroundCamera"
+ android:protectionLevel="internal" />
<!-- @SystemApi Required in addition to android.permission.CAMERA to be able to access
system only camera devices.
@@ -1374,7 +1408,7 @@
android:description="@string/permdesc_systemCamera"
android:protectionLevel="system|signature" />
- <!-- Allows receiving the camera service notifications when a camera is opened
+ <!-- @SystemApi Allows receiving the camera service notifications when a camera is opened
(by a certain application package) or closed.
@hide -->
<permission android:name="android.permission.CAMERA_OPEN_CLOSE_LISTENER"
@@ -1558,7 +1592,8 @@
<permission android:name="android.permission.BIND_DIRECTORY_SEARCH"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi @hide Allows an application to modify cell broadcasts through the content provider.
+ <!-- @SystemApi @hide Allows an application to modify the cell broadcasts configuration
+ (i.e. enable or disable channels).
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.MODIFY_CELL_BROADCASTS"
android:protectionLevel="signature|privileged" />
@@ -1708,7 +1743,7 @@
<permission android:name="android.permission.MANAGE_IPSEC_TUNNELS"
android:protectionLevel="signature|appop" />
- <!-- @hide Allows apps to create and manage Test Networks.
+ <!-- @SystemApi @hide Allows apps to create and manage Test Networks.
<p>Granted only to shell. CTS tests will use
UiAutomation.AdoptShellPermissionIdentity() to gain access.
-->
@@ -1751,8 +1786,8 @@
android:protectionLevel="signature|setup" />
<!-- Allows applications to restart the Wi-Fi subsystem.
- @SystemApi
- <p>Not for use by third-party applications. @hide -->
+ @SystemApi
+ <p>Not for use by third-party applications. @hide -->
<permission android:name="android.permission.RESTART_WIFI_SUBSYSTEM"
android:protectionLevel="signature|privileged" />
@@ -1864,12 +1899,12 @@
<!-- @SystemApi @hide Allows applications to update Wifi/Cellular coex channels to avoid.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS"
- android:protectionLevel="signature|role" />
+ android:protectionLevel="signature|role" />
<!-- @SystemApi @hide Allows applications to access Wifi/Cellular coex channels being avoided.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WIFI_ACCESS_COEX_UNSAFE_CHANNELS"
- android:protectionLevel="signature|role" />
+ android:protectionLevel="signature|role" />
<!-- @SystemApi @hide Allows system APK to manage country code.
<p>Not for use by third-party applications. -->
@@ -1900,7 +1935,7 @@
@hide
-->
<permission android:name="android.permission.SUSPEND_APPS"
- android:protectionLevel="signature|wellbeing" />
+ android:protectionLevel="signature|role" />
<!-- Allows applications to discover and pair bluetooth devices.
<p>Protection level: normal
@@ -2275,11 +2310,6 @@
<permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows read access to privileged network state in the device config.
- @hide Used internally. -->
- <permission android:name="android.permission.READ_NETWORK_DEVICE_CONFIG"
- android:protectionLevel="signature|privileged" />
-
<!-- Allows to read device identifiers and use ICC based authentication like EAP-AKA.
Often required in authentication to access the carrier's server and manage services
of the subscriber.
@@ -2327,7 +2357,9 @@
<!-- Allows to query ongoing call details and manage ongoing calls
<p>Protection level: signature|appop -->
<permission android:name="android.permission.MANAGE_ONGOING_CALLS"
- android:protectionLevel="signature|appop" />
+ android:protectionLevel="signature|appop"
+ android:label="@string/permlab_manageOngoingCalls"
+ android:description="@string/permdesc_manageOngoingCalls" />
<!-- Allows the app to request network scans from telephony.
<p>Not for use by third-party applications.
@@ -2360,10 +2392,10 @@
android:protectionLevel="signature" />
<!-- Must be required by a {@link android.telecom.CallDiagnosticService},
- to ensure that only the system can bind to it.
- <p>Protection level: signature
- @SystemApi
- @hide
+ to ensure that only the system can bind to it.
+ <p>Protection level: signature
+ @SystemApi
+ @hide
-->
<permission android:name="android.permission.BIND_CALL_DIAGNOSTIC_SERVICE"
android:protectionLevel="signature" />
@@ -2582,7 +2614,7 @@
<permission android:name="android.permission.REAL_GET_TASKS"
android:protectionLevel="signature|privileged" />
- <!-- Allows an application to start a task from a ActivityManager#RecentTaskInfo.
+ <!-- @TestApi Allows an application to start a task from a ActivityManager#RecentTaskInfo.
@hide -->
<permission android:name="android.permission.START_TASKS_FROM_RECENTS"
android:protectionLevel="signature|privileged|recents" />
@@ -2689,9 +2721,10 @@
<permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"
android:protectionLevel="signature|privileged|vendorPrivileged|oem|verifier" />
- <!-- @SystemApi @hide Allows an application to start foreground services from background -->
+ <!-- Allows an application to start foreground services from background, can only be granted to
+ privileged apps or app that is SMS/EMERGENCY/SYSTEM GALLERY roles. -->
<permission android:name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"
- android:protectionLevel="signature|privileged|vendorPrivileged|oem|verifier" />
+ android:protectionLevel="signature|privileged|vendorPrivileged|oem|verifier|role"/>
<!-- @SystemApi Must be required by activities that handle the intent action
{@link Intent#ACTION_SEND_SHOW_SUSPENDED_APP_DETAILS}. This is for use by apps that
@@ -2730,8 +2763,9 @@
<permission android:name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE"
android:protectionLevel="signature|privileged|development" />
- <!-- Allows use of PendingIntent.getIntent().
- @hide -->
+ <!-- Allows use of PendingIntent.getIntent(), .
+ @hide @SystemApi(client=android.annotation.SystemApi.Client.MODULE_LIBRARIES)
+ -->
<permission android:name="android.permission.GET_INTENT_SENDER_INTENT"
android:protectionLevel="signature" />
@@ -2754,11 +2788,11 @@
The app can check whether it has this authorization by calling
{@link android.provider.Settings#canDrawOverlays
Settings.canDrawOverlays()}.
- <p>Protection level: signature|appop|installer|appPredictor|pre23|development -->
+ <p>Protection level: signature|setup|appop|installer|appPredictor|pre23|development -->
<permission android:name="android.permission.SYSTEM_ALERT_WINDOW"
android:label="@string/permlab_systemAlertWindow"
android:description="@string/permdesc_systemAlertWindow"
- android:protectionLevel="signature|appop|installer|appPredictor|pre23|development" />
+ android:protectionLevel="signature|setup|appop|installer|appPredictor|pre23|development" />
<!-- @SystemApi @hide Allows an application to create windows using the type
{@link android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY},
@@ -2771,7 +2805,7 @@
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SYSTEM_APPLICATION_OVERLAY"
- android:protectionLevel="signature|recents|wellbeing"/>
+ android:protectionLevel="signature|recents|role"/>
<!-- @deprecated Use {@link android.Manifest.permission#REQUEST_COMPANION_RUN_IN_BACKGROUND}
@hide
@@ -3247,12 +3281,12 @@
<!-- Allows an application to set, update and remove the credential management app.
@hide -->
<permission android:name="android.permission.MANAGE_CREDENTIAL_MANAGEMENT_APP"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows a font updater application to request that the system installs/uninstalls/updates
font files. @SystemApi @hide -->
<permission android:name="android.permission.UPDATE_FONTS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ========================================= -->
<!-- Permissions for special development tools -->
@@ -3669,6 +3703,13 @@
<permission android:name="android.permission.BIND_HOTWORD_DETECTION_SERVICE"
android:protectionLevel="signature" />
+ <!-- @SystemApi Allows an application to manage hotword detection on the device.
+ <p>Protection level: internal|preinstalled
+ @hide This is not a third-party API (intended for OEMs and system apps).
+ -->
+ <permission android:name="android.permission.MANAGE_HOTWORD_DETECTION"
+ android:protectionLevel="internal|preinstalled" />
+
<!-- Must be required by a {@link android.service.autofill.AutofillService},
to ensure that only the system can bind to it.
<p>Protection level: signature
@@ -3719,15 +3760,15 @@
to ensure that only the system can bind to it.
@SystemApi @hide This is not a third-party API (intended for OEMs and system apps).
<p>Protection level: signature
- -->
+ -->
<permission android:name="android.permission.BIND_TRANSLATION_SERVICE"
android:protectionLevel="signature" />
<!-- @SystemApi Allows apps to use ui translation functions.
- <p>Protection level: signature|privileged
- <p> TODO(b/177703453): Restrict to a specific Role instead of allowing access to any
- privileged app.
- @hide Not for use by third-party applications.
+ <p>Protection level: signature|privileged
+ <p> TODO(b/177703453): Restrict to a specific Role instead of allowing access to any
+ privileged app.
+ @hide Not for use by third-party applications.
-->
<permission android:name="android.permission.MANAGE_UI_TRANSLATION"
android:protectionLevel="signature|privileged" />
@@ -3914,6 +3955,12 @@
<permission android:name="android.permission.SET_KEYBOARD_LAYOUT"
android:protectionLevel="signature" />
+ <!-- Allows an app to use exact alarm scheduling APIs to perform timing
+ sensitive background work.
+ -->
+ <permission android:name="android.permission.SCHEDULE_EXACT_ALARM"
+ android:protectionLevel="normal|appop"/>
+
<!-- Allows an application to query tablet mode state and monitor changes
in it.
<p>Not for use by third-party applications.
@@ -3972,6 +4019,13 @@
<permission android:name="com.android.permission.INSTALL_EXISTING_PACKAGES"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an application to use System Data Loaders.
+ <p>Not for use by third-party applications.
+ @hide
+ -->
+ <permission android:name="com.android.permission.USE_SYSTEM_DATA_LOADERS"
+ android:protectionLevel="signature" />
+
<!-- @SystemApi @TestApi Allows an application to clear user data.
<p>Not for use by third-party applications
@hide
@@ -4260,10 +4314,10 @@
android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to capture the audio from tuner input devices types,
- such as FM_TUNER.
+ such as FM_TUNER.
- <p>Not for use by third-party applications.</p>
- @hide -->
+ <p>Not for use by third-party applications.</p>
+ @hide -->
<permission android:name="android.permission.CAPTURE_TUNER_AUDIO_INPUT"
android:protectionLevel="signature|privileged" />
@@ -4331,6 +4385,11 @@
<permission android:name="android.permission.MODIFY_AUDIO_ROUTING"
android:protectionLevel="signature|privileged" />
+ <!-- @TestApi Allows an application to query audio related state.
+ @hide -->
+ <permission android:name="android.permission.QUERY_AUDIO_STATE"
+ android:protectionLevel="signature" />
+
<!-- Allows an application to modify what effects are applied to all audio
(matching certain criteria) from any application.
<p>Not for use by third-party applications.</p>
@@ -4407,7 +4466,7 @@
Superseded by DEVICE_POWER permission. @hide @SystemApi
-->
<permission android:name="android.permission.BATTERY_PREDICTION"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows access to the PowerManager.userActivity function.
<p>Not for use by third-party applications. @hide @SystemApi -->
@@ -5107,7 +5166,7 @@
<!-- @SystemApi Allows the holder to access and manage instant applications on the device.
@hide -->
<permission android:name="android.permission.ACCESS_INSTANT_APPS"
- android:protectionLevel="signature|installer|verifier|wellbeing" />
+ android:protectionLevel="signature|installer|verifier|role" />
<uses-permission android:name="android.permission.ACCESS_INSTANT_APPS"/>
<!-- Allows the holder to view the instant applications on the device.
@@ -5136,9 +5195,9 @@
android:protectionLevel="signature|privileged" />
<!-- Must be required by system/priv apps to run sound trigger recognition sessions while in
- battery saver mode.
- @hide
- @SystemApi -->
+ battery saver mode.
+ @hide
+ @SystemApi -->
<permission android:name="android.permission.SOUND_TRIGGER_RUN_IN_BATTERY_SAVER"
android:protectionLevel="signature|privileged" />
@@ -5225,25 +5284,30 @@
<permission android:name="android.permission.MANAGE_MUSIC_RECOGNITION"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows an application to manage speech recognition service.
+ @hide <p>Not for use by third-party applications.</p> -->
+ <permission android:name="android.permission.MANAGE_SPEECH_RECOGNITION"
+ android:protectionLevel="signature" />
+
<!-- @SystemApi Allows an application to manage the content suggestions service.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_CONTENT_SUGGESTIONS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to manage the app predictions service.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_APP_PREDICTIONS"
- android:protectionLevel="signature|appPredictor" />
+ android:protectionLevel="signature|appPredictor" />
<!-- @SystemApi Allows an application to manage the search ui service.
- @hide <p>Not for use by third-party applications.</p> -->
+ @hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_SEARCH_UI"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to manage the smartspace service.
- @hide <p>Not for use by third-party applications.</p> -->
+ @hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_SMARTSPACE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an app to set the theme overlay in /vendor/overlay
being used.
@@ -5287,7 +5351,7 @@
<!-- @SystemApi Allows an application to turn on / off quiet mode.
@hide -->
<permission android:name="android.permission.MODIFY_QUIET_MODE"
- android:protectionLevel="signature|privileged|wellbeing|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- Allows internal management of the camera framework
@hide -->
@@ -5370,7 +5434,8 @@
android:protectionLevel="signature" />
<!-- Allows financial apps to read filtered sms messages.
- Protection level: signature|appop -->
+ Protection level: signature|appop
+ @deprecated The API that used this permission is no longer functional. -->
<permission android:name="android.permission.SMS_FINANCIAL_TRANSACTIONS"
android:protectionLevel="signature|appop" />
@@ -5488,21 +5553,16 @@
<permission android:name="android.permission.INPUT_CONSUMER"
android:protectionLevel="signature" />
- <!-- Allows an app to use exact alarm scheduling APIs to perform timing
- sensitive background work.
- -->
- <permission android:name="android.permission.SCHEDULE_EXACT_ALARM"
- android:protectionLevel="normal|appop"/>
-
- <!-- @hide Allows an application to control the system's device state managed by the
+ <!-- @hide @TestApi Allows an application to control the system's device state managed by the
{@link android.service.devicestate.DeviceStateManagerService}. For example, on foldable
devices this would grant access to toggle between the folded and unfolded states. -->
<permission android:name="android.permission.CONTROL_DEVICE_STATE"
android:protectionLevel="signature" />
- <!-- Must be required by an {@link android.service.displayhash.DisplayHasherService}
- to ensure that only the system can bind to it.
- @hide This is not a third-party API (intended for OEMs and system apps).
+ <!-- Must be required by a
+ {@link android.service.displayhash.DisplayHasherService}
+ to ensure that only the system can bind to it.
+ @hide This is not a third-party API (intended for OEMs and system apps).
-->
<permission android:name="android.permission.BIND_DISPLAY_HASHER_SERVICE"
android:protectionLevel="signature" />
@@ -5528,17 +5588,27 @@
<permission android:name="android.permission.GET_PEOPLE_TILE_PREVIEW"
android:protectionLevel="signature|recents" />
- <!-- @hide @SystemApi Allows access to whether a shortcut is represented by
- a Conversation. -->
+ <!-- @hide @SystemApi Allows an application to retrieve whether shortcut is backed by a
+ Conversation.
+ TODO(b/180412052): STOPSHIP: Define a role so it can be granted to Shell and AiAi. -->
<permission android:name="android.permission.READ_PEOPLE_DATA"
- android:protectionLevel="signature|appPredictor|recents" />
+ android:protectionLevel="signature|appPredictor|recents"/>
+
+ <!-- @hide @SystemApi Allows a logical component within an application to
+ temporarily renounce a set of otherwise granted permissions. -->
+ <permission android:name="android.permission.RENOUNCE_PERMISSIONS"
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows the holder to set the source of the data when setting a clip on the
- clipboard.
- @hide -->
+ clipboard.
+ @hide -->
<permission android:name="android.permission.SET_CLIP_SOURCE"
android:protectionLevel="signature|recents" />
+ <!-- @hide @SystemApi Allows the holder to manage app hibernation states for packages -->
+ <permission android:name="android.permission.MANAGE_APP_HIBERNATION"
+ android:protectionLevel="signature|installer" />
+
<!-- Attribution for Geofencing service. -->
<attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/>
<!-- Attribution for Country Detector. -->
@@ -5556,6 +5626,9 @@
on-device data -->
<attribution android:tag="OfflineLocationTimeZoneProviderService"
android:label="@string/offline_location_time_zone_detection_service_attribution"/>
+ <!-- Attribution for Gnss Time Update service. -->
+ <attribution android:tag="GnssTimeUpdateService"
+ android:label="@string/gnss_time_update_service"/>
<application android:process="system"
android:persistent="true"
diff --git a/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java b/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
index ce9d2f8..35ed018 100644
--- a/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
@@ -377,9 +377,6 @@
case "textClassifier": {
protectionLevel |= PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER;
} break;
- case "wellbeing": {
- protectionLevel |= PermissionInfo.PROTECTION_FLAG_WELLBEING;
- } break;
case "configurator": {
protectionLevel |= PermissionInfo.PROTECTION_FLAG_CONFIGURATOR;
} break;
diff --git a/tests/tests/permission3/Android.bp b/tests/tests/permission3/Android.bp
index 6b4beec..401bd07 100644
--- a/tests/tests/permission3/Android.bp
+++ b/tests/tests/permission3/Android.bp
@@ -26,6 +26,7 @@
],
static_libs: [
"kotlin-stdlib",
+ "androidx.core_core",
"androidx.test.rules",
"compatibility-device-util-axt",
"ctstestrunner-axt",
@@ -44,6 +45,7 @@
":CtsUsePermissionApp30WithBackground",
":CtsUsePermissionAppLatest",
":CtsUsePermissionAppLatestNone",
+ ":CtsUsePermissionAppLocationProvider",
":CtsUsePermissionAppWithOverlay",
],
test_suites: [
diff --git a/tests/tests/permission3/AndroidTest.xml b/tests/tests/permission3/AndroidTest.xml
index fb554ad..9d5de2e 100644
--- a/tests/tests/permission3/AndroidTest.xml
+++ b/tests/tests/permission3/AndroidTest.xml
@@ -46,6 +46,7 @@
<option name="push" value="CtsUsePermissionApp30WithBackground.apk->/data/local/tmp/cts/permission3/CtsUsePermissionApp30WithBackground.apk" />
<option name="push" value="CtsUsePermissionAppLatest.apk->/data/local/tmp/cts/permission3/CtsUsePermissionAppLatest.apk" />
<option name="push" value="CtsUsePermissionAppLatestNone.apk->/data/local/tmp/cts/permission3/CtsUsePermissionAppLatestNone.apk" />
+ <option name="push" value="CtsUsePermissionAppLocationProvider.apk->/data/local/tmp/cts/permission3/CtsUsePermissionAppLocationProvider.apk" />
<option name="push" value="CtsUsePermissionAppWithOverlay.apk->/data/local/tmp/cts/permission3/CtsUsePermissionAppWithOverlay.apk" />
</target_preparer>
diff --git a/tests/tests/permission3/UsePermissionAppLocationProvider/Android.bp b/tests/tests/permission3/UsePermissionAppLocationProvider/Android.bp
new file mode 100644
index 0000000..56c9966
--- /dev/null
+++ b/tests/tests/permission3/UsePermissionAppLocationProvider/Android.bp
@@ -0,0 +1,31 @@
+//
+// 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test_helper_app {
+ name: "CtsUsePermissionAppLocationProvider",
+ srcs: [
+ ":CtsUsePermissionAppSrc",
+ "src/**/*.kt",
+ ],
+ static_libs: [
+ "kotlin-stdlib",
+ ],
+ certificate: ":cts-testkey2",
+}
diff --git a/tests/tests/permission3/UsePermissionAppLocationProvider/AndroidManifest.xml b/tests/tests/permission3/UsePermissionAppLocationProvider/AndroidManifest.xml
new file mode 100644
index 0000000..16bacf5
--- /dev/null
+++ b/tests/tests/permission3/UsePermissionAppLocationProvider/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ 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.
+ -->
+
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.permission3.cts.usepermission">
+
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+
+ <application>
+ <activity android:name=".AddLocationProviderActivity" android:exported="true" />
+ <activity android:name=".FinishOnCreateActivity" android:exported="true"
+ android:permission="android.permission.START_VIEW_PERMISSION_USAGE">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tests/tests/permission3/UsePermissionAppLocationProvider/src/android/permission3/cts/usepermission/AddLocationProviderActivity.kt b/tests/tests/permission3/UsePermissionAppLocationProvider/src/android/permission3/cts/usepermission/AddLocationProviderActivity.kt
new file mode 100644
index 0000000..3bb461c
--- /dev/null
+++ b/tests/tests/permission3/UsePermissionAppLocationProvider/src/android/permission3/cts/usepermission/AddLocationProviderActivity.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.permission3.cts.usepermission
+
+import android.app.Activity
+import android.location.Criteria
+import android.location.LocationManager
+import android.os.Bundle
+
+/**
+ * An activity that adds this package as a test location provider.
+ */
+class AddLocationProviderActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val locationManager = getSystemService(LocationManager::class.java)
+ locationManager.addTestProvider(
+ packageName, false, false, false, false, false, false, false, Criteria.POWER_LOW,
+ Criteria.ACCURACY_COARSE
+ )
+
+ setResult(RESULT_OK)
+ finish()
+ }
+}
diff --git a/tests/tests/permission3/src/android/permission3/cts/BaseUsePermissionTest.kt b/tests/tests/permission3/src/android/permission3/cts/BaseUsePermissionTest.kt
index 8ec8a91..4ee3b21 100644
--- a/tests/tests/permission3/src/android/permission3/cts/BaseUsePermissionTest.kt
+++ b/tests/tests/permission3/src/android/permission3/cts/BaseUsePermissionTest.kt
@@ -56,6 +56,8 @@
"$APK_DIRECTORY/CtsUsePermissionApp30WithBackground.apk"
const val APP_APK_PATH_LATEST = "$APK_DIRECTORY/CtsUsePermissionAppLatest.apk"
const val APP_APK_PATH_LATEST_NONE = "$APK_DIRECTORY/CtsUsePermissionAppLatestNone.apk"
+ const val APP_APK_PATH_LOCATION_PROVIDER =
+ "$APK_DIRECTORY/CtsUsePermissionAppLocationProvider.apk"
const val APP_APK_PATH_WITH_OVERLAY = "$APK_DIRECTORY/CtsUsePermissionAppWithOverlay.apk"
const val APP_PACKAGE_NAME = "android.permission3.cts.usepermission"
diff --git a/tests/tests/permission3/src/android/permission3/cts/PermissionTest29.kt b/tests/tests/permission3/src/android/permission3/cts/PermissionTest29.kt
index 5d13748..645b5fb 100644
--- a/tests/tests/permission3/src/android/permission3/cts/PermissionTest29.kt
+++ b/tests/tests/permission3/src/android/permission3/cts/PermissionTest29.kt
@@ -102,6 +102,7 @@
}
}
+ @FlakyTest
@Test
fun testDenyBackgroundWithPrejudice() {
// Step 1: deny the first time
diff --git a/tests/tests/permission3/src/android/permission3/cts/PermissionUsageInfoTest.kt b/tests/tests/permission3/src/android/permission3/cts/PermissionUsageInfoTest.kt
new file mode 100644
index 0000000..fcfb5fd
--- /dev/null
+++ b/tests/tests/permission3/src/android/permission3/cts/PermissionUsageInfoTest.kt
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.permission3.cts
+
+import android.app.Activity
+import android.app.AppOpsManager
+import android.content.ComponentName
+import android.content.Intent
+import android.location.LocationManager
+import android.support.test.uiautomator.By
+import androidx.core.os.BuildCompat
+import com.android.compatibility.common.util.AppOpsUtils.setOpMode
+import com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity
+import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Test
+import java.util.concurrent.TimeUnit
+
+/**
+ * Tests permission usage info action for location providers.
+ */
+class PermissionUsageInfoTest : BaseUsePermissionTest() {
+ val locationManager = context.getSystemService(LocationManager::class.java)!!
+
+ @Before
+ fun installAppLocationProviderAndAllowMockLocation() {
+ installPackage(APP_APK_PATH_LOCATION_PROVIDER)
+ // The package name of a mock location provider is the caller adding it, so we have to let
+ // the test app add itself.
+ setOpMode(APP_PACKAGE_NAME, AppOpsManager.OPSTR_MOCK_LOCATION, AppOpsManager.MODE_ALLOWED)
+ }
+
+ @Before
+ fun allowMockLocation() {
+ // Allow ourselves to reliably remove the test location provider.
+ setOpMode(
+ context.packageName, AppOpsManager.OPSTR_MOCK_LOCATION, AppOpsManager.MODE_ALLOWED
+ )
+ }
+
+ @After
+ fun removeTestLocationProvider() {
+ locationManager.removeTestProvider(APP_PACKAGE_NAME)
+ }
+
+ @Test
+ fun testLocationProviderPermissionUsageInfo() {
+ val locationProviderPackageName: String
+ if (BuildCompat.isAtLeastS()) {
+ // Add the test app as location provider.
+ val future = startActivityForFuture(
+ Intent().apply {
+ component = ComponentName(
+ APP_PACKAGE_NAME, "$APP_PACKAGE_NAME.AddLocationProviderActivity"
+ )
+ }
+ )
+ val result = future.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+ assertEquals(Activity.RESULT_OK, result.resultCode)
+ assertTrue(
+ callWithShellPermissionIdentity {
+ locationManager.isProviderPackage(APP_PACKAGE_NAME)
+ }
+ )
+ locationProviderPackageName = APP_PACKAGE_NAME
+ } else {
+ // Test location provider doesn't count as location provier package before S.
+ val locationManager = context.getSystemService(LocationManager::class.java)!!
+ locationProviderPackageName = packageManager.getInstalledApplications(0)
+ .map { it.packageName }
+ .filter {
+ callWithShellPermissionIdentity { locationManager.isProviderPackage(it) }
+ }
+ .firstOrNull {
+ Intent(Intent.ACTION_VIEW_PERMISSION_USAGE)
+ .setPackage(it)
+ .resolveActivity(packageManager) != null
+ }
+ .let {
+ assumeTrue(it != null)
+ it!!
+ }
+ }
+
+ runWithShellPermissionIdentity {
+ context.startActivity(
+ Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS).apply {
+ putExtra(Intent.EXTRA_PACKAGE_NAME, locationProviderPackageName)
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ }
+ )
+ }
+ click(By.res("com.android.permissioncontroller:id/icon"))
+ }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/media/MediaStoreTest.java b/tests/tests/provider/src/android/provider/cts/media/MediaStoreTest.java
index 72d6a64..949b691 100644
--- a/tests/tests/provider/src/android/provider/cts/media/MediaStoreTest.java
+++ b/tests/tests/provider/src/android/provider/cts/media/MediaStoreTest.java
@@ -16,12 +16,18 @@
package android.provider.cts.media;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.Manifest;
+import android.app.AppOpsManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageInfo;
@@ -30,6 +36,7 @@
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
+import android.os.Process;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.provider.BaseColumns;
@@ -39,6 +46,7 @@
import android.provider.cts.R;
import android.util.Log;
+import androidx.annotation.NonNull;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SdkSuppress;
@@ -58,6 +66,8 @@
static final String TAG = "MediaStoreTest";
private static final long SIZE_DELTA = 32_000;
+ private static final String[] SYSTEM_GALERY_APPOPS = {
+ AppOpsManager.OPSTR_WRITE_MEDIA_IMAGES, AppOpsManager.OPSTR_WRITE_MEDIA_VIDEO};
private Context mContext;
private ContentResolver mContentResolver;
@@ -232,6 +242,58 @@
legacyPackage.services);
}
+ @Test
+ public void testIsCurrentSystemGallery() throws Exception {
+ assertThat(
+ MediaStore.isCurrentSystemGallery(
+ mContentResolver, Process.myUid(), getContext().getPackageName()))
+ .isFalse();
+
+ try {
+ setAppOpsModeForUid(Process.myUid(), AppOpsManager.MODE_ALLOWED, SYSTEM_GALERY_APPOPS);
+ assertThat(
+ MediaStore.isCurrentSystemGallery(
+ mContentResolver, Process.myUid(), getContext().getPackageName()))
+ .isTrue();
+ } finally {
+ setAppOpsModeForUid(Process.myUid(), AppOpsManager.MODE_ERRORED, SYSTEM_GALERY_APPOPS);
+ }
+
+ assertThat(
+ MediaStore.isCurrentSystemGallery(
+ mContentResolver, Process.myUid(), getContext().getPackageName()))
+ .isFalse();
+ }
+
+ @Test
+ public void testCanManageMedia() throws Exception {
+ final String opString = AppOpsManager.permissionToOp(Manifest.permission.MANAGE_MEDIA);
+
+ // no access
+ assertThat(MediaStore.canManageMedia(getContext())).isFalse();
+ try {
+ // grant access
+ setAppOpsModeForUid(Process.myUid(), AppOpsManager.MODE_ALLOWED, opString);
+
+ assertThat(MediaStore.canManageMedia(getContext())).isTrue();
+ } finally {
+ setAppOpsModeForUid(Process.myUid(), AppOpsManager.MODE_ERRORED, opString);
+ }
+ // no access
+ assertThat(MediaStore.canManageMedia(getContext())).isFalse();
+ }
+
+ private void setAppOpsModeForUid(int uid, int mode, @NonNull String... ops) {
+ getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(null);
+ try {
+ for (String op : ops) {
+ getContext().getSystemService(AppOpsManager.class).setUidMode(op, uid, mode);
+ }
+ } finally {
+ getInstrumentation().getUiAutomation().dropShellPermissionIdentity();
+ }
+ }
+
private static <T> void assertEmpty(String message, T[] array) {
if (array != null && array.length > 0) {
fail(message);
diff --git a/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp b/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
index 4cd383a..b5958c0 100644
--- a/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
+++ b/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
@@ -171,7 +171,8 @@
// CTS test. To keep things simple we just check whether the system knows about
// at least one eMMC device.
static bool usingEmmcStorage() {
- return access("/sys/class/block/mmcblk0", F_OK) == 0;
+ struct stat stbuf;
+ return lstat("/sys/class/block/mmcblk0", &stbuf) == 0;
}
// CDD 9.9.3/C-1-15: must not reuse IVs for file contents encryption except when
diff --git a/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp b/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
index ad089a2..0cc60e8 100644
--- a/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
+++ b/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
@@ -57,6 +57,12 @@
continue;
}
+ if (android::base::EqualsIgnoreCase(entry.fs_type, "emmc")) {
+ GTEST_LOG_(INFO) << entry.mount_point << " has emmc fs_type, skipping"
+ << " hashtree algorithm verification";
+ continue;
+ }
+
GTEST_LOG_(ERROR) << "partition enabled verity " << entry.mount_point;
// The verity sysprop use "system" as the partition name in the system as
diff --git a/tests/tests/security/src/android/security/cts/CertificateData.java b/tests/tests/security/src/android/security/cts/CertificateData.java
index a6cef5a..e228fd5 100644
--- a/tests/tests/security/src/android/security/cts/CertificateData.java
+++ b/tests/tests/security/src/android/security/cts/CertificateData.java
@@ -17,14 +17,12 @@
*/
package android.security.cts;
-import android.platform.test.annotations.SecurityTest;
/**
* Run "./cts/tools/utils/java-cert-list-generator.sh >
* cts/tests/tests/security/src/android/security/cts/CertificateData.java"
* to generate this file.
*/
-@SecurityTest
class CertificateData {
static final String[] CERTIFICATE_DATA = {
"99:9A:64:C3:7F:F4:7D:9F:AB:95:F1:47:69:89:14:60:EE:C4:C3:C5",
diff --git a/tests/tests/security/src/android/security/cts/CertificateTest.java b/tests/tests/security/src/android/security/cts/CertificateTest.java
index 2d88988..7b1ed9d 100644
--- a/tests/tests/security/src/android/security/cts/CertificateTest.java
+++ b/tests/tests/security/src/android/security/cts/CertificateTest.java
@@ -20,7 +20,6 @@
import java.io.FileInputStream;
import java.io.IOException;
import android.content.pm.PackageManager;
-import android.platform.test.annotations.SecurityTest;
import android.test.AndroidTestCase;
import java.security.KeyStore;
import java.security.KeyStoreException;
@@ -37,7 +36,6 @@
import java.util.List;
import java.util.Set;
-@SecurityTest
public class CertificateTest extends AndroidTestCase {
// The directory for CA root certificates trusted by WFA (WiFi Alliance)
private static final String DIR_OF_CACERTS_FOR_WFA =
diff --git a/tests/tests/security/src/android/security/cts/StagefrightTest.java b/tests/tests/security/src/android/security/cts/StagefrightTest.java
index 5c84535..86651a2 100644
--- a/tests/tests/security/src/android/security/cts/StagefrightTest.java
+++ b/tests/tests/security/src/android/security/cts/StagefrightTest.java
@@ -1861,7 +1861,9 @@
Thread.sleep(CHECK_INTERVAL);
timeout -= CHECK_INTERVAL;
}
+
if (!reportFile.exists() || !reportFile.isFile() || !lockFile.exists()) {
+ Log.e(TAG, "couldn't get the report or lock file");
return null;
}
try (BufferedReader reader = new BufferedReader(new FileReader(reportFile))) {
@@ -1926,7 +1928,9 @@
if (what != MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
what = newWhat;
}
+
lock.lock();
+ errored = true;
condition.signal();
lock.unlock();
@@ -1949,17 +1953,19 @@
public int waitForError() throws InterruptedException {
lock.lock();
- if (condition.awaitNanos(TIMEOUT_NS) <= 0) {
- Log.d(TAG, "timed out on waiting for error");
+ if (!errored && !completed) {
+ if (condition.awaitNanos(TIMEOUT_NS) <= 0) {
+ Log.d(TAG, "timed out on waiting for error. " +
+ "errored: " + errored + ", completed: " + completed);
+ }
}
lock.unlock();
- if (what != 0) {
+ if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
// Sometimes mediaserver signals a decoding error first, and *then* crashes
// due to additional in-flight buffers being processed, so wait a little
// and see if more errors show up.
+ Log.e(TAG, "couldn't get media crash yet, waiting 1 second");
SystemClock.sleep(1000);
- }
- if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
JSONArray crashes = getCrashReport(name.getMethodName(), 5000);
if (crashes == null) {
Log.e(TAG, "Crash results not found for test " + name.getMethodName());
@@ -1972,8 +1978,8 @@
// 0 is the code for no error.
return 0;
}
-
}
+ Log.d(TAG, "waitForError finished with no errors.");
return what;
}
@@ -1990,6 +1996,7 @@
Condition condition = lock.newCondition();
int what;
boolean completed = false;
+ boolean errored = false;
}
class LooperThread extends Thread {
diff --git a/tests/tests/sensorprivacy/src/android/sensorprivacy/cts/SensorPrivacyBaseTest.kt b/tests/tests/sensorprivacy/src/android/sensorprivacy/cts/SensorPrivacyBaseTest.kt
index 117b350..c723f26 100644
--- a/tests/tests/sensorprivacy/src/android/sensorprivacy/cts/SensorPrivacyBaseTest.kt
+++ b/tests/tests/sensorprivacy/src/android/sensorprivacy/cts/SensorPrivacyBaseTest.kt
@@ -80,7 +80,9 @@
@Test
fun testDialog() {
setSensor(true)
- val intent = Intent(MIC_CAM_ACTIVITY_ACTION).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ val intent = Intent(MIC_CAM_ACTIVITY_ACTION)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .addFlags(Intent.FLAG_ACTIVITY_MATCH_EXTERNAL)
for (extra in extras) {
intent.putExtra(extra, true)
}
@@ -89,7 +91,12 @@
SystemUtil.eventually {
assertFalse(isSensorPrivacyEnabled())
}
- context.sendBroadcast(Intent(FINISH_MIC_CAM_ACTIVITY_ACTION))
+
+ // instant apps can't broadcast to other instant apps; use the shell
+ runShellCommandOrThrow("am broadcast" +
+ " --user ${context.userId}" +
+ " -a $FINISH_MIC_CAM_ACTIVITY_ACTION" +
+ " -f ${Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS}")
}
@Test
diff --git a/tests/tests/sensorprivacy/test-apps/CtsUseMicOrCameraForSensorPrivacy/AndroidManifest.xml b/tests/tests/sensorprivacy/test-apps/CtsUseMicOrCameraForSensorPrivacy/AndroidManifest.xml
index 490773b..f0ff413 100644
--- a/tests/tests/sensorprivacy/test-apps/CtsUseMicOrCameraForSensorPrivacy/AndroidManifest.xml
+++ b/tests/tests/sensorprivacy/test-apps/CtsUseMicOrCameraForSensorPrivacy/AndroidManifest.xml
@@ -17,14 +17,16 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.sensorprivacy.cts.usemiccamera"
- android:versionCode="1">
+ android:versionCode="1"
+ android:targetSandboxVersion="2">
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.CAMERA"/>
<application android:label="CtsUseMicOrCameraForSensorPrivacy">
<activity android:name=".UseMicCamera"
- android:exported="true">
+ android:exported="true"
+ android:visibleToInstantApps="true">
<intent-filter>
<action android:name="android.sensorprivacy.cts.usemiccamera.action.USE_MIC_CAM" />
<category android:name="android.intent.category.DEFAULT" />
diff --git a/tests/tests/simphonebookprovider/AndroidTest.xml b/tests/tests/simphonebookprovider/AndroidTest.xml
index 0d7df7a..e21c163 100644
--- a/tests/tests/simphonebookprovider/AndroidTest.xml
+++ b/tests/tests/simphonebookprovider/AndroidTest.xml
@@ -17,6 +17,7 @@
<option name="test-suite-tag" value="cts" />
<option name="config-descriptor:metadata" key="component" value="framework" />
+ <option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
<!-- Instant apps can't access the system providers. -->
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
diff --git a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
index 05a64d2..f7ae500 100644
--- a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
+++ b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
@@ -25,6 +25,7 @@
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThat;
+import android.app.AppOpsManager;
import android.app.UiModeManager;
import android.content.Context;
import android.content.Intent;
@@ -38,6 +39,7 @@
import android.os.HandlerThread;
import android.os.Looper;
import android.os.RemoteException;
+import android.os.Process;
import android.provider.CallLog;
import android.telecom.Call;
import android.telecom.CallAudioState;
@@ -52,6 +54,7 @@
import android.telecom.cts.MockInCallService.InCallServiceCallbacks;
import android.telecom.cts.carmodetestapp.ICtsCarModeInCallServiceControl;
import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber;
import android.test.InstrumentationTestCase;
@@ -118,9 +121,10 @@
MockConnectionService connectionService = null;
boolean mIsEmergencyCallingSetup = false;
- HandlerThread mPhoneStateListenerThread;
- Handler mPhoneStateListenerHandler;
- TestPhoneStateListener mPhoneStateListener;
+ HandlerThread mTelephonyCallbackThread;
+ Handler mTelephonyCallbackHandler;
+ TestTelephonyCallback mTelephonyCallback;
+ TestCallStateListener mTestCallStateListener;
Handler mHandler;
/**
@@ -180,20 +184,46 @@
);
}
- static class TestPhoneStateListener extends PhoneStateListener {
+ static class TestCallStateListener extends TelephonyCallback
+ implements TelephonyCallback.CallStateListener {
+
+ private CountDownLatch mCountDownLatch = new CountDownLatch(1);
+ private int mLastState = -1;
+
+ @Override
+ public void onCallStateChanged(int state) {
+ Log.i(TAG, "onCallStateChanged: state=" + state);
+ mLastState = state;
+ mCountDownLatch.countDown();
+ mCountDownLatch = new CountDownLatch(1);
+ }
+
+ public CountDownLatch getCountDownLatch() {
+ return mCountDownLatch;
+ }
+
+ public int getLastState() {
+ return mLastState;
+ }
+ }
+
+ static class TestTelephonyCallback extends TelephonyCallback implements
+ TelephonyCallback.CallStateListener,
+ TelephonyCallback.OutgoingEmergencyCallListener,
+ TelephonyCallback.EmergencyNumberListListener {
/** Semaphore released for every callback invocation. */
public Semaphore mCallbackSemaphore = new Semaphore(0);
- List<Pair<Integer, String>> mCallStates = new ArrayList<>();
+ List<Integer> mCallStates = new ArrayList<>();
EmergencyNumber mLastOutgoingEmergencyNumber;
LinkedBlockingQueue<Map<Integer, List<EmergencyNumber>>> mEmergencyNumberListQueue =
new LinkedBlockingQueue<>(2);
@Override
- public void onCallStateChanged(int state, String number) {
- Log.i(TAG, "onCallStateChanged: state=" + state + ", number=" + number);
- mCallStates.add(Pair.create(state, number));
+ public void onCallStateChanged(int state) {
+ Log.i(TAG, "onCallStateChanged: state=" + state);
+ mCallStates.add(state);
mCallbackSemaphore.release();
}
@@ -237,6 +267,11 @@
TestUtils.executeShellCommand(getInstrumentation(), "telecom reset-car-mode");
assertUiMode(Configuration.UI_MODE_TYPE_NORMAL);
+ AppOpsManager aom = mContext.getSystemService(AppOpsManager.class);
+ ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(aom,
+ (appOpsMan) -> appOpsMan.setUidMode(AppOpsManager.OPSTR_PROCESS_OUTGOING_CALLS,
+ Process.myUid(), AppOpsManager.MODE_ALLOWED));
+
mTelecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
@@ -244,27 +279,21 @@
TestUtils.setDefaultDialer(getInstrumentation(), PACKAGE);
setupCallbacks();
- // PhoneStateListener's public API registers the listener on the calling thread, which must
- // be a looper thread. So we need to create and register the listener in a custom looper
- // thread.
- mPhoneStateListenerThread = new HandlerThread("PhoneStateListenerThread");
- mPhoneStateListenerThread.start();
- mPhoneStateListenerHandler = new Handler(mPhoneStateListenerThread.getLooper());
- final CountDownLatch registeredLatch = new CountDownLatch(1);
- mPhoneStateListenerHandler.post(new Runnable() {
- @Override
- public void run() {
- mPhoneStateListener = new TestPhoneStateListener();
- ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
- (tm) -> tm.listen(mPhoneStateListener,
- PhoneStateListener.LISTEN_CALL_STATE
- | PhoneStateListener.LISTEN_OUTGOING_EMERGENCY_CALL
- | PhoneStateListener.LISTEN_EMERGENCY_NUMBER_LIST));
- registeredLatch.countDown();
- }
- });
- registeredLatch.await(
+ // Register a call state listener.
+ mTestCallStateListener = new TestCallStateListener();
+ mTelephonyManager.registerTelephonyCallback(r -> r.run(), mTestCallStateListener);
+ mTestCallStateListener.getCountDownLatch().await(
TestUtils.WAIT_FOR_PHONE_STATE_LISTENER_REGISTERED_TIMEOUT_S, TimeUnit.SECONDS);
+ // Create a new thread for the telephony callback.
+ mTelephonyCallbackThread = new HandlerThread("PhoneStateListenerThread");
+ mTelephonyCallbackThread.start();
+ mTelephonyCallbackHandler = new Handler(mTelephonyCallbackThread.getLooper());
+
+ mTelephonyCallback = new TestTelephonyCallback();
+ ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
+ (tm) -> tm.registerTelephonyCallback(
+ mTelephonyCallbackHandler::post,
+ mTelephonyCallback));
}
@Override
@@ -274,17 +303,10 @@
return;
}
- final CountDownLatch unregisteredLatch = new CountDownLatch(1);
- mPhoneStateListenerHandler.post(new Runnable() {
- @Override
- public void run() {
- mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
- unregisteredLatch.countDown();
- }
- });
- unregisteredLatch.await(
- TestUtils.WAIT_FOR_PHONE_STATE_LISTENER_REGISTERED_TIMEOUT_S, TimeUnit.SECONDS);
- mPhoneStateListenerThread.quit();
+ mTelephonyManager.unregisterTelephonyCallback(mTestCallStateListener);
+
+ mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
+ mTelephonyCallbackThread.quit();
cleanupCalls();
if (!TextUtils.isEmpty(mPreviousDefaultDialer)) {
@@ -921,9 +943,15 @@
assertConferenceState(conference, Connection.STATE_ACTIVE);
}
+ void verifyCallStateListener(int expectedCallState) throws InterruptedException {
+ mTestCallStateListener.getCountDownLatch().await(
+ TestUtils.WAIT_FOR_PHONE_STATE_LISTENER_CALLBACK_TIMEOUT_S, TimeUnit.SECONDS);
+ assertEquals(expectedCallState, mTestCallStateListener.getLastState());
+ }
+
void verifyPhoneStateListenerCallbacksForCall(int expectedCallState, String expectedNumber)
throws Exception {
- assertTrue(mPhoneStateListener.mCallbackSemaphore.tryAcquire(
+ assertTrue(mTelephonyCallback.mCallbackSemaphore.tryAcquire(
TestUtils.WAIT_FOR_PHONE_STATE_LISTENER_CALLBACK_TIMEOUT_S, TimeUnit.SECONDS));
// At this point we can only be sure that we got AN update, but not necessarily the one we
// are looking for; wait until we see the state we want before verifying further.
@@ -935,12 +963,9 @@
@Override
public Object actual() {
- return mPhoneStateListener.mCallStates
+ return mTelephonyCallback.mCallStates
.stream()
- .filter(p -> p.first.equals(
- expectedCallState)
- && p.second.equals(
- expectedNumber))
+ .filter(p -> p == expectedCallState)
.count() > 0;
}
},
@@ -952,9 +977,9 @@
// Get the most recent callback; it is possible that there was an initial state reported due
// to the fact that TelephonyManager will sometimes give an initial state back to the caller
// when the listener is registered.
- Pair<Integer, String> callState = mPhoneStateListener.mCallStates.get(
- mPhoneStateListener.mCallStates.size() - 1);
- assertEquals(expectedCallState, (int) callState.first);
+ int callState = mTelephonyCallback.mCallStates.get(
+ mTelephonyCallback.mCallStates.size() - 1);
+ assertEquals(expectedCallState, callState);
// Note: We do NOT check the phone number here. Due to changes in how the phone state
// broadcast is sent, the caller may receive multiple broadcasts, and the number will be
// present in one or the other. We waited for a full matching broadcast above so we can
@@ -963,7 +988,7 @@
void verifyPhoneStateListenerCallbacksForEmergencyCall(String expectedNumber)
throws Exception {
- assertTrue(mPhoneStateListener.mCallbackSemaphore.tryAcquire(
+ assertTrue(mTelephonyCallback.mCallbackSemaphore.tryAcquire(
TestUtils.WAIT_FOR_PHONE_STATE_LISTENER_CALLBACK_TIMEOUT_S, TimeUnit.SECONDS));
// At this point we can only be sure that we got AN update, but not necessarily the one we
// are looking for; wait until we see the state we want before verifying further.
@@ -975,9 +1000,9 @@
@Override
public Object actual() {
- return mPhoneStateListener
+ return mTelephonyCallback
.mLastOutgoingEmergencyNumber != null
- && mPhoneStateListener
+ && mTelephonyCallback
.mLastOutgoingEmergencyNumber.getNumber()
.equals(expectedNumber);
}
@@ -985,7 +1010,7 @@
WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
"Expected emergency number: " + expectedNumber);
- assertEquals(mPhoneStateListener.mLastOutgoingEmergencyNumber.getNumber(),
+ assertEquals(mTelephonyCallback.mLastOutgoingEmergencyNumber.getNumber(),
expectedNumber);
}
diff --git a/tests/tests/telecom/src/android/telecom/cts/CallDiagnosticServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/CallDiagnosticServiceTest.java
index e1c2783..650005b 100644
--- a/tests/tests/telecom/src/android/telecom/cts/CallDiagnosticServiceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/CallDiagnosticServiceTest.java
@@ -26,14 +26,17 @@
import android.telecom.BluetoothCallQualityReport;
import android.telecom.Call;
import android.telecom.CallAudioState;
+import android.telecom.CallDiagnostics;
import android.telecom.Connection;
-import android.telecom.DiagnosticCall;
+import android.telecom.DisconnectCause;
import android.telecom.TelecomManager;
+import android.telephony.TelephonyManager;
import java.util.concurrent.TimeUnit;
public class CallDiagnosticServiceTest extends BaseTelecomTestWithMockServices {
private static final String POOR_CALL_MESSAGE = "Can you hear me?";
+ private static final String OVERRIDE_MESSAGE = "Whoopsie doodles; call dropped. Oh well.";
private static final int POOR_MESSAGE_ID = 90210;
private TelecomManager mTelecomManager;
private MockConnection mConnection;
@@ -76,7 +79,7 @@
setupCall();
assertEquals(1, mService.getCalls().size());
- final CtsCallDiagnosticService.CtsDiagnosticCall diagnosticCall =
+ final CtsCallDiagnosticService.CtsCallDiagnostics diagnosticCall =
mService.getCalls().get(0);
// Add an extra to the connection and verify CDS gets it.
@@ -195,17 +198,17 @@
Bundle message = new Bundle();
message.putInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_TYPE,
- DiagnosticCall.MESSAGE_CALL_NETWORK_TYPE);
+ CallDiagnostics.MESSAGE_CALL_NETWORK_TYPE);
message.putInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_VALUE,
- DiagnosticCall.NETWORK_TYPE_NR);
+ TelephonyManager.NETWORK_TYPE_LTE);
mConnection.sendConnectionEvent(Connection.EVENT_DEVICE_TO_DEVICE_MESSAGE, message);
- CtsCallDiagnosticService.CtsDiagnosticCall diagnosticCall = mService.getCalls().get(0);
+ CtsCallDiagnosticService.CtsCallDiagnostics diagnosticCall = mService.getCalls().get(0);
diagnosticCall.getReceivedMessageLatch().await(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
TimeUnit.MILLISECONDS);
- assertEquals(DiagnosticCall.MESSAGE_CALL_NETWORK_TYPE,
+ assertEquals(CallDiagnostics.MESSAGE_CALL_NETWORK_TYPE,
diagnosticCall.getMessageType());
- assertEquals(DiagnosticCall.NETWORK_TYPE_NR,
+ assertEquals(TelephonyManager.NETWORK_TYPE_LTE,
diagnosticCall.getMessageValue());
}
@@ -219,9 +222,9 @@
}
setupCall();
- CtsCallDiagnosticService.CtsDiagnosticCall diagnosticCall = mService.getCalls().get(0);
- diagnosticCall.sendDeviceToDeviceMessage(DiagnosticCall.MESSAGE_DEVICE_BATTERY_STATE,
- DiagnosticCall.BATTERY_STATE_LOW);
+ CtsCallDiagnosticService.CtsCallDiagnostics diagnosticCall = mService.getCalls().get(0);
+ diagnosticCall.sendDeviceToDeviceMessage(CallDiagnostics.MESSAGE_DEVICE_BATTERY_STATE,
+ CallDiagnostics.BATTERY_STATE_LOW);
final TestUtils.InvokeCounter counter = mConnection.getInvokeCounter(
MockConnection.ON_CALL_EVENT);
@@ -233,8 +236,8 @@
assertNotNull(extras);
int messageType = extras.getInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_TYPE);
int messageValue = extras.getInt(Connection.EXTRA_DEVICE_TO_DEVICE_MESSAGE_VALUE);
- assertEquals(DiagnosticCall.MESSAGE_DEVICE_BATTERY_STATE, messageType);
- assertEquals(DiagnosticCall.BATTERY_STATE_LOW, messageValue);
+ assertEquals(CallDiagnostics.MESSAGE_DEVICE_BATTERY_STATE, messageType);
+ assertEquals(CallDiagnostics.BATTERY_STATE_LOW, messageValue);
}
/**
@@ -247,7 +250,7 @@
}
setupCall();
- CtsCallDiagnosticService.CtsDiagnosticCall diagnosticCall = mService.getCalls().get(0);
+ CtsCallDiagnosticService.CtsCallDiagnostics diagnosticCall = mService.getCalls().get(0);
diagnosticCall.displayDiagnosticMessage(POOR_MESSAGE_ID, POOR_CALL_MESSAGE);
mOnConnectionEventCounter.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
@@ -271,7 +274,7 @@
}
setupCall();
- CtsCallDiagnosticService.CtsDiagnosticCall diagnosticCall = mService.getCalls().get(0);
+ CtsCallDiagnosticService.CtsCallDiagnostics diagnosticCall = mService.getCalls().get(0);
diagnosticCall.clearDiagnosticMessage(POOR_MESSAGE_ID);
mOnConnectionEventCounter.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
@@ -284,6 +287,48 @@
}
/**
+ * Test not overriding the disconnect message.
+ * @throws InterruptedException
+ */
+ public void testSetNullDisconnectMessage() throws InterruptedException {
+ if (!shouldTestTelecom(mContext)) {
+ return;
+ }
+ setupCall();
+ mService.setDisconnectMessage(null);
+ mConnection.setDisconnected(new DisconnectCause(DisconnectCause.ERROR));
+ mConnection.destroy();
+ CtsCallDiagnosticService.CtsCallDiagnostics diagnosticCall = mService.getCalls().get(0);
+ diagnosticCall.getDisconnectLatch().await(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+ TimeUnit.MILLISECONDS);
+
+ assertCallState(mCall, Call.STATE_DISCONNECTED);
+ assertNull(mCall.getDetails().getDisconnectCause().getLabel());
+ assertNull(mCall.getDetails().getDisconnectCause().getDescription());
+ }
+
+ /**
+ * Test override the disconnect message.
+ * @throws InterruptedException
+ */
+ public void testOverrideDisconnectMessage() throws InterruptedException {
+ if (!shouldTestTelecom(mContext)) {
+ return;
+ }
+ setupCall();
+ mService.setDisconnectMessage(OVERRIDE_MESSAGE);
+ mConnection.setDisconnected(new DisconnectCause(DisconnectCause.ERROR));
+ mConnection.destroy();
+ CtsCallDiagnosticService.CtsCallDiagnostics diagnosticCall = mService.getCalls().get(0);
+ diagnosticCall.getDisconnectLatch().await(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+ TimeUnit.MILLISECONDS);
+
+ assertCallState(mCall, Call.STATE_DISCONNECTED);
+ assertEquals(OVERRIDE_MESSAGE, mCall.getDetails().getDisconnectCause().getLabel());
+ assertEquals(OVERRIDE_MESSAGE, mCall.getDetails().getDisconnectCause().getDescription());
+ }
+
+ /**
* Starts a fake SIM call and verifies binding to the CDS.
* @throws InterruptedException
*/
diff --git a/tests/tests/telecom/src/android/telecom/cts/CtsCallDiagnosticService.java b/tests/tests/telecom/src/android/telecom/cts/CtsCallDiagnosticService.java
index b90f5a7..c88ddd1 100644
--- a/tests/tests/telecom/src/android/telecom/cts/CtsCallDiagnosticService.java
+++ b/tests/tests/telecom/src/android/telecom/cts/CtsCallDiagnosticService.java
@@ -21,7 +21,7 @@
import android.telecom.Call;
import android.telecom.CallAudioState;
import android.telecom.CallDiagnosticService;
-import android.telecom.DiagnosticCall;
+import android.telecom.CallDiagnostics;
import android.telephony.CallQuality;
import android.telephony.ims.ImsReasonInfo;
import android.util.Log;
@@ -42,9 +42,10 @@
private CountDownLatch mChangeLatch = new CountDownLatch(1);
private CountDownLatch mBluetoothCallQualityReportLatch = new CountDownLatch(1);
private CountDownLatch mCallAudioStateLatch = new CountDownLatch(1);
- private List<CtsDiagnosticCall> mCalls = new ArrayList<>();
+ private List<CtsCallDiagnostics> mCalls = new ArrayList<>();
+ private CharSequence mDisconnectMessage = null;
- public static class CtsDiagnosticCall extends DiagnosticCall {
+ public class CtsCallDiagnostics extends CallDiagnostics {
private Call.Details mCallDetails;
private int mMessageType;
private int mMessageValue;
@@ -52,6 +53,7 @@
private CountDownLatch mCallQualityReceivedLatch = new CountDownLatch(1);
private CountDownLatch mReceivedMessageLatch = new CountDownLatch(1);
private CountDownLatch mCallDetailsReceivedLatch = new CountDownLatch(1);
+ private CountDownLatch mDisconnectLatch = new CountDownLatch(1);
@Override
public void onCallDetailsChanged(@NonNull Call.Details details) {
@@ -69,13 +71,15 @@
@Nullable
@Override
public CharSequence onCallDisconnected(int disconnectCause, int preciseDisconnectCause) {
- return null;
+ mDisconnectLatch.countDown();
+ return mDisconnectMessage;
}
@Nullable
@Override
public CharSequence onCallDisconnected(@NonNull ImsReasonInfo disconnectReason) {
- return null;
+ mDisconnectLatch.countDown();
+ return mDisconnectMessage;
}
@Override
@@ -84,8 +88,6 @@
mReceivedMessageLatch.countDown();
}
- @NonNull
- @Override
public Call.Details getCallDetails() {
return mCallDetails;
}
@@ -117,6 +119,10 @@
public CountDownLatch getCallDetailsReceivedLatch() {
return mCallDetailsReceivedLatch;
}
+
+ public CountDownLatch getDisconnectLatch() {
+ return mDisconnectLatch;
+ }
}
@Override
@@ -137,8 +143,8 @@
@NonNull
@Override
- public DiagnosticCall onInitializeDiagnosticCall(@NonNull Call.Details call) {
- CtsDiagnosticCall diagCall = new CtsDiagnosticCall();
+ public CallDiagnostics onInitializeCallDiagnostics(@NonNull Call.Details call) {
+ CtsCallDiagnostics diagCall = new CtsCallDiagnostics();
diagCall.mCallDetails = call;
mCalls.add(diagCall);
mChangeLatch.countDown();
@@ -146,7 +152,7 @@
}
@Override
- public void onRemoveDiagnosticCall(@NonNull DiagnosticCall call) {
+ public void onRemoveCallDiagnostics(@NonNull CallDiagnostics call) {
Log.i(LOG_TAG, "onRemoveDiagnosticCall: " + call);
mCalls.remove(call);
mChangeLatch.countDown();
@@ -195,7 +201,11 @@
return mBluetoothCallQualityReportLatch;
}
- public List<CtsDiagnosticCall> getCalls() {
+ public List<CtsCallDiagnostics> getCalls() {
return mCalls;
}
+
+ public void setDisconnectMessage(CharSequence charSequence) {
+ mDisconnectMessage = charSequence;
+ }
}
diff --git a/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
index 5dae559..b54a511 100644
--- a/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
+++ b/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertTrue;
import android.content.Intent;
+import android.os.IBinder;
import android.telecom.Conference;
import android.telecom.Connection;
import android.telecom.ConnectionRequest;
@@ -58,8 +59,8 @@
private static boolean sIsBound = false;
private static CountDownLatch sServiceUnBoundLatch = new CountDownLatch(1);
- public CtsConnectionService() throws Exception {
- super();
+ @Override
+ public void onBindClient(Intent intent) {
sTelecomConnectionService = this;
sIsBound = true;
}
@@ -77,7 +78,6 @@
public static void tearDown() {
synchronized(sLock) {
- sTelecomConnectionService = null;
sConnectionService = null;
}
}
@@ -208,14 +208,24 @@
public static void addConferenceToTelecom(Conference conference) {
synchronized(sLock) {
- sTelecomConnectionService.addConference(conference);
+ if (sTelecomConnectionService != null) {
+ sTelecomConnectionService.addConference(conference);
+ } else {
+ Log.e(LOG_TAG, "addConferenceToTelecom called when"
+ + " sTelecomConnectionService null!");
+ }
}
}
public static void addExistingConnectionToTelecom(
PhoneAccountHandle phoneAccountHandle, Connection connection) {
synchronized(sLock) {
- sTelecomConnectionService.addExistingConnection(phoneAccountHandle, connection);
+ if (sTelecomConnectionService != null) {
+ sTelecomConnectionService.addExistingConnection(phoneAccountHandle, connection);
+ } else {
+ Log.e(LOG_TAG, "addExistingConnectionToTelecom called when"
+ + " sTelecomConnectionService null!");
+ }
}
}
@@ -232,8 +242,14 @@
PhoneAccountHandle connectionManagerPhoneAccount,
ConnectionRequest request) {
synchronized(sLock) {
- return sTelecomConnectionService.createRemoteOutgoingConnection(
- connectionManagerPhoneAccount, request);
+ if (sTelecomConnectionService != null) {
+ return sTelecomConnectionService.createRemoteOutgoingConnection(
+ connectionManagerPhoneAccount, request);
+ } else {
+ Log.e(LOG_TAG, "createRemoteOutgoingConnectionToTelecom called when"
+ + " sTelecomConnectionService null!");
+ return null;
+ }
}
}
@@ -241,8 +257,14 @@
PhoneAccountHandle connectionManagerPhoneAccount,
ConnectionRequest request) {
synchronized(sLock) {
- return sTelecomConnectionService.createRemoteIncomingConnection(
- connectionManagerPhoneAccount, request);
+ if (sTelecomConnectionService != null) {
+ return sTelecomConnectionService.createRemoteIncomingConnection(
+ connectionManagerPhoneAccount, request);
+ } else {
+ Log.e(LOG_TAG, "createRemoteIncomingConnectionToTelecom called when"
+ + " sTelecomConnectionService null!");
+ return null;
+ }
}
}
@@ -250,8 +272,14 @@
PhoneAccountHandle connectionManagerPhoneAccount,
ConnectionRequest request) {
synchronized (sLock) {
- return sTelecomConnectionService.createRemoteIncomingConference(
- connectionManagerPhoneAccount, request);
+ if (sTelecomConnectionService != null) {
+ return sTelecomConnectionService.createRemoteIncomingConference(
+ connectionManagerPhoneAccount, request);
+ } else {
+ Log.e(LOG_TAG, "createRemoteIncomingConferenceToTelecom called when"
+ + " sTelecomConnectionService null!");
+ return null;
+ }
}
}
@@ -260,8 +288,14 @@
PhoneAccountHandle connectionManagerPhoneAccount,
ConnectionRequest request) {
synchronized (sLock) {
- return sTelecomConnectionService.createRemoteOutgoingConference(
- connectionManagerPhoneAccount, request);
+ if (sTelecomConnectionService != null) {
+ return sTelecomConnectionService.createRemoteOutgoingConference(
+ connectionManagerPhoneAccount, request);
+ } else {
+ Log.e(LOG_TAG, "createRemoteOutgoingConferenceToTelecom called when"
+ + " sTelecomConnectionService null!");
+ return null;
+ }
}
}
@@ -307,6 +341,7 @@
sServiceUnBoundLatch.countDown();
sIsBound = false;
sConnectionService = null;
+ sTelecomConnectionService = null;
return super.onUnbind(intent);
}
diff --git a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
index f46fd10..39498ec 100644
--- a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
@@ -449,6 +449,13 @@
assertFalse(call.getDetails().getExtras().containsKey(TelecomManager.EXTRA_PRIORITY));
assertFalse(call.getDetails().getExtras()
.containsKey(TelecomManager.EXTRA_CALL_SUBJECT));
+
+ assertFalse(call.getDetails().getIntentExtras()
+ .containsKey(TelecomManager.EXTRA_LOCATION));
+ assertFalse(call.getDetails().getIntentExtras()
+ .containsKey(TelecomManager.EXTRA_PRIORITY));
+ assertFalse(call.getDetails().getIntentExtras()
+ .containsKey(TelecomManager.EXTRA_CALL_SUBJECT));
} finally {
MockCallScreeningService.disableService(mContext);
TestUtils.clearSystemDialerOverride(getInstrumentation());
diff --git a/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java b/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java
index 0128b6d..03e5f06 100644
--- a/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java
@@ -119,6 +119,7 @@
verifyConnectionForIncomingCall();
verifyPhoneStateListenerCallbacksForCall(CALL_STATE_RINGING,
testNumber.getSchemeSpecificPart());
+ verifyCallStateListener(CALL_STATE_RINGING);
}
/**
diff --git a/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java b/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java
index 5a75fbc..d2cdd0c 100644
--- a/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java
@@ -17,6 +17,7 @@
package android.telecom.cts;
import static android.telecom.Call.STATE_SELECT_PHONE_ACCOUNT;
+import static android.telephony.TelephonyManager.CALL_STATE_RINGING;
import android.content.Context;
import android.media.AudioManager;
@@ -132,7 +133,7 @@
Map<Integer, List<EmergencyNumber>> emergencyNumbers = null;
for (int i = 0; i < 5; i++) {
- emergencyNumbers = mPhoneStateListener.waitForEmergencyNumberListUpdate(
+ emergencyNumbers = mTelephonyCallback.waitForEmergencyNumberListUpdate(
TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
assertNotNull("Never got an update that the test emergency number was registered",
emergencyNumbers);
@@ -174,6 +175,7 @@
.getAddress().getSchemeSpecificPart();
verifyPhoneStateListenerCallbacksForCall(TelephonyManager.CALL_STATE_OFFHOOK,
expectedNumber);
+ verifyCallStateListener(TelephonyManager.CALL_STATE_OFFHOOK);
}
/**
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/DataCallResponseTest.java b/tests/tests/telephony/current/src/android/telephony/cts/DataCallResponseTest.java
index ea36271..8229f98 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/DataCallResponseTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/DataCallResponseTest.java
@@ -18,8 +18,8 @@
import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_DO_FALLBACK;
import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY;
-import static android.telephony.data.SliceInfo.SLICE_SERVICE_TYPE_EMBB;
-import static android.telephony.data.SliceInfo.SLICE_SERVICE_TYPE_MIOT;
+import static android.telephony.data.NetworkSliceInfo.SLICE_SERVICE_TYPE_EMBB;
+import static android.telephony.data.NetworkSliceInfo.SLICE_SERVICE_TYPE_MIOT;
import static com.google.common.truth.Truth.assertThat;
@@ -28,7 +28,7 @@
import android.os.Parcel;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
-import android.telephony.data.SliceInfo;
+import android.telephony.data.NetworkSliceInfo;
import android.telephony.data.TrafficDescriptor;
import org.junit.Test;
@@ -60,8 +60,8 @@
private static final int TEST_SLICE_SERVICE_TYPE = SLICE_SERVICE_TYPE_EMBB;
private static final int TEST_HPLMN_SLICE_DIFFERENTIATOR = 10;
private static final int TEST_HPLMN_SLICE_SERVICE_TYPE = SLICE_SERVICE_TYPE_MIOT;
- private static final SliceInfo SLICE_INFO =
- new SliceInfo.Builder()
+ private static final NetworkSliceInfo SLICE_INFO =
+ new NetworkSliceInfo.Builder()
.setSliceServiceType(TEST_SLICE_SERVICE_TYPE)
.setSliceDifferentiator(TEST_SLICE_DIFFERENTIATOR)
.setMappedHplmnSliceDifferentiator(TEST_HPLMN_SLICE_DIFFERENTIATOR)
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/SliceInfoTest.java b/tests/tests/telephony/current/src/android/telephony/cts/NetworkSliceInfoTest.java
similarity index 62%
rename from tests/tests/telephony/current/src/android/telephony/cts/SliceInfoTest.java
rename to tests/tests/telephony/current/src/android/telephony/cts/NetworkSliceInfoTest.java
index d0ab1ae..8e2d490 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/SliceInfoTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/NetworkSliceInfoTest.java
@@ -16,19 +16,19 @@
package android.telephony.cts;
-import static android.telephony.data.SliceInfo.SLICE_SERVICE_TYPE_EMBB;
-import static android.telephony.data.SliceInfo.SLICE_SERVICE_TYPE_MIOT;
+import static android.telephony.data.NetworkSliceInfo.SLICE_SERVICE_TYPE_EMBB;
+import static android.telephony.data.NetworkSliceInfo.SLICE_SERVICE_TYPE_MIOT;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
import android.os.Parcel;
-import android.telephony.data.SliceInfo;
+import android.telephony.data.NetworkSliceInfo;
import org.junit.Test;
-public class SliceInfoTest {
+public class NetworkSliceInfoTest {
private static final int TEST_SLICE_DIFFERENTIATOR = 1;
private static final int TEST_SLICE_SERVICE_TYPE = SLICE_SERVICE_TYPE_EMBB;
private static final int TEST_HPLMN_SLICE_DIFFERENTIATOR = 10;
@@ -36,22 +36,22 @@
@Test
public void testParceling() {
- testParceling(new SliceInfo.Builder()
+ testParceling(new NetworkSliceInfo.Builder()
.setSliceServiceType(TEST_SLICE_SERVICE_TYPE)
.build());
- testParceling(new SliceInfo.Builder()
+ testParceling(new NetworkSliceInfo.Builder()
.setSliceServiceType(TEST_SLICE_SERVICE_TYPE)
.setSliceDifferentiator(TEST_SLICE_DIFFERENTIATOR)
.build());
- testParceling(new SliceInfo.Builder()
+ testParceling(new NetworkSliceInfo.Builder()
.setSliceServiceType(TEST_SLICE_SERVICE_TYPE)
.setSliceDifferentiator(TEST_SLICE_DIFFERENTIATOR)
.setMappedHplmnSliceServiceType(TEST_HPLMN_SLICE_SERVICE_TYPE)
.build());
- testParceling(new SliceInfo.Builder()
+ testParceling(new NetworkSliceInfo.Builder()
.setSliceServiceType(TEST_SLICE_SERVICE_TYPE)
.setSliceDifferentiator(TEST_SLICE_DIFFERENTIATOR)
.setMappedHplmnSliceServiceType(TEST_HPLMN_SLICE_SERVICE_TYPE)
@@ -59,47 +59,49 @@
.build());
}
- private void testParceling(SliceInfo sliceInfo1) {
+ private void testParceling(NetworkSliceInfo sliceInfo1) {
Parcel stateParcel = Parcel.obtain();
sliceInfo1.writeToParcel(stateParcel, 0);
stateParcel.setDataPosition(0);
- SliceInfo parcelResponse = SliceInfo.CREATOR.createFromParcel(stateParcel);
+ NetworkSliceInfo parcelResponse = NetworkSliceInfo.CREATOR.createFromParcel(stateParcel);
assertThat(parcelResponse).isEqualTo(sliceInfo1);
}
@Test
public void testSliceDifferentiatorRange() {
- new SliceInfo.Builder()
- .setSliceDifferentiator(SliceInfo.MIN_SLICE_DIFFERENTIATOR)
- .setSliceDifferentiator(SliceInfo.MAX_SLICE_DIFFERENTIATOR)
- .setMappedHplmnSliceDifferentiator(SliceInfo.MIN_SLICE_DIFFERENTIATOR)
- .setMappedHplmnSliceDifferentiator(SliceInfo.MAX_SLICE_DIFFERENTIATOR);
+ new NetworkSliceInfo.Builder()
+ .setSliceDifferentiator(NetworkSliceInfo.MIN_SLICE_DIFFERENTIATOR)
+ .setSliceDifferentiator(NetworkSliceInfo.MAX_SLICE_DIFFERENTIATOR)
+ .setMappedHplmnSliceDifferentiator(NetworkSliceInfo.MIN_SLICE_DIFFERENTIATOR)
+ .setMappedHplmnSliceDifferentiator(NetworkSliceInfo.MAX_SLICE_DIFFERENTIATOR);
try {
- new SliceInfo.Builder()
- .setSliceDifferentiator(SliceInfo.MIN_SLICE_DIFFERENTIATOR - 1);
+ new NetworkSliceInfo.Builder()
+ .setSliceDifferentiator(NetworkSliceInfo.MIN_SLICE_DIFFERENTIATOR - 1);
fail("Illegal state exception expected");
} catch (IllegalArgumentException ignored) {
}
try {
- new SliceInfo.Builder()
- .setMappedHplmnSliceDifferentiator(SliceInfo.MIN_SLICE_DIFFERENTIATOR - 1);
+ new NetworkSliceInfo.Builder()
+ .setMappedHplmnSliceDifferentiator(
+ NetworkSliceInfo.MIN_SLICE_DIFFERENTIATOR - 1);
fail("Illegal state exception expected");
} catch (IllegalArgumentException ignored) {
}
try {
- new SliceInfo.Builder()
- .setSliceDifferentiator(SliceInfo.MAX_SLICE_DIFFERENTIATOR + 1);
+ new NetworkSliceInfo.Builder()
+ .setSliceDifferentiator(NetworkSliceInfo.MAX_SLICE_DIFFERENTIATOR + 1);
fail("Illegal state exception expected");
} catch (IllegalArgumentException ignored) {
}
try {
- new SliceInfo.Builder()
- .setMappedHplmnSliceDifferentiator(SliceInfo.MAX_SLICE_DIFFERENTIATOR + 1);
+ new NetworkSliceInfo.Builder()
+ .setMappedHplmnSliceDifferentiator(
+ NetworkSliceInfo.MAX_SLICE_DIFFERENTIATOR + 1);
fail("Illegal state exception expected");
} catch (IllegalArgumentException ignored) {
}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/PhysicalChannelConfigTest.java b/tests/tests/telephony/current/src/android/telephony/cts/PhysicalChannelConfigTest.java
index cc534f7..eaa6b7d 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/PhysicalChannelConfigTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/PhysicalChannelConfigTest.java
@@ -36,6 +36,8 @@
private static final int CONNECTION_STATUS = PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING;
private static final int CELL_BANDWIDTH = 12345;
private static final int CHANNEL_NUMBER = 1234;
+ private static final int DOWNLINK_FREQUENCY = 11100;
+ private static final int UPLINK_FREQUENCY = 11100;
private static final int FREQUENCY_RANGE = 1;
private static final int PHYSICAL_CELL_ID = 502;
private static final int PHYSICAL_INVALID_CELL_ID = 1008;
@@ -168,4 +170,32 @@
assertThat(mPhysicalChannelConfig.getFrequencyRange()).isEqualTo(
ServiceState.FREQUENCY_RANGE_LOW);
}
+
+ private void setupNrPhysicalChannelConfig() {
+ mPhysicalChannelConfig = new PhysicalChannelConfig.Builder()
+ .setPhysicalCellId(PHYSICAL_CELL_ID)
+ .setNetworkType(NETWORK_TYPE_NR)
+ .setCellConnectionStatus(CONNECTION_STATUS)
+ .setCellBandwidthDownlinkKhz(CELL_BANDWIDTH)
+ .setCellBandwidthUplinkKhz(CELL_BANDWIDTH)
+ .setContextIds(CONTEXT_IDS)
+ .setDownlinkChannelNumber(2220)
+ .setUplinkChannelNumber(2220)
+ .setBand(BAND)
+ .build();
+ }
+
+ @Test
+ public void testUplinkFrequencyKhz() {
+ setupNrPhysicalChannelConfig();
+
+ assertEquals(UPLINK_FREQUENCY, mPhysicalChannelConfig.getUplinkFrequencyKhz());
+ }
+
+ @Test
+ public void testDownlinkFrequencyKhz() {
+ setupNrPhysicalChannelConfig();
+
+ assertEquals(DOWNLINK_FREQUENCY, mPhysicalChannelConfig.getDownlinkFrequencyKhz());
+ }
}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/SignalStrengthTest.java b/tests/tests/telephony/current/src/android/telephony/cts/SignalStrengthTest.java
index 785916f..409a55a 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/SignalStrengthTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/SignalStrengthTest.java
@@ -179,9 +179,10 @@
case TelephonyManager.NETWORK_TYPE_LTE: /* fall through */
case TelephonyManager.NETWORK_TYPE_LTE_CA:
return CellSignalStrengthLte.class;
+ case TelephonyManager.NETWORK_TYPE_NR:
+ return CellSignalStrengthNr.class;
case TelephonyManager.NETWORK_TYPE_IWLAN: /* fall through */
case TelephonyManager.NETWORK_TYPE_IDEN: /* fall through */
- case TelephonyManager.NETWORK_TYPE_NR: /* fall through */
default:
return null;
}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/SmsManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/SmsManagerTest.java
index cb9d1ad..d3ecc7e 100755
--- a/tests/tests/telephony/current/src/android/telephony/cts/SmsManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/SmsManagerTest.java
@@ -56,6 +56,7 @@
import android.os.SystemClock;
import android.provider.Telephony;
import android.telephony.SmsCbMessage;
+import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaSmsCbProgramData;
@@ -801,6 +802,15 @@
}
}
+ @Test
+ public void testCreateForSubscriptionId() {
+ int testSubId = 123;
+ SmsManager smsManager = mContext.getSystemService(SmsManager.class)
+ .createForSubscriptionId(testSubId);
+ assertEquals("getSubscriptionId() should be " + testSubId, testSubId,
+ smsManager.getSubscriptionId());
+ }
+
protected ArrayList<String> divideMessage(String text) {
return getSmsManager().divideMessage(text);
}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
old mode 100644
new mode 100755
index 8031a4a..064f45e
--- a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
@@ -32,6 +32,7 @@
import static org.junit.Assert.fail;
import android.annotation.Nullable;
+import android.app.UiAutomation;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.ConnectivityManager;
@@ -86,6 +87,7 @@
public class SubscriptionManagerTest {
private static final String TAG = "SubscriptionManagerTest";
+ private static final String MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE";
private SubscriptionManager mSm;
private int mSubId;
@@ -758,6 +760,8 @@
// not treating this as test failure as it may be due to UX confirmation or may not
// be supported
Log.e(TAG, "setSubscriptionEnabled() did not complete");
+ executeWithShellPermissionAndDefault(false, mSm,
+ (sm) -> sm.setSubscriptionEnabled(mSubId, enabled));
return;
}
@@ -906,6 +910,21 @@
}
}
+ @Test
+ public void testSetAndGetD2DStatusSharing() {
+ UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ uiAutomation.adoptShellPermissionIdentity(MODIFY_PHONE_STATE);
+ int originalD2DStatusSharing = mSm.getDeviceToDeviceStatusSharing(mSubId);
+ mSm.setDeviceToDeviceStatusSharing(SubscriptionManager.D2D_SHARING_ALL_CONTACTS, mSubId);
+ assertEquals(SubscriptionManager.D2D_SHARING_ALL_CONTACTS,
+ mSm.getDeviceToDeviceStatusSharing(mSubId));
+ mSm.setDeviceToDeviceStatusSharing(SubscriptionManager.D2D_SHARING_ALL, mSubId);
+ assertEquals(SubscriptionManager.D2D_SHARING_ALL,
+ mSm.getDeviceToDeviceStatusSharing(mSubId));
+ mSm.setDeviceToDeviceStatusSharing(originalD2DStatusSharing, mSubId);
+ uiAutomation.dropShellPermissionIdentity();
+ }
+
@Nullable
private PersistableBundle getBundleFromBackupData(byte[] data) {
try (ByteArrayInputStream bis = new ByteArrayInputStream(data)) {
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyCallbackTest.java b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyCallbackTest.java
index 071f331..18095d7 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyCallbackTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyCallbackTest.java
@@ -38,6 +38,7 @@
import android.telephony.CellIdentity;
import android.telephony.CellInfo;
import android.telephony.CellLocation;
+import android.telephony.LinkCapacityEstimate;
import android.telephony.PhysicalChannelConfig;
import android.telephony.PreciseCallState;
import android.telephony.PreciseDataConnectionState;
@@ -94,10 +95,14 @@
private boolean mOnTelephonyDisplayInfoChanged;
private boolean mOnPhysicalChannelConfigCalled;
private boolean mOnDataEnabledChangedCalled;
+ private boolean mOnLinkCapacityEstimateChangedCalled;
@RadioPowerState
private int mRadioPowerState;
@SimActivationState
private int mVoiceActivationState;
+ private boolean mOnAllowedNetworkTypesChangedCalled;
+ private int mAllowedNetworkTypeReason;
+ private long mAllowedNetworkTypeValue;
private BarringInfo mBarringInfo;
private PreciseDataConnectionState mPreciseDataConnectionState;
private PreciseCallState mPreciseCallState;
@@ -792,7 +797,7 @@
private class CallStateListener extends TelephonyCallback
implements TelephonyCallback.CallStateListener {
@Override
- public void onCallStateChanged(int state, String incomingNumber) {
+ public void onCallStateChanged(int state) {
synchronized (mLock) {
mOnCallStateChangedCalled = true;
mLock.notify();
@@ -808,10 +813,9 @@
}
assertFalse(mOnCallStateChangedCalled);
- mHandler.post(() -> {
- mCallStateCallback = new CallStateListener();
- registerTelephonyCallback(mCallStateCallback);
- });
+ mCallStateCallback = new CallStateListener();
+ registerTelephonyCallback(mCallStateCallback);
+
synchronized (mLock) {
if (!mOnCallStateChangedCalled) {
mLock.wait(WAIT_TIME);
@@ -1311,4 +1315,108 @@
// Test unregister
unRegisterTelephonyCallback(mOnDataEnabledChangedCalled, mDataEnabledCallback);
}
+
+ private AllowedNetworkTypesListener mAllowedNetworkTypesCallback;
+
+ private class AllowedNetworkTypesListener extends TelephonyCallback
+ implements TelephonyCallback.AllowedNetworkTypesListener {
+ @Override
+ public void onAllowedNetworkTypesChanged(int reason, long allowedNetworkType) {
+ synchronized (mLock) {
+ mAllowedNetworkTypeReason = reason;
+ mAllowedNetworkTypeValue = allowedNetworkType;
+ mOnAllowedNetworkTypesChangedCalled = true;
+
+ mLock.notify();
+ }
+ }
+ }
+
+ @Test
+ public void testOnAllowedNetworkTypesChangedByRegisterPhoneStateListener() throws Throwable {
+ assertFalse(mOnAllowedNetworkTypesChangedCalled);
+
+ mHandler.post(() -> {
+ mAllowedNetworkTypesCallback = new AllowedNetworkTypesListener();
+ registerTelephonyCallbackWithPermission(mAllowedNetworkTypesCallback);
+ });
+
+ long originalAllowedNetworkTypeUser = ShellIdentityUtils.invokeMethodWithShellPermissions(
+ mTelephonyManager, (tm) -> {
+ return tm.getAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER);
+ }
+ );
+
+ ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+ mTelephonyManager,
+ (tm) -> tm.setAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER,
+ TelephonyManager.NETWORK_TYPE_BITMASK_NR));
+
+ synchronized (mLock) {
+ if (!mOnAllowedNetworkTypesChangedCalled) {
+ mLock.wait(WAIT_TIME);
+ }
+ }
+
+ long allowedNetworkTypeUser = ShellIdentityUtils.invokeMethodWithShellPermissions(
+ mTelephonyManager, (tm) -> {
+ return tm.getAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER);
+ }
+ );
+
+ assertEquals(TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER, mAllowedNetworkTypeReason);
+ assertEquals(allowedNetworkTypeUser, mAllowedNetworkTypeValue);
+ // Test unregister
+ unRegisterTelephonyCallback(mOnAllowedNetworkTypesChangedCalled,
+ mAllowedNetworkTypesCallback);
+
+ // Recover the allowed network type user settings.
+ ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+ mTelephonyManager,
+ (tm) -> tm.setAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER,
+ originalAllowedNetworkTypeUser));
+ }
+
+ private LinkCapacityEstimateChangedListener mLinkCapacityEstimateChangedListener;
+
+ private class LinkCapacityEstimateChangedListener extends TelephonyCallback
+ implements TelephonyCallback.LinkCapacityEstimateChangedListener {
+ @Override
+ public void onLinkCapacityEstimateChanged(
+ List<LinkCapacityEstimate> linkCapacityEstimateList) {
+ synchronized (mLock) {
+ mOnLinkCapacityEstimateChangedCalled = true;
+ mLock.notify();
+ }
+ }
+ }
+
+ @Test
+ public void testOnLinkCapacityEstimateChangedByRegisterPhoneStateListener() throws Throwable {
+ if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
+ Log.d(TAG, "Skipping test that requires ConnectivityManager.TYPE_MOBILE");
+ return;
+ }
+
+ assertFalse(mOnLinkCapacityEstimateChangedCalled);
+ mHandler.post(() -> {
+ mLinkCapacityEstimateChangedListener = new LinkCapacityEstimateChangedListener();
+ registerTelephonyCallbackWithPermission(mLinkCapacityEstimateChangedListener);
+ });
+
+ synchronized (mLock) {
+ while (!mOnLinkCapacityEstimateChangedCalled) {
+ mLock.wait(WAIT_TIME);
+ }
+ }
+ assertTrue(mOnLinkCapacityEstimateChangedCalled);
+
+ // Test unregister
+ unRegisterTelephonyCallback(mOnLinkCapacityEstimateChangedCalled,
+ mLinkCapacityEstimateChangedListener);
+ }
}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
index f746138..c7cb1c6 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
@@ -62,7 +62,6 @@
import android.telephony.CallAttributes;
import android.telephony.CallForwardingInfo;
import android.telephony.CallQuality;
-import android.telephony.CarrierBandwidth;
import android.telephony.CarrierConfigManager;
import android.telephony.CellIdentity;
import android.telephony.CellIdentityLte;
@@ -3656,19 +3655,6 @@
}
@Test
- public void testGetCarrierBandwidth() {
- if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
- return;
- }
- CarrierBandwidth bandwidth =
- ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
- (tm) -> tm.getCarrierBandwidth());
- if (mRadioVersion >= RADIO_HAL_VERSION_1_6) {
- assertTrue(bandwidth != null);
- }
- }
-
- @Test
public void testSetSignalStrengthUpdateRequest_nullRequest() {
if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
Log.d(TAG, "skipping test on device without FEATURE_TELEPHONY present");
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
index 62f4fc8..c707d0e 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
@@ -281,7 +281,7 @@
ImsMmTelManager mMmTelManager = imsManager.getImsMmTelManager(sTestSub);
boolean isEnabled = ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(
- mMmTelManager, ImsMmTelManager::isCrossSimCallingEnabledByUser, ImsException.class,
+ mMmTelManager, ImsMmTelManager::isCrossSimCallingEnabled, ImsException.class,
"android.permission.READ_PRIVILEGED_PHONE_STATE");
ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(mMmTelManager,
(m) -> m.setCrossSimCallingEnabled(!isEnabled), ImsException.class,
@@ -290,10 +290,10 @@
waitForLatch(contentObservedLatch, observer);
boolean isEnabledResult = ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(
mMmTelManager,
- ImsMmTelManager::isCrossSimCallingEnabledByUser,
+ ImsMmTelManager::isCrossSimCallingEnabled,
ImsException.class,
"android.permission.READ_PRIVILEGED_PHONE_STATE");
- assertEquals("isCrossSimCallingEnabledByUser did not match"
+ assertEquals("isCrossSimCallingEnabled did not match"
+ "value set by setCrossSimCallingEnabled",
!isEnabled, isEnabledResult);
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
index 8ef9cd6..9c8aba4 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
@@ -129,11 +129,24 @@
+ "\t\t</Ext>\n"
+ "\t</SERVICES>\n"
+ "</RCSConfig>";
+ private static final String TEST_RCS_PRE_CONFIG = "<RCSPreProvisiniongConfig>\n"
+ + "\t<VERS>\n"
+ + "\t\t<version>1</version>\n"
+ + "\t\t<validity>1728000</validity>\n"
+ + "\t</VERS>\n"
+ + "\t<TOKEN>\n"
+ + "\t\t<token>X</token>\n"
+ + "\t</TOKEN>\n"
+ + "\t<EXT>\n"
+ + "\t\t<url>https://rcs.mnc123.mcc456.pub.3gppnetwork.org</url>\n"
+ + "\t</EXT>\n"
+ + "</RCSPreProvisiniongConfig>";
private static final int RCS_CONFIG_CB_UNKNOWN = Integer.MAX_VALUE;
private static final int RCS_CONFIG_CB_CHANGED = 0;
private static final int RCS_CONFIG_CB_ERROR = 1;
private static final int RCS_CONFIG_CB_RESET = 2;
private static final int RCS_CONFIG_CB_DELETE = 3;
+ private static final int RCS_CONFIG_CB_PREPROV = 4;
private static final String CHAT_FEATURE_TAG =
"+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session\"";
@@ -1269,6 +1282,27 @@
cb.onNetworkResponse(networkResp, reason);
});
+ LinkedBlockingQueue<ImsRegistrationAttributes> mQueue = new LinkedBlockingQueue<>();
+ RegistrationManager.RegistrationCallback callback =
+ new RegistrationManager.RegistrationCallback() {
+ @Override
+ public void onRegistered(ImsRegistrationAttributes attr) {
+ mQueue.offer(attr);
+ }
+
+ @Override
+ public void onRegistering(ImsRegistrationAttributes attr) {}
+
+ @Override
+ public void onUnregistered(ImsReasonInfo info) {}
+
+ @Override
+ public void onTechnologyChangeFailed(int type, ImsReasonInfo info) {}
+ };
+ ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(imsRcsManager,
+ (m) -> m.registerImsRegistrationCallback(getContext().getMainExecutor(), callback),
+ ImsException.class);
+
// IMS registers
ArraySet<String> featureTags = new ArraySet<>();
// Chat Session
@@ -1277,6 +1311,7 @@
ImsRegistrationAttributes attr = new ImsRegistrationAttributes.Builder(
ImsRegistrationImplBase.REGISTRATION_TECH_LTE).setFeatureTags(featureTags).build();
sServiceConnector.getCarrierService().getImsRegistration().onRegistered(attr);
+ waitForParam(mQueue, attr);
// Notify framework that the RCS capability status is changed and PRESENCE UCE is enabled.
RcsImsCapabilities capabilities =
@@ -1298,11 +1333,20 @@
publishStateQueue.clear();
// Can not verify the pidf fully, but we can ensure that the service id for the feature is
- // contained in the XML.
- String pidf = waitForResult(pidfQueue);
- assertTrue("PIDF XML doesn't contain chat service-id", pidf.contains(CHAT_SERVICE_ID));
+ // contained in the XML. Multible PUBLISH requests may occur based on the state of the stack
+ // at the time of this call, retry to get correct PIDF up to 5 times.
+ boolean containsChatServiceId = false;
+ boolean containsFileTransferServiceId = false;
+ for (int retry = 0; retry < 5; retry++) {
+ String pidf = waitForResult(pidfQueue);
+ if (pidf == null) break;
+ containsChatServiceId = pidf.contains(CHAT_SERVICE_ID);
+ containsFileTransferServiceId = pidf.contains(FILE_TRANSFER_SERVICE_ID);
+ if (containsChatServiceId && containsFileTransferServiceId) break;
+ }
+ assertTrue("PIDF XML doesn't contain chat service-id", containsChatServiceId);
assertTrue("PIDF XML doesn't contain FT service-id",
- pidf.contains(FILE_TRANSFER_SERVICE_ID));
+ containsFileTransferServiceId);
// Trigger RcsFeature is unavailable
sServiceConnector.getCarrierService().getRcsFeature()
@@ -1432,6 +1476,129 @@
}
@Test
+ public void testRcsPublishThrottle() throws Exception {
+ if (!ImsUtils.shouldTestImsService()) {
+ return;
+ }
+
+ // Trigger carrier config change
+ PersistableBundle bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONED_BOOL, false);
+ bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, true);
+ overrideCarrierConfig(bundle);
+
+ ImsManager imsManager = getContext().getSystemService(ImsManager.class);
+ if (imsManager == null) {
+ fail("Cannot get the ImsManager");
+ }
+ ImsRcsManager imsRcsManager = imsManager.getImsRcsManager(sTestSub);
+ RcsUceAdapter uceAdapter = imsRcsManager.getUceAdapter();
+
+ // Connect to the ImsService
+ triggerFrameworkConnectToImsServiceBindMmTelAndRcsFeature();
+
+ TestRcsCapabilityExchangeImpl capExchangeImpl = sServiceConnector.getCarrierService()
+ .getRcsFeature().getRcsCapabilityExchangeImpl();
+
+ // Setup the response of the publish request.
+ capExchangeImpl.setPublishOperator((listener, pidfXml, cb) -> {
+ int networkResp = 200;
+ String reason = "OK";
+ listener.onPublish();
+ cb.onNetworkResponse(networkResp, reason);
+ });
+
+ // Register the callback to listen to the publish state changed
+ LinkedBlockingQueue<Integer> publishStateQueue = new LinkedBlockingQueue<>();
+ RcsUceAdapter.OnPublishStateChangedListener publishStateCallback =
+ new RcsUceAdapter.OnPublishStateChangedListener() {
+ public void onPublishStateChange(int state) {
+ publishStateQueue.offer(state);
+ }
+ };
+
+ final UiAutomation automation = InstrumentationRegistry.getInstrumentation()
+ .getUiAutomation();
+ try {
+ automation.adoptShellPermissionIdentity();
+ uceAdapter.addOnPublishStateChangedListener(getContext().getMainExecutor(),
+ publishStateCallback);
+ } finally {
+ automation.dropShellPermissionIdentity();
+ }
+
+ // Verify receiving the publish state callback immediately after registering the callback.
+ assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED,
+ waitForIntResult(publishStateQueue));
+ publishStateQueue.clear();
+
+ // IMS registers
+ sServiceConnector.getCarrierService().getImsRegistration().onRegistered(
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
+
+ // Verify the PUBLISH request should not be triggered and the publish state is still
+ // NOT_PUBLISHED even the IMS is registered.
+ if (publishStateQueue.poll() != null) {
+ fail("The PUBLISH request should not be triggered.");
+ }
+ try {
+ automation.adoptShellPermissionIdentity();
+ int publishState = uceAdapter.getUcePublishState();
+ assertEquals(RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED, publishState);
+ } finally {
+ automation.dropShellPermissionIdentity();
+ }
+
+ // Notify framework that the RCS capability status is changed and PRESENCE UCE is enabled.
+ RcsImsCapabilities capabilities =
+ new RcsImsCapabilities(RcsUceAdapter.CAPABILITY_TYPE_PRESENCE_UCE);
+ sServiceConnector.getCarrierService().getRcsFeature()
+ .notifyCapabilitiesStatusChanged(capabilities);
+
+ CapabilityExchangeEventListener eventListener =
+ sServiceConnector.getCarrierService().getRcsFeature().getEventListener();
+
+ // Notify framework to send the PUBLISH request to the ImsService.
+ eventListener.onRequestPublishCapabilities(
+ RcsUceAdapter.CAPABILITY_UPDATE_TRIGGER_MOVE_TO_WLAN);
+
+ // Verify that ImsService received the first PUBLISH
+ assertTrue(sServiceConnector.getCarrierService().waitForLatchCountdown(
+ TestImsService.LATCH_UCE_REQUEST_PUBLISH));
+ assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, waitForIntResult(publishStateQueue));
+ publishStateQueue.clear();
+ try {
+ automation.adoptShellPermissionIdentity();
+ int publishState = uceAdapter.getUcePublishState();
+ assertEquals(RcsUceAdapter.PUBLISH_STATE_OK, publishState);
+ } finally {
+ automation.dropShellPermissionIdentity();
+ }
+
+ // Now enable voice availability
+ sServiceConnector.getCarrierService().getMmTelFeature()
+ .notifyCapabilitiesStatusChanged(new MmTelFeature.MmTelCapabilities(
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE));
+
+ // The published just succeeded. The next publish should not be triggered immediately even
+ // the device capabilities has changed. Wait 3 seconds to verify the ImsService does not
+ // receive the publish request from the framework.
+ assertFalse(sServiceConnector.getCarrierService().waitForLatchCountdown(
+ TestImsService.LATCH_UCE_REQUEST_PUBLISH, 3000 /* 3 seconds */));
+
+ // However, if the request is triggered from the service, a new publish request should be
+ // sent immediately.
+ eventListener.onRequestPublishCapabilities(
+ RcsUceAdapter.CAPABILITY_UPDATE_TRIGGER_MOVE_TO_WLAN);
+
+ // Verify the ImsService receive the publish request
+ assertTrue(sServiceConnector.getCarrierService().waitForLatchCountdown(
+ TestImsService.LATCH_UCE_REQUEST_PUBLISH, 3000 /* Wait up to 3 seconds */));
+
+ overrideCarrierConfig(null);
+ }
+
+ @Test
public void testRcsManagerRegistrationCallback() throws Exception {
if (!ImsUtils.shouldTestImsService()) {
return;
@@ -2505,7 +2672,7 @@
try {
automan.adoptShellPermissionIdentity();
- provisioningManager.registerRcsProvisioningChangedCallback(
+ provisioningManager.registerRcsProvisioningCallback(
getContext().getMainExecutor(), cb);
} finally {
automan.dropShellPermissionIdentity();
@@ -2547,10 +2714,19 @@
res = waitForIntResult(actionQueue);
assertEquals(res, RCS_CONFIG_CB_RESET);
+ //verify callback when rcs pre-provisioning configuration received
+ TestAcsClient.getInstance().notifyPreProvisioning(TEST_RCS_PRE_CONFIG.getBytes());
+
+ res = waitForIntResult(actionQueue);
+ assertEquals(res, RCS_CONFIG_CB_PREPROV);
+ params = waitForResult(paramsQueue);
+ assertNotNull(params);
+ assertTrue(Arrays.equals(params.mConfig, TEST_RCS_PRE_CONFIG.getBytes()));
+
//unregister callback and verify not to receive callback any more
try {
automan.adoptShellPermissionIdentity();
- provisioningManager.unregisterRcsProvisioningChangedCallback(cb);
+ provisioningManager.unregisterRcsProvisioningCallback(cb);
} finally {
automan.dropShellPermissionIdentity();
}
@@ -2594,7 +2770,7 @@
try {
automan.adoptShellPermissionIdentity();
- provisioningManager.registerRcsProvisioningChangedCallback(
+ provisioningManager.registerRcsProvisioningCallback(
getContext().getMainExecutor(), cb);
} finally {
automan.dropShellPermissionIdentity();
@@ -2660,7 +2836,7 @@
//set default rcs config
try {
automan.adoptShellPermissionIdentity();
- provisioningManager.registerRcsProvisioningChangedCallback(
+ provisioningManager.registerRcsProvisioningCallback(
getContext().getMainExecutor(), cb);
} finally {
automan.dropShellPermissionIdentity();
@@ -2957,6 +3133,16 @@
public void onRemoved() {
actionQueue.offer(RCS_CONFIG_CB_DELETE);
}
+
+ @Override
+ public void onPreProvisioningReceived(byte[] configXml) {
+ actionQueue.offer(RCS_CONFIG_CB_PREPROV);
+ if (paramQueue != null) {
+ RcsProvisioningCallbackParams params = new RcsProvisioningCallbackParams();
+ params.mConfig = configXml;
+ paramQueue.offer(params);
+ }
+ }
};
}
// Waiting for ImsRcsManager to become public before implementing RegistrationManager,
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsUceAdapterTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsUceAdapterTest.java
index 6f91f7c..aafa6f8 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsUceAdapterTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsUceAdapterTest.java
@@ -1343,17 +1343,6 @@
bundle.putBoolean(CarrierConfigManager.KEY_USE_RCS_SIP_OPTIONS_BOOL, sipOptionsEnabled);
overrideCarrierConfig(bundle);
- // Enable the UCE setting.
- try {
- ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(
- uceAdapter, adapter -> adapter.setUceSettingEnabled(true), ImsException.class,
- "android.permission.MODIFY_PHONE_STATE");
- } catch (SecurityException e) {
- fail("setUceSettingEnabled should succeed with MODIFY_PHONE_STATE.");
- } catch (ImsException e) {
- fail("setUceSettingEnabled failed with code " + e);
- }
-
// Connect to the TestImsService
connectTestImsService();
}
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestAcsClient.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestAcsClient.java
index 1cdf186..513ce83 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestAcsClient.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestAcsClient.java
@@ -17,6 +17,7 @@
package android.telephony.ims.cts;
import android.telephony.ims.RcsClientConfiguration;
+import android.telephony.ims.stub.ImsConfigImplBase;
import java.util.concurrent.LinkedBlockingQueue;
@@ -29,6 +30,7 @@
private LinkedBlockingQueue<Integer> mActionQueue = new LinkedBlockingQueue<>();
private RcsClientConfiguration mRcc;
private byte[] mConfig;
+ private ImsConfigImplBase mImsConfigImpl;
private static TestAcsClient sInstance;
@@ -77,4 +79,12 @@
mRcc = null;
mConfig = null;
}
+
+ public void setImsConfigImpl(ImsConfigImplBase impl) {
+ mImsConfigImpl = impl;
+ }
+
+ public void notifyPreProvisioning(byte[] conf) {
+ mImsConfigImpl.notifyPreProvisioningReceived(conf);
+ }
}
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsConfig.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsConfig.java
index 22af8e4..36ef85e 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsConfig.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsConfig.java
@@ -26,6 +26,10 @@
private HashMap<Integer, Integer> mIntHashMap = new HashMap<>();
private HashMap<Integer, String> mStringHashMap = new HashMap<>();
+ TestImsConfig() {
+ TestAcsClient.getInstance().setImsConfigImpl(this);
+ }
+
@Override
public int setConfig(int item, int value) {
mIntHashMap.put(item, value);
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsService.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsService.java
index 912d95c..1712686 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsService.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsService.java
@@ -345,6 +345,23 @@
return complete;
}
+ public boolean waitForLatchCountdown(int latchIndex, long waitMs) {
+ boolean complete = false;
+ try {
+ CountDownLatch latch;
+ synchronized (mLock) {
+ latch = sLatches[latchIndex];
+ }
+ complete = latch.await(waitMs, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ // complete == false
+ }
+ synchronized (mLock) {
+ sLatches[latchIndex] = new CountDownLatch(1);
+ }
+ return complete;
+ }
+
public void countDownLatch(int latchIndex) {
synchronized (mLock) {
sLatches[latchIndex].countDown();
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestRcsCapabilityExchangeImpl.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestRcsCapabilityExchangeImpl.java
index 3983adf..032e58a 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestRcsCapabilityExchangeImpl.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestRcsCapabilityExchangeImpl.java
@@ -91,14 +91,6 @@
}
}
- public void subscribeForCapabilities(List<Uri> uris, SubscribeResponseCallback cb) {
- try {
- mSubscribeOperation.execute(uris, cb);
- } catch (ImsException e) {
- Log.w(LOG_TAG, "subscribeForCapabilities exception: " + e);
- }
- }
-
@Override
public void subscribeForCapabilities(Collection<Uri> uris, SubscribeResponseCallback cb) {
try {
diff --git a/tests/tests/telephony2/src/android/telephony2/cts/CallStateListenerPermissionTest.java b/tests/tests/telephony2/src/android/telephony2/cts/CallStateListenerPermissionTest.java
new file mode 100644
index 0000000..53bf8ec
--- /dev/null
+++ b/tests/tests/telephony2/src/android/telephony2/cts/CallStateListenerPermissionTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony2.cts;
+
+import static android.content.pm.PackageManager.FEATURE_TELEPHONY;
+
+import static junit.framework.Assert.fail;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+public class CallStateListenerPermissionTest {
+ private Context mContext;
+ private CountDownLatch mCallStateReceivedLatch = new CountDownLatch(1);
+
+ private boolean mReceivedCallback = false;
+ private Executor mSimpleExecutor = r -> r.run();
+
+ private class MyTelephonyCallback extends TelephonyCallback
+ implements TelephonyCallback.CallStateListener {
+
+ @Override
+ public void onCallStateChanged(int state) {
+ mReceivedCallback = true;
+ mCallStateReceivedLatch.countDown();
+ }
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getContext();
+ }
+
+ /**
+ * Ensures we get a valid callback on registration even though we don't have
+ * {@link android.Manifest.permission#READ_CALL_LOG} permission.
+ */
+ @Test
+ public void testRegisterWithNoCallLogPermission() {
+ if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
+ return;
+ }
+
+ TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
+ assertNotNull(telephonyManager);
+
+ MyTelephonyCallback callback = new MyTelephonyCallback();
+ telephonyManager.registerTelephonyCallback(mSimpleExecutor, callback);
+
+ try {
+ mCallStateReceivedLatch.await(10000, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("Expected to receive call state callback");
+ }
+
+ assertTrue(mReceivedCallback);
+ }
+}
diff --git a/tests/tests/telephonyprovider/AndroidManifest.xml b/tests/tests/telephonyprovider/AndroidManifest.xml
index e7c5e13..c3398c2 100755
--- a/tests/tests/telephonyprovider/AndroidManifest.xml
+++ b/tests/tests/telephonyprovider/AndroidManifest.xml
@@ -23,6 +23,7 @@
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
+ <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application>
<uses-library android:name="android.test.runner"/>
diff --git a/tests/tests/telephonyprovider/src/android/telephonyprovider/cts/ServiceStateTest.java b/tests/tests/telephonyprovider/src/android/telephonyprovider/cts/ServiceStateTest.java
new file mode 100644
index 0000000..f8f9665
--- /dev/null
+++ b/tests/tests/telephonyprovider/src/android/telephonyprovider/cts/ServiceStateTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephonyprovider.cts;
+
+import static android.provider.Telephony.ServiceStateTable.VOICE_REG_STATE;
+
+import static androidx.test.InstrumentationRegistry.getInstrumentation;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.Telephony;
+import android.telephony.TelephonyManager;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+
+@SmallTest
+public class ServiceStateTest {
+
+ private ContentResolver mContentResolver;
+ private TelephonyManager mTelephonyManager;
+
+ @Before
+ public void setupTestEnvironment() {
+ mContentResolver = getInstrumentation().getContext().getContentResolver();
+ mTelephonyManager =
+ getInstrumentation().getContext().getSystemService(TelephonyManager.class);
+ }
+
+ /**
+ * Asserts that the voice reg state is valid and matches TelephonyManager#getServiceState().
+ */
+ @Test
+ public void testGetVoiceRegState() {
+ Uri uri = Telephony.ServiceStateTable.CONTENT_URI;
+ assertThat(uri).isEqualTo(Uri.parse("content://service-state/"));
+
+ Cursor cursor = mContentResolver.query(uri, new String[] {VOICE_REG_STATE}, null, null);
+ assertThat(cursor.getCount()).isEqualTo(1);
+ cursor.moveToNext();
+
+ int voiceRegState = cursor.getInt(cursor.getColumnIndex(VOICE_REG_STATE));
+ assertThat(voiceRegState).isEqualTo(mTelephonyManager.getServiceState().getState());
+ }
+}
diff --git a/tests/tests/text/AndroidTest.xml b/tests/tests/text/AndroidTest.xml
index 2af8059..8c8c30d 100644
--- a/tests/tests/text/AndroidTest.xml
+++ b/tests/tests/text/AndroidTest.xml
@@ -21,6 +21,10 @@
<option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="CtsTextTestResourceData.apk" />
+ </target_preparer>
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
<option name="test-file-name" value="CtsTextTestCases.apk" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
diff --git a/tests/tests/text/resourceApk/Android.bp b/tests/tests/text/resourceApk/Android.bp
new file mode 100644
index 0000000..3f4d4c9
--- /dev/null
+++ b/tests/tests/text/resourceApk/Android.bp
@@ -0,0 +1,33 @@
+// 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test {
+ name: "CtsTextTestResourceData",
+ defaults: ["cts_defaults"],
+
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+
+ test_suites: [
+ "cts",
+ "general-tests",
+ "mts",
+ ],
+}
diff --git a/tests/tests/text/resourceApk/AndroidManifest.xml b/tests/tests/text/resourceApk/AndroidManifest.xml
new file mode 100644
index 0000000..8851b0d
--- /dev/null
+++ b/tests/tests/text/resourceApk/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.text.cts.resources" >
+
+ <application>
+ <activity android:name="android.text.cts.MainActivity" />
+ </application>
+
+</manifest>
diff --git a/tests/tests/text/resourceApk/assets/a3em.ttx b/tests/tests/text/resourceApk/assets/a3em.ttx
new file mode 100644
index 0000000..3a686b2
--- /dev/null
+++ b/tests/tests/text/resourceApk/assets/a3em.ttx
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="a"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="1.0"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="a" width="3000" lsb="93"/> <!-- 3em -->
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x0061" name="a" />
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="a" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/tests/tests/text/resourceApk/res/font/a3em.ttf b/tests/tests/text/resourceApk/res/font/a3em.ttf
new file mode 100644
index 0000000..03e1347
--- /dev/null
+++ b/tests/tests/text/resourceApk/res/font/a3em.ttf
Binary files differ
diff --git a/tests/tests/text/resourceApk/res/layout/textview_layout.xml b/tests/tests/text/resourceApk/res/layout/textview_layout.xml
new file mode 100644
index 0000000..72efdc4
--- /dev/null
+++ b/tests/tests/text/resourceApk/res/layout/textview_layout.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+ -->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="@font/a3em"
+ android:text="aaa"/>
+
diff --git a/tests/tests/text/resourceApk/src/android/text/cts/MainActivity.java b/tests/tests/text/resourceApk/src/android/text/cts/MainActivity.java
new file mode 100644
index 0000000..39850bb
--- /dev/null
+++ b/tests/tests/text/resourceApk/src/android/text/cts/MainActivity.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.cts;
+
+import android.app.Activity;
+
+public class MainActivity extends Activity {
+}
diff --git a/tests/tests/text/src/android/text/cts/FontResourceTest.java b/tests/tests/text/src/android/text/cts/FontResourceTest.java
new file mode 100644
index 0000000..5821772
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/FontResourceTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.text.cts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.platform.test.annotations.AppModeFull;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.RemoteViews;
+import android.widget.TextView;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@AppModeFull
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class FontResourceTest {
+
+ private static final int REMOTE_FONT_TEXT_WIDTH = 900;
+ private static final String RESOURCE_PACKAGE = "android.text.cts.resources";
+
+ private int getLayoutId() {
+ Context context = InstrumentationRegistry.getTargetContext();
+ int resID = 0;
+ try {
+ resID = context.createPackageContext(RESOURCE_PACKAGE, 0)
+ .getResources().getIdentifier(
+ "textview_layout",
+ "layout",
+ RESOURCE_PACKAGE);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ assertThat(resID).isNotEqualTo(0);
+ return resID;
+ }
+
+ private TextView inflateWithRemoteViews(Context ctx) {
+ RemoteViews remoteViews = new RemoteViews(RESOURCE_PACKAGE, getLayoutId());
+ return (TextView) remoteViews.apply(ctx, null);
+ }
+
+ private TextView inflateWithInflator(Context ctx) {
+ LayoutInflater inflater = LayoutInflater.from(ctx);
+ return (TextView) inflater.inflate(getLayoutId(), null);
+ }
+
+ private int measureText(TextView textView) {
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 100f); // make 1em = 100px
+ textView.measure(
+ View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
+ View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
+ return textView.getLayout().getWidth();
+ }
+
+ @Test
+ public void testRemoteResource() throws Exception {
+ Context context = InstrumentationRegistry.getTargetContext();
+
+ Context freeContext = context.createPackageContext(
+ RESOURCE_PACKAGE, Context.CONTEXT_IGNORE_SECURITY);
+ Context restrictContext = context.createPackageContext(
+ RESOURCE_PACKAGE, Context.CONTEXT_RESTRICTED);
+
+ // This expectation is for verifying the precondition of the test case. If the context
+ // ignores the security, loads the custom font and TextView gives the width with it. If the
+ // context is restricted, the custom font should not be loaded and TextView gives the width
+ // different from the one with the custom font.
+ // The custom font has 3em for "a" character. The text is "aaa", then 9em = 900px is the
+ // expected width.
+ assertThat(measureText(inflateWithInflator(freeContext)))
+ .isEqualTo(REMOTE_FONT_TEXT_WIDTH);
+ assertThat(measureText(inflateWithInflator(restrictContext)))
+ .isNotEqualTo(REMOTE_FONT_TEXT_WIDTH);
+
+ // The RemoteView should ignore the custom font files.
+ assertThat(measureText(inflateWithRemoteViews(context)))
+ .isNotEqualTo(REMOTE_FONT_TEXT_WIDTH);
+ }
+}
diff --git a/tests/tests/textclassifier/Android.bp b/tests/tests/textclassifier/Android.bp
index 5b32fa9..18bc8e2 100644
--- a/tests/tests/textclassifier/Android.bp
+++ b/tests/tests/textclassifier/Android.bp
@@ -29,6 +29,7 @@
],
libs: ["android.test.base"],
static_libs: [
+ "androidx.appcompat_appcompat",
"androidx.test.core",
"androidx.test.rules",
"compatibility-device-util-axt",
@@ -43,5 +44,5 @@
],
resource_dirs: ["res"],
sdk_version: "test_current",
- min_sdk_version: "29",
+ min_sdk_version: "30",
}
diff --git a/tests/tests/textclassifier/AndroidManifest.xml b/tests/tests/textclassifier/AndroidManifest.xml
index fc56e05..94725ea 100644
--- a/tests/tests/textclassifier/AndroidManifest.xml
+++ b/tests/tests/textclassifier/AndroidManifest.xml
@@ -18,6 +18,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.view.textclassifier.cts">
+ <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="31" />
+
<application android:label="TextClassifier TestCase">
<uses-library android:name="android.test.runner"/>
diff --git a/tests/tests/textclassifier/QueryTextClassifierServiceActivity/Android.bp b/tests/tests/textclassifier/QueryTextClassifierServiceActivity/Android.bp
index e8583e1..f546663 100644
--- a/tests/tests/textclassifier/QueryTextClassifierServiceActivity/Android.bp
+++ b/tests/tests/textclassifier/QueryTextClassifierServiceActivity/Android.bp
@@ -29,5 +29,5 @@
"mts"
],
srcs: ["src/**/*.java"],
- min_sdk_version: "29",
+ min_sdk_version: "30",
}
diff --git a/tests/tests/textclassifier/QueryTextClassifierServiceActivity/AndroidManifest.xml b/tests/tests/textclassifier/QueryTextClassifierServiceActivity/AndroidManifest.xml
index f6e49a6..24b566d 100644
--- a/tests/tests/textclassifier/QueryTextClassifierServiceActivity/AndroidManifest.xml
+++ b/tests/tests/textclassifier/QueryTextClassifierServiceActivity/AndroidManifest.xml
@@ -18,6 +18,8 @@
package="android.textclassifier.cts2"
android:targetSandboxVersion="2">
+ <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="31" />
+
<application>
<uses-library android:name="android.test.runner" />
diff --git a/tests/tests/textclassifier/src/android/view/textclassifier/cts/CtsTextClassifierService.java b/tests/tests/textclassifier/src/android/view/textclassifier/cts/CtsTextClassifierService.java
index d3d19bb..b88b7d7 100644
--- a/tests/tests/textclassifier/src/android/view/textclassifier/cts/CtsTextClassifierService.java
+++ b/tests/tests/textclassifier/src/android/view/textclassifier/cts/CtsTextClassifierService.java
@@ -34,6 +34,7 @@
import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextSelection;
+import androidx.core.os.BuildCompat;
import androidx.annotation.NonNull;
import java.util.ArrayList;
@@ -96,7 +97,7 @@
handleRequest(sessionId, "onSuggestSelection");
TextSelection.Builder textSelection =
new TextSelection.Builder(request.getStartIndex(), request.getEndIndex());
- if (request.shouldIncludeTextClassification()) {
+ if (BuildCompat.isAtLeastS() && request.shouldIncludeTextClassification()) {
textSelection.setTextClassification(createTextClassification());
}
callback.onSuccess(textSelection.build());
diff --git a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextClassifierServiceSwapTest.java b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextClassifierServiceSwapTest.java
index 3068260..a95460b 100644
--- a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextClassifierServiceSwapTest.java
+++ b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextClassifierServiceSwapTest.java
@@ -19,6 +19,8 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assume.assumeTrue;
+
import android.app.Instrumentation;
import android.app.PendingIntent;
import android.content.ComponentName;
@@ -34,6 +36,7 @@
import android.view.textclassifier.TextLanguage;
import android.view.textclassifier.TextSelection;
+import androidx.core.os.BuildCompat;
import androidx.test.InstrumentationRegistry;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;
@@ -136,6 +139,8 @@
@Test
public void testResourceIconsRewrittenToContentUriIcons_suggestSelection() throws Exception {
+ assumeTrue(BuildCompat.isAtLeastS());
+
final TextClassifier tc = ApplicationProvider.getApplicationContext()
.getSystemService(TextClassificationManager.class)
.getTextClassifier();
diff --git a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextClassifierTest.java b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextClassifierTest.java
index af4f8bf..266a9f5 100644
--- a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextClassifierTest.java
+++ b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextClassifierTest.java
@@ -40,6 +40,7 @@
import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextSelection;
+import androidx.core.os.BuildCompat;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -302,7 +303,9 @@
assertTrue(confidenceScore >= 0);
assertTrue(confidenceScore <= 1);
}
- assertThat(selection.getTextClassification()).isNull();
+ if (BuildCompat.isAtLeastS()) {
+ assertThat(selection.getTextClassification()).isNull();
+ }
}
private static void assertValidResult(TextClassification classification) {
diff --git a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextSelectionTest.java b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextSelectionTest.java
index 5152697..e2f79af 100644
--- a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextSelectionTest.java
+++ b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextSelectionTest.java
@@ -30,6 +30,7 @@
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextSelection;
+import androidx.core.os.BuildCompat;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -60,13 +61,15 @@
final float addressScore = 0.1f;
final float emailScore = 0.9f;
- final TextSelection original = new TextSelection.Builder(START, END)
+ final TextSelection.Builder originalBuilder = new TextSelection.Builder(START, END)
.setEntityType(TextClassifier.TYPE_ADDRESS, addressScore)
.setEntityType(TextClassifier.TYPE_EMAIL, emailScore)
.setId(ID)
- .setExtras(BUNDLE)
- .setTextClassification(TEXT_CLASSIFICATION)
- .build();
+ .setExtras(BUNDLE);
+ if (BuildCompat.isAtLeastS()) {
+ originalBuilder.setTextClassification(TEXT_CLASSIFICATION);
+ }
+ final TextSelection original = originalBuilder.build();
TextSelection selection = parcelizeDeparcelize(original, TextSelection.CREATOR);
@@ -82,7 +85,9 @@
assertThat(selection.getConfidenceScore("random_type")).isEqualTo(0);
assertThat(selection.getId()).isEqualTo(ID);
assertThat(selection.getExtras().getString(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE);
- assertThat(selection.getTextClassification().getText()).isEqualTo(TEXT);
+ if (BuildCompat.isAtLeastS()) {
+ assertThat(selection.getTextClassification().getText()).isEqualTo(TEXT);
+ }
}
@Test
@@ -116,7 +121,9 @@
assertThat(selection.getEntityCount()).isEqualTo(0);
assertThat(selection.getId()).isNull();
assertThat(selection.getExtras().isEmpty()).isTrue();
- assertThat(selection.getTextClassification()).isNull();
+ if (BuildCompat.isAtLeastS()) {
+ assertThat(selection.getTextClassification()).isNull();
+ }
}
@Test
@@ -158,11 +165,14 @@
@Test
public void testTextSelectionRequest() {
- final TextSelection.Request original = new TextSelection.Request.Builder(TEXT, START, END)
+ final TextSelection.Request.Builder originalBuilder =
+ new TextSelection.Request.Builder(TEXT, START, END)
.setDefaultLocales(LOCALES)
- .setExtras(BUNDLE)
- .setIncludeTextClassification(true)
- .build();
+ .setExtras(BUNDLE);
+ if (BuildCompat.isAtLeastS()) {
+ originalBuilder.setIncludeTextClassification(true);
+ }
+ final TextSelection.Request original = originalBuilder.build();
TextSelection.Request request =
parcelizeDeparcelize(original, TextSelection.Request.CREATOR);
@@ -172,7 +182,9 @@
assertThat(request.getEndIndex()).isEqualTo(END);
assertThat(request.getDefaultLocales()).isEqualTo(LOCALES);
assertThat(request.getExtras().getString(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE);
- assertThat(request.shouldIncludeTextClassification()).isEqualTo(true);
+ if (BuildCompat.isAtLeastS()) {
+ assertThat(request.shouldIncludeTextClassification()).isEqualTo(true);
+ }
}
@Test
@@ -198,7 +210,9 @@
assertThat(request.getDefaultLocales()).isNull();
assertThat(request.getExtras().isEmpty()).isTrue();
- assertThat(request.shouldIncludeTextClassification()).isFalse();
+ if (BuildCompat.isAtLeastS()) {
+ assertThat(request.shouldIncludeTextClassification()).isFalse();
+ }
}
private static <T extends Parcelable> T parcelizeDeparcelize(
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 174b2f5..29e5162 100644
--- a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextViewIntegrationTest.java
+++ b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextViewIntegrationTest.java
@@ -53,6 +53,7 @@
import android.view.textclassifier.TextSelection;
import android.widget.TextView;
+import androidx.core.os.BuildCompat;
import androidx.test.core.app.ActivityScenario;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.espresso.ViewInteraction;
@@ -153,6 +154,7 @@
@Test
public void smartSelection_suggestSelectionNotIncludeTextClassification() throws Exception {
+ Assume.assumeTrue(BuildCompat.isAtLeastS());
smartSelectionInternal();
assertThat(mSimpleTextClassifier.getClassifyTextInvocationCount()).isEqualTo(1);
@@ -160,6 +162,7 @@
@Test
public void smartSelection_suggestSelectionIncludeTextClassification() throws Exception {
+ Assume.assumeTrue(BuildCompat.isAtLeastS());
mSimpleTextClassifier.setIncludeTextClassification(true);
smartSelectionInternal();
@@ -168,6 +171,7 @@
@Test
public void smartSelection_cancelSelectionDoesNotInvokeClassifyText() throws Exception {
+ Assume.assumeTrue(BuildCompat.isAtLeastS());
smartSelectionInternal();
onView(withId(R.id.textview)).perform(TextViewActions.tapOnTextAtIndex(0));
Thread.sleep(1000);
diff --git a/tests/tests/time/src/android/time/cts/TimeManagerTest.java b/tests/tests/time/src/android/time/cts/TimeManagerTest.java
index cf59f48..94ab334 100644
--- a/tests/tests/time/src/android/time/cts/TimeManagerTest.java
+++ b/tests/tests/time/src/android/time/cts/TimeManagerTest.java
@@ -21,6 +21,7 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import android.app.time.Capabilities;
import android.app.time.TimeManager;
import android.app.time.TimeZoneCapabilities;
import android.app.time.TimeZoneCapabilitiesAndConfig;
@@ -86,7 +87,7 @@
.setAutoDetectionEnabled(newAutoDetectionEnabledValue)
.build();
if (capabilities.getConfigureAutoDetectionEnabledCapability()
- >= TimeZoneCapabilities.CAPABILITY_NOT_APPLICABLE) {
+ >= Capabilities.CAPABILITY_NOT_APPLICABLE) {
assertTrue(timeManager.updateTimeZoneConfiguration(configUpdate));
expectedListenerTriggerCount++;
waitForListenerCallbackCount(
@@ -112,7 +113,7 @@
.setGeoDetectionEnabled(newGeoDetectionEnabledValue)
.build();
if (capabilities.getConfigureGeoDetectionEnabledCapability()
- >= TimeZoneCapabilities.CAPABILITY_NOT_APPLICABLE) {
+ >= Capabilities.CAPABILITY_NOT_APPLICABLE) {
assertTrue(timeManager.updateTimeZoneConfiguration(configUpdate));
expectedListenerTriggerCount++;
waitForListenerCallbackCount(
diff --git a/tests/tests/uirendering/res/drawable-nodpi/padding_0.9.png b/tests/tests/uirendering/res/drawable-nodpi/padding_0.9.png
new file mode 100644
index 0000000..0127bf4
--- /dev/null
+++ b/tests/tests/uirendering/res/drawable-nodpi/padding_0.9.png
Binary files differ
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/EdgeEffectTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/EdgeEffectTests.java
index b1e3116..a6b1761 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/EdgeEffectTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/EdgeEffectTests.java
@@ -25,6 +25,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.app.compat.CompatChanges;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BlendMode;
@@ -63,6 +64,8 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
public class EdgeEffectTests extends ActivityTestBase {
+ static final long USE_STRETCH_EDGE_EFFECT_BY_DEFAULT = 171228096L;
+ static final long USE_STRETCH_EDGE_EFFECT_FOR_SUPPORTED = 178807038L;
private static final int WIDTH = 90;
private static final int HEIGHT = 90;
@@ -117,6 +120,7 @@
EdgeEffect edgeEffect = new EdgeEffect(getContext());
edgeEffect.setSize(WIDTH, HEIGHT);
edgeEffect.setColor(Color.RED);
+ edgeEffect.setType(EdgeEffect.TYPE_GLOW);
assertEquals(Color.RED, edgeEffect.getColor());
initializer.initialize(edgeEffect);
edgeEffect.draw(canvas);
@@ -213,8 +217,10 @@
public void testEdgeEffectTypeAccessors() {
EdgeEffect effect = new EdgeEffect(getContext());
- // It defaults to glow without any attribute set
- assertEquals(EdgeEffect.TYPE_GLOW, effect.getType());
+ int expectedStartType = (CompatChanges.isChangeEnabled(USE_STRETCH_EDGE_EFFECT_BY_DEFAULT)
+ || CompatChanges.isChangeEnabled(USE_STRETCH_EDGE_EFFECT_FOR_SUPPORTED))
+ ? EdgeEffect.TYPE_STRETCH : EdgeEffect.TYPE_GLOW;
+ assertEquals(expectedStartType, effect.getType());
effect.setType(EdgeEffect.TYPE_STRETCH);
assertEquals(EdgeEffect.TYPE_STRETCH, effect.getType());
}
@@ -287,9 +293,9 @@
@Test
public void testStretchTop() {
- RenderNode renderNode = drawStretchEffect(0.2f, 0.2f, 0f);
- Rect innerRect = new Rect(0, 0, WIDTH, HEIGHT / 2 + 5);
- Rect outerRect = new Rect(0, HEIGHT / 2 + 20, WIDTH, HEIGHT);
+ RenderNode renderNode = drawStretchEffect(1f, 1f, 0f);
+ Rect innerRect = new Rect(0, 0, WIDTH, HEIGHT / 2 + 1);
+ Rect outerRect = new Rect(0, HEIGHT / 2 + 5, WIDTH, HEIGHT);
createTest()
.addCanvasClientWithoutUsingPicture((canvas, width, height) -> {
canvas.drawRenderNode(renderNode);
@@ -306,7 +312,7 @@
@Test
public void testStretchBottom() {
- RenderNode renderNode = drawStretchEffect(0.2f, 0.2f, 180f);
+ RenderNode renderNode = drawStretchEffect(1f, 1f, 180f);
Rect innerRect = new Rect(0, 0, WIDTH, 1);
Rect outerRect = new Rect(0, (HEIGHT / 2) - 1, WIDTH, HEIGHT / 2);
createTest()
@@ -323,6 +329,31 @@
));
}
+ @Test
+ public void testAbsorbThenDrawDoesNotCrash() {
+ MockVsyncHelper.runOnVsyncThread(() -> {
+ EdgeEffect edgeEffect = new EdgeEffect(getContext());
+ edgeEffect.setType(EdgeEffect.TYPE_STRETCH);
+ edgeEffect.onPullDistance(1f, 1f);
+ edgeEffect.onAbsorb(100);
+ edgeEffect.onRelease();
+
+ nextFrame();
+
+ edgeEffect.setSize(10, 10);
+ RenderNode node = new RenderNode("");
+ node.setPosition(0, 0, TEST_WIDTH, TEST_HEIGHT);
+ RecordingCanvas canvas = node.beginRecording();
+ Paint paint = new Paint();
+ paint.setColor(Color.RED);
+ canvas.drawRect(0f, 0f, TEST_WIDTH, TEST_HEIGHT, paint);
+
+ canvas.rotate(90, TEST_WIDTH / 2f, TEST_HEIGHT / 2f);
+ edgeEffect.draw(canvas);
+ node.endRecording();
+ });
+ }
+
/**
* When a TYPE_STRETCH is used, a held pull should not retract.
*/
@@ -485,6 +516,7 @@
ArgumentCaptor<Paint> captor = ArgumentCaptor.forClass(Paint.class);
EdgeEffect edgeEffect = new EdgeEffect(getContext());
edgeEffect.setSize(200, 200);
+ edgeEffect.setType(EdgeEffect.TYPE_GLOW);
initializer.initialize(edgeEffect);
edgeEffect.draw(canvas);
verify(canvas).drawCircle(anyFloat(), anyFloat(), anyFloat(), captor.capture());
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/NinePatchTests.kt b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/NinePatchTests.kt
new file mode 100644
index 0000000..a190501
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/NinePatchTests.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.uirendering.cts.testclasses
+
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.ImageDecoder
+import android.graphics.Paint
+import android.graphics.Rect
+import android.graphics.NinePatch
+import android.uirendering.cts.R
+import android.uirendering.cts.bitmapcomparers.ExactComparer
+import android.uirendering.cts.testinfrastructure.ActivityTestBase
+import android.uirendering.cts.testinfrastructure.CanvasClient
+import androidx.test.runner.AndroidJUnit4
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+@RunWith(AndroidJUnit4::class)
+class NinePatchTests : ActivityTestBase() {
+
+ class NinePatchCanvasClient(
+ private val ninepatch: NinePatch,
+ private val paint: Paint?
+ ) : CanvasClient {
+ override fun draw(canvas: Canvas, width: Int, height: Int) {
+ val scale = 6.0f
+ canvas.scale(scale, scale)
+ ninepatch.draw(canvas, Rect(0, 0, 15, 15), paint)
+ }
+ }
+
+ @Test
+ fun testNinePatchAlwaysFiltersInHW() {
+ val np = with(ImageDecoder.createSource(activity.resources, R.drawable.padding_0)) {
+ val bitmap = ImageDecoder.decodeBitmap(this)
+ NinePatch(bitmap, bitmap.ninePatchChunk)
+ }
+
+ val hw = true
+ with(createTest()) {
+ for (paint in arrayOf(null, Paint(), Paint().apply { isFilterBitmap = false })) {
+ addCanvasClientWithoutUsingPicture(NinePatchCanvasClient(np, paint), hw)
+ }
+ runWithComparer(ExactComparer())
+ }
+
+ np.bitmap.recycle()
+ }
+
+ @Test
+ fun testNinePatchRespectsFilterBitmapFlagInSW() {
+ val np = with(ImageDecoder.createSource(activity.resources, R.drawable.padding_0)) {
+ val bitmap = ImageDecoder.decodeBitmap(this) {
+ decoder, info, src ->
+ decoder.allocator = ImageDecoder.ALLOCATOR_SOFTWARE
+ }
+ NinePatch(bitmap, bitmap.ninePatchChunk)
+ }
+
+ fun makeBitmap(paint: Paint?) = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT,
+ Bitmap.Config.ARGB_8888).apply {
+ val canvas = Canvas(this)
+ NinePatchCanvasClient(np, paint).draw(canvas, TEST_WIDTH, TEST_HEIGHT)
+ }
+
+ val filtered = makeBitmap(Paint())
+ val unfiltered = makeBitmap(Paint().apply { isFilterBitmap = false })
+ val noPaint = makeBitmap(null)
+
+ assertFalse(filtered.sameAs(unfiltered))
+ assertTrue(unfiltered.sameAs(noPaint))
+
+ for (bitmap in arrayOf(filtered, unfiltered, noPaint, np.bitmap)) {
+ bitmap.recycle()
+ }
+ }
+}
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
index 83b09c1..a243bb3 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
@@ -218,12 +218,16 @@
Bitmap idealBitmap = captureRenderSpec(mTestCases.remove(0));
- for (TestCase testCase : mTestCases) {
- Bitmap testCaseBitmap = captureRenderSpec(testCase);
- mBitmapAsserter.assertBitmapsAreSimilar(idealBitmap, testCaseBitmap, bitmapComparer,
- getName(), testCase.getDebugString());
+ try {
+ for (TestCase testCase : mTestCases) {
+ Bitmap testCaseBitmap = captureRenderSpec(testCase);
+ mBitmapAsserter.assertBitmapsAreSimilar(idealBitmap, testCaseBitmap,
+ bitmapComparer,
+ getName(), testCase.getDebugString());
+ }
+ } finally {
+ getActivity().reset();
}
- getActivity().reset();
}
/**
@@ -235,12 +239,15 @@
throw new IllegalStateException("Need at least one test to run");
}
- for (TestCase testCase : mTestCases) {
- Bitmap testCaseBitmap = captureRenderSpec(testCase);
- mBitmapAsserter.assertBitmapIsVerified(testCaseBitmap, bitmapVerifier,
- getName(), testCase.getDebugString());
+ try {
+ for (TestCase testCase : mTestCases) {
+ Bitmap testCaseBitmap = captureRenderSpec(testCase);
+ mBitmapAsserter.assertBitmapIsVerified(testCaseBitmap, bitmapVerifier,
+ getName(), testCase.getDebugString());
+ }
+ } finally {
+ getActivity().reset();
}
- getActivity().reset();
}
private static final int VERIFY_ANIMATION_LOOP_COUNT = 20;
@@ -258,21 +265,24 @@
throw new IllegalStateException("Need at least one test to run");
}
- for (TestCase testCase : mTestCases) {
- TestPositionInfo testPositionInfo = runRenderSpec(testCase);
+ try {
+ for (TestCase testCase : mTestCases) {
+ TestPositionInfo testPositionInfo = runRenderSpec(testCase);
- for (int i = 0; i < VERIFY_ANIMATION_LOOP_COUNT; i++) {
- try {
- Thread.sleep(VERIFY_ANIMATION_SLEEP_MS);
- } catch (InterruptedException e) {
- e.printStackTrace();
+ for (int i = 0; i < VERIFY_ANIMATION_LOOP_COUNT; i++) {
+ try {
+ Thread.sleep(VERIFY_ANIMATION_SLEEP_MS);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Bitmap testCaseBitmap = takeScreenshot(testPositionInfo);
+ mBitmapAsserter.assertBitmapIsVerified(testCaseBitmap, bitmapVerifier,
+ getName(), testCase.getDebugString());
}
- Bitmap testCaseBitmap = takeScreenshot(testPositionInfo);
- mBitmapAsserter.assertBitmapIsVerified(testCaseBitmap, bitmapVerifier,
- getName(), testCase.getDebugString());
}
+ } finally {
+ getActivity().reset();
}
- getActivity().reset();
}
/**
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/util/BitmapDumper.java b/tests/tests/uirendering/src/android/uirendering/cts/util/BitmapDumper.java
index adc1b06..b5f7d76 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/util/BitmapDumper.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/util/BitmapDumper.java
@@ -87,6 +87,16 @@
return new File(testDirectory, testName + "_" + type + ".png");
}
+ private static String bypassContentProvider(File file) {
+ // TradeFed currently insists on bouncing off of a content provider for the path
+ // we are using, but that content provider will never have permissions
+ // Since we want to avoid needing to use requestLegacyStorage & there's currently no
+ // option to tell TF to not use the content provider, just break its file
+ // detection pattern
+ // b/183140644
+ return "/." + file.getAbsolutePath();
+ }
+
/**
* Saves two files, one the capture of an ideal drawing, and one the capture of the tested
* drawing. The third file saved is a bitmap that is returned from the given visualizer's
@@ -116,9 +126,10 @@
saveBitmap(visualizerBitmap, visualizerFile);
Bundle report = new Bundle();
- report.putString(KEY_PREFIX + TYPE_IDEAL_RENDERING, idealFile.getAbsolutePath());
- report.putString(KEY_PREFIX + TYPE_TESTED_RENDERING, testedFile.getAbsolutePath());
- report.putString(KEY_PREFIX + TYPE_VISUALIZER_RENDERING, visualizerFile.getAbsolutePath());
+ report.putString(KEY_PREFIX + TYPE_IDEAL_RENDERING, bypassContentProvider(idealFile));
+ report.putString(KEY_PREFIX + TYPE_TESTED_RENDERING, bypassContentProvider(testedFile));
+ report.putString(KEY_PREFIX + TYPE_VISUALIZER_RENDERING,
+ bypassContentProvider(visualizerFile));
sInstrumentation.sendStatus(INST_STATUS_IN_PROGRESS, report);
}
@@ -130,7 +141,7 @@
File capture = getFile(className, testName, TYPE_SINGULAR);
saveBitmap(bitmap, capture);
Bundle report = new Bundle();
- report.putString(KEY_PREFIX + TYPE_SINGULAR, capture.getAbsolutePath());
+ report.putString(KEY_PREFIX + TYPE_SINGULAR, bypassContentProvider(capture));
sInstrumentation.sendStatus(INST_STATUS_IN_PROGRESS, report);
}
diff --git a/tests/tests/uirendering27/res/values/themes.xml b/tests/tests/uirendering27/res/values/themes.xml
index e75376b..fa5c591 100644
--- a/tests/tests/uirendering27/res/values/themes.xml
+++ b/tests/tests/uirendering27/res/values/themes.xml
@@ -19,6 +19,7 @@
<item name="android:windowFullscreen">true</item>
<item name="android:windowOverscan">true</item>
<item name="android:fadingEdge">none</item>
+ <item name="android:windowDisablePreview">true</item>
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowContentTransitions">false</item>
<item name="android:windowAnimationStyle">@null</item>
diff --git a/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java b/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
index a5646fa..81e0a01 100644
--- a/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
+++ b/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
@@ -186,9 +186,9 @@
});
}
- /** Test implementation of VcnNetworkPolicyListener for verification purposes. */
- private static class TestVcnNetworkPolicyListener
- implements VcnManager.VcnNetworkPolicyListener {
+ /** Test implementation of VcnNetworkPolicyChangeListener for verification purposes. */
+ private static class TestVcnNetworkPolicyChangeListener
+ implements VcnManager.VcnNetworkPolicyChangeListener {
private final CompletableFuture<Void> mFutureOnPolicyChanged = new CompletableFuture<>();
@Override
@@ -202,21 +202,24 @@
}
@Test(expected = SecurityException.class)
- public void testAddVcnNetworkPolicyListener_noNetworkFactoryPermission() throws Exception {
- final TestVcnNetworkPolicyListener listener = new TestVcnNetworkPolicyListener();
+ public void testAddVcnNetworkPolicyChangeListener_noNetworkFactoryPermission()
+ throws Exception {
+ final TestVcnNetworkPolicyChangeListener listener =
+ new TestVcnNetworkPolicyChangeListener();
try {
- mVcnManager.addVcnNetworkPolicyListener(INLINE_EXECUTOR, listener);
+ mVcnManager.addVcnNetworkPolicyChangeListener(INLINE_EXECUTOR, listener);
} finally {
- mVcnManager.removeVcnNetworkPolicyListener(listener);
+ mVcnManager.removeVcnNetworkPolicyChangeListener(listener);
}
}
@Test
- public void testRemoveVcnNetworkPolicyListener() {
- final TestVcnNetworkPolicyListener listener = new TestVcnNetworkPolicyListener();
+ public void testRemoveVcnNetworkPolicyChangeListener_noNetworkFactoryPermission() {
+ final TestVcnNetworkPolicyChangeListener listener =
+ new TestVcnNetworkPolicyChangeListener();
- mVcnManager.removeVcnNetworkPolicyListener(listener);
+ mVcnManager.removeVcnNetworkPolicyChangeListener(listener);
}
@Test(expected = SecurityException.class)
diff --git a/tests/tests/view/surfacevalidator/src/android/view/cts/surfacevalidator/CapturedActivity.java b/tests/tests/view/surfacevalidator/src/android/view/cts/surfacevalidator/CapturedActivity.java
index b9079e9..c8fa63c 100644
--- a/tests/tests/view/surfacevalidator/src/android/view/cts/surfacevalidator/CapturedActivity.java
+++ b/tests/tests/view/surfacevalidator/src/android/view/cts/surfacevalidator/CapturedActivity.java
@@ -151,7 +151,6 @@
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), PERMISSION_CODE);
- dismissPermissionDialog();
mProjectionServiceBound = true;
}
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
index 6f89c28..8d7f8aa 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
@@ -33,6 +33,7 @@
import static org.junit.Assert.fail;
import android.os.SystemClock;
+import android.speech.SpeechRecognizer;
import android.support.test.uiautomator.UiDevice;
import android.util.Log;
@@ -60,11 +61,11 @@
private static final long WAIT_TIMEOUT_MS = 30000L; // 30 secs
private static final long SEQUENCE_TEST_WAIT_TIMEOUT_MS = 5000L;
- private final String CTS_VOICE_RECOGNITION_SERVICE =
+ private static final String CTS_VOICE_RECOGNITION_SERVICE =
"android.recognitionservice.service/android.recognitionservice.service"
+ ".CtsVoiceRecognitionService";
- private final String IN_PACKAGE_RECOGNITION_SERVICE =
+ private static final String IN_PACKAGE_RECOGNITION_SERVICE =
"android.voicerecognition.cts/android.voicerecognition.cts.CtsRecognitionService";
@Rule
@@ -74,7 +75,7 @@
private UiDevice mUiDevice;
private SpeechRecognitionActivity mActivity;
- abstract void setCurrentRecognizer(String recognizer);
+ abstract void setCurrentRecognizer(SpeechRecognizer recognizer, String component);
abstract boolean isOnDeviceTest();
@@ -91,7 +92,7 @@
@Test
public void testStartListening() throws Throwable {
- setCurrentRecognizer(CTS_VOICE_RECOGNITION_SERVICE);
+ setCurrentRecognizer(mActivity.mRecognizer, CTS_VOICE_RECOGNITION_SERVICE);
mUiDevice.waitForIdle();
mActivity.startListening();
@@ -278,7 +279,7 @@
List<CallbackMethod> callbackMethodInstructions,
List<Boolean> expectedRecognizerServiceMethodsToPropagate,
List<CallbackMethod> expectedClientCallbackMethods) {
- setCurrentRecognizer(IN_PACKAGE_RECOGNITION_SERVICE);
+ setCurrentRecognizer(mActivity.mRecognizer, IN_PACKAGE_RECOGNITION_SERVICE);
mUiDevice.waitForIdle();
mActivity.mCallbackMethodsInvoked.clear();
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/DefaultRecognitionServiceTest.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/DefaultRecognitionServiceTest.java
index b8e3116..7663c3d 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/DefaultRecognitionServiceTest.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/DefaultRecognitionServiceTest.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.provider.Settings;
+import android.speech.SpeechRecognizer;
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
@@ -46,10 +47,10 @@
mOriginalVoiceRecognizer);
@Override
- protected void setCurrentRecognizer(String recognizer) {
+ protected void setCurrentRecognizer(SpeechRecognizer recognizer, String component) {
runWithShellPermissionIdentity(
() -> Settings.Secure.putString(mContext.getContentResolver(),
- VOICE_RECOGNITION_SERVICE, recognizer));
+ VOICE_RECOGNITION_SERVICE, component));
}
@Override
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/OnDeviceRecognitionServiceTest.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/OnDeviceRecognitionServiceTest.java
new file mode 100644
index 0000000..22a10df
--- /dev/null
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/OnDeviceRecognitionServiceTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.voicerecognition.cts;
+
+import static androidx.test.InstrumentationRegistry.getInstrumentation;
+
+import static com.android.compatibility.common.util.ShellUtils.runShellCommand;
+
+import android.content.ComponentName;
+import android.speech.SpeechRecognizer;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+
+/** Recognition service tests for a default speech recognition service. */
+@RunWith(AndroidJUnit4.class)
+public final class OnDeviceRecognitionServiceTest extends AbstractRecognitionServiceTest {
+ private static final String TAG = OnDeviceRecognitionServiceTest.class.getSimpleName();
+
+ private SpeechRecognizer mRecognizer;
+
+ @Before
+ public void setUp() {
+ getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(
+ "android.permission.MANAGE_SPEECH_RECOGNITION");
+ }
+
+ @After
+ public void tearDown() {
+ mRecognizer.setTemporaryOnDeviceRecognizer(null);
+ mRecognizer = null;
+
+ getInstrumentation().getUiAutomation().dropShellPermissionIdentity();
+ }
+
+ @Override
+ protected void setCurrentRecognizer(SpeechRecognizer recognizer, String component) {
+ Log.i(TAG, "Setting recognizer to " + component);
+ mRecognizer = recognizer;
+ recognizer.setTemporaryOnDeviceRecognizer(ComponentName.unflattenFromString(component));
+ }
+
+ @Override
+ boolean isOnDeviceTest() {
+ return true;
+ }
+
+ @Override
+ String customRecognizer() {
+ // We will use the default one (specified in config).
+ return null;
+ }
+}
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
index 6736280..055bf9b 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
@@ -35,18 +35,16 @@
* to provide the voice recognition functions.
*/
public class SpeechRecognitionActivity extends Activity {
-
private final String TAG = "SpeechRecognitionActivity";
- private SpeechRecognizer mRecognizer;
- private Intent mRecognizerIntent;
+ SpeechRecognizer mRecognizer;
+
private Handler mHandler;
private SpeechRecognizerListener mListener;
final List<CallbackMethod> mCallbackMethodsInvoked = new ArrayList<>();
public boolean mStartListeningCalled;
-
public CountDownLatch mCountDownLatch;
@Override
@@ -88,14 +86,14 @@
mHandler.post(mRecognizer::destroy);
}
- public void init(boolean onDevice, String customRecgonizerComponent) {
+ public void init(boolean onDevice, String customRecognizerComponent) {
mHandler = new Handler(getMainLooper());
mHandler.post(() -> {
if (onDevice) {
mRecognizer = SpeechRecognizer.createOnDeviceSpeechRecognizer(this);
- } else if (customRecgonizerComponent != null) {
+ } else if (customRecognizerComponent != null) {
mRecognizer = SpeechRecognizer.createSpeechRecognizer(this,
- ComponentName.unflattenFromString(customRecgonizerComponent));
+ ComponentName.unflattenFromString(customRecognizerComponent));
} else {
mRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
}
diff --git a/tests/tests/voiceinteraction/Android.bp b/tests/tests/voiceinteraction/Android.bp
index 0f4a568..df37450 100644
--- a/tests/tests/voiceinteraction/Android.bp
+++ b/tests/tests/voiceinteraction/Android.bp
@@ -23,9 +23,17 @@
"CtsVoiceInteractionCommon",
"ctstestrunner-axt",
"compatibility-device-util-axt",
- "androidx.test.ext.junit",
+ "androidx.test.ext.junit",
],
- srcs: ["src/**/*.java"],
+ srcs: [
+ "src/**/*.java",
+ "service/src/android/voiceinteraction/service/BasicVoiceInteractionService.java",
+ "service/src/android/voiceinteraction/service/MainHotwordDetectionService.java",
+ "service/src/android/voiceinteraction/service/MainInteractionService.java",
+ "service/src/android/voiceinteraction/service/MainInteractionSession.java",
+ "service/src/android/voiceinteraction/service/MainInteractionSessionService.java",
+ "service/src/android/voiceinteraction/service/MainRecognitionService.java"
+ ],
// Tag this module as a cts test artifact
test_suites: [
"cts",
diff --git a/tests/tests/voiceinteraction/AndroidManifest.xml b/tests/tests/voiceinteraction/AndroidManifest.xml
index 77b20cb..238f0ce 100644
--- a/tests/tests/voiceinteraction/AndroidManifest.xml
+++ b/tests/tests/voiceinteraction/AndroidManifest.xml
@@ -44,6 +44,50 @@
android:label="Voice Interaction Service Activity"
android:exported="true">
</activity>
+ <service android:name="android.voiceinteraction.service.BasicVoiceInteractionService"
+ android:label="CTS test Basic voice interaction service"
+ android:permission="android.permission.BIND_VOICE_INTERACTION"
+ android:exported="true"
+ android:visibleToInstantApps="true">
+ <meta-data android:name="android.voice_interaction"
+ android:resource="@xml/interaction_service_with_hotword" />
+ <intent-filter>
+ <action android:name="android.service.voice.VoiceInteractionService" />
+ </intent-filter>
+ </service>
+ <service android:name="android.voiceinteraction.service.MainHotwordDetectionService"
+ android:permission="android.permission.BIND_HOTWORD_DETECTION_SERVICE"
+ android:process=":remote"
+ android:exported="true">
+ </service>
+ <service android:name="android.voiceinteraction.service.MainInteractionService"
+ android:label="CTS test voice interaction service"
+ android:permission="android.permission.BIND_VOICE_INTERACTION"
+ android:exported="true"
+ android:visibleToInstantApps="true">
+ <meta-data android:name="android.voice_interaction"
+ android:resource="@xml/interaction_service" />
+ <intent-filter>
+ <action android:name="android.service.voice.VoiceInteractionService" />
+ </intent-filter>
+ </service>
+ <service android:name="android.voiceinteraction.service.MainInteractionSessionService"
+ android:permission="android.permission.BIND_VOICE_INTERACTION"
+ android:process=":session"
+ android:exported="true"
+ android:visibleToInstantApps="true">
+ </service>
+ <service android:name="android.voiceinteraction.service.MainRecognitionService"
+ android:label="CTS Voice Recognition Service"
+ android:exported="true"
+ android:visibleToInstantApps="true">
+ <intent-filter>
+ <action android:name="android.speech.RecognitionService" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data android:name="android.speech"
+ android:resource="@xml/recognition_service" />
+ </service>
<receiver android:name="VoiceInteractionTestReceiver"
android:exported="true"/>
</application>
diff --git a/tests/tests/voiceinteraction/TEST_MAPPING b/tests/tests/voiceinteraction/TEST_MAPPING
new file mode 100644
index 0000000..50cc659
--- /dev/null
+++ b/tests/tests/voiceinteraction/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsVoiceInteractionTestCases",
+ "options": [
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java b/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
index 0b4cc3c..dd60884 100644
--- a/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
+++ b/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
@@ -47,13 +47,20 @@
/** Decide which VoiceInteractionService should be started for testing. */
public static final int HOTWORD_DETECTION_SERVICE_NONE = 0;
- public static final int HOTWORD_DETECTION_SERVICE_INVALIDATION = 1;
- public static final int HOTWORD_DETECTION_SERVICE_WITHOUT_ISOLATED_PROCESS = 2;
- public static final int HOTWORD_DETECTION_SERVICE_WITHIN_ISOLATED_PROCESS = 3;
+ public static final int HOTWORD_DETECTION_SERVICE_BASIC = 1;
+ public static final int HOTWORD_DETECTION_SERVICE_INVALIDATION = 2;
+ public static final int HOTWORD_DETECTION_SERVICE_WITHOUT_ISOLATED_PROCESS = 3;
+ public static final int HOTWORD_DETECTION_SERVICE_WITHIN_ISOLATED_PROCESS = 4;
/** Indicate which test event for testing. */
public static final int VOICE_INTERACTION_SERVICE_NORMAL_TEST = 0;
- public static final int HOTWORD_DETECTION_SERVICE_CONFIG_TEST = 1;
+ public static final int HOTWORD_DETECTION_SERVICE_TRIGGER_TEST = 1;
+ public static final int HOTWORD_DETECTION_SERVICE_TRIGGER_WITHOUT_PERMISSION_TEST = 2;
+
+ public static final int HOTWORD_DETECTION_SERVICE_TRIGGER_SUCCESS = 1;
+ public static final int HOTWORD_DETECTION_SERVICE_TRIGGER_ILLEGAL_STATE_EXCEPTION = 2;
+ public static final int HOTWORD_DETECTION_SERVICE_TRIGGER_SECURITY_EXCEPTION = 3;
+ public static final int HOTWORD_DETECTION_SERVICE_TRIGGER_SHARED_MEMORY_NOT_READ_ONLY = 4;
public static final String TESTCASE_TYPE = "testcase_type";
public static final String TESTINFO = "testinfo";
@@ -127,11 +134,11 @@
public static final String SERVICE_NAME =
"android.voiceinteraction.service/.MainInteractionService";
- public static final String BROADCAST_CONFIG_RESULT_INTENT =
- "android.intent.action.CONFIG_RESULT";
- public static final String KEY_CONFIG_RESULT = "configResult";
+ public static final String BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT =
+ "android.intent.action.HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT";
public static final String KEY_SERVICE_TYPE = "serviceType";
public static final String KEY_TEST_EVENT = "testEvent";
+ public static final String KEY_TEST_RESULT = "testResult";
public static final String toBundleString(Bundle bundle) {
if (bundle == null) {
diff --git a/tests/tests/voiceinteraction/res/xml/interaction_service_with_hotword.xml b/tests/tests/voiceinteraction/res/xml/interaction_service_with_hotword.xml
new file mode 100644
index 0000000..f9732af
--- /dev/null
+++ b/tests/tests/voiceinteraction/res/xml/interaction_service_with_hotword.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+ android:sessionService="android.voiceinteraction.service.MainInteractionSessionService"
+ android:recognitionService="android.voiceinteraction.service.MainRecognitionService"
+ android:hotwordDetectionService="android.voiceinteraction.service.MainHotwordDetectionService"
+ android:settingsActivity=""
+ android:supportsAssist="false"
+ android:supportsLocalInteraction="true" />
diff --git a/tests/tests/voiceinteraction/res/xml/recognition_service.xml b/tests/tests/voiceinteraction/res/xml/recognition_service.xml
new file mode 100644
index 0000000..8849a80
--- /dev/null
+++ b/tests/tests/voiceinteraction/res/xml/recognition_service.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<recognition-service xmlns:android="http://schemas.android.com/apk/res/android"
+ android:settingsActivity="" />
diff --git a/tests/tests/voiceinteraction/service/AndroidManifest.xml b/tests/tests/voiceinteraction/service/AndroidManifest.xml
index 4cb5fde..b00ab57 100644
--- a/tests/tests/voiceinteraction/service/AndroidManifest.xml
+++ b/tests/tests/voiceinteraction/service/AndroidManifest.xml
@@ -65,14 +65,23 @@
</intent-filter>
<meta-data android:name="android.speech" android:resource="@xml/recognition_service" />
</service>
- <activity android:name=".CtsVoiceInteractionMainActivity"
+ <service android:name=".BasicVoiceInteractionService"
+ android:label="CTS test Basic voice interaction service"
+ android:permission="android.permission.BIND_VOICE_INTERACTION"
+ android:process=":interactor"
android:exported="true"
android:visibleToInstantApps="true">
+ <meta-data android:name="android.voice_interaction"
+ android:resource="@xml/interaction_service_with_hotword" />
<intent-filter>
- <action android:name="android.intent.action.START_TEST_VOICE_INTERACTION" />
- <category android:name="android.intent.category.DEFAULT" />
+ <action android:name="android.service.voice.VoiceInteractionService" />
</intent-filter>
- </activity>
+ </service>
+ <service android:name=".MainHotwordDetectionService"
+ android:permission="android.permission.BIND_HOTWORD_DETECTION_SERVICE"
+ android:process=":remote"
+ android:exported="true">
+ </service>
</application>
</manifest>
diff --git a/tests/tests/voiceinteraction/service/res/xml/interaction_service_with_hotword.xml b/tests/tests/voiceinteraction/service/res/xml/interaction_service_with_hotword.xml
new file mode 100644
index 0000000..965ffd2
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/res/xml/interaction_service_with_hotword.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+ android:sessionService="android.voiceinteraction.service.MainInteractionSessionService"
+ android:recognitionService="android.voiceinteraction.service.MainRecognitionService"
+ android:hotwordDetectionService="android.voiceinteraction.service.MainHotwordDetectionService"
+ android:settingsActivity="android.voiceinteraction.service.SettingsActivity"
+ android:supportsAssist="false"
+ android:supportsLocalInteraction="true" />
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/BasicVoiceInteractionService.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/BasicVoiceInteractionService.java
new file mode 100644
index 0000000..a3aca7d
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/BasicVoiceInteractionService.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.voiceinteraction.service;
+
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.SharedMemory;
+import android.service.voice.AlwaysOnHotwordDetector;
+import android.service.voice.VoiceInteractionService;
+import android.system.ErrnoException;
+import android.util.Log;
+import android.voiceinteraction.common.Utils;
+
+import java.nio.ByteBuffer;
+import java.util.Locale;
+
+/**
+ * This service included a basic HotwordDetectionService for testing.
+ */
+public class BasicVoiceInteractionService extends VoiceInteractionService {
+ // TODO: (b/182236586) Refactor the voice interaction service logic
+ static final String TAG = "BasicVoiceInteractionService";
+
+ public static byte[] FAKE_BYTE_ARRAY_DATA = new byte[] {1, 2, 3};
+
+ private boolean mReady = false;
+
+ @Override
+ public void onReady() {
+ super.onReady();
+ mReady = true;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ Log.i(TAG, "onStartCommand received");
+
+ if (intent == null || !mReady) {
+ Log.wtf(TAG, "Can't start because either intent is null or onReady() "
+ + "is not called yet. intent = " + intent + ", mReady = " + mReady);
+ return START_NOT_STICKY;
+ }
+
+ final int testEvent = intent.getIntExtra(Utils.KEY_TEST_EVENT, -1);
+ if (testEvent == Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_TEST) {
+ runWithShellPermissionIdentity(() -> {
+ callCreateAlwaysOnHotwordDetector();
+ });
+ } else if (testEvent == Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_WITHOUT_PERMISSION_TEST) {
+ callCreateAlwaysOnHotwordDetector();
+ }
+
+ return START_NOT_STICKY;
+ }
+
+ private void callCreateAlwaysOnHotwordDetector() {
+ Log.i(TAG, "callCreateAlwaysOnHotwordDetector()");
+ try {
+ createAlwaysOnHotwordDetector(/* keyphrase */ "Hello Google",
+ Locale.forLanguageTag("en-US"),
+ createFakeBundleData(),
+ createFakeSharedMemoryData(),
+ new AlwaysOnHotwordDetector.Callback() {
+ @Override
+ public void onAvailabilityChanged(int status) {
+ Log.i(TAG, "onAvailabilityChanged(" + status + ")");
+ }
+
+ @Override
+ public void onDetected(AlwaysOnHotwordDetector.EventPayload eventPayload) {
+ Log.i(TAG, "onDetected");
+ }
+
+ @Override
+ public void onError() {
+ Log.i(TAG, "onError");
+ }
+
+ @Override
+ public void onRecognitionPaused() {
+ Log.i(TAG, "onRecognitionPaused");
+ }
+
+ @Override
+ public void onRecognitionResumed() {
+ Log.i(TAG, "onRecognitionResumed");
+ }
+ });
+ } catch (IllegalStateException e) {
+ Log.w(TAG, "callCreateAlwaysOnHotwordDetector() exception: " + e);
+ broadcastIntentWithResult(
+ Utils.BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT,
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_ILLEGAL_STATE_EXCEPTION);
+ } catch (SecurityException e) {
+ Log.w(TAG, "callCreateAlwaysOnHotwordDetector() exception: " + e);
+ broadcastIntentWithResult(
+ Utils.BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT,
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_SECURITY_EXCEPTION);
+ }
+ }
+
+ private void broadcastIntentWithResult(String intentName, int result) {
+ Intent intent = new Intent(intentName)
+ .addFlags(Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_REGISTERED_ONLY)
+ .putExtra(Utils.KEY_TEST_RESULT, result);
+ Log.d(TAG, "broadcast intent = " + intent + ", result = " + result);
+ sendBroadcast(intent);
+ }
+
+ private SharedMemory createFakeSharedMemoryData() {
+ try {
+ SharedMemory sharedMemory = SharedMemory.create("SharedMemory", 3);
+ ByteBuffer byteBuffer = sharedMemory.mapReadWrite();
+ byteBuffer.put(FAKE_BYTE_ARRAY_DATA);
+ return sharedMemory;
+ } catch (ErrnoException e) {
+ Log.w(TAG, "createFakeSharedMemoryData ErrnoException : " + e);
+ throw new RuntimeException(e.getMessage());
+ }
+ }
+
+ private Bundle createFakeBundleData() {
+ // TODO : Add more data for testing
+ Bundle bundle = new Bundle();
+ bundle.putByteArray("fakeData", FAKE_BYTE_ARRAY_DATA);
+ return bundle;
+ }
+}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/CtsVoiceInteractionMainActivity.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/CtsVoiceInteractionMainActivity.java
deleted file mode 100644
index 01b1412..0000000
--- a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/CtsVoiceInteractionMainActivity.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.voiceinteraction.service;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.voiceinteraction.common.Utils;
-
-public class CtsVoiceInteractionMainActivity extends Activity {
- static final String TAG = "CtsVoiceInteractionMainActivity";
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Intent intent = getIntent();
- int serviceType = intent.getIntExtra(Utils.KEY_SERVICE_TYPE, -1);
- Intent serviceIntent = new Intent();
- if (serviceType == Utils.HOTWORD_DETECTION_SERVICE_NONE) {
- serviceIntent.setComponent(new ComponentName(this, MainInteractionService.class));
- } else {
- Log.w(TAG, "Never here");
- finish();
- return;
- }
- serviceIntent.putExtra(Utils.KEY_TEST_EVENT, intent.getIntExtra(Utils.KEY_TEST_EVENT, -1));
- ComponentName serviceName = startService(serviceIntent);
- Log.i(TAG, "Started service: " + serviceName);
- finish();
- }
-}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java
new file mode 100644
index 0000000..4912f16
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.voiceinteraction.service;
+
+import android.content.Intent;
+import android.media.AudioFormat;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.os.SharedMemory;
+import android.service.voice.HotwordDetectionService;
+import android.system.ErrnoException;
+import android.util.Log;
+import android.voiceinteraction.common.Utils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public class MainHotwordDetectionService extends HotwordDetectionService {
+ static final String TAG = "MainHotwordDetectionService";
+
+ @Override
+ public void onDetectFromDspSource(
+ @NonNull ParcelFileDescriptor audioStream,
+ @NonNull AudioFormat audioFormat,
+ long timeoutMillis,
+ @NonNull DspHotwordDetectionCallback callback) {
+ Log.d(TAG, "onDetectFromDspSource");
+ if (callback == null) {
+ Log.w(TAG, "callback is null");
+ return;
+ }
+ callback.onDetected();
+ }
+
+ @Override
+ public void onUpdateState(@Nullable Bundle options, @Nullable SharedMemory sharedMemory) {
+ Log.d(TAG, "onUpdateState");
+
+ // TODO : Check the options data and sharedMemory data. It will also need to use the new
+ // mechanism instead of sendBroadcast to respond the test result when submitting isolated
+ // process patch.
+
+ if (sharedMemory != null) {
+ try {
+ sharedMemory.mapReadWrite();
+ broadcastIntentWithResult(
+ Utils.BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT,
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_SHARED_MEMORY_NOT_READ_ONLY);
+ return;
+ } catch (ErrnoException e) {
+ // For read-only case
+ } finally {
+ sharedMemory.close();
+ }
+ }
+ broadcastIntentWithResult(Utils.BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT,
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_SUCCESS);
+ }
+
+ private void broadcastIntentWithResult(String intentName, int result) {
+ Intent intent = new Intent(intentName)
+ .addFlags(Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_REGISTERED_ONLY)
+ .putExtra(Utils.KEY_TEST_RESULT, result);
+ Log.d(TAG, "broadcast intent = " + intent + ", result = " + result);
+ sendBroadcast(intent);
+ }
+}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionService.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionService.java
index 63eb6df..d1f9d9e 100644
--- a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionService.java
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionService.java
@@ -16,16 +16,20 @@
package android.voiceinteraction.service;
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
+import android.service.voice.AlwaysOnHotwordDetector;
import android.service.voice.VoiceInteractionService;
import android.service.voice.VoiceInteractionSession;
import android.util.Log;
import android.voiceinteraction.common.Utils;
import java.util.Collections;
+import java.util.Locale;
import java.util.Set;
public class MainInteractionService extends VoiceInteractionService {
@@ -53,8 +57,10 @@
final int testEvent = mIntent.getIntExtra(Utils.KEY_TEST_EVENT, -1);
if (testEvent == Utils.VOICE_INTERACTION_SERVICE_NORMAL_TEST) {
maybeStart();
- } else if (testEvent == Utils.HOTWORD_DETECTION_SERVICE_CONFIG_TEST) {
- callSetHotwordDetectionConfig();
+ } else if (testEvent == Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_TEST) {
+ runWithShellPermissionIdentity(() -> {
+ callCreateAlwaysOnHotwordDetector();
+ });
}
return START_NOT_STICKY;
}
@@ -93,17 +99,50 @@
return super.onGetSupportedVoiceActions(voiceActions);
}
- private void callSetHotwordDetectionConfig() {
- Log.i(TAG, "callSetHotwordDetectionConfig()");
- int configResult = setHotwordDetectionConfig(new Bundle());
- broadcastConfigResult(configResult);
+ private void callCreateAlwaysOnHotwordDetector() {
+ Log.i(TAG, "callCreateAlwaysOnHotwordDetector()");
+ try {
+ createAlwaysOnHotwordDetector(/* keyphrase */ "Hello Google",
+ Locale.forLanguageTag("en-US"), /* options */ null, /* sharedMemory */ null,
+ new AlwaysOnHotwordDetector.Callback() {
+ @Override
+ public void onAvailabilityChanged(int status) {
+ Log.i(TAG, "onAvailabilityChanged(" + status + ")");
+ }
+
+ @Override
+ public void onDetected(AlwaysOnHotwordDetector.EventPayload eventPayload) {
+ Log.i(TAG, "onDetected");
+ }
+
+ @Override
+ public void onError() {
+ Log.i(TAG, "onError");
+ }
+
+ @Override
+ public void onRecognitionPaused() {
+ Log.i(TAG, "onRecognitionPaused");
+ }
+
+ @Override
+ public void onRecognitionResumed() {
+ Log.i(TAG, "onRecognitionResumed");
+ }
+ });
+ } catch (IllegalStateException e) {
+ Log.w(TAG, "callCreateAlwaysOnHotwordDetector() exception: " + e);
+ broadcastIntentWithResult(
+ Utils.BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT,
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_ILLEGAL_STATE_EXCEPTION);
+ }
}
- private void broadcastConfigResult(int result) {
- Intent intent = new Intent(Utils.BROADCAST_CONFIG_RESULT_INTENT)
+ private void broadcastIntentWithResult(String intentName, int result) {
+ Intent intent = new Intent(intentName)
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_REGISTERED_ONLY)
- .putExtra(Utils.KEY_CONFIG_RESULT, result);
- Log.i(TAG, "broadcast intent = " + intent + ", config result = " + result);
+ .putExtra(Utils.KEY_TEST_RESULT, result);
+ Log.d(TAG, "broadcast intent = " + intent + ", result = " + result);
sendBroadcast(intent);
}
}
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/AbstractVoiceInteractionBasicTestCase.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/AbstractVoiceInteractionBasicTestCase.java
new file mode 100644
index 0000000..c787072
--- /dev/null
+++ b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/AbstractVoiceInteractionBasicTestCase.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.voiceinteraction.cts;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static com.android.compatibility.common.util.ShellUtils.runShellCommand;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.compatibility.common.util.SettingsStateChangerRule;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.runner.RunWith;
+
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+/**
+ * Base class for using the VoiceInteractionService that included a basic HotwordDetectionService.
+ */
+@RunWith(AndroidJUnit4.class)
+abstract class AbstractVoiceInteractionBasicTestCase {
+ // TODO: (b/181943521) Combine the duplicated test class
+
+ protected static final int TIMEOUT_MS = 5 * 1000;
+
+ protected final Context mContext = getInstrumentation().getTargetContext();
+
+ @Rule
+ public final SettingsStateChangerRule mServiceSetterRule = new SettingsStateChangerRule(
+ mContext, Settings.Secure.VOICE_INTERACTION_SERVICE, getVoiceInteractionService());
+
+ @Rule
+ public final ActivityScenarioRule<TestVoiceInteractionServiceActivity> mActivityTestRule =
+ new ActivityScenarioRule<>(TestVoiceInteractionServiceActivity.class);
+
+ @Before
+ public void prepareDevice() throws Exception {
+ // Unlock screen.
+ runShellCommand("input keyevent KEYCODE_WAKEUP");
+
+ // Dismiss keyguard, in case it's set as "Swipe to unlock".
+ runShellCommand("wm dismiss-keyguard");
+ }
+
+ public abstract String getVoiceInteractionService();
+}
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/AbstractVoiceInteractionTestCase.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/AbstractVoiceInteractionTestCase.java
index a5cb7d4..721c372 100644
--- a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/AbstractVoiceInteractionTestCase.java
+++ b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/AbstractVoiceInteractionTestCase.java
@@ -24,7 +24,6 @@
import android.provider.Settings;
import android.voiceinteraction.common.Utils;
-import com.android.compatibility.common.util.RequiredFeatureRule;
import com.android.compatibility.common.util.SettingsStateChangerRule;
import org.junit.Before;
@@ -39,16 +38,9 @@
@RunWith(AndroidJUnit4.class)
abstract class AbstractVoiceInteractionTestCase {
- // TODO: use PackageManager's / make it @TestApi
- protected static final String FEATURE_VOICE_RECOGNIZERS = "android.software.voice_recognizers";
-
protected final Context mContext = getInstrumentation().getTargetContext();
@Rule
- public final RequiredFeatureRule mRequiredFeatureRule = new RequiredFeatureRule(
- FEATURE_VOICE_RECOGNIZERS);
-
- @Rule
public final SettingsStateChangerRule mServiceSetterRule = new SettingsStateChangerRule(
mContext, Settings.Secure.VOICE_INTERACTION_SERVICE, Utils.SERVICE_NAME);
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceBasicTest.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceBasicTest.java
new file mode 100644
index 0000000..6fe406e
--- /dev/null
+++ b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceBasicTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.voiceinteraction.cts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Intent;
+import android.platform.test.annotations.AppModeFull;
+import android.voiceinteraction.common.Utils;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.compatibility.common.util.BlockingBroadcastReceiver;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for using the VoiceInteractionService that included a basic HotwordDetectionService.
+ */
+@RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "No real use case for instant mode hotword detection service")
+public final class HotwordDetectionServiceBasicTest
+ extends AbstractVoiceInteractionBasicTestCase {
+ static final String TAG = "HotwordDetectionServiceBasicTest";
+
+ @Test
+ public void testHotwordDetectionService_validHotwordDetectionComponentName_triggerSuccess()
+ throws Throwable {
+ final BlockingBroadcastReceiver receiver = new BlockingBroadcastReceiver(mContext,
+ Utils.BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT);
+ receiver.register();
+
+ mActivityTestRule.getScenario().onActivity(activity -> {
+ activity.triggerHotwordDetectionServiceTest(
+ Utils.HOTWORD_DETECTION_SERVICE_BASIC,
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_TEST);
+ });
+
+ final Intent intent = receiver.awaitForBroadcast(TIMEOUT_MS);
+ assertThat(intent).isNotNull();
+ assertThat(intent.getIntExtra(Utils.KEY_TEST_RESULT, -1)).isEqualTo(
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_SUCCESS);
+
+ receiver.unregisterQuietly();
+ }
+
+ @Test
+ public void testHotwordDetectionService_withoutAllowTriggerPermission_triggerFailure()
+ throws Throwable {
+ final BlockingBroadcastReceiver receiver = new BlockingBroadcastReceiver(mContext,
+ Utils.BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT);
+ receiver.register();
+
+ mActivityTestRule.getScenario().onActivity(activity -> {
+ activity.triggerHotwordDetectionServiceTest(
+ Utils.HOTWORD_DETECTION_SERVICE_BASIC,
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_WITHOUT_PERMISSION_TEST);
+ });
+
+ final Intent intent = receiver.awaitForBroadcast(TIMEOUT_MS);
+ assertThat(intent).isNotNull();
+ assertThat(intent.getIntExtra(Utils.KEY_TEST_RESULT, -1)).isEqualTo(
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_SECURITY_EXCEPTION);
+
+ receiver.unregisterQuietly();
+ }
+
+ @Override
+ public String getVoiceInteractionService() {
+ return "android.voiceinteraction.cts/"
+ + "android.voiceinteraction.service.BasicVoiceInteractionService";
+ }
+}
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceNonExistenceTest.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceNonExistenceTest.java
new file mode 100644
index 0000000..cc161e1
--- /dev/null
+++ b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceNonExistenceTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.voiceinteraction.cts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Intent;
+import android.platform.test.annotations.AppModeFull;
+import android.voiceinteraction.common.Utils;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.compatibility.common.util.BlockingBroadcastReceiver;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for using the VoiceInteractionService without a basic HotwordDetectionService.
+ */
+@RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "No real use case for instant mode hotword detection service")
+public final class HotwordDetectionServiceNonExistenceTest
+ extends AbstractVoiceInteractionBasicTestCase {
+ static final String TAG = "HotwordDetectionServiceNonExistenceTest";
+
+ @Test
+ public void testHotwordDetectionService_noHotwordDetectionComponentName_triggerFailure()
+ throws Throwable {
+ final BlockingBroadcastReceiver receiver = new BlockingBroadcastReceiver(mContext,
+ Utils.BROADCAST_HOTWORD_DETECTION_SERVICE_TRIGGER_RESULT_INTENT);
+ receiver.register();
+
+ mActivityTestRule.getScenario().onActivity(activity -> {
+ activity.triggerHotwordDetectionServiceTest(
+ Utils.HOTWORD_DETECTION_SERVICE_NONE,
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_TEST);
+ });
+
+ final Intent intent = receiver.awaitForBroadcast(TIMEOUT_MS);
+ assertThat(intent).isNotNull();
+ assertThat(intent.getIntExtra(Utils.KEY_TEST_RESULT, -1)).isEqualTo(
+ Utils.HOTWORD_DETECTION_SERVICE_TRIGGER_ILLEGAL_STATE_EXCEPTION);
+
+ receiver.unregisterQuietly();
+ }
+
+ @Override
+ public String getVoiceInteractionService() {
+ return "android.voiceinteraction.cts/"
+ + "android.voiceinteraction.service.MainInteractionService";
+ }
+}
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceTest.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceTest.java
deleted file mode 100644
index 0d1533a..0000000
--- a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/HotwordDetectionServiceTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.voiceinteraction.cts;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Intent;
-import android.platform.test.annotations.AppModeFull;
-import android.service.voice.VoiceInteractionService;
-import android.voiceinteraction.common.Utils;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.rule.ActivityTestRule;
-
-import com.android.compatibility.common.util.BlockingBroadcastReceiver;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@AppModeFull(reason = "No real use case for instant mode hotword detection service")
-public final class HotwordDetectionServiceTest extends AbstractVoiceInteractionTestCase {
- static final String TAG = "HotwordDetectionServiceTest";
-
- private static final int TIMEOUT_MS = 10 * 1000;
-
- private TestVoiceInteractionServiceActivity mTestActivity;
-
- @Rule
- public final ActivityTestRule<TestVoiceInteractionServiceActivity> mActivityTestRule =
- new ActivityTestRule<>(TestVoiceInteractionServiceActivity.class);
-
- @Before
- public void setup() throws Exception {
- mTestActivity = mActivityTestRule.getActivity();
- }
-
- @Test
- public void testSetHotwordDetectionConfig_noHotwordDetectionComponentName_returnFailure()
- throws Throwable {
- final BlockingBroadcastReceiver receiver = new BlockingBroadcastReceiver(mContext,
- Utils.BROADCAST_CONFIG_RESULT_INTENT);
- receiver.register();
-
- mTestActivity.hotwordDetectionConfigTest(Utils.HOTWORD_DETECTION_SERVICE_NONE);
-
- final Intent intent = receiver.awaitForBroadcast(TIMEOUT_MS);
- assertThat(intent).isNotNull();
- assertThat(intent.getIntExtra(Utils.KEY_CONFIG_RESULT, -1)).isEqualTo(
- VoiceInteractionService.HOTWORD_CONFIG_FAILURE);
-
- receiver.unregisterQuietly();
- }
-}
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/TestVoiceInteractionServiceActivity.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/TestVoiceInteractionServiceActivity.java
index d159e9f..70200b8 100644
--- a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/TestVoiceInteractionServiceActivity.java
+++ b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/TestVoiceInteractionServiceActivity.java
@@ -21,18 +21,27 @@
import android.content.Intent;
import android.util.Log;
import android.voiceinteraction.common.Utils;
+import android.voiceinteraction.service.BasicVoiceInteractionService;
+import android.voiceinteraction.service.MainInteractionService;
public class TestVoiceInteractionServiceActivity extends Activity {
static final String TAG = "TestVoiceInteractionServiceActivity";
- public void hotwordDetectionConfigTest(int serviceType) {
- Intent intent = new Intent();
- intent.setAction("android.intent.action.START_TEST_VOICE_INTERACTION");
- intent.setComponent(new ComponentName("android.voiceinteraction.service",
- "android.voiceinteraction.service.CtsVoiceInteractionMainActivity"));
- intent.putExtra(Utils.KEY_SERVICE_TYPE, serviceType);
- intent.putExtra(Utils.KEY_TEST_EVENT, Utils.HOTWORD_DETECTION_SERVICE_CONFIG_TEST);
- Log.i(TAG, "onCreate: " + intent);
- startActivity(intent);
+ void triggerHotwordDetectionServiceTest(int serviceType, int testEvent) {
+ Intent serviceIntent = new Intent();
+ if (serviceType == Utils.HOTWORD_DETECTION_SERVICE_NONE) {
+ serviceIntent.setComponent(new ComponentName(this,
+ "android.voiceinteraction.service.MainInteractionService"));
+ } else if (serviceType == Utils.HOTWORD_DETECTION_SERVICE_BASIC) {
+ serviceIntent.setComponent(new ComponentName(this,
+ "android.voiceinteraction.service.BasicVoiceInteractionService"));
+ } else {
+ Log.w(TAG, "Never here");
+ finish();
+ return;
+ }
+ serviceIntent.putExtra(Utils.KEY_TEST_EVENT, testEvent);
+ ComponentName serviceName = startService(serviceIntent);
+ Log.i(TAG, "triggerHotwordDetectionServiceTest Started service: " + serviceName);
}
}
diff --git a/tests/tests/widget/res/layout/remoteviews_adapters.xml b/tests/tests/widget/res/layout/remoteviews_adapters.xml
new file mode 100644
index 0000000..4d1ed5e
--- /dev/null
+++ b/tests/tests/widget/res/layout/remoteviews_adapters.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <ListView
+ android:id="@+id/remoteView_list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="visible"/>
+ <GridView
+ android:id="@+id/remoteView_grid"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"/>
+ <StackView
+ android:id="@+id/remoteView_stack"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"/>
+ <AdapterViewFlipper
+ android:id="@+id/remoteView_flipper"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"/>
+</FrameLayout>
diff --git a/tests/tests/widget/res/layout/remoteviews_container.xml b/tests/tests/widget/res/layout/remoteviews_container.xml
new file mode 100644
index 0000000..5c322cb
--- /dev/null
+++ b/tests/tests/widget/res/layout/remoteviews_container.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/remoteView_container"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"/>
diff --git a/tests/tests/widget/res/layout/remoteviews_recycle.xml b/tests/tests/widget/res/layout/remoteviews_recycle.xml
new file mode 100644
index 0000000..59befe1
--- /dev/null
+++ b/tests/tests/widget/res/layout/remoteviews_recycle.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/remoteViews_recycle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/remoteViews_recycle_static"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="static text"/>
+
+ <LinearLayout
+ android:id="@+id/remoteViews_recycle_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"/>
+
+</LinearLayout>
diff --git a/tests/tests/widget/res/layout/remoteviews_textview.xml b/tests/tests/widget/res/layout/remoteviews_textview.xml
new file mode 100644
index 0000000..bd44b7e
--- /dev/null
+++ b/tests/tests/widget/res/layout/remoteviews_textview.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="text view"/>
diff --git a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
index ec3856c..a93d864 100644
--- a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
@@ -27,6 +27,7 @@
import android.app.Activity;
import android.app.Instrumentation;
+import android.app.compat.CompatChanges;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
@@ -65,6 +66,9 @@
@MediumTest
@RunWith(AndroidJUnit4.class)
public class HorizontalScrollViewTest {
+ static final long USE_STRETCH_EDGE_EFFECT_BY_DEFAULT = 171228096L;
+ static final long USE_STRETCH_EDGE_EFFECT_FOR_SUPPORTED = 178807038L;
+
private static final int ITEM_WIDTH = 250;
private static final int ITEM_HEIGHT = 100;
private static final int ITEM_COUNT = 15;
@@ -820,8 +824,11 @@
@Test
public void testEdgeEffectType() {
- // Should default to "glow"
- assertEquals(EdgeEffect.TYPE_GLOW, mScrollViewRegular.getEdgeEffectType());
+ int expectedStartType = (CompatChanges.isChangeEnabled(USE_STRETCH_EDGE_EFFECT_BY_DEFAULT)
+ || CompatChanges.isChangeEnabled(USE_STRETCH_EDGE_EFFECT_FOR_SUPPORTED))
+ ? EdgeEffect.TYPE_STRETCH : EdgeEffect.TYPE_GLOW;
+ // Should default value
+ assertEquals(expectedStartType, mScrollViewRegular.getEdgeEffectType());
// This one has "stretch" attribute
assertEquals(EdgeEffect.TYPE_STRETCH, mScrollViewStretch.getEdgeEffectType());
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index 033c4ce..3c0bfcb 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -38,6 +38,7 @@
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.app.Instrumentation;
+import android.app.compat.CompatChanges;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -97,6 +98,8 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ListViewTest {
+ static final long USE_STRETCH_EDGE_EFFECT_BY_DEFAULT = 171228096L;
+ static final long USE_STRETCH_EDGE_EFFECT_FOR_SUPPORTED = 178807038L;
private final String[] mCountryList = new String[] {
"Argentina", "Australia", "China", "France", "Germany", "Italy", "Japan", "United States"
};
@@ -1162,7 +1165,10 @@
@Test
public void testEdgeEffectType() {
// Should default to "glow"
- assertEquals(EdgeEffect.TYPE_GLOW, mListView.getEdgeEffectType());
+ int expectedStartType = (CompatChanges.isChangeEnabled(USE_STRETCH_EDGE_EFFECT_BY_DEFAULT)
+ || CompatChanges.isChangeEnabled(USE_STRETCH_EDGE_EFFECT_FOR_SUPPORTED))
+ ? EdgeEffect.TYPE_STRETCH : EdgeEffect.TYPE_GLOW;
+ assertEquals(expectedStartType, mListView.getEdgeEffectType());
// This one has "stretch" attribute
assertEquals(EdgeEffect.TYPE_STRETCH, mListViewStretch.getEdgeEffectType());
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsFixedCollectionAdapterTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsFixedCollectionAdapterTest.java
new file mode 100644
index 0000000..9f68e1d
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsFixedCollectionAdapterTest.java
@@ -0,0 +1,582 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import static com.android.compatibility.common.util.WidgetTestUtils.runOnMainAndDrawSync;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Parcel;
+import android.util.TypedValue;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Adapter;
+import android.widget.AdapterViewFlipper;
+import android.widget.CompoundButton;
+import android.widget.GridView;
+import android.widget.ListView;
+import android.widget.RemoteViews;
+import android.widget.RemoteViews.RemoteCollectionItems;
+import android.widget.StackView;
+import android.widget.TextView;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.compatibility.common.util.WidgetTestUtils;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class RemoteViewsFixedCollectionAdapterTest {
+ private static final String PACKAGE_NAME = "android.widget.cts";
+
+ @Rule
+ public ActivityTestRule<RemoteViewsCtsActivity> mActivityRule =
+ new ActivityTestRule<>(RemoteViewsCtsActivity.class);
+
+ private Instrumentation mInstrumentation;
+
+ private Activity mActivity;
+
+ private RemoteViews mRemoteViews;
+
+ private View mView;
+ private ListView mListView;
+ private GridView mGridView;
+ private StackView mStackView;
+ private AdapterViewFlipper mAdapterViewFlipper;
+
+ @UiThreadTest
+ @Before
+ public void setUp() throws Throwable {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mActivity = mActivityRule.getActivity();
+ mRemoteViews = new RemoteViews(PACKAGE_NAME, R.layout.remoteviews_adapters);
+
+ ViewGroup parent = (ViewGroup) mActivity.findViewById(R.id.remoteView_host);
+ mView = mRemoteViews.apply(mActivity, parent);
+ parent.addView(mView);
+
+ mListView = mView.findViewById(R.id.remoteView_list);
+ mGridView = mView.findViewById(R.id.remoteView_grid);
+ mStackView = mView.findViewById(R.id.remoteView_stack);
+ mAdapterViewFlipper = mView.findViewById(R.id.remoteView_flipper);
+ }
+
+ @Test
+ public void testParcelingAndUnparceling() {
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .setHasStableIds(true)
+ .setViewTypeCount(10)
+ .addItem(3 /* id */, new RemoteViews(PACKAGE_NAME, R.layout.textview_singleline))
+ .addItem(5 /* id */, new RemoteViews(PACKAGE_NAME, R.layout.textview_gravity))
+ .build();
+
+ Parcel parcel = Parcel.obtain();
+ items.writeToParcel(parcel, 0 /* flags */);
+ parcel.setDataPosition(0);
+
+ RemoteCollectionItems unparceled = RemoteCollectionItems.CREATOR.createFromParcel(parcel);
+ assertEquals(2, unparceled.getItemCount());
+ assertEquals(3, unparceled.getItemId(0));
+ assertEquals(5, unparceled.getItemId(1));
+ assertEquals(R.layout.textview_singleline, unparceled.getItemView(0).getLayoutId());
+ assertEquals(R.layout.textview_gravity, unparceled.getItemView(1).getLayoutId());
+ assertTrue(unparceled.hasStableIds());
+ assertEquals(10, unparceled.getViewTypeCount());
+
+ parcel.recycle();
+ }
+
+ @Test
+ public void testBuilder_empty() {
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder().build();
+
+ assertEquals(0, items.getItemCount());
+ assertEquals(1, items.getViewTypeCount());
+ assertFalse(items.hasStableIds());
+ }
+
+ @Test
+ public void testBuilder_viewTypeCountUnspecified() {
+ RemoteViews firstItem = new RemoteViews(PACKAGE_NAME, R.layout.textview_singleline);
+ RemoteViews secondItem = new RemoteViews(PACKAGE_NAME, R.layout.textview_gravity);
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .setHasStableIds(true)
+ .addItem(3 /* id */, firstItem)
+ .addItem(5 /* id */, secondItem)
+ .build();
+
+ assertEquals(2, items.getItemCount());
+ assertEquals(3, items.getItemId(0));
+ assertEquals(5, items.getItemId(1));
+ assertSame(firstItem, items.getItemView(0));
+ assertSame(secondItem, items.getItemView(1));
+ assertTrue(items.hasStableIds());
+ // The view type count should be derived from the number of different layout ids if
+ // unspecified.
+ assertEquals(2, items.getViewTypeCount());
+ }
+
+ @Test
+ public void testBuilder_viewTypeCountSpecified() {
+ RemoteViews firstItem = new RemoteViews(PACKAGE_NAME, R.layout.textview_singleline);
+ RemoteViews secondItem = new RemoteViews(PACKAGE_NAME, R.layout.textview_gravity);
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .addItem(3 /* id */, firstItem)
+ .addItem(5 /* id */, secondItem)
+ .setViewTypeCount(15)
+ .build();
+
+ assertEquals(15, items.getViewTypeCount());
+ }
+
+ @Test
+ public void testBuilder_repeatedIdsAndLayouts() {
+ RemoteViews firstItem = new RemoteViews(PACKAGE_NAME, R.layout.textview_singleline);
+ RemoteViews secondItem = new RemoteViews(PACKAGE_NAME, R.layout.textview_singleline);
+ RemoteViews thirdItem = new RemoteViews(PACKAGE_NAME, R.layout.textview_singleline);
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .setHasStableIds(false)
+ .addItem(42 /* id */, firstItem)
+ .addItem(42 /* id */, secondItem)
+ .addItem(42 /* id */, thirdItem)
+ .build();
+
+ assertEquals(3, items.getItemCount());
+ assertEquals(42, items.getItemId(0));
+ assertEquals(42, items.getItemId(1));
+ assertEquals(42, items.getItemId(2));
+ assertSame(firstItem, items.getItemView(0));
+ assertSame(secondItem, items.getItemView(1));
+ assertSame(thirdItem, items.getItemView(2));
+ assertEquals(1, items.getViewTypeCount());
+ assertFalse(items.hasStableIds());
+ }
+
+ @Test
+ public void testBuilder_nullItem() {
+ assertThrows(
+ NullPointerException.class,
+ () -> new RemoteCollectionItems.Builder()
+ .addItem(0, null /* view */)
+ .build());
+ }
+
+ @Test
+ public void testBuilder_multipleLayouts() {
+ assertThrows(
+ IllegalArgumentException.class,
+ () -> new RemoteCollectionItems.Builder()
+ .addItem(0, new RemoteViews(
+ new RemoteViews(PACKAGE_NAME, R.layout.listview_layout),
+ new RemoteViews(PACKAGE_NAME, R.layout.listview_layout)
+ ))
+ .build());
+ }
+
+ @Test
+ public void testBuilder_viewTypeCountLowerThanLayoutCount() {
+ assertThrows(
+ IllegalArgumentException.class,
+ () -> new RemoteCollectionItems.Builder()
+ .setHasStableIds(true)
+ .setViewTypeCount(1)
+ .addItem(3 /* id */,
+ new RemoteViews(PACKAGE_NAME, R.layout.textview_singleline))
+ .addItem(5 /* id */,
+ new RemoteViews(PACKAGE_NAME, R.layout.textview_gravity))
+ .build());
+ }
+
+ @Test
+ public void testSetRemoteAdapter_emptyCollection() {
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder().build();
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(
+ mActivityRule, mListView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ assertEquals(0, mListView.getChildCount());
+ assertEquals(0, mListView.getAdapter().getCount());
+ assertEquals(1, mListView.getAdapter().getViewTypeCount());
+ assertFalse(mListView.getAdapter().hasStableIds());
+ }
+
+ @Test
+ public void testSetRemoteAdapter_withItems() {
+ RemoteViews item0 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item0.setTextViewText(android.R.id.text1, "Hello");
+
+ RemoteViews item1 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item1.setTextViewText(android.R.id.text1, "World");
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .setHasStableIds(true)
+ .addItem(10 /* id= */, item0)
+ .addItem(11 /* id= */, item1)
+ .build();
+
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(
+ mActivityRule, mListView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ Adapter adapter = mListView.getAdapter();
+ assertEquals(2, adapter.getCount());
+ assertEquals(1, adapter.getViewTypeCount());
+ assertEquals(adapter.getItemViewType(0), adapter.getItemViewType(1));
+ assertEquals(10, adapter.getItemId(0));
+ assertEquals(11, adapter.getItemId(1));
+ assertTrue(adapter.hasStableIds());
+
+ assertEquals(2, mListView.getChildCount());
+ TextView textView0 = (TextView) mListView.getChildAt(0);
+ TextView textView1 = (TextView) mListView.getChildAt(1);
+ assertEquals("Hello", textView0.getText());
+ assertEquals("World", textView1.getText());
+ }
+
+ @Test
+ public void testSetRemoteAdapter_checkedChangeListener() throws Throwable {
+ String action = "my-action";
+ MockBroadcastReceiver receiver = new MockBroadcastReceiver();
+ mActivity.registerReceiver(receiver, new IntentFilter(action));
+
+ Intent intent = new Intent(action).setPackage(mActivity.getPackageName());
+ PendingIntent pendingIntent =
+ PendingIntent.getBroadcast(
+ mActivity,
+ 0,
+ intent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
+ mRemoteViews.setPendingIntentTemplate(R.id.remoteView_list, pendingIntent);
+
+ ListView listView = mView.findViewById(R.id.remoteView_list);
+
+ RemoteViews item0 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item0.setTextViewText(android.R.id.text1, "Hello");
+
+ RemoteViews item1 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item1.setTextViewText(android.R.id.text1, "World");
+
+ RemoteViews item2 = new RemoteViews(PACKAGE_NAME, R.layout.checkbox_layout);
+ item2.setTextViewText(R.id.check_box, "Checkbox");
+ item2.setCompoundButtonChecked(R.id.check_box, true);
+ item2.setOnCheckedChangeResponse(
+ R.id.check_box,
+ RemoteViews.RemoteResponse.fromFillInIntent(new Intent().putExtra("my-extra", 42)));
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .setHasStableIds(true)
+ .addItem(10 /* id= */, item0)
+ .addItem(11 /* id= */, item1)
+ .addItem(12 /* id= */, item2)
+ .build();
+
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ WidgetTestUtils.runOnMainAndLayoutSync(mActivityRule,
+ () -> mRemoteViews.reapply(mActivity, mView), true);
+
+ Adapter adapter = listView.getAdapter();
+ assertEquals(3, adapter.getCount());
+ assertEquals(2, adapter.getViewTypeCount());
+ assertEquals(adapter.getItemViewType(0), adapter.getItemViewType(1));
+ assertNotEquals(adapter.getItemViewType(0), adapter.getItemViewType(2));
+ assertEquals(10, adapter.getItemId(0));
+ assertEquals(11, adapter.getItemId(1));
+ assertEquals(12, adapter.getItemId(2));
+ assertTrue(adapter.hasStableIds());
+
+ assertEquals(3, listView.getChildCount());
+ TextView textView0 = (TextView) listView.getChildAt(0);
+ TextView textView1 = (TextView) listView.getChildAt(1);
+ CompoundButton checkBox2 =
+ (CompoundButton) ((ViewGroup) listView.getChildAt(2)).getChildAt(0);
+ assertEquals("Hello", textView0.getText());
+ assertEquals("World", textView1.getText());
+ assertEquals("Checkbox", checkBox2.getText());
+ assertTrue(checkBox2.isChecked());
+
+ // View being checked to false should launch the intent.
+ mActivityRule.runOnUiThread(() -> mRemoteViews.reapply(mActivity, mView));
+ mActivityRule.runOnUiThread(() -> checkBox2.setChecked(false));
+ mInstrumentation.waitForIdleSync();
+ assertNotNull(receiver.mIntent);
+ assertFalse(receiver.mIntent.getBooleanExtra(RemoteViews.EXTRA_CHECKED, true));
+ assertEquals(42, receiver.mIntent.getIntExtra("my-extra", 0));
+ }
+
+ @Test
+ public void testSetRemoteAdapter_newViewTypeAddedCoveredByViewTypeCount() {
+ ListView listView = mView.findViewById(R.id.remoteView_list);
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .addItem(10 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout))
+ .setViewTypeCount(2)
+ .build();
+
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(mActivityRule, listView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ Adapter initialAdapter = listView.getAdapter();
+ TextView initialFirstItemView = (TextView) listView.getChildAt(0);
+ int initialFirstItemViewType = initialAdapter.getItemViewType(0);
+
+ items = new RemoteCollectionItems.Builder()
+ .addItem(8 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.checkbox_layout))
+ .addItem(10 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout))
+ .setViewTypeCount(2)
+ .build();
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(mActivityRule, listView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ // The adapter should have been reused and simply updated. The view type for the first
+ // layoutId should have been maintained (as 0) and the next view type assigned to the
+ // checkbox layout. The view for the row should have been recycled without inflating a new
+ // view.
+ assertSame(initialAdapter, listView.getAdapter());
+ assertSame(initialFirstItemView, listView.getChildAt(1));
+ assertEquals(initialFirstItemViewType, listView.getAdapter().getItemViewType(1));
+ assertNotEquals(initialFirstItemViewType, listView.getAdapter().getItemViewType(0));
+ }
+
+ @Test
+ public void testSetRemoteAdapter_newViewTypeAddedToIncreaseViewTypeCount() {
+ ListView listView = mView.findViewById(R.id.remoteView_list);
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .addItem(10 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout))
+ .build();
+
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(mActivityRule, listView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ Adapter initialAdapter = listView.getAdapter();
+ TextView initialFirstItemView = (TextView) listView.getChildAt(0);
+
+ items = new RemoteCollectionItems.Builder()
+ .addItem(8 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.checkbox_layout))
+ .addItem(10 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout))
+ .build();
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(mActivityRule, listView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ // The adapter should have been replaced, which is required when the view type increases.
+ assertEquals(2, listView.getAdapter().getViewTypeCount());
+ assertNotSame(initialAdapter, listView.getAdapter());
+ assertNotSame(initialFirstItemView, listView.getChildAt(1));
+ }
+
+ @Test
+ public void testSetRemoteAdapter_viewTypeRemoved_viewTypeCountSame() {
+ ListView listView = mView.findViewById(R.id.remoteView_list);
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .addItem(8 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.checkbox_layout))
+ .addItem(10 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout))
+ .setViewTypeCount(2)
+ .build();
+
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(mActivityRule, listView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ Adapter initialAdapter = listView.getAdapter();
+ TextView initialSecondItemView = (TextView) listView.getChildAt(1);
+ assertEquals(1, initialAdapter.getItemViewType(1));
+
+ items = new RemoteCollectionItems.Builder()
+ .addItem(10 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout))
+ .setViewTypeCount(2)
+ .build();
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(mActivityRule, listView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ // The adapter should have been kept, and the second item should have maintained its view
+ // type of 1 even though its now the only view type.
+ assertEquals(2, listView.getAdapter().getViewTypeCount());
+ assertSame(initialAdapter, listView.getAdapter());
+ assertSame(initialSecondItemView, listView.getChildAt(0));
+ assertEquals(1, listView.getAdapter().getItemViewType(0));
+ }
+
+ @Test
+ public void testSetRemoteAdapter_viewTypeRemoved_viewTypeCountLowered() {
+ ListView listView = mView.findViewById(R.id.remoteView_list);
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .addItem(8 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.checkbox_layout))
+ .addItem(10 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout))
+ .build();
+
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(mActivityRule, listView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ Adapter initialAdapter = listView.getAdapter();
+ TextView initialSecondItemView = (TextView) listView.getChildAt(1);
+ assertEquals(1, initialAdapter.getItemViewType(1));
+
+ items = new RemoteCollectionItems.Builder()
+ .addItem(10 /* id= */, new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout))
+ .build();
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_list, items);
+ runOnMainAndDrawSync(mActivityRule, listView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ // The adapter should have been kept, and kept its higher view count to allow for views to
+ // be recycled.
+ assertEquals(2, listView.getAdapter().getViewTypeCount());
+ assertSame(initialAdapter, listView.getAdapter());
+ assertSame(initialSecondItemView, listView.getChildAt(0));
+ assertEquals(1, listView.getAdapter().getItemViewType(0));
+ }
+
+ @Test
+ public void testSetRemoteAdapter_gridView() {
+ RemoteViews item0 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item0.setViewLayoutWidth(android.R.id.text1, 100, TypedValue.COMPLEX_UNIT_DIP);
+ item0.setTextViewText(android.R.id.text1, "Hello");
+
+ RemoteViews item1 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item0.setViewLayoutWidth(android.R.id.text1, 100, TypedValue.COMPLEX_UNIT_DIP);
+ item1.setTextViewText(android.R.id.text1, "World");
+
+ RemoteViews item2 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item2.setViewLayoutWidth(android.R.id.text1, 100, TypedValue.COMPLEX_UNIT_DIP);
+ item2.setTextViewText(android.R.id.text1, "Hola");
+
+ RemoteViews item3 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item3.setViewLayoutWidth(android.R.id.text1, 100, TypedValue.COMPLEX_UNIT_DIP);
+ item3.setTextViewText(android.R.id.text1, "Mundo");
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .addItem(10 /* id= */, item0)
+ .addItem(11 /* id= */, item1)
+ .addItem(12 /* id= */, item2)
+ .addItem(13 /* id= */, item3)
+ .build();
+
+ mListView.setVisibility(View.GONE);
+ mGridView.setVisibility(View.VISIBLE);
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_grid, items);
+ runOnMainAndDrawSync(
+ mActivityRule, mGridView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ Adapter adapter = mGridView.getAdapter();
+ assertEquals(4, adapter.getCount());
+ assertEquals(1, adapter.getViewTypeCount());
+ assertEquals(adapter.getItemViewType(0), adapter.getItemViewType(1));
+ assertEquals(10, adapter.getItemId(0));
+ assertEquals(11, adapter.getItemId(1));
+ assertEquals(12, adapter.getItemId(2));
+ assertEquals(13, adapter.getItemId(3));
+
+ assertEquals(4, mGridView.getChildCount());
+ TextView textView0 = (TextView) mGridView.getChildAt(0);
+ TextView textView1 = (TextView) mGridView.getChildAt(1);
+ TextView textView2 = (TextView) mGridView.getChildAt(2);
+ TextView textView3 = (TextView) mGridView.getChildAt(3);
+ assertEquals("Hello", textView0.getText());
+ assertEquals("World", textView1.getText());
+ assertEquals("Hola", textView2.getText());
+ assertEquals("Mundo", textView3.getText());
+ }
+
+ @Test
+ public void testSetRemoteAdapter_stackView() {
+ RemoteViews item0 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item0.setTextViewText(android.R.id.text1, "Hello");
+
+ RemoteViews item1 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item1.setTextViewText(android.R.id.text1, "World");
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .addItem(10 /* id= */, item0)
+ .addItem(11 /* id= */, item1)
+ .build();
+
+ mListView.setVisibility(View.GONE);
+ mStackView.setVisibility(View.VISIBLE);
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_stack, items);
+ runOnMainAndDrawSync(
+ mActivityRule, mStackView, () -> mRemoteViews.reapply(mActivity, mView));
+
+ Adapter adapter = mStackView.getAdapter();
+ assertEquals(2, adapter.getCount());
+ assertEquals(1, adapter.getViewTypeCount());
+ assertEquals(adapter.getItemViewType(0), adapter.getItemViewType(1));
+ assertEquals(10, adapter.getItemId(0));
+ assertEquals(11, adapter.getItemId(1));
+ }
+
+ @Test
+ public void testSetRemoteAdapter_viewFlipper() {
+ RemoteViews item0 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item0.setTextViewText(android.R.id.text1, "Hello");
+
+ RemoteViews item1 = new RemoteViews(PACKAGE_NAME, R.layout.listitemfixed_layout);
+ item1.setTextViewText(android.R.id.text1, "World");
+
+ RemoteCollectionItems items = new RemoteCollectionItems.Builder()
+ .addItem(10 /* id= */, item0)
+ .addItem(11 /* id= */, item1)
+ .build();
+
+ mListView.setVisibility(View.GONE);
+ mAdapterViewFlipper.setVisibility(View.VISIBLE);
+ mRemoteViews.setRemoteAdapter(R.id.remoteView_flipper, items);
+ runOnMainAndDrawSync(
+ mActivityRule, mAdapterViewFlipper, () -> mRemoteViews.reapply(mActivity, mView));
+
+ Adapter adapter = mAdapterViewFlipper.getAdapter();
+ assertEquals(2, adapter.getCount());
+ assertEquals(1, adapter.getViewTypeCount());
+ assertEquals(adapter.getItemViewType(0), adapter.getItemViewType(1));
+ assertEquals(10, adapter.getItemId(0));
+ assertEquals(11, adapter.getItemId(1));
+ }
+
+ private static final class MockBroadcastReceiver extends BroadcastReceiver {
+
+ Intent mIntent;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mIntent = intent;
+ }
+ }
+
+}
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsRecyclingTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsRecyclingTest.java
new file mode 100644
index 0000000..17393cb
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsRecyclingTest.java
@@ -0,0 +1,425 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.RemoteViews;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Test {@link RemoteViews} recycling when adding views dynamically.
+ */
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class RemoteViewsRecyclingTest {
+ private static final String PACKAGE_NAME = "android.widget.cts";
+ private static final int LAYOUT_ID = 1;
+ private static final int FIRST_TEXT_ID = 2;
+ private static final int MIDDLE_TEXT_ID = 3;
+ private static final int AFTER_TEXT_ID = 4;
+ private static final int END_TEXT1_ID = 5;
+ private static final int END_TEXT2_ID = 6;
+
+ @Rule
+ public ActivityTestRule<RemoteViewsCtsActivity> mActivityRule =
+ new ActivityTestRule<>(RemoteViewsCtsActivity.class);
+
+ @Rule
+ public ExpectedException mExpectedException = ExpectedException.none();
+
+ private Instrumentation mInstrumentation;
+
+ private Context mContext;
+
+ private View mResult;
+
+ private Executor mExecutor = runnable -> runnable.run();
+
+ @UiThreadTest
+ @Before
+ public void setUp() {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ }
+
+ private void recycleWhenIdentical(boolean async) throws Throwable {
+ RemoteViews rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ rv.addStableView(R.id.remoteViews_recycle_container,
+ createRemoteViews(R.layout.remoteviews_textview), FIRST_TEXT_ID
+ );
+ rv.addView(R.id.remoteViews_recycle_container,
+ createRemoteViews(R.layout.remoteviews_textview));
+ rv.addStableView(R.id.remoteViews_recycle_container,
+ createRemoteViews(R.layout.remoteviews_textview), AFTER_TEXT_ID
+ );
+ applyRemoteViews(rv);
+ ViewGroup container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ View text1 = container.getChildAt(0);
+ View text2 = container.getChildAt(1);
+ View text3 = container.getChildAt(2);
+
+
+ reapplyRemoteViews(rv, async);
+
+ container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ assertNotNull(container);
+ assertSame("TextViews with stable id FIRST_TEXT_ID", text1, container.getChildAt(0));
+ assertNotSame("TextViews without stable id", text2, container.getChildAt(1));
+ assertSame("TextViews with stable id AFTER_TEXT_ID", text3, container.getChildAt(2));
+ assertEquals(3, container.getChildCount());
+ }
+
+ @Test
+ public void recycleWhenIdenticalSync() throws Throwable {
+ recycleWhenIdentical(false /* async */);
+ }
+
+ @Test
+ public void recycleWhenIdenticalAsync() throws Throwable {
+ recycleWhenIdentical(false /* async */);
+ }
+
+ private void doesntRecycleWhenNotAskingForRecycling(boolean async) throws Throwable {
+ RemoteViews rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithoutStableIds(rv, R.id.remoteViews_recycle_container, false /* insertInMiddle */,
+ false /* addAtEnd */);
+ applyRemoteViews(rv);
+ ViewGroup container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ View text1 = container.getChildAt(0);
+ View text2 = container.getChildAt(1);
+
+ reapplyRemoteViews(rv, async);
+
+ container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ assertNotNull(container);
+ assertNotSame("TextViews with stable id FIRST_TEXT_ID", text1, container.getChildAt(0));
+ assertNotSame("TextViews with stable id AFTER_TEXT_ID", text2, container.getChildAt(1));
+ assertEquals(2, container.getChildCount());
+ }
+
+ @Test
+ public void doesntRecycleWhenNotAskingForRecyclingSync() throws Throwable {
+ doesntRecycleWhenNotAskingForRecycling(false /* async */);
+ }
+
+ @Test
+ public void doesntRecycleWhenNotAskingForRecyclingAsync() throws Throwable {
+ doesntRecycleWhenNotAskingForRecycling(true /* async */);
+ }
+
+ private void recycleWhenInsertView(boolean async) throws Throwable {
+ RemoteViews rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, false /* insertInMiddle */,
+ false /* addAtEnd */);
+ applyRemoteViews(rv);
+ ViewGroup container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ View text1 = container.getChildAt(0);
+ View text2 = container.getChildAt(1);
+
+ rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, true /* insertInMiddle */,
+ false /* addAtEnd */);
+ reapplyRemoteViews(rv, async);
+
+ container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ assertNotNull(container);
+ assertNotNull(container.getChildAt(1));
+ assertSame("TextViews with stable id FIRST_TEXT_ID", text1, container.getChildAt(0));
+ assertSame("TextViews with stable id AFTER_TEXT_ID", text2, container.getChildAt(2));
+ assertNotNull(container);
+ assertEquals(3, container.getChildCount());
+ }
+
+ @Test
+ public void recycleWhenInsertViewSync() throws Throwable {
+ recycleWhenInsertView(false /* async */);
+ }
+
+ @Test
+ public void recycleWhenInsertViewAsync() throws Throwable {
+ recycleWhenInsertView(true /* async */);
+ }
+
+ private void recycleWhenRemovingMiddleView(boolean async) throws Throwable {
+ RemoteViews rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, true /* insertInMiddle */,
+ false /* addAtEnd */);
+ applyRemoteViews(rv);
+ ViewGroup container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ View text1 = container.getChildAt(0);
+ View text2 = container.getChildAt(2);
+
+ rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, false /* insertInMiddle */,
+ false /* addAtEnd */);
+ reapplyRemoteViews(rv, async);
+
+ container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ assertNotNull(container);
+ assertSame("TextViews with stable id FIRST_TEXT_ID", text1, container.getChildAt(0));
+ assertSame("TextViews with stable id AFTER_TEXT_ID", text2, container.getChildAt(1));
+ assertEquals(2, container.getChildCount());
+ }
+
+ @Test
+ public void recycleWhenRemovingMiddleViewSync() throws Throwable {
+ recycleWhenRemovingMiddleView(false /* async */);
+ }
+
+ @Test
+ public void recycleWhenRemovingMiddleViewAsync() throws Throwable {
+ recycleWhenRemovingMiddleView(true /* async */);
+ }
+
+ private void recycleWhenAddingAtEnd(boolean async) throws Throwable {
+ RemoteViews rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, false /* insertInMiddle */,
+ false /* addAtEnd */);
+ applyRemoteViews(rv);
+ ViewGroup container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ View text1 = container.getChildAt(0);
+ View text2 = container.getChildAt(1);
+
+ rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, false /* insertInMiddle */,
+ true /* addAtEnd */);
+ reapplyRemoteViews(rv, async);
+
+ container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ assertNotNull(container);
+ assertSame("TextViews with stable id FIRST_TEXT_ID", text1, container.getChildAt(0));
+ assertSame("TextViews with stable id AFTER_TEXT_ID", text2, container.getChildAt(1));
+ assertEquals(4, container.getChildCount());
+ }
+
+ @Test
+ public void recycleWhenAddingAtEndSync() throws Throwable {
+ recycleWhenAddingAtEnd(false /* async */);
+ }
+
+ @Test
+ public void recycleWhenAddingAtEndAsync() throws Throwable {
+ recycleWhenAddingAtEnd(true /* async */);
+ }
+
+ private void recycleWhenRemovingFromEnd(boolean async) throws Throwable {
+ RemoteViews rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, false /* insertInMiddle */,
+ true /* addAtEnd */);
+ applyRemoteViews(rv);
+ ViewGroup container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ View text1 = container.getChildAt(0);
+ View text2 = container.getChildAt(1);
+
+ rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, false /* insertInMiddle */,
+ false /* addAtEnd */);
+ reapplyRemoteViews(rv, async);
+
+ container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ assertNotNull(container);
+ assertSame("TextViews with stable id FIRST_TEXT_ID", text1, container.getChildAt(0));
+ assertSame("TextViews with stable id AFTER_TEXT_ID", text2, container.getChildAt(1));
+ assertEquals(2, container.getChildCount());
+ }
+
+ @Test
+ public void recycleWhenRemovingFromEndSync() throws Throwable {
+ recycleWhenRemovingFromEnd(false /* async */);
+ }
+
+ @Test
+ public void recycleWhenRemovingFromEndAsync() throws Throwable {
+ recycleWhenRemovingFromEnd(true /* async */);
+ }
+
+ private void doesntRecycleWhenLayoutDoesntMatch(boolean async) throws Throwable {
+ RemoteViews rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ rv.addStableView(R.id.remoteViews_recycle_container,
+ createRemoteViews(R.layout.remoteviews_textview), FIRST_TEXT_ID);
+ applyRemoteViews(rv);
+ ViewGroup container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ View text = container.getChildAt(0);
+
+ rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ rv.addStableView(R.id.remoteViews_recycle_container,
+ createRemoteViews(R.layout.remoteviews_container), FIRST_TEXT_ID);
+ reapplyRemoteViews(rv, async);
+
+ container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ assertNotNull(container);
+ assertNotNull(container.getChildAt(0));
+ assertNotSame("TextViews", text, container.getChildAt(0));
+ assertEquals(1, container.getChildCount());
+ }
+
+ @Test
+ public void doesntRecycleWhenLayoutDoesntMatchSync() throws Throwable {
+ doesntRecycleWhenLayoutDoesntMatch(false /* async */);
+ }
+
+ @Test
+ public void doesntRecycleWhenLayoutDoesntMatchAsync() throws Throwable {
+ doesntRecycleWhenLayoutDoesntMatch(true /* async */);
+ }
+
+ private void recycleWhenRemovingFromEndAndInsertInMiddleAtManyLevels(boolean async)
+ throws Throwable {
+ RemoteViews rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ rv.addStableView(R.id.remoteViews_recycle_container,
+ createRemoteViews(R.layout.remoteviews_container), LAYOUT_ID);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, false /* insertInMiddle */,
+ true /* addAtEnd */);
+ rv.removeAllViews(R.id.remoteView_container);
+ addTextsWithStableIds(rv, R.id.remoteView_container, false /* insertInMiddle */,
+ true /* addAtEnd */);
+ applyRemoteViews(rv);
+ ViewGroup container = mResult.findViewById(R.id.remoteViews_recycle_container);
+ ViewGroup container2 = (ViewGroup) container.getChildAt(0);
+ View text1 = container.getChildAt(1);
+ View text2 = container.getChildAt(2);
+ View text3 = container2.getChildAt(0);
+ View text4 = container2.getChildAt(1);
+
+ rv = createRemoteViews(R.layout.remoteviews_recycle);
+ rv.removeAllViews(R.id.remoteViews_recycle_container);
+ rv.addStableView(R.id.remoteViews_recycle_container,
+ createRemoteViews(R.layout.remoteviews_container), LAYOUT_ID);
+ addTextsWithStableIds(rv, R.id.remoteViews_recycle_container, true /* insertInMiddle */,
+ false /* addAtEnd */);
+ rv.removeAllViews(R.id.remoteView_container);
+ addTextsWithStableIds(rv, R.id.remoteView_container, true /* insertInMiddle */,
+ false /* addAtEnd */);
+ reapplyRemoteViews(rv, async);
+
+ assertNotNull(container);
+ assertNotNull(container2);
+ assertSame("ViewGroup with stable id LAYOUT_ID", container2, container.getChildAt(0));
+ assertSame("TextViews with stable id FIRST_TEXT_ID", text1, container.getChildAt(1));
+ assertSame("TextViews with stable id AFTER_TEXT_ID", text2, container.getChildAt(3));
+ assertSame("TextViews with stable id FIRST_TEXT_ID", text3, container2.getChildAt(0));
+ assertSame("TextViews with stable id AFTER_TEXT_ID", text4, container2.getChildAt(2));
+ assertEquals(4, container.getChildCount());
+ assertEquals(3, container2.getChildCount());
+ }
+
+ @Test
+ public void recycleWhenRemovingFromEndAndInsertInMiddleAtManyLevelsSync() throws Throwable {
+ recycleWhenRemovingFromEndAndInsertInMiddleAtManyLevels(false /* async */);
+ }
+
+ @Test
+ public void recycleWhenRemovingFromEndAndInsertInMiddleAtManyLevelsAsync() throws Throwable {
+ recycleWhenRemovingFromEndAndInsertInMiddleAtManyLevels(true /* async */);
+ }
+
+ private void applyRemoteViews(RemoteViews remoteViews) throws Throwable {
+ mActivityRule.runOnUiThread(() -> {
+ mResult = remoteViews.apply(mContext, null);
+ // Add our host view to the activity behind this test. This is similar to how launchers
+ // add widgets to the on-screen UI.
+ ViewGroup root = mActivityRule.getActivity().findViewById(R.id.remoteView_host);
+ root.removeAllViews();
+ FrameLayout.MarginLayoutParams lp = new FrameLayout.MarginLayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT);
+ mResult.setLayoutParams(lp);
+
+ root.addView(mResult);
+ });
+ }
+
+ private void reapplyRemoteViews(RemoteViews remoteViews, boolean async) throws Throwable {
+ if (async) {
+ mActivityRule.runOnUiThread(
+ () -> remoteViews.reapplyAsync(mContext, mResult, null, null));
+ Thread.sleep(100); // Wait for the UI to be updated
+ } else {
+ mActivityRule.runOnUiThread(() -> remoteViews.reapply(mContext, mResult));
+ }
+ }
+
+ private RemoteViews createRemoteViews(int layout) {
+ return new RemoteViews(PACKAGE_NAME, layout);
+ }
+
+ private void addTextsWithStableIds(RemoteViews views, int layoutId, boolean insertInMiddle,
+ boolean addAtEnd) {
+ views.addStableView(layoutId, createRemoteViews(R.layout.remoteviews_textview),
+ FIRST_TEXT_ID);
+ if (insertInMiddle) {
+ views.addStableView(layoutId, createRemoteViews(R.layout.remoteviews_textview),
+ MIDDLE_TEXT_ID);
+ }
+ views.addStableView(layoutId, createRemoteViews(R.layout.remoteviews_textview),
+ AFTER_TEXT_ID);
+ if (addAtEnd) {
+ views.addStableView(layoutId, createRemoteViews(R.layout.remoteviews_textview),
+ END_TEXT1_ID);
+ views.addStableView(layoutId, createRemoteViews(R.layout.remoteviews_textview),
+ END_TEXT2_ID);
+ }
+ }
+
+ private void addTextsWithoutStableIds(RemoteViews views, int layoutId, boolean insertInMiddle,
+ boolean addAtEnd) {
+ views.addView(layoutId, createRemoteViews(R.layout.remoteviews_textview));
+ if (insertInMiddle) {
+ views.addView(layoutId, createRemoteViews(R.layout.remoteviews_textview));
+ }
+ views.addView(layoutId, createRemoteViews(R.layout.remoteviews_textview));
+ if (addAtEnd) {
+ views.addView(layoutId, createRemoteViews(R.layout.remoteviews_textview));
+ views.addView(layoutId, createRemoteViews(R.layout.remoteviews_textview));
+ }
+ }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
index 3f37ac0..4e99196 100644
--- a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
@@ -1046,10 +1046,10 @@
DisplayMetrics displayMetrics = textView.getResources().getDisplayMetrics();
assertMargins(
textView,
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 10, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 30, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 40, displayMetrics)));
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 10, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 30, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 40, displayMetrics));
}
@Test
@@ -1063,10 +1063,10 @@
DisplayMetrics displayMetrics = textViewLtr.getResources().getDisplayMetrics();
assertMargins(
textViewLtr,
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 10, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 30, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 40, displayMetrics)));
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 10, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 30, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 40, displayMetrics));
View textViewRtl = mResult.findViewById(R.id.remoteView_text_rtl);
mRemoteViews.setViewLayoutMargin(textViewRtl.getId(), MARGIN_START, 10, COMPLEX_UNIT_DIP);
@@ -1077,10 +1077,10 @@
displayMetrics = textViewRtl.getResources().getDisplayMetrics();
assertMargins(
textViewRtl,
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 30, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 10, displayMetrics)),
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 40, displayMetrics)));
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 30, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 10, displayMetrics),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 40, displayMetrics));
}
@Test
@@ -1154,7 +1154,7 @@
mRemoteViews.setViewLayoutWidth(R.id.remoteView_text, 20, COMPLEX_UNIT_DIP);
mActivityRule.runOnUiThread(() -> mRemoteViews.reapply(mContext, mResult));
assertEquals(
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics)),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics),
textView.getLayoutParams().width);
mRemoteViews.setViewLayoutWidth(
@@ -1185,7 +1185,7 @@
mRemoteViews.setViewLayoutHeight(R.id.remoteView_text, 20, COMPLEX_UNIT_DIP);
mActivityRule.runOnUiThread(() -> mRemoteViews.reapply(mContext, mResult));
assertEquals(
- Math.round(TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics)),
+ (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, 20, displayMetrics),
textView.getLayoutParams().height);
mRemoteViews.setViewLayoutHeight(
diff --git a/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java b/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
index 93bd02e..1d75886 100644
--- a/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
@@ -27,6 +27,7 @@
import android.app.Activity;
import android.app.Instrumentation;
+import android.app.compat.CompatChanges;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
@@ -71,6 +72,9 @@
private static final int PAGE_HEIGHT_DPI = 100;
private static final int TOLERANCE = 2;
+ static final long USE_STRETCH_EDGE_EFFECT_BY_DEFAULT = 171228096L;
+ static final long USE_STRETCH_EDGE_EFFECT_FOR_SUPPORTED = 178807038L;
+
private int mItemWidth;
private int mItemHeight;
private int mPageWidth;
@@ -845,8 +849,10 @@
@Test
public void testEdgeEffectType() {
- // Should default to "glow"
- assertEquals(EdgeEffect.TYPE_GLOW, mScrollViewRegular.getEdgeEffectType());
+ int expectedStartType = (CompatChanges.isChangeEnabled(USE_STRETCH_EDGE_EFFECT_BY_DEFAULT)
+ || CompatChanges.isChangeEnabled(USE_STRETCH_EDGE_EFFECT_FOR_SUPPORTED))
+ ? EdgeEffect.TYPE_STRETCH : EdgeEffect.TYPE_GLOW;
+ assertEquals(expectedStartType, mScrollViewRegular.getEdgeEffectType());
// This one has "stretch" attribute
assertEquals(EdgeEffect.TYPE_STRETCH, mScrollViewStretch.getEdgeEffectType());
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index 93ffda3..c114fd2 100644
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -82,6 +82,7 @@
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
+import android.text.StaticLayout;
import android.text.TextDirectionHeuristics;
import android.text.TextPaint;
import android.text.TextUtils;
@@ -8721,6 +8722,27 @@
assertEquals(TextDirectionHeuristics.LOCALE, textView.getTextDirectionHeuristic());
}
+ @Test
+ public void measureConsistency() {
+ String text = "12\n34";
+ TextView textView = new TextView(mActivity);
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 100);
+ textView.setText(text);
+
+ int width = (int) Math.ceil(Layout.getDesiredWidth(text, textView.getPaint()));
+ int height = StaticLayout.Builder.obtain(text, 0, text.length(),
+ textView.getPaint(), width).build().getHeight();
+ // Reserve enough width for the text.
+ int wMeasureSpec = View.MeasureSpec.makeMeasureSpec(width * 2, View.MeasureSpec.AT_MOST);
+ int hMeasureSpec = View.MeasureSpec.makeMeasureSpec(height * 2, View.MeasureSpec.AT_MOST);
+
+ textView.measure(wMeasureSpec, hMeasureSpec);
+ int measuredWidth = textView.getMeasuredWidth();
+
+ textView.measure(wMeasureSpec, hMeasureSpec);
+ assertEquals(measuredWidth, textView.getMeasuredWidth());
+ }
+
private void initializeTextForSmartSelection(CharSequence text) throws Throwable {
assertTrue(text.length() >= SMARTSELECT_END);
mActivityRule.runOnUiThread(() -> {
diff --git a/tests/tests/widget/src/android/widget/cts/ToastTest.java b/tests/tests/widget/src/android/widget/cts/ToastTest.java
index d2a6a90..cc44b20 100644
--- a/tests/tests/widget/src/android/widget/cts/ToastTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ToastTest.java
@@ -16,6 +16,7 @@
package android.widget.cts;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
@@ -32,6 +33,7 @@
import static java.util.stream.Collectors.toList;
+import android.app.ActivityOptions;
import android.app.NotificationManager;
import android.app.UiAutomation;
import android.app.UiAutomation.AccessibilityEventFilter;
@@ -857,19 +859,18 @@
Intent intent = new Intent();
intent.setComponent(COMPONENT_TRANSLUCENT_ACTIVITY);
intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
+ // Launch the translucent activity in fullscreen to ensure the test activity won't resume
+ // even on the freeform-first multi-window device.
+ final ActivityOptions options = ActivityOptions.makeBasic();
+ options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ mContext.startActivity(intent, options.toBundle());
activityStarted.block();
makeCustomToast();
View view = mToast.getView();
mActivityRule.runOnUiThread(mToast::show);
- // The custom toast should not be blocked in multi-window mode. Otherwise, it should be.
- if (mActivityRule.getActivity().isInMultiWindowMode()) {
- assertCustomToastShown(view);
- } else {
- assertCustomToastNotShown(view);
- }
+ assertCustomToastNotShown(view);
mContext.sendBroadcast(new Intent(ACTION_TRANSLUCENT_ACTIVITY_FINISH));
}
diff --git a/tests/tests/widget/src/android/widget/cts/util/StretchEdgeUtil.kt b/tests/tests/widget/src/android/widget/cts/util/StretchEdgeUtil.kt
index 8520f44..2afd599 100644
--- a/tests/tests/widget/src/android/widget/cts/util/StretchEdgeUtil.kt
+++ b/tests/tests/widget/src/android/widget/cts/util/StretchEdgeUtil.kt
@@ -208,9 +208,10 @@
val downInjected = AnimationUtils.currentAnimationTimeMillis()
- // The receding time is 600 ms, but we don't want to be near the final
- // part of the animation when the pixels may overlap.
- if (downInjected - lastMotion < 400) {
+ // The receding time is based on the spring, but 100 ms should be soon
+ // enough that the animation is within the beginning and it shouldn't have
+ // receded far yet.
+ if (downInjected - lastMotion < 100) {
// Now make sure that we wait until the release should normally have finished:
sleepAnimationTime(600)
@@ -250,11 +251,11 @@
0,
0,
0,
- 50
+ 90
)
// The blue should stretch beyond its normal dimensions
- return bitmap.getPixel(45, 52) == Color.BLUE
+ return bitmap.getPixel(45, 48) == Color.BLUE
}
/**
@@ -270,7 +271,7 @@
view,
0,
0,
- 50,
+ 90,
0
)
@@ -292,11 +293,11 @@
0,
89,
0,
- -50
+ -90
)
// The magenta should stretch beyond its normal dimensions
- return bitmap.getPixel(45, 38) == Color.MAGENTA
+ return bitmap.getPixel(45, 42) == Color.MAGENTA
}
/**
@@ -312,7 +313,7 @@
view,
89,
0,
- -50,
+ -90,
0
)
@@ -334,7 +335,7 @@
0,
0,
0,
- 89
+ 150
) ?: return true // when timing fails to get a bitmap, don't treat it as a flake
// The blue should stretch beyond its normal dimensions
@@ -354,7 +355,7 @@
view,
0,
0,
- 89,
+ 150,
0
) ?: return true // when timing fails to get a bitmap, don't treat it as a flake
@@ -376,7 +377,7 @@
0,
89,
0,
- -89
+ -150
) ?: return true // when timing fails to get a bitmap, don't treat it as a flake
// The magenta should stretch beyond its normal dimensions
@@ -396,7 +397,7 @@
view,
89,
0,
- -89,
+ -150,
0
) ?: return true // when timing fails to get a bitmap, don't treat it as a flake
diff --git a/tests/tests/wifi/CtsWifiLocationTestApp/src/android/net/wifi/cts/app/RetrieveTransportInfoAndReturnStatusActivity.java b/tests/tests/wifi/CtsWifiLocationTestApp/src/android/net/wifi/cts/app/RetrieveTransportInfoAndReturnStatusActivity.java
index 9f7178b..e8fb06d 100644
--- a/tests/tests/wifi/CtsWifiLocationTestApp/src/android/net/wifi/cts/app/RetrieveTransportInfoAndReturnStatusActivity.java
+++ b/tests/tests/wifi/CtsWifiLocationTestApp/src/android/net/wifi/cts/app/RetrieveTransportInfoAndReturnStatusActivity.java
@@ -19,8 +19,10 @@
import android.app.Activity;
import android.content.Intent;
import android.net.ConnectivityManager;
+import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
import android.net.TransportInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
@@ -28,6 +30,8 @@
import android.util.Log;
import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
/**
* An activity that retrieves Transport info and returns status.
@@ -35,46 +39,73 @@
public class RetrieveTransportInfoAndReturnStatusActivity extends Activity {
private static final String TAG = "RetrieveTransportInfoAndReturnStatusActivity";
private static final String STATUS_EXTRA = "android.net.wifi.cts.app.extra.STATUS";
+ private static final int DURATION_NETWORK_CONNECTION_MILLIS = 60_000;
+
+ private static class TestNetworkCallback extends ConnectivityManager.NetworkCallback {
+ private final CountDownLatch mCountDownLatch;
+ public boolean onAvailableCalled = false;
+ public NetworkCapabilities networkCapabilities;
+
+ TestNetworkCallback(CountDownLatch countDownLatch) {
+ super(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO);
+ mCountDownLatch = countDownLatch;
+ }
+
+ @Override
+ public void onAvailable(Network network) {
+ onAvailableCalled = true;
+ }
+
+ @Override
+ public void onCapabilitiesChanged(Network network,
+ NetworkCapabilities networkCapabilities) {
+ if (onAvailableCalled) {
+ this.networkCapabilities = networkCapabilities;
+ mCountDownLatch.countDown();
+ }
+ }
+ }
public static boolean canRetrieveSsidFromTransportInfo(
String logTag, ConnectivityManager connectivityManager) {
- // Assumes wifi network is the default route.
- Network[] networks = connectivityManager.getAllNetworks();
- if (networks == null || networks.length == 0) {
- Log.e(logTag, " Failed to get any networks");
- return false;
- }
- NetworkCapabilities wifiNetworkCapabilities = null;
- for (Network network : networks) {
- NetworkCapabilities networkCapabilities =
- connectivityManager.getNetworkCapabilities(network);
- if (networkCapabilities == null) {
- Log.e(logTag, "Failed to get network capabilities for network: " + network);
- continue;
+ CountDownLatch countDownLatch = new CountDownLatch(1);
+ TestNetworkCallback testNetworkCallback = new TestNetworkCallback(countDownLatch);
+ try {
+ // File a callback for wifi network.
+ connectivityManager.registerNetworkCallback(
+ new NetworkRequest.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .build(),
+ testNetworkCallback);
+ // Wait for callback.
+ if (!countDownLatch.await(
+ DURATION_NETWORK_CONNECTION_MILLIS, TimeUnit.MILLISECONDS)) {
+ Log.e(logTag, "Timed out waiting for wifi network");
+ return false;
}
- if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
- wifiNetworkCapabilities = networkCapabilities;
- break;
+ if (!testNetworkCallback.onAvailableCalled) {
+ Log.e(logTag, "Failed to get wifi network onAvailable");
+ return false;
}
- }
- if (wifiNetworkCapabilities == null) {
- Log.e(logTag, "Failed to get network capabilities for wifi network."
- + " Available networks: " + networks);
+ TransportInfo transportInfo =
+ testNetworkCallback.networkCapabilities.getTransportInfo();
+ if (!(transportInfo instanceof WifiInfo)) {
+ Log.e(logTag, "Failed to retrieve WifiInfo");
+ return false;
+ }
+ WifiInfo wifiInfo = (WifiInfo) transportInfo;
+ boolean succeeded = !Objects.equals(wifiInfo.getSSID(), WifiManager.UNKNOWN_SSID);
+ if (succeeded) {
+ Log.v(logTag, "SSID from transport info retrieval succeeded");
+ } else {
+ Log.v(logTag, "Failed to retrieve SSID from transport info");
+ }
+ return succeeded;
+ } catch (InterruptedException e) {
return false;
+ } finally {
+ connectivityManager.unregisterNetworkCallback(testNetworkCallback);
}
- TransportInfo transportInfo = wifiNetworkCapabilities.getTransportInfo();
- if (!(transportInfo instanceof WifiInfo)) {
- Log.e(logTag, " Failed to retrieve WifiInfo");
- return false;
- }
- WifiInfo wifiInfo = (WifiInfo) transportInfo;
- boolean succeeded = !Objects.equals(wifiInfo.getSSID(), WifiManager.UNKNOWN_SSID);
- if (succeeded) {
- Log.v(logTag, "SSID from transport info retrieval succeeded");
- } else {
- Log.v(logTag, "Failed to retrieve SSID from transport info");
- }
- return succeeded;
}
@Override
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/ConnectedNetworkScorerTest.java b/tests/tests/wifi/src/android/net/wifi/cts/ConnectedNetworkScorerTest.java
index 28e2bb2..8af7090 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/ConnectedNetworkScorerTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/ConnectedNetworkScorerTest.java
@@ -18,6 +18,7 @@
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.NETWORK_SETTINGS;
+import static android.Manifest.permission.READ_WIFI_CREDENTIAL;
import static android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE;
import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID;
import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE;
@@ -25,6 +26,10 @@
import static android.net.wifi.WifiUsabilityStatsEntry.PROBE_STATUS_NO_PROBE;
import static android.net.wifi.WifiUsabilityStatsEntry.PROBE_STATUS_SUCCESS;
import static android.net.wifi.WifiUsabilityStatsEntry.PROBE_STATUS_UNKNOWN;
+import static android.net.wifi.WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE;
+import static android.net.wifi.WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK;
+import static android.net.wifi.WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI;
+import static android.net.wifi.WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO;
import static android.os.Process.myUid;
import static com.google.common.truth.Truth.assertThat;
@@ -42,6 +47,7 @@
import android.net.wifi.WifiNetworkSpecifier;
import android.net.wifi.WifiNetworkSuggestion;
import android.net.wifi.WifiUsabilityStatsEntry;
+import android.net.wifi.WifiConnectedSessionInfo;
import android.os.Build;
import android.platform.test.annotations.AppModeFull;
import android.support.test.uiautomator.UiDevice;
@@ -66,6 +72,7 @@
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -120,7 +127,7 @@
mTestHelper.turnScreenOn();
// Clear any existing app state before each test.
- if (BuildCompat.isAtLeastS()) {
+ if (WifiBuildCompat.isAtLeastS(mContext)) {
ShellIdentityUtils.invokeWithShellPermissions(
() -> mWifiManager.removeAppState(myUid(), mContext.getPackageName()));
}
@@ -232,6 +239,39 @@
} catch (NoSuchElementException e) {
// pass - Device does not support the field.
}
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_BE).getContentionTimeMinMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_BE).getContentionTimeMaxMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_BE).getContentionTimeAvgMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_BE).getContentionNumSamples()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_BK).getContentionTimeMinMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_BK).getContentionTimeMaxMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_BK).getContentionTimeAvgMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_BK).getContentionNumSamples()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_VI).getContentionTimeMinMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_VI).getContentionTimeMaxMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_VI).getContentionTimeAvgMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_VI).getContentionNumSamples()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_VO).getContentionTimeMinMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_VO).getContentionTimeMaxMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_VO).getContentionTimeAvgMicros()).isAtLeast(0);
+ assertThat(statsEntry.getContentionTimeStats(
+ WME_ACCESS_CATEGORY_VO).getContentionNumSamples()).isAtLeast(0);
+ assertThat(statsEntry.getChannelUtilizationRatio()).isIn(Range.closed(0, 255));
}
// no longer populated, return default value.
assertThat(statsEntry.getCellularDataNetworkType())
@@ -280,26 +320,19 @@
}
}
- private static class TestConnectedNetworkScorer implements
+ private static abstract class TestConnectedNetworkScorer implements
WifiManager.WifiConnectedNetworkScorer {
- private CountDownLatch mCountDownLatch;
+ protected CountDownLatch mCountDownLatch;
public Integer startSessionId;
public Integer stopSessionId;
public WifiManager.ScoreUpdateObserver scoreUpdateObserver;
+ public boolean isUserSelected;
TestConnectedNetworkScorer(CountDownLatch countDownLatch) {
mCountDownLatch = countDownLatch;
}
@Override
- public void onStart(int sessionId) {
- synchronized (mCountDownLatch) {
- this.startSessionId = sessionId;
- mCountDownLatch.countDown();
- }
- }
-
- @Override
public void onStop(int sessionId) {
synchronized (mCountDownLatch) {
this.stopSessionId = sessionId;
@@ -309,7 +342,9 @@
@Override
public void onSetScoreUpdateObserver(WifiManager.ScoreUpdateObserver observerImpl) {
- this.scoreUpdateObserver = observerImpl;
+ synchronized (mCountDownLatch) {
+ this.scoreUpdateObserver = observerImpl;
+ }
}
public void resetCountDownLatch(CountDownLatch countDownLatch) {
@@ -319,22 +354,73 @@
}
}
+ private static class TestConnectedNetworkScorerWithSessionId extends
+ TestConnectedNetworkScorer {
+ TestConnectedNetworkScorerWithSessionId(CountDownLatch countDownLatch) {
+ super(countDownLatch);
+ isUserSelected = false;
+ }
+
+ @Override
+ public void onStart(int sessionId) {
+ synchronized (mCountDownLatch) {
+ this.startSessionId = sessionId;
+ mCountDownLatch.countDown();
+ }
+ }
+ }
+
+ private static class TestConnectedNetworkScorerWithSessionInfo extends
+ TestConnectedNetworkScorer {
+ TestConnectedNetworkScorerWithSessionInfo(CountDownLatch countDownLatch) {
+ super(countDownLatch);
+ }
+
+ @Override
+ public void onStart(WifiConnectedSessionInfo sessionInfo) {
+ synchronized (mCountDownLatch) {
+ this.startSessionId = sessionInfo.getSessionId();
+ this.isUserSelected = sessionInfo.isUserSelected();
+ mCountDownLatch.countDown();
+ }
+ }
+ }
+
/**
- * Tests the {@link android.net.wifi.WifiConnectedNetworkScorer} interface.
- *
+ * Tests the
+ * {@link android.net.wifi.WifiConnectedNetworkScorer#onStart(WifiConnectionSessionInfo)}.
+ */
+ @Test
+ public void testConnectedNetworkScorerWithSessionInfo() throws Exception {
+ CountDownLatch countDownLatchScorer = new CountDownLatch(1);
+ TestConnectedNetworkScorerWithSessionInfo connectedNetworkScorer =
+ new TestConnectedNetworkScorerWithSessionInfo(countDownLatchScorer);
+ testSetWifiConnectedNetworkScorer(connectedNetworkScorer, countDownLatchScorer);
+ }
+
+ /**
+ * Tests the {@link android.net.wifi.WifiConnectedNetworkScorer#onStart(int)}.
+ */
+ @Test
+ public void testConnectedNetworkScorerWithSessionId() throws Exception {
+ CountDownLatch countDownLatchScorer = new CountDownLatch(1);
+ TestConnectedNetworkScorerWithSessionId connectedNetworkScorer =
+ new TestConnectedNetworkScorerWithSessionId(countDownLatchScorer);
+ testSetWifiConnectedNetworkScorer(connectedNetworkScorer, countDownLatchScorer);
+ }
+
+ /**
* Note: We could write more interesting test cases (if the device has a mobile connection), but
* that would make the test flaky. The default network/route selection on the device is not just
* controlled by the wifi scorer input, but also based on params which are controlled by
* other parts of the platform (likely in connectivity service) and hence will behave
* differently on OEM devices.
*/
- @Test
- public void testSetWifiConnectedNetworkScorer() throws Exception {
- CountDownLatch countDownLatchScorer = new CountDownLatch(1);
+ private void testSetWifiConnectedNetworkScorer(
+ TestConnectedNetworkScorer connectedNetworkScorer,
+ CountDownLatch countDownLatchScorer) throws Exception {
CountDownLatch countDownLatchUsabilityStats = new CountDownLatch(1);
UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
- TestConnectedNetworkScorer connectedNetworkScorer =
- new TestConnectedNetworkScorer(countDownLatchScorer);
TestUsabilityStatsListener usabilityStatsListener =
new TestUsabilityStatsListener(countDownLatchUsabilityStats);
boolean disconnected = false;
@@ -350,6 +436,7 @@
assertThat(countDownLatchScorer.await(DURATION, TimeUnit.MILLISECONDS)).isTrue();
assertThat(connectedNetworkScorer.startSessionId).isAtLeast(0);
+ assertThat(connectedNetworkScorer.isUserSelected).isEqualTo(false);
assertThat(connectedNetworkScorer.scoreUpdateObserver).isNotNull();
WifiManager.ScoreUpdateObserver scoreUpdateObserver =
connectedNetworkScorer.scoreUpdateObserver;
@@ -411,8 +498,8 @@
public void testSetWifiConnectedNetworkScorerOnSubsystemRestart() throws Exception {
CountDownLatch countDownLatchScorer = new CountDownLatch(1);
UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
- TestConnectedNetworkScorer connectedNetworkScorer =
- new TestConnectedNetworkScorer(countDownLatchScorer);
+ TestConnectedNetworkScorerWithSessionInfo connectedNetworkScorer =
+ new TestConnectedNetworkScorerWithSessionInfo(countDownLatchScorer);
try {
uiAutomation.adoptShellPermissionIdentity();
// Clear any external scorer already active on the device.
@@ -468,27 +555,28 @@
*/
ConnectivityManager.NetworkCallback initiateConnection(
@NonNull WifiConfiguration testNetwork,
- @NonNull ScheduledExecutorService executorService);
+ @NonNull ScheduledExecutorService executorService) throws Exception;
}
private void setWifiConnectedNetworkScorerAndInitiateConnectToSpecifierOrRestrictedSuggestion(
@NonNull ConnectionInitiator connectionInitiator) throws Exception {
CountDownLatch countDownLatchScorer = new CountDownLatch(1);
UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
- TestConnectedNetworkScorer connectedNetworkScorer =
- new TestConnectedNetworkScorer(countDownLatchScorer);
+ TestConnectedNetworkScorerWithSessionInfo connectedNetworkScorer =
+ new TestConnectedNetworkScorerWithSessionInfo(countDownLatchScorer);
ConnectivityManager.NetworkCallback networkCallback = null;
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
List<WifiConfiguration> savedNetworks = null;
try {
uiAutomation.adoptShellPermissionIdentity(
- NETWORK_SETTINGS, WIFI_UPDATE_USABILITY_STATS_SCORE, CONNECTIVITY_INTERNAL);
+ NETWORK_SETTINGS, WIFI_UPDATE_USABILITY_STATS_SCORE, CONNECTIVITY_INTERNAL,
+ READ_WIFI_CREDENTIAL);
// Clear any external scorer already active on the device.
mWifiManager.clearWifiConnectedNetworkScorer();
Thread.sleep(500);
- savedNetworks = mWifiManager.getConfiguredNetworks();
+ savedNetworks = mWifiManager.getPrivilegedConfiguredNetworks();
WifiConfiguration testNetwork =
TestHelper.findMatchingSavedNetworksWithBssid(mWifiManager, savedNetworks)
.get(0);
@@ -560,7 +648,7 @@
}
private void testSetWifiConnectedNetworkScorerForRestrictedSuggestionConnection(
- int restrictedNetworkCapability) throws Exception {
+ Set<Integer> restrictedNetworkCapabilities) throws Exception {
setWifiConnectedNetworkScorerAndInitiateConnectToSpecifierOrRestrictedSuggestion(
(testNetwork, executorService) -> {
// Connect using wifi network suggestion.
@@ -568,16 +656,15 @@
TestHelper
.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
testNetwork);
- if (restrictedNetworkCapability == NET_CAPABILITY_OEM_PAID) {
+ if (restrictedNetworkCapabilities.contains(NET_CAPABILITY_OEM_PAID)) {
suggestionBuilder.setOemPaid(true);
- } else if (restrictedNetworkCapability == NET_CAPABILITY_OEM_PRIVATE) {
+ }
+ if (restrictedNetworkCapabilities.contains(NET_CAPABILITY_OEM_PRIVATE)) {
suggestionBuilder.setOemPrivate(true);
- } else {
- fail("Unexpected capability: " + restrictedNetworkCapability);
}
return mTestHelper.testConnectionFlowWithSuggestionWithShellIdentity(
testNetwork, suggestionBuilder.build(), executorService,
- restrictedNetworkCapability);
+ restrictedNetworkCapabilities);
}
);
}
@@ -591,7 +678,8 @@
@SdkSuppress(minSdkVersion = 31, codeName = "S")
@Test
public void testSetWifiConnectedNetworkScorerForOemPaidSuggestionConnection() throws Exception {
- testSetWifiConnectedNetworkScorerForRestrictedSuggestionConnection(NET_CAPABILITY_OEM_PAID);
+ testSetWifiConnectedNetworkScorerForRestrictedSuggestionConnection(
+ Set.of(NET_CAPABILITY_OEM_PAID));
}
/**
@@ -605,6 +693,6 @@
public void testSetWifiConnectedNetworkScorerForOemPrivateSuggestionConnection()
throws Exception {
testSetWifiConnectedNetworkScorerForRestrictedSuggestionConnection(
- NET_CAPABILITY_OEM_PRIVATE);
+ Set.of(NET_CAPABILITY_OEM_PRIVATE));
}
}
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/EasyConnectStatusCallbackTest.java b/tests/tests/wifi/src/android/net/wifi/cts/EasyConnectStatusCallbackTest.java
index c75ee5a..6d111fe 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/EasyConnectStatusCallbackTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/EasyConnectStatusCallbackTest.java
@@ -18,12 +18,13 @@
import static android.net.wifi.EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_TIMEOUT;
import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_PSK;
-import static android.net.wifi.WifiManager.EASY_CONNECT_CRYPTOGRAPHY_CURVE_DEFAULT;
+import static android.net.wifi.WifiManager.EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1;
import static android.net.wifi.WifiManager.EASY_CONNECT_NETWORK_ROLE_STA;
import android.annotation.NonNull;
import android.app.UiAutomation;
import android.content.Context;
+import android.net.Uri;
import android.net.wifi.EasyConnectStatusCallback;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
@@ -45,7 +46,7 @@
public class EasyConnectStatusCallbackTest extends WifiJUnit3TestBase {
private static final String TEST_SSID = "\"testSsid\"";
private static final String TEST_PASSPHRASE = "\"testPassword\"";
- private static final int TEST_WAIT_DURATION_MS = 18_000; // Long delay is necessary, see below
+ private static final int TEST_WAIT_DURATION_MS = 22_000; // Long delay is necessary, see below
private WifiManager mWifiManager;
private static final String TEST_DPP_URI =
"DPP:C:81/1,117/40;I:Easy_Connect_Demo;M:000102030405;"
@@ -117,7 +118,7 @@
}
@Override
- public void onBootstrapUriGenerated(@NonNull String uri) {
+ public void onBootstrapUriGenerated(@NonNull Uri dppUri) {
synchronized (mLock) {
mOnBootstrapUriGeneratedCallback = true;
mLock.notify();
@@ -219,8 +220,10 @@
try {
uiAutomation.adoptShellPermissionIdentity();
synchronized (mLock) {
+ assertTrue(mWifiManager.getEasyConnectMaxAllowedResponderDeviceInfoLength()
+ > TEST_DEVICE_INFO.length());
mWifiManager.startEasyConnectAsEnrolleeResponder(TEST_DEVICE_INFO,
- EASY_CONNECT_CRYPTOGRAPHY_CURVE_DEFAULT, mExecutor,
+ EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mExecutor,
mEasyConnectStatusCallback);
// Wait for supplicant to generate DPP URI and trigger the callback function to
// provide the generated URI.
@@ -255,7 +258,7 @@
try {
uiAutomation.adoptShellPermissionIdentity();
mWifiManager.startEasyConnectAsEnrolleeResponder(TEST_WRONG_DEVICE_INFO,
- EASY_CONNECT_CRYPTOGRAPHY_CURVE_DEFAULT, mExecutor,
+ EASY_CONNECT_CRYPTOGRAPHY_CURVE_PRIME256V1, mExecutor,
mEasyConnectStatusCallback);
fail("startEasyConnectAsEnrolleeResponder did not throw an IllegalArgumentException"
+ "on passing a wrong device info!");
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.java b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.java
index fe7f978..432669b 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.java
@@ -51,6 +51,7 @@
import org.junit.runner.RunWith;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -240,7 +241,7 @@
.build();
mNsNetworkCallback = mTestHelper.testConnectionFlowWithSuggestion(
mTestNetworkForRestrictedConnection, suggestion, mExecutorService,
- NET_CAPABILITY_OEM_PAID);
+ Set.of(NET_CAPABILITY_OEM_PAID));
// Ensure that there are 2 wifi connections available for apps.
assertThat(mTestHelper.getNumWifiConnections()).isEqualTo(2);
@@ -262,7 +263,7 @@
.build();
mNsNetworkCallback = mTestHelper.testConnectionFlowWithSuggestion(
mTestNetworkForRestrictedConnection, suggestion, mExecutorService,
- NET_CAPABILITY_OEM_PAID);
+ Set.of(NET_CAPABILITY_OEM_PAID));
// Now trigger internet connectivity.
mNetworkCallback = mTestHelper.testConnectionFlowWithConnect(
@@ -292,7 +293,7 @@
.build();
mNsNetworkCallback = mTestHelper.testConnectionFlowWithSuggestion(
mTestNetworkForRestrictedConnection, suggestion, mExecutorService,
- NET_CAPABILITY_OEM_PRIVATE);
+ Set.of(NET_CAPABILITY_OEM_PRIVATE));
// Ensure that there are 2 wifi connections available for apps.
assertThat(mTestHelper.getNumWifiConnections()).isEqualTo(2);
@@ -314,7 +315,7 @@
.build();
mNsNetworkCallback = mTestHelper.testConnectionFlowWithSuggestion(
mTestNetworkForRestrictedConnection, suggestion, mExecutorService,
- NET_CAPABILITY_OEM_PRIVATE);
+ Set.of(NET_CAPABILITY_OEM_PRIVATE));
// Now trigger internet connectivity.
mNetworkCallback = mTestHelper.testConnectionFlowWithConnect(
@@ -346,7 +347,7 @@
.build();
mNsNetworkCallback = mTestHelper.testConnectionFailureFlowWithSuggestion(
mTestNetworkForRestrictedConnection, suggestion, mExecutorService,
- NET_CAPABILITY_OEM_PRIVATE);
+ Set.of(NET_CAPABILITY_OEM_PRIVATE));
// Ensure that there is only 1 connection available for apps.
assertThat(mTestHelper.getNumWifiConnections()).isEqualTo(1);
@@ -374,7 +375,7 @@
.build();
mNsNetworkCallback = mTestHelper.testConnectionFailureFlowWithSuggestion(
mTestNetworkForRestrictedConnection, suggestion, mExecutorService,
- NET_CAPABILITY_OEM_PAID);
+ Set.of(NET_CAPABILITY_OEM_PAID));
// Ensure that there is only 1 connection available for apps.
assertThat(mTestHelper.getNumWifiConnections()).isEqualTo(1);
@@ -402,7 +403,7 @@
.build();
mNsNetworkCallback = mTestHelper.testConnectionFailureFlowWithSuggestion(
mTestNetworkForRestrictedConnection, suggestion, mExecutorService,
- NET_CAPABILITY_OEM_PAID);
+ Set.of(NET_CAPABILITY_OEM_PAID));
// Ensure that there is only 1 connection available for apps.
assertThat(mTestHelper.getNumWifiConnections()).isEqualTo(1);
@@ -430,7 +431,7 @@
.build();
mNsNetworkCallback = mTestHelper.testConnectionFailureFlowWithSuggestion(
mTestNetworkForRestrictedConnection, suggestion, mExecutorService,
- NET_CAPABILITY_OEM_PRIVATE);
+ Set.of(NET_CAPABILITY_OEM_PRIVATE));
// Ensure that there is only 1 connection available for apps.
assertThat(mTestHelper.getNumWifiConnections()).isEqualTo(1);
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java
index f283dc2..6ed47b3 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java
@@ -222,13 +222,13 @@
}
private void testSuccessfulConnectionWithSpecifier(
- WifiConfiguration network, WifiNetworkSpecifier specifier) {
+ WifiConfiguration network, WifiNetworkSpecifier specifier) throws Exception {
mNrNetworkCallback = mTestHelper.testConnectionFlowWithSpecifier(
network, specifier, false);
}
private void testUserRejectionWithSpecifier(
- WifiConfiguration network, WifiNetworkSpecifier specifier) {
+ WifiConfiguration network, WifiNetworkSpecifier specifier) throws Exception {
mNrNetworkCallback = mTestHelper.testConnectionFlowWithSpecifier(
network, specifier, true);
}
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java b/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java
index 68e0314..b90d639 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java
@@ -18,6 +18,7 @@
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.NETWORK_SETTINGS;
+import static android.net.ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO;
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID;
import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE;
@@ -37,7 +38,6 @@
import android.net.MacAddress;
import android.net.Network;
import android.net.NetworkCapabilities;
-import android.net.NetworkCapabilitiesProto;
import android.net.NetworkRequest;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
@@ -57,6 +57,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -231,7 +232,12 @@
public boolean onUnavailableCalled = false;
public NetworkCapabilities networkCapabilities;
- TestNetworkCallback(CountDownLatch countDownLatch) {
+ TestNetworkCallback(@NonNull CountDownLatch countDownLatch) {
+ mCountDownLatch = countDownLatch;
+ }
+
+ TestNetworkCallback(@NonNull CountDownLatch countDownLatch, int flags) {
+ super(flags);
mCountDownLatch = countDownLatch;
}
@@ -250,6 +256,16 @@
}
}
+ private static TestNetworkCallback createTestNetworkCallback(
+ @NonNull CountDownLatch countDownLatch) {
+ if (BuildCompat.isAtLeastS()) {
+ // flags for NetworkCallback only introduced in S.
+ return new TestNetworkCallback(countDownLatch, FLAG_INCLUDE_LOCATION_INFO);
+ } else {
+ return new TestNetworkCallback(countDownLatch);
+ }
+ }
+
private static void assertConnectionEquals(@NonNull WifiConfiguration network,
@NonNull WifiInfo wifiInfo) {
assertThat(network.SSID).isEqualTo(wifiInfo.getSSID());
@@ -289,11 +305,11 @@
* connection.
*/
public ConnectivityManager.NetworkCallback testConnectionFlowWithConnect(
- @NonNull WifiConfiguration network) {
+ @NonNull WifiConfiguration network) throws Exception {
CountDownLatch countDownLatchAl = new CountDownLatch(1);
CountDownLatch countDownLatchNr = new CountDownLatch(1);
TestActionListener actionListener = new TestActionListener(countDownLatchAl);
- TestNetworkCallback testNetworkCallback = new TestNetworkCallback(countDownLatchNr);
+ TestNetworkCallback testNetworkCallback = createTestNetworkCallback(countDownLatchNr);
UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
try {
uiAutomation.adoptShellPermissionIdentity();
@@ -322,7 +338,13 @@
assertThat(testNetworkCallback.onAvailableCalled).isTrue();
assertConnectionEquals(
network, (WifiInfo) testNetworkCallback.networkCapabilities.getTransportInfo());
- } catch (InterruptedException e) {
+ } catch (Throwable e /* catch assertions & exceptions */) {
+ // Unregister the network callback in case of any failure (since we don't end up
+ // returning the network callback to the caller).
+ try {
+ mConnectivityManager.unregisterNetworkCallback(testNetworkCallback);
+ } catch (IllegalArgumentException ie) { }
+ throw e;
} finally {
uiAutomation.dropShellPermissionIdentity();
}
@@ -337,7 +359,7 @@
* @param network saved network from the device to use for the connection.
* @param suggestion suggestion to use for the connection.
* @param executorService Excutor service to run scan periodically (to trigger connection).
- * @param restrictedNetworkCapability Whether this connection should be restricted with
+ * @param restrictedNetworkCapabilities Whether this connection should be restricted with
* the provided capability.
*
* @return NetworkCallback used for the connection (can be used by client to release the
@@ -346,9 +368,9 @@
public ConnectivityManager.NetworkCallback testConnectionFlowWithSuggestionWithShellIdentity(
WifiConfiguration network, WifiNetworkSuggestion suggestion,
@NonNull ScheduledExecutorService executorService,
- @Nullable Integer restrictedNetworkCapability) {
+ @NonNull Set<Integer> restrictedNetworkCapabilities) throws Exception {
return testConnectionFlowWithSuggestionInternal(
- network, suggestion, executorService, restrictedNetworkCapability, true);
+ network, suggestion, executorService, restrictedNetworkCapabilities, true);
}
/**
@@ -360,7 +382,7 @@
* @param network saved network from the device to use for the connection.
* @param suggestion suggestion to use for the connection.
* @param executorService Excutor service to run scan periodically (to trigger connection).
- * @param restrictedNetworkCapability Whether this connection should be restricted with
+ * @param restrictedNetworkCapabilities Whether this connection should be restricted with
* the provided capability.
*
* @return NetworkCallback used for the connection (can be used by client to release the
@@ -369,13 +391,13 @@
public ConnectivityManager.NetworkCallback testConnectionFlowWithSuggestion(
WifiConfiguration network, WifiNetworkSuggestion suggestion,
@NonNull ScheduledExecutorService executorService,
- @Nullable Integer restrictedNetworkCapability) {
+ @NonNull Set<Integer> restrictedNetworkCapabilities) throws Exception {
final UiAutomation uiAutomation =
InstrumentationRegistry.getInstrumentation().getUiAutomation();
try {
uiAutomation.adoptShellPermissionIdentity(NETWORK_SETTINGS, CONNECTIVITY_INTERNAL);
return testConnectionFlowWithSuggestionWithShellIdentity(
- network, suggestion, executorService, restrictedNetworkCapability);
+ network, suggestion, executorService, restrictedNetworkCapabilities);
} finally {
uiAutomation.dropShellPermissionIdentity();
}
@@ -387,7 +409,7 @@
* @param network saved network from the device to use for the connection.
* @param suggestion suggestion to use for the connection.
* @param executorService Excutor service to run scan periodically (to trigger connection).
- * @param restrictedNetworkCapability Whether this connection should be restricted with
+ * @param restrictedNetworkCapabilities Whether this connection should be restricted with
* the provided capability.
*
* @return NetworkCallback used for the connection (can be used by client to release the
@@ -396,13 +418,13 @@
public ConnectivityManager.NetworkCallback testConnectionFailureFlowWithSuggestion(
WifiConfiguration network, WifiNetworkSuggestion suggestion,
@NonNull ScheduledExecutorService executorService,
- @Nullable Integer restrictedNetworkCapability) {
+ @NonNull Set<Integer> restrictedNetworkCapabilities) throws Exception {
final UiAutomation uiAutomation =
InstrumentationRegistry.getInstrumentation().getUiAutomation();
try {
uiAutomation.adoptShellPermissionIdentity(NETWORK_SETTINGS, CONNECTIVITY_INTERNAL);
return testConnectionFlowWithSuggestionInternal(
- network, suggestion, executorService, restrictedNetworkCapability, false);
+ network, suggestion, executorService, restrictedNetworkCapabilities, false);
} finally {
uiAutomation.dropShellPermissionIdentity();
}
@@ -414,7 +436,7 @@
* @param network saved network from the device to use for the connection.
* @param suggestion suggestion to use for the connection.
* @param executorService Excutor service to run scan periodically (to trigger connection).
- * @param restrictedNetworkCapability Whether this connection should be restricted with
+ * @param restrictedNetworkCapabilities Whether this connection should be restricted with
* the provided capability.
* @param expectConnectionSuccess Whether to expect connection success or not.
*
@@ -424,22 +446,24 @@
private ConnectivityManager.NetworkCallback testConnectionFlowWithSuggestionInternal(
WifiConfiguration network, WifiNetworkSuggestion suggestion,
@NonNull ScheduledExecutorService executorService,
- @Nullable Integer restrictedNetworkCapability,
- boolean expectConnectionSuccess) {
+ @NonNull Set<Integer> restrictedNetworkCapabilities,
+ boolean expectConnectionSuccess) throws Exception {
CountDownLatch countDownLatch = new CountDownLatch(1);
// File the network request & wait for the callback.
- TestNetworkCallback testNetworkCallback = new TestNetworkCallback(countDownLatch);
+ TestNetworkCallback testNetworkCallback = createTestNetworkCallback(countDownLatch);
try {
// File a request for restricted (oem paid) wifi network.
NetworkRequest.Builder nrBuilder = new NetworkRequest.Builder()
.addTransportType(TRANSPORT_WIFI)
.addCapability(NET_CAPABILITY_INTERNET);
- if (restrictedNetworkCapability == null) {
+ if (restrictedNetworkCapabilities.isEmpty()) {
// If not a restricted connection, a network callback is sufficient.
mConnectivityManager.registerNetworkCallback(
nrBuilder.build(), testNetworkCallback);
} else {
- nrBuilder.addCapability(restrictedNetworkCapability);
+ for (Integer restrictedNetworkCapability : restrictedNetworkCapabilities) {
+ nrBuilder.addCapability(restrictedNetworkCapability);
+ }
mConnectivityManager.requestNetwork(nrBuilder.build(), testNetworkCallback);
}
// Add wifi network suggestion.
@@ -466,7 +490,11 @@
assertThat(countDownLatch.await(
DURATION_NETWORK_CONNECTION_MILLIS, TimeUnit.MILLISECONDS)).isFalse();
}
- } catch (InterruptedException e) {
+ } catch (Throwable e /* catch assertions & exceptions */) {
+ try {
+ mConnectivityManager.unregisterNetworkCallback(testNetworkCallback);
+ } catch (IllegalArgumentException ie) { }
+ throw e;
} finally {
executorService.shutdown();
}
@@ -603,19 +631,30 @@
* connection.
*/
public ConnectivityManager.NetworkCallback testConnectionFlowWithSpecifierWithShellIdentity(
- WifiConfiguration network, WifiNetworkSpecifier specifier, boolean shouldUserReject) {
+ WifiConfiguration network, WifiNetworkSpecifier specifier, boolean shouldUserReject)
+ throws Exception {
CountDownLatch countDownLatch = new CountDownLatch(1);
- // Fork a thread to handle the UI interactions.
- Thread uiThread = new Thread(() -> handleUiInteractions(network, shouldUserReject));
-
// File the network request & wait for the callback.
- TestNetworkCallback testNetworkCallback = new TestNetworkCallback(countDownLatch);
+ TestNetworkCallback testNetworkCallback = createTestNetworkCallback(countDownLatch);
+
+ // Fork a thread to handle the UI interactions.
+ Thread uiThread = new Thread(() -> {
+ try {
+ handleUiInteractions(network, shouldUserReject);
+ } catch (Throwable e /* catch assertions & exceptions */) {
+ try {
+ mConnectivityManager.unregisterNetworkCallback(testNetworkCallback);
+ } catch (IllegalArgumentException ie) { }
+ throw e;
+ }
+ });
+
try {
// File a request for wifi network.
mConnectivityManager.requestNetwork(
new NetworkRequest.Builder()
- .addTransportType(NetworkCapabilitiesProto.TRANSPORT_WIFI)
- .removeCapability(NetworkCapabilitiesProto.NET_CAPABILITY_INTERNET)
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build(),
testNetworkCallback);
@@ -627,25 +666,33 @@
// now wait for callback
assertThat(countDownLatch.await(
DURATION_NETWORK_CONNECTION_MILLIS, TimeUnit.MILLISECONDS)).isTrue();
- } catch (InterruptedException e) {
- }
- if (shouldUserReject) {
- assertThat(testNetworkCallback.onUnavailableCalled).isTrue();
- } else {
- assertThat(testNetworkCallback.onAvailableCalled).isTrue();
- final WifiInfo wifiInfo;
- if (BuildCompat.isAtLeastS()) {
- // WifiInfo in transport info, only available in S.
- wifiInfo = (WifiInfo) testNetworkCallback.networkCapabilities.getTransportInfo();
+ if (shouldUserReject) {
+ assertThat(testNetworkCallback.onUnavailableCalled).isTrue();
} else {
- wifiInfo = mWifiManager.getConnectionInfo();
+ assertThat(testNetworkCallback.onAvailableCalled).isTrue();
+ final WifiInfo wifiInfo;
+ if (BuildCompat.isAtLeastS()) {
+ // WifiInfo in transport info, only available in S.
+ wifiInfo =
+ (WifiInfo) testNetworkCallback.networkCapabilities.getTransportInfo();
+ } else {
+ wifiInfo = mWifiManager.getConnectionInfo();
+ }
+ assertConnectionEquals(network, wifiInfo);
}
- assertConnectionEquals(network, wifiInfo);
+ } catch (Throwable e /* catch assertions & exceptions */) {
+ try {
+ mConnectivityManager.unregisterNetworkCallback(testNetworkCallback);
+ } catch (IllegalArgumentException ie) { }
+ throw e;
}
try {
// Ensure that the UI interaction thread has completed.
uiThread.join(DURATION_UI_INTERACTION_MILLIS);
} catch (InterruptedException e) {
+ try {
+ mConnectivityManager.unregisterNetworkCallback(testNetworkCallback);
+ } catch (IllegalArgumentException ie) { }
fail("UI interaction interrupted");
}
return testNetworkCallback;
@@ -664,7 +711,8 @@
* connection.
*/
public ConnectivityManager.NetworkCallback testConnectionFlowWithSpecifier(
- WifiConfiguration network, WifiNetworkSpecifier specifier, boolean shouldUserReject) {
+ WifiConfiguration network, WifiNetworkSpecifier specifier, boolean shouldUserReject)
+ throws Exception {
final UiAutomation uiAutomation =
InstrumentationRegistry.getInstrumentation().getUiAutomation();
try {
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiBuildCompat.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiBuildCompat.java
new file mode 100644
index 0000000..abc3d65
--- /dev/null
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiBuildCompat.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.wifi.cts;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.pm.ModuleInfo;
+import android.content.pm.PackageManager;
+
+import androidx.core.os.BuildCompat;
+
+/**
+ * Wrapper class for checking the wifi module version.
+ *
+ * Wifi CTS tests for a dessert release can be run on older dessert releases as a part of MTS.
+ * Since wifi module is optional, not all older dessert release will contain the wifi module from the
+ * provided dessert release (which means we cannot use new wifi API's on those devices).
+ *
+ * <p>
+ * This utility tries to help solve that problem by trying to check if the device is running atleast
+ * <li> The provided dessert release using {@link BuildCompat}, OR</li>
+ * <li> The wifi module from the provided dessert release on an older dessert release device</li>
+ *
+ * In either case above, we can somewhat safely assume that the wifi API's from the provided dessert
+ * release are present and behave the way we expect to.
+ * </p>
+ *
+ * Note: This does not check for granular wifi module version codes, only that it is some version
+ * of the module from the provided dessert release.
+ *
+ */
+public class WifiBuildCompat {
+ private static final String WIFI_APEX_NAME = "com.android.wifi";
+
+ private static long WIFI_APEX_BASE_VERSION_CODE_FOR_S = 310000000;
+
+ private static long getWifiApexVersionCode(@NonNull Context ctx) {
+ PackageManager packageManager = ctx.getPackageManager();
+ long wifiStackVersion = 0;
+ try {
+ ModuleInfo wifiModule = packageManager.getModuleInfo(
+ WIFI_APEX_NAME, PackageManager.MODULE_APEX_NAME);
+ String wifiPackageName = wifiModule.getPackageName();
+ if (wifiPackageName != null) {
+ wifiStackVersion = packageManager.getPackageInfo(
+ wifiPackageName, PackageManager.MATCH_APEX).getLongVersionCode();
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ return wifiStackVersion;
+ }
+
+ private WifiBuildCompat() { }
+
+ public static boolean isAtLeastS(@NonNull Context ctx) {
+ return BuildCompat.isAtLeastS()
+ || getWifiApexVersionCode(ctx) >= WIFI_APEX_BASE_VERSION_CODE_FOR_S;
+ }
+}
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiEnterpriseConfigTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiEnterpriseConfigTest.java
index b472137..218276c 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiEnterpriseConfigTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiEnterpriseConfigTest.java
@@ -49,6 +49,7 @@
private static final String CA_PATH = "capath";
private static final String CLIENT_CERTIFICATE_ALIAS = "clientcertificatealias";
private static final String WAPI_CERT_SUITE = "wapicertsuite";
+ private static final String TEST_DECORATED_IDENTITY_PREFIX = "androidwifi.dev!";
/*
* The keys and certificates below are generated with:
@@ -914,4 +915,119 @@
assertThat(copy.getPassword()).isEqualTo(PASSWORD);
assertThat(copy.getRealm()).isEqualTo(REALM);
}
+
+ /**
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testIsEnterpriseConfigServerCertNotEnabled() {
+ if (!hasWifi()) {
+ return;
+ }
+ WifiEnterpriseConfig baseConfig = new WifiEnterpriseConfig();
+ baseConfig.setEapMethod(Eap.PEAP);
+ baseConfig.setPhase2Method(Phase2.MSCHAPV2);
+ assertTrue(baseConfig.isEapMethodServerCertUsed());
+ assertFalse(baseConfig.isServerCertValidationEnabled());
+
+ WifiEnterpriseConfig noMatchConfig = new WifiEnterpriseConfig(baseConfig);
+ noMatchConfig.setCaCertificate(FakeKeys.CA_CERT0);
+ // Missing match disables validation.
+ assertTrue(baseConfig.isEapMethodServerCertUsed());
+ assertFalse(baseConfig.isServerCertValidationEnabled());
+
+ WifiEnterpriseConfig noCaConfig = new WifiEnterpriseConfig(baseConfig);
+ noCaConfig.setDomainSuffixMatch(DOM_SUBJECT_MATCH);
+ // Missing CA certificate disables validation.
+ assertTrue(baseConfig.isEapMethodServerCertUsed());
+ assertFalse(baseConfig.isServerCertValidationEnabled());
+
+ WifiEnterpriseConfig noValidationConfig = new WifiEnterpriseConfig();
+ noValidationConfig.setEapMethod(Eap.AKA);
+ assertFalse(noValidationConfig.isEapMethodServerCertUsed());
+ }
+
+ /**
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testIsEnterpriseConfigServerCertEnabledWithPeap() {
+ if (!hasWifi()) {
+ return;
+ }
+ testIsEnterpriseConfigServerCertEnabled(Eap.PEAP);
+ }
+
+ /**
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testIsEnterpriseConfigServerCertEnabledWithTls() {
+ if (!hasWifi()) {
+ return;
+ }
+ testIsEnterpriseConfigServerCertEnabled(Eap.TLS);
+ }
+
+ /**
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testIsEnterpriseConfigServerCertEnabledWithTTLS() {
+ if (!hasWifi()) {
+ return;
+ }
+ testIsEnterpriseConfigServerCertEnabled(Eap.TTLS);
+ }
+
+ private void testIsEnterpriseConfigServerCertEnabled(int eapMethod) {
+ WifiEnterpriseConfig configWithCertAndDomainSuffixMatch = createEnterpriseConfig(eapMethod,
+ Phase2.NONE, FakeKeys.CA_CERT0, null, DOM_SUBJECT_MATCH, null);
+ assertTrue(configWithCertAndDomainSuffixMatch.isEapMethodServerCertUsed());
+ assertTrue(configWithCertAndDomainSuffixMatch.isServerCertValidationEnabled());
+
+ WifiEnterpriseConfig configWithCertAndAltSubjectMatch = createEnterpriseConfig(eapMethod,
+ Phase2.NONE, FakeKeys.CA_CERT0, null, null, ALT_SUBJECT_MATCH);
+ assertTrue(configWithCertAndAltSubjectMatch.isEapMethodServerCertUsed());
+ assertTrue(configWithCertAndAltSubjectMatch.isServerCertValidationEnabled());
+
+ WifiEnterpriseConfig configWithAliasAndDomainSuffixMatch = createEnterpriseConfig(eapMethod,
+ Phase2.NONE, null, new String[]{"alias1", "alisa2"}, DOM_SUBJECT_MATCH,
+ null);
+ assertTrue(configWithAliasAndDomainSuffixMatch.isEapMethodServerCertUsed());
+ assertTrue(configWithAliasAndDomainSuffixMatch.isServerCertValidationEnabled());
+
+ WifiEnterpriseConfig configWithAliasAndAltSubjectMatch = createEnterpriseConfig(eapMethod,
+ Phase2.NONE, null, new String[]{"alias1", "alisa2"}, null, ALT_SUBJECT_MATCH);
+ assertTrue(configWithAliasAndAltSubjectMatch.isEapMethodServerCertUsed());
+ assertTrue(configWithAliasAndAltSubjectMatch.isServerCertValidationEnabled());
+ }
+
+ private WifiEnterpriseConfig createEnterpriseConfig(int eapMethod, int phase2Method,
+ X509Certificate caCertificate, String[] aliases, String domainSuffixMatch,
+ String altSubjectMatch) {
+ WifiEnterpriseConfig config = new WifiEnterpriseConfig();
+ config.setEapMethod(eapMethod);
+ config.setPhase2Method(phase2Method);
+ config.setCaCertificate(caCertificate);
+ config.setCaCertificateAliases(aliases);
+ config.setDomainSuffixMatch(domainSuffixMatch);
+ config.setAltSubjectMatch(altSubjectMatch);
+ return config;
+ }
+
+ /*
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testSetGetDecoratedIdentityPrefix() {
+ if (!hasWifi()) {
+ return;
+ }
+ WifiEnterpriseConfig config = new WifiEnterpriseConfig();
+
+ assertEquals("", config.getDecoratedIdentityPrefix());
+ config.setDecoratedIdentityPrefix(TEST_DECORATED_IDENTITY_PREFIX);
+ assertEquals(TEST_DECORATED_IDENTITY_PREFIX, config.getDecoratedIdentityPrefix());
+ }
}
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiInfoTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiInfoTest.java
index 45f8132..b118b83 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiInfoTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiInfoTest.java
@@ -31,6 +31,7 @@
import android.telephony.SubscriptionManager;
import androidx.core.os.BuildCompat;
+import androidx.test.filters.SdkSuppress;
import com.android.compatibility.common.util.PollingCheck;
import com.android.compatibility.common.util.ShellIdentityUtils;
@@ -209,6 +210,10 @@
assertThat(wifiInfo.getRxLinkSpeedMbps()).isAtLeast(-1);
assertThat(wifiInfo.getMaxSupportedTxLinkSpeedMbps()).isAtLeast(-1);
assertThat(wifiInfo.getMaxSupportedRxLinkSpeedMbps()).isAtLeast(-1);
+ if (WifiBuildCompat.isAtLeastS(mContext)) {
+ assertThat(wifiInfo.getCurrentSecurityType()).isNotEqualTo(
+ WifiInfo.SECURITY_TYPE_UNKNOWN);
+ }
}
/**
@@ -255,4 +260,26 @@
assertThat(info2.getRssi()).isEqualTo(TEST_RSSI);
assertThat(info2.getNetworkId()).isEqualTo(TEST_NETWORK_ID2);
}
+
+ /**
+ * Test that setCurrentSecurityType and getCurrentSecurityType work as expected
+ * @throws Exception
+ */
+ public void testWifiInfoCurrentSecurityType() throws Exception {
+ if (!WifiBuildCompat.isAtLeastS(mContext)) {
+ return;
+ }
+ WifiInfo.Builder builder = new WifiInfo.Builder()
+ .setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8))
+ .setBssid(TEST_BSSID)
+ .setRssi(TEST_RSSI)
+ .setNetworkId(TEST_NETWORK_ID);
+
+ WifiInfo info = builder.build();
+ assertEquals(WifiInfo.SECURITY_TYPE_UNKNOWN, info.getCurrentSecurityType());
+
+ builder.setCurrentSecurityType(WifiInfo.SECURITY_TYPE_SAE);
+ info = builder.build();
+ assertEquals(WifiInfo.SECURITY_TYPE_SAE, info.getCurrentSecurityType());
+ }
}
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 c047146..d4b3d02 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
@@ -184,7 +184,8 @@
private static final String TEST_PSK_CAP = "[RSN-PSK-CCMP]";
private static final String TEST_BSSID = "00:01:02:03:04:05";
private static final String TEST_COUNTRY_CODE = "JP";
- public static final String TEST_DOM_SUBJECT_MATCH = "domSubjectMatch";
+ private static final String TEST_DOM_SUBJECT_MATCH = "domSubjectMatch";
+ private static final int TEST_SUB_ID = 2;
private IntentFilter mIntentFilter;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -736,6 +737,17 @@
}
}
+ public class TestWifiVerboseLoggingStatusCallback extends
+ WifiManager.WifiVerboseLoggingStatusCallback {
+ public int numCalls;
+ public boolean status;
+ @Override
+ public void onStatusChanged(boolean enabled) {
+ numCalls++;
+ status = enabled;
+ }
+ }
+
public class TestSoftApCallback implements WifiManager.SoftApCallback {
Object softApLock;
int currentState;
@@ -2773,18 +2785,25 @@
}
UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
Boolean currState = null;
+ TestWifiVerboseLoggingStatusCallback callback =
+ new TestWifiVerboseLoggingStatusCallback();
try {
uiAutomation.adoptShellPermissionIdentity();
+ mWifiManager.registerWifiVerboseLoggingStatusCallback(mExecutor, callback);
currState = mWifiManager.isVerboseLoggingEnabled();
boolean newState = !currState;
+ assertEquals(0, callback.numCalls);
mWifiManager.setVerboseLoggingEnabled(newState);
PollingCheck.check(
"Wifi settings toggle failed!",
DURATION_SETTINGS_TOGGLE,
() -> mWifiManager.isVerboseLoggingEnabled() == newState);
assertEquals(newState, mWifiManager.isVerboseLoggingEnabled());
+ assertEquals(newState, callback.status);
+ assertEquals(1, callback.numCalls);
} finally {
if (currState != null) mWifiManager.setVerboseLoggingEnabled(currState);
+ mWifiManager.unregisterWifiVerboseLoggingStatusCallback(callback);
uiAutomation.dropShellPermissionIdentity();
}
}
@@ -2829,14 +2848,14 @@
}
/**
- * Verify that startTemporarilyDisablingAllNonCarrierMergedWifi disconnects wifi and disables
- * autoconnect to non-carrier-merged networks. Then verify that
- * stopTemporarilyDisablingAllNonCarrierMergedWifi makes the disabled networks clear to connect
+ * Verify that startRestrictingAutoJoinToSubscriptionId disconnects wifi and disables
+ * auto-connect to non-carrier-merged networks. Then verify that
+ * stopRestrictingAutoJoinToSubscriptionId makes the disabled networks clear to connect
* again.
* TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
*/
@SdkSuppress(minSdkVersion = 31, codeName = "S")
- public void testStartAndStopTemporarilyDisablingAllNonCarrierMergedWifi() throws Exception {
+ public void testStartAndStopRestrictingAutoJoinToSubscriptionId() throws Exception {
if (!WifiFeature.isWifiSupported(getContext())) {
// skip the test if WiFi is not supported
return;
@@ -2845,11 +2864,11 @@
waitForConnection();
int fakeSubscriptionId = 5;
ShellIdentityUtils.invokeWithShellPermissions(() ->
- mWifiManager.startTemporarilyDisablingAllNonCarrierMergedWifi(fakeSubscriptionId));
+ mWifiManager.startRestrictingAutoJoinToSubscriptionId(fakeSubscriptionId));
startScan();
ensureNotConnected();
ShellIdentityUtils.invokeWithShellPermissions(() ->
- mWifiManager.stopTemporarilyDisablingAllNonCarrierMergedWifi());
+ mWifiManager.stopRestrictingAutoJoinToSubscriptionId());
startScan();
waitForConnection();
}
@@ -3584,6 +3603,32 @@
}
/**
+ * Tests {@link WifiManager#isWpa3SaeH2eSupported()} does not crash.
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion?
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testIsWpa3SaeH2eSupported() throws Exception {
+ if (!WifiFeature.isWifiSupported(getContext())) {
+ // skip the test if WiFi is not supported
+ return;
+ }
+ mWifiManager.isWpa3SaeH2eSupported();
+ }
+
+ /**
+ * Tests {@link WifiManager#isWifiDisplayR2Supported()} does not crash.
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion?
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testIsWifiDisplayR2Supported() throws Exception {
+ if (!WifiFeature.isWifiSupported(getContext())) {
+ // skip the test if WiFi is not supported
+ return;
+ }
+ mWifiManager.isWifiDisplayR2Supported();
+ }
+
+ /**
* Tests {@link WifiManager#isP2pSupported()} returns true
* if this device supports it, otherwise, ensure no crash.
*/
@@ -3961,4 +4006,43 @@
uiAutomation.dropShellPermissionIdentity();
}
}
+
+ /**
+ * Tests {@link WifiManager#isDecoratedIdentitySupported)} does not crash.
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testIsDecoratedIdentitySupported() throws Exception {
+ if (!WifiFeature.isWifiSupported(getContext())) {
+ // skip the test if WiFi is not supported
+ return;
+ }
+ mWifiManager.isDecoratedIdentitySupported();
+ }
+
+ /**
+ * Tests {@link WifiManager#setCarrierNetworkOffloadEnabled)} and
+ * {@link WifiManager#isCarrierNetworkOffloadEnabled} work as expected.
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testSetCarrierNetworkOffloadEnabled() throws Exception {
+ if (!WifiFeature.isWifiSupported(getContext())) {
+ // skip the test if WiFi is not supported
+ return;
+ }
+ assertTrue(mWifiManager.isCarrierNetworkOffloadEnabled(TEST_SUB_ID, false));
+ // The below API only works with privileged permissions (obtained via shell identity
+ // for test)
+ UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ try {
+ uiAutomation.adoptShellPermissionIdentity();
+ mWifiManager.setCarrierNetworkOffloadEnabled(TEST_SUB_ID, false, false);
+ assertFalse(mWifiManager.isCarrierNetworkOffloadEnabled(TEST_SUB_ID, false));
+ mWifiManager.setCarrierNetworkOffloadEnabled(TEST_SUB_ID, false, true);
+ } finally {
+ uiAutomation.dropShellPermissionIdentity();
+ }
+ assertTrue(mWifiManager.isCarrierNetworkOffloadEnabled(TEST_SUB_ID, false));
+ }
}
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
index 520d364..6f5b892 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
@@ -288,19 +288,21 @@
mConnectivityManager.unregisterNetworkCallback(mNrNetworkCallback);
}
// Clear any existing app state after each test.
- if (BuildCompat.isAtLeastS()) {
+ if (WifiBuildCompat.isAtLeastS(mContext)) {
ShellIdentityUtils.invokeWithShellPermissions(
() -> mWifiManager.removeAppState(myUid(), mContext.getPackageName()));
}
mTestHelper.turnScreenOff();
}
- private void testSuccessfulConnectionWithSpecifier(WifiNetworkSpecifier specifier) {
+ private void testSuccessfulConnectionWithSpecifier(WifiNetworkSpecifier specifier)
+ throws Exception {
mNrNetworkCallback = mTestHelper.testConnectionFlowWithSpecifier(
mTestNetwork, specifier, false);
}
- private void testUserRejectionWithSpecifier(WifiNetworkSpecifier specifier) {
+ private void testUserRejectionWithSpecifier(WifiNetworkSpecifier specifier)
+ throws Exception {
mNrNetworkCallback = mTestHelper.testConnectionFlowWithSpecifier(
mTestNetwork, specifier, true);
}
@@ -309,7 +311,7 @@
* Tests the entire connection flow using a specific SSID in the specifier.
*/
@Test
- public void testConnectionWithSpecificSsid() {
+ public void testConnectionWithSpecificSsid() throws Exception {
WifiNetworkSpecifier specifier =
TestHelper.createSpecifierBuilderWithCredentialFromSavedNetwork(
mTestNetwork)
@@ -321,7 +323,7 @@
* Tests the entire connection flow using a SSID pattern in the specifier.
*/
@Test
- public void testConnectionWithSsidPattern() {
+ public void testConnectionWithSsidPattern() throws Exception {
// Creates a ssid pattern by dropping the last char in the saved network & pass that
// as a prefix match pattern in the request.
String ssidUnquoted = WifiInfo.sanitizeSsid(mTestNetwork.SSID);
@@ -341,7 +343,7 @@
* Tests the entire connection flow using a specific BSSID in the specifier.
*/
@Test
- public void testConnectionWithSpecificBssid() {
+ public void testConnectionWithSpecificBssid() throws Exception {
WifiNetworkSpecifier specifier =
TestHelper.createSpecifierBuilderWithCredentialFromSavedNetworkWithBssid(
mTestNetwork)
@@ -353,7 +355,7 @@
* Tests the entire connection flow using a BSSID pattern in the specifier.
*/
@Test
- public void testConnectionWithBssidPattern() {
+ public void testConnectionWithBssidPattern() throws Exception {
// Note: The match may return more than 1 network in this case since we use a prefix match,
// But, we will still ensure that the UI interactions in the test still selects the
// saved network for connection.
@@ -370,7 +372,7 @@
* Tests the entire connection flow using a BSSID pattern in the specifier.
*/
@Test
- public void testUserRejectionWithSpecificSsid() {
+ public void testUserRejectionWithSpecificSsid() throws Exception {
WifiNetworkSpecifier specifier =
TestHelper.createSpecifierBuilderWithCredentialFromSavedNetwork(
mTestNetwork)
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSuggestionTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSuggestionTest.java
index 7b037be..2348da8 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSuggestionTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSuggestionTest.java
@@ -76,6 +76,7 @@
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -96,134 +97,134 @@
private static boolean sWasScanThrottleEnabled;
private static boolean sWasWifiEnabled;
- private Context mContext;
- private WifiManager mWifiManager;
- private ConnectivityManager mConnectivityManager;
- private UiDevice mUiDevice;
- private WifiConfiguration mTestNetwork;
- private ConnectivityManager.NetworkCallback mNsNetworkCallback;
+ private static Context sContext;
+ private static WifiManager sWifiManager;
+ private static ConnectivityManager sConnectivityManager;
+ private static UiDevice sUiDevice;
+ private static WifiConfiguration sTestNetwork;
+ private static ConnectivityManager.NetworkCallback sNsNetworkCallback;
+ private static TestHelper sTestHelper;
+
private ScheduledExecutorService mExecutorService;
- private TestHelper mTestHelper;
private static final int DURATION_MILLIS = 10_000;
@BeforeClass
public static void setUpClass() throws Exception {
- Context context = InstrumentationRegistry.getInstrumentation().getContext();
+ sContext = InstrumentationRegistry.getInstrumentation().getContext();
// skip the test if WiFi is not supported
// Don't use assumeTrue in @BeforeClass
- if (!WifiFeature.isWifiSupported(context)) return;
+ if (!WifiFeature.isWifiSupported(sContext)) return;
+ // skip the test if location is not supported
+ if (!sContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION)) return;
+ // skip if the location is disabled
+ if (!sContext.getSystemService(LocationManager.class).isLocationEnabled()) return;
- WifiManager wifiManager = context.getSystemService(WifiManager.class);
- assertThat(wifiManager).isNotNull();
+ sWifiManager = sContext.getSystemService(WifiManager.class);
+ assertThat(sWifiManager).isNotNull();
+ sConnectivityManager = sContext.getSystemService(ConnectivityManager.class);
+ sUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ sTestHelper = new TestHelper(sContext, sUiDevice);
// turn on verbose logging for tests
sWasVerboseLoggingEnabled = ShellIdentityUtils.invokeWithShellPermissions(
- () -> wifiManager.isVerboseLoggingEnabled());
+ () -> sWifiManager.isVerboseLoggingEnabled());
ShellIdentityUtils.invokeWithShellPermissions(
- () -> wifiManager.setVerboseLoggingEnabled(true));
+ () -> sWifiManager.setVerboseLoggingEnabled(true));
// Disable scan throttling for tests.
sWasScanThrottleEnabled = ShellIdentityUtils.invokeWithShellPermissions(
- () -> wifiManager.isScanThrottleEnabled());
+ () -> sWifiManager.isScanThrottleEnabled());
ShellIdentityUtils.invokeWithShellPermissions(
- () -> wifiManager.setScanThrottleEnabled(false));
+ () -> sWifiManager.setScanThrottleEnabled(false));
// enable Wifi
sWasWifiEnabled = ShellIdentityUtils.invokeWithShellPermissions(
- () -> wifiManager.isWifiEnabled());
- if (!wifiManager.isWifiEnabled()) {
- ShellIdentityUtils.invokeWithShellPermissions(() -> wifiManager.setWifiEnabled(true));
+ () -> sWifiManager.isWifiEnabled());
+ if (!sWifiManager.isWifiEnabled()) {
+ ShellIdentityUtils.invokeWithShellPermissions(() -> sWifiManager.setWifiEnabled(true));
}
- PollingCheck.check("Wifi not enabled", DURATION_MILLIS, () -> wifiManager.isWifiEnabled());
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception {
- Context context = InstrumentationRegistry.getInstrumentation().getContext();
- if (!WifiFeature.isWifiSupported(context)) return;
-
- WifiManager wifiManager = context.getSystemService(WifiManager.class);
- assertThat(wifiManager).isNotNull();
-
- ShellIdentityUtils.invokeWithShellPermissions(
- () -> wifiManager.setScanThrottleEnabled(sWasScanThrottleEnabled));
- ShellIdentityUtils.invokeWithShellPermissions(
- () -> wifiManager.setVerboseLoggingEnabled(sWasVerboseLoggingEnabled));
- ShellIdentityUtils.invokeWithShellPermissions(
- () -> wifiManager.setWifiEnabled(sWasWifiEnabled));
- }
-
- @Before
- public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getInstrumentation().getContext();
- mWifiManager = mContext.getSystemService(WifiManager.class);
- mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
- mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
- mExecutorService = Executors.newSingleThreadScheduledExecutor();
- mTestHelper = new TestHelper(mContext, mUiDevice);
-
- // skip the test if WiFi is not supported
- assumeTrue(WifiFeature.isWifiSupported(mContext));
- // skip the test if location is not supported
- assumeTrue(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION));
-
- assertWithMessage("Please enable location for this test!").that(
- mContext.getSystemService(LocationManager.class).isLocationEnabled()).isTrue();
-
- // turn screen on
- mTestHelper.turnScreenOn();
-
- // Clear any existing app state before each test.
- if (BuildCompat.isAtLeastS()) {
- ShellIdentityUtils.invokeWithShellPermissions(
- () -> mWifiManager.removeAppState(myUid(), mContext.getPackageName()));
- }
+ PollingCheck.check("Wifi not enabled", DURATION_MILLIS, () -> sWifiManager.isWifiEnabled());
// check we have >= 1 saved network
List<WifiConfiguration> savedNetworks = ShellIdentityUtils.invokeWithShellPermissions(
- () -> mWifiManager.getPrivilegedConfiguredNetworks());
- assertFalse("Need at least one saved network", savedNetworks.isEmpty());
+ () -> sWifiManager.getPrivilegedConfiguredNetworks());
+ if (savedNetworks.isEmpty()) {
+ return;
+ }
// Pick any network in range.
- mTestNetwork = TestHelper.findMatchingSavedNetworksWithBssid(mWifiManager, savedNetworks)
- .get(0);
- // Disconnect & disable auto-join on the saved network to prevent auto-connect from
+ List<WifiConfiguration> networks = TestHelper.findMatchingSavedNetworksWithBssid(
+ sWifiManager, savedNetworks);
+ if (!networks.isEmpty()) {
+ sTestNetwork = networks.get(0);
+ }
+
+ // Disable auto-join on the saved network to prevent auto-connect from
// interfering with the test.
ShellIdentityUtils.invokeWithShellPermissions(
() -> {
for (WifiConfiguration savedNetwork : savedNetworks) {
- mWifiManager.disableNetwork(savedNetwork.networkId);
+ sWifiManager.disableNetwork(savedNetwork.networkId);
}
- mWifiManager.disconnect();
});
+ }
+
+ @AfterClass
+ public static void tearDownClass() throws Exception {
+ if (!WifiFeature.isWifiSupported(sContext)) return;
+
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> sWifiManager.setScanThrottleEnabled(sWasScanThrottleEnabled));
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> sWifiManager.setVerboseLoggingEnabled(sWasVerboseLoggingEnabled));
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> sWifiManager.setWifiEnabled(sWasWifiEnabled));
+
+ // Re-enable networks.
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> {
+ for (WifiConfiguration savedNetwork : sWifiManager.getConfiguredNetworks()) {
+ sWifiManager.enableNetwork(savedNetwork.networkId, false);
+ }
+ });
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ mExecutorService = Executors.newSingleThreadScheduledExecutor();
+ // turn screen on
+ sTestHelper.turnScreenOn();
+
+ // Disconnect current network if any.
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> sWifiManager.disconnect());
// Wait for Wifi to be disconnected.
PollingCheck.check(
"Wifi not disconnected",
20_000,
- () -> mWifiManager.getConnectionInfo().getNetworkId() == -1);
+ () -> sWifiManager.getConnectionInfo().getNetworkId() == -1);
+
+ // Clear any existing app state before each test.
+ if (WifiBuildCompat.isAtLeastS(sContext)) {
+ ShellIdentityUtils.invokeWithShellPermissions(
+ () -> sWifiManager.removeAppState(myUid(), sContext.getPackageName()));
+ }
}
@After
public void tearDown() throws Exception {
- // Re-enable networks.
- ShellIdentityUtils.invokeWithShellPermissions(
- () -> {
- for (WifiConfiguration savedNetwork : mWifiManager.getConfiguredNetworks()) {
- mWifiManager.enableNetwork(savedNetwork.networkId, false);
- }
- });
// Release the requests after the test.
- if (mNsNetworkCallback != null) {
- mConnectivityManager.unregisterNetworkCallback(mNsNetworkCallback);
+ if (sNsNetworkCallback != null) {
+ sConnectivityManager.unregisterNetworkCallback(sNsNetworkCallback);
}
mExecutorService.shutdownNow();
// Clear any existing app state after each test.
- if (BuildCompat.isAtLeastS()) {
+ if (WifiBuildCompat.isAtLeastS(sContext)) {
ShellIdentityUtils.invokeWithShellPermissions(
- () -> mWifiManager.removeAppState(myUid(), mContext.getPackageName()));
+ () -> sWifiManager.removeAppState(myUid(), sContext.getPackageName()));
}
- mTestHelper.turnScreenOff();
+ sTestHelper.turnScreenOff();
}
private static final String CA_SUITE_B_RSA3072_CERT_STRING =
@@ -774,6 +775,23 @@
* Tests {@link android.net.wifi.WifiNetworkSuggestion.Builder} class.
*/
@Test
+ public void testBuilderWithWpa3SaeH2eOnlyMode() throws Exception {
+ assumeTrue(BuildCompat.isAtLeastS());
+ WifiNetworkSuggestion suggestion =
+ createBuilderWithCommonParams()
+ .setWpa3Passphrase(TEST_PASSPHRASE)
+ .setIsWpa3SaeH2eOnlyModeEnabled(true)
+ .build();
+ validateCommonParams(suggestion);
+ assertEquals(TEST_PASSPHRASE, suggestion.getPassphrase());
+ assertNull(suggestion.getEnterpriseConfig());
+ assertNull(suggestion.getPasspointConfig());
+ }
+
+ /**
+ * Tests {@link android.net.wifi.WifiNetworkSuggestion.Builder} class.
+ */
+ @Test
public void testBuilderWithWapiPassphrase() throws Exception {
WifiNetworkSuggestion suggestion =
createBuilderWithCommonParams()
@@ -1084,12 +1102,14 @@
@SdkSuppress(minSdkVersion = 31, codeName = "S")
@Test
public void testConnectToSuggestion() throws Exception {
+ assertNotNull(sTestNetwork);
WifiNetworkSuggestion suggestion =
TestHelper.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
- mTestNetwork)
+ sTestNetwork)
.build();
- mNsNetworkCallback = mTestHelper.testConnectionFlowWithSuggestion(
- mTestNetwork, suggestion, mExecutorService, null /* restrictedNetworkCapability */);
+ sNsNetworkCallback = sTestHelper.testConnectionFlowWithSuggestion(
+ sTestNetwork, suggestion, mExecutorService,
+ Set.of() /* restrictedNetworkCapability */);
}
/**
@@ -1100,13 +1120,34 @@
@SdkSuppress(minSdkVersion = 31, codeName = "S")
@Test
public void testConnectToOemPaidSuggestion() throws Exception {
+ assertNotNull(sTestNetwork);
WifiNetworkSuggestion suggestion =
TestHelper.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
- mTestNetwork)
+ sTestNetwork)
.setOemPaid(true)
.build();
- mNsNetworkCallback = mTestHelper.testConnectionFlowWithSuggestion(
- mTestNetwork, suggestion, mExecutorService, NET_CAPABILITY_OEM_PAID);
+ sNsNetworkCallback = sTestHelper.testConnectionFlowWithSuggestion(
+ sTestNetwork, suggestion, mExecutorService, Set.of(NET_CAPABILITY_OEM_PAID));
+ }
+
+ /**
+ * Connect to a network using restricted suggestion API.
+ *
+ * TODO(b/167575586): Wait for S SDK finalization to determine the final minSdkVersion.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ @Test
+ public void testConnectToOemPaidAndOemPrivateSuggestion() throws Exception {
+ assertNotNull(sTestNetwork);
+ WifiNetworkSuggestion suggestion =
+ TestHelper.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
+ sTestNetwork)
+ .setOemPaid(true)
+ .setOemPrivate(true)
+ .build();
+ sNsNetworkCallback = sTestHelper.testConnectionFlowWithSuggestion(
+ sTestNetwork, suggestion, mExecutorService,
+ Set.of(NET_CAPABILITY_OEM_PAID, NET_CAPABILITY_OEM_PRIVATE));
}
/**
@@ -1117,13 +1158,14 @@
@SdkSuppress(minSdkVersion = 31, codeName = "S")
@Test
public void testConnectToOemPrivateSuggestion() throws Exception {
+ assertNotNull(sTestNetwork);
WifiNetworkSuggestion suggestion =
TestHelper.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
- mTestNetwork)
+ sTestNetwork)
.setOemPrivate(true)
.build();
- mNsNetworkCallback = mTestHelper.testConnectionFlowWithSuggestion(
- mTestNetwork, suggestion, mExecutorService, NET_CAPABILITY_OEM_PRIVATE);
+ sNsNetworkCallback = sTestHelper.testConnectionFlowWithSuggestion(
+ sTestNetwork, suggestion, mExecutorService, Set.of(NET_CAPABILITY_OEM_PRIVATE));
}
/**
@@ -1135,13 +1177,14 @@
@SdkSuppress(minSdkVersion = 31, codeName = "S")
@Test
public void testConnectToOemPaidSuggestionFailure() throws Exception {
+ assertNotNull(sTestNetwork);
WifiNetworkSuggestion suggestion =
TestHelper.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
- mTestNetwork)
+ sTestNetwork)
.setOemPaid(true)
.build();
- mNsNetworkCallback = mTestHelper.testConnectionFailureFlowWithSuggestion(
- mTestNetwork, suggestion, mExecutorService, NET_CAPABILITY_OEM_PRIVATE);
+ sNsNetworkCallback = sTestHelper.testConnectionFailureFlowWithSuggestion(
+ sTestNetwork, suggestion, mExecutorService, Set.of(NET_CAPABILITY_OEM_PRIVATE));
}
/**
@@ -1153,13 +1196,14 @@
@SdkSuppress(minSdkVersion = 31, codeName = "S")
@Test
public void testConnectToOemPrivateSuggestionFailure() throws Exception {
+ assertNotNull(sTestNetwork);
WifiNetworkSuggestion suggestion =
TestHelper.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
- mTestNetwork)
+ sTestNetwork)
.setOemPrivate(true)
.build();
- mNsNetworkCallback = mTestHelper.testConnectionFailureFlowWithSuggestion(
- mTestNetwork, suggestion, mExecutorService, NET_CAPABILITY_OEM_PAID);
+ sNsNetworkCallback = sTestHelper.testConnectionFailureFlowWithSuggestion(
+ sTestNetwork, suggestion, mExecutorService, Set.of(NET_CAPABILITY_OEM_PAID));
}
/**
@@ -1171,12 +1215,13 @@
@SdkSuppress(minSdkVersion = 31, codeName = "S")
@Test
public void testConnectSuggestionFailureWithOemPaidNetCapability() throws Exception {
+ assertNotNull(sTestNetwork);
WifiNetworkSuggestion suggestion =
TestHelper.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
- mTestNetwork)
+ sTestNetwork)
.build();
- mNsNetworkCallback = mTestHelper.testConnectionFailureFlowWithSuggestion(
- mTestNetwork, suggestion, mExecutorService, NET_CAPABILITY_OEM_PAID);
+ sNsNetworkCallback = sTestHelper.testConnectionFailureFlowWithSuggestion(
+ sTestNetwork, suggestion, mExecutorService, Set.of(NET_CAPABILITY_OEM_PAID));
}
/**
@@ -1188,11 +1233,12 @@
@SdkSuppress(minSdkVersion = 31, codeName = "S")
@Test
public void testConnectSuggestionFailureWithOemPrivateNetCapability() throws Exception {
+ assertNotNull(sTestNetwork);
WifiNetworkSuggestion suggestion =
TestHelper.createSuggestionBuilderWithCredentialFromSavedNetworkWithBssid(
- mTestNetwork)
+ sTestNetwork)
.build();
- mNsNetworkCallback = mTestHelper.testConnectionFailureFlowWithSuggestion(
- mTestNetwork, suggestion, mExecutorService, NET_CAPABILITY_OEM_PRIVATE);
+ sNsNetworkCallback = sTestHelper.testConnectionFailureFlowWithSuggestion(
+ sTestNetwork, suggestion, mExecutorService, Set.of(NET_CAPABILITY_OEM_PRIVATE));
}
}
diff --git a/tests/tests/wifi/src/android/net/wifi/p2p/cts/WifiP2pWfdInfoTest.java b/tests/tests/wifi/src/android/net/wifi/p2p/cts/WifiP2pWfdInfoTest.java
index 75df5bf..0212fe4 100644
--- a/tests/tests/wifi/src/android/net/wifi/p2p/cts/WifiP2pWfdInfoTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/p2p/cts/WifiP2pWfdInfoTest.java
@@ -16,10 +16,28 @@
package android.net.wifi.p2p.cts;
-import android.net.wifi.p2p.WifiP2pWfdInfo;
-import android.test.AndroidTestCase;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
-public class WifiP2pWfdInfoTest extends AndroidTestCase {
+import android.content.Context;
+import android.net.wifi.cts.WifiFeature;
+import android.net.wifi.cts.WifiJUnit4TestBase;
+import android.net.wifi.p2p.WifiP2pWfdInfo;
+
+import androidx.core.os.BuildCompat;
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class WifiP2pWfdInfoTest extends WifiJUnit4TestBase {
private final int TEST_DEVICE_TYPE = WifiP2pWfdInfo.DEVICE_TYPE_WFD_SOURCE;
private final boolean TEST_DEVICE_ENABLE_STATUS = true;
@@ -28,6 +46,13 @@
private final int TEST_MAX_THROUGHPUT = 1024;
private final boolean TEST_CONTENT_PROTECTION_SUPPORTED_STATUS = true;
+ @Before
+ public void setUp() {
+ Context context = InstrumentationRegistry.getInstrumentation().getContext();
+ assumeTrue(WifiFeature.isWifiSupported(context));
+ }
+
+ @Test
public void testWifiP2pWfdInfo() {
WifiP2pWfdInfo info = new WifiP2pWfdInfo();
@@ -47,4 +72,27 @@
assertEquals(TEST_CONTENT_PROTECTION_SUPPORTED_STATUS,
copiedInfo.isContentProtectionSupported());
}
+
+ @Test
+ public void testWifiCoupledSink() {
+ assumeTrue(BuildCompat.isAtLeastS());
+ WifiP2pWfdInfo info = new WifiP2pWfdInfo();
+
+ assertFalse(info.isCoupledSinkSupportedAtSink());
+ info.setCoupledSinkSupportAtSink(true);
+ assertTrue(info.isCoupledSinkSupportedAtSink());
+
+ assertFalse(info.isCoupledSinkSupportedAtSource());
+ info.setCoupledSinkSupportAtSource(true);
+ assertTrue(info.isCoupledSinkSupportedAtSource());
+ }
+
+ @Test
+ public void testWifiP2pWfdR2Info() {
+ assumeTrue(BuildCompat.isAtLeastS());
+ WifiP2pWfdInfo info = new WifiP2pWfdInfo();
+
+ info.setWfdR2Device(WifiP2pWfdInfo.DEVICE_TYPE_WFD_SOURCE);
+ assertTrue(info.isR2Enabled());
+ }
}
diff --git a/tests/tests/wifi/src/android/net/wifi/passpoint/cts/PasspointConfigurationTest.java b/tests/tests/wifi/src/android/net/wifi/passpoint/cts/PasspointConfigurationTest.java
index e7d4fd9..a6eebfe 100644
--- a/tests/tests/wifi/src/android/net/wifi/passpoint/cts/PasspointConfigurationTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/passpoint/cts/PasspointConfigurationTest.java
@@ -26,13 +26,13 @@
import android.platform.test.annotations.AppModeFull;
import androidx.test.filters.SmallTest;
+import androidx.test.filters.SdkSuppress;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@@ -43,6 +43,7 @@
private static final int CERTIFICATE_FINGERPRINT_BYTES = 32;
public static final int EAP_SIM = 18;
public static final int EAP_TTLS = 21;
+ private static final String TEST_DECORATED_IDENTITY_PREFIX = "androidwifi.dev!";
/**
* Verify that the unique identifier generated is identical for two instances
@@ -177,6 +178,18 @@
}
/**
+ * Verify that the set and get decorated identity prefix methods work as expected.
+ */
+ @SdkSuppress(minSdkVersion = 31, codeName = "S")
+ public void testSetGetDecoratedIdentityPrefix() throws Exception {
+ PasspointConfiguration config = createConfig();
+ assertNull(config.getDecoratedIdentityPrefix());
+ config.setDecoratedIdentityPrefix(TEST_DECORATED_IDENTITY_PREFIX);
+ assertEquals(TEST_DECORATED_IDENTITY_PREFIX, config.getDecoratedIdentityPrefix());
+
+ }
+
+ /**
* Helper function for generating user credential for testing.
*
* @return {@link Credential}
diff --git a/tests/translation/Android.bp b/tests/translation/Android.bp
index 506c72c..d6c2886 100644
--- a/tests/translation/Android.bp
+++ b/tests/translation/Android.bp
@@ -33,6 +33,7 @@
"truth-prebuilt",
"androidx.test.ext.junit",
"testng",
+ "androidx.test.uiautomator_uiautomator",
],
srcs: [
"src/**/*.java",
diff --git a/tests/translation/AndroidManifest.xml b/tests/translation/AndroidManifest.xml
index 3dae1f5..d1803bf 100644
--- a/tests/translation/AndroidManifest.xml
+++ b/tests/translation/AndroidManifest.xml
@@ -21,6 +21,15 @@
<application android:label="Translation TestCase">
<uses-library android:name="android.test.runner"/>
+ <activity android:name=".SimpleActivity"
+ android:label="SimpleActivity"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+
<service android:name=".CtsTranslationService"
android:label="CtsTranslationService"
android:permission="android.permission.BIND_TRANSLATION_SERVICE"
@@ -29,6 +38,14 @@
<action android:name="android.service.translation.TranslationService"/>
</intent-filter>
</service>
+ <service android:name=".CtsContentCaptureService"
+ android:label="CtsContentCaptureService"
+ android:permission="android.permission.BIND_CONTENT_CAPTURE_SERVICE"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.service.contentcapture.ContentCaptureService"/>
+ </intent-filter>
+ </service>
</application>
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
diff --git a/tests/translation/TEST_MAPPING b/tests/translation/TEST_MAPPING
new file mode 100644
index 0000000..4090b4a
--- /dev/null
+++ b/tests/translation/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsTranslationTestCases",
+ "options": [
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/translation/res/layout/simple_activity.xml b/tests/translation/res/layout/simple_activity.xml
new file mode 100644
index 0000000..76a7184
--- /dev/null
+++ b/tests/translation/res/layout/simple_activity.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/root_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/hello"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="16sp"
+ android:text="Hello World" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/translation/src/android/translation/cts/CtsContentCaptureService.java b/tests/translation/src/android/translation/cts/CtsContentCaptureService.java
new file mode 100644
index 0000000..600034a
--- /dev/null
+++ b/tests/translation/src/android/translation/cts/CtsContentCaptureService.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.translation.cts;
+
+import android.content.ComponentName;
+import android.service.contentcapture.ActivityEvent;
+import android.service.contentcapture.ContentCaptureService;
+import android.service.contentcapture.DataShareCallback;
+import android.util.ArraySet;
+import android.util.Log;
+import android.util.Pair;
+import android.view.contentcapture.ContentCaptureContext;
+import android.view.contentcapture.ContentCaptureEvent;
+import android.view.contentcapture.ContentCaptureSessionId;
+import android.view.contentcapture.DataRemovalRequest;
+import android.view.contentcapture.DataShareRequest;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Implementation of {@link ContentCaptureService} used in CTS tests.
+ */
+public class CtsContentCaptureService extends ContentCaptureService {
+
+ private static final String TAG = "CtsContentCaptureService";
+
+ public static final String SERVICE_PACKAGE = "android.translation.cts";
+ public static final String SERVICE_NAME = SERVICE_PACKAGE + "/."
+ + CtsContentCaptureService.class.getSimpleName();
+
+ public static final long GENERIC_TIMEOUT_MS = 10_000;
+
+ private static ServiceWatcher sServiceWatcher;
+
+ private ContentCaptureContext mContentCaptureContext;
+ private final CountDownLatch mSessionCreatedLatch = new CountDownLatch(1);
+
+ @Override
+ public void onConnected() {
+ Log.i(TAG, "onConnected.");
+
+ if (sServiceWatcher != null) {
+ sServiceWatcher.mService = this;
+ sServiceWatcher.mConnected.countDown();
+ }
+ }
+
+ @Override
+ public void onDisconnected() {
+ Log.i(TAG, "onDisconnected.");
+ if (sServiceWatcher != null) {
+ sServiceWatcher.mService = null;
+ sServiceWatcher.mDisconnected.countDown();
+ sServiceWatcher = null;
+ }
+ }
+
+ @Override
+ public void onCreateContentCaptureSession(ContentCaptureContext context,
+ ContentCaptureSessionId sessionId) {
+ Log.i(TAG, "onCreateContentCaptureSession.");
+ mSessionCreatedLatch.countDown();
+ mContentCaptureContext = context;
+ }
+
+ @Override
+ public void onDestroyContentCaptureSession(ContentCaptureSessionId sessionId) {
+ Log.i(TAG, "onDestroyContentCaptureSession.");
+ }
+
+ @Override
+ public void onContentCaptureEvent(ContentCaptureSessionId sessionId,
+ ContentCaptureEvent event) {
+
+ }
+
+ @Override
+ public void onDataRemovalRequest(DataRemovalRequest request) {
+
+ }
+
+ @Override
+ public void onDataShareRequest(DataShareRequest request, DataShareCallback callback) {
+
+ }
+
+ @Override
+ public void onActivityEvent(ActivityEvent event) {
+
+ }
+
+ /**
+ * Set the ServiceWatcher that used to monitor the service status.
+ */
+ public static ServiceWatcher setServiceWatcher() {
+ if (sServiceWatcher != null) {
+ throw new IllegalStateException("There Can Be Only One!");
+ }
+ sServiceWatcher = new ServiceWatcher();
+ return sServiceWatcher;
+ }
+
+ /**
+ * Resets the static state of this Service. Called before each test.
+ */
+ public static void resetStaticState() {
+ sServiceWatcher = null;
+ }
+
+ /**
+ * Get the ContentCaptureContext that set by {@link #onCreateContentCaptureSession}.
+ */
+ ContentCaptureContext getContentCaptureContext() {
+ return mContentCaptureContext;
+ }
+
+ /**
+ * Wait the ContentCapture session created.
+ */
+ void awaitSessionCreated(long timeoutMillis) {
+ try {
+ mSessionCreatedLatch.await(timeoutMillis, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ // do nothing
+ }
+ }
+
+ /**
+ * Helper class to monitor the state of the service.
+ */
+ public static final class ServiceWatcher {
+ private final CountDownLatch mConnected = new CountDownLatch(1);
+ private final CountDownLatch mDisconnected = new CountDownLatch(1);
+
+ CtsContentCaptureService mService;
+ private Pair<Set<String>, Set<ComponentName>> mAllowList;
+
+ @NonNull
+ public CtsContentCaptureService waitOnConnected() throws InterruptedException {
+ await(mConnected, "not connected");
+
+ if (mService == null) {
+ throw new IllegalStateException("not connected");
+ }
+ if (mAllowList != null) {
+ Log.d(TAG, "Allow after created: " + mAllowList);
+ mService.setContentCaptureWhitelist(mAllowList.first, mAllowList.second);
+ }
+ return mService;
+ }
+
+ public void waitOnDisconnected() throws InterruptedException {
+ await(mDisconnected, "not disconnected");
+ }
+
+ public void setAllowSelf() {
+ final ArraySet<String> pkgs = new ArraySet<>(1);
+ pkgs.add(SERVICE_PACKAGE);
+ mAllowList = new Pair<>(pkgs, null);
+ }
+
+ private static void await(@NonNull CountDownLatch latch, @NonNull String fmt,
+ @Nullable Object... args)
+ throws InterruptedException {
+ final boolean called = latch.await(GENERIC_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ if (!called) {
+ throw new IllegalStateException(String.format(fmt, args)
+ + " in " + GENERIC_TIMEOUT_MS + "ms");
+ }
+ }
+ }
+}
diff --git a/tests/translation/src/android/translation/cts/CtsTranslationService.java b/tests/translation/src/android/translation/cts/CtsTranslationService.java
index 03e7cc1..480a66b 100644
--- a/tests/translation/src/android/translation/cts/CtsTranslationService.java
+++ b/tests/translation/src/android/translation/cts/CtsTranslationService.java
@@ -20,10 +20,10 @@
import android.os.CancellationSignal;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.Looper;
-import android.service.translation.TranslationRequest;
import android.service.translation.TranslationService;
import android.util.Log;
+import android.view.translation.TranslationRequest;
+import android.view.translation.TranslationRequestValue;
import android.view.translation.TranslationResponse;
import android.view.translation.TranslationSpec;
@@ -58,6 +58,8 @@
private final Handler mHandler;
+ private final CountDownLatch mSessionDestroyedLatch = new CountDownLatch(1);
+
/**
* Timeout for Translation cts.
*/
@@ -105,6 +107,7 @@
@Override
public void onFinishTranslationSession(int sessionId) {
Log.v(TAG, "onFinishTranslationSession");
+ mSessionDestroyedLatch.countDown();
}
@Override
@@ -112,8 +115,6 @@
@NonNull CancellationSignal cancellationSignal,
@NonNull OnTranslationResultCallback callback) {
Log.v(TAG, "onTranslationRequest(" + request + ")");
- final android.view.translation.TranslationRequest viewRequest =
- request.getTranslationRequests().get(0);
mHandler.post(() -> sTranslationReplier.handleOnTranslationRequest(getApplicationContext(),
request, sessionId, cancellationSignal, callback));
@@ -129,6 +130,17 @@
}
/**
+ * Wait the Translation session destroyed.
+ */
+ void awaitSessionDestroyed() {
+ try {
+ mSessionDestroyedLatch.await(TRANSLATION_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ // do nothing
+ }
+ }
+
+ /**
* Gets the {@link TranslationReplier} singleton.
*/
public static TranslationReplier getTranslationReplier() {
@@ -306,6 +318,10 @@
return mService;
}
+ public CtsTranslationService getService() {
+ return mService;
+ }
+
public void waitOnDisconnected() throws InterruptedException {
await(mDisconnected, "not destroyed");
}
diff --git a/tests/translation/src/android/translation/cts/Helper.java b/tests/translation/src/android/translation/cts/Helper.java
new file mode 100644
index 0000000..b522a9a
--- /dev/null
+++ b/tests/translation/src/android/translation/cts/Helper.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.translation.cts;
+
+import static com.android.compatibility.common.util.ShellUtils.runShellCommand;
+
+import android.content.ContentCaptureOptions;
+import android.content.Context;
+import android.os.UserHandle;
+import android.util.Log;
+import android.view.contentcapture.ContentCaptureContext;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.uiautomator.By;
+import androidx.test.uiautomator.UiDevice;
+import androidx.test.uiautomator.UiObject2;
+import androidx.test.uiautomator.Until;
+
+/**
+ * Helper for common funcionalities.
+ */
+public final class Helper {
+
+ private static final String TAG = "Helper";
+
+ /**
+ * Sets the translation service temporarily.
+ *
+ * @param service name of temporary translation service.
+ */
+ public static void setTemporaryTranslationService(String service) {
+ Log.d(TAG, "Setting translation service to " + service);
+ final int userId = UserHandle.myUserId();
+ //TODO(b/181179744): restore to translation service before S release.
+ runShellCommand("cmd transformer set temporary-service %d %s 12000", userId, service);
+ }
+
+ /**
+ * Resets the translation service.
+ */
+ public static void resetTemporaryTranslationService() {
+ final int userId = UserHandle.myUserId();
+ Log.d(TAG, "Resetting back user " + userId + " to default translation service");
+ //TODO(b/181179744): restore to translation service before S release.
+ runShellCommand("cmd transformer set temporary-service %d", userId);
+ }
+
+ /**
+ * Sets the content capture service temporarily.
+ *
+ * @param service name of temporary translation service.
+ */
+ public static void setTemporaryContentCaptureService(String service) {
+ Log.d(TAG, "Setting content capture service to " + service);
+ final int userId = UserHandle.myUserId();
+ runShellCommand("cmd content_capture set temporary-service %d %s 12000", userId, service);
+ }
+
+ /**
+ * Resets the content capture service.
+ */
+ public static void resetTemporaryContentCaptureService() {
+ final int userId = UserHandle.myUserId();
+ Log.d(TAG, "Resetting back user " + userId + " to default service");
+ runShellCommand("cmd content_capture set temporary-service %d", userId);
+ }
+
+ /**
+ * Enable or disable the default content capture service.
+ *
+ * @param enabled {@code true} to enable default content capture service.
+ */
+ public static void setDefaultContentCaptureServiceEnabled(boolean enabled) {
+ final int userId = UserHandle.myUserId();
+ Log.d(TAG, "setDefaultServiceEnabled(user=" + userId + ", enabled= " + enabled + ")");
+ runShellCommand("cmd content_capture set default-service-enabled %d %s", userId,
+ Boolean.toString(enabled));
+ }
+
+ /**
+ * Add the cts itself into content capture allow list.
+ *
+ * @param context Context of the app.
+ */
+ public static void allowSelfForContentCapture(Context context) {
+ final ContentCaptureOptions options = ContentCaptureOptions.forWhitelistingItself();
+ Log.v(TAG, "allowSelfForContentCapture(): options=" + options);
+ context.getApplicationContext().setContentCaptureOptions(options);
+ }
+
+ /**
+ * Reset the cts itself from content capture allow list.
+ *
+ * @param context Context of the app.
+ */
+ public static void unAllowSelfForContentCapture(Context context) {
+ Log.v(TAG, "unAllowSelfForContentCapture()");
+ context.getApplicationContext().setContentCaptureOptions(null);
+ }
+
+ /**
+ * Return a ui object for resource id.
+ *
+ * @param resourcePackage package of the object
+ * @param resourceId the resource id of the object
+ */
+ public static UiObject2 findObjectByResId(String resourcePackage, String resourceId) {
+ final UiDevice uiDevice =
+ UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+ final UiObject2 foundObj = uiDevice.wait(
+ Until.findObject(By.res(resourcePackage, resourceId)), 5_000L);
+ return foundObj;
+ }
+}
\ No newline at end of file
diff --git a/tests/translation/src/android/translation/cts/SimpleActivity.java b/tests/translation/src/android/translation/cts/SimpleActivity.java
new file mode 100644
index 0000000..6b9139c
--- /dev/null
+++ b/tests/translation/src/android/translation/cts/SimpleActivity.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.translation.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.autofill.AutofillId;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A simple activity that contains a TextView used for translation testing.
+ */
+public class SimpleActivity extends Activity {
+
+ public static final String ACTIVITY_PACKAGE = "android.translation.cts";
+ public static final String HELLO_TEXT_ID = "hello";
+
+ private static final String TAG = "SimpleActivity";
+
+ private TextView mHelloText;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.simple_activity);
+
+ mHelloText = findViewById(R.id.hello);
+ }
+
+ List<AutofillId> getViewsForTranslation() {
+ final List<AutofillId> views = new ArrayList<>();
+ views.add(mHelloText.getAutofillId());
+ return views;
+ }
+
+ TextView getHelloText() {
+ return mHelloText;
+ }
+}
diff --git a/tests/translation/src/android/translation/cts/TranslationManagerTest.java b/tests/translation/src/android/translation/cts/TranslationManagerTest.java
index 9b54938..bd14874 100644
--- a/tests/translation/src/android/translation/cts/TranslationManagerTest.java
+++ b/tests/translation/src/android/translation/cts/TranslationManagerTest.java
@@ -22,10 +22,13 @@
import android.app.Instrumentation;
import android.content.pm.PackageManager;
+import android.platform.test.annotations.AppModeFull;
import android.util.Log;
import android.view.translation.TranslationManager;
import android.view.translation.TranslationRequest;
+import android.view.translation.TranslationRequestValue;
import android.view.translation.TranslationResponse;
+import android.view.translation.TranslationResponseValue;
import android.view.translation.TranslationSpec;
import android.view.translation.Translator;
@@ -57,6 +60,8 @@
* that is set via shell command. This temporary service is not defined in the trusted
* TranslationService, it should only receive queries from clients in the same package.</p>
*/
+@AppModeFull(reason = "TODO(b/182330968): disable instant mode. Re-enable after we decouple the "
+ + "service from the test package.")
@RunWith(AndroidJUnit4.class)
public class TranslationManagerTest {
@@ -88,7 +93,7 @@
@After
public void cleanup() {
- resetTemporaryTranslationService();
+ Helper.resetTemporaryTranslationService();
}
@Test
@@ -100,8 +105,9 @@
sTranslationReplier.addResponse(
new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
- .addTranslations(new TranslationRequest.Builder()
- .setTranslationText("success")
+ .setTranslationResponseValue(0, new TranslationResponseValue
+ .Builder(TranslationResponseValue.STATUS_SUCCESS)
+ .setText("success")
.build())
.build());
@@ -122,7 +128,10 @@
assertThat(translator.isDestroyed()).isFalse();
final TranslationResponse response = translator.translate(
- new TranslationRequest("hello world"));
+ new TranslationRequest.Builder()
+ .addTranslationRequestValue(
+ TranslationRequestValue.forText("hello world"))
+ .build());
sTranslationReplier.getNextTranslationRequest();
@@ -148,11 +157,14 @@
assertThat(response).isNotNull();
assertThat(response.getTranslationStatus())
.isEqualTo(TranslationResponse.TRANSLATION_STATUS_SUCCESS);
- assertThat(response.getTranslations().size()).isEqualTo(1);
+ assertThat(response.getTranslationResponseValues().size()).isEqualTo(1);
+ assertThat(response.getViewTranslationResponses().size()).isEqualTo(0);
- final TranslationRequest request = response.getTranslations().get(0);
- assertThat(request.getAutofillId()).isEqualTo(null);
- assertThat(request.getTranslationText()).isEqualTo("success");
+ final TranslationResponseValue value = response.getTranslationResponseValues().get(0);
+ assertThat(value.getStatusCode()).isEqualTo(TranslationResponseValue.STATUS_SUCCESS);
+ assertThat(value.getText()).isEqualTo("success");
+ assertThat(value.getTransliteration()).isNull();
+ assertThat(value.getDictionaryDescription()).isNull();
}
@Test
@@ -181,29 +193,6 @@
protected void enableCtsTranslationService() {
mServiceWatcher = CtsTranslationService.setServiceWatcher();
- setTemporaryTranslationService(CtsTranslationService.SERVICE_NAME);
- }
-
- /**
- * Sets the translation service temporarily.
- *
- * @param service name of temporary translation service.
- */
- private static void setTemporaryTranslationService(@NonNull String service) {
- Log.d(TAG, "Setting translation service to " + service);
-
- //TODO(b/181179744): restore to translation service before S release.
- runShellCommand("cmd transformer set temporary-service 0 %s %d", service,
- 120000);
- }
-
- /**
- * Resets the translation service.
- */
- private static void resetTemporaryTranslationService() {
- Log.d(TAG, "Resetting translation service");
-
- //TODO(b/181179744): restore to translation service before S release.
- runShellCommand("cmd transformer set temporary-service 0");
+ Helper.setTemporaryTranslationService(CtsTranslationService.SERVICE_NAME);
}
}
diff --git a/tests/translation/src/android/translation/cts/UiTranslationManagerTest.java b/tests/translation/src/android/translation/cts/UiTranslationManagerTest.java
new file mode 100644
index 0000000..6d07f07
--- /dev/null
+++ b/tests/translation/src/android/translation/cts/UiTranslationManagerTest.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.translation.cts;
+
+import static android.content.Context.CONTENT_CAPTURE_MANAGER_SERVICE;
+import static android.content.Context.TRANSLATION_MANAGER_SERVICE;
+import static android.view.translation.TranslationResponseValue.STATUS_SUCCESS;
+
+import static com.android.compatibility.common.util.ShellUtils.runShellCommand;
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.SystemClock;
+import android.platform.test.annotations.AppModeFull;
+import android.service.contentcapture.ContentCaptureService;
+import android.service.translation.TranslationService;
+import android.util.Log;
+import android.view.autofill.AutofillId;
+import android.view.contentcapture.ContentCaptureContext;
+import android.view.translation.TranslationManager;
+import android.view.translation.TranslationRequest;
+import android.view.translation.TranslationResponse;
+import android.view.translation.TranslationResponseValue;
+import android.view.translation.TranslationSpec;
+import android.view.translation.UiTranslationManager;
+import android.view.translation.ViewTranslationRequest;
+import android.view.translation.ViewTranslationResponse;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.runner.AndroidJUnit4;
+import androidx.test.uiautomator.UiObject2;
+
+import com.android.compatibility.common.util.RequiredFeatureRule;
+import com.android.compatibility.common.util.RequiredServiceRule;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Tests for {@link UiTranslationManager} related APIs.
+ *
+ * <p>
+ * {@link UiTranslationManager} needs a token that reports by {@link ContentCaptureService}. We use
+ * a non pre-configured {@link ContentCaptureService} and a {@link TranslationService} temporary
+ * service for CTS tests that is set via shell command. The test will get the token from the
+ * {@link ContentCaptureService} then uses this token in {@link UiTranslationManager} APIs.</p>
+ */
+
+@AppModeFull(reason = "TODO(b/182330968): disable instant mode. Re-enable after we decouple the "
+ + "service from the test package.")
+@RunWith(AndroidJUnit4.class)
+public class UiTranslationManagerTest {
+
+ private static final String TAG = "UiTranslationManagerTest";
+
+ private static final long UI_WAIT_TIMEOUT = 2000;
+
+ private static Context sContext;
+ private static CtsTranslationService.TranslationReplier sTranslationReplier;
+
+ private CtsContentCaptureService.ServiceWatcher mContentCaptureServiceWatcher;
+ private CtsTranslationService.ServiceWatcher mTranslationServiceServiceWatcher;
+ private ActivityScenario<SimpleActivity> mActivityScenario;
+
+ @Rule
+ public final RequiredFeatureRule mFeatureRule =
+ new RequiredFeatureRule(PackageManager.FEATURE_TRANSLATION);
+ @Rule
+ public final RequiredServiceRule mContentCaptureServiceRule =
+ new RequiredServiceRule(CONTENT_CAPTURE_MANAGER_SERVICE);
+
+ @Rule
+ public final RequiredServiceRule mTranslationServiceRule =
+ new RequiredServiceRule(TRANSLATION_MANAGER_SERVICE);
+
+ @BeforeClass
+ public static void oneTimeSetup() {
+ sContext = ApplicationProvider.getApplicationContext();
+ sTranslationReplier = CtsTranslationService.getTranslationReplier();
+
+ Helper.allowSelfForContentCapture(sContext);
+ Helper.setDefaultContentCaptureServiceEnabled(/* enabled= */ false);
+ }
+
+ @AfterClass
+ public static void oneTimeReset() {
+ Helper.unAllowSelfForContentCapture(sContext);
+ Helper.setDefaultContentCaptureServiceEnabled(/* enabled= */ true);
+ }
+
+ @Before
+ public void setup() throws Exception {
+ prepareDevice();
+ CtsContentCaptureService.resetStaticState();
+ CtsTranslationService.resetStaticState();
+ }
+
+ @After
+ public void cleanup() throws Exception {
+ mActivityScenario.moveToState(Lifecycle.State.DESTROYED);
+
+ Helper.resetTemporaryContentCaptureService();
+ Helper.resetTemporaryTranslationService();
+ }
+
+ private void prepareDevice() throws Exception {
+ // Unlock screen.
+ runShellCommand("input keyevent KEYCODE_WAKEUP");
+ // Dismiss keyguard, in case it's set as "Swipe to unlock".
+ runShellCommand("wm dismiss-keyguard");
+ // Collapse notifications.
+ runShellCommand("cmd statusbar collapse");
+ }
+
+ @Test
+ public void testUiTranslation() throws Throwable {
+ // Enable CTS ContentCaptureService
+ final CtsContentCaptureService contentcaptureService = enableContentCaptureService();
+
+ // Start Activity and get needed information
+ final Intent intent = new Intent(sContext, SimpleActivity.class)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mActivityScenario = ActivityScenario.launch(intent);
+ final AtomicReference<CharSequence> originalTextRef = new AtomicReference<>();
+ final AtomicReference<List<AutofillId>> viewAutofillIdsTextRef = new AtomicReference<>();
+ mActivityScenario.onActivity(activity -> {
+ originalTextRef.set(activity.getHelloText().getText());
+ viewAutofillIdsTextRef.set(activity.getViewsForTranslation());
+ });
+ final CharSequence originalText = originalTextRef.get();
+ // Get the views that need to be translated.
+ final List<AutofillId> views = viewAutofillIdsTextRef.get();
+
+ // Wait session created and get the ConttCaptureContext from ContentCaptureService
+ final ContentCaptureContext contentCaptureContext =
+ getContentCaptureContextFromContentCaptureService(contentcaptureService);
+
+ // enable CTS TranslationService
+ mTranslationServiceServiceWatcher = CtsTranslationService.setServiceWatcher();
+ Helper.setTemporaryTranslationService(CtsTranslationService.SERVICE_NAME);
+
+ final String translatedText = "success";
+ final UiTranslationManager manager = sContext.getSystemService(UiTranslationManager.class);
+ final UiObject2 helloText = Helper.findObjectByResId(SimpleActivity.ACTIVITY_PACKAGE,
+ SimpleActivity.HELLO_TEXT_ID);
+ assertThat(helloText).isNotNull();
+ // Set response
+ sTranslationReplier.addResponse(createViewsTranslationResponse(views, translatedText));
+
+ runWithShellPermissionIdentity(() -> {
+ // Call startTranslation API
+ manager.startTranslation(
+ new TranslationSpec(Locale.ENGLISH.getLanguage(),
+ TranslationSpec.DATA_FORMAT_TEXT),
+ new TranslationSpec(Locale.FRENCH.getLanguage(),
+ TranslationSpec.DATA_FORMAT_TEXT),
+ views, contentCaptureContext.getActivityId());
+
+ // Check request
+ final TranslationRequest request = sTranslationReplier.getNextTranslationRequest();
+ final List<ViewTranslationRequest> requests = request.getViewTranslationRequests();
+ final ViewTranslationRequest viewRequest = requests.get(0);
+ assertThat(viewRequest.getAutofillId()).isEqualTo(views.get(0));
+ assertThat(viewRequest.getKeys().size()).isEqualTo(1);
+ assertThat(viewRequest.getKeys()).containsExactly(ViewTranslationRequest.ID_TEXT);
+ assertThat(viewRequest.getValue(ViewTranslationRequest.ID_TEXT).getText())
+ .isEqualTo(originalText);
+
+ SystemClock.sleep(UI_WAIT_TIMEOUT);
+ assertThat(helloText.getText()).isEqualTo(translatedText);
+
+ // Call pauseTranslation API
+ manager.pauseTranslation(contentCaptureContext.getActivityId());
+
+ SystemClock.sleep(UI_WAIT_TIMEOUT);
+ assertThat(helloText.getText()).isEqualTo(originalText);
+
+ // Call resumeTranslation API
+ manager.resumeTranslation(contentCaptureContext.getActivityId());
+
+ SystemClock.sleep(UI_WAIT_TIMEOUT);
+ assertThat(helloText.getText()).isEqualTo(translatedText);
+
+ // Call finishTranslation API
+ manager.finishTranslation(contentCaptureContext.getActivityId());
+
+ SystemClock.sleep(UI_WAIT_TIMEOUT);
+ assertThat(helloText.getText()).isEqualTo(originalText);
+
+ // Check the Translation session is destroyed after calling finishTranslation()
+ CtsTranslationService translationService =
+ mTranslationServiceServiceWatcher.getService();
+ translationService.awaitSessionDestroyed();
+ });
+ }
+
+ private CtsContentCaptureService enableContentCaptureService() throws Exception {
+ mContentCaptureServiceWatcher = CtsContentCaptureService.setServiceWatcher();
+ Helper.setTemporaryContentCaptureService(CtsContentCaptureService.SERVICE_NAME);
+ mContentCaptureServiceWatcher.setAllowSelf();
+ return mContentCaptureServiceWatcher.waitOnConnected();
+ }
+
+ private ContentCaptureContext getContentCaptureContextFromContentCaptureService(
+ CtsContentCaptureService service) {
+ service.awaitSessionCreated(CtsContentCaptureService.GENERIC_TIMEOUT_MS);
+ final ContentCaptureContext contentCaptureContext = service.getContentCaptureContext();
+ Log.d(TAG, "contentCaptureContext = " + contentCaptureContext);
+
+ assertThat(contentCaptureContext).isNotNull();
+ assertThat(contentCaptureContext.getActivityId()).isNotNull();
+
+ return contentCaptureContext;
+ }
+
+ private TranslationResponse createViewsTranslationResponse(List<AutofillId> viewAutofillIds,
+ String translatedText) {
+ final TranslationResponse.Builder responseBuilder =
+ new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS);
+ for (int i = 0; i < viewAutofillIds.size(); i++) {
+ ViewTranslationResponse.Builder responseDataBuilder =
+ new ViewTranslationResponse.Builder(viewAutofillIds.get(i))
+ .setValue(ViewTranslationRequest.ID_TEXT,
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText(translatedText).build());
+ responseBuilder.setViewTranslationResponse(i, responseDataBuilder.build());
+ }
+ return responseBuilder.build();
+ }
+}
diff --git a/tests/translation/src/android/translation/cts/unittests/InternalTranslationRequestTest.java b/tests/translation/src/android/translation/cts/unittests/InternalTranslationRequestTest.java
deleted file mode 100644
index 1255647..0000000
--- a/tests/translation/src/android/translation/cts/unittests/InternalTranslationRequestTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.translation.cts.unittests;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.testng.Assert.assertThrows;
-
-import android.os.Parcel;
-import android.service.translation.TranslationRequest;
-import android.view.autofill.AutofillId;
-import android.view.translation.TranslationSpec;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-
-@RunWith(AndroidJUnit4.class)
-public class InternalTranslationRequestTest {
-
- private final TranslationSpec mSourceSpec =
- new TranslationSpec("en", TranslationSpec.DATA_FORMAT_TEXT);
- private final TranslationSpec mDestSpec =
- new TranslationSpec("zh", TranslationSpec.DATA_FORMAT_TEXT);
- private final android.view.translation.TranslationRequest mRequest =
- new android.view.translation.TranslationRequest.Builder()
- .setAutofillId(new AutofillId(17))
- .setTranslationText("sample text")
- .build();
-
- @Test
- public void testBuilder_nullSpecs() {
- final ArrayList<android.view.translation.TranslationRequest> requests = new ArrayList<>();
- assertThrows(NullPointerException.class, () -> {
- final TranslationRequest request =
- new TranslationRequest.Builder(0, null, mDestSpec, requests).build();
- });
- assertThrows(NullPointerException.class, () -> {
- final TranslationRequest request =
- new TranslationRequest.Builder(0, mSourceSpec, null, requests).build();
- });
- }
-
- @Test
- public void testBuilder_nullRequests() {
- assertThrows(NullPointerException.class, () -> {
- final TranslationRequest request =
- new TranslationRequest.Builder(0, mSourceSpec, mDestSpec, null).build();
- });
- }
-
- @Test
- public void testBuilder_validRequests() {
- final ArrayList<android.view.translation.TranslationRequest> requests = new ArrayList<>();
- requests.add(mRequest);
- final TranslationRequest request =
- new TranslationRequest.Builder(0, mSourceSpec, mDestSpec, requests).build();
-
- assertThat(request.getRequestId()).isEqualTo(0);
- assertThat(request.getSourceSpec()).isEqualTo(mSourceSpec);
- assertThat(request.getDestSpec()).isEqualTo(mDestSpec);
- assertThat(request.getTranslationRequests().size()).isEqualTo(1);
-
- final android.view.translation.TranslationRequest request1 =
- request.getTranslationRequests().get(0);
- assertThat(request1.getAutofillId()).isEqualTo(new AutofillId(17));
- assertThat(request1.getTranslationText()).isEqualTo("sample text");
- }
-
- @Test
- public void testBuilder_validAddRequests() {
- final ArrayList<android.view.translation.TranslationRequest> requests = new ArrayList<>();
- final TranslationRequest request =
- new TranslationRequest.Builder(0, mSourceSpec, mDestSpec, requests)
- .addTranslationRequests(mRequest)
- .build();
-
- assertThat(request.getRequestId()).isEqualTo(0);
- assertThat(request.getSourceSpec()).isEqualTo(mSourceSpec);
- assertThat(request.getDestSpec()).isEqualTo(mDestSpec);
- assertThat(request.getTranslationRequests().size()).isEqualTo(1);
-
- final android.view.translation.TranslationRequest request1 =
- request.getTranslationRequests().get(0);
- assertThat(request1.getAutofillId()).isEqualTo(new AutofillId(17));
- assertThat(request1.getTranslationText()).isEqualTo("sample text");
- }
-
- @Test
- public void testParceledRequest() {
- final ArrayList<android.view.translation.TranslationRequest> requests = new ArrayList<>();
- requests.add(mRequest);
- final TranslationRequest request =
- new TranslationRequest.Builder(0, mSourceSpec, mDestSpec, requests).build();
-
- final Parcel parcel = Parcel.obtain();
- request.writeToParcel(parcel, 0);
- parcel.setDataPosition(0);
- final TranslationRequest parceledRequest =
- TranslationRequest.CREATOR.createFromParcel(parcel);
-
- assertThat(request.getRequestId()).isEqualTo(0);
- assertThat(request.getSourceSpec()).isEqualTo(mSourceSpec);
- assertThat(request.getDestSpec()).isEqualTo(mDestSpec);
- assertThat(request.getTranslationRequests().size()).isEqualTo(1);
-
- final android.view.translation.TranslationRequest request1 =
- parceledRequest.getTranslationRequests().get(0);
- assertThat(request1.getAutofillId()).isEqualTo(new AutofillId(17));
- assertThat(request1.getTranslationText()).isEqualTo("sample text");
- }
-}
\ No newline at end of file
diff --git a/tests/translation/src/android/translation/cts/unittests/TranslationRequestTest.java b/tests/translation/src/android/translation/cts/unittests/TranslationRequestTest.java
index eb3b772..a62f331 100644
--- a/tests/translation/src/android/translation/cts/unittests/TranslationRequestTest.java
+++ b/tests/translation/src/android/translation/cts/unittests/TranslationRequestTest.java
@@ -21,6 +21,8 @@
import android.os.Parcel;
import android.view.autofill.AutofillId;
import android.view.translation.TranslationRequest;
+import android.view.translation.TranslationRequestValue;
+import android.view.translation.ViewTranslationRequest;
import androidx.test.runner.AndroidJUnit4;
@@ -30,25 +32,49 @@
@RunWith(AndroidJUnit4.class)
public class TranslationRequestTest {
- private final AutofillId mAutofillId = new AutofillId(17);
- private final String mTranslationText = "sample text";
+ private final TranslationRequestValue mValue = TranslationRequestValue.forText("hello");
+
+ private final ViewTranslationRequest mRequest = new ViewTranslationRequest
+ .Builder(new AutofillId(17))
+ .setValue("sample id", TranslationRequestValue.forText("sample text"))
+ .build();
@Test
- public void testBuilder_validRequest() {
+ public void testBuilder_validViewTranslationRequest() {
final TranslationRequest request = new TranslationRequest.Builder()
- .setAutofillId(mAutofillId)
- .setTranslationText(mTranslationText)
+ .addViewTranslationRequest(mRequest)
.build();
- assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
- assertThat(request.getTranslationText()).isEqualTo("sample text");
+ assertThat(request.getTranslationRequestValues().size()).isEqualTo(0);
+ assertThat(request.getViewTranslationRequests().size()).isEqualTo(1);
+
+ final ViewTranslationRequest viewRequest =
+ request.getViewTranslationRequests().get(0);
+ assertThat(viewRequest.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(viewRequest.getKeys().size()).isEqualTo(1);
+ assertThat(viewRequest.getKeys()).containsExactly("sample id");
+ assertThat(viewRequest.getValue("sample id").getText()).isEqualTo("sample text");
}
@Test
- public void testParceledRequest() {
+ public void testBuilder_validTranslationRequestValue() {
final TranslationRequest request = new TranslationRequest.Builder()
- .setAutofillId(mAutofillId)
- .setTranslationText(mTranslationText)
+ .addTranslationRequestValue(mValue)
+ .build();
+
+ assertThat(request.getTranslationRequestValues().size()).isEqualTo(1);
+ assertThat(request.getViewTranslationRequests().size()).isEqualTo(0);
+
+ final TranslationRequestValue value =
+ request.getTranslationRequestValues().get(0);
+ assertThat(value.getText()).isEqualTo("hello");
+ }
+
+ @Test
+ public void testParceledRequest_validTranslationRequestValues() {
+ final TranslationRequest request = new TranslationRequest.Builder()
+ .addTranslationRequestValue(mValue)
+ .addTranslationRequestValue(TranslationRequestValue.forText("world"))
.build();
final Parcel parcel = Parcel.obtain();
@@ -57,7 +83,98 @@
final TranslationRequest parceledRequest =
TranslationRequest.CREATOR.createFromParcel(parcel);
- assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
- assertThat(request.getTranslationText()).isEqualTo("sample text");
+ assertThat(parceledRequest.getTranslationRequestValues().size()).isEqualTo(2);
+ assertThat(parceledRequest.getViewTranslationRequests().size()).isEqualTo(0);
+
+ final TranslationRequestValue value1 =
+ parceledRequest.getTranslationRequestValues().get(0);
+ assertThat(value1.getText()).isEqualTo("hello");
+
+ final TranslationRequestValue value2 =
+ parceledRequest.getTranslationRequestValues().get(1);
+ assertThat(value2.getText()).isEqualTo("world");
+ }
+
+ @Test
+ public void testBuilder_sameAutofillIdViewTranslationRequests() {
+ final TranslationRequest request = new TranslationRequest.Builder()
+ .addViewTranslationRequest(mRequest)
+ .addViewTranslationRequest(
+ new ViewTranslationRequest.Builder(new AutofillId(17))
+ .setValue("id2", TranslationRequestValue.forText("text2"))
+ .build())
+ .build();
+
+ assertThat(request.getTranslationRequestValues().size()).isEqualTo(0);
+ assertThat(request.getViewTranslationRequests().size()).isEqualTo(2);
+
+ final ViewTranslationRequest viewRequest =
+ request.getViewTranslationRequests().get(0);
+ assertThat(viewRequest.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(viewRequest.getKeys().size()).isEqualTo(1);
+ assertThat(viewRequest.getKeys()).containsExactly("sample id");
+ assertThat(viewRequest.getValue("sample id").getText()).isEqualTo("sample text");
+
+ final ViewTranslationRequest viewRequest2 =
+ request.getViewTranslationRequests().get(1);
+ assertThat(viewRequest2.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(viewRequest2.getKeys().size()).isEqualTo(1);
+ assertThat(viewRequest2.getKeys()).containsExactly("id2");
+ assertThat(viewRequest2.getValue("id2").getText()).isEqualTo("text2");
+ }
+
+ @Test
+ public void testBuilder_mixingAdders() {
+ final TranslationRequest request = new TranslationRequest.Builder()
+ .addViewTranslationRequest(mRequest)
+ .addTranslationRequestValue(mValue)
+ .build();
+
+ assertThat(request.getTranslationRequestValues().size()).isEqualTo(1);
+ assertThat(request.getViewTranslationRequests().size()).isEqualTo(1);
+
+ final ViewTranslationRequest viewRequest =
+ request.getViewTranslationRequests().get(0);
+ assertThat(viewRequest.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(viewRequest.getKeys().size()).isEqualTo(1);
+ assertThat(viewRequest.getKeys()).containsExactly("sample id");
+ assertThat(viewRequest.getValue("sample id").getText()).isEqualTo("sample text");
+
+ final TranslationRequestValue value =
+ request.getTranslationRequestValues().get(0);
+ assertThat(value.getText()).isEqualTo("hello");
+ }
+
+ @Test
+ public void testParceledRequest_validViewTranslationRequests() {
+ final TranslationRequest request = new TranslationRequest.Builder()
+ .addViewTranslationRequest(mRequest)
+ .addViewTranslationRequest(new ViewTranslationRequest.Builder(new AutofillId(42))
+ .setValue("id2", TranslationRequestValue.forText("test"))
+ .build())
+ .build();
+
+ final Parcel parcel = Parcel.obtain();
+ request.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ final TranslationRequest parceledRequest =
+ TranslationRequest.CREATOR.createFromParcel(parcel);
+
+ assertThat(parceledRequest.getTranslationRequestValues().size()).isEqualTo(0);
+ assertThat(parceledRequest.getViewTranslationRequests().size()).isEqualTo(2);
+
+ final ViewTranslationRequest request1 =
+ parceledRequest.getViewTranslationRequests().get(0);
+ assertThat(request1.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request1.getKeys().size()).isEqualTo(1);
+ assertThat(request1.getKeys()).containsExactly("sample id");
+ assertThat(request1.getValue("sample id").getText()).isEqualTo("sample text");
+
+ final ViewTranslationRequest request2 =
+ parceledRequest.getViewTranslationRequests().get(1);
+ assertThat(request2.getAutofillId()).isEqualTo(new AutofillId(42));
+ assertThat(request2.getKeys().size()).isEqualTo(1);
+ assertThat(request2.getKeys()).containsExactly("id2");
+ assertThat(request2.getValue("id2").getText()).isEqualTo("test");
}
}
\ No newline at end of file
diff --git a/tests/translation/src/android/translation/cts/unittests/TranslationResponseTest.java b/tests/translation/src/android/translation/cts/unittests/TranslationResponseTest.java
index 85548e1..d7f0054 100644
--- a/tests/translation/src/android/translation/cts/unittests/TranslationResponseTest.java
+++ b/tests/translation/src/android/translation/cts/unittests/TranslationResponseTest.java
@@ -16,131 +16,178 @@
package android.translation.cts.unittests;
+import static android.view.translation.TranslationResponseValue.STATUS_SUCCESS;
+
import static com.google.common.truth.Truth.assertThat;
+import static org.testng.Assert.assertThrows;
+
import android.os.Parcel;
import android.view.autofill.AutofillId;
-import android.view.translation.TranslationRequest;
import android.view.translation.TranslationResponse;
+import android.view.translation.TranslationResponseValue;
+import android.view.translation.ViewTranslationResponse;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.ArrayList;
-
@RunWith(AndroidJUnit4.class)
public class TranslationResponseTest {
- private final TranslationRequest mRequest = new TranslationRequest.Builder()
- .setAutofillId(new AutofillId(17))
- .setTranslationText("text1")
- .build();
- private final TranslationRequest mRequest2 = new TranslationRequest.Builder()
- .setAutofillId(new AutofillId(42))
- .setTranslationText("text2")
+ private final TranslationResponseValue mValue =
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("hello")
+ .build();
+
+ private final ViewTranslationResponse mResponse = new ViewTranslationResponse
+ .Builder(new AutofillId(17))
+ .setValue("sample id",
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("sample text")
+ .build())
.build();
@Test
- public void testBuilder_nullTranslation() {
- final TranslationResponse response =
+ public void testBuilder_validViewTranslationResponse() {
+ final TranslationResponse request =
new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
- .addTranslations(null)
- .build();
+ .setViewTranslationResponse(0, mResponse)
+ .build();
- assertThat(response.getTranslationStatus())
- .isEqualTo(TranslationResponse.TRANSLATION_STATUS_SUCCESS);
- assertThat(response.getTranslations().size()).isEqualTo(1);
- assertThat(response.getTranslations().get(0)).isNull();
+ assertThat(request.getTranslationResponseValues().size()).isEqualTo(0);
+ assertThat(request.getViewTranslationResponses().size()).isEqualTo(1);
+
+ final ViewTranslationResponse viewRequest =
+ request.getViewTranslationResponses().get(0);
+ assertThat(viewRequest.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(viewRequest.getKeys().size()).isEqualTo(1);
+ assertThat(viewRequest.getValue("sample id").getText()).isEqualTo("sample text");
}
@Test
- public void testBuilder_emptyTranslations() {
- final TranslationResponse response =
+ public void testBuilder_errorViewTranslationResponse() {
+ final TranslationResponse request =
new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
- .build();
+ .setViewTranslationResponse(0, new ViewTranslationResponse
+ .Builder(new AutofillId(42))
+ .setValue("id2",
+ TranslationResponseValue.forError())
+ .build())
+ .build();
- assertThat(response.getTranslationStatus())
- .isEqualTo(TranslationResponse.TRANSLATION_STATUS_SUCCESS);
- assertThat(response.getTranslations().size()).isEqualTo(0);
+ assertThat(request.getTranslationResponseValues().size()).isEqualTo(0);
+ assertThat(request.getViewTranslationResponses().size()).isEqualTo(1);
+
+ final ViewTranslationResponse viewRequest =
+ request.getViewTranslationResponses().get(0);
+ assertThat(viewRequest.getAutofillId()).isEqualTo(new AutofillId(42));
+ assertThat(viewRequest.getKeys().size()).isEqualTo(1);
+ assertThat(viewRequest.getValue("id2").getStatusCode())
+ .isEqualTo(TranslationResponseValue.STATUS_ERROR);
}
@Test
- public void testBuilder_changeTranslationStatus() {
- final TranslationResponse response =
+ public void testBuilder_validTranslationResponseValue() {
+ final TranslationResponse request =
new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
- .setTranslationStatus(TranslationResponse.TRANSLATION_STATUS_UNKNOWN_ERROR)
- .build();
+ .setTranslationResponseValue(0, mValue)
+ .build();
- assertThat(response.getTranslationStatus())
- .isEqualTo(TranslationResponse.TRANSLATION_STATUS_UNKNOWN_ERROR);
+ assertThat(request.getTranslationResponseValues().size()).isEqualTo(1);
+ assertThat(request.getViewTranslationResponses().size()).isEqualTo(0);
+
+ final TranslationResponseValue value =
+ request.getTranslationResponseValues().get(0);
+ assertThat(value.getText()).isEqualTo("hello");
}
@Test
- public void testBuilder_validAddRequests() {
- final TranslationResponse response =
+ public void testParceledRequest_validTranslationResponseValues() {
+ final TranslationResponse request =
new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
- .addTranslations(mRequest)
- .addTranslations(mRequest2)
- .build();
-
- assertThat(response.getTranslationStatus())
- .isEqualTo(TranslationResponse.TRANSLATION_STATUS_SUCCESS);
- assertThat(response.getTranslations().size()).isEqualTo(2);
-
- final TranslationRequest request1 = response.getTranslations().get(0);
- assertThat(request1.getAutofillId()).isEqualTo(new AutofillId(17));
- assertThat(request1.getTranslationText()).isEqualTo("text1");
-
- final TranslationRequest request2 = response.getTranslations().get(1);
- assertThat(request2.getAutofillId()).isEqualTo(new AutofillId(42));
- assertThat(request2.getTranslationText()).isEqualTo("text2");
- }
-
- @Test
- public void testBuilder_validSetRequests() {
- final ArrayList<TranslationRequest> requests = new ArrayList<>();
- requests.add(mRequest);
- requests.add(mRequest2);
- final TranslationResponse response =
- new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
- .setTranslations(requests)
- .build();
-
- assertThat(response.getTranslationStatus())
- .isEqualTo(TranslationResponse.TRANSLATION_STATUS_SUCCESS);
- assertThat(response.getTranslations().size()).isEqualTo(2);
-
- final TranslationRequest request1 = response.getTranslations().get(0);
- assertThat(request1.getAutofillId()).isEqualTo(new AutofillId(17));
- assertThat(request1.getTranslationText()).isEqualTo("text1");
-
- final TranslationRequest request2 = response.getTranslations().get(1);
- assertThat(request2.getAutofillId()).isEqualTo(new AutofillId(42));
- assertThat(request2.getTranslationText()).isEqualTo("text2");
- }
-
- @Test
- public void testParceledResponse() {
- final TranslationResponse response =
- new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
- .addTranslations(mRequest)
- .build();
+ .setTranslationResponseValue(0, mValue)
+ .setTranslationResponseValue(2,
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("world")
+ .build())
+ .build();
final Parcel parcel = Parcel.obtain();
- response.writeToParcel(parcel, 0);
+ request.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
- final TranslationResponse parceledResponse =
+ final TranslationResponse parceledRequest =
TranslationResponse.CREATOR.createFromParcel(parcel);
- assertThat(response.getTranslationStatus())
- .isEqualTo(TranslationResponse.TRANSLATION_STATUS_SUCCESS);
- assertThat(response.getTranslations().size()).isEqualTo(1);
+ assertThat(parceledRequest.getTranslationResponseValues().size()).isEqualTo(2);
+ assertThat(parceledRequest.getViewTranslationResponses().size()).isEqualTo(0);
- final TranslationRequest request1 = response.getTranslations().get(0);
+ final TranslationResponseValue value1 =
+ parceledRequest.getTranslationResponseValues().get(0);
+ assertThat(value1.getText()).isEqualTo("hello");
+
+ final TranslationResponseValue value2 =
+ parceledRequest.getTranslationResponseValues().get(2);
+ assertThat(value2.getText()).isEqualTo("world");
+ }
+
+ @Test
+ public void testBuilder_mixingAdders() {
+ final TranslationResponse response =
+ new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
+ .setViewTranslationResponse(0, mResponse)
+ .setTranslationResponseValue(0, mValue)
+ .build();
+
+ assertThat(response.getTranslationResponseValues().size()).isEqualTo(1);
+ assertThat(response.getViewTranslationResponses().size()).isEqualTo(1);
+
+ final ViewTranslationResponse viewResponse =
+ response.getViewTranslationResponses().get(0);
+ assertThat(viewResponse.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(viewResponse.getKeys().size()).isEqualTo(1);
+ assertThat(viewResponse.getValue("sample id").getText()).isEqualTo("sample text");
+
+ final TranslationResponseValue value =
+ response.getTranslationResponseValues().get(0);
+ assertThat(value.getText()).isEqualTo("hello");
+ }
+
+ @Test
+ public void testParceledRequest_validViewTranslationResponses() {
+ final TranslationResponse request =
+ new TranslationResponse.Builder(TranslationResponse.TRANSLATION_STATUS_SUCCESS)
+ .setViewTranslationResponse(0, mResponse)
+ .setViewTranslationResponse(2, new ViewTranslationResponse
+ .Builder(new AutofillId(42))
+ .setValue("id2",
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("test")
+ .build())
+ .build())
+ .build();
+
+ final Parcel parcel = Parcel.obtain();
+ request.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ final TranslationResponse parceledRequest =
+ TranslationResponse.CREATOR.createFromParcel(parcel);
+
+ assertThat(parceledRequest.getTranslationResponseValues().size()).isEqualTo(0);
+ assertThat(parceledRequest.getViewTranslationResponses().size()).isEqualTo(2);
+
+ final ViewTranslationResponse request1 =
+ parceledRequest.getViewTranslationResponses().get(0);
assertThat(request1.getAutofillId()).isEqualTo(new AutofillId(17));
- assertThat(request1.getTranslationText()).isEqualTo("text1");
+ assertThat(request1.getKeys().size()).isEqualTo(1);
+ assertThat(request1.getValue("sample id").getText()).isEqualTo("sample text");
+
+ final ViewTranslationResponse request2 =
+ parceledRequest.getViewTranslationResponses().get(2);
+ assertThat(request2.getAutofillId()).isEqualTo(new AutofillId(42));
+ assertThat(request2.getKeys().size()).isEqualTo(1);
+ assertThat(request2.getValue("id2").getText()).isEqualTo("test");
}
}
\ No newline at end of file
diff --git a/tests/translation/src/android/translation/cts/unittests/TranslationValueTest.java b/tests/translation/src/android/translation/cts/unittests/TranslationValueTest.java
new file mode 100644
index 0000000..0144224
--- /dev/null
+++ b/tests/translation/src/android/translation/cts/unittests/TranslationValueTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.translation.cts.unittests;
+
+import static android.view.translation.TranslationResponseValue.STATUS_SUCCESS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.view.translation.TranslationRequestValue;
+import android.view.translation.TranslationResponseValue;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class TranslationValueTest {
+
+ @Test
+ public void testTranslationRequestValue_forText() {
+ final TranslationRequestValue value = TranslationRequestValue.forText("sample text");
+
+ assertThat(value.getText()).isEqualTo("sample text");
+ }
+
+ @Test
+ public void testTranslationResponseValue_validBuilder() {
+ final TranslationResponseValue value = new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("sample text")
+ .build();
+
+ assertThat(value.getStatusCode()).isEqualTo(STATUS_SUCCESS);
+ assertThat(value.getText()).isEqualTo("sample text");
+ }
+
+ @Test
+ public void testTranslationResponseValue_forError() {
+ final TranslationResponseValue value = TranslationResponseValue.forError();
+
+ assertThat(value.getStatusCode()).isEqualTo(TranslationResponseValue.STATUS_ERROR);
+ assertThat(value.getText()).isNull();
+ }
+}
diff --git a/tests/translation/src/android/translation/cts/unittests/ViewTranslationRequestTest.java b/tests/translation/src/android/translation/cts/unittests/ViewTranslationRequestTest.java
new file mode 100644
index 0000000..5a6d46b
--- /dev/null
+++ b/tests/translation/src/android/translation/cts/unittests/ViewTranslationRequestTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.translation.cts.unittests;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.view.autofill.AutofillId;
+import android.view.translation.TranslationRequestValue;
+import android.view.translation.ViewTranslationRequest;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ViewTranslationRequestTest {
+
+ private final AutofillId mAutofillId = new AutofillId(17);
+
+ @Test
+ public void testBuilder_nullAutofillId() {
+ assertThrows(NullPointerException.class, () -> new ViewTranslationRequest.Builder(null));
+ }
+
+ @Test
+ public void testBuilder_validSetText() {
+ final ViewTranslationRequest request = new ViewTranslationRequest.Builder(mAutofillId)
+ .setValue("sample id",
+ TranslationRequestValue.forText("sample text"))
+ .build();
+
+ assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request.getKeys().size()).isEqualTo(1);
+ assertThat(request.getKeys()).containsExactly("sample id");
+ assertThat(request.getValue("sample id").getText()).isEqualTo("sample text");
+ }
+
+ @Test
+ public void testBuilder_setTextTwice() {
+ final ViewTranslationRequest request = new ViewTranslationRequest.Builder(mAutofillId)
+ .setValue("sample id",
+ TranslationRequestValue.forText("sample text"))
+ .setValue("sample id",
+ TranslationRequestValue.forText("text2"))
+ .build();
+
+ assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request.getKeys().size()).isEqualTo(1);
+ assertThat(request.getKeys()).containsExactly("sample id");
+ assertThat(request.getValue("sample id").getText()).isEqualTo("text2");
+ }
+
+ @Test
+ public void testGetValue_invalidId() {
+ final ViewTranslationRequest request = new ViewTranslationRequest.Builder(mAutofillId)
+ .setValue("sample id",
+ TranslationRequestValue.forText("sample text"))
+ .build();
+
+ assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request.getKeys().size()).isEqualTo(1);
+ assertThat(request.getKeys()).containsExactly("sample id");
+ assertThat(request.getValue("sample id").getText()).isEqualTo("sample text");
+
+ assertThrows(IllegalArgumentException.class, () -> request.getValue("something"));
+ assertThrows(NullPointerException.class, () -> request.getValue(null));
+ }
+
+ @Test
+ public void testBuilder_multipleTexts() {
+ final ViewTranslationRequest request = new ViewTranslationRequest.Builder(mAutofillId)
+ .setValue("sample id",
+ TranslationRequestValue.forText("sample text"))
+ .setValue("id2",
+ TranslationRequestValue.forText("text2"))
+ .build();
+
+ assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request.getKeys().size()).isEqualTo(2);
+ assertThat(request.getKeys()).containsExactly("sample id", "id2");
+ assertThat(request.getValue("sample id").getText()).isEqualTo("sample text");
+ assertThat(request.getValue("id2").getText()).isEqualTo("text2");
+ }
+}
diff --git a/tests/translation/src/android/translation/cts/unittests/ViewTranslationResponseTest.java b/tests/translation/src/android/translation/cts/unittests/ViewTranslationResponseTest.java
new file mode 100644
index 0000000..c3a9516
--- /dev/null
+++ b/tests/translation/src/android/translation/cts/unittests/ViewTranslationResponseTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.translation.cts.unittests;
+
+import static android.view.translation.TranslationResponseValue.STATUS_SUCCESS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.view.autofill.AutofillId;
+import android.view.translation.TranslationResponseValue;
+import android.view.translation.ViewTranslationResponse;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ViewTranslationResponseTest {
+
+ private final AutofillId mAutofillId = new AutofillId(17);
+
+ @Test
+ public void testBuilder_nullAutofillId() {
+ assertThrows(NullPointerException.class, () -> new ViewTranslationResponse.Builder(null));
+ }
+
+ @Test
+ public void testBuilder_validAddText() {
+ final ViewTranslationResponse request = new ViewTranslationResponse.Builder(mAutofillId)
+ .setValue("sample id",
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("sample text")
+ .build())
+ .build();
+
+ assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request.getKeys().size()).isEqualTo(1);
+ assertThat(request.getValue("sample id").getText()).isEqualTo("sample text");
+ }
+
+ @Test
+ public void testBuilder_validAddError() {
+ final ViewTranslationResponse request = new ViewTranslationResponse.Builder(mAutofillId)
+ .setValue("sample id", TranslationResponseValue.forError())
+ .build();
+
+ assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request.getKeys().size()).isEqualTo(1);
+ assertThat(request.getValue("sample id").getStatusCode())
+ .isEqualTo(TranslationResponseValue.STATUS_ERROR);
+ }
+
+ @Test
+ public void testGetValue_invalidId() {
+ final ViewTranslationResponse request = new ViewTranslationResponse.Builder(mAutofillId)
+ .setValue("sample id",
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("sample text")
+ .build())
+ .build();
+
+ assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request.getKeys().size()).isEqualTo(1);
+ assertThat(request.getValue("sample id").getText()).isEqualTo("sample text");
+
+ assertThrows(IllegalArgumentException.class, () -> request.getValue("something"));
+ assertThrows(NullPointerException.class, () -> request.getValue(null));
+ }
+
+ @Test
+ public void testBuilder_multipleResults() {
+ final ViewTranslationResponse request = new ViewTranslationResponse.Builder(mAutofillId)
+ .setValue("sample id",
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("sample text")
+ .build())
+ .setValue("id2",
+ new TranslationResponseValue.Builder(STATUS_SUCCESS)
+ .setText("text2")
+ .build())
+ .setValue("id3", TranslationResponseValue.forError())
+ .build();
+
+ assertThat(request.getAutofillId()).isEqualTo(new AutofillId(17));
+ assertThat(request.getKeys().size()).isEqualTo(3);
+ assertThat(request.getValue("sample id").getText()).isEqualTo("sample text");
+ assertThat(request.getValue("id2").getText()).isEqualTo("text2");
+ assertThat(request.getValue("id3").getStatusCode())
+ .isEqualTo(TranslationResponseValue.STATUS_ERROR);
+ }
+}
diff --git a/tests/uwb/src/android/uwb/cts/AngleMeasurementTest.java b/tests/uwb/src/android/uwb/cts/AngleMeasurementTest.java
index c6ddead..f96b798 100644
--- a/tests/uwb/src/android/uwb/cts/AngleMeasurementTest.java
+++ b/tests/uwb/src/android/uwb/cts/AngleMeasurementTest.java
@@ -35,41 +35,52 @@
@RunWith(AndroidJUnit4.class)
public class AngleMeasurementTest {
@Test
- public void testBuilder() {
+ public void testConstructs() {
double radians = 0.1234;
double errorRadians = 0.5678;
double confidence = 0.5;
- AngleMeasurement.Builder builder = new AngleMeasurement.Builder();
- tryBuild(builder, false);
-
- builder.setRadians(radians);
- tryBuild(builder, false);
-
- builder.setErrorRadians(errorRadians);
- tryBuild(builder, false);
-
- builder.setConfidenceLevel(confidence);
- AngleMeasurement measurement = tryBuild(builder, true);
-
+ AngleMeasurement measurement = new AngleMeasurement(radians, errorRadians, confidence);
assertEquals(measurement.getRadians(), radians, 0);
assertEquals(measurement.getErrorRadians(), errorRadians, 0);
assertEquals(measurement.getConfidenceLevel(), confidence, 0);
}
- private AngleMeasurement tryBuild(AngleMeasurement.Builder builder, boolean expectSuccess) {
- AngleMeasurement measurement = null;
+ @Test
+ public void testInvalidRadians() {
+ double radians = Math.PI + 0.01;
+ double errorRadians = 0.5678;
+ double confidence = 0.5;
+
+ constructExpectFailure(radians, errorRadians, confidence);
+ constructExpectFailure(-radians, errorRadians, confidence);
+ }
+
+ @Test
+ public void testInvalidErrorRadians() {
+ double radians = 0.1234;
+ double confidence = 0.5;
+
+ constructExpectFailure(radians, -0.01, confidence);
+ constructExpectFailure(-radians, Math.PI + 0.01, confidence);
+ }
+
+ @Test
+ public void testInvalidConfidence() {
+ double radians = 0.1234;
+ double errorRadians = 0.5678;
+
+ constructExpectFailure(radians, errorRadians, -0.01);
+ constructExpectFailure(radians, errorRadians, 1.01);
+ }
+
+ private void constructExpectFailure(double radians, double errorRadians, double confidence) {
try {
- measurement = builder.build();
- if (!expectSuccess) {
- fail("Expected AngleMeasurement.Builder.build() to fail, but it succeeded");
- }
- } catch (IllegalStateException e) {
- if (expectSuccess) {
- fail("Expected AngleMeasurement.Builder.build() to succeed, but it failed");
- }
+ new AngleMeasurement(radians, errorRadians, confidence);
+ fail();
+ } catch (IllegalArgumentException e) {
+ // Expected
}
- return measurement;
}
@Test
diff --git a/tests/uwb/src/android/uwb/cts/AngleOfArrivalMeasurementTest.java b/tests/uwb/src/android/uwb/cts/AngleOfArrivalMeasurementTest.java
index 16dc4c2..085ce2e 100644
--- a/tests/uwb/src/android/uwb/cts/AngleOfArrivalMeasurementTest.java
+++ b/tests/uwb/src/android/uwb/cts/AngleOfArrivalMeasurementTest.java
@@ -41,27 +41,15 @@
AngleMeasurement azimuth = UwbTestUtils.getAngleMeasurement();
AngleMeasurement altitude = UwbTestUtils.getAngleMeasurement();
- AngleOfArrivalMeasurement.Builder builder = new AngleOfArrivalMeasurement.Builder();
- tryBuild(builder, false);
-
+ AngleOfArrivalMeasurement.Builder builder = new AngleOfArrivalMeasurement.Builder(azimuth);
builder.setAltitude(altitude);
- tryBuild(builder, false);
- builder.setAzimuth(azimuth);
AngleOfArrivalMeasurement measurement = tryBuild(builder, true);
assertEquals(azimuth, measurement.getAzimuth());
assertEquals(altitude, measurement.getAltitude());
}
- private AngleMeasurement getAngleMeasurement(double radian, double error, double confidence) {
- return new AngleMeasurement.Builder()
- .setRadians(radian)
- .setErrorRadians(error)
- .setConfidenceLevel(confidence)
- .build();
- }
-
private AngleOfArrivalMeasurement tryBuild(AngleOfArrivalMeasurement.Builder builder,
boolean expectSuccess) {
AngleOfArrivalMeasurement measurement = null;
diff --git a/tests/uwb/src/android/uwb/cts/UwbTestUtils.java b/tests/uwb/src/android/uwb/cts/UwbTestUtils.java
index b5d8e1b..3790b52 100644
--- a/tests/uwb/src/android/uwb/cts/UwbTestUtils.java
+++ b/tests/uwb/src/android/uwb/cts/UwbTestUtils.java
@@ -39,17 +39,15 @@
}
public static AngleMeasurement getAngleMeasurement() {
- return new AngleMeasurement.Builder()
- .setRadians(getDoubleInRange(-Math.PI, Math.PI))
- .setErrorRadians(getDoubleInRange(0, Math.PI))
- .setConfidenceLevel(getDoubleInRange(0, 1))
- .build();
+ return new AngleMeasurement(
+ getDoubleInRange(-Math.PI, Math.PI),
+ getDoubleInRange(0, Math.PI),
+ getDoubleInRange(0, 1));
}
public static AngleOfArrivalMeasurement getAngleOfArrivalMeasurement() {
- return new AngleOfArrivalMeasurement.Builder()
+ return new AngleOfArrivalMeasurement.Builder(getAngleMeasurement())
.setAltitude(getAngleMeasurement())
- .setAzimuth(getAngleMeasurement())
.build();
}
diff --git a/tools/cts-tradefed/res/config/cts-on-aosp-exclude.xml b/tools/cts-tradefed/res/config/cts-on-aosp-exclude.xml
index 3fff6b9..a9d2ac5 100644
--- a/tools/cts-tradefed/res/config/cts-on-aosp-exclude.xml
+++ b/tools/cts-tradefed/res/config/cts-on-aosp-exclude.xml
@@ -253,4 +253,61 @@
<!-- b/173662175: CtsStatsdHostTestCases due to insufficient processes running -->
<option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.validation.ProcStatsValidationTests#testProcessStatePssValue"/>
+
+ <!-- b/173560279: CtsAndroidAppTestCases -->
+ <option name="compatibility:exclude-filter" value="CtsAndroidAppTestCases android.app.cts.ApplyOverrideConfigurationTest#testOverriddenConfigurationIsPassedIntoCallback" />
+
+ <!-- b/173560279: CtsWidgetTestCases -->
+ <option name="compatibility:exclude-filter" value="CtsWidgetTestCases android.widget.cts.PopupWindowTest#testClipToScreenClipsToInsets" />
+
+ <!-- b/173560279: CtsWindowManagerDeviceTestCases -->
+ <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testAppOrientationRequestConfigChanges" />
+ <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.KeyguardTests#testNoTransientConfigurationWhenShowWhenLockedRequestsOrientation" />
+
+ <!-- b/173560279: CtsDpiTestCases -->
+ <option name="compatibility:exclude-filter" value="CtsDpiTestCases android.dpi.cts.ConfigurationScreenLayoutTest#testScreenLayout" />
+
+ <!-- b/173560279, b/176457563#comment6: CtsCameraTestCases -->
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.cts.CameraTest#testPreviewCallbackWithPicture" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.CaptureRequestTest#testColorCorrectionControl" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.CaptureRequestTest#testFocusDistanceControl" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.CaptureRequestTest#testAwbModeAndLock" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.CaptureRequestTest#testDigitalZoomPreviewCombinations" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.CaptureRequestTest#testFlashControl" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.CaptureRequestTest#testEffectModes" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.CaptureRequestTest#testFaceDetection" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testTextureImageWriterReaderOperation" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testTextureViewPreviewWithImageReader" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testTextureViewPreview" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testSharedSurfaceSwitch"/>
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testDualTextureViewAndImageReaderPreview" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testDualCameraPreview"/>
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testSharedSurfaces" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testSharedSurfaceBasic" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testSharedSurfaceLimit" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testDualTextureViewPreview" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.MultiViewTest#testSharedSurfaceImageReaderSwitch" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.StillCaptureTest#testFullRawZSLCapture" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.StillCaptureTest#testFullRawCapture" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.StillCaptureTest#testJpegExif" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.StillCaptureTest#testTakePicture" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.StillCaptureTest#testAfRegions" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.RobustnessTest#testVerifyReprocessMandatoryOutputCombinationTables" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.SurfaceViewPreviewTest#testPreparePerformance" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.BurstCaptureTest#testYuvBurst" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceSimplePreview" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceLogicalPhysicalStreaming" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDevicePreviewWithSessionParameters" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceSessionOpenAndClose" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceLogicalPhysicalSettings" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceSharedOutputUpdate" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceSimplePreview" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceLogicalPhysicalStreaming" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDevicePreviewWithSessionParameters" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceSessionOpenAndClose" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceLogicalPhysicalSettings" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeCameraDeviceTest#testCameraDeviceSharedOutputUpdate" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeStillCaptureTest#testStillCapture" />
+ <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.NativeStillCaptureTest#testStillCapture" />
+
</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml b/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml
index 930bc4d..398c221 100644
--- a/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml
+++ b/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml
@@ -53,4 +53,7 @@
<!-- No SettingsIntelligence -->
<option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testSettingsSearchIntent" />
+ <!-- No AccessibilityService -->
+ <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts" />
+
</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-sim-include.xml b/tools/cts-tradefed/res/config/cts-sim-include.xml
index 045e331..656c008 100644
--- a/tools/cts-tradefed/res/config/cts-sim-include.xml
+++ b/tools/cts-tradefed/res/config/cts-sim-include.xml
@@ -30,6 +30,7 @@
<option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases1" />
<option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases2" />
<option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases3" />
+ <option name="compatibility:include-filter" value="CtsSimPhonebookProviderTestCases" />
<option name="compatibility:include-filter" value="CtsSimRestrictedApisTestCases" />
<option name="compatibility:include-filter" value="CtsStatsdHostTestCases" />
<option name="compatibility:include-filter" value="CtsStatsdAtomHostTestCases" />
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1.zip b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1.zip
deleted file mode 100644
index e2c98c4..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1.zip
+++ /dev/null
Binary files differ
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0009ed57-c961-41b7-bcbe-d71e6f0abac1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0009ed57-c961-41b7-bcbe-d71e6f0abac1
deleted file mode 100644
index 8b9634e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0009ed57-c961-41b7-bcbe-d71e6f0abac1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0009ed57-c961-41b7-bcbe-d71e6f0abac1","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Sound settings\",\"actionId\":\"0009ed57-c961-41b7-bcbe-d71e6f0abac1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Sound setting\",\"actionId\":\"23a1e68d-3903-428f-aae6-57d4553984ef\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Sound & vibration\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"17f79eaf-9011-48dd-86c1-d497531ac24b\",\"displayText\":\"Sound\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"37a02b37-a215-40c6-b025-c062e1d512de\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"69cb8198-d26e-441c-9172-b0612c357b94\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":617.6666666666666,\"x2\":47.666666666666664,\"y2\":650.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":614.0,\"x2\":66.0,\"y2\":654.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"1d91e44d-dfb7-4a30-b541-290c40a54ec6\",\"displayText\":\"Sound\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"597f30ac-8029-4c73-a015-af8425ea68cd\",\"displayText\":\"Sound\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Sound\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":615.6666666666666,\"x2\":108.33333333333333,\"y2\":635.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.333333333333343,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Sound\"},{\"uuid\":\"5748d25e-63cc-41ec-b416-d27ba6bb73f0\",\"displayText\":\"Volume, vibration, Do Not Disturb\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Volume, vibration, Do Not Disturb\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":635.3333333333334,\"x2\":257.3333333333333,\"y2\":653.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Volume, vibration, Do Not Disturb\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":601.0,\"x2\":345.3333333333333,\"y2\":667.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Sound\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":601.0,\"x2\":360.0,\"y2\":667.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":90.5,\"y\":625.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":89.5,\"y\":8.833333333333258,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"597f30ac-8029-4c73-a015-af8425ea68cd\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Sound & vibration\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":55.0,\"y1\":612.0,\"x2\":126.0,\"y2\":639.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Sound\",\"actionId\":\"dcb0c971-2bbe-48e8-9d8d-95abbf657d88\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Sound\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"23a1e68d-3903-428f-aae6-57d4553984ef\",\"dcb0c971-2bbe-48e8-9d8d-95abbf657d88\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Sound settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.997000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/008221ef-2f19-4071-9311-cfbe47857bb3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/008221ef-2f19-4071-9311-cfbe47857bb3
deleted file mode 100644
index 81789e5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/008221ef-2f19-4071-9311-cfbe47857bb3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"008221ef-2f19-4071-9311-cfbe47857bb3","details":"{\"type\":\"CompoundAction\",\"name\":\"If \\\"Control bubbles anytime\\\" tips appear, dismiss it\",\"actionId\":\"008221ef-2f19-4071-9311-cfbe47857bb3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"if \\\"Control bubbles anytime\\\" tip pop up, dismiss it\",\"actionId\":\"5990818c-536e-44f7-bd44-2e99e83c975d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Control bubbles anytime\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"Click bubble again\",\"actionId\":\"c7a1caf4-82de-48c1-9162-fe0a21689e4e\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/bubble_view\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"5990818c-536e-44f7-bd44-2e99e83c975d\",\"c7a1caf4-82de-48c1-9162-fe0a21689e4e\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"If \"Control bubbles anytime\" tips appear, dismiss it","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.227000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/015882d1-9ce9-4b67-a7e3-925ee0798fe4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/015882d1-9ce9-4b67-a7e3-925ee0798fe4
deleted file mode 100644
index 6236b31..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/015882d1-9ce9-4b67-a7e3-925ee0798fe4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"015882d1-9ce9-4b67-a7e3-925ee0798fe4","details":"{\"type\":\"CompoundAction\",\"name\":\"01_Profile owner installed\",\"actionId\":\"015882d1-9ce9-4b67-a7e3-925ee0798fe4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to BYOD Managed Provisioning\",\"actionId\":\"ac254dfd-734d-4c82-ac60-4ec0ee152d8f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"BYOD Managed Provisioning\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0e6fc5f7-86a4-4302-b0c0-a08206bead33\",\"displayText\":\"BYOD Managed Provisioning\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"BYOD Managed Provisioning\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":228.66666666666666,\"x2\":351.3333333333333,\"y2\":270.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":120.5,\"y\":251.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":59.5,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"0e6fc5f7-86a4-4302-b0c0-a08206bead33\",\"firstText\":\"BYOD Managed Provisioning\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"BYOD Managed Provisioning\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":237.0,\"x2\":233.0,\"y2\":265.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, BYOD Managed Provisioning\",\"actionId\":\"20bd4c5a-d33c-4821-8165-ca5fbda39250\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"BYOD Managed Provisioning\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/prepare_test_button\",\"actionId\":\"9d1266ac-77ec-4c5e-82df-784a40c2eef5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/prepare_test_button\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Delete if needed\",\"actionId\":\"c88d87ec-dd69-4176-ae52-49b181e93f78\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/button1\"}]},\"clickAfterValidation\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Accept & continue\",\"actionId\":\"5ddac9cf-cdf4-45b6-a910-f496e3cc32ce\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Accept & continue\"},{\"type\":\"WaitAction\",\"name\":\"WAIT for 20 secs\",\"actionId\":\"aef30264-e1ea-44cd-a73e-cffe95a1a1b5\",\"actionType\":\"WAIT_ACTION\",\"actionDescription\":\"Setting up...\",\"delayAfterActionMs\":20000,\"createdBy\":\"pololee\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"f7c6ebab-6a5d-4ed2-b320-36f702e83770\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"}],\"childrenIdList\":[\"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e\",\"b531da69-1e61-4e75-a6b1-7e005df80c7b\",\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"ac254dfd-734d-4c82-ac60-4ec0ee152d8f\",\"20bd4c5a-d33c-4821-8165-ca5fbda39250\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"9d1266ac-77ec-4c5e-82df-784a40c2eef5\",\"c88d87ec-dd69-4176-ae52-49b181e93f78\",\"5ddac9cf-cdf4-45b6-a910-f496e3cc32ce\",\"aef30264-e1ea-44cd-a73e-cffe95a1a1b5\",\"f7c6ebab-6a5d-4ed2-b320-36f702e83770\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"01_Profile owner installed","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.291000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/020685b0-8828-4ca8-be07-4146718f24fe b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/020685b0-8828-4ca8-be07-4146718f24fe
deleted file mode 100644
index 23104ea..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/020685b0-8828-4ca8-be07-4146718f24fe
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"020685b0-8828-4ca8-be07-4146718f24fe","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Tile Service Test\",\"actionId\":\"020685b0-8828-4ca8-be07-4146718f24fe\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Tile Service Test\",\"actionId\":\"f8b7e95e-c11d-46af-84b4-a99b0955c448\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Tile Service Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"94ab95c2-dc2a-407a-8367-b0440571f967\",\"displayText\":\"Tile Service Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Tile Service Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":687.3333333333334,\"x2\":351.3333333333333,\"y2\":729.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":76.5,\"y\":708.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":103.5,\"y\":-0.16666666666662877,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"94ab95c2-dc2a-407a-8367-b0440571f967\",\"firstText\":\"Tile Service Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Tile Service Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":142.0,\"y1\":716.0,\"x2\":11.0,\"y2\":701.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Tile Service Test\",\"actionId\":\"c89a02dd-73f1-4813-b048-05ac8374e670\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Tile Service Test\"},{\"type\":\"WaitAction\",\"name\":\"WAIT for 10 secs\",\"actionId\":\"f852c3fc-ca3a-4f55-8dcc-0b6e9f8e47c7\",\"actionType\":\"WAIT_ACTION\",\"actionDescription\":\"Wait for Tile Service enabled\",\"delayAfterActionMs\":10000,\"createdBy\":\"pololee\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Pass after checking Tile Service for CTS Verifier is not visible in any page\",\"actionId\":\"c65cebf0-7eb0-4bf0-926a-8333469498ca\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/tiles_action_pass\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/edit\",\"actionId\":\"3deb30a8-0785-40ed-8151-51e63682e3fc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/edit\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Tile Service for CTS Verifier\",\"actionId\":\"3a461072-f9ea-49d9-b44a-490b7ce21493\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Tile Service for CTS Verifier\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"344adff8-1d24-4108-aea4-9d78b6aff2cc\",\"displayText\":\"Tile Service for CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"35a7fb70-4fc5-45af-ae47-af78205cdd7c\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e4afaa44-b3ed-4b9e-9435-cee15e46a927\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"02e19e6d-3d0a-4d30-8a82-28de1d4f4b41\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":158.66666666666666,\"y1\":620.3333333333334,\"x2\":200.66666666666666,\"y2\":641.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.view.ViewGroup\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":158.66666666666666,\"y1\":620.3333333333334,\"x2\":200.66666666666666,\"y2\":641.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"ff7efc0b-0578-43a4-a6cb-96b5f92a5f1a\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":160.33333333333334,\"y1\":611.6666666666666,\"x2\":199.0,\"y2\":650.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":158.66666666666666,\"y1\":610.0,\"x2\":200.66666666666666,\"y2\":652.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"ef1f1cc4-08e2-45e6-9290-72d53dcd6452\",\"displayText\":\"Tile Service for CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d5d9a4ce-eb72-4a9d-9f5f-2330a29fad6e\",\"displayText\":\"Tile Service for CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"83b3d4f6-f233-494f-9c22-75c225d149ce\",\"displayText\":\"Tile Service for CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/tile_label\",\"text\":\"Tile Service for CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":126.33333333333333,\"y1\":662.6666666666666,\"x2\":233.33333333333334,\"y2\":677.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.6666666666666572,\"y\":-0.16666666666674246,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Tile Service for CTS Verifier\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/label_group\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":126.33333333333333,\"y1\":662.6666666666666,\"x2\":233.33333333333334,\"y2\":677.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Tile Service for CTS Verifier\"},{\"uuid\":\"6cf7d156-e6c8-4f42-93f3-637c3c2a0d31\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/app_label\",\"text\":\"CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":126.33333333333333,\"y1\":677.0,\"x2\":233.33333333333334,\"y2\":691.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.Button\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":126.33333333333333,\"y1\":652.0,\"x2\":233.33333333333334,\"y2\":694.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Tile Service for CTS Verifier\"}],\"className\":\"android.widget.Button\",\"contentDesc\":\"Tile Service for CTS Verifier. Double tap to add.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":126.33333333333333,\"y1\":610.0,\"x2\":233.33333333333334,\"y2\":702.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":181.5,\"y\":670.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.6666666666666572,\"y\":-13.666666666666742,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"83b3d4f6-f233-494f-9c22-75c225d149ce\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Tile Service for CTS Verifier\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":128.0,\"y1\":663.0,\"x2\":235.0,\"y2\":677.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"PythonScriptAction\",\"name\":\"Drag Tile Service... to add\",\"actionId\":\"b1d9c4c3-d73e-4b9d-a4c1-2bebc83d5c43\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.ui_object import UiObject\\nfrom python_uiautomator.ui_selector import UiSelector\\nfrom python_uiautomator.device import Device\\n\\n\\nd= Device.create_device_by_slot(0)\\n \\npoint1 = UiObject(UiSelector().text(\\\"Tile Service for CTS Verifier\\\"), d).get_center_pos()\\npoint2 = UiObject(UiSelector().text(\\\"Edit\\\"), d).get_center_pos()\\n\\nselectors = [point1, point2]\\n\\nd.drag(selectors)\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"363320d9-7173-4138-956b-1e155e2c1e6c\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Pass after checking Tile Service for CTS Verifier is available to be added\",\"actionId\":\"9884e0d2-f51f-4a6d-b707-9f9fef153f53\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/tiles_action_pass\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"f8b7e95e-c11d-46af-84b4-a99b0955c448\",\"c89a02dd-73f1-4813-b048-05ac8374e670\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"f852c3fc-ca3a-4f55-8dcc-0b6e9f8e47c7\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"6f268fc7-772a-426d-ab18-4e9b2eefa03e\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"c65cebf0-7eb0-4bf0-926a-8333469498ca\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"3deb30a8-0785-40ed-8151-51e63682e3fc\",\"3a461072-f9ea-49d9-b44a-490b7ce21493\",\"b1d9c4c3-d73e-4b9d-a4c1-2bebc83d5c43\",\"363320d9-7173-4138-956b-1e155e2c1e6c\",\"5f45dc78-6a4a-4b87-b860-01e0c4b7a04d\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"9884e0d2-f51f-4a6d-b707-9f9fef153f53\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Tile Service Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.329000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/02368e5e-0086-4c12-9a05-55c25015d488 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/02368e5e-0086-4c12-9a05-55c25015d488
deleted file mode 100644
index 91d71c0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/02368e5e-0086-4c12-9a05-55c25015d488
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"02368e5e-0086-4c12-9a05-55c25015d488","details":"{\"type\":\"CompoundAction\",\"name\":\"15-24-Set lock screen info\",\"actionId\":\"02368e5e-0086-4c12-9a05-55c25015d488\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Set lock screen info\",\"actionId\":\"80c8fb71-bd50-48ab-bfcd-1792a1e34793\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set lock screen info\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"272081a0-93b4-4444-8c9b-d142f7e84a65\",\"displayText\":\"Set lock screen info\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Set lock screen info\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":362.3333333333333,\"x2\":360.0,\"y2\":406.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":75.0,\"y\":383.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":105.0,\"y\":0.8333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"272081a0-93b4-4444-8c9b-d142f7e84a65\",\"firstText\":\"Set lock screen info\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set lock screen info\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":371.0,\"x2\":146.0,\"y2\":396.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set lock screen info\",\"actionId\":\"d52d8823-8803-457a-a1ba-2974ea2c4f72\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set lock screen info\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/edit_text_widget\",\"actionId\":\"282a858e-948d-4187-a99d-52d47f5ac2c7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/edit_text_widget\"},{\"type\":\"InputAction\",\"name\":\"INPUT text \\\"Lock screen info test\\\"\",\"actionId\":\"aabbcc19-f0eb-4fbf-83d5-bddd74c5f406\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"Lock screen info test\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/update_button\",\"actionId\":\"85080104-f56b-4566-a51d-f0e0bdf5b5a7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/update_button\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Lock screen\",\"actionId\":\"3cfeae51-ebf5-4918-9bdd-52c5110809ac\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Lock screen\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f47ace68-a70d-4ce3-b512-b84ace5bce5c\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1da560f5-6ca8-40d5-8d8b-3e0e3325446f\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"663a4369-87f4-48fb-908b-a26adcea5708\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Lock screen\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":557.3333333333334,\"x2\":146.0,\"y2\":577.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.0,\"y\":0.16666666666674246,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Lock screen\"},{\"uuid\":\"2f7bfd8f-6909-44cd-83d7-c43e46d1eebd\",\"displayText\":\"Show all notification content\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Show all notification content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":577.0,\"x2\":230.0,\"y2\":594.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Show all notification content\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":542.6666666666666,\"x2\":345.3333333333333,\"y2\":609.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Lock screen\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":542.6666666666666,\"x2\":360.0,\"y2\":609.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":112.0,\"y\":567.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":68.0,\"y\":9.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"663a4369-87f4-48fb-908b-a26adcea5708\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Lock screen\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":67.0,\"y1\":559.0,\"x2\":157.0,\"y2\":575.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Lock screen\",\"actionId\":\"ba6d6706-3ff4-48d2-a9ab-21f428cfff03\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Lock screen\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Add text on lock screen\",\"actionId\":\"8e2e0396-227e-4188-96f6-e5a084ef4cb6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Add text on lock screen\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"80c8fb71-bd50-48ab-bfcd-1792a1e34793\",\"d52d8823-8803-457a-a1ba-2974ea2c4f72\",\"282a858e-948d-4187-a99d-52d47f5ac2c7\",\"aabbcc19-f0eb-4fbf-83d5-bddd74c5f406\",\"85080104-f56b-4566-a51d-f0e0bdf5b5a7\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"3cfeae51-ebf5-4918-9bdd-52c5110809ac\",\"ba6d6706-3ff4-48d2-a9ab-21f428cfff03\",\"8e2e0396-227e-4188-96f6-e5a084ef4cb6\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-24-Set lock screen info","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.155000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/023dd500-a856-4a6e-a2bb-a94d616de615 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/023dd500-a856-4a6e-a2bb-a94d616de615
deleted file mode 100644
index 90f42f5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/023dd500-a856-4a6e-a2bb-a94d616de615
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"023dd500-a856-4a6e-a2bb-a94d616de615","details":"{\"type\":\"CompoundAction\",\"name\":\"Close CTS-V\",\"actionId\":\"023dd500-a856-4a6e-a2bb-a94d616de615\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Close CTS-V\",\"actionId\":\"a9bcf8db-3f01-486f-980d-368d1a784731\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":100,\"createdBy\":\"pololee\",\"commandLine\":\"shell am force-stop com.android.cts.verifier\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"a9bcf8db-3f01-486f-980d-368d1a784731\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Close CTS-V","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.989000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/02e61821-abdc-499f-8cfb-82c7912a7e1f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/02e61821-abdc-499f-8cfb-82c7912a7e1f
deleted file mode 100644
index 49eeb51..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/02e61821-abdc-499f-8cfb-82c7912a7e1f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"02e61821-abdc-499f-8cfb-82c7912a7e1f","details":"{\"type\":\"CompoundAction\",\"name\":\"Dismiss instructions\",\"actionId\":\"02e61821-abdc-499f-8cfb-82c7912a7e1f\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-If \\\"OK\\\" button exists, Click to dismiss.\",\"actionId\":\"347bbd5f-d15a-48e2-9366-68c841d1bf2f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/button1\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"347bbd5f-d15a-48e2-9366-68c841d1bf2f\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Dismiss instructions","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.321000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/034d5968-a791-4164-8b00-450ddadb3db1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/034d5968-a791-4164-8b00-450ddadb3db1
deleted file mode 100644
index 0e4afe5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/034d5968-a791-4164-8b00-450ddadb3db1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"034d5968-a791-4164-8b00-450ddadb3db1","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Grant\\\" button\",\"actionId\":\"034d5968-a791-4164-8b00-450ddadb3db1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Grant\",\"actionId\":\"25bf5c59-353d-4211-af07-4f54bf2070e9\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Grant\"}],\"childrenIdList\":[\"25bf5c59-353d-4211-af07-4f54bf2070e9\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Grant\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.175000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/03d55006-a23c-4f22-a56d-2d8de633cf3c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/03d55006-a23c-4f22-a56d-2d8de633cf3c
deleted file mode 100644
index e94a456..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/03d55006-a23c-4f22-a56d-2d8de633cf3c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"03d55006-a23c-4f22-a56d-2d8de633cf3c","details":"{\"type\":\"CompoundAction\",\"name\":\"17-05-Disallow remove user\",\"actionId\":\"03d55006-a23c-4f22-a56d-2d8de633cf3c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow remove user\",\"actionId\":\"20b3f7d5-2c70-4190-adc4-36531e3a73a5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow remove user\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, More options\",\"actionId\":\"48ab6ab5-8fc2-4988-8b66-7d0c47764bf8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"More options\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Delete managed user from this device\\\" option in the overflow menu is disabled\",\"actionId\":\"1a51c322-dd9e-46e3-bc14-dfdf9e9253c1\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Delete managed user from this device\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Delete managed user from this device\",\"actionId\":\"922d1d25-9794-4875-bf41-c34bf5174a6f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Delete managed user from this device\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"4d06c29e-4368-4ad8-955e-521405138f79\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ce49b7d4-4581-495c-8448-01b68587d691\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"20b3f7d5-2c70-4190-adc4-36531e3a73a5\",\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"48ab6ab5-8fc2-4988-8b66-7d0c47764bf8\",\"1a51c322-dd9e-46e3-bc14-dfdf9e9253c1\",\"922d1d25-9794-4875-bf41-c34bf5174a6f\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"4d06c29e-4368-4ad8-955e-521405138f79\",\"ce49b7d4-4581-495c-8448-01b68587d691\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"17-05-Disallow remove user","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.200000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/03e19599-15d9-4cff-acc4-88b977853f25 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/03e19599-15d9-4cff-acc4-88b977853f25
deleted file mode 100644
index b3bbf61..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/03e19599-15d9-4cff-acc4-88b977853f25
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"03e19599-15d9-4cff-acc4-88b977853f25","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if screen back to Managed device info tests page\",\"actionId\":\"03e19599-15d9-4cff-acc4-88b977853f25\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if screen in Managed device info tests page\",\"actionId\":\"d9c81007-11d3-4591-bd29-786bb1711fa9\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Managed device info tests\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"9e03a57a-8bac-4a91-8d4d-f58ce7a8bdc4\",\"displayText\":\"Managed device info tests\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f9466701-7fa2-4ec1-a8e0-916cdffc5e8e\",\"displayText\":\"Navigate up\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageButton\",\"contentDesc\":\"Navigate up\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":24.5,\"x2\":49.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Navigate up\"},{\"uuid\":\"2ca57014-bd4f-46e5-9675-79d9758a3090\",\"displayText\":\"Managed device info tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Managed device info tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":37.25,\"x2\":276.75,\"y2\":60.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":4.875,\"y\":-2.125,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Managed device info tests\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/action_bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":24.5,\"x2\":360.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":165.0,\"y\":51.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":15.0,\"y\":-2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"2ca57014-bd4f-46e5-9675-79d9758a3090\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Managed device info tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":48.0,\"y1\":36.0,\"x2\":282.0,\"y2\":66.0}},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Managed device info tests\",\"actionId\":\"d765dbee-bf76-4874-8343-e6b8f63cf4e0\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Managed device info tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8da0fb49-86e3-4835-aff5-0b44386d846b\",\"displayText\":\"Logout\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Logout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":416.0,\"x2\":351.25,\"y2\":458.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":101.5,\"y\":423.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":78.5,\"y\":14.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"8da0fb49-86e3-4835-aff5-0b44386d846b\",\"firstText\":\"Logout\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Managed device info tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":405.0,\"x2\":194.0,\"y2\":441.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Managed device info tests\",\"actionId\":\"17a5b17f-db2e-43e9-aeed-b9533f6212d8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Managed device info tests\"}],\"childrenIdList\":[\"d9c81007-11d3-4591-bd29-786bb1711fa9\",\"b50df53e-f816-49d2-b907-500f3f4f3b5a\",\"b36ee844-6807-46a4-9073-3d5c83f730fd\",\"d765dbee-bf76-4874-8343-e6b8f63cf4e0\",\"17a5b17f-db2e-43e9-aeed-b9533f6212d8\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if screen back to Managed device info tests page","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.168000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/04292ddc-e958-49b5-8fd7-a4dd0cf8ff43 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/04292ddc-e958-49b5-8fd7-a4dd0cf8ff43
deleted file mode 100644
index a096fa2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/04292ddc-e958-49b5-8fd7-a4dd0cf8ff43
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"04292ddc-e958-49b5-8fd7-a4dd0cf8ff43","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch (VR) Settings/ VR mode activity\",\"actionId\":\"04292ddc-e958-49b5-8fd7-a4dd0cf8ff43\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - Launch Settings (VR)\",\"actionId\":\"5334bba0-3a3c-476f-893b-05c886335d05\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/vr_action_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"5334bba0-3a3c-476f-893b-05c886335d05\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch (VR) Settings/ VR mode activity","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.286000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/048dadc7-e9b8-4451-b111-a128df8d095b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/048dadc7-e9b8-4451-b111-a128df8d095b
deleted file mode 100644
index 377bf9e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/048dadc7-e9b8-4451-b111-a128df8d095b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"048dadc7-e9b8-4451-b111-a128df8d095b","details":"{\"type\":\"CompoundAction\",\"name\":\"21-Disallow remove user\",\"actionId\":\"048dadc7-e9b8-4451-b111-a128df8d095b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow remove user\",\"actionId\":\"36f3d999-5020-499b-9591-6b7ba32af914\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow remove user\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"bd638882-3332-4dfc-8713-9ba3c2ab3b58\",\"displayText\":\"Disallow remove user\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow remove user\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":502.0,\"x2\":351.25,\"y2\":544.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":80.0,\"y\":526.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":100.0,\"y\":-3.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"bd638882-3332-4dfc-8713-9ba3c2ab3b58\",\"firstText\":\"Disallow remove user\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow remove user\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":14.0,\"y1\":514.0,\"x2\":146.0,\"y2\":538.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow remove user\",\"actionId\":\"d93da041-ac93-4c0e-b5a1-3817c791ba64\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow remove user\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Create uninitialized user\",\"actionId\":\"a33932c6-168d-49b2-8313-8c0c86bd7930\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Create uninitialized user\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, managed user\",\"actionId\":\"bc6973bb-262d-4379-a5b1-a69b0893ce8f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"managed user\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if \\\"Delete User\\\" is disabled\",\"actionId\":\"324b12fb-6ad6-4c90-8804-c2338f818898\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Delete user\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Delete user\",\"actionId\":\"8fdf6e41-88aa-498b-80a4-a65d0785c983\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Delete user\"}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"36f3d999-5020-499b-9591-6b7ba32af914\",\"d93da041-ac93-4c0e-b5a1-3817c791ba64\",\"a33932c6-168d-49b2-8313-8c0c86bd7930\",\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"bc6973bb-262d-4379-a5b1-a69b0893ce8f\",\"324b12fb-6ad6-4c90-8804-c2338f818898\",\"8fdf6e41-88aa-498b-80a4-a65d0785c983\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"21-Disallow remove user","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.209000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/050ca8c7-6332-41f5-af2b-8a02b680bf14 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/050ca8c7-6332-41f5-af2b-8a02b680bf14
deleted file mode 100644
index 4bac33d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/050ca8c7-6332-41f5-af2b-8a02b680bf14
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"050ca8c7-6332-41f5-af2b-8a02b680bf14","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn Location off\",\"actionId\":\"050ca8c7-6332-41f5-af2b-8a02b680bf14\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Toggle Location switch off\",\"actionId\":\"edaf4f8c-7986-4de5-8f58-c93c999f8d86\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"location\\\", MatchOption.CONTAINS).right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist():\\n d.text(\\\"location\\\", MatchOption.CONTAINS).right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"31d97492-1de9-41be-8213-c67eb06406b1\",\"edaf4f8c-7986-4de5-8f58-c93c999f8d86\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn Location off","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.273000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/05139d97-d39c-43cd-8ad4-a276c3fcf5a6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/05139d97-d39c-43cd-8ad4-a276c3fcf5a6
deleted file mode 100644
index 2e9492b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/05139d97-d39c-43cd-8ad4-a276c3fcf5a6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"05139d97-d39c-43cd-8ad4-a276c3fcf5a6","details":"{\"type\":\"CompoundAction\",\"name\":\"Select the different ringtone (downward else upward)\",\"actionId\":\"05139d97-d39c-43cd-8ad4-a276c3fcf5a6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Select the different ringtone (downward else upward)\",\"actionId\":\"c28c7dd1-c4e0-4379-9f1d-620fd21f0799\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.resource_id(\\\"com.google.android.soundpicker:id/radio_button\\\").attributes(\\\"checked\\\", \\\"true\\\").down().resource_id(\\\"com.google.android.soundpicker:id/radio_button\\\").verify_exist():\\n d.resource_id(\\\"com.google.android.soundpicker:id/radio_button\\\").attributes(\\\"checked\\\", \\\"true\\\").down().resource_id(\\\"com.google.android.soundpicker:id/radio_button\\\").click()\\nelse:\\n d.resource_id(\\\"com.google.android.soundpicker:id/radio_button\\\").attributes(\\\"checked\\\", \\\"true\\\").up().resource_id(\\\"com.google.android.soundpicker:id/radio_button\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/save\",\"actionId\":\"16dc79a3-fac6-429c-94e2-553bb7eb23f2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.soundpicker:id/save\"}],\"childrenIdList\":[\"c28c7dd1-c4e0-4379-9f1d-620fd21f0799\",\"16dc79a3-fac6-429c-94e2-553bb7eb23f2\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Select the different ringtone (downward else upward)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.289000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06810fdd-824c-400e-bbff-edf98e42d3e8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06810fdd-824c-400e-bbff-edf98e42d3e8
deleted file mode 100644
index 536e4da..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06810fdd-824c-400e-bbff-edf98e42d3e8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"06810fdd-824c-400e-bbff-edf98e42d3e8","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Policy Serialization Test\",\"actionId\":\"06810fdd-824c-400e-bbff-edf98e42d3e8\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Policy Serialization Test\",\"actionId\":\"3e18326c-0ab0-4b5c-97e2-23c4482e4de1\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Policy Serialization Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d4b6b57d-dd16-4a90-869e-494e2636d63b\",\"displayText\":\"Policy Serialization Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Policy Serialization Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":400.3333333333333,\"x2\":351.3333333333333,\"y2\":442.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":90.0,\"y\":424.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":90.0,\"y\":-2.6666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"d4b6b57d-dd16-4a90-869e-494e2636d63b\",\"firstText\":\"Policy Serialization Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Policy Serialization Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":413.0,\"x2\":174.0,\"y2\":435.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Policy Serialization Test\",\"actionId\":\"90c813e7-af95-4c6b-89b2-573314c06890\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Policy Serialization Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/generate_policy_button\",\"actionId\":\"df3a3dc5-0cb3-4fcf-9b4d-79dbe3b0603b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/generate_policy_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/apply_policy_button\",\"actionId\":\"0f736acb-d409-477f-be74-a8b38ed6dfa3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/apply_policy_button\"},{\"type\":\"ConditionClickAction\",\"name\":\"Enable Device Admin if need\",\"actionId\":\"ab748be0-96e8-41da-b653-74ddea69cbc9\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.settings:id/action_button\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8a8e0c80-a83d-406f-a8a1-502efa4b4579\",\"displayText\":\"Activate this device admin app\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"b5b63536-d25a-4e79-8af5-e9d4db5edccc\",\"displayText\":\"Activate this device admin app\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/action_button\",\"text\":\"Activate this device admin app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":563.0,\"x2\":197.66666666666666,\"y2\":598.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.166666666666671,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Activate this device admin app\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/restricted_action\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":563.0,\"x2\":197.66666666666666,\"y2\":598.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":105.0,\"y\":579.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.166666666666671,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"b5b63536-d25a-4e79-8af5-e9d4db5edccc\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.settings:id/action_button\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":11.0,\"y1\":568.0,\"x2\":199.0,\"y2\":591.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, OK button\",\"actionId\":\"25e9858c-9d42-4ac2-b99c-db9a6edfbcec\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"RebootAction\",\"name\":\"REBOOT and wait 50 secs\",\"actionId\":\"f8ddd12f-bcbe-45fb-9c45-bfe0c06ab8f0\",\"actionType\":\"REBOOT_ACTION\",\"createdBy\":\"pololee\",\"onlyReconnectToDevice\":false,\"reconnectTimeInSec\":50},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Policy Serialization Test\",\"actionId\":\"e4bd07c3-0323-4d9d-acaf-2c5fc0cb8348\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Policy Serialization Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ec8dda74-5b69-450a-b283-1a41c70c3d4f\",\"displayText\":\"Policy Serialization Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Policy Serialization Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":430.3333333333333,\"x2\":351.3333333333333,\"y2\":472.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":91.0,\"y\":455.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":89.0,\"y\":-3.6666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"ec8dda74-5b69-450a-b283-1a41c70c3d4f\",\"firstText\":\"Policy Serialization Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Policy Serialization Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":440.0,\"x2\":173.0,\"y2\":470.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Policy Serialization Test\",\"actionId\":\"3ff291b9-485f-4d28-9a0c-d3a33e36dda7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Policy Serialization Test\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"3e18326c-0ab0-4b5c-97e2-23c4482e4de1\",\"90c813e7-af95-4c6b-89b2-573314c06890\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"df3a3dc5-0cb3-4fcf-9b4d-79dbe3b0603b\",\"0f736acb-d409-477f-be74-a8b38ed6dfa3\",\"ab748be0-96e8-41da-b653-74ddea69cbc9\",\"25e9858c-9d42-4ac2-b99c-db9a6edfbcec\",\"f8ddd12f-bcbe-45fb-9c45-bfe0c06ab8f0\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"e4bd07c3-0323-4d9d-acaf-2c5fc0cb8348\",\"3ff291b9-485f-4d28-9a0c-d3a33e36dda7\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e\",\"b531da69-1e61-4e75-a6b1-7e005df80c7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Policy Serialization Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.049000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06b95829-83ea-43e3-9620-11c733b49b41 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06b95829-83ea-43e3-9620-11c733b49b41
deleted file mode 100644
index 97dc563..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06b95829-83ea-43e3-9620-11c733b49b41
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"06b95829-83ea-43e3-9620-11c733b49b41","details":"{\"type\":\"CompoundAction\",\"name\":\"New_16-2_Cross profile permission control\",\"actionId\":\"06b95829-83ea-43e3-9620-11c733b49b41\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Cross profile permission control\",\"actionId\":\"d0cefde3-2f89-4efe-a1f3-e407dca53524\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Cross profile permission control\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"39ae01e0-2b04-4c70-b816-4cc40c5852a9\",\"displayText\":\"Cross profile permission control\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Cross profile permission control\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":414.6666666666667,\"x2\":360.0,\"y2\":458.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":113.0,\"y\":436.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":67.0,\"y\":0.16666666666668561,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"39ae01e0-2b04-4c70-b816-4cc40c5852a9\",\"firstText\":\"Cross profile permission control\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Cross profile permission control\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":226.0,\"y1\":444.0,\"x2\":0.0,\"y2\":429.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Cross profile permission control\",\"actionId\":\"c5f5247e-c278-42d9-8f82-41a80627e856\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Cross profile permission control\"},{\"type\":\"CommandLineAction\",\"name\":\"install CrossProfileTestApp apk\",\"actionId\":\"350e266c-1377-48bb-b91e-8e00f2497dee\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"commandLine\":\"install -r -t $uicd_crossprofile_app_path\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/prepare_test_button\",\"actionId\":\"921eb4e5-1a6a-4b3d-b6ed-7d46dc8a9c7b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/prepare_test_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Cross profile permission disabled by default\",\"actionId\":\"d810f0be-9fc5-4f9b-a3cf-a300ec0f5b45\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Cross profile permission disabled by default\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Cross Profile Test App\",\"actionId\":\"e5a14120-d670-49c5-994e-43a1c149bf1b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Cross Profile Test App\"},{\"type\":\"PythonScriptAction\",\"name\":\"Check that Connect these apps is disabled\",\"actionId\":\"f84781c6-e7dc-45f0-a737-31c7ca5a4271\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\n\\nd = Device.create_device_by_slot(0)\\nuicd_util = UICDPythonUtil()\\n\\nresult = d.text(\\\"Connect these apps\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist()\\nuicd_util.assert_true(result, \\\"Connect these apps is not disabled!\\\")\\n \\n\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"491e7b28-b240-47e1-9c85-6e061f87c21d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f201566c-a34a-4a9d-9f32-330193154adf\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Cross profile permission enabled\",\"actionId\":\"f5ab3bec-9d9c-4184-9101-d153f7fe44a3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Cross profile permission enabled\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/cross_profile_settings\",\"actionId\":\"be8aa00f-2995-4ad2-b5b4-f2ca61751f7e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.crossprofilepermissioncontrol:id/cross_profile_settings\"},{\"type\":\"PythonScriptAction\",\"name\":\"Enable the switch of Connect these apps\",\"actionId\":\"4cf2c32b-c56e-4b7b-a12a-b2612ba32bf8\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\n\\nd = Device.create_device_by_slot(0)\\n\\nd.text(\\\"Connect these apps\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\\n \\n\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button1\",\"actionId\":\"823ac20e-73a3-4d66-b5ba-de50948c0b16\",\"actionType\":\"CLICK_ACTION\",\"actionDescription\":\"Allow\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Screen on Cross Profile Test App\",\"actionId\":\"1dce41de-f6d1-4abd-8bf8-404d25218fcc\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Cross Profile Test App\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"INTERACTING ACROSS PROFILES ALLOWED\",\"actionId\":\"7a73bc70-e03d-4359-9494-5c2b17a66c37\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.crossprofilepermissioncontrol:id/cross_profile_app_text\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"INTERACTING ACROSS PROFILES ALLOWED\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1edbc0ae-ff7f-4f7e-bc15-827e0ede397e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Cross profile permission disabled\",\"actionId\":\"7bbd2501-09e3-4d05-9a8d-5f4a8f260e3b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Cross profile permission disabled\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/cross_profile_settings\",\"actionId\":\"fdeb2654-95c3-438c-ae13-c686a76419df\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.crossprofilepermissioncontrol:id/cross_profile_settings\"},{\"type\":\"PythonScriptAction\",\"name\":\"Disable the switch of Connect these apps\",\"actionId\":\"9ab25e75-7a04-45f0-a7f4-b6eb3fe4070a\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\n\\nd = Device.create_device_by_slot(0)\\n\\nd.text(\\\"Connected\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"4496e549-7600-4e74-8da5-6c0e1654619b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ConditionValidationAction\",\"name\":\"Screen on Cross Profile Test App\",\"actionId\":\"06a9b6de-cf0c-4c8d-8389-30452f28221b\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Cross Profile Test App\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"INTERACTING ACROSS PROFILES NOT ALLOWED\",\"actionId\":\"60590511-7d6f-442d-a93a-d859dc47f4f6\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.crossprofilepermissioncontrol:id/cross_profile_app_text\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"INTERACTING ACROSS PROFILES NOT ALLOWED\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"621e816b-1d63-4893-9ffc-b33d163a196a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"d0cefde3-2f89-4efe-a1f3-e407dca53524\",\"c5f5247e-c278-42d9-8f82-41a80627e856\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"350e266c-1377-48bb-b91e-8e00f2497dee\",\"921eb4e5-1a6a-4b3d-b6ed-7d46dc8a9c7b\",\"d810f0be-9fc5-4f9b-a3cf-a300ec0f5b45\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"e5a14120-d670-49c5-994e-43a1c149bf1b\",\"f84781c6-e7dc-45f0-a737-31c7ca5a4271\",\"491e7b28-b240-47e1-9c85-6e061f87c21d\",\"f201566c-a34a-4a9d-9f32-330193154adf\",\"11862730-912f-4b3c-99d6-cff28c749559\",\"f5ab3bec-9d9c-4184-9101-d153f7fe44a3\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"be8aa00f-2995-4ad2-b5b4-f2ca61751f7e\",\"4cf2c32b-c56e-4b7b-a12a-b2612ba32bf8\",\"823ac20e-73a3-4d66-b5ba-de50948c0b16\",\"1dce41de-f6d1-4abd-8bf8-404d25218fcc\",\"7a73bc70-e03d-4359-9494-5c2b17a66c37\",\"1edbc0ae-ff7f-4f7e-bc15-827e0ede397e\",\"11862730-912f-4b3c-99d6-cff28c749559\",\"7bbd2501-09e3-4d05-9a8d-5f4a8f260e3b\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"fdeb2654-95c3-438c-ae13-c686a76419df\",\"9ab25e75-7a04-45f0-a7f4-b6eb3fe4070a\",\"4496e549-7600-4e74-8da5-6c0e1654619b\",\"06a9b6de-cf0c-4c8d-8389-30452f28221b\",\"60590511-7d6f-442d-a93a-d859dc47f4f6\",\"621e816b-1d63-4893-9ffc-b33d163a196a\",\"11862730-912f-4b3c-99d6-cff28c749559\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_crossprofile_app_path=$HOME/Documents/rvc_release/android-cts-verifier/CrossProfileTestApp.apk\"}}","name":"New_16-2_Cross profile permission control","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.325000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06e13f84-c348-470c-a237-ded70dacf408 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06e13f84-c348-470c-a237-ded70dacf408
deleted file mode 100644
index 9bb3c29..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06e13f84-c348-470c-a237-ded70dacf408
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"06e13f84-c348-470c-a237-ded70dacf408","details":"{\"type\":\"CompoundAction\",\"name\":\"07-Disallow factory reset\",\"actionId\":\"06e13f84-c348-470c-a237-ded70dacf408\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow factory reset\",\"actionId\":\"52dd279a-f398-4f57-ac27-5b4485144bca\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow factory reset\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"5eb9f8ce-2270-4de3-9ece-e70f36caecc2\",\"displayText\":\"Clear restriction (before leaving test)\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"e40bec78-2bf4-41ef-b653-dde7604b10e3\",\"displayText\":\"Set restriction\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"text\":\"Set restriction\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":410.3333333333333,\"x2\":254.33333333333334,\"y2\":454.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Set restriction\"},{\"uuid\":\"51c56568-ea11-4087-b43f-0822e3760eaf\",\"displayText\":\"Go\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"text\":\"Go\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":454.3333333333333,\"x2\":254.33333333333334,\"y2\":498.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Go\"},{\"uuid\":\"fdd6f0e8-ec71-451a-a06b-755cb8986516\",\"displayText\":\"Clear restriction (before leaving test)\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"text\":\"Clear restriction (before leaving test)\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":498.3333333333333,\"x2\":254.33333333333334,\"y2\":542.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":47.33333333333334,\"y\":2.3333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Clear restriction (before leaving test)\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.cts.verifier:id/buttons\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":410.3333333333333,\"x2\":254.33333333333334,\"y2\":542.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":84.5,\"y\":518.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":47.33333333333334,\"y\":-41.66666666666663,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"fdd6f0e8-ec71-451a-a06b-755cb8986516\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow factory reset\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":11.0,\"y1\":502.0,\"x2\":158.0,\"y2\":534.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow factory reset\",\"actionId\":\"a15f4f32-6be1-49b0-b524-cf00741d92f8\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow factory reset\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if Factory data reset is disabled\",\"actionId\":\"f923269e-2afe-4306-8dbd-fea7b2b424e2\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Erase all data (factory reset)\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Erase all data (factory reset)\",\"actionId\":\"ac6e220d-6d6d-4af3-b06c-77e0ffeeeca5\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Erase all data (factory reset)\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f79016e5-77fd-418c-88f8-8b0652610834\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"fc1d1f37-f213-4ea3-8ad6-1dde358c2886\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Developer options\",\"actionId\":\"5fd21b9d-b089-4c3a-9e11-7f2f7ca87744\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Developer options\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY OEM unlock is disabled\",\"actionId\":\"7a4af685-74fc-42cf-b406-9afe16f37b18\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"OEM unlocking\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, OEM unlocking\",\"actionId\":\"f3bff7a2-a32e-43c3-b3ba-420b4790b973\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"OEM unlocking\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"d80bd6c9-3175-4208-92f3-30ed8a37ed53\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"52dd279a-f398-4f57-ac27-5b4485144bca\",\"a15f4f32-6be1-49b0-b524-cf00741d92f8\",\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"d7cdb82c-060e-4a47-83c1-c1b9f6396683\",\"f923269e-2afe-4306-8dbd-fea7b2b424e2\",\"ac6e220d-6d6d-4af3-b06c-77e0ffeeeca5\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"f79016e5-77fd-418c-88f8-8b0652610834\",\"fc1d1f37-f213-4ea3-8ad6-1dde358c2886\",\"5fd21b9d-b089-4c3a-9e11-7f2f7ca87744\",\"7a4af685-74fc-42cf-b406-9afe16f37b18\",\"f3bff7a2-a32e-43c3-b3ba-420b4790b973\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"d80bd6c9-3175-4208-92f3-30ed8a37ed53\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"07-Disallow factory reset","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.098000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a
deleted file mode 100644
index c817aef..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if set pattern lock appear, set pattern\",\"actionId\":\"06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if set pattern lock appear\",\"actionId\":\"3d6219dc-0e73-478b-ba7e-7d8a8f3758a3\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"For security, set pattern\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"7cb90848-0db8-498d-ab70-214a8034e1f7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm\",\"actionId\":\"3555ff2a-694a-435a-acac-9d5483294352\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"3d6219dc-0e73-478b-ba7e-7d8a8f3758a3\",\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\",\"7cb90848-0db8-498d-ab70-214a8034e1f7\",\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\",\"3555ff2a-694a-435a-acac-9d5483294352\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if set pattern lock appear, set pattern","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.253000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0b2baaab-b94e-4348-8e3b-e13dc302c5ab b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0b2baaab-b94e-4348-8e3b-e13dc302c5ab
deleted file mode 100644
index ce14307..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0b2baaab-b94e-4348-8e3b-e13dc302c5ab
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0b2baaab-b94e-4348-8e3b-e13dc302c5ab","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Go to WiFi Setting\\\" button\",\"actionId\":\"0b2baaab-b94e-4348-8e3b-e13dc302c5ab\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Go to WiFi Settings\",\"actionId\":\"07c8449e-c816-4173-86d9-71a5d89f86d5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Go to WiFi Settings\"}],\"childrenIdList\":[\"07c8449e-c816-4173-86d9-71a5d89f86d5\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Go to WiFi Setting\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.087000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0bb19e90-9994-4d49-9188-fe2405a8dc37 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0bb19e90-9994-4d49-9188-fe2405a8dc37
deleted file mode 100644
index ebff426..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0bb19e90-9994-4d49-9188-fe2405a8dc37
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0bb19e90-9994-4d49-9188-fe2405a8dc37","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if set PIN or Password screen appear, set password to \\\"2468\\\"\",\"actionId\":\"0bb19e90-9994-4d49-9188-fe2405a8dc37\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if set PIN or Set password screen appear\",\"actionId\":\"c450fd1b-eaaa-40b9-b655-eeea69d812dd\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"For security, set PIN\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"For security, set password\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, next button\",\"actionId\":\"70a8a3ed-5265-4754-8f41-9f112cc8fd19\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm button\",\"actionId\":\"6bbb3508-0620-422f-b6bb-5ad168e9f6f4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"c450fd1b-eaaa-40b9-b655-eeea69d812dd\",\"b9e13d9a-43e6-44b0-a3f6-48b3de93d39a\",\"70a8a3ed-5265-4754-8f41-9f112cc8fd19\",\"b9e13d9a-43e6-44b0-a3f6-48b3de93d39a\",\"6bbb3508-0620-422f-b6bb-5ad168e9f6f4\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if set PIN or Password screen appear, set password to \"2468\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.254000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0c73b50f-d48d-4082-a091-3d4f55f77369 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0c73b50f-d48d-4082-a091-3d4f55f77369
deleted file mode 100644
index ebf3f48..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0c73b50f-d48d-4082-a091-3d4f55f77369
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0c73b50f-d48d-4082-a091-3d4f55f77369","details":"{\"type\":\"CompoundAction\",\"name\":\"15-13 & 17-06-05-Disallow modify accounts test\",\"actionId\":\"0c73b50f-d48d-4082-a091-3d4f55f77369\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow modify accounts\",\"actionId\":\"244a1c64-27a3-4526-a0a6-3973cb95be8a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow modify accounts\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6df47111-9120-4036-ae5f-83649d7f024b\",\"displayText\":\"Disallow modify accounts\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow modify accounts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":415.3333333333333,\"x2\":360.0,\"y2\":459.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":93.0,\"y\":434.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":87.0,\"y\":2.8333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"6df47111-9120-4036-ae5f-83649d7f024b\",\"firstText\":\"Disallow modify accounts\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow modify accounts\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":422.0,\"x2\":184.0,\"y2\":447.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow modify accounts\",\"actionId\":\"a778fd90-3724-4503-9c18-003c7e94b216\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow modify accounts\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, $uicd_Gmail_account\",\"actionId\":\"97a7d2af-cc69-455c-a4f0-1959bc04c0aa\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"$uicd_Gmail_account\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Remove account button\",\"actionId\":\"c075016f-6cb5-4970-bd66-29a07e3c272e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"292f3051-b703-4136-a374-70b3301dd960\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"02d51183-f0a9-4aac-8dfe-7a178e8bf2ed\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Add account\",\"actionId\":\"4ac9a4e6-504c-42ef-bf58-303c84c47bfe\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Add account\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c19e5cff-93fb-46e4-9e2d-162c911ffea9\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"9311a1db-c87b-48f5-8b3b-71daf4566707\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, $uicd_Gmail_account\",\"actionId\":\"1a7e00e5-113a-4c1b-b209-09241250c3f2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"$uicd_Gmail_account\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,Remove account button\",\"actionId\":\"59838379-2736-47af-abae-086402eafe1a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, yes remove button\",\"actionId\":\"e987e49e-a1d5-43fb-9636-0c8c3cafc762\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"6329722c-2d0f-4009-8fd9-fffa6091d6bc\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"244a1c64-27a3-4526-a0a6-3973cb95be8a\",\"a778fd90-3724-4503-9c18-003c7e94b216\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"97a7d2af-cc69-455c-a4f0-1959bc04c0aa\",\"c075016f-6cb5-4970-bd66-29a07e3c272e\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"292f3051-b703-4136-a374-70b3301dd960\",\"02d51183-f0a9-4aac-8dfe-7a178e8bf2ed\",\"4ac9a4e6-504c-42ef-bf58-303c84c47bfe\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"c19e5cff-93fb-46e4-9e2d-162c911ffea9\",\"9311a1db-c87b-48f5-8b3b-71daf4566707\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"1a7e00e5-113a-4c1b-b209-09241250c3f2\",\"59838379-2736-47af-abae-086402eafe1a\",\"e987e49e-a1d5-43fb-9636-0c8c3cafc762\",\"6329722c-2d0f-4009-8fd9-fffa6091d6bc\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_Gmail_account=playinstallapk02@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\"}}","name":"15-13 & 17-06-05-Disallow modify accounts test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.139000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0c8249de-dac1-4b3c-852d-cfc4fbbfefbb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0c8249de-dac1-4b3c-852d-cfc4fbbfefbb
deleted file mode 100644
index f52768a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0c8249de-dac1-4b3c-852d-cfc4fbbfefbb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0c8249de-dac1-4b3c-852d-cfc4fbbfefbb","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn off Do not disturb on quick setting\",\"actionId\":\"0c8249de-dac1-4b3c-852d-cfc4fbbfefbb\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if Do Not Disturb is on\",\"actionId\":\"d98ea931-de1e-437f-8288-0bd32dccf1bf\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"contains\",\"value\":\"Do Not Disturb\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"On\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Do Not Disturb\",\"actionId\":\"f12121b8-548c-44d1-b304-0c00edf25016\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Do Not Disturb\"}],\"childrenIdList\":[\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"d98ea931-de1e-437f-8288-0bd32dccf1bf\",\"f12121b8-548c-44d1-b304-0c00edf25016\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn off Do not disturb on quick setting","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.979000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0cd14890-b229-4bdf-a5e5-0e86f7805dfe b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0cd14890-b229-4bdf-a5e5-0e86f7805dfe
deleted file mode 100644
index fb287a5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0cd14890-b229-4bdf-a5e5-0e86f7805dfe
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0cd14890-b229-4bdf-a5e5-0e86f7805dfe","details":"{\"type\":\"CompoundAction\",\"name\":\"New_16-1_Cross profile intent filters are set\",\"actionId\":\"0cd14890-b229-4bdf-a5e5-0e86f7805dfe\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Cross profile intent filters are set\",\"actionId\":\"5dc16d23-571e-4859-aafc-e53eb97d712f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Cross profile intent filters are set\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"60dc46e2-66b4-49fd-97d2-7137ca46c19d\",\"displayText\":\"Cross profile intent filters are set\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Cross profile intent filters are set\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":559.0,\"x2\":360.0,\"y2\":603.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":123.0,\"y\":580.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":57.0,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"60dc46e2-66b4-49fd-97d2-7137ca46c19d\",\"firstText\":\"Cross profile intent filters are set\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Cross profile intent filters are set\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":241.0,\"y1\":593.0,\"x2\":5.0,\"y2\":567.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Cross profile intent filters are set\",\"actionId\":\"7dcacc7b-c2c6-48ad-a225-f3a9dff2811e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Cross profile intent filters are set\"}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"5dc16d23-571e-4859-aafc-e53eb97d712f\",\"7dcacc7b-c2c6-48ad-a225-f3a9dff2811e\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"New_16-1_Cross profile intent filters are set","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.323000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7
deleted file mode 100644
index b31fd4e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Screen lock setting page\",\"actionId\":\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find Security\",\"actionId\":\"48741c3f-c73c-458c-b6d2-abed557aabc9\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Security\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7494ee3a-2fcc-4bbe-8213-4e8f0b9a92c1\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a7b242ba-bbcc-4bf2-867f-0b689e091d66\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e6904c46-7f78-4942-a0fe-f753bed92ef0\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":226.0,\"x2\":45.5,\"y2\":257.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":222.5,\"x2\":63.0,\"y2\":261.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"904d9e00-25ba-4c05-bbfb-3e5a3a1f515a\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b625662e-e7d4-4b98-85d4-ec11d791d0b0\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Security\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":224.0,\"x2\":115.5,\"y2\":243.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.25,\"y\":-0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Security\"},{\"uuid\":\"e5bf4838-7d20-4f63-a281-c5cc978a147b\",\"displayText\":\"Play Protect, screen lock, face unlock\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Play Protect, screen lock, face unlock\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":243.0,\"x2\":265.75,\"y2\":259.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Play Protect, screen lock, face unlock\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":210.0,\"x2\":346.0,\"y2\":273.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Security\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":210.0,\"x2\":360.0,\"y2\":273.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":93.5,\"y\":234.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":86.5,\"y\":7.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"b625662e-e7d4-4b98-85d4-ec11d791d0b0\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Security\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":66.0,\"y1\":222.0,\"x2\":121.0,\"y2\":246.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Security\",\"actionId\":\"300c0070-f81b-4a1a-bb05-98ae7678bd53\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Security\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Screen lock\",\"actionId\":\"2a07959c-6c7f-4ef7-86c9-5d0bade83b3b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Screen lock\"}],\"childrenIdList\":[\"48741c3f-c73c-458c-b6d2-abed557aabc9\",\"300c0070-f81b-4a1a-bb05-98ae7678bd53\",\"2a07959c-6c7f-4ef7-86c9-5d0bade83b3b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Screen lock setting page","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.037000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e190c32-3e45-4bd4-8d81-8eab2da1758e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e190c32-3e45-4bd4-8d81-8eab2da1758e
deleted file mode 100644
index ea2503a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e190c32-3e45-4bd4-8d81-8eab2da1758e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0e190c32-3e45-4bd4-8d81-8eab2da1758e","details":"{\"type\":\"CompoundAction\",\"name\":\"Random select 2 lock type\",\"actionId\":\"0e190c32-3e45-4bd4-8d81-8eab2da1758e\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Random select 2 lock type\",\"actionId\":\"945f92d2-d735-410d-bc53-fb4d4aca9272\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nimport random\\n \\nd= Device.create_device_by_slot(0)\\n \\nresult1 = random.randint(1, 2)\\n \\nif result1 == 1:\\n d.text(\\\"Password\\\").click()\\nelse:\\n d.text(\\\"PIN\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"945f92d2-d735-410d-bc53-fb4d4aca9272\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Random select 2 lock type","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.260000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e30ea6e-be38-468e-8499-790b05a37760 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e30ea6e-be38-468e-8499-790b05a37760
deleted file mode 100644
index 63729e3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e30ea6e-be38-468e-8499-790b05a37760
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0e30ea6e-be38-468e-8499-790b05a37760","details":"{\"type\":\"CompoundAction\",\"name\":\"15-02 & 17-06-01-Disallow adjust volume test\",\"actionId\":\"0e30ea6e-be38-468e-8499-790b05a37760\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow adjust volume\",\"actionId\":\"7a30e7f9-6d0b-46b5-bbb1-4920d9c8ccc3\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow adjust volume\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"89b8fd6a-f53b-40e6-8577-0a1b83f5e8de\",\"displayText\":\"Disallow adjust volume\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow adjust volume\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":118.33333333333333,\"x2\":360.0,\"y2\":162.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":83.0,\"y\":140.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":97.0,\"y\":0.3333333333333428,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"89b8fd6a-f53b-40e6-8577-0a1b83f5e8de\",\"firstText\":\"Disallow adjust volume\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow adjust volume\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":125.0,\"x2\":159.0,\"y2\":155.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow adjust volume\",\"actionId\":\"d78abf8a-60d2-4062-8d7e-af6ace440656\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow adjust volume\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Media volume\",\"actionId\":\"a67dd39b-313d-46d7-afda-f6547143367d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Media volume\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f827f6ad-6a55-45e3-b661-7dd5b10fcc3d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Call volume\",\"actionId\":\"eecca841-c974-45ad-b750-ecd109b79b24\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Call volume\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c56dbf21-2baf-4c78-8a38-ce2b5929111d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Ring & notification volume\",\"actionId\":\"07f4e26a-9ac8-42f6-90fd-b4fb59303443\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Ring & notification volume\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"893e2e2e-c9eb-46ee-bc89-7710fcd87c2e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Alarm volume\",\"actionId\":\"b8e5e7f9-6703-40eb-bfd2-41ec6e809c1e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Alarm volume\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7f056f97-ec83-42c6-aa0c-d569c1442808\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"9b951e74-bb5e-4bc8-8ff3-24d1c39fe1d2\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"7a30e7f9-6d0b-46b5-bbb1-4920d9c8ccc3\",\"d78abf8a-60d2-4062-8d7e-af6ace440656\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"a67dd39b-313d-46d7-afda-f6547143367d\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"f827f6ad-6a55-45e3-b661-7dd5b10fcc3d\",\"eecca841-c974-45ad-b750-ecd109b79b24\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"c56dbf21-2baf-4c78-8a38-ce2b5929111d\",\"07f4e26a-9ac8-42f6-90fd-b4fb59303443\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"893e2e2e-c9eb-46ee-bc89-7710fcd87c2e\",\"b8e5e7f9-6703-40eb-bfd2-41ec6e809c1e\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"7f056f97-ec83-42c6-aa0c-d569c1442808\",\"9b951e74-bb5e-4bc8-8ff3-24d1c39fe1d2\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-02 & 17-06-01-Disallow adjust volume test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.125000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e355b97-b105-4074-8e2f-c4d1e0a69a08 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e355b97-b105-4074-8e2f-c4d1e0a69a08
deleted file mode 100644
index a3cc86d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e355b97-b105-4074-8e2f-c4d1e0a69a08
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0e355b97-b105-4074-8e2f-c4d1e0a69a08","details":"{\"type\":\"CompoundAction\",\"name\":\"Install CA\",\"actionId\":\"0e355b97-b105-4074-8e2f-c4d1e0a69a08\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"eedc62ad-5174-4a11-9b97-f32ed2fab3ed\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find Encryption & credentials\",\"actionId\":\"0b04719b-8aaf-49ab-b52d-e1082a21d550\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Encryption & credentials\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"58707109-c8f3-4b4e-a920-cf731cbc0ef9\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cf528053-dc02-456c-b4cf-758b17be0ab3\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"09e81314-4301-4d51-bc77-961f7760fd6c\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Encryption & credentials\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":661.5,\"x2\":216.5,\"y2\":680.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.25,\"y\":3.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Encryption & credentials\"},{\"uuid\":\"f59ad4af-33c6-4544-a1eb-692e4ae67e77\",\"displayText\":\"Encrypted\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Encrypted\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":680.5,\"x2\":118.0,\"y2\":697.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Encrypted\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":647.5,\"x2\":346.0,\"y2\":711.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Encryption & credentials\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":647.5,\"x2\":360.0,\"y2\":711.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":142.0,\"y\":667.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":38.0,\"y\":11.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"09e81314-4301-4d51-bc77-961f7760fd6c\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Encryption & credentials\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":60.0,\"y1\":655.0,\"x2\":224.0,\"y2\":680.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Encryption & credentials\",\"actionId\":\"221fd194-54f2-49a7-af92-6a7965473ec2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Encryption & credentials\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Install a certificate\",\"actionId\":\"654cb87b-b218-4b6f-93db-4ef97aeb495c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Install a certificate\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CA certificate\",\"actionId\":\"de6f8cfe-293b-47d3-96bb-5d022b122ecf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CA certificate\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Install anyway\",\"actionId\":\"5a4c00fc-55c3-430e-800f-f15b1c815afa\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Install anyway\"},{\"type\":\"DragAction\",\"name\":\"Drag: 1 points\",\"actionId\":\"b6bc9bc1-2cc1-4497-87e4-f35da4375fee\",\"actionType\":\"DRAG_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"dragPoints\":[{\"x\":81.0,\"y\":306.0},{\"x\":91.0,\"y\":306.0}],\"nodeContext\":{\"uuid\":\"f0096902-223e-4ebd-a3e0-947ba10c5222\",\"displayText\":\"myCA.cer\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7049ba59-6523-4e59-abda-8311c8e666a9\",\"displayText\":\"myCA.cer\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cf61ea24-73fe-4a38-ab8b-6e0087110279\",\"displayText\":\"myCA.cer\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"myCA.cer\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":293.25,\"x2\":126.5,\"y2\":312.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":13.75,\"y\":-3.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"myCA.cer\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":293.25,\"x2\":126.5,\"y2\":312.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"myCA.cer\"},{\"uuid\":\"a377486f-cb5a-4d6e-bf62-563bfb9a7b54\",\"displayText\":\"11:43 AM\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"6dde0d88-1b61-42ab-8007-73ec84012980\",\"displayText\":\"11:43 AM\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.google.android.documentsui:id/date\",\"text\":\"11:43 AM\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":312.25,\"x2\":145.25,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"11:43 AM\"},{\"uuid\":\"42b05d5a-31fe-45a6-b99a-9556f1f33a6b\",\"displayText\":\"644 B\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.google.android.documentsui:id/size\",\"text\":\"644 B\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":152.25,\"y1\":312.25,\"x2\":214.0,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"644 B\"},{\"uuid\":\"59a5bbe5-5cfb-4d79-b138-689fd5e30eea\",\"displayText\":\"CER file\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.google.android.documentsui:id/file_type\",\"text\":\"CER file\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":221.0,\"y1\":312.25,\"x2\":283.0,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"CER file\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.google.android.documentsui:id/line2\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":312.25,\"x2\":283.0,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"11:43 AM\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":293.25,\"x2\":283.0,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":81.0,\"y\":306.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":3.875,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"cf61ea24-73fe-4a38-ab8b-6e0087110279\",\"firstText\":\"\"},\"endPointNodeContext\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/action_menu_select\",\"actionId\":\"9ca18b2a-fc41-4130-9670-791ecc587f3f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.documentsui:id/action_menu_select\"}],\"childrenIdList\":[\"eedc62ad-5174-4a11-9b97-f32ed2fab3ed\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"0b04719b-8aaf-49ab-b52d-e1082a21d550\",\"221fd194-54f2-49a7-af92-6a7965473ec2\",\"654cb87b-b218-4b6f-93db-4ef97aeb495c\",\"de6f8cfe-293b-47d3-96bb-5d022b122ecf\",\"5a4c00fc-55c3-430e-800f-f15b1c815afa\",\"1dd91c68-25ae-4631-8387-ea9aae5957e9\",\"b6bc9bc1-2cc1-4497-87e4-f35da4375fee\",\"9ca18b2a-fc41-4130-9670-791ecc587f3f\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Install CA","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.230000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e6339c1-dd60-4126-9c18-82a1171245ce b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e6339c1-dd60-4126-9c18-82a1171245ce
deleted file mode 100644
index 7508ff6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0e6339c1-dd60-4126-9c18-82a1171245ce
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0e6339c1-dd60-4126-9c18-82a1171245ce","details":"{\"type\":\"CompoundAction\",\"name\":\"16-05-Enterprise-installed apps\",\"actionId\":\"0e6339c1-dd60-4126-9c18-82a1171245ce\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Enterprise-installed apps\",\"actionId\":\"38e3abfe-1f8a-4355-8da0-1dbd5683b73f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Enterprise-installed apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"5289f262-c26b-4615-97f2-63fa59d3bbed\",\"displayText\":\"Enterprise-installed apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Enterprise-installed apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":254.25,\"x2\":351.25,\"y2\":296.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.5,\"y\":276.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":87.5,\"y\":-0.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"5289f262-c26b-4615-97f2-63fa59d3bbed\",\"firstText\":\"Enterprise-installed apps\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Enterprise-installed apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":263.0,\"x2\":183.0,\"y2\":289.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Enterprise-installed apps\",\"actionId\":\"4863cc19-2540-45b5-a9f4-1e8a08e6558c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Enterprise-installed apps\"},{\"type\":\"CommandLineAction\",\"name\":\"Grant MANAGE_EXTERNAL_STORAGE\",\"actionId\":\"259472a8-b9dc-4df8-9148-76f5d86ddde1\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"shell appops set com.android.cts.verifier MANAGE_EXTERNAL_STORAGE 0\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"CommandLineAction\",\"name\":\"Install NotificationBot.apk\",\"actionId\":\"bdc47805-0ae3-45eb-99e1-48a822f95e44\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"push $uicd_NotificationBot_apk_path /sdcard\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Uninstall\",\"actionId\":\"85d68a82-08b8-4847-a72d-ae820ba53c2a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Uninstall\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify not show \\\"Apps installed\\\"\",\"actionId\":\"1a098f9e-a14d-4a27-9188-a49a245fe979\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Apps installed\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7786df7e-ba85-4c84-92d1-b6d26d0fba4d\",\"displayText\":\"Apps installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"4591ba55-ed9e-4e05-a140-43c17762ff73\",\"displayText\":\"Apps installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ed3b593a-82a6-4879-a62d-a96f8e35cb1b\",\"displayText\":\"Apps installed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Apps installed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":151.25,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.375,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Apps installed\"},{\"uuid\":\"a2a82afe-db19-41d8-8664-038c1399dbb6\",\"displayText\":\"Minimum 1 app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":148.5,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Minimum 1 app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Apps installed\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":113.5,\"y\":400.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":66.5,\"y\":9.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"ed3b593a-82a6-4879-a62d-a96f8e35cb1b\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Apps installed\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":50.0,\"y1\":389.0,\"x2\":177.0,\"y2\":411.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"8438e518-5c6d-46d3-8f03-022e7641a8ec\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Install\",\"actionId\":\"d4995ccf-9214-42e9-b5e1-de9202de91bd\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Install\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify it shows Apps installed\",\"actionId\":\"af392741-43e6-418c-be5c-4e523a71973f\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Apps installed\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4e720bdc-365f-44fa-9c61-25af5e433c91\",\"displayText\":\"Apps installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"5ea1c17b-82d2-4a25-b974-0fa6a774662d\",\"displayText\":\"Apps installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7a47115c-fc7b-4678-aaf9-5c6961b6bdf6\",\"displayText\":\"Apps installed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Apps installed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":151.25,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.125,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Apps installed\"},{\"uuid\":\"6fcfe0bc-1cc3-44ac-adbe-3404176d1c8f\",\"displayText\":\"Minimum 1 app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":148.5,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Minimum 1 app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Apps installed\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":104.0,\"y\":400.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":76.0,\"y\":9.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"7a47115c-fc7b-4678-aaf9-5c6961b6bdf6\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Apps installed\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":48.0,\"y1\":388.0,\"x2\":160.0,\"y2\":412.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Apps installed\",\"actionId\":\"3d19ea17-b8ba-4ab0-93e1-f66f98005e6d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Apps installed\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that the list contains the CTS Robot app\",\"actionId\":\"9fc30b48-8934-4c68-99d0-dae5fe98fde7\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CTS Robot\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"90678fc2-b186-4282-a264-9e06e2279eb3\",\"displayText\":\"CTS Robot\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"fb284f89-7494-43a6-b2b1-9fbda534f104\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"adde562e-cbfd-4d92-9175-981a9d41c3a6\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":83.0,\"x2\":42.0,\"y2\":111.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":79.5,\"x2\":63.0,\"y2\":114.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"9b4d174d-90a3-49e3-9e44-f4cb508f2985\",\"displayText\":\"CTS Robot\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1d8482a7-f7c9-4265-8040-1aa0a856885d\",\"displayText\":\"CTS Robot\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"CTS Robot\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":87.5,\"x2\":130.0,\"y2\":106.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.5,\"y\":-2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"CTS Robot\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":73.5,\"x2\":346.0,\"y2\":120.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"CTS Robot\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":73.5,\"x2\":360.0,\"y2\":120.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":98.0,\"y\":99.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":82.0,\"y\":-2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"1d8482a7-f7c9-4265-8040-1aa0a856885d\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CTS Robot\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":50.0,\"y1\":82.0,\"x2\":146.0,\"y2\":116.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"2a0370be-4b2c-4a72-8483-2d8861cc6156\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"792ecbfd-394a-4d9e-9d42-3b5e97b6c7ed\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Uninstall\",\"actionId\":\"fdcc31fc-a4e3-4765-baf0-450611ddf156\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Uninstall\"}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"38e3abfe-1f8a-4355-8da0-1dbd5683b73f\",\"4863cc19-2540-45b5-a9f4-1e8a08e6558c\",\"259472a8-b9dc-4df8-9148-76f5d86ddde1\",\"bdc47805-0ae3-45eb-99e1-48a822f95e44\",\"85d68a82-08b8-4847-a72d-ae820ba53c2a\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"1a098f9e-a14d-4a27-9188-a49a245fe979\",\"8438e518-5c6d-46d3-8f03-022e7641a8ec\",\"d4995ccf-9214-42e9-b5e1-de9202de91bd\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"af392741-43e6-418c-be5c-4e523a71973f\",\"3d19ea17-b8ba-4ab0-93e1-f66f98005e6d\",\"9fc30b48-8934-4c68-99d0-dae5fe98fde7\",\"2a0370be-4b2c-4a72-8483-2d8861cc6156\",\"792ecbfd-394a-4d9e-9d42-3b5e97b6c7ed\",\"fdcc31fc-a4e3-4765-baf0-450611ddf156\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_NotificationBot_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/NotificationBot.apk\"}}","name":"16-05-Enterprise-installed apps","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.173000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0ec64b5f-e737-4075-9eb8-5de22223c304 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0ec64b5f-e737-4075-9eb8-5de22223c304
deleted file mode 100644
index 00507e1..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/0ec64b5f-e737-4075-9eb8-5de22223c304
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"0ec64b5f-e737-4075-9eb8-5de22223c304","details":"{\"type\":\"CompoundAction\",\"name\":\"17-03-Disable status bar\",\"actionId\":\"0ec64b5f-e737-4075-9eb8-5de22223c304\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"7ba82511-7b81-415f-81d7-ce2a5c969a50\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"17-03-Disable status bar","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.200000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1013c0fa-aac7-432d-aed1-e33c58b4d603 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1013c0fa-aac7-432d-aed1-e33c58b4d603
deleted file mode 100644
index d759980..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1013c0fa-aac7-432d-aed1-e33c58b4d603
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1013c0fa-aac7-432d-aed1-e33c58b4d603","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn Adaptive Brightness off\",\"actionId\":\"1013c0fa-aac7-432d-aed1-e33c58b4d603\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Turn Adaptive Brightness off\",\"actionId\":\"5fae2e2e-29fd-49f4-b0ec-c451ceae100d\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell settings put system screen_brightness_mode 0\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"5fae2e2e-29fd-49f4-b0ec-c451ceae100d\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn Adaptive Brightness off","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.272000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1075b85b-6357-4973-af77-ddd3ef41fbbf b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1075b85b-6357-4973-af77-ddd3ef41fbbf
deleted file mode 100644
index 4f864fdc..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1075b85b-6357-4973-af77-ddd3ef41fbbf
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1075b85b-6357-4973-af77-ddd3ef41fbbf","details":"{\"type\":\"CompoundAction\",\"name\":\"15-28-Set permitted input methods\",\"actionId\":\"1075b85b-6357-4973-af77-ddd3ef41fbbf\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"238c6d52-12d8-4d83-ae19-c703bcc6ec24\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-28-Set permitted input methods","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.162000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/10a43a2f-1557-43cb-b85f-95ced16d5bb4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/10a43a2f-1557-43cb-b85f-95ced16d5bb4
deleted file mode 100644
index 96bbfaa..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/10a43a2f-1557-43cb-b85f-95ced16d5bb4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"10a43a2f-1557-43cb-b85f-95ced16d5bb4","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Alarms and Timers Tests-Set Timer Test\",\"actionId\":\"10a43a2f-1557-43cb-b85f-95ced16d5bb4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Timer Test\",\"actionId\":\"694cb47d-7953-44a2-bc40-e270f0251749\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set Timer Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Timer\",\"actionId\":\"6be42a32-005a-4081-8714-7a2f130c55a3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set Timer\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-in Timer page\",\"actionId\":\"25c2c167-bf28-430b-bc14-8ad6c7eed9be\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/action_bar_title\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Timer\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-UI to manage timers\",\"actionId\":\"3eda76d3-652f-49bb-be58-c33967268418\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"com.google.android.deskclock:id/timer_setup\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/timer_setup\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-UI to manage timers\",\"actionId\":\"7abccf64-4453-47b4-bf45-b547096f7175\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"com.google.android.deskclock:id/timer_setup_time\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/timer_setup_time\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Numeric pad\",\"actionId\":\"1da89ba8-076f-4a7b-b32b-45a5cfc25d6c\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"contains\",\"value\":\"com.google.android.deskclock:id/timer_setup_digit_\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"0930668c-ddc2-4240-8add-9cfc33150903\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"3832f622-3408-4968-9429-c0c9e11905d5\",\"694cb47d-7953-44a2-bc40-e270f0251749\",\"6be42a32-005a-4081-8714-7a2f130c55a3\",\"25c2c167-bf28-430b-bc14-8ad6c7eed9be\",\"3eda76d3-652f-49bb-be58-c33967268418\",\"7abccf64-4453-47b4-bf45-b547096f7175\",\"1da89ba8-076f-4a7b-b32b-45a5cfc25d6c\",\"0930668c-ddc2-4240-8add-9cfc33150903\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Alarms and Timers Tests-Set Timer Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.033000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1133e24d-4564-4009-8872-280f93f6fb3e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1133e24d-4564-4009-8872-280f93f6fb3e
deleted file mode 100644
index eee667c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1133e24d-4564-4009-8872-280f93f6fb3e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1133e24d-4564-4009-8872-280f93f6fb3e","details":"{\"type\":\"CompoundAction\",\"name\":\"17-01-Check affiliated profile owner\",\"actionId\":\"1133e24d-4564-4009-8872-280f93f6fb3e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Check affiliated profile owner\",\"actionId\":\"32752b05-2e6e-438a-905a-226126bcb927\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Check affiliated profile owner\"}],\"childrenIdList\":[\"32752b05-2e6e-438a-905a-226126bcb927\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"17-01-Check affiliated profile owner","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.199000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/11862730-912f-4b3c-99d6-cff28c749559 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/11862730-912f-4b3c-99d6-cff28c749559
deleted file mode 100644
index 67ca952..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/11862730-912f-4b3c-99d6-cff28c749559
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"11862730-912f-4b3c-99d6-cff28c749559","details":"{\"type\":\"CompoundAction\",\"name\":\"Press Pass on dialog\",\"actionId\":\"11862730-912f-4b3c-99d6-cff28c749559\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button1\",\"actionId\":\"1d59f4eb-bf51-4743-9554-95536f68ff1c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"1d59f4eb-bf51-4743-9554-95536f68ff1c\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Press Pass on dialog","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.292000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/11db7055-3e2e-475f-8620-1bef6bb6f5bd b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/11db7055-3e2e-475f-8620-1bef6bb6f5bd
deleted file mode 100644
index dc75f0a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/11db7055-3e2e-475f-8620-1bef6bb6f5bd
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"11db7055-3e2e-475f-8620-1bef6bb6f5bd","details":"{\"type\":\"CompoundAction\",\"name\":\"11_Profile-aware location settings\",\"actionId\":\"11db7055-3e2e-475f-8620-1bef6bb6f5bd\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Profile-aware location settings\",\"actionId\":\"5aab971e-2393-42fe-9431-63fe2546881f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Profile-aware location settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a736b818-3ea8-4368-9404-ec2840986088\",\"displayText\":\"Profile-aware location settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Profile-aware location settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":616.6666666666666,\"x2\":360.0,\"y2\":660.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":111.0,\"y\":637.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":69.0,\"y\":1.1666666666666288,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"a736b818-3ea8-4368-9404-ec2840986088\",\"firstText\":\"Profile-aware location settings\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Profile-aware location settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":218.0,\"y1\":647.0,\"x2\":4.0,\"y2\":628.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Profile-aware location settings\",\"actionId\":\"43814901-0c60-4d04-afcd-9cdcdd17a9dc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Profile-aware location settings\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Location\",\"actionId\":\"4d6bb478-f752-424a-b89a-229ca66b3e65\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"class\",\"operator\":\"=\",\"value\":\"android.widget.TextView\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Location\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work\",\"actionId\":\"d7225083-b453-4385-b89e-ccb68986ea3c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"fee374c3-8d61-4864-923d-9ce2f48052ab\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"5aab971e-2393-42fe-9431-63fe2546881f\",\"43814901-0c60-4d04-afcd-9cdcdd17a9dc\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"4d6bb478-f752-424a-b89a-229ca66b3e65\",\"d7225083-b453-4385-b89e-ccb68986ea3c\",\"8d1d94a2-d11b-4f87-a55a-3d13bc488360\",\"f9a2bad7-a95c-4899-a5a1-c5eb32932abf\",\"dab0d2a9-befa-4378-bea1-b9d830417b93\",\"a5cd361e-a0c1-493b-9029-bc0855d3503c\",\"5caa8a3a-bdb2-4642-87b7-b5d5f855b32b\",\"dab0d2a9-befa-4378-bea1-b9d830417b93\",\"bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3\",\"73572186-21d3-4f07-9b89-dd5f35a0a943\",\"d3945e10-840f-4cae-8f1a-39db0e4ac6cb\",\"dab0d2a9-befa-4378-bea1-b9d830417b93\",\"a5cd361e-a0c1-493b-9029-bc0855d3503c\",\"5caa8a3a-bdb2-4642-87b7-b5d5f855b32b\",\"dab0d2a9-befa-4378-bea1-b9d830417b93\",\"bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3\",\"46149c51-f989-4ff1-98c5-18a09bcb4fa5\",\"d3945e10-840f-4cae-8f1a-39db0e4ac6cb\",\"fee374c3-8d61-4864-923d-9ce2f48052ab\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"11_Profile-aware location settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.303000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/128d040e-8d30-4812-9cbb-b29efa47855e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/128d040e-8d30-4812-9cbb-b29efa47855e
deleted file mode 100644
index e2c51ef..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/128d040e-8d30-4812-9cbb-b29efa47855e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"128d040e-8d30-4812-9cbb-b29efa47855e","details":"{\"type\":\"CompoundAction\",\"name\":\"05-Disallow configuring VPN\",\"actionId\":\"128d040e-8d30-4812-9cbb-b29efa47855e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow configuring VPN\",\"actionId\":\"a48b1f3f-1e11-42d6-9058-a9c6f6c22ef5\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow configuring VPN\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3b7242bd-5a58-4841-9d6e-9b0e3bd890c0\",\"displayText\":\"Go\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cf687992-2fed-4bba-9f18-6cc27f44be67\",\"displayText\":\"Go\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"4041c737-583e-42ae-b523-443f3456d3fb\",\"displayText\":\"Go\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"text\":\"Go\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":436.5,\"x2\":85.75,\"y2\":478.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Go\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.cts.verifier:id/buttons\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":436.5,\"x2\":85.75,\"y2\":478.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Go\"}],\"className\":\"android.widget.ScrollView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":436.5,\"x2\":351.25,\"y2\":673.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":530.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":24.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"3b7242bd-5a58-4841-9d6e-9b0e3bd890c0\",\"firstText\":\"Go\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow configuring VPN\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":514.0,\"x2\":176.0,\"y2\":547.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow configuring VPN\",\"actionId\":\"a7ad2025-cdc5-47f7-aa80-bdabef8671de\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow configuring VPN\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set VPN restriction\",\"actionId\":\"a3fe787d-4e35-4745-a5ed-4a02b75b124f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set VPN restriction\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b7cd95ec-0160-412d-8749-cc18070762ef\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Check VPN\",\"actionId\":\"186422aa-8526-46f3-8845-c1536b6cc774\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Check VPN\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify Vpn setup is not allowed\",\"actionId\":\"a99f0b36-1fdc-4fda-815a-6c3f8467925c\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"CONTAINS\",\"patternValue\":\"Cannot establish a VPN connection\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d94364c7-bfc5-4de4-9052-81a1427fa383\",\"displayText\":\"Cannot establish a VPN connection.\\n This was expected.\\n Mark this test as passed.\\n\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.cts.verifier:id/device_owner_vpn_info\",\"text\":\"Cannot establish a VPN connection.\\n This was expected.\\n Mark this test as passed.\\n\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":73.5,\"x2\":360.0,\"y2\":167.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":138.0,\"y\":88.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":42.0,\"y\":31.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"d94364c7-bfc5-4de4-9052-81a1427fa383\",\"firstText\":\"Cannot establish a VPN connection.\\n This was expected.\\n Mark this test as passed.\\n\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Cannot establish a VPN connection\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":76.0,\"x2\":271.0,\"y2\":101.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1f2a0b9e-80b1-4938-976b-855f3bfd1a67\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"a48b1f3f-1e11-42d6-9058-a9c6f6c22ef5\",\"a7ad2025-cdc5-47f7-aa80-bdabef8671de\",\"a3fe787d-4e35-4745-a5ed-4a02b75b124f\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"b7cd95ec-0160-412d-8749-cc18070762ef\",\"186422aa-8526-46f3-8845-c1536b6cc774\",\"a99f0b36-1fdc-4fda-815a-6c3f8467925c\",\"1f2a0b9e-80b1-4938-976b-855f3bfd1a67\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"05-Disallow configuring VPN","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.095000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/12e01265-ef71-4a9b-92fa-96edbbf0df2a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/12e01265-ef71-4a9b-92fa-96edbbf0df2a
deleted file mode 100644
index 5db2bd4..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/12e01265-ef71-4a9b-92fa-96edbbf0df2a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"12e01265-ef71-4a9b-92fa-96edbbf0df2a","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Multiple users page\",\"actionId\":\"12e01265-ef71-4a9b-92fa-96edbbf0df2a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to System\",\"actionId\":\"92d15422-4f17-4c11-b4c3-04a9b97e5f95\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"System\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b846dfe6-0cb5-4cc6-85a6-c5c4971155a2\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1a9707b7-49d2-402a-bd34-2ac9e319900a\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"467412d8-cde8-467f-93b7-41a42a867146\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":589.6666666666666,\"x2\":47.666666666666664,\"y2\":622.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":586.0,\"x2\":66.0,\"y2\":626.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"4e3f5798-c062-4ed4-8985-118df16ca659\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"fcc4ca3a-7eb4-4ae4-bc81-0e7e56227af5\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":587.6666666666666,\"x2\":115.0,\"y2\":607.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.5,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"System\"},{\"uuid\":\"4d7e6aa9-67a6-4c84-935c-a3fa2043fa84\",\"displayText\":\"Languages, gestures, time, backup\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Languages, gestures, time, backup\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":607.3333333333334,\"x2\":266.6666666666667,\"y2\":625.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Languages, gestures, time, backup\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":573.0,\"x2\":345.3333333333333,\"y2\":639.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"System\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":573.0,\"x2\":360.0,\"y2\":639.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":93.0,\"y\":595.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":87.0,\"y\":10.833333333333258,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"fcc4ca3a-7eb4-4ae4-bc81-0e7e56227af5\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"System\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":63.0,\"y1\":586.0,\"x2\":123.0,\"y2\":605.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, System\",\"actionId\":\"79b103e7-28ff-4151-af37-4b0f2d797a9f\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"System\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Multiple users\",\"actionId\":\"1809f74e-235d-4de5-832c-aa28c76aacab\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Multiple users\"}],\"childrenIdList\":[\"92d15422-4f17-4c11-b4c3-04a9b97e5f95\",\"79b103e7-28ff-4151-af37-4b0f2d797a9f\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"1809f74e-235d-4de5-832c-aa28c76aacab\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Multiple users page","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.081000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/137e850e-d1e1-4fda-85f0-7a71c6aa39d8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/137e850e-d1e1-4fda-85f0-7a71c6aa39d8
deleted file mode 100644
index 9377c5a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/137e850e-d1e1-4fda-85f0-7a71c6aa39d8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"137e850e-d1e1-4fda-85f0-7a71c6aa39d8","details":"{\"type\":\"CompoundAction\",\"name\":\"16-01-Managed device info page\",\"actionId\":\"137e850e-d1e1-4fda-85f0-7a71c6aa39d8\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Managed device info page\",\"actionId\":\"00eec9fe-38c1-487b-bad3-79619a31b2eb\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Managed device info page\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"da134509-fe35-42d8-b74a-8d1a76aed0c6\",\"displayText\":\"Retrieve security logs\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Retrieve security logs\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":82.25,\"x2\":351.25,\"y2\":114.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":99.0,\"y\":104.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":81.0,\"y\":-6.375,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"da134509-fe35-42d8-b74a-8d1a76aed0c6\",\"firstText\":\"Retrieve security logs\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Managed device info page\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":13.0,\"y1\":89.0,\"x2\":185.0,\"y2\":120.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Managed device info page\",\"actionId\":\"880cf89a-bcfc-4a96-97cb-cd5a8233078c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Managed device info page\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find Security\",\"actionId\":\"f000f871-0742-48aa-bad4-48643644873a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Security\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"48192a16-0108-437d-aad0-de25385a4ad2\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6510b2b2-246f-4c30-9dee-a2e5299ca5fb\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6ae5d044-673a-466d-8aaa-b6f311835063\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":516.25,\"x2\":45.5,\"y2\":547.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":512.75,\"x2\":63.0,\"y2\":551.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"f8d22870-7e8b-4384-9398-ee227a211b4d\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"08ca9f0a-fb4b-4b1b-b833-784db55047df\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Security\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":514.25,\"x2\":115.5,\"y2\":533.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-12.75,\"y\":1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Security\"},{\"uuid\":\"afeaea16-eb38-46c4-8e8c-560362a59074\",\"displayText\":\"Play Protect, screen lock, face unlock\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Play Protect, screen lock, face unlock\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":533.25,\"x2\":265.75,\"y2\":549.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Play Protect, screen lock, face unlock\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":500.25,\"x2\":346.0,\"y2\":563.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Security\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":500.25,\"x2\":360.0,\"y2\":563.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":102.0,\"y\":522.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":78.0,\"y\":9.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"08ca9f0a-fb4b-4b1b-b833-784db55047df\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Security\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":61.0,\"y1\":510.0,\"x2\":143.0,\"y2\":535.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Security\",\"actionId\":\"6fbdafc5-0eae-4f25-a708-0a024d50708a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Security\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find Managed device info\",\"actionId\":\"26bc1a0e-fc9d-46ac-85c1-57b408918948\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Managed device info\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"9ada6673-e420-4ba8-a044-a4c9116b9afc\",\"displayText\":\"Managed device info\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f1892a23-1b58-42fe-8e7d-12336e2b5241\",\"displayText\":\"Managed device info\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"571c64ed-d089-46ba-ad59-43bdc693a444\",\"displayText\":\"Managed device info\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Managed device info\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":560.5,\"x2\":195.25,\"y2\":579.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.125,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Managed device info\"},{\"uuid\":\"5d3b2711-58c3-4af1-bc67-cae826cb8cd9\",\"displayText\":\"Changes & settings managed by your organization\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Changes & settings managed by your organization\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":579.5,\"x2\":336.5,\"y2\":596.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Changes & settings managed by your organization\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":546.5,\"x2\":346.0,\"y2\":610.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Managed device info\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":546.5,\"x2\":360.0,\"y2\":610.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":127.0,\"y\":568.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":53.0,\"y\":10.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"571c64ed-d089-46ba-ad59-43bdc693a444\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Managed device info\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":558.0,\"x2\":200.0,\"y2\":578.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Managed device info\",\"actionId\":\"3917a71b-06f3-431e-bdd7-c6613b8c6665\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Managed device info\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify info \\\"Change setting on this device\\\"\",\"actionId\":\"00443cad-52a2-4c72-863d-c39b18c1d908\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"CONTAINS\",\"patternValue\":\"To provide access to your work data, your organization may change settings and install software on your device.\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1fe52c2e-118e-4817-ae2c-64b0fe4277f0\",\"displayText\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6e3c7215-9b57-40bc-bc59-b3d622bed545\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"e6925a1b-806e-4ff8-96ed-2588d62b4c76\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":544.75,\"x2\":35.0,\"y2\":565.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":530.75,\"x2\":63.0,\"y2\":569.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"d3b28057-3ed5-43c8-8db5-1157cc016e24\",\"displayText\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":530.75,\"x2\":346.0,\"y2\":632.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":21.0,\"y\":13.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":530.75,\"x2\":360.0,\"y2\":632.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":183.5,\"y\":568.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.5,\"y\":13.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d3b28057-3ed5-43c8-8db5-1157cc016e24\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"To provide access to your work data, your organization may change settings and install software on your device.\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":50.0,\"y1\":542.0,\"x2\":317.0,\"y2\":594.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify info \\\"See data associated with your work account\\\"\",\"actionId\":\"211d2e56-e118-41ad-9673-7816528a98e7\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Data associated with your work account, such as email and calendar\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b0fe3c83-410f-4bb3-ace5-04a5236d98d2\",\"displayText\":\"Data associated with your work account, such as email and calendar\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d7222fc3-3e3d-4853-9b17-d8ef7787bead\",\"displayText\":\"Data associated with your work account, such as email and calendar\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c6e6b8b4-c23f-4baa-bc0c-ccdcf92a9faa\",\"displayText\":\"Data associated with your work account, such as email and calendar\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Data associated with your work account, such as email and calendar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":128.75,\"x2\":346.0,\"y2\":165.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":20.5,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Data associated with your work account, such as email and calendar\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":114.75,\"x2\":346.0,\"y2\":179.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Data associated with your work account, such as email and calendar\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":114.75,\"x2\":360.0,\"y2\":179.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":184.0,\"y\":145.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.0,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"c6e6b8b4-c23f-4baa-bc0c-ccdcf92a9faa\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Data associated with your work account, such as email and calendar\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":57.0,\"y1\":124.0,\"x2\":311.0,\"y2\":166.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify info \\\"See the list of all apps on your device\\\"\",\"actionId\":\"fc9059d1-b37b-45a2-8ca7-99b05b769348\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"List of apps on your device\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"703946fa-94ca-48e9-b33c-8920c76a50a8\",\"displayText\":\"List of apps on your device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b8d44f5f-9601-4937-8ac9-8ddbc969614b\",\"displayText\":\"List of apps on your device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"55fba905-5b97-420e-b126-6b529526e936\",\"displayText\":\"List of apps on your device\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"List of apps on your device\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":193.25,\"x2\":231.5,\"y2\":212.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.75,\"y\":0.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"List of apps on your device\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":179.25,\"x2\":346.0,\"y2\":226.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"List of apps on your device\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":179.25,\"x2\":360.0,\"y2\":226.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":150.0,\"y\":202.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":30.0,\"y\":0.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"55fba905-5b97-420e-b126-6b529526e936\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"List of apps on your device\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":188.0,\"x2\":246.0,\"y2\":216.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify info \\\"See usage of each app on your device\\\"\",\"actionId\":\"e4efcea3-6ad0-464f-bd0b-afbcf4f0f8f0\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Amount of time and data spent in each app\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b2a0e5c7-995d-4a7f-996d-a69140cb0922\",\"displayText\":\"Amount of time and data spent in each app\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b8f58dfb-a58a-4f77-a6ae-e718a3c060ba\",\"displayText\":\"Amount of time and data spent in each app\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d228f0c4-e050-4e01-9cbb-40e03172e50e\",\"displayText\":\"Amount of time and data spent in each app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Amount of time and data spent in each app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":240.25,\"x2\":335.25,\"y2\":259.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.375,\"y\":1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Amount of time and data spent in each app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":226.25,\"x2\":346.0,\"y2\":273.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Amount of time and data spent in each app\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":226.25,\"x2\":360.0,\"y2\":273.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":199.5,\"y\":248.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-19.5,\"y\":1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d228f0c4-e050-4e01-9cbb-40e03172e50e\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Amount of time and data spent in each app\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":58.0,\"y1\":227.0,\"x2\":341.0,\"y2\":270.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify info \\\"Lock the device and change the password\\\"\",\"actionId\":\"391cf53a-7958-467a-b7c2-f6aa84b7394a\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Admin can lock the device and reset password\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"dd47862a-d5fb-4ca2-803f-d3e9c8f80f7c\",\"displayText\":\"Admin can lock the device and reset password\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a99d00e9-0d76-46a5-852d-1614a2516bdd\",\"displayText\":\"Admin can lock the device and reset password\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"54178a9d-5bd0-402f-9346-81e8939b7267\",\"displayText\":\"Admin can lock the device and reset password\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Admin can lock the device and reset password\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":433.25,\"x2\":346.0,\"y2\":469.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":32.5,\"y\":3.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Admin can lock the device and reset password\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":419.25,\"x2\":346.0,\"y2\":483.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Admin can lock the device and reset password\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":419.25,\"x2\":360.0,\"y2\":483.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":172.0,\"y\":448.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":8.0,\"y\":3.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"54178a9d-5bd0-402f-9346-81e8939b7267\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Admin can lock the device and reset password\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":51.0,\"y1\":433.0,\"x2\":293.0,\"y2\":464.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify info \\\"Wipe the device\\\"\",\"actionId\":\"77aadbb5-af44-4660-ac06-ff85662742d0\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Admin can delete all device data\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"748a0e5c-7bc7-4c61-b599-e656d02e6eff\",\"displayText\":\"Admin can delete all device data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7a8ef27c-35b5-471e-8e04-62c484c26e25\",\"displayText\":\"Admin can delete all device data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"72df370a-b541-4cac-9532-6c75f3e39725\",\"displayText\":\"Admin can delete all device data\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Admin can delete all device data\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":497.75,\"x2\":267.75,\"y2\":516.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.125,\"y\":-2.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Admin can delete all device data\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":483.75,\"x2\":346.0,\"y2\":530.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Admin can delete all device data\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":483.75,\"x2\":360.0,\"y2\":530.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":168.5,\"y\":510.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":11.5,\"y\":-2.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"72df370a-b541-4cac-9532-6c75f3e39725\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Admin can delete all device data\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":56.0,\"y1\":495.0,\"x2\":281.0,\"y2\":525.0}}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"00eec9fe-38c1-487b-bad3-79619a31b2eb\",\"880cf89a-bcfc-4a96-97cb-cd5a8233078c\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"f000f871-0742-48aa-bad4-48643644873a\",\"6fbdafc5-0eae-4f25-a708-0a024d50708a\",\"26bc1a0e-fc9d-46ac-85c1-57b408918948\",\"3917a71b-06f3-431e-bdd7-c6613b8c6665\",\"00443cad-52a2-4c72-863d-c39b18c1d908\",\"211d2e56-e118-41ad-9673-7816528a98e7\",\"fc9059d1-b37b-45a2-8ca7-99b05b769348\",\"e4efcea3-6ad0-464f-bd0b-afbcf4f0f8f0\",\"391cf53a-7958-467a-b7c2-f6aa84b7394a\",\"77aadbb5-af44-4660-ac06-ff85662742d0\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-01-Managed device info page","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.167000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/13c45392-93fc-4bf8-8983-fd7be6dc8af6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/13c45392-93fc-4bf8-8983-fd7be6dc8af6
deleted file mode 100644
index be66ad9..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/13c45392-93fc-4bf8-8983-fd7be6dc8af6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"13c45392-93fc-4bf8-8983-fd7be6dc8af6","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Ringer Mode Tests\",\"actionId\":\"13c45392-93fc-4bf8-8983-fd7be6dc8af6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Ringer Mode Tests\",\"actionId\":\"eb50ad51-1c79-4427-b067-4278a14be337\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Ringer Mode Tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"26bf41ab-2300-44f8-a241-41a9aeb5e755\",\"displayText\":\"Ringer Mode Tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Ringer Mode Tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":442.6666666666667,\"x2\":350.6666666666667,\"y2\":486.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":78.0,\"y\":463.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":102.0,\"y\":1.1666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"26bf41ab-2300-44f8-a241-41a9aeb5e755\",\"firstText\":\"Ringer Mode Tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Ringer Mode Tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":443.0,\"x2\":150.0,\"y2\":484.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Ringer Mode Tests\",\"actionId\":\"43a0c94a-55e9-46d6-9a0d-761e40e2de37\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Ringer Mode Tests\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1cd4f6c8-2abb-4210-ba54-390e8484b324\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"0cd6f856-494c-4adb-a424-ad8f9716de8e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"LongClickAction\",\"name\":\"Do Not Disturb\",\"actionId\":\"25c6ff54-e004-4c3b-b74c-ff1da5f49ece\",\"actionType\":\"LONG_CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":{\"uuid\":\"34d064b3-7700-46be-b0c6-bd427466b06f\",\"displayText\":\"Do Not Disturb\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"9519cb92-5b66-4a97-a7f6-9595deb25962\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f9032696-bd61-43d6-850a-bba28ad4513e\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7f1ae1dc-df5a-49d4-aca3-9c83835dceeb\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":266.3333333333333,\"y1\":159.66666666666666,\"x2\":310.3333333333333,\"y2\":181.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.view.ViewGroup\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":266.3333333333333,\"y1\":159.66666666666666,\"x2\":310.3333333333333,\"y2\":181.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"7cc22197-0fff-478e-9a73-243ccc55ff59\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":268.0,\"y1\":150.33333333333334,\"x2\":308.3333333333333,\"y2\":190.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":266.3333333333333,\"y1\":148.66666666666666,\"x2\":310.3333333333333,\"y2\":192.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"8674e3f1-ee44-4745-bbe9-24be666a2b73\",\"displayText\":\"Do Not Disturb\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0983e884-d2a7-4b31-953b-64b801879f93\",\"displayText\":\"Do Not Disturb\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"61ce980a-6847-4c6f-95da-a620b7359267\",\"displayText\":\"Do Not Disturb\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/tile_label\",\"text\":\"Do Not Disturb\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":251.33333333333334,\"y1\":203.66666666666666,\"x2\":325.3333333333333,\"y2\":218.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.3333333333333144,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Do Not Disturb\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/label_group\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":242.33333333333334,\"y1\":203.66666666666666,\"x2\":334.3333333333333,\"y2\":218.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Do Not Disturb\"}],\"className\":\"android.widget.Button\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":242.33333333333334,\"y1\":192.66666666666666,\"x2\":334.3333333333333,\"y2\":236.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Do Not Disturb\"}],\"className\":\"android.widget.Switch\",\"text\":\"On\",\"contentDesc\":\"Do Not Disturb., \",\"checked\":true,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":242.33333333333334,\"y1\":148.66666666666666,\"x2\":334.3333333333333,\"y2\":246.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":287.0,\"y\":210.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":1.3333333333333144,\"y\":-12.666666666666686,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"61ce980a-6847-4c6f-95da-a620b7359267\",\"firstText\":\"\"},\"isRawXY\":false,\"duration\":2000},{\"type\":\"ClickAction\",\"name\":\"Click Action, Alarms & other interruptions\",\"actionId\":\"3f0c2dc8-f97c-408c-a216-e435a3d7d081\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Alarms & other interruptions\"},{\"type\":\"PythonScriptAction\",\"name\":\"Enable sounds from Alarms and Media\",\"actionId\":\"7598a7eb-6e4a-43e4-ab40-3aea16a34fd1\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\nfrom python_uiautomator.ui_selector import UiSelector\\n\\nuicd_util = UICDPythonUtil()\\nuicd_util.init_env()\\n\\nd= Device.create_device_by_slot(0)\\nif d.text(\\\"Alarms\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d .text(\\\"Alarms\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\nif d.text(\\\"Media sounds\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"Media sounds\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"d21fc536-1fd1-4b67-bc92-73893dace381\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"026555a8-1b7a-49f3-9435-88fc0c0d3cb3\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 30 secs\",\"actionId\":\"dacf1b93-6758-426d-9082-06c93b9f1a39\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":30000,\"createdBy\":\"riacheltseng\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"56374be4-b69b-40e7-b13a-3325c075a744\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"e5c6b1cb-f8a5-4b74-b3f9-05b5a9ff186b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"4655f922-0d25-4f62-8b56-5700b69e31ff\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"WaitAction\",\"name\":\"WAIT 50 secs\",\"actionId\":\"3bea76d8-f59a-4df1-a5ba-b18480e2b0a1\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":50000,\"createdBy\":\"riacheltseng\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"308798c9-4da0-4ad8-a44e-27ea240552a3\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Touch sounds\",\"actionId\":\"8b417d56-04d6-47c1-b3af-4c90d7f455f4\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Touch sounds\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e6e70aa9-5dd5-427e-9190-6fe47cb1cdb7\",\"displayText\":\"Touch sounds\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"686ca313-cb3a-4711-b6fa-152600149d13\",\"displayText\":\"Touch sounds\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3de87f89-811b-449a-8039-deeb7c976dda\",\"displayText\":\"Touch sounds\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Touch sounds\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":579.6666666666666,\"x2\":157.33333333333334,\"y2\":599.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.1666666666666714,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Touch sounds\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":565.0,\"x2\":288.0,\"y2\":614.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Touch sounds\"},{\"uuid\":\"a0795404-1949-49ac-962e-9b167ef40c7d\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"4c4f36c4-9dbd-4dd3-adf8-b1ddfd64d9ce\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Switch\",\"resourceId\":\"android:id/switch_widget\",\"checked\":true,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":302.6666666666667,\"y1\":577.0,\"x2\":345.3333333333333,\"y2\":601.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/widget_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":288.0,\"y1\":565.0,\"x2\":345.3333333333333,\"y2\":614.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":565.0,\"x2\":360.0,\"y2\":614.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":111.5,\"y\":589.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":68.5,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"3de87f89-811b-449a-8039-deeb7c976dda\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Touch sounds\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":58.0,\"y1\":576.0,\"x2\":165.0,\"y2\":603.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"PythonScriptAction\",\"name\":\"Enable Touch sounds\",\"actionId\":\"3d341121-26ba-49c9-9231-6685d70d7fb4\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\nfrom python_uiautomator.ui_selector import UiSelector\\n\\nuicd_util = UICDPythonUtil()\\nuicd_util.init_env()\\n\\nd= Device.create_device_by_slot(0)\\nif d.text(\\\"Touch sounds\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d .text(\\\"Touch sounds\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"54855ecd-d34b-4b70-90b7-3f59519da58f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"69570292-8ea2-48f5-8048-11332fc8fd77\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 10 secs\",\"actionId\":\"44cd6d6a-d655-4ecf-b6fe-7c6f0c0aef5e\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"eb50ad51-1c79-4427-b067-4278a14be337\",\"43a0c94a-55e9-46d6-9a0d-761e40e2de37\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"0c8249de-dac1-4b3c-852d-cfc4fbbfefbb\",\"1cd4f6c8-2abb-4210-ba54-390e8484b324\",\"0cd6f856-494c-4adb-a424-ad8f9716de8e\",\"2abe83e3-a05c-4599-9007-3efbabf97020\",\"c6612b18-5a86-4e82-b7fe-7487ddc09db1\",\"25c6ff54-e004-4c3b-b74c-ff1da5f49ece\",\"3f0c2dc8-f97c-408c-a216-e435a3d7d081\",\"7598a7eb-6e4a-43e4-ab40-3aea16a34fd1\",\"d21fc536-1fd1-4b67-bc92-73893dace381\",\"026555a8-1b7a-49f3-9435-88fc0c0d3cb3\",\"2abe83e3-a05c-4599-9007-3efbabf97020\",\"dacf1b93-6758-426d-9082-06c93b9f1a39\",\"0c8249de-dac1-4b3c-852d-cfc4fbbfefbb\",\"56374be4-b69b-40e7-b13a-3325c075a744\",\"e5c6b1cb-f8a5-4b74-b3f9-05b5a9ff186b\",\"4655f922-0d25-4f62-8b56-5700b69e31ff\",\"2abe83e3-a05c-4599-9007-3efbabf97020\",\"3bea76d8-f59a-4df1-a5ba-b18480e2b0a1\",\"0009ed57-c961-41b7-bcbe-d71e6f0abac1\",\"308798c9-4da0-4ad8-a44e-27ea240552a3\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"8b417d56-04d6-47c1-b3af-4c90d7f455f4\",\"3d341121-26ba-49c9-9231-6685d70d7fb4\",\"54855ecd-d34b-4b70-90b7-3f59519da58f\",\"69570292-8ea2-48f5-8048-11332fc8fd77\",\"2abe83e3-a05c-4599-9007-3efbabf97020\",\"44cd6d6a-d655-4ecf-b6fe-7c6f0c0aef5e\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Ringer Mode Tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.987000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/14ca85a4-dc82-479e-87f5-afd492728ac1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/14ca85a4-dc82-479e-87f5-afd492728ac1
deleted file mode 100644
index 7f2e8e2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/14ca85a4-dc82-479e-87f5-afd492728ac1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"14ca85a4-dc82-479e-87f5-afd492728ac1","details":"{\"type\":\"CompoundAction\",\"name\":\"15-17 Disallow config date time\",\"actionId\":\"14ca85a4-dc82-479e-87f5-afd492728ac1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"a1add8e6-5408-417e-942b-2663863fcdd6\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-17 Disallow config date time","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.144000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/150ccde5-c230-418d-a286-b413af7f297b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/150ccde5-c230-418d-a286-b413af7f297b
deleted file mode 100644
index f582fa5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/150ccde5-c230-418d-a286-b413af7f297b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"150ccde5-c230-418d-a286-b413af7f297b","details":"{\"type\":\"CompoundAction\",\"name\":\"Enable Device Owner\",\"actionId\":\"150ccde5-c230-418d-a286-b413af7f297b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Set Device owner\",\"actionId\":\"71489a4a-7abc-4e93-ad63-98d205a4ddb2\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"shell dpm set-device-owner com.android.cts.emptydeviceowner/.EmptyDeviceAdmin\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"71489a4a-7abc-4e93-ad63-98d205a4ddb2\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Enable Device Owner","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.068000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/151b7e7c-814c-42fc-b2f9-d9aeb0b9d86b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/151b7e7c-814c-42fc-b2f9-d9aeb0b9d86b
deleted file mode 100644
index 1ebb78c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/151b7e7c-814c-42fc-b2f9-d9aeb0b9d86b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"151b7e7c-814c-42fc-b2f9-d9aeb0b9d86b","details":"{\"type\":\"CompoundAction\",\"name\":\"15-22-Set auto(network) time required\",\"actionId\":\"151b7e7c-814c-42fc-b2f9-d9aeb0b9d86b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Set auto (network) time required\",\"actionId\":\"ef95fef1-526e-4bad-8184-80d874c71abd\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set auto (network) time required\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8c6d1baf-fc93-4c18-a31c-5885e517045d\",\"displayText\":\"Set auto (network) time required\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Set auto (network) time required\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":272.3333333333333,\"x2\":360.0,\"y2\":316.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":124.5,\"y\":293.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":55.5,\"y\":1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"8c6d1baf-fc93-4c18-a31c-5885e517045d\",\"firstText\":\"Set auto (network) time required\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set auto (network) time required\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":277.0,\"x2\":241.0,\"y2\":309.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set auto (network) time required\",\"actionId\":\"c245613d-d45e-4633-a3a2-698124c74099\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set auto (network) time required\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Use network-provided time\",\"actionId\":\"13a9f3e9-f8f2-4948-8b75-ab477c2c623e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Use network-provided time\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"469dad74-a9d8-4a55-95a0-191e3cfb3f51\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"2c61c0e6-266e-46bf-90e1-493ceb4454d3\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"ef95fef1-526e-4bad-8184-80d874c71abd\",\"c245613d-d45e-4633-a3a2-698124c74099\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"13a9f3e9-f8f2-4948-8b75-ab477c2c623e\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"469dad74-a9d8-4a55-95a0-191e3cfb3f51\",\"2c61c0e6-266e-46bf-90e1-493ceb4454d3\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-22-Set auto(network) time required","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.153000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15aa571c-2e4d-43c0-b9c7-07b4f23041c4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15aa571c-2e4d-43c0-b9c7-07b4f23041c4
deleted file mode 100644
index e76da8a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15aa571c-2e4d-43c0-b9c7-07b4f23041c4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"15aa571c-2e4d-43c0-b9c7-07b4f23041c4","details":"{\"type\":\"CompoundAction\",\"name\":\"Set restriction off by turning off the switch bar\",\"actionId\":\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Set restriction off\",\"actionId\":\"70f53c4e-3482-4110-b0c0-50f9e7e999fb\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nif d.resource_id(\\\"com.android.cts.verifier:id/widget_label\\\").right().resource_id(\\\"com.android.cts.verifier:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist():\\n d.resource_id(\\\"com.android.cts.verifier:id/widget_label\\\").right().resource_id(\\\"com.android.cts.verifier:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"70f53c4e-3482-4110-b0c0-50f9e7e999fb\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set restriction off by turning off the switch bar","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.123000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15bf913f-b3ab-4580-aaea-4a8bb50191b1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15bf913f-b3ab-4580-aaea-4a8bb50191b1
deleted file mode 100644
index 1a68179..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15bf913f-b3ab-4580-aaea-4a8bb50191b1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"15bf913f-b3ab-4580-aaea-4a8bb50191b1","details":"{\"type\":\"CompoundAction\",\"name\":\"If Test result alert screen pop up, dismiss it.\",\"actionId\":\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"If test result alert pop up dismiss it.\",\"actionId\":\"161ebaf0-9829-4360-a93f-99940414e740\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/alertTitle\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Test Result\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"953236f4-a913-4452-9c83-df6e2e4d727d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"161ebaf0-9829-4360-a93f-99940414e740\",\"953236f4-a913-4452-9c83-df6e2e4d727d\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"If Test result alert screen pop up, dismiss it.","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.014000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15c75efc-b173-4eed-9a2c-164886355c98 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15c75efc-b173-4eed-9a2c-164886355c98
deleted file mode 100644
index ef76331..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/15c75efc-b173-4eed-9a2c-164886355c98
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"15c75efc-b173-4eed-9a2c-164886355c98","details":"{\"type\":\"CompoundAction\",\"name\":\"Open Notifications status bar\",\"actionId\":\"15c75efc-b173-4eed-9a2c-164886355c98\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Launch notification\",\"actionId\":\"b6058196-0f4f-4a9e-a4e3-650726ae0a42\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"shell cmd statusbar expand-notifications\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"b6058196-0f4f-4a9e-a4e3-650726ae0a42\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open Notifications status bar","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.061000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1601f323-e824-4190-9ee0-350f0a1149ea b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1601f323-e824-4190-9ee0-350f0a1149ea
deleted file mode 100644
index 3171fbd..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1601f323-e824-4190-9ee0-350f0a1149ea
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1601f323-e824-4190-9ee0-350f0a1149ea","details":"{\"type\":\"CompoundAction\",\"name\":\"Dismiss instructions\",\"actionId\":\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-If \\\"OK\\\" button exists, Click to dismiss.\",\"actionId\":\"810a95ec-5eb8-4b8e-8a3c-3b3b7523ec6b\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/button1\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"810a95ec-5eb8-4b8e-8a3c-3b3b7523ec6b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Dismiss instructions","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.994000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/18b49457-9342-4842-aee7-3a76bd7dbedc b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/18b49457-9342-4842-aee7-3a76bd7dbedc
deleted file mode 100644
index d3b4096..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/18b49457-9342-4842-aee7-3a76bd7dbedc
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"18b49457-9342-4842-aee7-3a76bd7dbedc","details":"{\"type\":\"CompoundAction\",\"name\":\"Press Pass on dialog\",\"actionId\":\"18b49457-9342-4842-aee7-3a76bd7dbedc\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button1\",\"actionId\":\"e3a682e0-2695-44df-b0c8-80658216eeb2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"e3a682e0-2695-44df-b0c8-80658216eeb2\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Press Pass on dialog","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.322000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1a737a07-f83f-41f1-8831-ca5c16ce3268 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1a737a07-f83f-41f1-8831-ca5c16ce3268
deleted file mode 100644
index 0450972..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1a737a07-f83f-41f1-8831-ca5c16ce3268
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1a737a07-f83f-41f1-8831-ca5c16ce3268","details":"{\"type\":\"CompoundAction\",\"name\":\"New_14_Open app cross profiles from the personal side\",\"actionId\":\"1a737a07-f83f-41f1-8831-ca5c16ce3268\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Open app cross profiles from the personal side\",\"actionId\":\"5f90c7b8-f6be-417f-9b00-57a22bd3b383\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Open app cross profiles from the personal side\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3b34186f-3c85-4761-9f7c-068543a1c9b6\",\"displayText\":\"Open app cross profiles from the personal side\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Open app cross profiles from the personal side\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":469.0,\"x2\":360.0,\"y2\":513.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":167.0,\"y\":493.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":13.0,\"y\":-2.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"3b34186f-3c85-4761-9f7c-068543a1c9b6\",\"firstText\":\"Open app cross profiles from the personal side\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Open app cross profiles from the personal side\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":481.0,\"x2\":329.0,\"y2\":506.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Open app cross profiles from the personal side\",\"actionId\":\"163dd473-7feb-4a3a-a4af-dfd5d36bd8e0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Open app cross profiles from the personal side\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Personal\",\"actionId\":\"cf37eeed-10e8-455f-a9c0-b1cbd2d9b0ac\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Personal\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"bb8328fe-7638-4bf8-8dd4-6d307cce695b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"},{\"type\":\"ConditionValidationAction\",\"name\":\"You selected the ctsverifier option\",\"actionId\":\"cc699f43-e03d-425b-89ae-5e0db90d2d49\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"You selected the ctsverifier option\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button_finish\",\"actionId\":\"583ebd31-9ffb-4513-89cd-46174f2f3d2a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/button_finish\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work\",\"actionId\":\"cb710bdd-9a8a-457c-8055-60d9cccd5e18\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"3cc0ee10-a7d1-419e-bd19-cc1b491344e2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"},{\"type\":\"ConditionValidationAction\",\"name\":\"You selected the Work option.\",\"actionId\":\"81f219e4-17fa-42b2-b118-0071c7fccbed\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"You selected the Work option.\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button_finish\",\"actionId\":\"d0949c9b-7864-4490-a4f0-e4affa4af1ca\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/button_finish\"}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"5f90c7b8-f6be-417f-9b00-57a22bd3b383\",\"163dd473-7feb-4a3a-a4af-dfd5d36bd8e0\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"cf37eeed-10e8-455f-a9c0-b1cbd2d9b0ac\",\"bb8328fe-7638-4bf8-8dd4-6d307cce695b\",\"cc699f43-e03d-425b-89ae-5e0db90d2d49\",\"583ebd31-9ffb-4513-89cd-46174f2f3d2a\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"cb710bdd-9a8a-457c-8055-60d9cccd5e18\",\"3cc0ee10-a7d1-419e-bd19-cc1b491344e2\",\"81f219e4-17fa-42b2-b118-0071c7fccbed\",\"d0949c9b-7864-4490-a4f0-e4affa4af1ca\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"New_14_Open app cross profiles from the personal side","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.316000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1b93eaf6-4fb7-4295-8288-19b021450557 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1b93eaf6-4fb7-4295-8288-19b021450557
deleted file mode 100644
index 30c23e8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1b93eaf6-4fb7-4295-8288-19b021450557
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1b93eaf6-4fb7-4295-8288-19b021450557","details":"{\"type\":\"CompoundAction\",\"name\":\"Open CTS-V\",\"actionId\":\"1b93eaf6-4fb7-4295-8288-19b021450557\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Open CTS-V\",\"actionId\":\"99f27f3a-d9a8-4491-95d3-f94676973ce1\",\"actionType\":\"COMMAND_LINE_ACTION\",\"createdBy\":\"pololee\",\"commandLine\":\"shell am start -n com.android.cts.verifier/.CtsVerifierActivity\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"99f27f3a-d9a8-4491-95d3-f94676973ce1\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open CTS-V","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.321000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1ba14882-fbe6-4e5f-a753-f3826b8fcbde b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1ba14882-fbe6-4e5f-a753-f3826b8fcbde
deleted file mode 100644
index 74d6b4c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1ba14882-fbe6-4e5f-a753-f3826b8fcbde
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1ba14882-fbe6-4e5f-a753-f3826b8fcbde","details":"{\"type\":\"CompoundAction\",\"name\":\"Close CTS-V\",\"actionId\":\"1ba14882-fbe6-4e5f-a753-f3826b8fcbde\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Close CTS-V\",\"actionId\":\"b1b0eeba-54ea-4691-a258-3dfb3d8800c4\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":100,\"createdBy\":\"pololee\",\"commandLine\":\"shell am force-stop com.android.cts.verifier\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"b1b0eeba-54ea-4691-a258-3dfb3d8800c4\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Close CTS-V","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.321000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1c0d44ff-5ed3-4ea1-b931-f2cb903c504b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1c0d44ff-5ed3-4ea1-b931-f2cb903c504b
deleted file mode 100644
index 8090671..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1c0d44ff-5ed3-4ea1-b931-f2cb903c504b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1c0d44ff-5ed3-4ea1-b931-f2cb903c504b","details":"{\"type\":\"CompoundAction\",\"name\":\"If \\\"Chat using bubble\\\" tips appear dismiss it \",\"actionId\":\"1c0d44ff-5ed3-4ea1-b931-f2cb903c504b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"If Chat using bubbles appear click the bubble again.\",\"actionId\":\"ee3cc818-ad5a-471f-b51c-4fd1eeb67b6d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Chat using bubbles\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"Click bubble again\",\"actionId\":\"e42e6555-3ada-417f-91bd-9c560884e6fe\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/bubble_view\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"ee3cc818-ad5a-471f-b51c-4fd1eeb67b6d\",\"e42e6555-3ada-417f-91bd-9c560884e6fe\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"If \"Chat using bubble\" tips appear dismiss it ","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.227000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1c5b786d-f4e0-44ea-8833-ab551a67815c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1c5b786d-f4e0-44ea-8833-ab551a67815c
deleted file mode 100644
index 976dfa7..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1c5b786d-f4e0-44ea-8833-ab551a67815c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1c5b786d-f4e0-44ea-8833-ab551a67815c","details":"{\"type\":\"CompoundAction\",\"name\":\"Camera Intents-Test 5\",\"actionId\":\"1c5b786d-f4e0-44ea-8833-ab551a67815c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"WaitAction\",\"name\":\"Record 5 secs\",\"actionId\":\"c46741dc-98ac-4e3f-abab-2bd742d2582c\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click done button\",\"actionId\":\"6118b65e-b151-4697-ae32-ab2f448d283f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"$uicd_camera_done\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"$uicd_camera_done\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"$uicd_camera_done\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"740de7a4-51a7-411c-bf5f-424945116764\",\"fde8df69-89b4-42eb-8f6a-d67be2ca8770\",\"c46741dc-98ac-4e3f-abab-2bd742d2582c\",\"3815d172-f8cb-41b5-9bb3-5b3694bebd96\",\"6118b65e-b151-4697-ae32-ab2f448d283f\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_camera=Camera,\\n$uicd_camera_take_photo=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_mode=Video,\\n$uicd_camera_video_record=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_stop=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_done=Done,\"}}","name":"Camera Intents-Test 5","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.012000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1d4b27f3-51f7-4f20-b674-f5a097b6d7d5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1d4b27f3-51f7-4f20-b674-f5a097b6d7d5
deleted file mode 100644
index b92a564..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1d4b27f3-51f7-4f20-b674-f5a097b6d7d5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1d4b27f3-51f7-4f20-b674-f5a097b6d7d5","details":"{\"type\":\"CompoundAction\",\"name\":\"10_Profile-aware app settings(Check image)\",\"actionId\":\"1d4b27f3-51f7-4f20-b674-f5a097b6d7d5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Profile-aware app settings\",\"actionId\":\"a75f3c8a-a605-4d5d-81c1-18449a7dfe2f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Profile-aware app settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a4ed0c52-91d0-48ff-bdc4-d74899104d3c\",\"displayText\":\"Profile-aware app settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Profile-aware app settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":571.6666666666666,\"x2\":360.0,\"y2\":615.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":96.0,\"y\":590.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":84.0,\"y\":3.1666666666666288,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"a4ed0c52-91d0-48ff-bdc4-d74899104d3c\",\"firstText\":\"Profile-aware app settings\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Profile-aware app settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":191.0,\"y1\":600.0,\"x2\":1.0,\"y2\":581.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Profile-aware app settings\",\"actionId\":\"4685bb87-ab14-473d-a9f7-0d7c7a9b0579\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Profile-aware app settings\"},{\"type\":\"ConditionValidationAction\",\"name\":\"App info\",\"actionId\":\"8b106b89-73d3-4da6-8d34-4365cc33250a\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"App info\"}]},\"clickAfterValidation\":false},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"c04071ff-2e83-4fb0-8a26-a9e7f3dd4d10\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work\",\"actionId\":\"ccebb227-487d-48d8-8299-0eda0c54f145\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"b2cf924e-719a-4359-b210-4f78090c81ae\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f460d670-b982-4f28-9b12-33aee384907b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"a75f3c8a-a605-4d5d-81c1-18449a7dfe2f\",\"4685bb87-ab14-473d-a9f7-0d7c7a9b0579\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"8b106b89-73d3-4da6-8d34-4365cc33250a\",\"4aa267cc-73f0-487e-aa22-e57d487ff769\",\"c04071ff-2e83-4fb0-8a26-a9e7f3dd4d10\",\"ccebb227-487d-48d8-8299-0eda0c54f145\",\"b2cf924e-719a-4359-b210-4f78090c81ae\",\"f460d670-b982-4f28-9b12-33aee384907b\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"10_Profile-aware app settings(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.302000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1dd91c68-25ae-4631-8387-ea9aae5957e9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1dd91c68-25ae-4631-8387-ea9aae5957e9
deleted file mode 100644
index 3257672..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1dd91c68-25ae-4631-8387-ea9aae5957e9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1dd91c68-25ae-4631-8387-ea9aae5957e9","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if find myCA.cer on screen\",\"actionId\":\"1dd91c68-25ae-4631-8387-ea9aae5957e9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if find myCA.cer in screen\",\"actionId\":\"ae970413-009a-4127-a5e5-407fd619375e\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"myCA.cer\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"25bec680-dc18-4ff4-b392-635bf2b3486d\",\"displayText\":\"myCA.cer\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d33c6fec-c929-4572-87c7-0449b85887c4\",\"displayText\":\"myCA.cer\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2ea63985-70b2-4c41-adc7-34ad2e9c9da9\",\"displayText\":\"myCA.cer\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"myCA.cer\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":293.25,\"x2\":126.5,\"y2\":312.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.75,\"y\":0.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"myCA.cer\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":293.25,\"x2\":126.5,\"y2\":312.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"myCA.cer\"},{\"uuid\":\"34a685ff-2974-4134-9343-ad1c47787391\",\"displayText\":\"11:43 AM\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"bc736b6e-1fec-4456-82e6-f589c3a8a258\",\"displayText\":\"11:43 AM\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.google.android.documentsui:id/date\",\"text\":\"11:43 AM\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":312.25,\"x2\":145.25,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"11:43 AM\"},{\"uuid\":\"09eff43e-95a6-46cd-8ce5-86708364fb4f\",\"displayText\":\"644 B\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.google.android.documentsui:id/size\",\"text\":\"644 B\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":152.25,\"y1\":312.25,\"x2\":214.0,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"644 B\"},{\"uuid\":\"2a29dee3-dcaf-43c4-82cf-dd21a2e80dc5\",\"displayText\":\"CER file\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.google.android.documentsui:id/file_type\",\"text\":\"CER file\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":221.0,\"y1\":312.25,\"x2\":283.0,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"CER file\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.google.android.documentsui:id/line2\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":312.25,\"x2\":283.0,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"11:43 AM\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":293.25,\"x2\":283.0,\"y2\":326.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":94.0,\"y\":302.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":79.0,\"y\":7.875,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"2ea63985-70b2-4c41-adc7-34ad2e9c9da9\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"myCA.cer\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":57.0,\"y1\":290.0,\"x2\":131.0,\"y2\":314.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Show roots\",\"actionId\":\"dcdf13b6-1485-44e1-8add-4d8ff11d37b1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Show roots\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Downloads\",\"actionId\":\"ed51fc1f-1b2c-4d44-b147-2a870e3c7ba2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Downloads\"}],\"childrenIdList\":[\"ae970413-009a-4127-a5e5-407fd619375e\",\"dcdf13b6-1485-44e1-8add-4d8ff11d37b1\",\"ed51fc1f-1b2c-4d44-b147-2a870e3c7ba2\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if find myCA.cer on screen","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.230000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1e25fe0b-764b-414e-b3e3-e9c11269ad93 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1e25fe0b-764b-414e-b3e3-e9c11269ad93
deleted file mode 100644
index 81e7341..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1e25fe0b-764b-414e-b3e3-e9c11269ad93
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1e25fe0b-764b-414e-b3e3-e9c11269ad93","details":"{\"type\":\"CompoundAction\",\"name\":\"04-Sharing of requested bugreport declined after having been taken\",\"actionId\":\"1e25fe0b-764b-414e-b3e3-e9c11269ad93\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Sharing of requested bugreport declined after having been taken\",\"actionId\":\"e666ee6f-159b-423b-b83c-a721be375c27\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Sharing of requested bugreport declined after having been taken\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Taking bug report\\\" progress bar is present\",\"actionId\":\"33eb97f3-e89d-40b0-b89f-f5f4f62bc278\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Taking bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"WaitAction\",\"name\":\"WAIT 125 secs(Wait for bugreport to be collected)\",\"actionId\":\"8f044e59-ac15-4fa4-9c20-2b72b8d89d3a\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":125000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Taking bug report\\\" progress bar is dismissed\",\"actionId\":\"4896f16c-a703-4c5d-a662-af163d9ae9b9\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Taking bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Your admin requested a bug report to help troubleshoot this device\\\" is shown\",\"actionId\":\"898b372e-8385-4980-96b7-19cf54e1ad9f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Your admin requested a bug report to help troubleshoot this device\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, DECLINE\",\"actionId\":\"b5eb338c-cfaf-442f-9285-e5c552513672\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"DECLINE\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY notification \\\"Share bug report\\\" is dismissed\",\"actionId\":\"f600b0e4-bdcd-47e0-859d-c6ea86e295dc\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Share bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Bugreport sharing declined\\\" is present\",\"actionId\":\"32011541-90c6-433c-87e8-8ff6c6737298\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Bugreport sharing declined\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Dismiss \\\"Bugreport sharing declined\\\"\\\" notification\",\"actionId\":\"28e6b7e3-f8bf-48e8-a697-41383e8fac22\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Bugreport sharing declined\\\").swipe()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"03ca2c4c-7493-4c11-b83c-1e746132376b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"4f3ec13b-589a-4ca3-b456-7224028d0604\",\"e666ee6f-159b-423b-b83c-a721be375c27\",\"4275df2b-8d38-49a9-b956-6d5f06257f5a\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"33eb97f3-e89d-40b0-b89f-f5f4f62bc278\",\"8f044e59-ac15-4fa4-9c20-2b72b8d89d3a\",\"4896f16c-a703-4c5d-a662-af163d9ae9b9\",\"898b372e-8385-4980-96b7-19cf54e1ad9f\",\"b5eb338c-cfaf-442f-9285-e5c552513672\",\"f600b0e4-bdcd-47e0-859d-c6ea86e295dc\",\"32011541-90c6-433c-87e8-8ff6c6737298\",\"28e6b7e3-f8bf-48e8-a697-41383e8fac22\",\"03ca2c4c-7493-4c11-b83c-1e746132376b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"04-Sharing of requested bugreport declined after having been taken","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.075000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1e49e89c-6a23-487a-86d9-a2244d725017 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1e49e89c-6a23-487a-86d9-a2244d725017
deleted file mode 100644
index 40ca3af..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1e49e89c-6a23-487a-86d9-a2244d725017
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1e49e89c-6a23-487a-86d9-a2244d725017","details":"{\"type\":\"CompoundAction\",\"name\":\"Set screen lock to \\\"Swipe\\\"\",\"actionId\":\"1e49e89c-6a23-487a-86d9-a2244d725017\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Swipe\",\"actionId\":\"88a69d07-a683-4a56-b1c6-7ea2e9e434f2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Swipe\"}],\"childrenIdList\":[\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"88a69d07-a683-4a56-b1c6-7ea2e9e434f2\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set screen lock to \"Swipe\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.044000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1ed2536c-bc42-41ff-8528-dea80280c9fd b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1ed2536c-bc42-41ff-8528-dea80280c9fd
deleted file mode 100644
index 7141056..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1ed2536c-bc42-41ff-8528-dea80280c9fd
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1ed2536c-bc42-41ff-8528-dea80280c9fd","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Pass button\",\"actionId\":\"1ed2536c-bc42-41ff-8528-dea80280c9fd\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, pass button\",\"actionId\":\"17974bf9-448a-4b49-873f-bcc28b8ff929\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"17974bf9-448a-4b49-873f-bcc28b8ff929\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Pass button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.231000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1f828567-b1d4-4874-94a1-22d939057e69 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1f828567-b1d4-4874-94a1-22d939057e69
deleted file mode 100644
index 3a6c8d7..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1f828567-b1d4-4874-94a1-22d939057e69
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1f828567-b1d4-4874-94a1-22d939057e69","details":"{\"type\":\"CompoundAction\",\"name\":\"15-07-Disallow config tethering\",\"actionId\":\"1f828567-b1d4-4874-94a1-22d939057e69\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config tethering\",\"actionId\":\"a62b45e6-8c53-4773-90db-eb091a4e40d7\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config tethering\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"985f6426-940b-4a8b-8967-08276d81fb14\",\"displayText\":\"Disallow config tethering\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config tethering\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":343.3333333333333,\"x2\":360.0,\"y2\":387.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":93.0,\"y\":366.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":87.0,\"y\":-1.1666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"985f6426-940b-4a8b-8967-08276d81fb14\",\"firstText\":\"Disallow config tethering\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config tethering\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":355.0,\"x2\":182.0,\"y2\":378.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config tethering\",\"actionId\":\"c17fdd4e-aecb-4ef8-b2ac-0e06dfdb0c91\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config tethering\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Hotspot & tethering\",\"actionId\":\"0f50ff5a-0e82-4e48-af6a-b14aa324e5c5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Hotspot & tethering\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"97c27738-1d85-4238-a5a5-43ea9577619a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c921ba07-1e63-44e3-8b11-b3695d0aa602\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"a62b45e6-8c53-4773-90db-eb091a4e40d7\",\"c17fdd4e-aecb-4ef8-b2ac-0e06dfdb0c91\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"0f50ff5a-0e82-4e48-af6a-b14aa324e5c5\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"97c27738-1d85-4238-a5a5-43ea9577619a\",\"c921ba07-1e63-44e3-8b11-b3695d0aa602\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-07-Disallow config tethering","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.133000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1fe89bff-e8fd-40da-a6b7-e91443c69389 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1fe89bff-e8fd-40da-a6b7-e91443c69389
deleted file mode 100644
index fb53eb6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/1fe89bff-e8fd-40da-a6b7-e91443c69389
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"1fe89bff-e8fd-40da-a6b7-e91443c69389","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify that on the lock screen, you are told the device is managed by \\\"Foo, Inc\\\"\",\"actionId\":\"1fe89bff-e8fd-40da-a6b7-e91443c69389\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Verify that on the lock screen, you are told the device is managed by \\\"Foo, Inc\\\"\",\"actionId\":\"348d8b93-176f-4c15-ae73-9a8aa2956ae1\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"This device belongs to Foo, Inc.\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"348d8b93-176f-4c15-ae73-9a8aa2956ae1\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify that on the lock screen, you are told the device is managed by \"Foo, Inc\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.193000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2090e04a-10af-4fc3-8149-1f22a584eb67 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2090e04a-10af-4fc3-8149-1f22a584eb67
deleted file mode 100644
index e3ace04..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2090e04a-10af-4fc3-8149-1f22a584eb67
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2090e04a-10af-4fc3-8149-1f22a584eb67","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if set PIN or Password screen appear, set password to \\\"1234\\\"\",\"actionId\":\"2090e04a-10af-4fc3-8149-1f22a584eb67\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if set PIN or Set password screen appear\",\"actionId\":\"9f453eab-95c5-4c30-ae23-c87e1c7fd09a\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"For security, set PIN\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"For security, set password\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next button\",\"actionId\":\"49f35f1f-467d-4bf2-a684-47c3d79b030b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm button\",\"actionId\":\"73a41497-bb06-41f5-ac79-c4106cde3873\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"9f453eab-95c5-4c30-ae23-c87e1c7fd09a\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"49f35f1f-467d-4bf2-a684-47c3d79b030b\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"73a41497-bb06-41f5-ac79-c4106cde3873\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if set PIN or Password screen appear, set password to \"1234\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.253000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/21408006-0414-473e-87dd-282a2f4cce97 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/21408006-0414-473e-87dd-282a2f4cce97
deleted file mode 100644
index d660077..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/21408006-0414-473e-87dd-282a2f4cce97
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"21408006-0414-473e-87dd-282a2f4cce97","details":"{\"type\":\"CompoundAction\",\"name\":\"Click OK button\",\"actionId\":\"21408006-0414-473e-87dd-282a2f4cce97\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, OK button\",\"actionId\":\"ff1ccc54-0101-473d-a0a7-02008d028a48\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"ff1ccc54-0101-473d-a0a7-02008d028a48\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click OK button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.259000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2208a8b1-a26d-407b-9780-6d30e4974e13 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2208a8b1-a26d-407b-9780-6d30e4974e13
deleted file mode 100644
index 26ce0b0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2208a8b1-a26d-407b-9780-6d30e4974e13
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2208a8b1-a26d-407b-9780-6d30e4974e13","details":"{\"type\":\"CompoundAction\",\"name\":\"24-Remove device owner\",\"actionId\":\"2208a8b1-a26d-407b-9780-6d30e4974e13\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Remove device owner\",\"actionId\":\"1b8fdc28-12ca-42f3-8f45-d90d3a722bc0\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Remove device owner\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"cdf37268-c08f-47ca-83a2-3795b56830ac\",\"displayText\":\"Remove device owner\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Remove device owner\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":631.0,\"x2\":351.25,\"y2\":673.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":650.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"cdf37268-c08f-47ca-83a2-3795b56830ac\",\"firstText\":\"Remove device owner\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Remove device owner\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":11.0,\"y1\":638.0,\"x2\":173.0,\"y2\":662.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Remove device owner\",\"actionId\":\"6fa569d0-d364-4731-babe-b07e7e114610\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Remove device owner\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Remove device owner\",\"actionId\":\"fcf83aab-1c23-4294-94e3-d5cef10580c0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Remove device owner\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"df4a1b00-e055-4925-a835-a87eca799f8a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"1b8fdc28-12ca-42f3-8f45-d90d3a722bc0\",\"6fa569d0-d364-4731-babe-b07e7e114610\",\"fcf83aab-1c23-4294-94e3-d5cef10580c0\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"df4a1b00-e055-4925-a835-a87eca799f8a\",\"4c401ff4-c80e-44d8-b94c-819dc1366093\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"24-Remove device owner","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.214000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/238c6d52-12d8-4d83-ae19-c703bcc6ec24 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/238c6d52-12d8-4d83-ae19-c703bcc6ec24
deleted file mode 100644
index b6e6157..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/238c6d52-12d8-4d83-ae19-c703bcc6ec24
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"238c6d52-12d8-4d83-ae19-c703bcc6ec24","details":"{\"type\":\"CompoundAction\",\"name\":\"15-28 & 17-06-13-Set permitted input methods\",\"actionId\":\"238c6d52-12d8-4d83-ae19-c703bcc6ec24\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Set permitted input methods\",\"actionId\":\"598cee73-f55c-406b-a47c-9a7d6280e299\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set permitted input methods\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a23c553f-cd73-4704-a0c6-8f1228826f21\",\"displayText\":\"Set permitted input methods\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Set permitted input methods\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":597.75,\"x2\":360.0,\"y2\":639.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":110.0,\"y\":619.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":70.0,\"y\":-0.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"a23c553f-cd73-4704-a0c6-8f1228826f21\",\"firstText\":\"Set permitted input methods\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set permitted input methods\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":607.0,\"x2\":218.0,\"y2\":631.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set permitted input methods\",\"actionId\":\"1bc06881-a4b5-44fb-aba2-f853397c6504\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set permitted input methods\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Dummy input method\",\"actionId\":\"068b7f82-0f8e-4565-8d49-5208872d629e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Dummy input method\"}],\"childrenIdList\":[\"598cee73-f55c-406b-a47c-9a7d6280e299\",\"1bc06881-a4b5-44fb-aba2-f853397c6504\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"72a6fa67-df5f-4c18-849a-8212e749417e\",\"068b7f82-0f8e-4565-8d49-5208872d629e\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"b50df53e-f816-49d2-b907-500f3f4f3b5a\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-28 & 17-06-13-Set permitted input methods","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.163000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/23c5fa74-3416-4a41-84a9-3f348940a081 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/23c5fa74-3416-4a41-84a9-3f348940a081
deleted file mode 100644
index 7e23697..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/23c5fa74-3416-4a41-84a9-3f348940a081
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"23c5fa74-3416-4a41-84a9-3f348940a081","details":"{\"type\":\"CompoundAction\",\"name\":\"Login Gmail\",\"actionId\":\"23c5fa74-3416-4a41-84a9-3f348940a081\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"If device doesn't login gmail, login one\",\"actionId\":\"43f39f90-af04-41bd-9598-2dca88842e3e\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Sign in\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"25923476-f58d-4a0b-884e-a07213f7878a\",\"displayText\":\"Sign in\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.vending:id/0_resource_name_obfuscated\",\"text\":\"Sign in\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":127.33333333333333,\"y1\":506.3333333333333,\"x2\":232.33333333333334,\"y2\":538.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":176.5,\"y\":523.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":3.333333333333343,\"y\":-0.8333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"25923476-f58d-4a0b-884e-a07213f7878a\",\"firstText\":\"Sign in\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Sign in\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":147.0,\"y1\":507.0,\"x2\":206.0,\"y2\":539.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Sign in\",\"actionId\":\"93b326a5-dfaf-4b2d-a1b1-77accff4549c\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Sign in\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 10 secs for login in screen appear\",\"actionId\":\"262b0041-1b7f-4693-8234-e77e477e0d26\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"43f19b3e-4148-4f62-a12b-8561389b41b2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click the email input field\",\"actionId\":\"8e355a8c-a088-47cb-a072-41db7986fc74\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"class\",\"operator\":\"=\",\"value\":\"android.widget.EditText\"},{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"identifierId\"}]},\"clickAfterValidation\":true},{\"type\":\"InputAction\",\"name\":\"INPUT Gmail account\",\"actionId\":\"000d4e9d-a5a0-4bb4-b2a8-60cf01d5f8fc\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"$uicd_Gmail_account\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"6903c0ac-4e5a-4c3b-a900-3af7169bc5e1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 10 secs for password field appear\",\"actionId\":\"9a41b29c-8a6b-4136-badf-8bc4ef2b84b4\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\"},{\"type\":\"InputAction\",\"name\":\"INPUT Gmail password\",\"actionId\":\"e9a48a59-75a7-4b27-bcd9-2b296d480d1b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"$uicd_Gmail_account_password\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"60f49553-3897-49e4-86c4-abe876f83a2c\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click I agree button\",\"actionId\":\"ff40112a-1ad5-4a0b-bab6-76f46c290cbd\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"signinconsentNext\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"I agree\"}]},\"clickAfterValidation\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 15 secs for gmail login\",\"actionId\":\"3ec0e582-5e05-4692-a3ab-b7e8b3db8a85\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"riacheltseng\"}],\"childrenIdList\":[\"43f39f90-af04-41bd-9598-2dca88842e3e\",\"93b326a5-dfaf-4b2d-a1b1-77accff4549c\",\"262b0041-1b7f-4693-8234-e77e477e0d26\",\"43f19b3e-4148-4f62-a12b-8561389b41b2\",\"8e355a8c-a088-47cb-a072-41db7986fc74\",\"000d4e9d-a5a0-4bb4-b2a8-60cf01d5f8fc\",\"6903c0ac-4e5a-4c3b-a900-3af7169bc5e1\",\"9a41b29c-8a6b-4136-badf-8bc4ef2b84b4\",\"e9a48a59-75a7-4b27-bcd9-2b296d480d1b\",\"60f49553-3897-49e4-86c4-abe876f83a2c\",\"ff40112a-1ad5-4a0b-bab6-76f46c290cbd\",\"3ec0e582-5e05-4692-a3ab-b7e8b3db8a85\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_Gmail_account=playinstallapk02@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\"}}","name":"Login Gmail","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.138000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2468d1f3-142c-41da-b713-09b253fe81f6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2468d1f3-142c-41da-b713-09b253fe81f6
deleted file mode 100644
index bc013e7..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2468d1f3-142c-41da-b713-09b253fe81f6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2468d1f3-142c-41da-b713-09b253fe81f6","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn Auto-rotate off\",\"actionId\":\"2468d1f3-142c-41da-b713-09b253fe81f6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Turn Auto-rotate off\",\"actionId\":\"94d342c8-146c-4dd8-ab5a-e0e4c41c95bc\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell settings put system accelerometer_rotation 0\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"94d342c8-146c-4dd8-ab5a-e0e4c41c95bc\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn Auto-rotate off","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.272000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/24c45902-8535-4376-b06f-88f06b115ca6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/24c45902-8535-4376-b06f-88f06b115ca6
deleted file mode 100644
index 45e6124..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/24c45902-8535-4376-b06f-88f06b115ca6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"24c45902-8535-4376-b06f-88f06b115ca6","details":"{\"type\":\"CompoundAction\",\"name\":\"test_System Implements Telecom Intents\",\"actionId\":\"24c45902-8535-4376-b06f-88f06b115ca6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to \\\"System Implements Telecom Intents\\\"\",\"actionId\":\"9b46aacf-74c6-465e-bc72-3bb6956a0813\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"System Implements Telecom Intents\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"944f69c0-a365-4cf0-9184-cce85ec7463e\",\"displayText\":\"System Implements Telecom Intents\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"System Implements Telecom Intents\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":526.6666666666666,\"x2\":350.6666666666667,\"y2\":570.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":135.0,\"y\":550.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":45.0,\"y\":-1.3333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"944f69c0-a365-4cf0-9184-cce85ec7463e\",\"firstText\":\"System Implements Telecom Intents\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"System Implements Telecom Intents\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":536.0,\"x2\":260.0,\"y2\":564.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, System Implements Telecom Intents\",\"actionId\":\"e14fde88-70be-4936-b9f7-c7b6fbeeb737\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"System Implements Telecom Intents\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialer_telecom_intents_call_settings\",\"actionId\":\"becda08b-0f75-44ba-b7f6-5679d51bc7d9\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/dialer_telecom_intents_call_settings\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Check if \\\"call settings\\\" exists\",\"actionId\":\"6b8768ce-c922-4e3b-b7f6-00dcc2f374fd\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Call settings\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"944f0329-7a72-4d00-9af7-b52afe4681f4\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialer_telecom_intents_call_settings_check_box\",\"actionId\":\"2a674f03-2e12-439e-bbe2-a7ad2d332df5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/dialer_telecom_intents_call_settings_check_box\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialer_telecom_intents_short_sms\",\"actionId\":\"199eda30-0094-4f90-8b06-dfaa325ab59d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/dialer_telecom_intents_short_sms\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Check if \\\"short sms answer settings\\\" exists\",\"actionId\":\"d57b5d5d-cc96-4790-8fa6-3f1d376e6733\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Edit quick responses\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f5b49123-d91e-4b7c-b5c3-87ed17511b82\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialer_telecom_intents_short_sms_check_box\",\"actionId\":\"a7745177-dc5e-4c75-97cf-35cd233dd694\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/dialer_telecom_intents_short_sms_check_box\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialer_telecom_intents_calling_accounts\",\"actionId\":\"e6bf15e0-d462-4a53-9d74-9c7c6e4d809e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/dialer_telecom_intents_calling_accounts\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Check if \\\"calling accounts settings\\\"\",\"actionId\":\"89c55858-5755-43aa-b923-2f06c9de79b5\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Calling accounts\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"d37a2265-f4d4-4836-9f94-f8a189327ba8\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialer_telecom_intents_calling_accounts_check_box\",\"actionId\":\"60d1b49a-c29d-4c6d-b585-3538a0a8aa98\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/dialer_telecom_intents_calling_accounts_check_box\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to \\\"Launch accessibility settings\\\"\",\"actionId\":\"2e226b60-0748-4ddc-9c57-cd39ce0432f7\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Launch accessibility settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e37dc367-1dd2-4cba-bb3f-2eca1767bd39\",\"displayText\":\"Launch accessibility settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"905e119c-ed81-4828-9d8b-d58b4453932f\",\"displayText\":\"Launch accessibility settings\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.cts.verifier:id/dialer_telecom_intents_accessibility_settings\",\"text\":\"Launch accessibility settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":576.0,\"x2\":204.33333333333334,\"y2\":620.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.166666666666657,\"y\":-3.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Launch accessibility settings\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":576.0,\"x2\":204.33333333333334,\"y2\":620.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":109.0,\"y\":601.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.166666666666657,\"y\":-3.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"905e119c-ed81-4828-9d8b-d58b4453932f\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Launch accessibility settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":17.0,\"y1\":589.0,\"x2\":201.0,\"y2\":614.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialer_telecom_intents_accessibility_settings\",\"actionId\":\"7d59d625-d65a-4c25-9f67-52f73f2855b5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/dialer_telecom_intents_accessibility_settings\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Check if \\\"accessibility settings\\\" exists\",\"actionId\":\"c81996b6-ea53-42c6-84f8-f8248b8d0c41\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Accessibility\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"8457afe0-f61a-404d-a540-540eed8f6967\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialer_telecom_intents_accessibility_settings_check_box\",\"actionId\":\"54c41f42-e372-43aa-ae71-cb2d0e03df50\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/dialer_telecom_intents_accessibility_settings_check_box\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"b50e5fad-7d50-4799-b640-1a31b7c4402a\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"9b46aacf-74c6-465e-bc72-3bb6956a0813\",\"e14fde88-70be-4936-b9f7-c7b6fbeeb737\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"becda08b-0f75-44ba-b7f6-5679d51bc7d9\",\"6b8768ce-c922-4e3b-b7f6-00dcc2f374fd\",\"944f0329-7a72-4d00-9af7-b52afe4681f4\",\"2a674f03-2e12-439e-bbe2-a7ad2d332df5\",\"199eda30-0094-4f90-8b06-dfaa325ab59d\",\"d57b5d5d-cc96-4790-8fa6-3f1d376e6733\",\"f5b49123-d91e-4b7c-b5c3-87ed17511b82\",\"a7745177-dc5e-4c75-97cf-35cd233dd694\",\"e6bf15e0-d462-4a53-9d74-9c7c6e4d809e\",\"89c55858-5755-43aa-b923-2f06c9de79b5\",\"d37a2265-f4d4-4836-9f94-f8a189327ba8\",\"60d1b49a-c29d-4c6d-b585-3538a0a8aa98\",\"2e226b60-0748-4ddc-9c57-cd39ce0432f7\",\"7d59d625-d65a-4c25-9f67-52f73f2855b5\",\"c81996b6-ea53-42c6-84f8-f8248b8d0c41\",\"8457afe0-f61a-404d-a540-540eed8f6967\",\"54c41f42-e372-43aa-ae71-cb2d0e03df50\",\"b50e5fad-7d50-4799-b640-1a31b7c4402a\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_null=null,\"}}","name":"test_System Implements Telecom Intents","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.284000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/24e3e587-1271-4917-a395-3feff520ca73 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/24e3e587-1271-4917-a395-3feff520ca73
deleted file mode 100644
index f4085be..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/24e3e587-1271-4917-a395-3feff520ca73
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"24e3e587-1271-4917-a395-3feff520ca73","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Device Admin Tapjacking Test\",\"actionId\":\"24e3e587-1271-4917-a395-3feff520ca73\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Device Admin Tapjacking Test\",\"actionId\":\"76c72c4e-c28d-4b25-b0fd-a698e62989d5\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device Admin Tapjacking Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0d232d2f-1779-455f-a305-a9046ba58e10\",\"displayText\":\"Device Admin Tapjacking Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Device Admin Tapjacking Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":486.5,\"x2\":351.25,\"y2\":528.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":107.5,\"y\":511.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":72.5,\"y\":-3.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"0d232d2f-1779-455f-a305-a9046ba58e10\",\"firstText\":\"Device Admin Tapjacking Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device Admin Tapjacking Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":11.0,\"y1\":493.0,\"x2\":204.0,\"y2\":529.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Device Admin Tapjacking Test\",\"actionId\":\"e5638830-a156-448e-aa8b-713cbec5beab\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device Admin Tapjacking Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/enable_admin_overlay_button\",\"actionId\":\"68ec272f-e484-4cf3-8a63-527adf530141\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/enable_admin_overlay_button\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 5 secs\",\"actionId\":\"2550d0fb-a1b7-4693-9312-0c90261d10a4\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"pololee\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify overlaying transparent activity to show up\",\"actionId\":\"c912ca79-f89c-4881-ba60-04ddfafe59e5\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8a7106cc-5f58-4689-b6a0-cf4662c80a0b\",\"displayText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"9dd6e3cf-d393-41b0-992d-c2ea7407af9e\",\"displayText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"23e1e52d-ddb4-4846-8dc4-18656525edd7\",\"displayText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a84eb9eb-fa2a-4ead-a7b1-14d6b73fc95f\",\"displayText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d8786c8d-3a73-4278-9882-d979f137b425\",\"displayText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":47.0,\"y1\":341.5,\"x2\":313.0,\"y2\":400.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":16.0,\"y\":17.625,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":40.0,\"y1\":334.5,\"x2\":320.0,\"y2\":407.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":40.0,\"y1\":334.5,\"x2\":320.0,\"y2\":407.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":40.0,\"y1\":334.5,\"x2\":320.0,\"y2\":407.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":40.0,\"y1\":334.5,\"x2\":320.0,\"y2\":407.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":164.0,\"y\":353.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":16.0,\"y\":17.625,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"d8786c8d-3a73-4278-9882-d979f137b425\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This activity attempts to tapjack the activity below.\\n Any security sensitive controls below should not respond to taps as long as this activity is visible.\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":40.0,\"y1\":342.0,\"x2\":288.0,\"y2\":365.0}},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY Activate button is disabled\",\"actionId\":\"74c89e66-56df-4285-826a-86ff4994b3b2\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.settings:id/action_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"0dd8de76-fa3c-4db9-b327-041d480f5236\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"590212a9-b7c0-41cb-a5b2-b59d126f888d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"76c72c4e-c28d-4b25-b0fd-a698e62989d5\",\"e5638830-a156-448e-aa8b-713cbec5beab\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"68ec272f-e484-4cf3-8a63-527adf530141\",\"2550d0fb-a1b7-4693-9312-0c90261d10a4\",\"c912ca79-f89c-4881-ba60-04ddfafe59e5\",\"74c89e66-56df-4285-826a-86ff4994b3b2\",\"0dd8de76-fa3c-4db9-b327-041d480f5236\",\"590212a9-b7c0-41cb-a5b2-b59d126f888d\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_CtsEmptyDeviceAdmin_apk_path=/home/riacheltseng/Documents/rvc_release/android-cts-verifier/CtsEmptyDeviceAdmin.apk\"}}","name":"test_Device Admin Tapjacking Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.047000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/26e141bc-1cb7-4228-865c-40de24919e2d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/26e141bc-1cb7-4228-865c-40de24919e2d
deleted file mode 100644
index bc57864..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/26e141bc-1cb7-4228-865c-40de24919e2d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"26e141bc-1cb7-4228-865c-40de24919e2d","details":"{\"type\":\"CompoundAction\",\"name\":\"Camera Intents-Test 2\",\"actionId\":\"26e141bc-1cb7-4228-865c-40de24919e2d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"Home Button\",\"actionId\":\"889f4ddd-8f57-4ab0-ba84-71616f7d4b8c\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":3,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ConditionValidationAction\",\"name\":\"Select video mode\",\"actionId\":\"b232592e-16f6-4d45-9008-928740d58d3c\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_mode\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_mode\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_mode\"}]},\"clickAfterValidation\":true},{\"type\":\"WaitAction\",\"name\":\"Record 5 secs\",\"actionId\":\"782e2d2f-672e-4b37-afad-b9fa7ac2acbd\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"riacheltseng\"}],\"childrenIdList\":[\"740de7a4-51a7-411c-bf5f-424945116764\",\"889f4ddd-8f57-4ab0-ba84-71616f7d4b8c\",\"b40e7a89-24b7-4cf7-8942-4733b0536edc\",\"b232592e-16f6-4d45-9008-928740d58d3c\",\"fde8df69-89b4-42eb-8f6a-d67be2ca8770\",\"782e2d2f-672e-4b37-afad-b9fa7ac2acbd\",\"3815d172-f8cb-41b5-9bb3-5b3694bebd96\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_camera=Camera,\\n$uicd_camera_take_photo=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_mode=Video,\\n$uicd_camera_video_record=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_stop=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_done=Done,\"}}","name":"Camera Intents-Test 2","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.011000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/26f26923-eb98-45dd-9343-9a2626768de5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/26f26923-eb98-45dd-9343-9a2626768de5
deleted file mode 100644
index 739bb34..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/26f26923-eb98-45dd-9343-9a2626768de5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"26f26923-eb98-45dd-9343-9a2626768de5","details":"{\"type\":\"CompoundAction\",\"name\":\"Start CTS-V\",\"actionId\":\"26f26923-eb98-45dd-9343-9a2626768de5\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"childrenActions\":[],\"childrenIdList\":[\"1ba14882-fbe6-4e5f-a753-f3826b8fcbde\",\"1b93eaf6-4fb7-4295-8288-19b021450557\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Start CTS-V","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.320000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2776b178-6e89-4fea-9f72-a7733427ef39 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2776b178-6e89-4fea-9f72-a7733427ef39
deleted file mode 100644
index c1b331d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2776b178-6e89-4fea-9f72-a7733427ef39
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2776b178-6e89-4fea-9f72-a7733427ef39","details":"{\"type\":\"CompoundAction\",\"name\":\"16-12-Global HTTP Proxy\",\"actionId\":\"2776b178-6e89-4fea-9f72-a7733427ef39\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Global HTTP Proxy\",\"actionId\":\"fbd28982-ab34-41b7-8023-4f364aa3958f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Global HTTP Proxy\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"94caf697-d26c-4b61-adc2-4b22e2ed9a81\",\"displayText\":\"Global HTTP Proxy\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Global HTTP Proxy\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":579.0,\"x2\":351.3333333333333,\"y2\":621.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":74.0,\"y\":599.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":106.0,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"94caf697-d26c-4b61-adc2-4b22e2ed9a81\",\"firstText\":\"Global HTTP Proxy\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Global HTTP Proxy\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":13.0,\"y1\":589.0,\"x2\":135.0,\"y2\":609.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Global HTTP Proxy\",\"actionId\":\"e2f637a1-cd00-45cf-9799-7ba7c2096714\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Global HTTP Proxy\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told that a global HTTP proxy has been set\",\"actionId\":\"d21692c6-7b26-44c7-87f4-fa17f9119b84\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Global HTTP proxy set\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f9234ae3-e5d3-45c0-be01-72978fd7b00b\",\"displayText\":\"Global HTTP proxy set\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"dde25d0e-7124-493a-8bbb-b2be67265d60\",\"displayText\":\"Global HTTP proxy set\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a17a7e79-253b-4bd7-bc46-c7b5d0c2f599\",\"displayText\":\"Global HTTP proxy set\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Global HTTP proxy set\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":415.6666666666667,\"x2\":202.33333333333334,\"y2\":434.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-8.833333333333314,\"y\":1.1666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Global HTTP proxy set\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":401.6666666666667,\"x2\":346.0,\"y2\":448.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Global HTTP proxy set\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":401.6666666666667,\"x2\":360.0,\"y2\":448.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":141.5,\"y\":424.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":38.5,\"y\":1.1666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"a17a7e79-253b-4bd7-bc46-c7b5d0c2f599\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Global HTTP proxy set\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":55.0,\"y1\":414.0,\"x2\":228.0,\"y2\":434.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"0679ed00-2aff-4165-a097-1199ae322c03\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Proxy\",\"actionId\":\"ee38e996-cf72-4ba2-a5e9-e43d2d143e1a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set Proxy\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told that a global HTTP proxy has been set\",\"actionId\":\"eef967b8-73da-40b1-bbfe-05632c1b172e\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Global HTTP proxy set\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"40e8ba31-67e5-4e1f-8b64-277ed6862fde\",\"displayText\":\"Global HTTP proxy set\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f74c971b-002a-42a7-ab40-da86c85fcb94\",\"displayText\":\"Global HTTP proxy set\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6a8c6962-c3c9-417e-a0e3-c5bb5d0e4a30\",\"displayText\":\"Global HTTP proxy set\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Global HTTP proxy set\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":415.6666666666667,\"x2\":202.33333333333334,\"y2\":434.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.16666666666668561,\"y\":2.6666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Global HTTP proxy set\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":401.6666666666667,\"x2\":346.0,\"y2\":448.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Global HTTP proxy set\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":401.6666666666667,\"x2\":360.0,\"y2\":448.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":132.5,\"y\":422.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":47.5,\"y\":2.6666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"6a8c6962-c3c9-417e-a0e3-c5bb5d0e4a30\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Global HTTP proxy set\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":53.0,\"y1\":407.0,\"x2\":212.0,\"y2\":438.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7c090c6b-a6d5-414f-803c-5bfa71af2a0a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Clear Proxy\",\"actionId\":\"b7081d9c-3acf-455f-826e-a63c3dd09ea6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Clear Proxy\"}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"fbd28982-ab34-41b7-8023-4f364aa3958f\",\"e2f637a1-cd00-45cf-9799-7ba7c2096714\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"d21692c6-7b26-44c7-87f4-fa17f9119b84\",\"0679ed00-2aff-4165-a097-1199ae322c03\",\"ee38e996-cf72-4ba2-a5e9-e43d2d143e1a\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"eef967b8-73da-40b1-bbfe-05632c1b172e\",\"7c090c6b-a6d5-414f-803c-5bfa71af2a0a\",\"b7081d9c-3acf-455f-826e-a63c3dd09ea6\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-12-Global HTTP Proxy","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.186000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/27b9a87d-9b7b-4f55-a259-45a91ee67a64 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/27b9a87d-9b7b-4f55-a259-45a91ee67a64
deleted file mode 100644
index 8ceb321..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/27b9a87d-9b7b-4f55-a259-45a91ee67a64
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"27b9a87d-9b7b-4f55-a259-45a91ee67a64","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Continue without Pixel Imprint or Continue without face unlock\",\"actionId\":\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Click Continue without Pixel Imprint or Continue without face unlock\",\"actionId\":\"291767d2-2b12-4d24-9736-38d60ea1dac7\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Continue without face unlock\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Continue without Pixel Imprint\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"291767d2-2b12-4d24-9736-38d60ea1dac7\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Continue without Pixel Imprint or Continue without face unlock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.252000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/29474691-30f5-4d1c-a1ac-afe0beb0e971 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/29474691-30f5-4d1c-a1ac-afe0beb0e971
deleted file mode 100644
index 497c0ad..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/29474691-30f5-4d1c-a1ac-afe0beb0e971
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"29474691-30f5-4d1c-a1ac-afe0beb0e971","details":"{\"type\":\"CompoundAction\",\"name\":\"Camera Intents-Test 3 and 4\",\"actionId\":\"29474691-30f5-4d1c-a1ac-afe0beb0e971\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Click Done\",\"actionId\":\"9d02ef24-a94b-4f69-9045-1d9ea7cf380d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"$uicd_camera_done\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"$uicd_camera_done\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"$uicd_camera_done\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"740de7a4-51a7-411c-bf5f-424945116764\",\"b1c2250d-2c83-4698-8e4f-e80b296153d9\",\"9d02ef24-a94b-4f69-9045-1d9ea7cf380d\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_camera=Camera,\\n$uicd_camera_take_photo=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_mode=Video,\\n$uicd_camera_video_record=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_stop=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_done=Done,\"}}","name":"Camera Intents-Test 3 and 4","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.011000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2a9185e5-a104-4479-8a5f-8d13ebe742e5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2a9185e5-a104-4479-8a5f-8d13ebe742e5
deleted file mode 100644
index ea9c407..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2a9185e5-a104-4479-8a5f-8d13ebe742e5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2a9185e5-a104-4479-8a5f-8d13ebe742e5","details":"{\"type\":\"CompoundAction\",\"name\":\"Close Settings\",\"actionId\":\"2a9185e5-a104-4479-8a5f-8d13ebe742e5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Force close settings\",\"actionId\":\"daffa60b-244e-4277-a358-024ad6029bca\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell am force-stop com.android.settings\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"daffa60b-244e-4277-a358-024ad6029bca\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Close Settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.320000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2abe83e3-a05c-4599-9007-3efbabf97020 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2abe83e3-a05c-4599-9007-3efbabf97020
deleted file mode 100644
index c7ca386..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2abe83e3-a05c-4599-9007-3efbabf97020
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2abe83e3-a05c-4599-9007-3efbabf97020","details":"{\"type\":\"CompoundAction\",\"name\":\"Click I'm done\",\"actionId\":\"2abe83e3-a05c-4599-9007-3efbabf97020\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Click I'm done\",\"actionId\":\"4ade1b3d-a4df-4dee-89e9-5d50d7fa01de\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/nls_action_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"4ade1b3d-a4df-4dee-89e9-5d50d7fa01de\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click I'm done","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.976000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2b20f950-6cf8-4040-93c8-a51819425441 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2b20f950-6cf8-4040-93c8-a51819425441
deleted file mode 100644
index f668185..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2b20f950-6cf8-4040-93c8-a51819425441
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2b20f950-6cf8-4040-93c8-a51819425441","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify that not allowed message of PIN lock\",\"actionId\":\"2b20f950-6cf8-4040-93c8-a51819425441\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"If Set PIN appear, verify the now allowed message should be appear\",\"actionId\":\"565abbc0-48d2-4b4d-aaa1-b30f86c7b507\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"For security, set PIN\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c55ea096-e8b6-440c-bbaf-37145d079609\",\"displayText\":\"For security, set PIN\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/sud_layout_description\",\"text\":\"For security, set PIN\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":172.0,\"x2\":339.0,\"y2\":211.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":178.5,\"y\":182.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":1.5,\"y\":9.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"c55ea096-e8b6-440c-bbaf-37145d079609\",\"firstText\":\"For security, set PIN\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"For security, set PIN\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":116.0,\"y1\":174.0,\"x2\":241.0,\"y2\":190.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the message -Ascending, descending, or repeated sequence of digits isn't allowed\",\"actionId\":\"ecc5c556-0de8-46a2-a189-c8c7e4fd22f2\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Ascending, descending, or repeated sequence of digits isn't allowed\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6fed02fd-7d65-4593-9dd3-ebb114f66d80\",\"displayText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"e7f3d72e-9cdf-4ee8-a36d-5b959280c73c\",\"displayText\":\"PIN must be at least 8 digits\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/description_text\",\"text\":\"PIN must be at least 8 digits\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":291.6666666666667,\"x2\":339.0,\"y2\":308.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"PIN must be at least 8 digits\"},{\"uuid\":\"412e1163-1fc1-4bf4-b4c3-aa8f7a0e03c5\",\"displayText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/description_text\",\"text\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":308.6666666666667,\"x2\":339.0,\"y2\":340.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.0,\"y\":0.8333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\"}],\"className\":\"androidx.recyclerview.widget.RecyclerView\",\"resourceId\":\"com.android.settings:id/password_requirements_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":291.6666666666667,\"x2\":339.0,\"y2\":340.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":178.0,\"y\":323.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":2.0,\"y\":-7.666666666666629,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"412e1163-1fc1-4bf4-b4c3-aa8f7a0e03c5\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":16.0,\"y1\":308.0,\"x2\":340.0,\"y2\":339.0}}],\"childrenIdList\":[\"565abbc0-48d2-4b4d-aaa1-b30f86c7b507\",\"ecc5c556-0de8-46a2-a189-c8c7e4fd22f2\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify that not allowed message of PIN lock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.262000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2c04124a-9437-4127-9146-c1830d875dcb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2c04124a-9437-4127-9146-c1830d875dcb
deleted file mode 100644
index 143a4b6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2c04124a-9437-4127-9146-c1830d875dcb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2c04124a-9437-4127-9146-c1830d875dcb","details":"{\"type\":\"CompoundAction\",\"name\":\"10-Disable status bar\",\"actionId\":\"2c04124a-9437-4127-9146-c1830d875dcb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"7ba82511-7b81-415f-81d7-ce2a5c969a50\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"10-Disable status bar","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.103000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2c2679b8-694c-4f76-9e68-e769699ab06a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2c2679b8-694c-4f76-9e68-e769699ab06a
deleted file mode 100644
index eb8633f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2c2679b8-694c-4f76-9e68-e769699ab06a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2c2679b8-694c-4f76-9e68-e769699ab06a","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if set PIN screen appear, set PIN to \\\"1688\\\"\",\"actionId\":\"2c2679b8-694c-4f76-9e68-e769699ab06a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Set PIN screen appear\",\"actionId\":\"ce6c21a1-8944-4b47-8270-2da63d6a5f03\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"For security, set PIN\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8855a111-62eb-4dbc-a755-176f43c6584c\",\"displayText\":\"For security, set PIN\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/sud_layout_description\",\"text\":\"For security, set PIN\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":172.0,\"x2\":339.0,\"y2\":211.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":186.0,\"y\":185.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.0,\"y\":6.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"8855a111-62eb-4dbc-a755-176f43c6584c\",\"firstText\":\"For security, set PIN\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"For security, set PIN\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":108.0,\"y1\":174.0,\"x2\":264.0,\"y2\":196.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"bfc20865-53be-4948-8954-fa6911c92666\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm\",\"actionId\":\"e17d7e6b-6549-479b-89a7-7fee4619abfb\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"ce6c21a1-8944-4b47-8270-2da63d6a5f03\",\"8373f761-9983-4688-b193-59c4bc7a9bd3\",\"bfc20865-53be-4948-8954-fa6911c92666\",\"8373f761-9983-4688-b193-59c4bc7a9bd3\",\"e17d7e6b-6549-479b-89a7-7fee4619abfb\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if set PIN screen appear, set PIN to \"1688\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.267000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2dad0955-cdab-4973-bd4f-b46db4fe4534 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2dad0955-cdab-4973-bd4f-b46db4fe4534
deleted file mode 100644
index 448d4ca..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2dad0955-cdab-4973-bd4f-b46db4fe4534
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2dad0955-cdab-4973-bd4f-b46db4fe4534","details":"{\"type\":\"CompoundAction\",\"name\":\"Open Settings\",\"actionId\":\"2dad0955-cdab-4973-bd4f-b46db4fe4534\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Open Settings\",\"actionId\":\"7aa6e15a-b9a3-4698-98f5-f4b54512f4f0\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell am start -n com.android.settings/.Settings\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"2a9185e5-a104-4479-8a5f-8d13ebe742e5\",\"7aa6e15a-b9a3-4698-98f5-f4b54512f4f0\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open Settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.319000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2fb8a428-0ad6-4d59-a36e-8ba24663af7b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2fb8a428-0ad6-4d59-a36e-8ba24663af7b
deleted file mode 100644
index a3567a2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/2fb8a428-0ad6-4d59-a36e-8ba24663af7b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"2fb8a428-0ad6-4d59-a36e-8ba24663af7b","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Done button if need\",\"actionId\":\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionClickAction\",\"name\":\"Click Done button if need\",\"actionId\":\"abb128bb-7a45-4fa0-998c-c57745253dc1\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Done\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"de31d248-fa31-4a18-8978-ec99e650802f\",\"displayText\":\"Done\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"06a80898-6010-4f65-8428-69b504b6d9c3\",\"displayText\":\"Done\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"text\":\"Done\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":265.3333333333333,\"y1\":685.3333333333334,\"x2\":342.3333333333333,\"y2\":727.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.8333333333333144,\"y\":-2.6666666666666288,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Done\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":675.0,\"x2\":360.0,\"y2\":738.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":302.0,\"y\":709.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-122.0,\"y\":-2.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"06a80898-6010-4f65-8428-69b504b6d9c3\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Done\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":273.0,\"y1\":695.0,\"x2\":331.0,\"y2\":723.0}}],\"childrenIdList\":[\"abb128bb-7a45-4fa0-998c-c57745253dc1\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Done button if need","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.038000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/31902e22-dd19-4a14-9a1f-5bca034bacd5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/31902e22-dd19-4a14-9a1f-5bca034bacd5
deleted file mode 100644
index cebadf2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/31902e22-dd19-4a14-9a1f-5bca034bacd5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"31902e22-dd19-4a14-9a1f-5bca034bacd5","details":"{\"type\":\"CompoundAction\",\"name\":\"Collapse status bar\",\"actionId\":\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Collapse status bar\",\"actionId\":\"39a25d91-d0e8-4527-9fc3-035b8310cf08\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell cmd statusbar collapse\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"39a25d91-d0e8-4527-9fc3-035b8310cf08\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Collapse status bar","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.104000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/31d97492-1de9-41be-8213-c67eb06406b1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/31d97492-1de9-41be-8213-c67eb06406b1
deleted file mode 100644
index 9ba591f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/31d97492-1de9-41be-8213-c67eb06406b1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"31d97492-1de9-41be-8213-c67eb06406b1","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Location settings\",\"actionId\":\"31d97492-1de9-41be-8213-c67eb06406b1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"ScrollScreenContentValidationAction\",\"actionId\":\"16f7dc46-59a5-4e31-977a-abdde6fa11d3\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Location\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"389de027-8591-412f-86f7-8fce886466e0\",\"displayText\":\"Location\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"68de7092-cd8d-4e06-ad38-bf602941e1f7\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e583d23b-6881-43a3-b745-44123a4265da\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":698.6666666666666,\"x2\":47.666666666666664,\"y2\":716.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":695.0,\"x2\":66.0,\"y2\":716.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"3049380c-b573-4877-9905-3ad8084e81d2\",\"displayText\":\"Location\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"07f72ece-b083-47d8-bb67-e99971163db9\",\"displayText\":\"Location\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Location\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":696.6666666666666,\"x2\":123.0,\"y2\":716.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-5.0,\"y\":3.3333333333332575,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Location\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":682.0,\"x2\":345.3333333333333,\"y2\":716.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Location\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":682.0,\"x2\":360.0,\"y2\":716.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":99.5,\"y\":703.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":80.5,\"y\":-4.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"07f72ece-b083-47d8-bb67-e99971163db9\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Location\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":132.0,\"y1\":711.0,\"x2\":67.0,\"y2\":695.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Location\",\"actionId\":\"ee6df024-ee29-47d8-8bc2-9499d1bd4dc4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Location\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"16f7dc46-59a5-4e31-977a-abdde6fa11d3\",\"ee6df024-ee29-47d8-8bc2-9499d1bd4dc4\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Location settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.274000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/325e2c82-fd6d-4027-8dd7-1d331c3d5345 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/325e2c82-fd6d-4027-8dd7-1d331c3d5345
deleted file mode 100644
index 7aaaff6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/325e2c82-fd6d-4027-8dd7-1d331c3d5345
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"325e2c82-fd6d-4027-8dd7-1d331c3d5345","details":"{\"type\":\"CompoundAction\",\"name\":\"If myCert is installed, press back key\",\"actionId\":\"325e2c82-fd6d-4027-8dd7-1d331c3d5345\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"If myCert is installed, press back key\",\"actionId\":\"2f0bf0ea-833f-4291-99d3-bc6f24633305\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Internet Widgits Pty Ltd\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"af641572-14fb-49d1-a5c0-7e7cbc90de73\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"965ba747-6c53-484b-8c1d-9d381b6aa1ed\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"79def8f0-de2e-411c-a5ea-4022b9c02d1d\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/trusted_credential_subject_primary\",\"text\":\"Internet Widgits Pty Ltd\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":135.75,\"x2\":180.25,\"y2\":157.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-8.375,\"y\":-0.125,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Internet Widgits Pty Ltd\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":122.5,\"x2\":290.5,\"y2\":186.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Internet Widgits Pty Ltd\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":122.5,\"x2\":360.0,\"y2\":186.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":105.5,\"y\":146.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":74.5,\"y\":8.125,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"79def8f0-de2e-411c-a5ea-4022b9c02d1d\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Internet Widgits Pty Ltd\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":124.0,\"x2\":202.0,\"y2\":169.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"3173fdce-de2d-47df-b28b-0030d53dae5d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"2f0bf0ea-833f-4291-99d3-bc6f24633305\",\"3173fdce-de2d-47df-b28b-0030d53dae5d\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"If myCert is installed, press back key","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.233000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/336938a2-a45e-4245-a4a7-2f8704bc265d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/336938a2-a45e-4245-a4a7-2f8704bc265d
deleted file mode 100644
index 8ffd6d3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/336938a2-a45e-4245-a4a7-2f8704bc265d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"336938a2-a45e-4245-a4a7-2f8704bc265d","details":"{\"type\":\"CompoundAction\",\"name\":\"Set short support message\",\"actionId\":\"336938a2-a45e-4245-a4a7-2f8704bc265d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, set short support message button\",\"actionId\":\"c62bb98b-dc83-4ed1-bfdb-4eceae43644f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/short_msg_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, set_default_message button\",\"actionId\":\"8093e310-9341-4c3b-a67d-055d6f6a8e7a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_default_message\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, set_message button\",\"actionId\":\"168df43c-a465-449a-9915-d5a4cdcc6c80\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_message\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"d5ead5b3-c321-4260-90c4-155b47f7dd3f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c62bb98b-dc83-4ed1-bfdb-4eceae43644f\",\"8093e310-9341-4c3b-a67d-055d6f6a8e7a\",\"168df43c-a465-449a-9915-d5a4cdcc6c80\",\"d5ead5b3-c321-4260-90c4-155b47f7dd3f\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set short support message","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.116000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/339f5cb7-0ae4-4405-bd6b-ebf91aa53125 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/339f5cb7-0ae4-4405-bd6b-ebf91aa53125
deleted file mode 100644
index b71afdc..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/339f5cb7-0ae4-4405-bd6b-ebf91aa53125
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"339f5cb7-0ae4-4405-bd6b-ebf91aa53125","details":"{\"type\":\"CompoundAction\",\"name\":\"Camera Intents-Test 1\",\"actionId\":\"339f5cb7-0ae4-4405-bd6b-ebf91aa53125\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"Home Button\",\"actionId\":\"0e6dbc6d-1df3-4e42-b39f-76db27d04312\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":3,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ConditionClickAction\",\"name\":\"ConditionClickAction\",\"actionId\":\"e3f7ed40-f8b9-480d-b8a8-33e3c36df645\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.permissioncontroller:id/permission_allow_foreground_only_button\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6592a0d0-adde-4874-9274-eac7f05aa0a5\",\"displayText\":\"Take photo\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"b8d19a57-e5b7-4512-b034-2bba27a556ef\",\"displayText\":\"Take photo\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.google.android.GoogleCamera:id/shutter_button\",\"contentDesc\":\"Take photo\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":133.0,\"y1\":587.0,\"x2\":226.66666666666666,\"y2\":680.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.8333333333333144,\"y\":17.833333333333258,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Take photo\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.google.android.GoogleCamera:id/center_placeholder\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":133.0,\"y1\":587.0,\"x2\":226.66666666666666,\"y2\":680.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":178.0,\"y\":616.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":1.8333333333333144,\"y\":17.833333333333258,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"b8d19a57-e5b7-4512-b034-2bba27a556ef\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.permissioncontroller:id/permission_allow_foreground_only_button\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":159.0,\"y1\":591.0,\"x2\":197.0,\"y2\":641.0}}],\"childrenIdList\":[\"740de7a4-51a7-411c-bf5f-424945116764\",\"0e6dbc6d-1df3-4e42-b39f-76db27d04312\",\"b40e7a89-24b7-4cf7-8942-4733b0536edc\",\"e3f7ed40-f8b9-480d-b8a8-33e3c36df645\",\"b1c2250d-2c83-4698-8e4f-e80b296153d9\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_camera=Camera,\\n$uicd_camera_take_photo=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_mode=Video,\\n$uicd_camera_video_record=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_stop=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_done=Done,\"}}","name":"Camera Intents-Test 1","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.009000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/33e57fb2-284d-43aa-9763-d9c0cd8d1d95 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/33e57fb2-284d-43aa-9763-d9c0cd8d1d95
deleted file mode 100644
index 7681b2e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/33e57fb2-284d-43aa-9763-d9c0cd8d1d95
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"33e57fb2-284d-43aa-9763-d9c0cd8d1d95","details":"{\"type\":\"CompoundAction\",\"name\":\"03-WiFi configuration lockdown\",\"actionId\":\"33e57fb2-284d-43aa-9763-d9c0cd8d1d95\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to WiFi configuration lockdown\",\"actionId\":\"46f93377-24d4-47ae-b00a-ceac3ec5acda\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"WiFi configuration lockdown\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7ea2a38f-ebbd-400c-ac86-1db965b65561\",\"displayText\":\"WiFi configuration lockdown\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"WiFi configuration lockdown\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":424.75,\"x2\":351.25,\"y2\":466.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":103.5,\"y\":442.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":76.5,\"y\":3.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"7ea2a38f-ebbd-400c-ac86-1db965b65561\",\"firstText\":\"WiFi configuration lockdown\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"WiFi configuration lockdown\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":428.0,\"x2\":198.0,\"y2\":456.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, WiFi configuration lockdown\",\"actionId\":\"bc7170f1-a36d-420f-8e4e-667df4e2ccf4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"WiFi configuration lockdown\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/device_owner_wifi_ssid\",\"actionId\":\"100e76f6-4340-447d-9f0c-899a46aaca8c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/device_owner_wifi_ssid\"},{\"type\":\"InputAction\",\"name\":\"INPUT SSID name\",\"actionId\":\"090470de-d919-467e-920e-5db45b49813f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"$uicd_device_owner_WiFi_configuration_SSID\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/device_owner_keymgmnt_none\",\"actionId\":\"3bbb402a-0a6c-4fff-903e-5dbf27b4f178\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/device_owner_keymgmnt_none\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/create_wifi_config_button\",\"actionId\":\"b84f14bf-8d9a-47d0-9b78-4c1d5599ac74\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/create_wifi_config_button\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 5 secs SSID connected\",\"actionId\":\"efc49e75-1750-49e9-b094-6ae490b3c244\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"riacheltseng\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"de0b8776-5656-4400-ae60-b91ed194561a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 1 -Unlocked config is modifiable in Settings\",\"actionId\":\"16299c5d-e8d0-49a4-8d70-0e154cde07a8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Unlocked config is modifiable in Settings\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if WiFi SSID connected\",\"actionId\":\"a3512cab-b0b7-48aa-b7d7-cd437b36dbc7\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"$uicd_device_owner_WiFi_configuration_SSID\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7dfa7b8b-f837-4b43-a184-04c9f8d4f8e7\",\"displayText\":\"wifitest\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"67eba84c-bbec-4e75-8889-169ea496ceec\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/entity_header_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":158.75,\"y1\":94.5,\"x2\":200.75,\"y2\":136.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"45fc6a99-2522-4204-b1fa-19140444f678\",\"displayText\":\"wifitest\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_title\",\"text\":\"wifitest\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.25,\"y1\":143.5,\"x2\":210.5,\"y2\":166.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.625,\"y\":2.125,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"wifitest\"},{\"uuid\":\"b7a556b8-7141-428d-8627-6624f79e57bb\",\"displayText\":\"Connected\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_summary\",\"text\":\"Connected\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":150.25,\"y1\":168.5,\"x2\":209.25,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Connected\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/entity_header_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.25,\"y1\":94.5,\"x2\":210.5,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":181.5,\"y\":153.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.625,\"y\":-13.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"45fc6a99-2522-4204-b1fa-19140444f678\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"$uicd_device_owner_WiFi_configuration_SSID\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":143.0,\"y1\":143.0,\"x2\":220.0,\"y2\":163.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify Forget button exists\",\"actionId\":\"97947f55-afea-4be5-9832-25df9fd2db23\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Forget\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0cfe2a3f-67eb-4950-b31b-e45a62ace646\",\"displayText\":\"Forget\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d645e5b6-60d0-4567-9aae-853c2f199370\",\"displayText\":\"Forget\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/button1\",\"text\":\"Forget\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":7.0,\"y1\":199.0,\"x2\":117.5,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.25,\"y\":-14.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Forget\"},{\"uuid\":\"c0ae6dd5-e5de-4a63-8b67-bffb7f7097a8\",\"displayText\":\"Disconnect\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/button3\",\"text\":\"Disconnect\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":124.5,\"y1\":199.0,\"x2\":235.25,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Disconnect\"},{\"uuid\":\"1d2fde93-3007-4cbe-85d9-8339ea33bfdd\",\"displayText\":\"Share\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/button4\",\"text\":\"Share\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":242.25,\"y1\":199.0,\"x2\":353.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Share\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":199.0,\"x2\":360.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":62.0,\"y\":251.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":118.0,\"y\":-14.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"d645e5b6-60d0-4567-9aae-853c2f199370\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Forget\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":34.0,\"y1\":237.0,\"x2\":90.0,\"y2\":265.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7a670104-0393-4834-80aa-f5c9e696ec16\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ab040aac-2f31-4050-bd3b-8be4ebf0629d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 2-Locked config is not modifiable in Settings\",\"actionId\":\"41755859-7c5f-43d0-bf27-bcd41b2103f6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Locked config is not modifiable in Settings\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if correct WiFi SSID\",\"actionId\":\"e537f105-fd84-415b-a13c-fdb82f63420c\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"$uicd_device_owner_WiFi_configuration_SSID\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"de7c2d35-70c8-43cb-a039-f3d6722a21e1\",\"displayText\":\"wifitest\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"2d537572-7b56-464d-9347-d38a1f16cc54\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/entity_header_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":158.75,\"y1\":94.5,\"x2\":200.75,\"y2\":136.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"c7dac0d3-e7de-4072-826c-4c0c0a26c0de\",\"displayText\":\"wifitest\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_title\",\"text\":\"wifitest\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.25,\"y1\":143.5,\"x2\":210.5,\"y2\":166.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-21.625,\"y\":0.625,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"wifitest\"},{\"uuid\":\"cb80b720-7b53-438e-ab03-e8ec210c6a66\",\"displayText\":\"Connected\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_summary\",\"text\":\"Connected\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":150.25,\"y1\":168.5,\"x2\":209.25,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Connected\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/entity_header_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.25,\"y1\":94.5,\"x2\":210.5,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":201.5,\"y\":154.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-21.625,\"y\":-14.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"c7dac0d3-e7de-4072-826c-4c0c0a26c0de\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"$uicd_device_owner_WiFi_configuration_SSID\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":138.0,\"y1\":144.0,\"x2\":265.0,\"y2\":165.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Forget button is disappear\",\"actionId\":\"650972c4-e9ca-4d99-be02-3b649ad7ce44\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Forget\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"245c37f1-2c9f-4b8e-944e-20ee4afbd0be\",\"displayText\":\"Disconnect\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"91bed57e-7418-4d14-9b32-0e593b9a2819\",\"displayText\":\"Disconnect\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/button3\",\"text\":\"Disconnect\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":7.0,\"y1\":199.0,\"x2\":176.5,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-10.75,\"y\":-9.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Disconnect\"},{\"uuid\":\"6a458e52-33e1-4027-91c1-e221a92ccb69\",\"displayText\":\"Share\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/button4\",\"text\":\"Share\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":183.5,\"y1\":199.0,\"x2\":353.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Share\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":199.0,\"x2\":360.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":102.5,\"y\":246.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":77.5,\"y\":-9.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"91bed57e-7418-4d14-9b32-0e593b9a2819\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Forget\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":44.0,\"y1\":227.0,\"x2\":161.0,\"y2\":266.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"8408d921-e765-442b-ade1-42d039034ae7\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"29abf9a4-5621-459e-ba30-da5bcbc48c3d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 3-Locked config can be connected to\",\"actionId\":\"54c431fe-0cf0-4e4d-9418-f5a2937b0a79\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Locked config can be connected to\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, $uicd_device_owner_WiFi_configuration_SSID_default\",\"actionId\":\"f15f2ddd-4fcb-4aa3-9498-964e417bbf30\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"$uicd_device_owner_WiFi_configuration_SSID_default\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if it can connect to default WiFi\",\"actionId\":\"29c8de31-45ed-4145-a80c-a31d22c9a9ee\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"$uicd_device_owner_WiFi_configuration_SSID_default\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b4e39222-b73a-47cc-b31e-5fed9aa13115\",\"displayText\":\"chtn\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"de757bb9-1bee-4af9-af4f-6e588cd84d76\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/entity_header_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":159.0,\"y1\":94.5,\"x2\":201.0,\"y2\":136.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"3ad12ff0-98d5-49a9-82fa-56a159ae6b0a\",\"displayText\":\"chtn\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_title\",\"text\":\"chtn\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":161.5,\"y1\":143.5,\"x2\":198.25,\"y2\":166.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.375,\"y\":0.125,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"chtn\"},{\"uuid\":\"d6766bb0-ded2-4edb-99d0-a1ce10821b13\",\"displayText\":\"Connected\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_summary\",\"text\":\"Connected\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":150.5,\"y1\":168.5,\"x2\":209.5,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Connected\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/entity_header_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":150.5,\"y1\":94.5,\"x2\":209.5,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":176.5,\"y\":155.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":3.5,\"y\":-15.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"3ad12ff0-98d5-49a9-82fa-56a159ae6b0a\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"$uicd_device_owner_WiFi_configuration_SSID_default\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":142.0,\"y1\":145.0,\"x2\":211.0,\"y2\":165.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"286ff5d7-4bb9-4bad-8280-336eafa5f21d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, $uicd_device_owner_WiFi_configuration_SSID\",\"actionId\":\"76b2753e-4cd6-4ecd-b9ec-a7de67e09815\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"$uicd_device_owner_WiFi_configuration_SSID\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify WiFi configuration can be connected to manually\",\"actionId\":\"d7d70f3a-953b-4b57-85a5-fba193e5f7c6\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"$uicd_device_owner_WiFi_configuration_SSID\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"39983b6b-1e93-403c-a823-1de5afe734ee\",\"displayText\":\"wifitest\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"88190d46-1aa5-44bc-8834-2ac978d25874\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/entity_header_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":158.75,\"y1\":94.5,\"x2\":200.75,\"y2\":136.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"13128363-87cd-4a49-bf96-4ccce6fe409d\",\"displayText\":\"wifitest\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_title\",\"text\":\"wifitest\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.25,\"y1\":143.5,\"x2\":210.5,\"y2\":166.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.875,\"y\":1.625,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"wifitest\"},{\"uuid\":\"39cba4c3-7562-42a0-ad44-59bf21661102\",\"displayText\":\"Connected\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_summary\",\"text\":\"Connected\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":150.25,\"y1\":168.5,\"x2\":209.25,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Connected\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/entity_header_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.25,\"y1\":94.5,\"x2\":210.5,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":177.0,\"y\":153.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":2.875,\"y\":-13.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"13128363-87cd-4a49-bf96-4ccce6fe409d\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"$uicd_device_owner_WiFi_configuration_SSID\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":129.0,\"y1\":140.0,\"x2\":225.0,\"y2\":167.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7ea68f53-c6ac-4c87-b31f-809fa2329e62\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"5a36ee45-8fdc-466e-aa4b-6caa4f0cb12a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Unlocked config can be forgotten in Settings\",\"actionId\":\"ecfc4543-8915-48a4-8c88-fb8b2428cd00\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Unlocked config can be forgotten in Settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"027ab3c0-3a7c-44b8-a7f2-a9a6fc68c4e9\",\"displayText\":\"Unlocked config can be forgotten in Settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Unlocked config can be forgotten in Settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":611.0,\"x2\":360.0,\"y2\":653.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":154.0,\"y\":635.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":26.0,\"y\":-3.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"027ab3c0-3a7c-44b8-a7f2-a9a6fc68c4e9\",\"firstText\":\"Unlocked config can be forgotten in Settings\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Unlocked config can be forgotten in Settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":1.0,\"y1\":622.0,\"x2\":307.0,\"y2\":649.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 4-Unlocked config can be forgotten in Settings\",\"actionId\":\"3443942d-ebec-4ed6-90e1-fbf3acf4befe\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Unlocked config can be forgotten in Settings\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if it is correct SSID\",\"actionId\":\"7750df67-ceb1-48cc-975e-477dc2f4281a\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"$uicd_device_owner_WiFi_configuration_SSID\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"174dc4ee-3740-438e-869a-ee3012488a1e\",\"displayText\":\"wifitest\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"2db11ef0-e318-43fc-9b16-1dd1801d1ac4\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/entity_header_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":158.75,\"y1\":94.5,\"x2\":200.75,\"y2\":136.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"7d56f18a-e5fa-452c-ae4a-aa8c87f54a05\",\"displayText\":\"wifitest\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_title\",\"text\":\"wifitest\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.25,\"y1\":143.5,\"x2\":210.5,\"y2\":166.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.125,\"y\":-1.875,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"wifitest\"},{\"uuid\":\"da591841-ff44-4f1e-8e78-990ac2339211\",\"displayText\":\"Connected\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_summary\",\"text\":\"Connected\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":150.25,\"y1\":168.5,\"x2\":209.25,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Connected\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/entity_header_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.25,\"y1\":94.5,\"x2\":210.5,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":182.0,\"y\":157.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.125,\"y\":-17.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"7d56f18a-e5fa-452c-ae4a-aa8c87f54a05\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"$uicd_device_owner_WiFi_configuration_SSID\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":137.0,\"y1\":146.0,\"x2\":227.0,\"y2\":168.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Forget button\",\"actionId\":\"396cd822-8388-41a4-9a4f-f4752486ae89\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button1\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Saved networks\",\"actionId\":\"05d2eb57-80ef-426d-af74-e058d689d612\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Saved networks\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"bb80ebc4-1eb5-4d65-897f-76c0bcc633ce\",\"displayText\":\"Saved networks\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"01d2bf16-2ac2-4360-afd0-19cccc6ee61b\",\"displayText\":\"Saved networks\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"375733b5-2b38-432e-9f07-25b0e957bd6f\",\"displayText\":\"Saved networks\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Saved networks\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":605.0,\"x2\":163.75,\"y2\":624.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.125,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Saved networks\"},{\"uuid\":\"23e3c21b-56ee-4d90-a44d-86e6936a1043\",\"displayText\":\"1 network\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"1 network\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":624.0,\"x2\":117.0,\"y2\":640.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"1 network\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":591.0,\"x2\":346.0,\"y2\":654.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Saved networks\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":591.0,\"x2\":360.0,\"y2\":654.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":113.5,\"y\":613.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":66.5,\"y\":9.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"375733b5-2b38-432e-9f07-25b0e957bd6f\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Saved networks\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":56.0,\"y1\":602.0,\"x2\":171.0,\"y2\":625.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Saved networks\",\"actionId\":\"38a4c1ca-cda0-4ffa-8e38-b82bcad2b3d5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Saved networks\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if WiFi SSID is forgot\",\"actionId\":\"7afd276e-4ecf-4d7c-b222-c9195e4ccccc\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"$uicd_device_owner_WiFi_configuration_SSID\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b5334622-bbef-4b13-9cac-59052cdec7bb\",\"displayText\":\"chtn\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"270a2d9e-9af1-4538-a8ce-1ed28550e3a6\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"232e851a-a44c-4041-ae2d-450b87af7724\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":136.0,\"x2\":35.0,\"y2\":157.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":132.5,\"x2\":63.0,\"y2\":160.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"28a17752-3114-4499-b7e6-eb6f43d7e578\",\"displayText\":\"chtn\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"10f68042-feea-4074-b770-b4194e5439af\",\"displayText\":\"chtn\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"chtn\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":128.75,\"x2\":91.5,\"y2\":147.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-10.25,\"y\":3.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"chtn\"},{\"uuid\":\"485f1446-2148-4f7a-87eb-c8698bc9b78e\",\"displayText\":\"Saved by Android Setup\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Saved by Android Setup\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":147.75,\"x2\":192.5,\"y2\":164.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Saved by Android Setup\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":114.75,\"x2\":289.0,\"y2\":178.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"chtn\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":114.75,\"x2\":303.0,\"y2\":178.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":87.5,\"y\":135.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":64.0,\"y\":11.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"10f68042-feea-4074-b770-b4194e5439af\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"$uicd_device_owner_WiFi_configuration_SSID\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":41.0,\"y1\":126.0,\"x2\":134.0,\"y2\":144.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"71132ac8-d0a7-449f-a0ee-fc198e418ffd\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"PythonScriptAction\",\"name\":\"Disable WiFi\",\"actionId\":\"e26e7492-f908-481f-a86b-0a07bcc6467d\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Use Wi.Fi\\\", MatchOption.START_WITH).right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"36357c01-abf5-4257-812a-a6907359545d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ConditionValidationAction\",\"name\":\"If all tests pass then click pass button\",\"actionId\":\"eeffcaa6-d620-416e-9861-d35b63353a02\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/pass_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"46f93377-24d4-47ae-b00a-ceac3ec5acda\",\"bc7170f1-a36d-420f-8e4e-667df4e2ccf4\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"100e76f6-4340-447d-9f0c-899a46aaca8c\",\"090470de-d919-467e-920e-5db45b49813f\",\"3bbb402a-0a6c-4fff-903e-5dbf27b4f178\",\"b84f14bf-8d9a-47d0-9b78-4c1d5599ac74\",\"efc49e75-1750-49e9-b094-6ae490b3c244\",\"de0b8776-5656-4400-ae60-b91ed194561a\",\"16299c5d-e8d0-49a4-8d70-0e154cde07a8\",\"b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4\",\"0b2baaab-b94e-4348-8e3b-e13dc302c5ab\",\"d3400679-ef71-4a3e-a0a9-98cb51c83da6\",\"a3512cab-b0b7-48aa-b7d7-cd437b36dbc7\",\"97947f55-afea-4be5-9832-25df9fd2db23\",\"7a670104-0393-4834-80aa-f5c9e696ec16\",\"ab040aac-2f31-4050-bd3b-8be4ebf0629d\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"41755859-7c5f-43d0-bf27-bcd41b2103f6\",\"440786b7-f1d9-4c77-ad81-28068fe6a608\",\"0b2baaab-b94e-4348-8e3b-e13dc302c5ab\",\"d3400679-ef71-4a3e-a0a9-98cb51c83da6\",\"e537f105-fd84-415b-a13c-fdb82f63420c\",\"650972c4-e9ca-4d99-be02-3b649ad7ce44\",\"8408d921-e765-442b-ade1-42d039034ae7\",\"29abf9a4-5621-459e-ba30-da5bcbc48c3d\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"54c431fe-0cf0-4e4d-9418-f5a2937b0a79\",\"440786b7-f1d9-4c77-ad81-28068fe6a608\",\"0b2baaab-b94e-4348-8e3b-e13dc302c5ab\",\"f15f2ddd-4fcb-4aa3-9498-964e417bbf30\",\"d3400679-ef71-4a3e-a0a9-98cb51c83da6\",\"29c8de31-45ed-4145-a80c-a31d22c9a9ee\",\"286ff5d7-4bb9-4bad-8280-336eafa5f21d\",\"76b2753e-4cd6-4ecd-b9ec-a7de67e09815\",\"d3400679-ef71-4a3e-a0a9-98cb51c83da6\",\"d7d70f3a-953b-4b57-85a5-fba193e5f7c6\",\"7ea68f53-c6ac-4c87-b31f-809fa2329e62\",\"5a36ee45-8fdc-466e-aa4b-6caa4f0cb12a\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"ecfc4543-8915-48a4-8c88-fb8b2428cd00\",\"3443942d-ebec-4ed6-90e1-fbf3acf4befe\",\"b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4\",\"0b2baaab-b94e-4348-8e3b-e13dc302c5ab\",\"d3400679-ef71-4a3e-a0a9-98cb51c83da6\",\"7750df67-ceb1-48cc-975e-477dc2f4281a\",\"396cd822-8388-41a4-9a4f-f4752486ae89\",\"05d2eb57-80ef-426d-af74-e058d689d612\",\"38a4c1ca-cda0-4ffa-8e38-b82bcad2b3d5\",\"7afd276e-4ecf-4d7c-b222-c9195e4ccccc\",\"71132ac8-d0a7-449f-a0ee-fc198e418ffd\",\"e26e7492-f908-481f-a86b-0a07bcc6467d\",\"36357c01-abf5-4257-812a-a6907359545d\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"eeffcaa6-d620-416e-9861-d35b63353a02\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_device_owner_WiFi_configuration_SSID_default=chtn,\\n$uicd_device_owner_WiFi_configuration_SSID=wifitest,\"}}","name":"03-WiFi configuration lockdown","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.086000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/34391efa-20da-4c54-a657-418d1b4a5ddd b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/34391efa-20da-4c54-a657-418d1b4a5ddd
deleted file mode 100644
index b57ecc7..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/34391efa-20da-4c54-a657-418d1b4a5ddd
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"34391efa-20da-4c54-a657-418d1b4a5ddd","details":"{\"type\":\"CompoundAction\",\"name\":\"If \\\"Advanced Settings\\\" exists do the following actions\",\"actionId\":\"34391efa-20da-4c54-a657-418d1b4a5ddd\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"If \\\"Advanced Settings\\\" exists do the following actions\",\"actionId\":\"7e38a553-5f3c-4225-bc6f-2e5a6ed0d0e7\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Advanced Settings\"}]},\"clickAfterValidation\":false},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"7bdcbe2b-c406-46e9-92cf-423c0c834b63\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ad22bda1-e912-49fe-8703-11cf4d2ee5bc\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"7e38a553-5f3c-4225-bc6f-2e5a6ed0d0e7\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"7bdcbe2b-c406-46e9-92cf-423c0c834b63\",\"838a9611-4bf1-4317-8599-98f7e872efdb\",\"ad22bda1-e912-49fe-8703-11cf4d2ee5bc\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"If \"Advanced Settings\" exists do the following actions","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.281000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/35a90a2e-6709-4b9d-ad3f-07f3af03e889 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/35a90a2e-6709-4b9d-ad3f-07f3af03e889
deleted file mode 100644
index 5916d6f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/35a90a2e-6709-4b9d-ad3f-07f3af03e889
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"35a90a2e-6709-4b9d-ad3f-07f3af03e889","details":"{\"type\":\"CompoundAction\",\"name\":\"15-Policy transparency test\",\"actionId\":\"35a90a2e-6709-4b9d-ad3f-07f3af03e889\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Policy transparency test\",\"actionId\":\"5e3a2012-ba55-446d-b791-28eb3f06c34a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Policy transparency test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6b162a0d-9f1b-4b0d-b5fb-91e7c6f0adf0\",\"displayText\":\"Policy transparency test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Policy transparency test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":466.6666666666667,\"x2\":350.6666666666667,\"y2\":510.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":98.5,\"y\":490.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":81.5,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"6b162a0d-9f1b-4b0d-b5fb-91e7c6f0adf0\",\"firstText\":\"Policy transparency test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Policy transparency test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":473.0,\"x2\":188.0,\"y2\":507.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Policy transparency test\",\"actionId\":\"9be5e633-90d8-4da0-9b35-d19e0a06d48c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Policy transparency test\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"d4fefa3b-c1dc-4a07-a19b-2950ffb01dcb\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"5e3a2012-ba55-446d-b791-28eb3f06c34a\",\"9be5e633-90d8-4da0-9b35-d19e0a06d48c\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"336938a2-a45e-4245-a4a7-2f8704bc265d\",\"d1023735-52c1-48bc-9dc7-a7b03a15ca7b\",\"7ebfac21-0046-438c-af8c-f21ea88f0357\",\"e92b83d0-131c-4ef1-aaab-49103f238136\",\"4a5899ed-71fd-4562-8aab-737e20b84297\",\"446a3aa1-905d-4268-8532-5bf77fe7fbe6\",\"f00f3a0d-8419-4e58-a636-d75d84accafb\",\"3dabca21-35c3-4633-99c0-52e3a5a0d012\",\"1f828567-b1d4-4874-94a1-22d939057e69\",\"78f39e06-715e-4c47-a787-b2802a1a12ab\",\"e8f7b797-087f-4398-b4e2-358fe50416f3\",\"f67dea91-f1e8-4f94-a80f-2374f15cb791\",\"78ad3920-ae49-4f06-b220-781c5b1e53e5\",\"365f65bd-c7be-4d20-9b37-7694dfa81ba1\",\"477825e2-33af-4238-acac-4dce5c1c5b84\",\"9d556fec-d14c-44d9-870f-0dbfc41ffb86\",\"14ca85a4-dc82-479e-87f5-afd492728ac1\",\"a0835500-a2a2-4908-a93e-522b12c44507\",\"c1d1e74e-9d20-482f-9c48-58faaf8b8c7f\",\"97af8f29-fc99-451c-a57b-81f59621b304\",\"4da412fa-0048-4a4b-9ba8-d4aabc5dd6a1\",\"151b7e7c-814c-42fc-b2f9-d9aeb0b9d86b\",\"f31620ba-a28e-44ed-a592-02cf02b7e2a0\",\"02368e5e-0086-4c12-9a05-55c25015d488\",\"cd0de494-22a4-45d1-b5b4-74d5585cccf8\",\"c0d95bab-a71d-4109-b402-01d3bad36422\",\"96e13653-8ab0-44a3-9bed-ddd32181cd28\",\"1075b85b-6357-4973-af77-ddd3ef41fbbf\",\"d4fefa3b-c1dc-4a07-a19b-2950ffb01dcb\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_Gmail_account=playinstallapk02@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\"}}","name":"15-Policy transparency test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.115000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/360c99e8-b022-42ab-b1c0-a27575885f2d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/360c99e8-b022-42ab-b1c0-a27575885f2d
deleted file mode 100644
index c3c15f8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/360c99e8-b022-42ab-b1c0-a27575885f2d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"360c99e8-b022-42ab-b1c0-a27575885f2d","details":"{\"type\":\"CompoundAction\",\"name\":\"19-Logout\",\"actionId\":\"360c99e8-b022-42ab-b1c0-a27575885f2d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Logout\",\"actionId\":\"e4de1112-09f8-47c2-87f3-6b3b0ad5c533\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Logout\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"403f968c-fe27-4000-954b-70890c7ffd94\",\"displayText\":\"Logout\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Logout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":425.5,\"x2\":351.25,\"y2\":467.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":36.5,\"y\":441.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":143.5,\"y\":5.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"403f968c-fe27-4000-954b-70890c7ffd94\",\"firstText\":\"Logout\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Logout\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":428.0,\"x2\":67.0,\"y2\":455.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Logout\",\"actionId\":\"45ba2941-0af0-48b2-8cbe-38786fa75553\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Logout\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 10 secs to change session\",\"actionId\":\"35840c4b-e190-43a0-9a01-1c944723d88f\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/logout\",\"actionId\":\"30c8a61e-e187-4a54-9341-3d0a46e44b35\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.systemui:id/logout\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 10 secs to end session\",\"actionId\":\"f7d82734-1a05-4499-b9b4-dc02c12e0621\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 10 secs to change session\",\"actionId\":\"395c800c-bf55-46f7-8564-3252a3059a1a\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\"},{\"type\":\"CommandLineAction\",\"name\":\"Long press power key\",\"actionId\":\"713ffb44-6a90-40c0-95e4-9578e04e661f\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"shell input keyevent --longpress 26\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, End session\",\"actionId\":\"e6658e26-79c9-41e7-bceb-9248b8beda76\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"End session\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 10 secs to end session\",\"actionId\":\"618fa5f4-e901-4286-9ef9-d6419956568e\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify \\\"END SESSION\\\" is not available in primary user\",\"actionId\":\"258d3584-078a-4f56-a7cf-2accf3476cd7\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"END SESSION\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1cb85f78-b076-457e-b031-c8131795ec0a\",\"displayText\":\"534\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"8b4dd146-d9fe-4d1e-a292-bd4ae41257c3\",\"displayText\":\"534\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f60991de-50af-4c46-827d-48835eac2339\",\"displayText\":\"534\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f522e847-dd81-4b84-802d-a3256ad8832d\",\"displayText\":\"534\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/default_clock_view\",\"text\":\"534\",\"contentDesc\":\"534\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":225.75,\"x2\":355.5,\"y2\":292.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"534\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/clock_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":225.75,\"x2\":355.5,\"y2\":292.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"534\"},{\"uuid\":\"afbae526-36b4-4ea3-86eb-190ed4edff05\",\"displayText\":\"Tue, Oct 6\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"eee11675-61ff-4880-8cfa-e1176c63f731\",\"displayText\":\"Tue, Oct 6\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"5b298028-3b8a-4cc6-9e83-1330a7c77293\",\"displayText\":\"Tue, Oct 6\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Tue, Oct 6\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":136.0,\"y1\":292.25,\"x2\":215.0,\"y2\":313.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Tue, Oct 6\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/row\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":9.5,\"y1\":292.25,\"x2\":341.5,\"y2\":313.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Tue, Oct 6\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/keyguard_status_area\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":292.25,\"x2\":355.5,\"y2\":313.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Tue, Oct 6\"}],\"className\":\"android.widget.RelativeLayout\",\"resourceId\":\"com.android.systemui:id/keyguard_clock_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":225.75,\"x2\":355.5,\"y2\":313.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"534\"},{\"uuid\":\"5b2668d2-2c3f-4c98-ace7-c9c33184a1cf\",\"displayText\":\"Android System notification: USB debugging connected\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f6ae6eed-7442-4045-aead-d2ee55da6428\",\"displayText\":\"Android System notification: USB debugging connected\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"contentDesc\":\"Android System notification: USB debugging connected\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":166.0,\"y1\":330.25,\"x2\":185.25,\"y2\":354.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Android System notification: USB debugging connected\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/clock_notification_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":328.5,\"x2\":355.5,\"y2\":356.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Android System notification: USB debugging connected\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/status_view_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":187.25,\"x2\":355.5,\"y2\":356.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":174.5,\"y\":220.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":3.25,\"y\":51.875,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"1cb85f78-b076-457e-b031-c8131795ec0a\",\"firstText\":\"534\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"END SESSION\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":113.0,\"y1\":196.0,\"x2\":236.0,\"y2\":244.0}}],\"childrenIdList\":[\"ad921587-e363-4652-ae6b-9d95ff9bba16\",\"e4de1112-09f8-47c2-87f3-6b3b0ad5c533\",\"45ba2941-0af0-48b2-8cbe-38786fa75553\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"35840c4b-e190-43a0-9a01-1c944723d88f\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"30c8a61e-e187-4a54-9341-3d0a46e44b35\",\"f7d82734-1a05-4499-b9b4-dc02c12e0621\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"395c800c-bf55-46f7-8564-3252a3059a1a\",\"713ffb44-6a90-40c0-95e4-9578e04e661f\",\"e6658e26-79c9-41e7-bceb-9248b8beda76\",\"618fa5f4-e901-4286-9ef9-d6419956568e\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"258d3584-078a-4f56-a7cf-2accf3476cd7\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"19-Logout","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.205000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/365f65bd-c7be-4d20-9b37-7694dfa81ba1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/365f65bd-c7be-4d20-9b37-7694dfa81ba1
deleted file mode 100644
index 4284b7c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/365f65bd-c7be-4d20-9b37-7694dfa81ba1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"365f65bd-c7be-4d20-9b37-7694dfa81ba1","details":"{\"type\":\"CompoundAction\",\"name\":\"15-14-Disallow network reset\",\"actionId\":\"365f65bd-c7be-4d20-9b37-7694dfa81ba1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow network reset\",\"actionId\":\"ac22df88-f8bd-49d3-9158-538f26703661\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow network reset\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d20a7744-077b-48b5-8913-e66de0eec02d\",\"displayText\":\"Disallow network reset\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow network reset\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":398.0,\"x2\":360.0,\"y2\":442.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":79.5,\"y\":422.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":100.5,\"y\":-2.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d20a7744-077b-48b5-8913-e66de0eec02d\",\"firstText\":\"Disallow network reset\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow network reset\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":1.0,\"y1\":407.0,\"x2\":158.0,\"y2\":438.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow network reset\",\"actionId\":\"390ca176-df7c-43f7-bac9-a9e1ed56f1a7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow network reset\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Reset Wi-Fi, mobile & Bluetooth\",\"actionId\":\"e4fbd0c3-a2d9-4877-bd10-8e840a7ef85c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Reset Wi-Fi, mobile & Bluetooth\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"ac22df88-f8bd-49d3-9158-538f26703661\",\"390ca176-df7c-43f7-bac9-a9e1ed56f1a7\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"d7cdb82c-060e-4a47-83c1-c1b9f6396683\",\"e4fbd0c3-a2d9-4877-bd10-8e840a7ef85c\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-14-Disallow network reset","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.140000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/370c511c-5950-4b3a-b832-60f2a606a27a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/370c511c-5950-4b3a-b832-60f2a606a27a
deleted file mode 100644
index 0cd5d29..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/370c511c-5950-4b3a-b832-60f2a606a27a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"370c511c-5950-4b3a-b832-60f2a606a27a","details":"{\"type\":\"CompoundAction\",\"name\":\"Press Back key 5 times\",\"actionId\":\"370c511c-5950-4b3a-b832-60f2a606a27a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7b83574c-5b48-4f83-b426-62981cc09d30\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"7b83574c-5b48-4f83-b426-62981cc09d30\"],\"repeatTime\":5,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Press Back key 5 times","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.070000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/377a3a65-66d4-4e05-ac35-b9e4196639e9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/377a3a65-66d4-4e05-ac35-b9e4196639e9
deleted file mode 100644
index 5a30bb0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/377a3a65-66d4-4e05-ac35-b9e4196639e9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"377a3a65-66d4-4e05-ac35-b9e4196639e9","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Share button\",\"actionId\":\"377a3a65-66d4-4e05-ac35-b9e4196639e9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Share button\",\"actionId\":\"ba70ec08-19e4-475e-934a-23ab671b9aae\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"ba70ec08-19e4-475e-934a-23ab671b9aae\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Share button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.073000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/37bd58c3-6297-4c65-ac3f-e575ec7b3986 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/37bd58c3-6297-4c65-ac3f-e575ec7b3986
deleted file mode 100644
index b2f243c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/37bd58c3-6297-4c65-ac3f-e575ec7b3986
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"37bd58c3-6297-4c65-ac3f-e575ec7b3986","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify there is no notification in the notification shade\",\"actionId\":\"37bd58c3-6297-4c65-ac3f-e575ec7b3986\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if there is no bubble notifcation\",\"actionId\":\"0a35e6ba-c7e1-4d25-a0ac-4b64188df31c\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"BubbleChat\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0634fb7b-94ce-412a-96b4-577bf2221ad8\",\"displayText\":\"BubbleChat\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"48ee6448-3cf6-496c-8246-5ee62574b5d5\",\"displayText\":\"BubbleChat\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/conversation_text\",\"text\":\"BubbleChat\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":208.25,\"x2\":150.5,\"y2\":227.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.5,\"y\":2.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"BubbleChat\"},{\"uuid\":\"1a0a19f5-9dd3-4f96-92c1-60f016aaec3b\",\"displayText\":\"•\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_divider\",\"text\":\"•\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":157.5,\"y1\":210.0,\"x2\":161.0,\"y2\":225.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"•\"},{\"uuid\":\"5e53b7cd-e97e-480e-abcd-3d4d4a7f4003\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":168.0,\"y1\":210.0,\"x2\":222.5,\"y2\":225.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"CTS Verifier\"},{\"uuid\":\"685e2b0f-db83-4406-aede-8bdf096e1786\",\"displayText\":\"Alerted\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/alerted_icon\",\"contentDesc\":\"Alerted\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":229.5,\"y1\":212.5,\"x2\":240.0,\"y2\":223.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Alerted\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/conversation_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":194.25,\"x2\":275.0,\"y2\":227.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":109.5,\"y\":215.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":64.75,\"y\":-4.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"48ee6448-3cf6-496c-8246-5ee62574b5d5\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"BubbleChat\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":67.0,\"y1\":203.0,\"x2\":152.0,\"y2\":227.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the notification text not exist\",\"actionId\":\"bc88ebc9-3ba2-4425-bea8-b22d4a64864c\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Is it me you're looking for?\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ac2001c6-47fa-445e-b3f0-7b38ee7862a1\",\"displayText\":\"Is it me you're looking for?\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"2643eee3-0044-4b50-baa0-5e284b1fadff\",\"displayText\":\"Hello?\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/message_text\",\"text\":\"Hello?\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":246.0,\"x2\":107.5,\"y2\":262.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Hello?\"},{\"uuid\":\"415d2f5e-4bf3-4b8d-b626-47bcb8feadd8\",\"displayText\":\"Is it me you're looking for?\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/message_text\",\"text\":\"Is it me you're looking for?\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":264.25,\"x2\":216.0,\"y2\":280.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":6.75,\"y\":3.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Is it me you're looking for?\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/group_message_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":246.0,\"x2\":216.0,\"y2\":280.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":138.0,\"y\":269.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":6.75,\"y\":-5.625,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"415d2f5e-4bf3-4b8d-b626-47bcb8feadd8\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Is it me you're looking for?\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":59.0,\"y1\":259.0,\"x2\":217.0,\"y2\":279.0}}],\"childrenIdList\":[\"15c75efc-b173-4eed-9a2c-164886355c98\",\"0a35e6ba-c7e1-4d25-a0ac-4b64188df31c\",\"bc88ebc9-3ba2-4425-bea8-b22d4a64864c\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify there is no notification in the notification shade","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.226000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3815d172-f8cb-41b5-9bb3-5b3694bebd96 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3815d172-f8cb-41b5-9bb3-5b3694bebd96
deleted file mode 100644
index 60d27de..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3815d172-f8cb-41b5-9bb3-5b3694bebd96
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3815d172-f8cb-41b5-9bb3-5b3694bebd96","details":"{\"type\":\"CompoundAction\",\"name\":\"Stop recording\",\"actionId\":\"3815d172-f8cb-41b5-9bb3-5b3694bebd96\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Stop recording\",\"actionId\":\"a9527ebe-9f1d-4371-a2b1-7c8da031b3fe\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_stop\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_stop\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_stop\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"a9527ebe-9f1d-4371-a2b1-7c8da031b3fe\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Stop recording","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.008000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3832f622-3408-4968-9429-c0c9e11905d5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3832f622-3408-4968-9429-c0c9e11905d5
deleted file mode 100644
index daf5c4a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3832f622-3408-4968-9429-c0c9e11905d5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3832f622-3408-4968-9429-c0c9e11905d5","details":"{\"type\":\"CompoundAction\",\"name\":\"Open Alarms and Timers Tests \",\"actionId\":\"3832f622-3408-4968-9429-c0c9e11905d5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"ScrollScreenContentValidationAction\",\"actionId\":\"3ec82ea7-e64c-4cc0-8c4e-2fe674e4459a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Alarms and Timers Tests\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3210dc66-d9a5-4d34-b0c0-78607ef696cb\",\"displayText\":\"Alarms and Timers Tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Alarms and Timers Tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":522.0,\"x2\":350.6666666666667,\"y2\":566.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.5,\"y\":542.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":87.5,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"3210dc66-d9a5-4d34-b0c0-78607ef696cb\",\"firstText\":\"Alarms and Timers Tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Alarms and Timers Tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":529.0,\"x2\":178.0,\"y2\":556.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Alarms and Timers Tests\",\"actionId\":\"c6ec2ffc-d852-4c8f-8806-562c35c0946e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Alarms and Timers Tests\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"3ec82ea7-e64c-4cc0-8c4e-2fe674e4459a\",\"c6ec2ffc-d852-4c8f-8806-562c35c0946e\",\"1601f323-e824-4190-9ee0-350f0a1149ea\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open Alarms and Timers Tests ","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.029000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3935709f-effe-474a-96d0-07dd056d34f9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3935709f-effe-474a-96d0-07dd056d34f9
deleted file mode 100644
index e0b7d80..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3935709f-effe-474a-96d0-07dd056d34f9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3935709f-effe-474a-96d0-07dd056d34f9","details":"{\"type\":\"CompoundAction\",\"name\":\"Enter password \\\"a14725836\\\"\",\"actionId\":\"3935709f-effe-474a-96d0-07dd056d34f9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"INPUT password a14725836\",\"actionId\":\"fe3f6db0-130d-4ff2-b575-e332077bb839\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"a14725836\",\"isSingleChar\":false}],\"childrenIdList\":[\"fe3f6db0-130d-4ff2-b575-e332077bb839\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Enter password \"a14725836\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.264000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3a510978-df33-499d-baab-b236c9960bd8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3a510978-df33-499d-baab-b236c9960bd8
deleted file mode 100644
index b70f150..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3a510978-df33-499d-baab-b236c9960bd8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3a510978-df33-499d-baab-b236c9960bd8","details":"{\"type\":\"CompoundAction\",\"name\":\"20-Disallow user switch\",\"actionId\":\"3a510978-df33-499d-baab-b236c9960bd8\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow user switch\",\"actionId\":\"3f0d8bad-ac69-4974-bd0d-c438bf73529f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow user switch\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"68186299-91ba-4887-94f6-27859c74dbbe\",\"displayText\":\"Disallow user switch\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow user switch\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":459.0,\"x2\":351.25,\"y2\":501.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":79.5,\"y\":476.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":100.5,\"y\":4.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"68186299-91ba-4887-94f6-27859c74dbbe\",\"firstText\":\"Disallow user switch\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow user switch\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":12.0,\"y1\":464.0,\"x2\":147.0,\"y2\":488.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow user switch\",\"actionId\":\"b386dd6c-385d-436d-be03-b2f380c21eda\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow user switch\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Create uninitialized user\",\"actionId\":\"f4f53349-61a1-46a0-9036-d41d0b62e140\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Create uninitialized user\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY main switch is disabled and in off position\",\"actionId\":\"1c5ccde1-e5ed-49c5-ad52-e2fd6bbca8d5\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.settings:id/switch_text\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Off\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"a37751d9-9cc7-4b99-a3ff-c306e29b5a34\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify user switcher is hidden or disabled in quick settings\",\"actionId\":\"4d91fce0-c53e-46a6-ad81-a7d015a11de2\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.systemui:id/multi_user_avatar\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"89c263fa-d4b1-4925-8ffa-23fc59e06e05\",\"displayText\":\"Signed in as Owner\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"42574744-549d-4e6d-a961-3acfd85a7871\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.systemui:id/multi_user_avatar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":284.75,\"y1\":399.25,\"x2\":302.25,\"y2\":416.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.5,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.systemui:id/multi_user_switch\",\"contentDesc\":\"Signed in as Owner\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":272.5,\"y1\":387.0,\"x2\":314.5,\"y2\":429.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":291.0,\"y\":407.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":2.5,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"42574744-549d-4e6d-a961-3acfd85a7871\",\"firstText\":\"Signed in as Owner\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.systemui:id/multi_user_avatar\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":273.0,\"y1\":393.0,\"x2\":309.0,\"y2\":422.0}}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"3f0d8bad-ac69-4974-bd0d-c438bf73529f\",\"b386dd6c-385d-436d-be03-b2f380c21eda\",\"f4f53349-61a1-46a0-9036-d41d0b62e140\",\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"1c5ccde1-e5ed-49c5-ad52-e2fd6bbca8d5\",\"a37751d9-9cc7-4b99-a3ff-c306e29b5a34\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"4d91fce0-c53e-46a6-ad81-a7d015a11de2\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"20-Disallow user switch","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.207000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3aefa26b-3d3e-4320-b4b0-9569556fd846 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3aefa26b-3d3e-4320-b4b0-9569556fd846
deleted file mode 100644
index f2151da..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3aefa26b-3d3e-4320-b4b0-9569556fd846
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3aefa26b-3d3e-4320-b4b0-9569556fd846","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Clear Org\\\" button\",\"actionId\":\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Clear Org\",\"actionId\":\"c93bbdf4-6bdc-4919-875e-84f862be3345\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Clear Org\"}],\"childrenIdList\":[\"c93bbdf4-6bdc-4919-875e-84f862be3345\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Clear Org\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.190000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3be8537e-efa4-4056-ba31-899cb90c8702 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3be8537e-efa4-4056-ba31-899cb90c8702
deleted file mode 100644
index 9794d8a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3be8537e-efa4-4056-ba31-899cb90c8702
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3be8537e-efa4-4056-ba31-899cb90c8702","details":"{\"type\":\"CompoundAction\",\"name\":\"27_Confirm pattern lock test\",\"actionId\":\"3be8537e-efa4-4056-ba31-899cb90c8702\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Confirm pattern lock test\",\"actionId\":\"e256df36-9278-40f4-93fc-264cbe994076\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Confirm pattern lock test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"84de7f8c-20b5-48fc-9320-b77d32258dc4\",\"displayText\":\"Work notification is badged\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Work notification is badged\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":493.6666666666667,\"x2\":360.0,\"y2\":535.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":89.5,\"y\":502.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":90.5,\"y\":12.666666666666629,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"84de7f8c-20b5-48fc-9320-b77d32258dc4\",\"firstText\":\"Work notification is badged\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Confirm pattern lock test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":0.0,\"y1\":489.0,\"x2\":179.0,\"y2\":515.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm pattern lock test\",\"actionId\":\"5e9ab2dd-67d4-4527-a2dc-1ce4f2bd7174\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm pattern lock test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Pattern\",\"actionId\":\"49f7fcb2-4780-41f8-a1bd-4331df6c99de\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Pattern\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"e11f68b0-a083-4ab2-8d78-fa77aa23d12d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm\",\"actionId\":\"f9b302f1-db24-45b2-8adf-1ad84c30ca64\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"7589192d-6323-4640-8d65-eb7c1789ba42\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"d2dbf673-be5b-45db-9059-bf6954a2c9ec\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Home Button\",\"actionId\":\"cc8293b3-b66d-4935-bd3a-3d3f2e45cff0\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":3,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"a44ceb60-e553-4220-b84d-b22a4c5e97c1\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/tab_work\",\"actionId\":\"a1bce504-6e0c-47d2-b86f-53b4410433ad\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.apps.nexuslauncher:id/tab_work\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work Contacts\",\"actionId\":\"84e74b9f-178d-401e-a230-fb7edb3be38d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work Contacts\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if work pattern lock appear\",\"actionId\":\"59b51257-e077-488f-a5c2-f7bb84a3d1ea\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Enter your work pattern\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"23483d51-d7d2-40fb-9c7a-4dffe29808e5\",\"displayText\":\"Enter your work pattern\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/headerText\",\"text\":\"Enter your work pattern\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":132.33333333333334,\"x2\":339.0,\"y2\":160.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":189.5,\"y\":144.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-9.5,\"y\":2.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"23483d51-d7d2-40fb-9c7a-4dffe29808e5\",\"firstText\":\"Enter your work pattern\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Enter your work pattern\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":67.0,\"y1\":128.0,\"x2\":312.0,\"y2\":160.0}},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if work contact is launched\",\"actionId\":\"096d714f-3484-4b4e-9c4a-83314332a192\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.contacts:id/product_name\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Contacts\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Home Button\",\"actionId\":\"390ba1a4-3cc8-4cce-a723-39cb081f85a7\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":3,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"54d8354f-7bb7-415e-9b22-fcc2a6df48c0\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/tab_personal\",\"actionId\":\"26bba8bc-59fd-4146-943a-8d559a4731ec\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.apps.nexuslauncher:id/tab_personal\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"cff37826-1a59-4663-9e14-12851a71466c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"e256df36-9278-40f4-93fc-264cbe994076\",\"5e9ab2dd-67d4-4527-a2dc-1ce4f2bd7174\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"49f7fcb2-4780-41f8-a1bd-4331df6c99de\",\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\",\"e11f68b0-a083-4ab2-8d78-fa77aa23d12d\",\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\",\"f9b302f1-db24-45b2-8adf-1ad84c30ca64\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\",\"7589192d-6323-4640-8d65-eb7c1789ba42\",\"d2dbf673-be5b-45db-9059-bf6954a2c9ec\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"cc8293b3-b66d-4935-bd3a-3d3f2e45cff0\",\"a44ceb60-e553-4220-b84d-b22a4c5e97c1\",\"a1bce504-6e0c-47d2-b86f-53b4410433ad\",\"84e74b9f-178d-401e-a230-fb7edb3be38d\",\"59b51257-e077-488f-a5c2-f7bb84a3d1ea\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"096d714f-3484-4b4e-9c4a-83314332a192\",\"390ba1a4-3cc8-4cce-a723-39cb081f85a7\",\"54d8354f-7bb7-415e-9b22-fcc2a6df48c0\",\"26bba8bc-59fd-4146-943a-8d559a4731ec\",\"cff37826-1a59-4663-9e14-12851a71466c\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"27_Confirm pattern lock test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.308000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c16507a-cc79-4124-a23e-b402ec47f45b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c16507a-cc79-4124-a23e-b402ec47f45b
deleted file mode 100644
index dd91199..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c16507a-cc79-4124-a23e-b402ec47f45b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3c16507a-cc79-4124-a23e-b402ec47f45b","details":"{\"type\":\"CompoundAction\",\"name\":\"Hide voicemail in call settings test\",\"actionId\":\"3c16507a-cc79-4124-a23e-b402ec47f45b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to \\\"Hide voicemail in call settings test\\\"\",\"actionId\":\"d0e1ab02-6413-4116-a94b-799040e808a1\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Hide voicemail in call settings test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"69779384-8653-49be-9689-586e77a96660\",\"displayText\":\"Hide voicemail in call settings test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Hide voicemail in call settings test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":586.6666666666666,\"x2\":350.6666666666667,\"y2\":630.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":140.0,\"y\":613.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":40.0,\"y\":-4.333333333333371,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"69779384-8653-49be-9689-586e77a96660\",\"firstText\":\"Hide voicemail in call settings test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Hide voicemail in call settings test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":598.0,\"x2\":273.0,\"y2\":628.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Hide voicemail in call settings test\",\"actionId\":\"8de4a216-70b4-4048-b67d-bc7a0fbfb2e3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Hide voicemail in call settings test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/set_default_dialer\",\"actionId\":\"ed4ae336-2262-45ee-a6de-98f94e5801c2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_default_dialer\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/open_call_settings\",\"actionId\":\"db9f6d8b-74fb-497e-9c3f-b7ad327301b4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/open_call_settings\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"2e1a8715-d006-4995-bd93-7ca62bca2dd5\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Check if Screen is in Call settings\",\"actionId\":\"e7520f21-6755-4c0d-89c9-05d4e836e43a\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Call settings\"}]},\"clickAfterValidation\":false},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll and check if \\\"Voicemail\\\" is hidden\",\"actionId\":\"4111aac6-3776-42c5-8e71-c3aff3b5fe96\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"CONTAINS\",\"patternValue\":\"Voicemail\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"fddeac0a-f2cd-445a-b908-4f54a39a8cd2\",\"displayText\":\"Additional settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f73842c4-4b32-45df-a135-60c4c69b659e\",\"displayText\":\"Additional settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"5a3e88c3-f5b4-4819-aaff-604636dbc26a\",\"displayText\":\"Additional settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Additional settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":311.3333333333333,\"x2\":137.0,\"y2\":331.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-22.66666666666667,\"y\":2.6666666666666288,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Additional settings\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":296.6666666666667,\"x2\":345.3333333333333,\"y2\":345.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Additional settings\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":296.6666666666667,\"x2\":360.0,\"y2\":345.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":98.5,\"y\":318.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":81.5,\"y\":2.6666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"5a3e88c3-f5b4-4819-aaff-604636dbc26a\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Voicemail\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":188.0,\"y1\":332.0,\"x2\":9.0,\"y2\":305.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"e9781588-a9ee-4be2-8d35-8fb572479c50\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/restore_default_dialer\",\"actionId\":\"83cfa9ae-57f0-4f83-8322-d7c03540d385\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/restore_default_dialer\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Phone app\",\"actionId\":\"a858547e-f1c4-4c35-aa69-a49ffe287422\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Phone app\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click \\\"Phone\\\"\",\"actionId\":\"592d19a3-ab98-45bd-9eb3-bfd83e1cf28b\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/title\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Phone\"}]},\"clickAfterValidation\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f113d56c-15dc-4d8a-9715-a42d6736295d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"4d2431f1-067b-4715-ab7b-02d6b5b1b30f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/settings_hidden\",\"actionId\":\"4edebdad-1f39-41fb-83a6-9c83be15e8c8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/settings_hidden\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"d0e1ab02-6413-4116-a94b-799040e808a1\",\"8de4a216-70b4-4048-b67d-bc7a0fbfb2e3\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"ed4ae336-2262-45ee-a6de-98f94e5801c2\",\"8e5815c6-e55c-4dce-8aeb-8b2a62898a6a\",\"db9f6d8b-74fb-497e-9c3f-b7ad327301b4\",\"2e1a8715-d006-4995-bd93-7ca62bca2dd5\",\"e7520f21-6755-4c0d-89c9-05d4e836e43a\",\"4111aac6-3776-42c5-8e71-c3aff3b5fe96\",\"e9781588-a9ee-4be2-8d35-8fb572479c50\",\"83cfa9ae-57f0-4f83-8322-d7c03540d385\",\"a858547e-f1c4-4c35-aa69-a49ffe287422\",\"592d19a3-ab98-45bd-9eb3-bfd83e1cf28b\",\"f113d56c-15dc-4d8a-9715-a42d6736295d\",\"4d2431f1-067b-4715-ab7b-02d6b5b1b30f\",\"4edebdad-1f39-41fb-83a6-9c83be15e8c8\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_null=null,\"}}","name":"Hide voicemail in call settings test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.282000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c4bab75-4bac-49fa-8264-5f4c3504c60b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c4bab75-4bac-49fa-8264-5f4c3504c60b
deleted file mode 100644
index 3ec2539..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c4bab75-4bac-49fa-8264-5f4c3504c60b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3c4bab75-4bac-49fa-8264-5f4c3504c60b","details":"{\"type\":\"CompoundAction\",\"name\":\"15-15 & 17-06-06-Disallow share location\",\"actionId\":\"3c4bab75-4bac-49fa-8264-5f4c3504c60b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow share location\",\"actionId\":\"14168ea9-39c9-4936-9b7a-d7aa19902cc8\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow share location\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"03baa03a-71d8-4870-97e8-c0071558565c\",\"displayText\":\"Disallow share location\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow share location\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":443.0,\"x2\":360.0,\"y2\":487.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":82.5,\"y\":467.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":97.5,\"y\":-2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"03baa03a-71d8-4870-97e8-c0071558565c\",\"firstText\":\"Disallow share location\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow share location\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":0.0,\"y1\":452.0,\"x2\":165.0,\"y2\":482.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow share location\",\"actionId\":\"0800ec87-c5a1-4e5a-b2f7-2672266c3b3c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow share location\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Use location\",\"actionId\":\"c6577778-5ed7-4615-ab87-2778459bcd62\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Use location\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"9ef9625d-e504-416c-92fb-1eecdfcdb443\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"d8cec779-a103-43fa-ad99-a21a16eaa0b0\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"14168ea9-39c9-4936-9b7a-d7aa19902cc8\",\"0800ec87-c5a1-4e5a-b2f7-2672266c3b3c\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"c6577778-5ed7-4615-ab87-2778459bcd62\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"9ef9625d-e504-416c-92fb-1eecdfcdb443\",\"d8cec779-a103-43fa-ad99-a21a16eaa0b0\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-15 & 17-06-06-Disallow share location","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.142000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c520b0e-60ae-408c-9345-478080bfe14c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c520b0e-60ae-408c-9345-478080bfe14c
deleted file mode 100644
index f3918e4..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3c520b0e-60ae-408c-9345-478080bfe14c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3c520b0e-60ae-408c-9345-478080bfe14c","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if there is bubble on the screen\",\"actionId\":\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if there is bubble on the screen\",\"actionId\":\"d101b8d9-2467-4025-8e4f-d7ae7024508d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/bubble_view\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"d101b8d9-2467-4025-8e4f-d7ae7024508d\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if there is bubble on the screen","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.224000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3d93f0c9-abd2-4d15-92a3-5fc55f696ba9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3d93f0c9-abd2-4d15-92a3-5fc55f696ba9
deleted file mode 100644
index c1f9313..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3d93f0c9-abd2-4d15-92a3-5fc55f696ba9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3d93f0c9-abd2-4d15-92a3-5fc55f696ba9","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Camera Performance\",\"actionId\":\"3d93f0c9-abd2-4d15-92a3-5fc55f696ba9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Camera Performance\",\"actionId\":\"0dd95e2d-df64-4b30-afbd-99a006fc85e6\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Camera Performance\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"afafd555-0f32-43f7-8816-8ef0d05a2a1f\",\"displayText\":\"Camera Performance\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Camera Performance\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":494.5,\"x2\":351.25,\"y2\":536.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":89.5,\"y\":512.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":90.5,\"y\":3.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"afafd555-0f32-43f7-8816-8ef0d05a2a1f\",\"firstText\":\"Camera Performance\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Camera Performance\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":13.0,\"y1\":496.0,\"x2\":166.0,\"y2\":529.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Camera Performance\",\"actionId\":\"dd73a62f-c986-43cb-ba3f-697ff3f5db71\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Camera Performance\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 1- testSingleCapture\",\"actionId\":\"6411bc87-1e9f-48b8-8df1-b40016c5cf2f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testSingleCapture\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 395 secs to finish auto testing\",\"actionId\":\"664cd4a0-304a-4e5a-a84b-3ab7b9423179\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":395000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 2-testReprocessingLatency\",\"actionId\":\"63e282c3-82bb-43d8-a700-6132ef3a41e7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testReprocessingLatency\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 25 secs to finish auto testing\",\"actionId\":\"bfbe6b5b-461c-4064-a77f-8db20b9abd37\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":25000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 3-testReprocessingCaptureStall\",\"actionId\":\"c0400709-5563-41eb-bf79-c377366ccb9c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testReprocessingCaptureStall\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 35 secs to finish auto testing\",\"actionId\":\"d72def4d-5430-4da9-8566-f1247d0da0ce\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":35000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 4-testLegacyApiPerformance\",\"actionId\":\"6f529a15-ba6c-4760-a4ef-9c5f66dab631\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testLegacyApiPerformance\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 100 secs to finish auto testing\",\"actionId\":\"74a3701f-816a-466c-98e9-c56f219ecc73\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":100000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Tests 5-testHighQualityReprocessingLatency\",\"actionId\":\"44483b0a-8929-4a6c-b433-5acaf757a1d7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testHighQualityReprocessingLatency\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 20 secs to finish auto testing\",\"actionId\":\"26748f05-dca9-4d22-8407-4ced88bd6840\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":20000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,Tests 6-testReprocessingThroughput\",\"actionId\":\"4b208fec-6c48-4dbb-816d-abbc4666f0e9\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testReprocessingThroughput\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 15 secs to finish auto testing\",\"actionId\":\"fc8b1a56-07f5-4a46-96f6-c87233d52fe8\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 7-testHighQualityReprocessingThroughput\",\"actionId\":\"99fd5492-55ae-4fa0-a29e-cb5575616e2f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testHighQualityReprocessingThroughput\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 20 secs to finish auto testing\",\"actionId\":\"733e709c-e8ef-48fc-a68a-a62502b550d0\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":20000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Test 8-testMultipleCapture\",\"actionId\":\"c0ef82e4-da05-4595-8673-83d92af7c29f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testMultipleCapture\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 100 secs to finish auto testing\",\"actionId\":\"9f09f73c-164a-4d73-85d6-1009083b94ea\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":100000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Tests 9-testCameraLaunch\",\"actionId\":\"5d48adec-14ce-4cc2-8af4-71dbb71af1a4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"testCameraLaunch\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 80 secs to finish auto testing\",\"actionId\":\"67dacea9-84a0-4236-aa8a-3dca7cf54587\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":80000,\"createdBy\":\"riacheltseng\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"0dd95e2d-df64-4b30-afbd-99a006fc85e6\",\"dd73a62f-c986-43cb-ba3f-697ff3f5db71\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"6411bc87-1e9f-48b8-8df1-b40016c5cf2f\",\"664cd4a0-304a-4e5a-a84b-3ab7b9423179\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"63e282c3-82bb-43d8-a700-6132ef3a41e7\",\"bfbe6b5b-461c-4064-a77f-8db20b9abd37\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"c0400709-5563-41eb-bf79-c377366ccb9c\",\"d72def4d-5430-4da9-8566-f1247d0da0ce\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"6f529a15-ba6c-4760-a4ef-9c5f66dab631\",\"74a3701f-816a-466c-98e9-c56f219ecc73\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"44483b0a-8929-4a6c-b433-5acaf757a1d7\",\"26748f05-dca9-4d22-8407-4ced88bd6840\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"4b208fec-6c48-4dbb-816d-abbc4666f0e9\",\"fc8b1a56-07f5-4a46-96f6-c87233d52fe8\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"99fd5492-55ae-4fa0-a29e-cb5575616e2f\",\"733e709c-e8ef-48fc-a68a-a62502b550d0\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"c0ef82e4-da05-4595-8673-83d92af7c29f\",\"9f09f73c-164a-4d73-85d6-1009083b94ea\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"5d48adec-14ce-4cc2-8af4-71dbb71af1a4\",\"67dacea9-84a0-4236-aa8a-3dca7cf54587\",\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Camera Performance","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.021000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3dabca21-35c3-4633-99c0-52e3a5a0d012 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3dabca21-35c3-4633-99c0-52e3a5a0d012
deleted file mode 100644
index 7f40396..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3dabca21-35c3-4633-99c0-52e3a5a0d012
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3dabca21-35c3-4633-99c0-52e3a5a0d012","details":"{\"type\":\"CompoundAction\",\"name\":\"15-06-Disallow config mobile networks\",\"actionId\":\"3dabca21-35c3-4633-99c0-52e3a5a0d012\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config mobile networks\",\"actionId\":\"8a79681a-f61d-4150-acf3-f669753cce66\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config mobile networks\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1fb16619-0863-49f2-ae0a-51559fce69ac\",\"displayText\":\"Disallow config mobile networks\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config mobile networks\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":298.3333333333333,\"x2\":360.0,\"y2\":342.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":116.0,\"y\":321.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":64.0,\"y\":-1.1666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"1fb16619-0863-49f2-ae0a-51559fce69ac\",\"firstText\":\"Disallow config mobile networks\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config mobile networks\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":1.0,\"y1\":308.0,\"x2\":231.0,\"y2\":335.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config mobile networks\",\"actionId\":\"dd76dce6-bb4d-43af-812c-53bb5ae8f358\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config mobile networks\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Mobile network\",\"actionId\":\"f5d141c7-7833-4ecd-8034-2f57fe6c2cf0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Mobile network\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"20a9c13e-3742-4a31-a810-bb2014245bfe\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"23a072c6-b799-4b2a-9eb4-57cbcaba7d94\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"8a79681a-f61d-4150-acf3-f669753cce66\",\"dd76dce6-bb4d-43af-812c-53bb5ae8f358\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"f5d141c7-7833-4ecd-8034-2f57fe6c2cf0\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"20a9c13e-3742-4a31-a810-bb2014245bfe\",\"23a072c6-b799-4b2a-9eb4-57cbcaba7d94\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-06-Disallow config mobile networks","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.131000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3e3b1b72-32eb-4f57-a45f-d477fdcb1993 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3e3b1b72-32eb-4f57-a45f-d477fdcb1993
deleted file mode 100644
index adb60f6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3e3b1b72-32eb-4f57-a45f-d477fdcb1993
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3e3b1b72-32eb-4f57-a45f-d477fdcb1993","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify None/Swipe/Pattern lock\",\"actionId\":\"3e3b1b72-32eb-4f57-a45f-d477fdcb1993\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Pattern\",\"actionId\":\"d7970b3a-1fdb-442f-8407-fbb2bbad79a5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Pattern\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"de9492b0-2ba2-4b1c-9860-77611e060d4e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"cccc0cd1-82fd-4292-8d4d-2028be141809\",\"d7970b3a-1fdb-442f-8407-fbb2bbad79a5\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"de9492b0-2ba2-4b1c-9860-77611e060d4e\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify None/Swipe/Pattern lock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.159000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3efd7d24-773f-4254-9432-207fa91ad20f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3efd7d24-773f-4254-9432-207fa91ad20f
deleted file mode 100644
index 619b737..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/3efd7d24-773f-4254-9432-207fa91ad20f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"3efd7d24-773f-4254-9432-207fa91ad20f","details":"{\"type\":\"CompoundAction\",\"name\":\"Confirm Pattern lock\",\"actionId\":\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Confirm if pattern lock exist\",\"actionId\":\"f9e997e8-5402-4915-8f40-e6736c213405\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/lockPatternView\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Confirm your pattern\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Enter your work pattern\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"f9e997e8-5402-4915-8f40-e6736c213405\",\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Confirm Pattern lock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.035000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/40e973e7-1cab-4d00-918a-195bb7aab758 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/40e973e7-1cab-4d00-918a-195bb7aab758
deleted file mode 100644
index 95cde75..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/40e973e7-1cab-4d00-918a-195bb7aab758
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"40e973e7-1cab-4d00-918a-195bb7aab758","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Battery Saver Test\",\"actionId\":\"40e973e7-1cab-4d00-918a-195bb7aab758\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Battery Saver Test\",\"actionId\":\"d19e8594-b0dc-45f0-aaf4-8fbcad812ad2\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Battery Saver Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"026ceb0a-45c4-49c0-81b7-c954eff5762d\",\"displayText\":\"Battery Saver Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Battery Saver Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":553.6666666666666,\"x2\":350.6666666666667,\"y2\":597.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":80.0,\"y\":575.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":100.0,\"y\":0.16666666666662877,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"026ceb0a-45c4-49c0-81b7-c954eff5762d\",\"firstText\":\"Battery Saver Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Battery Saver Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":152.0,\"y1\":582.0,\"x2\":8.0,\"y2\":569.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Battery Saver Test\",\"actionId\":\"8f42dc45-8c94-40f4-bffc-659ab4b010b0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Battery Saver Test\"},{\"type\":\"CommandLineAction\",\"name\":\"adb shell dumpsys battery unplug\",\"actionId\":\"d6c9bf5b-7331-4db6-b43b-adee3f3333d0\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell dumpsys battery unplug\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/btn_next\",\"actionId\":\"02a5c0e0-c429-45c8-b11b-712a1a240b6e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/btn_next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Battery Saver\",\"actionId\":\"cfafae19-8d57-43e7-a33c-c585547f8607\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Battery Saver\"},{\"type\":\"ConditionValidationAction\",\"name\":\"CClick \\\"Turn on\\\" for Battery Saver\",\"actionId\":\"9e6133a2-a57c-425d-9037-f0854c232335\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/button1\"}]},\"clickAfterValidation\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/btn_next\",\"actionId\":\"7d7a302a-310f-46ae-88d3-55f61ce3e007\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/btn_next\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-If Now use the button to turn Battery Saver off.\",\"actionId\":\"143faedf-3c39-4da4-8605-b85eb6746aed\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Now use the button to turn Battery Saver off.\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Battery Saver\",\"actionId\":\"0c7d5789-383f-4e31-9fe2-f0538ed88566\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Battery Saver\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/btn_next\",\"actionId\":\"4105d20c-343e-4728-8ea6-22ec410e453c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/btn_next\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-If All tests completed successfully.\",\"actionId\":\"759630cc-c728-4743-b8ce-7eec4cf86481\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"All tests completed successfully.\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"d19e8594-b0dc-45f0-aaf4-8fbcad812ad2\",\"8f42dc45-8c94-40f4-bffc-659ab4b010b0\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"d6c9bf5b-7331-4db6-b43b-adee3f3333d0\",\"02a5c0e0-c429-45c8-b11b-712a1a240b6e\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"cfafae19-8d57-43e7-a33c-c585547f8607\",\"9e6133a2-a57c-425d-9037-f0854c232335\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"7d7a302a-310f-46ae-88d3-55f61ce3e007\",\"143faedf-3c39-4da4-8605-b85eb6746aed\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"0c7d5789-383f-4e31-9fe2-f0538ed88566\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"4105d20c-343e-4728-8ea6-22ec410e453c\",\"759630cc-c728-4743-b8ce-7eec4cf86481\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Battery Saver Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.242000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/41618467-e1d1-4cb0-ba3c-c3230a3442bf b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/41618467-e1d1-4cb0-ba3c-c3230a3442bf
deleted file mode 100644
index 4e9f9d6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/41618467-e1d1-4cb0-ba3c-c3230a3442bf
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"41618467-e1d1-4cb0-ba3c-c3230a3442bf","details":"{\"type\":\"CompoundAction\",\"name\":\"Validate Pass button\",\"actionId\":\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Wait for Pass button enabled\",\"actionId\":\"73b24e77-6d2d-4a8e-99ec-b0b3c57372d2\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"actionDescription\":\"timeout=10\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.ui_selector import UiSelector\\n\\n\\nd= Device.create_device_by_slot(0)\\n\\nphone_selector = UiSelector().resource_id(\\\"com.android.cts.verifier:id/pass_button\\\").attributes(\\\"enabled\\\", \\\"true\\\")\\nd.wait_for(selector=phone_selector, timeout=10)\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Pass button enabled or not\",\"actionId\":\"4d541a78-c508-4dde-bdbf-28ddc0fc5e63\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/pass_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/pass_button\",\"actionId\":\"9e4e9690-0d46-4819-9615-c3d4dfc447f8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/pass_button\"}],\"childrenIdList\":[\"73b24e77-6d2d-4a8e-99ec-b0b3c57372d2\",\"4d541a78-c508-4dde-bdbf-28ddc0fc5e63\",\"9e4e9690-0d46-4819-9615-c3d4dfc447f8\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Validate Pass button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.001000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4275df2b-8d38-49a9-b956-6d5f06257f5a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4275df2b-8d38-49a9-b956-6d5f06257f5a
deleted file mode 100644
index 98e4a45..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4275df2b-8d38-49a9-b956-6d5f06257f5a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4275df2b-8d38-49a9-b956-6d5f06257f5a","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Request bugreport button\",\"actionId\":\"4275df2b-8d38-49a9-b956-6d5f06257f5a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Request bugreport\",\"actionId\":\"4b3ed003-c194-4fcb-8bc2-127787d8c928\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Request bugreport\"}],\"childrenIdList\":[\"4b3ed003-c194-4fcb-8bc2-127787d8c928\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Request bugreport button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.071000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/440786b7-f1d9-4c77-ad81-28068fe6a608 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/440786b7-f1d9-4c77-ad81-28068fe6a608
deleted file mode 100644
index c401d30..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/440786b7-f1d9-4c77-ad81-28068fe6a608
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"440786b7-f1d9-4c77-ad81-28068fe6a608","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"WiFi config lockdown on\\\"\",\"actionId\":\"440786b7-f1d9-4c77-ad81-28068fe6a608\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, WiFi config lockdown on\",\"actionId\":\"3a941e5b-3e43-4c98-81ef-edcfd86cbfaf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"WiFi config lockdown on\"}],\"childrenIdList\":[\"3a941e5b-3e43-4c98-81ef-edcfd86cbfaf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"WiFi config lockdown on\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.088000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/44291145-6774-4ba3-9caf-731853cef58e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/44291145-6774-4ba3-9caf-731853cef58e
deleted file mode 100644
index 2c5172d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/44291145-6774-4ba3-9caf-731853cef58e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"44291145-6774-4ba3-9caf-731853cef58e","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if screen back to 15-Policy transparency test\",\"actionId\":\"44291145-6774-4ba3-9caf-731853cef58e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if screen still in Policy transparency test\",\"actionId\":\"53dc2186-d443-467a-b992-1ce70a13103e\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Policy transparency test\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6d3cbd80-d7ea-4d38-9898-bb6b83055ecd\",\"displayText\":\"Policy transparency test\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"93e7f232-2698-45e5-b3a5-116eb0d9ff4e\",\"displayText\":\"Navigate up\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageButton\",\"contentDesc\":\"Navigate up\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":22.0,\"x2\":51.333333333333336,\"y2\":73.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Navigate up\"},{\"uuid\":\"05f9d089-fb2a-47b9-98d2-209ab91ec6dd\",\"displayText\":\"Policy transparency test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Policy transparency test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":35.333333333333336,\"x2\":273.0,\"y2\":60.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.0,\"y\":1.6666666666666714,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Policy transparency test\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/action_bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":22.0,\"x2\":360.0,\"y2\":73.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":166.5,\"y\":46.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":13.5,\"y\":1.6666666666666643,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"05f9d089-fb2a-47b9-98d2-209ab91ec6dd\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Policy transparency test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":55.0,\"y1\":33.0,\"x2\":278.0,\"y2\":59.0}},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Policy transparency test\",\"actionId\":\"2e07bac6-36eb-4877-a487-9c918120407a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Policy transparency test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"84d2c14c-aa92-4a52-b88f-f36f496ea5d2\",\"displayText\":\"Policy transparency test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Policy transparency test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":465.6666666666667,\"x2\":350.6666666666667,\"y2\":509.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":100.0,\"y\":489.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":80.0,\"y\":-1.8333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"84d2c14c-aa92-4a52-b88f-f36f496ea5d2\",\"firstText\":\"Policy transparency test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Policy transparency test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":470.0,\"x2\":193.0,\"y2\":509.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Policy transparency test\",\"actionId\":\"be16aacd-24be-41ad-ad63-56b9b6a81d5d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Policy transparency test\"}],\"childrenIdList\":[\"53dc2186-d443-467a-b992-1ce70a13103e\",\"b50df53e-f816-49d2-b907-500f3f4f3b5a\",\"b36ee844-6807-46a4-9073-3d5c83f730fd\",\"2e07bac6-36eb-4877-a487-9c918120407a\",\"be16aacd-24be-41ad-ad63-56b9b6a81d5d\",\"336938a2-a45e-4245-a4a7-2f8704bc265d\",\"d1023735-52c1-48bc-9dc7-a7b03a15ca7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if screen back to 15-Policy transparency test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.119000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/446a3aa1-905d-4268-8532-5bf77fe7fbe6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/446a3aa1-905d-4268-8532-5bf77fe7fbe6
deleted file mode 100644
index 4e45d4d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/446a3aa1-905d-4268-8532-5bf77fe7fbe6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"446a3aa1-905d-4268-8532-5bf77fe7fbe6","details":"{\"type\":\"CompoundAction\",\"name\":\"15-04-Disallow config cell broadcasts\",\"actionId\":\"446a3aa1-905d-4268-8532-5bf77fe7fbe6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config cell broadcasts\",\"actionId\":\"41b1ff1b-c557-442a-869a-edcf0945fd93\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config cell broadcasts\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e4f4be4d-7073-4cf6-b299-27b4431487ac\",\"displayText\":\"Disallow config cell broadcasts\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config cell broadcasts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":208.33333333333334,\"x2\":360.0,\"y2\":252.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":114.0,\"y\":231.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":66.0,\"y\":-1.1666666666666572,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"e4f4be4d-7073-4cf6-b299-27b4431487ac\",\"firstText\":\"Disallow config cell broadcasts\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config cell broadcasts\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":211.0,\"x2\":220.0,\"y2\":252.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config cell broadcasts\",\"actionId\":\"3d2ced00-bd20-401f-bf72-5994d6b10c23\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config cell broadcasts\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Apps & notifications\",\"actionId\":\"8a9e042e-1768-41af-bfca-64d5aa905555\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Apps & notifications\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Wireless emergency alerts\",\"actionId\":\"7c0c17cc-4dd8-44ca-9c5e-3353cb6d1112\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Wireless emergency alerts\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6456f79c-6642-43ce-bf67-90acd356ac01\",\"displayText\":\"Wireless emergency alerts\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0477950a-5b42-47fa-b164-91a627432ace\",\"displayText\":\"Wireless emergency alerts\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e595a4d2-c7e3-474b-a140-17ec5774c119\",\"displayText\":\"Wireless emergency alerts\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c740afd6-88d3-45d1-956f-606c77965eb9\",\"displayText\":\"Wireless emergency alerts\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Wireless emergency alerts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":false,\"bounds\":{\"x1\":66.0,\"y1\":575.0,\"x2\":241.66666666666666,\"y2\":594.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.166666666666686,\"y\":0.33333333333325754,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Wireless emergency alerts\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":false,\"bounds\":{\"x1\":66.0,\"y1\":560.3333333333334,\"x2\":285.6666666666667,\"y2\":609.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Wireless emergency alerts\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":false,\"bounds\":{\"x1\":0.0,\"y1\":560.3333333333334,\"x2\":300.3333333333333,\"y2\":609.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Wireless emergency alerts\"},{\"uuid\":\"52ccd4f5-d9ee-48c6-a995-58384cf769e8\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"2f1dd049-b191-43d2-94d2-58b416bc4f00\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/restricted_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":false,\"bounds\":{\"x1\":323.3333333333333,\"y1\":577.3333333333334,\"x2\":338.0,\"y2\":592.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/widget_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":false,\"bounds\":{\"x1\":301.3333333333333,\"y1\":560.3333333333334,\"x2\":360.0,\"y2\":609.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":560.3333333333334,\"x2\":360.0,\"y2\":609.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":158.0,\"y\":584.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":22.0,\"y\":0.33333333333337123,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"c740afd6-88d3-45d1-956f-606c77965eb9\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Wireless emergency alerts\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":66.0,\"y1\":571.0,\"x2\":250.0,\"y2\":598.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Wireless emergency alerts\",\"actionId\":\"b8e8424a-577a-48f6-80b9-ed2f8cae7dc6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Wireless emergency alerts\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"41b1ff1b-c557-442a-869a-edcf0945fd93\",\"3d2ced00-bd20-401f-bf72-5994d6b10c23\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"8a9e042e-1768-41af-bfca-64d5aa905555\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"7c0c17cc-4dd8-44ca-9c5e-3353cb6d1112\",\"b8e8424a-577a-48f6-80b9-ed2f8cae7dc6\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-04-Disallow config cell broadcasts","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.129000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/44fc4c64-e1d3-4482-8b56-b1c0c547722d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/44fc4c64-e1d3-4482-8b56-b1c0c547722d
deleted file mode 100644
index d0cc124..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/44fc4c64-e1d3-4482-8b56-b1c0c547722d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"44fc4c64-e1d3-4482-8b56-b1c0c547722d","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Hide settings in voicemail test(Check image)\",\"actionId\":\"44fc4c64-e1d3-4482-8b56-b1c0c547722d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to \\\"Hide settings in voicemail test\\\"\",\"actionId\":\"4a022518-ac9d-461b-8ee4-7e211b8b766d\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Hide settings in voicemail test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"fc2657b7-11bf-4dfd-bc50-9f57cb4fd386\",\"displayText\":\"Hide settings in voicemail test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Hide settings in voicemail test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":436.6666666666667,\"x2\":350.6666666666667,\"y2\":480.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":118.0,\"y\":459.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":62.0,\"y\":-0.8333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"fc2657b7-11bf-4dfd-bc50-9f57cb4fd386\",\"firstText\":\"Hide settings in voicemail test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Hide settings in voicemail test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":224.0,\"y1\":472.0,\"x2\":12.0,\"y2\":447.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Hide settings in voicemail test\",\"actionId\":\"0db5ebc8-4271-4c89-9224-d0acbdfbbd7b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Hide settings in voicemail test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/open_voicemail_settings\",\"actionId\":\"3d62bf02-fd24-400e-8b80-2b3b84635236\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/open_voicemail_settings\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"a5b33e29-56ec-4b8a-abe3-b376b9c247ac\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"d58bef99-501c-4489-94f0-324c1f624aa1\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/settings_hidden\",\"actionId\":\"75d929ed-dd0e-4eb3-893a-4b0f3fbb8ac1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/settings_hidden\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"4a022518-ac9d-461b-8ee4-7e211b8b766d\",\"0db5ebc8-4271-4c89-9224-d0acbdfbbd7b\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"3d62bf02-fd24-400e-8b80-2b3b84635236\",\"a5b33e29-56ec-4b8a-abe3-b376b9c247ac\",\"838a9611-4bf1-4317-8599-98f7e872efdb\",\"34391efa-20da-4c54-a657-418d1b4a5ddd\",\"d58bef99-501c-4489-94f0-324c1f624aa1\",\"75d929ed-dd0e-4eb3-893a-4b0f3fbb8ac1\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_null=null,\"}}","name":"test_Hide settings in voicemail test(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.280000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/460b5da5-d44f-4f91-ad3a-68715ff4684c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/460b5da5-d44f-4f91-ad3a-68715ff4684c
deleted file mode 100644
index b1b20c3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/460b5da5-d44f-4f91-ad3a-68715ff4684c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"460b5da5-d44f-4f91-ad3a-68715ff4684c","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn on airplane mode\",\"actionId\":\"460b5da5-d44f-4f91-ad3a-68715ff4684c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Network & internet\",\"actionId\":\"4cd80e64-fe29-4749-8e02-fd67b9d80a45\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Network & internet\"},{\"type\":\"PythonScriptAction\",\"name\":\"Turn airplane switch on\",\"actionId\":\"53d93658-4d96-4dae-99c0-278e8167fb8a\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"Airplane mode\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"Airplane mode\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"4cd80e64-fe29-4749-8e02-fd67b9d80a45\",\"53d93658-4d96-4dae-99c0-278e8167fb8a\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn on airplane mode","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.272000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/46149c51-f989-4ff1-98c5-18a09bcb4fa5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/46149c51-f989-4ff1-98c5-18a09bcb4fa5
deleted file mode 100644
index 4bf4d29..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/46149c51-f989-4ff1-98c5-18a09bcb4fa5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"46149c51-f989-4ff1-98c5-18a09bcb4fa5","details":"{\"type\":\"CompoundAction\",\"name\":\"Assert the work profile location go enabled and into its previous state off\",\"actionId\":\"46149c51-f989-4ff1-98c5-18a09bcb4fa5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Assert the work profile location go enabled and into its previous state off\",\"actionId\":\"16affe7b-42f2-4b83-bfbd-b23001608356\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\nuicd_util = UICDPythonUtil()\\nd = Device.create_device_by_slot(0)\\n\\nresult = d.text(\\\"Location for work profile\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"enabled\\\", \\\"true\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"16affe7b-42f2-4b83-bfbd-b23001608356\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Assert the work profile location go enabled and into its previous state off","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.287000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/477825e2-33af-4238-acac-4dce5c1c5b84 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/477825e2-33af-4238-acac-4dce5c1c5b84
deleted file mode 100644
index 2bb4097..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/477825e2-33af-4238-acac-4dce5c1c5b84
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"477825e2-33af-4238-acac-4dce5c1c5b84","details":"{\"type\":\"CompoundAction\",\"name\":\"15-15-Disallow share location\",\"actionId\":\"477825e2-33af-4238-acac-4dce5c1c5b84\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"3c4bab75-4bac-49fa-8264-5f4c3504c60b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-15-Disallow share location","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.141000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4994c7d8-acaf-4272-b8f5-6768561cf2cf b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4994c7d8-acaf-4272-b8f5-6768561cf2cf
deleted file mode 100644
index a5c2d00..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4994c7d8-acaf-4272-b8f5-6768561cf2cf
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4994c7d8-acaf-4272-b8f5-6768561cf2cf","details":"{\"type\":\"CompoundAction\",\"name\":\"09_Profile-aware user settings\",\"actionId\":\"4994c7d8-acaf-4272-b8f5-6768561cf2cf\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Profile-aware user settings\",\"actionId\":\"895afd7e-8604-47a5-8e50-e531cadfceb3\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Profile-aware user settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e963f305-757a-45bc-856e-63d936ee2bb4\",\"displayText\":\"Profile-aware user settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Profile-aware user settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":526.6666666666666,\"x2\":360.0,\"y2\":570.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":102.0,\"y\":552.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":78.0,\"y\":-3.3333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"e963f305-757a-45bc-856e-63d936ee2bb4\",\"firstText\":\"Profile-aware user settings\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Profile-aware user settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":202.0,\"y1\":562.0,\"x2\":2.0,\"y2\":542.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Profile-aware user settings\",\"actionId\":\"e86b80c1-1658-40d0-a1d8-9357c2932435\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Profile-aware user settings\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Auto-sync personal data\",\"actionId\":\"e1589143-428c-4c35-9d9a-7cac2214b5d0\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Auto-sync personal data\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work\",\"actionId\":\"0ad4144f-50b3-46d8-aa55-af474d7eb20d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Auto-sync work data\",\"actionId\":\"e7f2714f-0e7f-4433-8244-a14b849527c8\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Auto-sync work data\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Turn auto-sync data off for Work\",\"actionId\":\"226232b7-f8ba-4a2e-914d-ea6f6c974b46\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nd.text(\\\"Auto-sync work data\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"Turn auto-sync data off?\",\"actionId\":\"06ed1da9-10ef-416f-afab-dceb2a2c01f7\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Turn auto-sync data off?\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button2\",\"actionId\":\"0b3f4416-8c47-4b58-9c9e-9a15827a75c5\",\"actionType\":\"CLICK_ACTION\",\"actionDescription\":\"Cancel\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button2\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Personal\",\"actionId\":\"e131451d-a8d1-47ee-82ae-0174d626189b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Personal\"},{\"type\":\"PythonScriptAction\",\"name\":\"Turn auto-sync data off for Personal\",\"actionId\":\"12f7fec8-2403-4584-9e6c-1093f8e312fa\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nd.text(\\\"Auto-sync personal data\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"Turn auto-sync data off?\",\"actionId\":\"f92aca92-1d2e-4af8-aa1a-e26bafc204eb\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Turn auto-sync data off?\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button2\",\"actionId\":\"4a824900-29bb-46fa-8d66-0a0c342191eb\",\"actionType\":\"CLICK_ACTION\",\"actionDescription\":\"Cancel\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button2\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"44544468-239a-402a-8b10-287827c1e4fa\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"3e968665-a1c3-40bd-8548-99aa25421f28\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"895afd7e-8604-47a5-8e50-e531cadfceb3\",\"e86b80c1-1658-40d0-a1d8-9357c2932435\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"7b8a5983-efee-45ea-aaa2-9aaf6d82e063\",\"e1589143-428c-4c35-9d9a-7cac2214b5d0\",\"0ad4144f-50b3-46d8-aa55-af474d7eb20d\",\"e7f2714f-0e7f-4433-8244-a14b849527c8\",\"226232b7-f8ba-4a2e-914d-ea6f6c974b46\",\"06ed1da9-10ef-416f-afab-dceb2a2c01f7\",\"0b3f4416-8c47-4b58-9c9e-9a15827a75c5\",\"e131451d-a8d1-47ee-82ae-0174d626189b\",\"12f7fec8-2403-4584-9e6c-1093f8e312fa\",\"f92aca92-1d2e-4af8-aa1a-e26bafc204eb\",\"4a824900-29bb-46fa-8d66-0a0c342191eb\",\"44544468-239a-402a-8b10-287827c1e4fa\",\"3e968665-a1c3-40bd-8548-99aa25421f28\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"09_Profile-aware user settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.301000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49bfb869-2ef5-4df6-8fff-3192112b82a2 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49bfb869-2ef5-4df6-8fff-3192112b82a2
deleted file mode 100644
index 91ef366..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49bfb869-2ef5-4df6-8fff-3192112b82a2
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"49bfb869-2ef5-4df6-8fff-3192112b82a2","details":"{\"type\":\"CompoundAction\",\"name\":\"Set \\\"PIN\\\" lock to \\\"1234\\\"\",\"actionId\":\"49bfb869-2ef5-4df6-8fff-3192112b82a2\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, PIN\",\"actionId\":\"9d3b6c9a-48fa-468b-b171-c46b9d19349b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"PIN\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"c68f48e7-3a0b-4944-b1f0-97e2feb1c80c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm\",\"actionId\":\"c8efc73d-6a4d-4b2e-84d4-5a7ed6ac7163\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"9d3b6c9a-48fa-468b-b171-c46b9d19349b\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"c68f48e7-3a0b-4944-b1f0-97e2feb1c80c\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"c8efc73d-6a4d-4b2e-84d4-5a7ed6ac7163\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set \"PIN\" lock to \"1234\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.036000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49c301ea-be46-4ac5-87fc-21262da2994c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49c301ea-be46-4ac5-87fc-21262da2994c
deleted file mode 100644
index 7b1b88a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49c301ea-be46-4ac5-87fc-21262da2994c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"49c301ea-be46-4ac5-87fc-21262da2994c","details":"{\"type\":\"CompoundAction\",\"name\":\"Sensor teardown\",\"actionId\":\"49c301ea-be46-4ac5-87fc-21262da2994c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[],\"childrenIdList\":[\"caa6ccab-46bc-4259-abd1-dabe145e275a\",\"87aa94cd-e4ba-4453-9d58-267514ce16bb\",\"d3450ee9-4ee0-4753-bb29-15c5b3906285\",\"96f52bf6-6606-42ab-8b3a-fd6c554ea30a\",\"59eff0da-e8a3-4322-9f00-9a3bd9237e10\",\"dc47dc72-9a74-4b16-9c5f-4d2cd0560854\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Sensor teardown","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.274000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49d12aa6-c679-44be-ba72-a6c46a5cd4d7 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49d12aa6-c679-44be-ba72-a6c46a5cd4d7
deleted file mode 100644
index ec55718..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/49d12aa6-c679-44be-ba72-a6c46a5cd4d7
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"49d12aa6-c679-44be-ba72-a6c46a5cd4d7","details":"{\"type\":\"CompoundAction\",\"name\":\"Sensor presetting\",\"actionId\":\"49d12aa6-c679-44be-ba72-a6c46a5cd4d7\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[],\"childrenIdList\":[\"460b5da5-d44f-4f91-ad3a-68715ff4684c\",\"1013c0fa-aac7-432d-aed1-e33c58b4d603\",\"2468d1f3-142c-41da-b713-09b253fe81f6\",\"b6c8e3c8-6ab1-4886-8f5e-037dd9346a51\",\"050ca8c7-6332-41f5-af2b-8a02b680bf14\",\"59dc74cf-f26b-4e66-85e1-4fb8ce477ae9\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Sensor presetting","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.272000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4a5899ed-71fd-4562-8aab-737e20b84297 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4a5899ed-71fd-4562-8aab-737e20b84297
deleted file mode 100644
index fbb5ae9..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4a5899ed-71fd-4562-8aab-737e20b84297
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4a5899ed-71fd-4562-8aab-737e20b84297","details":"{\"type\":\"CompoundAction\",\"name\":\"15-03-Disallow controlling apps\",\"actionId\":\"4a5899ed-71fd-4562-8aab-737e20b84297\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow controlling apps\",\"actionId\":\"56baac9e-bb68-4b41-8209-8ef222eb4c3f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow controlling apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"70ac26c9-793d-4727-997b-649783642abc\",\"displayText\":\"Disallow controlling apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow controlling apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":163.33333333333334,\"x2\":360.0,\"y2\":207.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":91.0,\"y\":180.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":89.0,\"y\":5.333333333333343,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"70ac26c9-793d-4727-997b-649783642abc\",\"firstText\":\"Disallow controlling apps\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow controlling apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":165.0,\"x2\":178.0,\"y2\":195.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow controlling apps\",\"actionId\":\"7dcff8bf-1385-4282-b9df-f7aa0a72e71c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow controlling apps\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find CtsPermissionApp\",\"actionId\":\"2c49567f-cc40-4ef8-9fdd-eab6ed9092a3\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CtsPermissionApp\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"73a683f7-a858-4b5b-89cf-3da9515c1c4c\",\"displayText\":\"CtsPermissionApp\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"5e2efdd5-2b6e-4b09-aa91-6d38f7c136a3\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ba322457-c380-414b-8283-77f3d20ecba0\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":461.3333333333333,\"x2\":44.0,\"y2\":490.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":457.6666666666667,\"x2\":66.0,\"y2\":494.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"7712e3cb-a235-47de-b360-d372ce88b047\",\"displayText\":\"CtsPermissionApp\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"97340da8-0755-4135-b4fd-8a99bf202971\",\"displayText\":\"CtsPermissionApp\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"CtsPermissionApp\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":457.3333333333333,\"x2\":188.33333333333334,\"y2\":477.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.1666666666666714,\"y\":-0.33333333333337123,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"CtsPermissionApp\"},{\"uuid\":\"e8a23f8b-723f-4376-a391-da21b0429e4a\",\"displayText\":\"92.67 kB\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"92.67 kB\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":477.0,\"x2\":345.3333333333333,\"y2\":494.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"92.67 kB\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":442.6666666666667,\"x2\":345.3333333333333,\"y2\":509.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"CtsPermissionApp\"}],\"className\":\"android.widget.LinearLayout\",\"contentDesc\":\"CtsPermissionApp\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":442.6666666666667,\"x2\":360.0,\"y2\":509.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":126.0,\"y\":467.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":54.0,\"y\":8.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"97340da8-0755-4135-b4fd-8a99bf202971\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CtsPermissionApp\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":64.0,\"y1\":453.0,\"x2\":188.0,\"y2\":482.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, CtsPermissionApp\",\"actionId\":\"067ab01d-c9da-4458-8843-bec74099374c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CtsPermissionApp\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, uninstall button\",\"actionId\":\"324cd3e4-1040-44fa-86d5-da4cec98ee1b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button2\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"2a829745-dafd-4bb8-87c2-98c54855f20f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"3f729d9a-a073-411a-af96-ed83aefeb20a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find Chrome\",\"actionId\":\"60dfcaf6-8694-4c17-9ef3-7d7920127c19\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Chrome\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"686fc021-cbb5-41c8-8261-c3003a4a3a47\",\"displayText\":\"com.google.wireless.qa.uicd.xmldumper.test\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"bf92bce5-6923-423a-b2ca-ec8ef0f96884\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e38f93eb-e59e-4101-80d5-bb0a31d2b959\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":126.33333333333333,\"x2\":44.0,\"y2\":155.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":122.66666666666667,\"x2\":66.0,\"y2\":159.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"4f128d23-20cd-4505-b8bd-66dd87e8adb3\",\"displayText\":\"com.google.wireless.qa.uicd.xmldumper.test\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"79f94cb6-1a02-4330-86f6-2e78a017dd11\",\"displayText\":\"com.google.wireless.qa.uicd.xmldumper.test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"com.google.wireless.qa.uicd.xmldumper.test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":122.33333333333333,\"x2\":345.3333333333333,\"y2\":142.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":110.16666666666666,\"y\":-0.3333333333333428,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"com.google.wireless.qa.uicd.xmldumper.test\"},{\"uuid\":\"8782fe0e-6d46-41b3-99aa-196abce6627c\",\"displayText\":\"838 kB\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"838 kB\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":142.0,\"x2\":345.3333333333333,\"y2\":159.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"838 kB\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":107.66666666666667,\"x2\":345.3333333333333,\"y2\":174.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"com.google.wireless.qa.uicd.xmldumper.test\"}],\"className\":\"android.widget.LinearLayout\",\"contentDesc\":\"com.google.wireless.qa.uicd.xmldumper.test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":107.66666666666667,\"x2\":360.0,\"y2\":174.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":95.5,\"y\":132.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":84.5,\"y\":8.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"79f94cb6-1a02-4330-86f6-2e78a017dd11\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Chrome\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":119.0,\"x2\":137.0,\"y2\":146.0},\"scrollOrientation\":1,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Chrome\",\"actionId\":\"fb7e169a-6b81-48c3-9114-550ce2f86071\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Chrome\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disable button\",\"actionId\":\"184c9305-e9de-4d02-af1b-c06039b2dc68\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button2\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"06bb9bd4-2475-4853-89be-59f6665a4807\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, iForce stop button\",\"actionId\":\"aba70a51-d52d-485b-9368-93b10f04aa27\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button3\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"56baac9e-bb68-4b41-8209-8ef222eb4c3f\",\"7dcff8bf-1385-4282-b9df-f7aa0a72e71c\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"2c49567f-cc40-4ef8-9fdd-eab6ed9092a3\",\"067ab01d-c9da-4458-8843-bec74099374c\",\"324cd3e4-1040-44fa-86d5-da4cec98ee1b\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"2a829745-dafd-4bb8-87c2-98c54855f20f\",\"3f729d9a-a073-411a-af96-ed83aefeb20a\",\"60dfcaf6-8694-4c17-9ef3-7d7920127c19\",\"fb7e169a-6b81-48c3-9114-550ce2f86071\",\"184c9305-e9de-4d02-af1b-c06039b2dc68\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"06bb9bd4-2475-4853-89be-59f6665a4807\",\"aba70a51-d52d-485b-9368-93b10f04aa27\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-03-Disallow controlling apps","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.127000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4aa267cc-73f0-487e-aa22-e57d487ff769 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4aa267cc-73f0-487e-aa22-e57d487ff769
deleted file mode 100644
index c0fe4d6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4aa267cc-73f0-487e-aa22-e57d487ff769
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4aa267cc-73f0-487e-aa22-e57d487ff769","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify Personal and Work tabs\",\"actionId\":\"4aa267cc-73f0-487e-aa22-e57d487ff769\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Personal\",\"actionId\":\"3fb09b95-68b5-4f40-83cc-03cbaee31e4a\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Personal\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"Work\",\"actionId\":\"21142382-0d75-408e-9188-7a7840f35f81\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Work\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"3fb09b95-68b5-4f40-83cc-03cbaee31e4a\",\"21142382-0d75-408e-9188-7a7840f35f81\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify Personal and Work tabs","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.298000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4c401ff4-c80e-44d8-b94c-819dc1366093 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4c401ff4-c80e-44d8-b94c-819dc1366093
deleted file mode 100644
index d095212..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4c401ff4-c80e-44d8-b94c-819dc1366093
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4c401ff4-c80e-44d8-b94c-819dc1366093","details":"{\"type\":\"CompoundAction\",\"name\":\"Delete managed users\",\"actionId\":\"4c401ff4-c80e-44d8-b94c-819dc1366093\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"PYSCRIPT-Delete users\",\"actionId\":\"b4464671-7477-4aa1-bbac-271f89f5a729\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nwhile d.text(\\\"managed user\\\").verify_exist():\\n d.text(\\\"managed user\\\").click()\\n d.text(\\\"Delete user\\\").click()\\n d.resource_id(\\\"android:id/button1\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"12e01265-ef71-4a9b-92fa-96edbbf0df2a\",\"64db6b9d-caaa-442f-840a-80ef16030e55\",\"b4464671-7477-4aa1-bbac-271f89f5a729\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Delete managed users","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.081000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4da412fa-0048-4a4b-9ba8-d4aabc5dd6a1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4da412fa-0048-4a4b-9ba8-d4aabc5dd6a1
deleted file mode 100644
index 8fe96f2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4da412fa-0048-4a4b-9ba8-d4aabc5dd6a1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4da412fa-0048-4a4b-9ba8-d4aabc5dd6a1","details":"{\"type\":\"CompoundAction\",\"name\":\"15-21-Disallow config brightness\",\"actionId\":\"4da412fa-0048-4a4b-9ba8-d4aabc5dd6a1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"e395e5d8-df59-4e7d-bf18-6cd65da3ff8b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-21-Disallow config brightness","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.151000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4e7e041d-2ca6-409d-9c9f-544c4f9a4a0a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4e7e041d-2ca6-409d-9c9f-544c4f9a4a0a
deleted file mode 100644
index be66ec8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4e7e041d-2ca6-409d-9c9f-544c4f9a4a0a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4e7e041d-2ca6-409d-9c9f-544c4f9a4a0a","details":"{\"type\":\"CompoundAction\",\"name\":\"16-03-Request bug report\",\"actionId\":\"4e7e041d-2ca6-409d-9c9f-544c4f9a4a0a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Request bug report\",\"actionId\":\"fece80c6-bee5-43e4-90ca-191f56421177\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Request bug report\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b1c2a7b7-6713-4387-be6f-b5fcb8300ef2\",\"displayText\":\"Request bug report\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Request bug report\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":168.25,\"x2\":351.25,\"y2\":210.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":77.5,\"y\":190.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":102.5,\"y\":-0.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"b1c2a7b7-6713-4387-be6f-b5fcb8300ef2\",\"firstText\":\"Request bug report\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Request bug report\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":168.0,\"x2\":151.0,\"y2\":212.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Request bug report\",\"actionId\":\"589394c1-b8e5-4dde-9204-1f533d477e7a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Request bug report\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Request Bug Report\",\"actionId\":\"ade60687-589d-4c6c-a9fa-53ea5e71b542\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Request Bug Report\"},{\"type\":\"PythonScriptAction\",\"name\":\"Verify that you are told a bug report was last requested at the time you pressed\",\"actionId\":\"18d592ec-a43f-4de7-b8c0-260136c30c87\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\nfrom python_uiautomator.constant import MatchOption\\n\\nuicd_util = UICDPythonUtil()\\nd= Device.create_device_by_slot(0)\\n\\ntime = dict(d.resource_id(\\\"com.android.systemui:id/clock\\\").get_attributes())['text']\\n\\nresult = d.text(\\\"Most recent bug report\\\").down().text(time, MatchOption.CONTAINS).verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"03e1f3e9-94d8-48bb-9d96-2ea48565e6e9\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"fece80c6-bee5-43e4-90ca-191f56421177\",\"589394c1-b8e5-4dde-9204-1f533d477e7a\",\"ade60687-589d-4c6c-a9fa-53ea5e71b542\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"18d592ec-a43f-4de7-b8c0-260136c30c87\",\"03e1f3e9-94d8-48bb-9d96-2ea48565e6e9\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-03-Request bug report","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.171000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4f3ec13b-589a-4ca3-b456-7224028d0604 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4f3ec13b-589a-4ca3-b456-7224028d0604
deleted file mode 100644
index 3a58d79..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4f3ec13b-589a-4ca3-b456-7224028d0604
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4f3ec13b-589a-4ca3-b456-7224028d0604","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if screen back to Device Owner requesting Bugreport \",\"actionId\":\"4f3ec13b-589a-4ca3-b456-7224028d0604\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if screen in Set up device owner\",\"actionId\":\"005b1a23-e192-475d-a1b2-8574c342143b\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set up device owner\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b2534f13-24a6-4a56-9f15-0e6940805ceb\",\"displayText\":\"Set up device owner\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.cts.verifier:id/set_device_owner_button\",\"text\":\"Set up device owner\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":238.0,\"x2\":178.5,\"y2\":280.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":257.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":1.25,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"b2534f13-24a6-4a56-9f15-0e6940805ceb\",\"firstText\":\"Set up device owner\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set up device owner\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":20.0,\"y1\":239.0,\"x2\":156.0,\"y2\":276.0}}],\"childrenIdList\":[\"005b1a23-e192-475d-a1b2-8574c342143b\",\"370c511c-5950-4b3a-b832-60f2a606a27a\",\"bd22d00c-3bff-4749-8763-3323c17809bb\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if screen back to Device Owner requesting Bugreport ","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.070000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4f868606-0d5b-44a3-9c85-f9cb48c66dbb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4f868606-0d5b-44a3-9c85-f9cb48c66dbb
deleted file mode 100644
index f967c17..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/4f868606-0d5b-44a3-9c85-f9cb48c66dbb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"4f868606-0d5b-44a3-9c85-f9cb48c66dbb","details":"{\"type\":\"CompoundAction\",\"name\":\"16-Managed device info tests\",\"actionId\":\"4f868606-0d5b-44a3-9c85-f9cb48c66dbb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Managed device info tests\",\"actionId\":\"504affcd-9814-43da-833d-e8ea944c96a8\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Managed device info tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6cc7fd56-370b-490b-9a66-fd6802c07be8\",\"displayText\":\"Managed device info tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Managed device info tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":476.0,\"x2\":351.25,\"y2\":518.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":106.5,\"y\":497.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":73.5,\"y\":-0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"6cc7fd56-370b-490b-9a66-fd6802c07be8\",\"firstText\":\"Managed device info tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Managed device info tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":1.0,\"y1\":483.0,\"x2\":212.0,\"y2\":512.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Managed device info tests\",\"actionId\":\"676c051f-b032-4956-9630-0c19c28f2924\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Managed device info tests\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click pass button if all tests passed\",\"actionId\":\"37a48d5c-9586-4f5c-a13c-a7733f5576e0\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/pass_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"504affcd-9814-43da-833d-e8ea944c96a8\",\"676c051f-b032-4956-9630-0c19c28f2924\",\"137e850e-d1e1-4fda-85f0-7a71c6aa39d8\",\"bc8d1d81-e862-43e2-aa54-1056b9e26f14\",\"4e7e041d-2ca6-409d-9c9f-544c4f9a4a0a\",\"e242b517-2878-473b-bf43-ae1e7c299f21\",\"0e6339c1-dd60-4126-9c18-82a1171245ce\",\"8f2375c4-da47-4673-b46d-88bfca894fbf\",\"e09a8291-7909-4e13-aadd-413ef0f26bdc\",\"879b4b50-6fba-4899-ad51-c9819adc7dc6\",\"97168770-8a71-4ad5-b1a3-6fad42f11159\",\"e2eae039-e0f9-4bad-a122-3b67582d0cb2\",\"c0bfb788-3dfc-45f1-8def-af860884289c\",\"2776b178-6e89-4fea-9f72-a7733427ef39\",\"63dd640e-a661-47cc-964a-e73a3d4c0f1f\",\"8a47ce64-ec2d-4a20-a91b-f89000b7e2bc\",\"a28853a0-0f2d-4148-807e-1387a6a31d3a\",\"bfcd3a5c-3fa3-4976-9b6e-aea47e073512\",\"76a9632c-6b66-4bec-9423-e4f09af91996\",\"37a48d5c-9586-4f5c-a13c-a7733f5576e0\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_NotificationBot_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/NotificationBot.apk\"}}","name":"16-Managed device info tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.166000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/514adc8f-fe99-4674-89cf-24028055b96e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/514adc8f-fe99-4674-89cf-24028055b96e
deleted file mode 100644
index 068b48b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/514adc8f-fe99-4674-89cf-24028055b96e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"514adc8f-fe99-4674-89cf-24028055b96e","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Gestures settings\",\"actionId\":\"514adc8f-fe99-4674-89cf-24028055b96e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to System\",\"actionId\":\"d9407a16-455d-466f-9611-1d6e52ad4164\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"System\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e391277f-2bdb-4040-9e7d-ff3d50178073\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b4bc27b5-c9c1-4632-996d-fe0770c63a73\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"276952fc-6ff7-4001-87d7-ffc831b8e44b\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":590.3333333333334,\"x2\":45.333333333333336,\"y2\":621.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":586.6666666666666,\"x2\":63.0,\"y2\":625.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"9408b9dc-3cdb-44d6-aea0-5ccfd76b3e42\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d2a756e8-b340-45d0-9449-447cd6adcecd\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":588.0,\"x2\":109.66666666666667,\"y2\":607.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.166666666666657,\"y\":4.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"System\"},{\"uuid\":\"129e3c0e-99d5-41af-84a0-2076c10dc24f\",\"displayText\":\"Languages, gestures, time, backup\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Languages, gestures, time, backup\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":607.0,\"x2\":251.66666666666666,\"y2\":624.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Languages, gestures, time, backup\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":574.0,\"x2\":346.0,\"y2\":638.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"System\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":574.0,\"x2\":360.0,\"y2\":638.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":90.5,\"y\":593.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":89.5,\"y\":13.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d2a756e8-b340-45d0-9449-447cd6adcecd\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"System\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":57.0,\"y1\":575.0,\"x2\":124.0,\"y2\":611.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, System\",\"actionId\":\"6fa47e5b-4d95-497e-b0e7-5057a759149b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"System\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Gestures\",\"actionId\":\"04b016d8-7804-44aa-87c7-602bc190514a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Gestures\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"d9407a16-455d-466f-9611-1d6e52ad4164\",\"6fa47e5b-4d95-497e-b0e7-5057a759149b\",\"04b016d8-7804-44aa-87c7-602bc190514a\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Gestures settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.199000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5225d3a3-cf6f-48c8-ab8a-e04571eb69dc b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5225d3a3-cf6f-48c8-ab8a-e04571eb69dc
deleted file mode 100644
index e2b6a98..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5225d3a3-cf6f-48c8-ab8a-e04571eb69dc
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5225d3a3-cf6f-48c8-ab8a-e04571eb69dc","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify None/Swipe/Patten/PIN lock\",\"actionId\":\"5225d3a3-cf6f-48c8-ab8a-e04571eb69dc\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, PIN\",\"actionId\":\"33ea9cbf-a7c3-48d0-a202-d6e16140a4d6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"PIN\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"0c88bde8-4610-4558-af55-e493737adf53\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"3e3b1b72-32eb-4f57-a45f-d477fdcb1993\",\"33ea9cbf-a7c3-48d0-a202-d6e16140a4d6\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"0c88bde8-4610-4558-af55-e493737adf53\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify None/Swipe/Patten/PIN lock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.160000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/544656b1-7930-44f1-ba63-fdafd4b08b09 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/544656b1-7930-44f1-ba63-fdafd4b08b09
deleted file mode 100644
index 6c0d9b8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/544656b1-7930-44f1-ba63-fdafd4b08b09
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"544656b1-7930-44f1-ba63-fdafd4b08b09","details":"{\"type\":\"CompoundAction\",\"name\":\"01_Profile owner installed\",\"actionId\":\"544656b1-7930-44f1-ba63-fdafd4b08b09\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to BYOD Managed Provisioning\",\"actionId\":\"bccc76c8-d5d6-4f14-a766-01e16a53a40b\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"BYOD Managed Provisioning\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c811188b-a321-453d-957c-7c5483fcf87b\",\"displayText\":\"BYOD Managed Provisioning\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"BYOD Managed Provisioning\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":228.66666666666666,\"x2\":351.3333333333333,\"y2\":270.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":120.5,\"y\":251.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":59.5,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"c811188b-a321-453d-957c-7c5483fcf87b\",\"firstText\":\"BYOD Managed Provisioning\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"BYOD Managed Provisioning\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":237.0,\"x2\":233.0,\"y2\":265.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, BYOD Managed Provisioning\",\"actionId\":\"df4f9e98-c47f-4f27-b20e-254b61539389\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"BYOD Managed Provisioning\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/prepare_test_button\",\"actionId\":\"d469a2d3-76c8-4acb-96d3-70d6a15f1903\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/prepare_test_button\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Delete if needed\",\"actionId\":\"304b2c0a-9bf1-430d-b89c-cca677025313\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/button1\"}]},\"clickAfterValidation\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Accept & continue\",\"actionId\":\"c1342977-055d-42a7-8fdb-17208bf3e634\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Accept & continue\"},{\"type\":\"WaitAction\",\"name\":\"WAIT for 20 secs\",\"actionId\":\"b5d8e5fb-7b86-4add-bd45-398ed3c27a96\",\"actionType\":\"WAIT_ACTION\",\"actionDescription\":\"Setting up...\",\"delayAfterActionMs\":20000,\"createdBy\":\"pololee\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"06a365fd-6a6b-4b5d-a30b-9e3775336f9a\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"}],\"childrenIdList\":[\"bad420dc-5e82-4d72-abc6-3b748c8fffdf\",\"79031c08-46b9-4830-80ad-500a4585c4d4\",\"26f26923-eb98-45dd-9343-9a2626768de5\",\"bccc76c8-d5d6-4f14-a766-01e16a53a40b\",\"df4f9e98-c47f-4f27-b20e-254b61539389\",\"02e61821-abdc-499f-8cfb-82c7912a7e1f\",\"d469a2d3-76c8-4acb-96d3-70d6a15f1903\",\"304b2c0a-9bf1-430d-b89c-cca677025313\",\"c1342977-055d-42a7-8fdb-17208bf3e634\",\"b5d8e5fb-7b86-4add-bd45-398ed3c27a96\",\"06a365fd-6a6b-4b5d-a30b-9e3775336f9a\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"01_Profile owner installed","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.318000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/553582bb-ae2d-4759-a0a7-f73067bf7e89 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/553582bb-ae2d-4759-a0a7-f73067bf7e89
deleted file mode 100644
index 0cf7cb9..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/553582bb-ae2d-4759-a0a7-f73067bf7e89
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"553582bb-ae2d-4759-a0a7-f73067bf7e89","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Go\\\" button\",\"actionId\":\"553582bb-ae2d-4759-a0a7-f73067bf7e89\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Go button\",\"actionId\":\"2bd577f4-0373-49e3-81b1-d8911d599e90\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button3\"}],\"childrenIdList\":[\"2bd577f4-0373-49e3-81b1-d8911d599e90\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Go\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.229000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5595e3fe-1f8d-453a-a103-8d15ac2ec05d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5595e3fe-1f8d-453a-a103-8d15ac2ec05d
deleted file mode 100644
index d60febf..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5595e3fe-1f8d-453a-a103-8d15ac2ec05d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5595e3fe-1f8d-453a-a103-8d15ac2ec05d","details":"{\"type\":\"CompoundAction\",\"name\":\"Install Device Owner\",\"actionId\":\"5595e3fe-1f8d-453a-a103-8d15ac2ec05d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Install Device Owner\",\"actionId\":\"54f30549-2c3f-43b2-a52a-a6e9150d1816\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"install -r -t $uicd_DeviceOwner_apk_path\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"54f30549-2c3f-43b2-a52a-a6e9150d1816\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Install Device Owner","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.068000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/56cbd2d5-2a74-4b2f-aaf1-d2fe2aa5f479 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/56cbd2d5-2a74-4b2f-aaf1-d2fe2aa5f479
deleted file mode 100644
index 1324b22..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/56cbd2d5-2a74-4b2f-aaf1-d2fe2aa5f479
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"56cbd2d5-2a74-4b2f-aaf1-d2fe2aa5f479","details":"{\"type\":\"CompoundAction\",\"name\":\"test_No Device Owner Tests\",\"actionId\":\"56cbd2d5-2a74-4b2f-aaf1-d2fe2aa5f479\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if pass button of No Device owner tests enabled\",\"actionId\":\"fd10d765-c733-42aa-a1bb-7642f3646113\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/pass_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"d52e2b4c-6bf6-4d93-af37-785ce2d74664\",\"c053d68c-aa89-494f-9a6d-a24f4eba7de4\",\"8176eaad-a582-41ea-8d8e-9c8673e8ceb0\",\"fb524e6c-60b2-4211-b7e4-37f76f26a3ef\",\"fd10d765-c733-42aa-a1bb-7642f3646113\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_No Device Owner Tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.215000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/59dc74cf-f26b-4e66-85e1-4fb8ce477ae9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/59dc74cf-f26b-4e66-85e1-4fb8ce477ae9
deleted file mode 100644
index 32c981f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/59dc74cf-f26b-4e66-85e1-4fb8ce477ae9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"59dc74cf-f26b-4e66-85e1-4fb8ce477ae9","details":"{\"type\":\"CompoundAction\",\"name\":\"Activate this device admin app - Sensor\",\"actionId\":\"59dc74cf-f26b-4e66-85e1-4fb8ce477ae9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Toggle Sensor... switch on\",\"actionId\":\"8d61a833-dc9f-4393-9130-bc470ccc61d4\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"Sensor Tests Device Admin Receiver\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"Sensor Tests Device Admin Receiver\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/action_button\",\"actionId\":\"886e97ef-b3bc-4fb7-becc-3ba83f93e504\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/action_button\"}],\"childrenIdList\":[\"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e\",\"8d61a833-dc9f-4393-9130-bc470ccc61d4\",\"886e97ef-b3bc-4fb7-becc-3ba83f93e504\",\"da770381-d17c-48ca-8aba-def4338ef96b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Activate this device admin app - Sensor","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.274000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/59eff0da-e8a3-4322-9f00-9a3bd9237e10 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/59eff0da-e8a3-4322-9f00-9a3bd9237e10
deleted file mode 100644
index 307cfa2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/59eff0da-e8a3-4322-9f00-9a3bd9237e10
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"59eff0da-e8a3-4322-9f00-9a3bd9237e10","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn Locaion on\",\"actionId\":\"59eff0da-e8a3-4322-9f00-9a3bd9237e10\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Toggle Location switch on\",\"actionId\":\"b484215d-9c0d-4a02-8566-e13a78afb2e3\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"location\\\", MatchOption.CONTAINS).right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"location\\\", MatchOption.CONTAINS).right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"31d97492-1de9-41be-8213-c67eb06406b1\",\"b484215d-9c0d-4a02-8566-e13a78afb2e3\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn Locaion on","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.276000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5caa8a3a-bdb2-4642-87b7-b5d5f855b32b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5caa8a3a-bdb2-4642-87b7-b5d5f855b32b
deleted file mode 100644
index 780b08d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5caa8a3a-bdb2-4642-87b7-b5d5f855b32b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5caa8a3a-bdb2-4642-87b7-b5d5f855b32b","details":"{\"type\":\"CompoundAction\",\"name\":\"Assert the work profile location go disabled and into 'off' state\",\"actionId\":\"5caa8a3a-bdb2-4642-87b7-b5d5f855b32b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Assert the work profile location go disabled and into 'off' state\",\"actionId\":\"171f3a20-7e9a-4e17-a115-d3f28be61bf4\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\nuicd_util = UICDPythonUtil()\\nd = Device.create_device_by_slot(0)\\n\\nresult = d.text(\\\"Location for work profile\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"enabled\\\", \\\"false\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"171f3a20-7e9a-4e17-a115-d3f28be61bf4\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Assert the work profile location go disabled and into 'off' state","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.287000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5cab765b-34d5-4922-a223-6322eaf241ae b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5cab765b-34d5-4922-a223-6322eaf241ae
deleted file mode 100644
index 8afb381..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5cab765b-34d5-4922-a223-6322eaf241ae
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5cab765b-34d5-4922-a223-6322eaf241ae","details":"{\"type\":\"CompoundAction\",\"name\":\"Press back key 4 times\",\"actionId\":\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b5f4a5fd-ae6c-4b2f-98ac-2b748e7781e1\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"b5f4a5fd-ae6c-4b2f-98ac-2b748e7781e1\"],\"repeatTime\":4,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Press back key 4 times","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.113000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c
deleted file mode 100644
index 8c6b4f5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c","details":"{\"type\":\"CompoundAction\",\"name\":\"15-12 & 17-06-04-Disallow install unknown sources\",\"actionId\":\"5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow install unknown sources\",\"actionId\":\"a18d3bcc-1d42-4d0a-86e5-a695bbf764aa\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow install unknown sources\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"94915b7b-d45b-4e22-9631-3d344068098c\",\"displayText\":\"Disallow install unknown sources\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow install unknown sources\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":370.3333333333333,\"x2\":360.0,\"y2\":414.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":112.0,\"y\":393.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":68.0,\"y\":-1.1666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"94915b7b-d45b-4e22-9631-3d344068098c\",\"firstText\":\"Disallow install unknown sources\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow install unknown sources\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":0.0,\"y1\":377.0,\"x2\":224.0,\"y2\":410.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow install unknown sources\",\"actionId\":\"652e8865-fb3c-4406-be89-cf0def965bb3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow install unknown sources\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"76333a19-a247-4cde-96ae-0e88eb2044d2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,Allow from this source\",\"actionId\":\"02d22d69-2616-4c06-ab9a-753e16e5ac37\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Allow from this source\"}],\"childrenIdList\":[\"a18d3bcc-1d42-4d0a-86e5-a695bbf764aa\",\"652e8865-fb3c-4406-be89-cf0def965bb3\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"76333a19-a247-4cde-96ae-0e88eb2044d2\",\"02d22d69-2616-4c06-ab9a-753e16e5ac37\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-12 & 17-06-04-Disallow install unknown sources","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.136000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5e0f41ed-e9c6-4d11-b3a2-815b415268db b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5e0f41ed-e9c6-4d11-b3a2-815b415268db
deleted file mode 100644
index 1806953..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5e0f41ed-e9c6-4d11-b3a2-815b415268db
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5e0f41ed-e9c6-4d11-b3a2-815b415268db","details":"{\"type\":\"CompoundAction\",\"name\":\"17-06-Policy transparency test\",\"actionId\":\"5e0f41ed-e9c6-4d11-b3a2-815b415268db\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Policy transparency test\",\"actionId\":\"823c238a-284a-4b9f-8f63-58392e20de57\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Policy transparency test\"}],\"childrenIdList\":[\"823c238a-284a-4b9f-8f63-58392e20de57\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"336938a2-a45e-4245-a4a7-2f8704bc265d\",\"d1023735-52c1-48bc-9dc7-a7b03a15ca7b\",\"0e30ea6e-be38-468e-8499-790b05a37760\",\"e66ce1e2-883e-465b-8d82-3cdb852cc679\",\"eb48590b-4827-44e1-a2bd-9c3416e92404\",\"5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c\",\"0c73b50f-d48d-4082-a091-3d4f55f77369\",\"3c4bab75-4bac-49fa-8264-5f4c3504c60b\",\"ae20d771-d892-4065-aa06-90335e33a588\",\"a1add8e6-5408-417e-942b-2663863fcdd6\",\"6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b\",\"ddbc4d31-a035-4eec-814a-def0efb2bfa5\",\"e395e5d8-df59-4e7d-bf18-6cd65da3ff8b\",\"a67e968f-ab80-4c16-87c6-76e7c22da2b7\",\"238c6d52-12d8-4d83-ae19-c703bcc6ec24\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_Gmail_account=playinstallapk02@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\"}}","name":"17-06-Policy transparency test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.201000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5e7a1b39-3e17-45e2-863f-ad55e97d901f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5e7a1b39-3e17-45e2-863f-ad55e97d901f
deleted file mode 100644
index 3e03abb..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5e7a1b39-3e17-45e2-863f-ad55e97d901f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5e7a1b39-3e17-45e2-863f-ad55e97d901f","details":"{\"type\":\"CompoundAction\",\"name\":\"04_Work notification is badged(Check image)\",\"actionId\":\"5e7a1b39-3e17-45e2-863f-ad55e97d901f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Work notification is badged\",\"actionId\":\"ad08c429-251a-43ef-95ed-855ad4e0dbfc\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Work notification is badged\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"98647943-b32a-4b18-916f-9c55f8d2c5d1\",\"displayText\":\"Work notification is badged\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Work notification is badged\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":493.6666666666667,\"x2\":360.0,\"y2\":535.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":95.5,\"y\":516.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":84.5,\"y\":-1.3333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"98647943-b32a-4b18-916f-9c55f8d2c5d1\",\"firstText\":\"Work notification is badged\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Work notification is badged\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":187.0,\"y1\":529.0,\"x2\":4.0,\"y2\":503.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work notification is badged\",\"actionId\":\"f90c41ad-fa3a-4553-ac1e-3b251a64194d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work notification is badged\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert present This is a notification on Notification status bar\",\"actionId\":\"3b8f642b-84dd-4371-b501-5f7062c84108\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"This is a notification\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"This is a notification\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert present CTS Verifier on Notification status bar\",\"actionId\":\"06ce9232-2b47-4ea0-88b5-0612b0986d48\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"CTS Verifier\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/app_name_text\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"CTS Verifier\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert present Work profile badge on Notification status bar\",\"actionId\":\"99d4cf93-54d4-4bc0-9b9e-b1cf39d710db\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"Work profile (badge)\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/profile_badge\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Work profile\"}]},\"clickAfterValidation\":false},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"d1408ba2-7ec7-48fa-9895-5685db1f4cdd\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"PythonScriptAction\",\"name\":\"Dismiss Notification This is a notification\",\"actionId\":\"ad2e8c09-7fa9-40e1-a207-9a9e35b12f70\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nd.text(\\\"This is a notification\\\").swipe()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"ad08c429-251a-43ef-95ed-855ad4e0dbfc\",\"f90c41ad-fa3a-4553-ac1e-3b251a64194d\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"3b8f642b-84dd-4371-b501-5f7062c84108\",\"06ce9232-2b47-4ea0-88b5-0612b0986d48\",\"99d4cf93-54d4-4bc0-9b9e-b1cf39d710db\",\"d1408ba2-7ec7-48fa-9895-5685db1f4cdd\",\"ad2e8c09-7fa9-40e1-a207-9a9e35b12f70\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"04_Work notification is badged(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.295000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5ee29e64-400f-4c6f-ba29-d9442740b560 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5ee29e64-400f-4c6f-ba29-d9442740b560
deleted file mode 100644
index 0d9b825..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5ee29e64-400f-4c6f-ba29-d9442740b560
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5ee29e64-400f-4c6f-ba29-d9442740b560","details":"{\"type\":\"CompoundAction\",\"name\":\"Set restriction on by turning on the switch bar\",\"actionId\":\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Set restriction on\",\"actionId\":\"4689bf42-4280-4e62-b839-416c57c4f495\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nif d.resource_id(\\\"com.android.cts.verifier:id/widget_label\\\").right().resource_id(\\\"com.android.cts.verifier:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.resource_id(\\\"com.android.cts.verifier:id/widget_label\\\").right().resource_id(\\\"com.android.cts.verifier:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"4689bf42-4280-4e62-b839-416c57c4f495\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set restriction on by turning on the switch bar","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.120000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5f45dc78-6a4a-4b87-b860-01e0c4b7a04d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5f45dc78-6a4a-4b87-b860-01e0c4b7a04d
deleted file mode 100644
index e2168d0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/5f45dc78-6a4a-4b87-b860-01e0c4b7a04d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"5f45dc78-6a4a-4b87-b860-01e0c4b7a04d","details":"{\"type\":\"CompoundAction\",\"name\":\"Assert present for Tile Service for CTS Verifier \",\"actionId\":\"5f45dc78-6a4a-4b87-b860-01e0c4b7a04d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"SwipeAction\",\"name\":\"left\",\"actionId\":\"2cf55856-6adb-4292-844e-eda4ec36f761\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"startX\":340,\"startY\":320,\"endX\":20,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert present for Tile Service for CTS Verifier \",\"actionId\":\"eef187d5-7ea7-4dcb-846a-ae81e6a4dee9\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/tile_label\"},{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Tile Service for CTS Verifier\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"2cf55856-6adb-4292-844e-eda4ec36f761\",\"eef187d5-7ea7-4dcb-846a-ae81e6a4dee9\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Assert present for Tile Service for CTS Verifier ","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.328000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/608f1c50-237e-4f5d-94c6-0bbbcba87332 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/608f1c50-237e-4f5d-94c6-0bbbcba87332
deleted file mode 100644
index 75b772f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/608f1c50-237e-4f5d-94c6-0bbbcba87332
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"608f1c50-237e-4f5d-94c6-0bbbcba87332","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Go\\\" button\",\"actionId\":\"608f1c50-237e-4f5d-94c6-0bbbcba87332\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Go\",\"actionId\":\"bea3d039-320a-4a1b-8bd5-cb295b08bf33\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Go\"}],\"childrenIdList\":[\"bea3d039-320a-4a1b-8bd5-cb295b08bf33\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Go\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.220000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/60e745a0-f30e-4679-a41a-45afbf5ace0e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/60e745a0-f30e-4679-a41a-45afbf5ace0e
deleted file mode 100644
index 6074d20..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/60e745a0-f30e-4679-a41a-45afbf5ace0e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"60e745a0-f30e-4679-a41a-45afbf5ace0e","details":"{\"type\":\"CompoundAction\",\"name\":\"30_Personal password test\",\"actionId\":\"60e745a0-f30e-4679-a41a-45afbf5ace0e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Personal password test\",\"actionId\":\"ebcd69df-146d-45be-a780-76e454a0d849\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Personal password test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ecaad512-9199-4892-a97b-5ae7e8e2492e\",\"displayText\":\"Personal password test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Personal password test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":514.3333333333334,\"x2\":360.0,\"y2\":556.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":89.0,\"y\":534.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":91.0,\"y\":1.3333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"ecaad512-9199-4892-a97b-5ae7e8e2492e\",\"firstText\":\"Personal password test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Personal password test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":520.0,\"x2\":169.0,\"y2\":548.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Personal password test\",\"actionId\":\"fd47495d-5b2f-4a0f-87cb-f16498bbda97\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Personal password test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Password\",\"actionId\":\"ebed0a17-877e-4f84-ae50-d7670f81134d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Password\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next button\",\"actionId\":\"e3284f1a-3d74-4362-b4e0-da5e5ee89109\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm button\",\"actionId\":\"d70ad092-2951-4bdc-8696-2f7b83992368\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"835500ec-ec70-46fb-aefe-cacaf429a914\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"cfdc467a-d002-4155-b571-3c2fbd6f3e43\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if password lock appear\",\"actionId\":\"6a20c6cb-a262-48f0-90f6-32e2a2f2128b\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.systemui:id/passwordEntry\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0476ed02-5047-48c5-bc87-f3190f992074\",\"displayText\":\"Wed, Nov 18\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"bbab1fef-e863-4d3c-a0cf-efc40a5f44f5\",\"displayText\":\"Wed, Nov 18\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Wed, Nov 18\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":130.0,\"y1\":339.3333333333333,\"x2\":222.33333333333334,\"y2\":360.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-17.333333333333314,\"y\":2.8333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Wed, Nov 18\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/row\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":10.333333333333334,\"y1\":339.3333333333333,\"x2\":342.3333333333333,\"y2\":360.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":193.5,\"y\":347.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-17.166666666666686,\"y\":2.8333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"bbab1fef-e863-4d3c-a0cf-efc40a5f44f5\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.systemui:id/passwordEntry\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":47.0,\"y1\":315.0,\"x2\":340.0,\"y2\":379.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, None\",\"actionId\":\"9f901424-d411-405f-93cb-86ec9d47d759\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"None\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, yes, remove\",\"actionId\":\"e53bb5b5-309f-4203-b8cd-61398c4c85b1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"InputAction\",\"name\":\"Overview Button\",\"actionId\":\"69a60dcc-6c3c-471d-a6cf-8f7c9ed93af1\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":187,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"ebcd69df-146d-45be-a780-76e454a0d849\",\"fd47495d-5b2f-4a0f-87cb-f16498bbda97\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"ebed0a17-877e-4f84-ae50-d7670f81134d\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"e3284f1a-3d74-4362-b4e0-da5e5ee89109\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"d70ad092-2951-4bdc-8696-2f7b83992368\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\",\"835500ec-ec70-46fb-aefe-cacaf429a914\",\"cfdc467a-d002-4155-b571-3c2fbd6f3e43\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"6a20c6cb-a262-48f0-90f6-32e2a2f2128b\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"9f901424-d411-405f-93cb-86ec9d47d759\",\"e53bb5b5-309f-4203-b8cd-61398c4c85b1\",\"69a60dcc-6c3c-471d-a6cf-8f7c9ed93af1\",\"9b9343fa-a795-4169-883b-32dca700c4b6\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"30_Personal password test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.309000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/61f8f3bd-bae5-4a38-949c-f759cda9375e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/61f8f3bd-bae5-4a38-949c-f759cda9375e
deleted file mode 100644
index 968970b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/61f8f3bd-bae5-4a38-949c-f759cda9375e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"61f8f3bd-bae5-4a38-949c-f759cda9375e","details":"{\"type\":\"CompoundAction\",\"name\":\"Delete the alarm\",\"actionId\":\"61f8f3bd-bae5-4a38-949c-f759cda9375e\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/delete\",\"actionId\":\"2be76720-75ed-4c35-b3aa-22e4e152cf43\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.deskclock:id/delete\"}],\"childrenIdList\":[\"2be76720-75ed-4c35-b3aa-22e4e152cf43\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Delete the alarm","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.027000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/63dd640e-a661-47cc-964a-e73a3d4c0f1f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/63dd640e-a661-47cc-964a-e73a3d4c0f1f
deleted file mode 100644
index 30b6abf..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/63dd640e-a661-47cc-964a-e73a3d4c0f1f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"63dd640e-a661-47cc-964a-e73a3d4c0f1f","details":"{\"type\":\"CompoundAction\",\"name\":\"16-13-Trusted CA certs\",\"actionId\":\"63dd640e-a661-47cc-964a-e73a3d4c0f1f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Trusted CA certs\",\"actionId\":\"d02bc1a4-deb7-4400-8945-5506756ecec4\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Trusted CA certs\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"95091696-0218-4f46-a342-a2a3d2a14085\",\"displayText\":\"Trusted CA certs\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Trusted CA certs\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":480.6666666666667,\"x2\":351.3333333333333,\"y2\":522.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":85.0,\"y\":502.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":95.0,\"y\":-0.8333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"95091696-0218-4f46-a342-a2a3d2a14085\",\"firstText\":\"Trusted CA certs\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Trusted CA certs\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":13.0,\"y1\":487.0,\"x2\":157.0,\"y2\":518.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Trusted CA certs\",\"actionId\":\"e7825377-ca80-46fb-8dfb-154c58c5721f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Trusted CA certs\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told that your administrator installed trusted CA certs\",\"actionId\":\"c3ec4403-51f1-412e-b4a7-99d63a0fb766\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Trusted credentials\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4dd32b4d-5a12-49f0-b31f-5b58f55d230f\",\"displayText\":\"Trusted credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e9de0147-3e30-4038-8957-b8e9e03a5430\",\"displayText\":\"Trusted credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"66bbe985-8f9a-4c93-ad42-a3fffcae28ba\",\"displayText\":\"Trusted credentials\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Trusted credentials\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":415.6666666666667,\"x2\":183.66666666666666,\"y2\":434.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-5.666666666666671,\"y\":2.1666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Trusted credentials\"},{\"uuid\":\"50aeed46-89d8-45ad-ab4e-d5bd0c75e393\",\"displayText\":\"Minimum 1 CA certificate\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 CA certificate\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":434.6666666666667,\"x2\":201.66666666666666,\"y2\":451.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Minimum 1 CA certificate\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":401.6666666666667,\"x2\":346.0,\"y2\":465.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Trusted credentials\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":401.6666666666667,\"x2\":360.0,\"y2\":465.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":129.0,\"y\":423.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":51.0,\"y\":10.666666666666686,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"66bbe985-8f9a-4c93-ad42-a3fffcae28ba\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Trusted credentials\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":49.0,\"y1\":413.0,\"x2\":209.0,\"y2\":433.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"a4bc9c9f-9a27-4cdf-a23a-45898e3ec902\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Install Cert\",\"actionId\":\"433f83fc-58c0-4a9b-90b3-659134369779\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Install Cert\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told that your administrator installed trusted CA certs\",\"actionId\":\"a8654e62-1848-461b-9949-a5e1af28136b\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Trusted credentials\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4beefe62-f711-41a2-bb5d-18cf0520de94\",\"displayText\":\"Trusted credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"402d593b-15f0-4561-9811-2935306f8186\",\"displayText\":\"Trusted credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e192f382-5f14-477c-9ef6-609ccd215fc3\",\"displayText\":\"Trusted credentials\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Trusted credentials\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":415.6666666666667,\"x2\":183.66666666666666,\"y2\":434.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.3333333333333286,\"y\":2.1666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Trusted credentials\"},{\"uuid\":\"86d6834e-4999-46dc-9a89-aba71fb325df\",\"displayText\":\"Minimum 1 CA certificate\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 CA certificate\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":434.6666666666667,\"x2\":201.66666666666666,\"y2\":451.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Minimum 1 CA certificate\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":401.6666666666667,\"x2\":346.0,\"y2\":465.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Trusted credentials\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":401.6666666666667,\"x2\":360.0,\"y2\":465.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":121.0,\"y\":423.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":59.0,\"y\":10.666666666666686,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"e192f382-5f14-477c-9ef6-609ccd215fc3\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Trusted credentials\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":52.0,\"y1\":411.0,\"x2\":190.0,\"y2\":435.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that the administrator has installed at least one trusted CA cert\",\"actionId\":\"34fffbad-5fb7-4714-80d8-df36b76fa7a2\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Minimum 1 CA certificate\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d4524970-139b-4ced-8a6e-47170325cbc6\",\"displayText\":\"Minimum 1 CA certificate\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f5bff29d-634c-44fe-a926-b8d148bb9f3e\",\"displayText\":\"Trusted credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"67b9c571-257d-416a-bdf3-09ce45cc304d\",\"displayText\":\"Trusted credentials\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Trusted credentials\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":415.6666666666667,\"x2\":183.66666666666666,\"y2\":434.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Trusted credentials\"},{\"uuid\":\"08132737-2d39-447a-b0c6-e06c95913c22\",\"displayText\":\"Minimum 1 CA certificate\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 CA certificate\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":434.6666666666667,\"x2\":201.66666666666666,\"y2\":451.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.8333333333333144,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Minimum 1 CA certificate\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":401.6666666666667,\"x2\":346.0,\"y2\":465.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Trusted credentials\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":401.6666666666667,\"x2\":360.0,\"y2\":465.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":129.5,\"y\":444.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":50.5,\"y\":-10.833333333333314,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"08132737-2d39-447a-b0c6-e06c95913c22\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Minimum 1 CA certificate\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":42.0,\"y1\":433.0,\"x2\":217.0,\"y2\":456.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"123ba8a8-4939-489f-8f4b-34ad391d02a6\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"d02bc1a4-deb7-4400-8945-5506756ecec4\",\"e7825377-ca80-46fb-8dfb-154c58c5721f\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"c3ec4403-51f1-412e-b4a7-99d63a0fb766\",\"a4bc9c9f-9a27-4cdf-a23a-45898e3ec902\",\"433f83fc-58c0-4a9b-90b3-659134369779\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"a8654e62-1848-461b-9949-a5e1af28136b\",\"34fffbad-5fb7-4714-80d8-df36b76fa7a2\",\"123ba8a8-4939-489f-8f4b-34ad391d02a6\",\"b17bcc33-34e0-4aba-a8ce-080ea0d0846c\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-13-Trusted CA certs","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.187000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/645e8103-d449-40d0-abba-6d734e783792 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/645e8103-d449-40d0-abba-6d734e783792
deleted file mode 100644
index a0b6732..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/645e8103-d449-40d0-abba-6d734e783792
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"645e8103-d449-40d0-abba-6d734e783792","details":"{\"type\":\"CompoundAction\",\"name\":\"Enable calling account\",\"actionId\":\"645e8103-d449-40d0-abba-6d734e783792\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, All calling accounts\",\"actionId\":\"d2f62d52-4cd2-42bb-bd4d-a43529f08566\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"All calling accounts\"},{\"type\":\"PythonScriptAction\",\"name\":\"Enable calling account for CTS-V Test\",\"actionId\":\"a6948aff-2e2b-4684-9ca3-6c7b0a3a8324\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"CTS Verifier Test\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"CTS Verifier Test\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"d2f62d52-4cd2-42bb-bd4d-a43529f08566\",\"a6948aff-2e2b-4684-9ca3-6c7b0a3a8324\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Enable calling account","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.278000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/64db6b9d-caaa-442f-840a-80ef16030e55 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/64db6b9d-caaa-442f-840a-80ef16030e55
deleted file mode 100644
index ff094e3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/64db6b9d-caaa-442f-840a-80ef16030e55
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"64db6b9d-caaa-442f-840a-80ef16030e55","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn on Multiple users switch bar\",\"actionId\":\"64db6b9d-caaa-442f-840a-80ef16030e55\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Turn on Multiple users switch bar\",\"actionId\":\"220796a3-211d-4c23-b70c-0cd9cfaec36e\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nif d.text(\\\"Off\\\").right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"Off\\\").right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"220796a3-211d-4c23-b70c-0cd9cfaec36e\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn on Multiple users switch bar","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.082000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/65349586-080c-4006-843f-5d5d8b9e9cd9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/65349586-080c-4006-843f-5d5d8b9e9cd9
deleted file mode 100644
index 606490e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/65349586-080c-4006-843f-5d5d8b9e9cd9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"65349586-080c-4006-843f-5d5d8b9e9cd9","details":"{\"type\":\"CompoundAction\",\"name\":\"test_6DoF Test\",\"actionId\":\"65349586-080c-4006-843f-5d5d8b9e9cd9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"ScrollScreenContentValidationAction\",\"actionId\":\"15e13135-a453-4f05-9c3d-e8ce3503435e\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"6DoF Test\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8f54178b-cc86-4270-833a-0e39f7988109\",\"displayText\":\"6DoF Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"6DoF Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":260.6666666666667,\"x2\":350.6666666666667,\"y2\":304.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":48.5,\"y\":279.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":131.5,\"y\":3.6666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"8f54178b-cc86-4270-833a-0e39f7988109\",\"firstText\":\"6DoF Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"6DoF Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":88.0,\"y1\":287.0,\"x2\":9.0,\"y2\":271.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, 6DoF Test\",\"actionId\":\"6ee1f425-30a2-4b8f-b6eb-ae6ca16b2293\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"6DoF Test\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"15e13135-a453-4f05-9c3d-e8ce3503435e\",\"6ee1f425-30a2-4b8f-b6eb-ae6ca16b2293\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_6DoF Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.270000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/658953ad-c875-417b-87a1-5c75ca2fff86 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/658953ad-c875-417b-87a1-5c75ca2fff86
deleted file mode 100644
index 82e1f0d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/658953ad-c875-417b-87a1-5c75ca2fff86
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"658953ad-c875-417b-87a1-5c75ca2fff86","details":"{\"type\":\"CompoundAction\",\"name\":\"Confirm Password lock \\\"a1688\\\"\",\"actionId\":\"658953ad-c875-417b-87a1-5c75ca2fff86\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Re-enter your password screen appear\",\"actionId\":\"5ebc072d-4efd-41f4-ad7f-48ebcc50d8b6\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Re-enter your password\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0439c392-bf28-4f0c-8e84-303e498db2bd\",\"displayText\":\"Re-enter your password\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"b93eb32e-06f2-46da-9953-1b06ffadb59e\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/sud_layout_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":166.0,\"y1\":97.33333333333333,\"x2\":194.0,\"y2\":125.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"a8aaf591-d7d1-4b5c-802d-a39295bf3028\",\"displayText\":\"Re-enter your password\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/suc_layout_title\",\"text\":\"Re-enter your password\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":139.33333333333334,\"x2\":339.0,\"y2\":167.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.5,\"y\":4.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Re-enter your password\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/sud_layout_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":48.333333333333336,\"x2\":360.0,\"y2\":169.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":181.5,\"y\":149.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.5,\"y\":-40.66666666666666,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"a8aaf591-d7d1-4b5c-802d-a39295bf3028\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Re-enter your password\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":66.0,\"y1\":134.0,\"x2\":297.0,\"y2\":165.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Enter key\",\"actionId\":\"eabfece7-30c2-4572-a215-0fb5ed13aca6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.inputmethod.latin:id/key_pos_ime_action\"}],\"childrenIdList\":[\"5ebc072d-4efd-41f4-ad7f-48ebcc50d8b6\",\"c9423320-3e9d-40ed-8a84-957a48931121\",\"eabfece7-30c2-4572-a215-0fb5ed13aca6\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Confirm Password lock \"a1688\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.269000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/67230d49-da52-4a23-a712-504be0de8619 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/67230d49-da52-4a23-a712-504be0de8619
deleted file mode 100644
index ca6d62c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/67230d49-da52-4a23-a712-504be0de8619
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"67230d49-da52-4a23-a712-504be0de8619","details":"{\"type\":\"CompoundAction\",\"name\":\"Confirm PIN lock \\\"1688\\\"\",\"actionId\":\"67230d49-da52-4a23-a712-504be0de8619\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Re-enter your PIN screen appear.\",\"actionId\":\"0ec07507-47ca-4bfa-97c9-fe469065d8c1\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Re-enter your PIN\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3c983204-3d01-4557-89e8-b6ec545d89a7\",\"displayText\":\"Re-enter your PIN\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"61c9bc6c-c4e9-4be3-8671-909f87f3e9a4\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/sud_layout_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":166.0,\"y1\":97.33333333333333,\"x2\":194.0,\"y2\":125.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"0971d62e-1285-4f41-8dfe-91355ab0bfbd\",\"displayText\":\"Re-enter your PIN\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/suc_layout_title\",\"text\":\"Re-enter your PIN\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":139.33333333333334,\"x2\":339.0,\"y2\":167.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.0,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Re-enter your PIN\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/sud_layout_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":48.333333333333336,\"x2\":360.0,\"y2\":169.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":186.0,\"y\":152.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.0,\"y\":-43.16666666666666,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"0971d62e-1285-4f41-8dfe-91355ab0bfbd\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Re-enter your PIN\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":81.0,\"y1\":146.0,\"x2\":291.0,\"y2\":158.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Enter key\",\"actionId\":\"0922b91e-7cb2-4890-aa70-3501979e7503\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.inputmethod.latin:id/key_pos_ime_action\"}],\"childrenIdList\":[\"0ec07507-47ca-4bfa-97c9-fe469065d8c1\",\"8373f761-9983-4688-b193-59c4bc7a9bd3\",\"0922b91e-7cb2-4890-aa70-3501979e7503\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Confirm PIN lock \"1688\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.269000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/675d3384-df03-4693-9846-646f622b5ce0 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/675d3384-df03-4693-9846-646f622b5ce0
deleted file mode 100644
index 9a4f566..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/675d3384-df03-4693-9846-646f622b5ce0
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"675d3384-df03-4693-9846-646f622b5ce0","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if set PIN screen appear, set PIN to \\\"14725836\\\"\",\"actionId\":\"675d3384-df03-4693-9846-646f622b5ce0\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Set PIN screen appear\",\"actionId\":\"ba624a5f-0cd2-42b1-baa3-98cf9f44016b\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"For security, set PIN\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c2c7073f-45cb-491e-baf9-571ff5a5e49a\",\"displayText\":\"For security, set PIN\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/sud_layout_description\",\"text\":\"For security, set PIN\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":172.0,\"x2\":339.0,\"y2\":211.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":183.0,\"y\":184.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.0,\"y\":7.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"c2c7073f-45cb-491e-baf9-571ff5a5e49a\",\"firstText\":\"For security, set PIN\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"For security, set PIN\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":107.0,\"y1\":173.0,\"x2\":259.0,\"y2\":195.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"f08ac9de-60ea-412d-9d31-a725a8e3f6b9\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm\",\"actionId\":\"b4e71ff9-cecf-4ae8-8fed-6a04aea9b7c0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"ba624a5f-0cd2-42b1-baa3-98cf9f44016b\",\"af677fa8-0e4c-4c4e-9159-f91129b44e83\",\"f08ac9de-60ea-412d-9d31-a725a8e3f6b9\",\"af677fa8-0e4c-4c4e-9159-f91129b44e83\",\"b4e71ff9-cecf-4ae8-8fed-6a04aea9b7c0\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if set PIN screen appear, set PIN to \"14725836\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.263000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/68095495-91a4-402d-a763-6e7ff7427531 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/68095495-91a4-402d-a763-6e7ff7427531
deleted file mode 100644
index 31c9ea1..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/68095495-91a4-402d-a763-6e7ff7427531
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"68095495-91a4-402d-a763-6e7ff7427531","details":"{\"type\":\"ConditionValidationAction\",\"name\":\"Check if \\\"ring\\\", \\\"vibration\\\" setting is hidden\",\"actionId\":\"68095495-91a4-402d-a763-6e7ff7427531\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"$uicd_telephony_settings_in_voicemail_vibr\"},{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"$uicd_telephony_settings_in_voicemail_ring\"},{\"field\":\"text\",\"operator\":\"!=\",\"value\":\"$uicd_telephony_settings_in_voicemail_noti\"}]},\"clickAfterValidation\":false}","name":"Check if \"ring\", \"vibration\" setting is hidden","type":"ConditionValidationAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.280000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/696f0a59-5696-49f9-8573-34cfc71c3c61 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/696f0a59-5696-49f9-8573-34cfc71c3c61
deleted file mode 100644
index f64445e1..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/696f0a59-5696-49f9-8573-34cfc71c3c61
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"696f0a59-5696-49f9-8573-34cfc71c3c61","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify that the bubble is removed from the screen\",\"actionId\":\"696f0a59-5696-49f9-8573-34cfc71c3c61\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if the bubble is removed from the screen\",\"actionId\":\"22aeeb7c-0dde-460a-b5e2-8f97900ee473\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/bubble_view\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"22aeeb7c-0dde-460a-b5e2-8f97900ee473\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify that the bubble is removed from the screen","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.226000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/69b2597b-78ef-450d-975a-d5bef105c512 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/69b2597b-78ef-450d-975a-d5bef105c512
deleted file mode 100644
index 8d14bb8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/69b2597b-78ef-450d-975a-d5bef105c512
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"69b2597b-78ef-450d-975a-d5bef105c512","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Car Dock Test\",\"actionId\":\"69b2597b-78ef-450d-975a-d5bef105c512\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Car Dock Test\",\"actionId\":\"ede1fec6-3722-4ba4-bd3b-b10fed890a69\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Car Dock Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0cc10636-1a9c-451a-99ee-1aa6b393f3e4\",\"displayText\":\"Car Dock Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Car Dock Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":357.0,\"x2\":350.6666666666667,\"y2\":401.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":67.0,\"y\":378.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":113.0,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"0cc10636-1a9c-451a-99ee-1aa6b393f3e4\",\"firstText\":\"Car Dock Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Car Dock Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":363.0,\"x2\":127.0,\"y2\":394.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Car Dock Test\",\"actionId\":\"245c8878-f235-47ac-b6ff-475121d72d92\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Car Dock Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/car_mode\",\"actionId\":\"f7ae8d87-f03e-4153-960c-6642890aa25e\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/car_mode\"},{\"type\":\"ConditionClickAction\",\"name\":\"ConditionClick-Click CTS Verifer\",\"actionId\":\"9686b4f4-9604-4715-b520-5099c7a2d329\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CTS Verifier\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e9d8fadd-7458-4e87-a43f-044fe357760a\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f7d55e65-808b-4b96-9afe-8d426fccb06b\",\"displayText\":\"Android Auto\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c89b4dc7-b75e-4dc6-aabb-894413f5cb86\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":579.0,\"x2\":44.0,\"y2\":608.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"f5005b45-67f3-4618-8f05-ece4f0378d06\",\"displayText\":\"Android Auto\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d4402cf5-d4d7-4eda-91de-c1802499a27c\",\"displayText\":\"Android Auto\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Android Auto\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":58.666666666666664,\"y1\":583.6666666666666,\"x2\":144.0,\"y2\":603.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Android Auto\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":58.666666666666664,\"y1\":583.6666666666666,\"x2\":166.0,\"y2\":603.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Android Auto\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":568.0,\"x2\":360.0,\"y2\":619.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Android Auto\"},{\"uuid\":\"9a3cf371-b408-4379-95ed-20b78078bf89\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c76564a0-8f0e-43cf-b3b3-1b301a9ae146\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":630.3333333333334,\"x2\":44.0,\"y2\":659.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"47482afe-6275-4cc8-886a-f67b5a54a5bd\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"8c0e4fa3-85a7-4377-af58-d38a0e58627a\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":58.666666666666664,\"y1\":635.0,\"x2\":135.33333333333334,\"y2\":654.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.0,\"y\":-2.1666666666667425,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":58.666666666666664,\"y1\":635.0,\"x2\":157.33333333333334,\"y2\":654.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":619.3333333333334,\"x2\":360.0,\"y2\":670.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.ListView\",\"resourceId\":\"android:id/resolver_list\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":568.0,\"x2\":360.0,\"y2\":670.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":101.0,\"y\":647.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":79.0,\"y\":-27.666666666666742,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"8c0e4fa3-85a7-4377-af58-d38a0e58627a\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CTS Verifier\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":48.0,\"y1\":628.0,\"x2\":154.0,\"y2\":666.0}},{\"type\":\"ConditionClickAction\",\"name\":\"ConditionClick-click always button\",\"actionId\":\"69f69591-237b-473e-bad5-0218a6643ee3\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"android:id/button_always\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"aadcc0c9-d1be-485a-a03b-82760becccbf\",\"displayText\":\"Always\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f1cc8c98-222a-4728-bf99-3d4cfcb8f3f6\",\"displayText\":\"Just once\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/button_once\",\"text\":\"Just once\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":198.0,\"y1\":639.0,\"x2\":279.0,\"y2\":688.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Just once\"},{\"uuid\":\"1e3f3577-6308-4fe2-aba8-0b8611189a35\",\"displayText\":\"Always\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/button_always\",\"text\":\"Always\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":279.0,\"y1\":639.0,\"x2\":343.3333333333333,\"y2\":688.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.1666666666666288,\"y\":0.33333333333325754,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Always\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/button_bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":631.6666666666666,\"x2\":360.0,\"y2\":696.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":308.0,\"y\":663.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-128.0,\"y\":0.33333333333325754,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"1e3f3577-6308-4fe2-aba8-0b8611189a35\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"android:id/button_always\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":281.0,\"y1\":648.0,\"x2\":335.0,\"y2\":679.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if message \\\"Press the Home button\\\" appear\",\"actionId\":\"22779669-6cdc-439f-9870-6f354dc0ad20\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Press the Home button\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6c4e48e3-c1d8-4ffe-aa6a-2802c8fc5f14\",\"displayText\":\"Press the Home button\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Press the Home button\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":73.33333333333333,\"x2\":134.33333333333334,\"y2\":91.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":72.0,\"y\":84.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.833333333333329,\"y\":-1.8333333333333428,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"6c4e48e3-c1d8-4ffe-aa6a-2802c8fc5f14\",\"firstText\":\"Press the Home button\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Press the Home button\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":141.0,\"y1\":94.0,\"x2\":3.0,\"y2\":74.0}},{\"type\":\"InputAction\",\"name\":\"Home Button\",\"actionId\":\"66e3eaae-2329-4f68-b5a8-0e483d9b0fed\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":3,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"ede1fec6-3722-4ba4-bd3b-b10fed890a69\",\"245c8878-f235-47ac-b6ff-475121d72d92\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"f7ae8d87-f03e-4153-960c-6642890aa25e\",\"9686b4f4-9604-4715-b520-5099c7a2d329\",\"69f69591-237b-473e-bad5-0218a6643ee3\",\"22779669-6cdc-439f-9870-6f354dc0ad20\",\"66e3eaae-2329-4f68-b5a8-0e483d9b0fed\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Car Dock Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.025000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6ab4ade4-e911-49f5-8972-bdc1b31049c5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6ab4ade4-e911-49f5-8972-bdc1b31049c5
deleted file mode 100644
index 0d1ae0c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6ab4ade4-e911-49f5-8972-bdc1b31049c5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"6ab4ade4-e911-49f5-8972-bdc1b31049c5","details":"{\"type\":\"CompoundAction\",\"name\":\"test_CA Cert Notification Test\",\"actionId\":\"6ab4ade4-e911-49f5-8972-bdc1b31049c5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to CA Cert Notification Test\",\"actionId\":\"39ef01a5-83f8-44d2-8c55-c6561dd9d671\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CA Cert Notification Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c38299ba-0bfc-4214-91f8-695c8ce7a90a\",\"displayText\":\"CA Cert Notification Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"CA Cert Notification Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":478.5,\"x2\":351.25,\"y2\":520.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":119.0,\"y\":498.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":61.0,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"c38299ba-0bfc-4214-91f8-695c8ce7a90a\",\"firstText\":\"CA Cert Notification Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CA Cert Notification Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":485.0,\"x2\":235.0,\"y2\":512.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, CA Cert Notification Test\",\"actionId\":\"994a71b3-243b-4770-be0b-bb2c5b28f485\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CA Cert Notification Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step1- Tap to install a CA certificate\",\"actionId\":\"2354f99e-5fdc-403f-b7b4-b460c4468c99\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Tap to install a CA certificate\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if screen back to \\\"Install a certificate\\\" after install successfully\",\"actionId\":\"749fc533-dba8-4a12-8638-a35ef48a5b01\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Install a certificate\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ff05ee4b-8c07-4f26-8e08-1f7896b065a2\",\"displayText\":\"Install a certificate\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"886857bb-38b0-4c31-9df9-70674a8a48e3\",\"displayText\":\"Navigate up\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageButton\",\"contentDesc\":\"Navigate up\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":24.5,\"x2\":49.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Navigate up\"},{\"uuid\":\"b750ad25-1045-4879-9a6d-3c3db236dfd2\",\"displayText\":\"Install a certificate\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Install a certificate\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":37.25,\"x2\":212.5,\"y2\":60.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.75,\"y\":-1.625,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Install a certificate\"},{\"uuid\":\"24093c33-5c44-4c12-b68e-8698c683da6b\",\"displayText\":\"Search settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0e68cf02-36e1-48d0-81da-394b03ae3bf3\",\"displayText\":\"Search settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"contentDesc\":\"Search settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":318.0,\"y1\":28.0,\"x2\":360.0,\"y2\":70.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Search settings\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":318.0,\"y1\":24.5,\"x2\":360.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Search settings\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"com.android.settings:id/action_bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":24.5,\"x2\":360.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":134.0,\"y\":50.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":46.0,\"y\":-1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"b750ad25-1045-4879-9a6d-3c3db236dfd2\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Install a certificate\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":49.0,\"y1\":38.0,\"x2\":219.0,\"y2\":63.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step2-confirm that the Internet Widgits Pty Ltd cert appears in the list.\",\"actionId\":\"c7dc292f-d2d2-4f2f-9b30-8f42b06791a1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"confirm that the Internet Widgits Pty Ltd cert appears in the list.\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if \\\"Internet Widgits Pty Ltd\\\" is in the list\",\"actionId\":\"4d5893f7-a99c-4d8c-a843-4704d124fb57\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Internet Widgits Pty Ltd\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b0d997f6-452d-45df-acb2-04046dab9172\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0fde502e-51c2-41e6-8fd7-57132e79006b\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"8acb3011-a6ae-410c-b808-3a7ab5ae106a\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/trusted_credential_subject_primary\",\"text\":\"Internet Widgits Pty Ltd\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":135.75,\"x2\":180.25,\"y2\":157.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.375,\"y\":0.875,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Internet Widgits Pty Ltd\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":122.5,\"x2\":290.5,\"y2\":186.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Internet Widgits Pty Ltd\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":122.5,\"x2\":360.0,\"y2\":186.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":99.5,\"y\":145.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":80.5,\"y\":9.125,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"8acb3011-a6ae-410c-b808-3a7ab5ae106a\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Internet Widgits Pty Ltd\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":134.0,\"x2\":192.0,\"y2\":157.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"e0958623-42bf-43e9-839b-9a52f6d2a89a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step3-You may have been prompted to set a screen lock when installing the certificate. \",\"actionId\":\"3fcfa255-d844-4164-8f5c-b7b08bb3f2e3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"You may have been prompted to set a screen lock when installing the certificate. \"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Internet Widgits Pty Ltd exists\",\"actionId\":\"bb12eaac-0e14-46b6-9639-12d63719864c\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Internet Widgits Pty Ltd\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"cf6c6d9e-b6f4-4702-a5ce-1288a212c7da\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/to_org\",\"text\":\"Internet Widgits Pty Ltd\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":40.75,\"y1\":198.75,\"x2\":319.25,\"y2\":215.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":110.5,\"y\":208.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":69.5,\"y\":-1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"cf6c6d9e-b6f4-4702-a5ce-1288a212c7da\",\"firstText\":\"Internet Widgits Pty Ltd\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Internet Widgits Pty Ltd\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":35.0,\"y1\":199.0,\"x2\":186.0,\"y2\":217.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"304dd8b9-c54f-454b-92e0-63e05c8321d6\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ec8da72f-2d44-4168-b47e-e57d36a1eb7e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Pass Step4-There is a notification saying a certificate authority is installed. \",\"actionId\":\"7f77b9a6-d67c-4592-848a-343c80e3d1d1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"There is a notification saying a certificate authority is installed.\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,remove button\",\"actionId\":\"9ac8f885-7e30-4c3a-ab0b-3da83522e4aa\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button2\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, ok button\",\"actionId\":\"85f0a48e-a01d-4471-ae03-e95c2135c197\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"dc5a920d-e2d1-4dcd-97e4-599444b90894\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Scroll to make sure not find Certificate authority installed \",\"actionId\":\"a16b7cbf-75c4-4c63-8211-08155f621451\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Certificate authority installed\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"196ad097-379e-4343-84dc-e3abbedc749b\",\"displayText\":\"Certificate authority installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3ec0c3c3-1a6c-4294-9731-151bc5b90d99\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.android.systemui:id/backgroundNormal\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":416.75,\"x2\":356.5,\"y2\":508.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"ba194468-2ed3-43e2-be8b-6427fa0b3f41\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b55b6850-fb22-4e00-88ca-6602c1402c88\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c9082607-35c7-4fc1-b681-443946e7f1ea\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"9b62297e-4ebd-4ab7-8c67-5d517d722f2d\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"48f13567-d24d-4a0e-a2f8-51f310c77ba8\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":430.75,\"x2\":31.75,\"y2\":446.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/header_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":430.75,\"x2\":36.0,\"y2\":446.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"4e10a2ad-9169-43c6-94f0-27ee329eedee\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"Android System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":38.75,\"y1\":431.5,\"x2\":112.75,\"y2\":445.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/notification_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":416.75,\"x2\":356.5,\"y2\":460.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"},{\"uuid\":\"746824b6-a2e9-4a9b-94b8-e3b271109f4c\",\"displayText\":\"Certificate authority installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"57331e39-8c0e-4142-9219-771faf66fd43\",\"displayText\":\"Certificate authority installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a64bf15c-57b4-44fa-b402-b12ad1bd4ae2\",\"displayText\":\"Certificate authority installed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Certificate authority installed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":457.0,\"x2\":342.5,\"y2\":473.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":77.5,\"y\":1.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Certificate authority installed\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/line1\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":457.0,\"x2\":342.5,\"y2\":473.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Certificate authority installed\"},{\"uuid\":\"349f4880-e2bc-426d-8f4f-21d7a0a20bcc\",\"displayText\":\"By an unknown third party\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text\",\"text\":\"By an unknown third party\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":474.0,\"x2\":342.5,\"y2\":490.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"By an unknown third party\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/notification_main_column\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":457.0,\"x2\":342.5,\"y2\":490.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Certificate authority installed\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/status_bar_latest_event_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":416.75,\"x2\":356.5,\"y2\":508.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/expanded\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":416.75,\"x2\":356.5,\"y2\":508.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"},{\"uuid\":\"629263a6-4509-45e7-afae-f20d165e83a2\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/fake_shadow\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":416.75,\"x2\":356.5,\"y2\":508.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":416.75,\"x2\":356.5,\"y2\":508.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":102.5,\"y\":464.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":77.5,\"y\":-1.625,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"a64bf15c-57b4-44fa-b402-b12ad1bd4ae2\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Certificate authority installed\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":456.0,\"x2\":196.0,\"y2\":472.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"19318f81-2790-4fbf-8add-dab577a7dd11\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, pass Step5-Open the notification and follow the link to remove CA certificates.\",\"actionId\":\"efdea6ae-6fcd-4bbf-833c-98d824510785\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Open the notification and follow the link to remove CA certificates.\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"39ef01a5-83f8-44d2-8c55-c6561dd9d671\",\"994a71b3-243b-4770-be0b-bb2c5b28f485\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"2354f99e-5fdc-403f-b7b4-b460c4468c99\",\"553582bb-ae2d-4759-a0a7-f73067bf7e89\",\"0e355b97-b105-4074-8e2f-c4d1e0a69a08\",\"749fc533-dba8-4a12-8638-a35ef48a5b01\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"1ed2536c-bc42-41ff-8528-dea80280c9fd\",\"c7dc292f-d2d2-4f2f-9b30-8f42b06791a1\",\"553582bb-ae2d-4759-a0a7-f73067bf7e89\",\"4d5893f7-a99c-4d8c-a843-4704d124fb57\",\"e0958623-42bf-43e9-839b-9a52f6d2a89a\",\"1ed2536c-bc42-41ff-8528-dea80280c9fd\",\"3fcfa255-d844-4164-8f5c-b7b08bb3f2e3\",\"1ed2536c-bc42-41ff-8528-dea80280c9fd\",\"6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a\",\"bb12eaac-0e14-46b6-9639-12d63719864c\",\"304dd8b9-c54f-454b-92e0-63e05c8321d6\",\"ec8da72f-2d44-4168-b47e-e57d36a1eb7e\",\"7f77b9a6-d67c-4592-848a-343c80e3d1d1\",\"6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a\",\"9ac8f885-7e30-4c3a-ab0b-3da83522e4aa\",\"85f0a48e-a01d-4471-ae03-e95c2135c197\",\"dc5a920d-e2d1-4dcd-97e4-599444b90894\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"a16b7cbf-75c4-4c63-8211-08155f621451\",\"19318f81-2790-4fbf-8add-dab577a7dd11\",\"efdea6ae-6fcd-4bbf-833c-98d824510785\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_CA Cert Notification Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.229000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6c314101-5195-49ff-88e9-8f78cc8c697b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6c314101-5195-49ff-88e9-8f78cc8c697b
deleted file mode 100644
index ae655f8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6c314101-5195-49ff-88e9-8f78cc8c697b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"6c314101-5195-49ff-88e9-8f78cc8c697b","details":"{\"type\":\"CompoundAction\",\"name\":\"Swipe up to unlock screen\",\"actionId\":\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if lock icon exists\",\"actionId\":\"d7430f0f-0405-45e2-b279-5c0672c995bb\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.systemui:id/lock_icon\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e8454d6c-df0d-4d84-8561-667a2e32bea8\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/lock_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":160.66666666666666,\"y1\":45.333333333333336,\"x2\":199.33333333333334,\"y2\":138.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":179.5,\"y\":81.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":0.5,\"y\":10.833333333333343,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"e8454d6c-df0d-4d84-8561-667a2e32bea8\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.systemui:id/lock_icon\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":152.0,\"y1\":65.0,\"x2\":207.0,\"y2\":97.0}},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"73ef10f5-d951-4284-91af-2d0559f458a7\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null}],\"childrenIdList\":[\"d7430f0f-0405-45e2-b279-5c0672c995bb\",\"73ef10f5-d951-4284-91af-2d0559f458a7\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Swipe up to unlock screen","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.051000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6d4037a3-a4e4-4bab-9f39-afc62304cf57 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6d4037a3-a4e4-4bab-9f39-afc62304cf57
deleted file mode 100644
index bf0b82a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6d4037a3-a4e4-4bab-9f39-afc62304cf57
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"6d4037a3-a4e4-4bab-9f39-afc62304cf57","details":"{\"type\":\"CompoundAction\",\"name\":\"Click launch Settings button\",\"actionId\":\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Click launch Settings button\",\"actionId\":\"d1b2aa0f-aef3-43fa-ba69-f8460cf136f8\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/nls_action_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"d1b2aa0f-aef3-43fa-ba69-f8460cf136f8\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click launch Settings button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.234000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6d46cead-4200-4830-ab73-aa5b72d8cee0 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6d46cead-4200-4830-ab73-aa5b72d8cee0
deleted file mode 100644
index 4f636a9..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6d46cead-4200-4830-ab73-aa5b72d8cee0
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"6d46cead-4200-4830-ab73-aa5b72d8cee0","details":"{\"type\":\"CompoundAction\",\"name\":\"02_Full disk encryption enabled\",\"actionId\":\"6d46cead-4200-4830-ab73-aa5b72d8cee0\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Full disk encryption enabled\",\"actionId\":\"53ef47df-a61c-449b-9e07-cedc1f76654a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Full disk encryption enabled\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d3601bcd-389a-4959-8ef7-acc93d32ad5b\",\"displayText\":\"Full disk encryption enabled\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Full disk encryption enabled\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":407.6666666666667,\"x2\":360.0,\"y2\":449.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":97.0,\"y\":431.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":83.0,\"y\":-2.8333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"d3601bcd-389a-4959-8ef7-acc93d32ad5b\",\"firstText\":\"Full disk encryption enabled\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Full disk encryption enabled\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":419.0,\"x2\":191.0,\"y2\":444.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Full disk encryption enabled\",\"actionId\":\"29035838-f5f5-4b00-9bf5-060a21ac8f27\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Full disk encryption enabled\"}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"53ef47df-a61c-449b-9e07-cedc1f76654a\",\"29035838-f5f5-4b00-9bf5-060a21ac8f27\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"02_Full disk encryption enabled","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.292000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a
deleted file mode 100644
index 4085bbb..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a","details":"{\"type\":\"CompoundAction\",\"name\":\"Check certificate on notification status bar\",\"actionId\":\"6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find Certificate authority installed\",\"actionId\":\"7560d48a-692f-4746-8a20-c95a2da66aee\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Certificate authority installed\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c9433c02-753a-4e61-9f72-842b9636e297\",\"displayText\":\"Certificate authority installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b032d9d5-c2c1-4cf8-a214-0e2a637ede70\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.android.systemui:id/backgroundNormal\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":508.5,\"x2\":356.5,\"y2\":599.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"3861bc5f-58e1-4abd-8287-2e4443a2fed2\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f932598e-894e-4754-b614-db888ed45802\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3c8520c8-46c3-47eb-86ca-750275430662\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6440748c-f854-428f-a293-64b33ea28fa0\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"79063e3f-565b-4d7d-ae8e-a11765a0e138\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":522.5,\"x2\":31.75,\"y2\":538.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/header_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":522.5,\"x2\":36.0,\"y2\":538.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"d89cf135-d952-4b96-8899-8a06609bc722\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"Android System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":38.75,\"y1\":523.25,\"x2\":112.75,\"y2\":537.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/notification_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":508.5,\"x2\":356.5,\"y2\":552.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"},{\"uuid\":\"c473e04b-99d7-4d09-9865-e8aacaf96e30\",\"displayText\":\"Certificate authority installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2c7961da-2c0d-4a6c-95ce-6e6390a17181\",\"displayText\":\"Certificate authority installed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1c898d30-a210-4145-bd54-45d2366e4b64\",\"displayText\":\"Certificate authority installed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Certificate authority installed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":548.75,\"x2\":342.5,\"y2\":565.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":76.5,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Certificate authority installed\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/line1\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":548.75,\"x2\":342.5,\"y2\":565.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Certificate authority installed\"},{\"uuid\":\"b0cdc866-0923-4912-aabf-244a0a804a63\",\"displayText\":\"By an unknown third party\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text\",\"text\":\"By an unknown third party\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":565.75,\"x2\":342.5,\"y2\":582.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"By an unknown third party\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/notification_main_column\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":548.75,\"x2\":342.5,\"y2\":582.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Certificate authority installed\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/status_bar_latest_event_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":508.5,\"x2\":356.5,\"y2\":599.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/expanded\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":508.5,\"x2\":356.5,\"y2\":599.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"},{\"uuid\":\"bce7708c-bf9f-45ad-9244-b8687859879a\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/fake_shadow\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":508.5,\"x2\":356.5,\"y2\":599.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":508.5,\"x2\":356.5,\"y2\":599.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":103.5,\"y\":557.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":76.5,\"y\":-2.875,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"1c898d30-a210-4145-bd54-45d2366e4b64\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Certificate authority installed\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":17.0,\"y1\":552.0,\"x2\":190.0,\"y2\":562.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Certificate authority installed\",\"actionId\":\"c0acc4c4-9630-4877-a9f5-ba26d8546b11\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Certificate authority installed\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,Check certificate button\",\"actionId\":\"0c8f4514-e846-4c4b-9b04-b8e92266c046\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"15c75efc-b173-4eed-9a2c-164886355c98\",\"7560d48a-692f-4746-8a20-c95a2da66aee\",\"c0acc4c4-9630-4877-a9f5-ba26d8546b11\",\"0c8f4514-e846-4c4b-9b04-b8e92266c046\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Check certificate on notification status bar","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.231000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b
deleted file mode 100644
index ceb3857..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b","details":"{\"type\":\"CompoundAction\",\"name\":\"15-18 & 17-06-09-Disallow config location\",\"actionId\":\"6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config location\",\"actionId\":\"7b874b8e-20b3-4e9b-80c7-3f6d10f0bc84\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config location\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"477a0669-d6b0-49d6-b2e3-036a79f9fb59\",\"displayText\":\"Disallow config location\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config location\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":395.6666666666667,\"x2\":360.0,\"y2\":439.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":84.0,\"y\":419.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":96.0,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"477a0669-d6b0-49d6-b2e3-036a79f9fb59\",\"firstText\":\"Disallow config location\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config location\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":401.0,\"x2\":160.0,\"y2\":437.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config location\",\"actionId\":\"d24e75ea-2aaf-4b71-b069-5d609e37ec3d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config location\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Use location\",\"actionId\":\"a35fd513-b60b-4c2b-95d8-879d41700282\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Use location\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"bae6381d-6761-4ded-b1d7-04cbc3f9d5da\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Google Location Accuracy\",\"actionId\":\"2a5b067a-7c99-422d-8158-7c4fceedafae\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Google Location Accuracy\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"276137cc-370d-45e6-9f1b-fa9a8050a607\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"fa1f115b-de9b-4c53-8e07-036c0f6c851c\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"7b874b8e-20b3-4e9b-80c7-3f6d10f0bc84\",\"d24e75ea-2aaf-4b71-b069-5d609e37ec3d\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"a35fd513-b60b-4c2b-95d8-879d41700282\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"bae6381d-6761-4ded-b1d7-04cbc3f9d5da\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"2a5b067a-7c99-422d-8158-7c4fceedafae\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"276137cc-370d-45e6-9f1b-fa9a8050a607\",\"fa1f115b-de9b-4c53-8e07-036c0f6c851c\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-18 & 17-06-09-Disallow config location","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.148000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6f268fc7-772a-426d-ab18-4e9b2eefa03e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6f268fc7-772a-426d-ab18-4e9b2eefa03e
deleted file mode 100644
index 365e460..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/6f268fc7-772a-426d-ab18-4e9b2eefa03e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"6f268fc7-772a-426d-ab18-4e9b2eefa03e","details":"{\"type\":\"CompoundAction\",\"name\":\"Assert absent for Tile Service for CTS Verifier \",\"actionId\":\"6f268fc7-772a-426d-ab18-4e9b2eefa03e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert absent for Tile Service for CTS Verifier \",\"actionId\":\"d5907d5e-301b-4079-93a3-e15459c7c602\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/tile_label\"},{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Tile Service for CTS Verifier\"}]},\"clickAfterValidation\":false},{\"type\":\"SwipeAction\",\"name\":\"left\",\"actionId\":\"73f542ff-8407-4b9d-af2c-34269b317abd\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"startX\":340,\"startY\":320,\"endX\":20,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert absent for Tile Service for CTS Verifier \",\"actionId\":\"6ffb9270-e1e4-4c66-b518-8ff64078bcfe\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/tile_label\"},{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Tile Service for CTS Verifier\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"d5907d5e-301b-4079-93a3-e15459c7c602\",\"73f542ff-8407-4b9d-af2c-34269b317abd\",\"6ffb9270-e1e4-4c66-b518-8ff64078bcfe\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Assert absent for Tile Service for CTS Verifier ","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.327000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/700c10f3-2945-460b-bc5a-dc5a5fdc0f96 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/700c10f3-2945-460b-bc5a-dc5a5fdc0f96
deleted file mode 100644
index cc269a8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/700c10f3-2945-460b-bc5a-dc5a5fdc0f96
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"700c10f3-2945-460b-bc5a-dc5a5fdc0f96","details":"{\"type\":\"CompoundAction\",\"name\":\"Close Settings\",\"actionId\":\"700c10f3-2945-460b-bc5a-dc5a5fdc0f96\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Force close settings\",\"actionId\":\"c2a448f2-5bb6-48e8-a213-9f47f9544087\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"shell am force-stop com.android.settings\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"c2a448f2-5bb6-48e8-a213-9f47f9544087\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Close Settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.999000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7265db9b-8461-4c01-8b11-809b8e346327 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7265db9b-8461-4c01-8b11-809b8e346327
deleted file mode 100644
index a42f4c0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7265db9b-8461-4c01-8b11-809b8e346327
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7265db9b-8461-4c01-8b11-809b8e346327","details":"{\"type\":\"CompoundAction\",\"name\":\"02_Custom provisioning image(Check image)\",\"actionId\":\"7265db9b-8461-4c01-8b11-809b8e346327\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to BYOD Provisioning tests\",\"actionId\":\"d447d575-ad8d-4225-aa75-e1c8bdcf678a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"BYOD Provisioning tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1e0ceffb-a84c-4dde-995e-e27ec3b9498d\",\"displayText\":\"BYOD Provisioning tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"BYOD Provisioning tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":452.0,\"x2\":351.3333333333333,\"y2\":494.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":96.5,\"y\":469.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":83.5,\"y\":4.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"1e0ceffb-a84c-4dde-995e-e27ec3b9498d\",\"firstText\":\"BYOD Provisioning tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"BYOD Provisioning tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":182.0,\"y1\":483.0,\"x2\":11.0,\"y2\":455.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, BYOD Provisioning tests\",\"actionId\":\"32d17e91-6762-492a-a978-7f85b328b3cb\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"BYOD Provisioning tests\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Custom provisioning image\",\"actionId\":\"379e890a-a07e-4737-9696-89c39fe6249c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Custom provisioning image\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Go\",\"actionId\":\"d85e3c07-d753-4845-baa6-9d09ba4c9c10\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Go\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Accept & continue\",\"actionId\":\"bb46b82a-f493-47de-8fc5-624d893ede89\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Accept & continue\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"308bac6a-4905-4c93-89c5-120a85f79848\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"WaitAction\",\"name\":\"WAIT for 5 secs\",\"actionId\":\"c9f9cf56-ec18-4411-b887-7403886c3e29\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"pololee\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"5fe61221-a06d-435b-983b-fb66f47c0af2\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"WaitAction\",\"name\":\"WAIT for 15 secs\",\"actionId\":\"60eeea8e-9175-47fa-bbf9-edf676f010c7\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"pololee\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"cc915a37-1135-403a-939f-db9eafa2e71f\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"23ae6cc1-affe-4f44-8bad-41ff01140d55\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"d447d575-ad8d-4225-aa75-e1c8bdcf678a\",\"32d17e91-6762-492a-a978-7f85b328b3cb\",\"379e890a-a07e-4737-9696-89c39fe6249c\",\"d85e3c07-d753-4845-baa6-9d09ba4c9c10\",\"bb46b82a-f493-47de-8fc5-624d893ede89\",\"308bac6a-4905-4c93-89c5-120a85f79848\",\"c9f9cf56-ec18-4411-b887-7403886c3e29\",\"5fe61221-a06d-435b-983b-fb66f47c0af2\",\"60eeea8e-9175-47fa-bbf9-edf676f010c7\",\"cc915a37-1135-403a-939f-db9eafa2e71f\",\"23ae6cc1-affe-4f44-8bad-41ff01140d55\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"02_Custom provisioning image(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.312000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/72a6fa67-df5f-4c18-849a-8212e749417e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/72a6fa67-df5f-4c18-849a-8212e749417e
deleted file mode 100644
index 2346ee6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/72a6fa67-df5f-4c18-849a-8212e749417e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"72a6fa67-df5f-4c18-849a-8212e749417e","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Dummy input method\",\"actionId\":\"72a6fa67-df5f-4c18-849a-8212e749417e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to System\",\"actionId\":\"873c31a5-9dd5-46fe-9f4a-6414a68a17e1\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"System\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"afb727dd-f083-4359-8abc-69492013588a\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a92a789b-cfb1-4f4d-907f-78b3283721ea\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"eea20e8b-8ed6-4eb1-b450-58f1358b23d4\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":543.75,\"x2\":45.5,\"y2\":575.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":540.25,\"x2\":63.0,\"y2\":578.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"eb604baf-c575-4f7a-acd3-f18603b0605d\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"37670940-29d2-48ea-bcd5-661b52292b70\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":541.75,\"x2\":109.25,\"y2\":560.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-7.875,\"y\":3.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"System\"},{\"uuid\":\"f29faada-133f-4189-9ba9-a615c4f78d43\",\"displayText\":\"Languages, gestures, time, backup\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Languages, gestures, time, backup\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":560.75,\"x2\":251.75,\"y2\":577.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Languages, gestures, time, backup\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":527.75,\"x2\":346.0,\"y2\":591.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"System\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":527.75,\"x2\":360.0,\"y2\":591.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":94.0,\"y\":547.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":86.0,\"y\":12.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"37670940-29d2-48ea-bcd5-661b52292b70\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"System\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":536.0,\"x2\":134.0,\"y2\":559.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, System\",\"actionId\":\"f5de4a41-f099-455e-83c1-b2dd9ee81658\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"System\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Languages & input\",\"actionId\":\"4a0799fd-a093-4370-9d7a-7b001f55b0ff\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Languages & input\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, On-screen keyboard\",\"actionId\":\"8253c9ba-f498-4d59-bd5b-d712d9f29437\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"On-screen keyboard\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Manage on-screen keyboards\",\"actionId\":\"09a1c32e-1dd2-478d-8d93-51376ec2f2a4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Manage on-screen keyboards\"}],\"childrenIdList\":[\"873c31a5-9dd5-46fe-9f4a-6414a68a17e1\",\"f5de4a41-f099-455e-83c1-b2dd9ee81658\",\"4a0799fd-a093-4370-9d7a-7b001f55b0ff\",\"8253c9ba-f498-4d59-bd5b-d712d9f29437\",\"09a1c32e-1dd2-478d-8d93-51376ec2f2a4\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Dummy input method","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.165000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/72f62d5f-9a3a-4c4d-813c-96614b1c5845 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/72f62d5f-9a3a-4c4d-813c-96614b1c5845
deleted file mode 100644
index 85ffcce..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/72f62d5f-9a3a-4c4d-813c-96614b1c5845
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"72f62d5f-9a3a-4c4d-813c-96614b1c5845","details":"{\"type\":\"CompoundAction\",\"name\":\"Set screen lock to \\\"None\\\"\",\"actionId\":\"72f62d5f-9a3a-4c4d-813c-96614b1c5845\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, None\",\"actionId\":\"6041407c-09ac-407b-b05a-33553854224b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"None\"},{\"type\":\"ConditionClickAction\",\"name\":\"Click Yes, remove to confirm action\",\"actionId\":\"66468a57-ed85-4614-8f1a-1257aab3f956\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Yes, remove\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f4afdd99-a4ce-4f66-8ca1-fb83967f209e\",\"displayText\":\"Yes, remove\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f2486fa8-7621-4fda-a357-524f26caa02e\",\"displayText\":\"Cancel\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"25a08419-4f7e-485d-92ee-08269d0a3e94\",\"displayText\":\"Cancel\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/button2\",\"text\":\"Cancel\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":175.33333333333334,\"y1\":411.3333333333333,\"x2\":236.0,\"y2\":458.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Cancel\"},{\"uuid\":\"c244e5bb-2724-48f0-9e9c-c98a52ffd5d0\",\"displayText\":\"Yes, remove\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/button1\",\"text\":\"Yes, remove\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":236.0,\"y1\":411.3333333333333,\"x2\":326.0,\"y2\":458.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.5,\"y\":-1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Yes, remove\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.333333333333332,\"y1\":407.6666666666667,\"x2\":336.6666666666667,\"y2\":462.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Cancel\"}],\"className\":\"android.widget.ScrollView\",\"resourceId\":\"com.android.settings:id/buttonPanel\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.333333333333332,\"y1\":407.6666666666667,\"x2\":336.6666666666667,\"y2\":462.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":284.5,\"y\":436.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-104.5,\"y\":-1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"c244e5bb-2724-48f0-9e9c-c98a52ffd5d0\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Yes, remove\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":242.0,\"y1\":421.0,\"x2\":327.0,\"y2\":451.0}}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"6041407c-09ac-407b-b05a-33553854224b\",\"66468a57-ed85-4614-8f1a-1257aab3f956\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set screen lock to \"None\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.042000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/731c2600-1169-402e-91ee-98a4dd31506f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/731c2600-1169-402e-91ee-98a4dd31506f
deleted file mode 100644
index e3e093a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/731c2600-1169-402e-91ee-98a4dd31506f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"731c2600-1169-402e-91ee-98a4dd31506f","details":"{\"type\":\"CompoundAction\",\"name\":\"03_Badged work apps visible in launcher(Check image)\",\"actionId\":\"731c2600-1169-402e-91ee-98a4dd31506f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Badged work apps visible in Launcher\",\"actionId\":\"11661e72-29e0-4ee9-8227-795f4d61fa9d\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Badged work apps visible in Launcher\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"68729ba3-e1f2-4e21-9de2-2e9602cc69e0\",\"displayText\":\"Badged work apps visible in Launcher\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Badged work apps visible in Launcher\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":450.6666666666667,\"x2\":360.0,\"y2\":492.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":122.5,\"y\":472.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":57.5,\"y\":-0.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"68729ba3-e1f2-4e21-9de2-2e9602cc69e0\",\"firstText\":\"Badged work apps visible in Launcher\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Badged work apps visible in Launcher\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":461.0,\"x2\":242.0,\"y2\":483.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Badged work apps visible in Launcher\",\"actionId\":\"8c9faf8b-c7ad-4098-9e49-d57bf46afb58\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Badged work apps visible in Launcher\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"69a9401c-6b32-49a9-8da6-f0b78883bd35\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Next if needed\",\"actionId\":\"c0ffce6f-96f4-4f75-958b-d8ecbadc6b04\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.apps.nexuslauncher:id/proceed\"}]},\"clickAfterValidation\":true},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Got it if needed\",\"actionId\":\"cd9a46d9-ff00-4308-8d62-b826118fc17e\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.apps.nexuslauncher:id/proceed\"}]},\"clickAfterValidation\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/tab_work\",\"actionId\":\"096f366a-1767-430f-a2fd-ad7b7c36ac4b\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.apps.nexuslauncher:id/tab_work\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert present for Work CTS Verifier\",\"actionId\":\"c0cd11be-bf46-4044-8dd7-946d7706142c\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.apps.nexuslauncher:id/icon\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Work CTS Verifier\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert present for Work Contacts\",\"actionId\":\"fe3b2f43-c8db-4703-b035-fadf8a84193a\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.apps.nexuslauncher:id/icon\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Work Contacts\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert present for Work Files\",\"actionId\":\"cabdeb7a-9838-44c9-afc0-1879c9828bcc\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.apps.nexuslauncher:id/icon\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Work Files\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-assert present for Work Play Store\",\"actionId\":\"3215a8f0-9d89-4972-a264-b9b5fec28224\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.apps.nexuslauncher:id/icon\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Work Play Store\"}]},\"clickAfterValidation\":false},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"29851d63-3386-43d5-bafe-f457d6cdcc86\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"InputAction\",\"name\":\"Overview Button\",\"actionId\":\"aa2075de-6f72-4a9c-b6f3-08b0266d6c83\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":187,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"cb4d3398-643b-4387-ae26-05cb1ce2c9fe\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"11661e72-29e0-4ee9-8227-795f4d61fa9d\",\"8c9faf8b-c7ad-4098-9e49-d57bf46afb58\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"69a9401c-6b32-49a9-8da6-f0b78883bd35\",\"c0ffce6f-96f4-4f75-958b-d8ecbadc6b04\",\"cd9a46d9-ff00-4308-8d62-b826118fc17e\",\"096f366a-1767-430f-a2fd-ad7b7c36ac4b\",\"c0cd11be-bf46-4044-8dd7-946d7706142c\",\"fe3b2f43-c8db-4703-b035-fadf8a84193a\",\"cabdeb7a-9838-44c9-afc0-1879c9828bcc\",\"3215a8f0-9d89-4972-a264-b9b5fec28224\",\"29851d63-3386-43d5-bafe-f457d6cdcc86\",\"aa2075de-6f72-4a9c-b6f3-08b0266d6c83\",\"cb4d3398-643b-4387-ae26-05cb1ce2c9fe\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"03_Badged work apps visible in launcher(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.293000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/73572186-21d3-4f07-9b89-dd5f35a0a943 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/73572186-21d3-4f07-9b89-dd5f35a0a943
deleted file mode 100644
index 2c88fee..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/73572186-21d3-4f07-9b89-dd5f35a0a943
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"73572186-21d3-4f07-9b89-dd5f35a0a943","details":"{\"type\":\"CompoundAction\",\"name\":\"Assert the work profile location go enabled and into its previous state on\",\"actionId\":\"73572186-21d3-4f07-9b89-dd5f35a0a943\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Assert the work profile location go enabled and into its previous state on\",\"actionId\":\"4d35205e-62f2-4db0-86f3-2ef8b345b2d7\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\nuicd_util = UICDPythonUtil()\\nd = Device.create_device_by_slot(0)\\n\\nresult = d.text(\\\"Location for work profile\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"enabled\\\", \\\"true\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"4d35205e-62f2-4db0-86f3-2ef8b345b2d7\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Assert the work profile location go enabled and into its previous state on","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.287000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/740de7a4-51a7-411c-bf5f-424945116764 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/740de7a4-51a7-411c-bf5f-424945116764
deleted file mode 100644
index dd8459f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/740de7a4-51a7-411c-bf5f-424945116764
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"740de7a4-51a7-411c-bf5f-424945116764","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Start Test button\",\"actionId\":\"740de7a4-51a7-411c-bf5f-424945116764\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/start_test_button\",\"actionId\":\"638c0034-c345-4745-8b4c-0c7e66487992\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/start_test_button\"}],\"childrenIdList\":[\"638c0034-c345-4745-8b4c-0c7e66487992\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Start Test button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.002000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/764101e3-1eaa-47e8-854f-68434c4c994c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/764101e3-1eaa-47e8-854f-68434c4c994c
deleted file mode 100644
index 698c0dfb..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/764101e3-1eaa-47e8-854f-68434c4c994c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"764101e3-1eaa-47e8-854f-68434c4c994c","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify that on the lock screen, you are told the device is managed\",\"actionId\":\"764101e3-1eaa-47e8-854f-68434c4c994c\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Verify that on the lock screen, you are told the device is managed\",\"actionId\":\"fc9d9997-934f-4854-a5a8-ed585a6b8c0e\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"This device belongs to your organization\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"fc9d9997-934f-4854-a5a8-ed585a6b8c0e\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify that on the lock screen, you are told the device is managed","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.192000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/76a9632c-6b66-4bec-9423-e4f09af91996 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/76a9632c-6b66-4bec-9423-e4f09af91996
deleted file mode 100644
index 6526f00..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/76a9632c-6b66-4bec-9423-e4f09af91996
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"76a9632c-6b66-4bec-9423-e4f09af91996","details":"{\"type\":\"CompoundAction\",\"name\":\"16-17-Add account disclosure\",\"actionId\":\"76a9632c-6b66-4bec-9423-e4f09af91996\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Add account disclosure\",\"actionId\":\"db64ba55-882e-4245-b9a7-f556f7b07f9b\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Add account disclosure\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0defb877-68cd-4158-a594-95cf13b0686f\",\"displayText\":\"Add account disclosure\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Add account disclosure\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":652.0,\"x2\":351.3333333333333,\"y2\":694.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":95.0,\"y\":672.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":85.0,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"0defb877-68cd-4158-a594-95cf13b0686f\",\"firstText\":\"Add account disclosure\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Add account disclosure\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":655.0,\"x2\":187.0,\"y2\":689.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Add account disclosure\",\"actionId\":\"7ac9fd8e-5bc6-4eca-ab70-d8ec6f8d4820\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Add account disclosure\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told that the device is managed\",\"actionId\":\"6bc591c0-30a1-41bd-9164-b4ebb6e46c03\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"This device is managed by your organization. Learn more\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"474d0fdc-e219-4ae8-873d-3b7292c34772\",\"displayText\":\"This device is managed by your organization. Learn more\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3b95faec-97c0-4c05-8039-0e21aad842b3\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e10ec406-a1c4-44d0-afb6-00b6f6898bd5\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":346.3333333333333,\"x2\":35.0,\"y2\":367.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":332.3333333333333,\"x2\":63.0,\"y2\":371.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"\"},{\"uuid\":\"4c01466a-4742-4465-8bd8-84b90d723fc1\",\"displayText\":\"This device is managed by your organization. Learn more\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"This device is managed by your organization. Learn more\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":332.3333333333333,\"x2\":346.0,\"y2\":391.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":26.0,\"y\":4.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"This device is managed by your organization. Learn more\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":332.3333333333333,\"x2\":360.0,\"y2\":395.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":178.5,\"y\":358.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":1.5,\"y\":5.833333333333314,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"4c01466a-4742-4465-8bd8-84b90d723fc1\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This device is managed by your organization. Learn more\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":50.0,\"y1\":344.0,\"x2\":307.0,\"y2\":372.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"35f3cedd-a72b-4397-8001-8fe26aac7e44\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told that the device is managed by \\\"Foo, Inc\\\"\",\"actionId\":\"49db6ecf-1ee6-4fae-9bba-2c9b66587db1\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"This device is managed by Foo, Inc.. Learn more\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ca2610ab-841c-45d0-ad7b-f5df4c217daf\",\"displayText\":\"This device is managed by Foo, Inc.. Learn more\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"aca780cf-d171-4ea5-9e52-9955ea8ae15e\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a74452b6-2a11-4945-854a-f809713e15da\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":346.3333333333333,\"x2\":35.0,\"y2\":367.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":332.3333333333333,\"x2\":63.0,\"y2\":371.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"\"},{\"uuid\":\"e898aaac-e399-4e11-9da4-4b28601ab8c6\",\"displayText\":\"This device is managed by Foo, Inc.. Learn more\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"This device is managed by Foo, Inc.. Learn more\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":332.3333333333333,\"x2\":325.0,\"y2\":377.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":35.5,\"y\":2.3333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"This device is managed by Foo, Inc.. Learn more\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":332.3333333333333,\"x2\":360.0,\"y2\":395.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":158.5,\"y\":352.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":21.5,\"y\":11.333333333333314,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"e898aaac-e399-4e11-9da4-4b28601ab8c6\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This device is managed by Foo, Inc.. Learn more\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":62.0,\"y1\":342.0,\"x2\":255.0,\"y2\":363.0}},{\"type\":\"PythonScriptAction\",\"name\":\"Press Learn more link\",\"actionId\":\"69218c7d-918d-46e6-b3ec-28a792c92c7e\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nimport re\\nd= Device.create_device_by_slot(0)\\n\\ntext=dict(d.text(\\\"This device is managed by Foo, Inc.. Learn more\\\").get_attributes())['bounds']\\nx2=int(re.findall(r'\\\\d+', text)[2])\\ny2=int(re.findall(r'\\\\d+', text)[3])\\nd.click(x2-20, y2-50)\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that a screen informing you what your managing organization can do is shown\",\"actionId\":\"79f09a2f-a286-4029-964c-fc64bd5f6b3d\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"TYPES OF INFORMATION YOUR ORGANIZATION CAN SEE\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c2257f6d-6077-4c61-93e7-9eb253d51c88\",\"displayText\":\"TYPES OF INFORMATION YOUR ORGANIZATION CAN SEE\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f0fab44e-dbd1-4a94-937a-509d375abed1\",\"displayText\":\"TYPES OF INFORMATION YOUR ORGANIZATION CAN SEE\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"893fa04e-ac6b-4059-8569-51ffeaaa7508\",\"displayText\":\"TYPES OF INFORMATION YOUR ORGANIZATION CAN SEE\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"TYPES OF INFORMATION YOUR ORGANIZATION CAN SEE\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":118.33333333333333,\"x2\":346.0,\"y2\":131.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"TYPES OF INFORMATION YOUR ORGANIZATION CAN SEE\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":111.33333333333333,\"x2\":346.0,\"y2\":138.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":16.0,\"y\":3.333333333333343,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"TYPES OF INFORMATION YOUR ORGANIZATION CAN SEE\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":111.33333333333333,\"x2\":360.0,\"y2\":138.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":167.5,\"y\":121.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":12.5,\"y\":3.333333333333343,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"f0fab44e-dbd1-4a94-937a-509d375abed1\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"TYPES OF INFORMATION YOUR ORGANIZATION CAN SEE\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":107.0,\"x2\":328.0,\"y2\":136.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"16a63463-a03a-41bc-b0db-880bf6b5edb1\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"9041f3c8-b93d-4cc6-8db9-2f9c7a06433a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"db64ba55-882e-4245-b9a7-f556f7b07f9b\",\"7ac9fd8e-5bc6-4eca-ab70-d8ec6f8d4820\",\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"6bc591c0-30a1-41bd-9164-b4ebb6e46c03\",\"35f3cedd-a72b-4397-8001-8fe26aac7e44\",\"91ab1016-e46b-4681-802a-30de34592081\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"49db6ecf-1ee6-4fae-9bba-2c9b66587db1\",\"69218c7d-918d-46e6-b3ec-28a792c92c7e\",\"79f09a2f-a286-4029-964c-fc64bd5f6b3d\",\"16a63463-a03a-41bc-b0db-880bf6b5edb1\",\"9041f3c8-b93d-4cc6-8db9-2f9c7a06433a\",\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-17-Add account disclosure","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.196000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/77cd84d9-261a-488e-8fdb-5e3c36852267 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/77cd84d9-261a-488e-8fdb-5e3c36852267
deleted file mode 100644
index 9b39960..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/77cd84d9-261a-488e-8fdb-5e3c36852267
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"77cd84d9-261a-488e-8fdb-5e3c36852267","details":"{\"type\":\"CompoundAction\",\"name\":\"23-Customize Lock Screen Message\",\"actionId\":\"77cd84d9-261a-488e-8fdb-5e3c36852267\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Customize Lock Screen Message\",\"actionId\":\"6afb21cf-f58f-44b2-b079-e2de052becc0\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Customize Lock Screen Message\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4e339b85-721f-49c1-b1ea-66710e344e53\",\"displayText\":\"Customize Lock Screen Message\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Customize Lock Screen Message\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":588.0,\"x2\":351.25,\"y2\":630.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":123.0,\"y\":607.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":57.0,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"4e339b85-721f-49c1-b1ea-66710e344e53\",\"firstText\":\"Customize Lock Screen Message\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Customize Lock Screen Message\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":14.0,\"y1\":601.0,\"x2\":232.0,\"y2\":614.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Customize Lock Screen Message\",\"actionId\":\"8ca2932b-f92c-4b46-80ec-a57acf453c6c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Customize Lock Screen Message\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/go_button\",\"actionId\":\"a802542a-b2e2-407c-8e25-602e65b31d58\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/go_button\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"3f5b5b18-1bf0-44c2-975c-ca140f0143f6\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"15c06817-82c9-473b-8ffb-7e432f257397\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/lockscreen_message_edit_text\",\"actionId\":\"ec708de3-2b1d-4c7d-b513-7b31f10de089\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/lockscreen_message_edit_text\"},{\"type\":\"InputAction\",\"name\":\"INPUT string \\\"Customize screen lock message test\\\"\",\"actionId\":\"a8683a3f-e93a-485a-a902-ab739984681b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"Customize screen lock message test\",\"isSingleChar\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"db12b609-a0bf-4886-b5ae-65062b3d0645\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/lockscreen_message_set_button\",\"actionId\":\"f4db23d7-d1df-4fc2-8f3d-633d375289e1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/lockscreen_message_set_button\"},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"6465d8ca-e0af-49a9-984e-5dbfe2e88a1c\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"64c2079c-364b-45d6-b0c3-93132f5d794f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if the string \\\"Customize screen lock message test\\\" exists\",\"actionId\":\"41790812-13db-410f-9c30-2c0a417b2858\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Customize screen lock message test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"9d8f10fb-2442-4a3c-ae60-e7ad46216451\",\"displayText\":\"218\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"ce5bbcb4-7265-4591-9f2b-696c9f3cd169\",\"displayText\":\"218\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/default_clock_view\",\"text\":\"218\",\"contentDesc\":\"218\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":5.0,\"y1\":199.75,\"x2\":360.0,\"y2\":266.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.5,\"y\":-18.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"218\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/clock_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":5.0,\"y1\":199.75,\"x2\":360.0,\"y2\":266.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":183.0,\"y\":251.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.5,\"y\":-18.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"ce5bbcb4-7265-4591-9f2b-696c9f3cd169\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Customize screen lock message test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":35.0,\"y1\":234.0,\"x2\":331.0,\"y2\":268.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/go_button\",\"actionId\":\"c61d50a7-f1a2-4a3f-b25d-1c068fe2787a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/go_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Add text on lock screen\",\"actionId\":\"f759702b-999f-4919-88ec-adc05d561035\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Add text on lock screen\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/go_button\",\"actionId\":\"82a811ab-7488-4239-8c70-cf553e8c8c5e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/go_button\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"71ffbda6-7620-4eb7-8ca3-24c50238772d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"34af4cdd-aecf-4125-8be2-d1e456e30dfa\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"6afb21cf-f58f-44b2-b079-e2de052becc0\",\"8ca2932b-f92c-4b46-80ec-a57acf453c6c\",\"a802542a-b2e2-407c-8e25-602e65b31d58\",\"1e49e89c-6a23-487a-86d9-a2244d725017\",\"3f5b5b18-1bf0-44c2-975c-ca140f0143f6\",\"15c06817-82c9-473b-8ffb-7e432f257397\",\"ec708de3-2b1d-4c7d-b513-7b31f10de089\",\"a8683a3f-e93a-485a-a902-ab739984681b\",\"db12b609-a0bf-4886-b5ae-65062b3d0645\",\"f4db23d7-d1df-4fc2-8f3d-633d375289e1\",\"6465d8ca-e0af-49a9-984e-5dbfe2e88a1c\",\"64c2079c-364b-45d6-b0c3-93132f5d794f\",\"41790812-13db-410f-9c30-2c0a417b2858\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"c61d50a7-f1a2-4a3f-b25d-1c068fe2787a\",\"860c941f-b0ac-4251-9e2d-78cab6e65c90\",\"f759702b-999f-4919-88ec-adc05d561035\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"82a811ab-7488-4239-8c70-cf553e8c8c5e\",\"72f62d5f-9a3a-4c4d-813c-96614b1c5845\",\"71ffbda6-7620-4eb7-8ca3-24c50238772d\",\"34af4cdd-aecf-4125-8be2-d1e456e30dfa\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"23-Customize Lock Screen Message","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.212000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/78ad3920-ae49-4f06-b220-781c5b1e53e5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/78ad3920-ae49-4f06-b220-781c5b1e53e5
deleted file mode 100644
index c2cc145..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/78ad3920-ae49-4f06-b220-781c5b1e53e5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"78ad3920-ae49-4f06-b220-781c5b1e53e5","details":"{\"type\":\"CompoundAction\",\"name\":\"15-13-Disallow modify accounts\",\"actionId\":\"78ad3920-ae49-4f06-b220-781c5b1e53e5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"Home Button\",\"actionId\":\"281899f8-3008-44c7-b6e9-b8fb60712c3a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":3,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Play Store\",\"actionId\":\"845603b9-ccb3-4c8b-9972-89b7d1be8f95\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Play Store\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"281899f8-3008-44c7-b6e9-b8fb60712c3a\",\"845603b9-ccb3-4c8b-9972-89b7d1be8f95\",\"23c5fa74-3416-4a41-84a9-3f348940a081\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"0c73b50f-d48d-4082-a091-3d4f55f77369\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_Gmail_account=playinstallapk02@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\"}}","name":"15-13-Disallow modify accounts","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.136000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/78f39e06-715e-4c47-a787-b2802a1a12ab b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/78f39e06-715e-4c47-a787-b2802a1a12ab
deleted file mode 100644
index c21b931..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/78f39e06-715e-4c47-a787-b2802a1a12ab
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"78f39e06-715e-4c47-a787-b2802a1a12ab","details":"{\"type\":\"CompoundAction\",\"name\":\"15-08-Disallow config Wi-Fi\",\"actionId\":\"78f39e06-715e-4c47-a787-b2802a1a12ab\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config Wi-Fi\",\"actionId\":\"14b664ed-3d40-4332-baa4-a5789e5c3181\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config Wi-Fi\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"fcd7cbb6-c015-4dc1-af80-618991447fec\",\"displayText\":\"Disallow config Wi-Fi\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config Wi-Fi\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":388.3333333333333,\"x2\":360.0,\"y2\":432.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":84.0,\"y\":411.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":96.0,\"y\":-0.6666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"fcd7cbb6-c015-4dc1-af80-618991447fec\",\"firstText\":\"Disallow config Wi-Fi\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config Wi-Fi\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":1.0,\"y1\":396.0,\"x2\":167.0,\"y2\":426.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config Wi-Fi\",\"actionId\":\"8b3f86e9-9814-4599-a1f2-ccf3b9a52df2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config Wi-Fi\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"76f1179f-271f-4f01-8196-8b0b86a3da70\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"14b664ed-3d40-4332-baa4-a5789e5c3181\",\"8b3f86e9-9814-4599-a1f2-ccf3b9a52df2\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"76f1179f-271f-4f01-8196-8b0b86a3da70\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-08-Disallow config Wi-Fi","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.134000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/79031c08-46b9-4830-80ad-500a4585c4d4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/79031c08-46b9-4830-80ad-500a4585c4d4
deleted file mode 100644
index ded27cb..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/79031c08-46b9-4830-80ad-500a4585c4d4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"79031c08-46b9-4830-80ad-500a4585c4d4","details":"{\"type\":\"CompoundAction\",\"name\":\"Disable CTS-V admin\",\"actionId\":\"79031c08-46b9-4830-80ad-500a4585c4d4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Check if CTS Verifier admin is enabled if yes, deactivate it.\",\"actionId\":\"aec185d7-8752-40e1-9829-9e82e1a4dde3\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nif d.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist():\\n d.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n d.resource_id(\\\"com.android.settings:id/action_button\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"aec185d7-8752-40e1-9829-9e82e1a4dde3\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Disable CTS-V admin","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.320000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7966cf53-7a34-44cc-9193-2c7dd347fe81 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7966cf53-7a34-44cc-9193-2c7dd347fe81
deleted file mode 100644
index 3055f17..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7966cf53-7a34-44cc-9193-2c7dd347fe81
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7966cf53-7a34-44cc-9193-2c7dd347fe81","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if set Password appear, set password to \\\"a14725836\\\"\",\"actionId\":\"7966cf53-7a34-44cc-9193-2c7dd347fe81\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if set Password screen appear, set password to \\\"a14725836\\\"\",\"actionId\":\"7c66d06e-6684-4b42-8583-fb667b97e524\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"For security, set password\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"172384b1-6bff-401d-a017-8dbe63201e3a\",\"displayText\":\"For security, set password\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/sud_layout_description\",\"text\":\"For security, set password\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":172.0,\"x2\":339.0,\"y2\":211.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":183.0,\"y\":187.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.0,\"y\":4.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":4,\"leafNodeContext\":\"172384b1-6bff-401d-a017-8dbe63201e3a\",\"firstText\":\"For security, set password\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"For security, set password\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":90.0,\"y1\":167.0,\"x2\":276.0,\"y2\":207.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"361c482d-402d-4941-9105-977e55985a8e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm\",\"actionId\":\"1f6942b7-ec8a-4706-883b-f875ab8b025a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"7c66d06e-6684-4b42-8583-fb667b97e524\",\"3935709f-effe-474a-96d0-07dd056d34f9\",\"361c482d-402d-4941-9105-977e55985a8e\",\"3935709f-effe-474a-96d0-07dd056d34f9\",\"1f6942b7-ec8a-4706-883b-f875ab8b025a\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if set Password appear, set password to \"a14725836\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.264000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/796b7e21-e7e7-4631-8bc3-72894b072e96 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/796b7e21-e7e7-4631-8bc3-72894b072e96
deleted file mode 100644
index b6c9842..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/796b7e21-e7e7-4631-8bc3-72894b072e96
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"796b7e21-e7e7-4631-8bc3-72894b072e96","details":"{\"type\":\"CompoundAction\",\"name\":\"Random select 3 lock type\",\"actionId\":\"796b7e21-e7e7-4631-8bc3-72894b072e96\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Random select 3 lock type\",\"actionId\":\"f7d5df18-6a82-4de4-b762-ff41f5077273\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nimport random\\n \\nd= Device.create_device_by_slot(0)\\n \\nresult1 = random.randint(1, 3)\\n \\nif result1 == 1:\\n d.text(\\\"Pattern\\\").click()\\nelif result1 == 2:\\n d.text(\\\"PIN\\\").click()\\nelse:\\n d.text(\\\"Password\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"f7d5df18-6a82-4de4-b762-ff41f5077273\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Random select 3 lock type","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.252000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7afb9f81-dffa-45af-ad3e-2a3a5b7b4bc8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7afb9f81-dffa-45af-ad3e-2a3a5b7b4bc8
deleted file mode 100644
index dbb3109..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7afb9f81-dffa-45af-ad3e-2a3a5b7b4bc8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7afb9f81-dffa-45af-ad3e-2a3a5b7b4bc8","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Alarms and Timers Tests-Show Alarms Test\",\"actionId\":\"7afb9f81-dffa-45af-ad3e-2a3a5b7b4bc8\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Show Alarms Test\",\"actionId\":\"d3daa439-6098-4534-8a67-7bf7d36ca206\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Show Alarms Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Show Alarms\",\"actionId\":\"1bf3a776-3576-40dc-ba23-26fa8ab2e703\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Show Alarms\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - in Alarm page\",\"actionId\":\"575ffcb1-9e66-4133-957d-789af17da7ed\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/action_bar_title\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Alarm\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - list of alarms\",\"actionId\":\"b437557d-cc23-4eb6-90af-052668041f04\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"Check it displays a UI for the list of alarms\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/alarm_recycler_view\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - list is not empty\",\"actionId\":\"595ab352-f3b3-4ed4-82e7-e5097ac6299c\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/alarm_empty_view\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"abf1609b-3323-4219-8f67-d868f39233b9\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"3832f622-3408-4968-9429-c0c9e11905d5\",\"d3daa439-6098-4534-8a67-7bf7d36ca206\",\"1bf3a776-3576-40dc-ba23-26fa8ab2e703\",\"575ffcb1-9e66-4133-957d-789af17da7ed\",\"b437557d-cc23-4eb6-90af-052668041f04\",\"595ab352-f3b3-4ed4-82e7-e5097ac6299c\",\"abf1609b-3323-4219-8f67-d868f39233b9\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Alarms and Timers Tests-Show Alarms Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.034000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7b8a5983-efee-45ea-aaa2-9aaf6d82e063 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7b8a5983-efee-45ea-aaa2-9aaf6d82e063
deleted file mode 100644
index 5ba1f3d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7b8a5983-efee-45ea-aaa2-9aaf6d82e063
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7b8a5983-efee-45ea-aaa2-9aaf6d82e063","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Accounts\",\"actionId\":\"7b8a5983-efee-45ea-aaa2-9aaf6d82e063\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Accounts\",\"actionId\":\"f220f3c6-b784-437d-acd3-4b93c13c9c79\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Accounts\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"49a379f1-b3c7-43d1-85a3-f5f9939954e2\",\"displayText\":\"Accounts\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b07bcadf-d959-4b7b-9590-0d8cbd494c11\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b42a4ae4-ddbc-4d3f-b8ec-1f02d025bbdf\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":641.3333333333334,\"x2\":47.666666666666664,\"y2\":674.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":637.6666666666666,\"x2\":66.0,\"y2\":678.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"\"},{\"uuid\":\"c0ad168a-af2a-4b8e-9004-6853fe318c63\",\"displayText\":\"Accounts\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f35f447a-f240-4c7a-84c6-0fbabfddb890\",\"displayText\":\"Accounts\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Accounts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":639.3333333333334,\"x2\":129.0,\"y2\":659.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.0,\"y\":1.1666666666667425,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"Accounts\"},{\"uuid\":\"1d0957ad-697b-433b-b5e8-fd6b64bfc9ce\",\"displayText\":\"No accounts added\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"No accounts added\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":659.0,\"x2\":178.66666666666666,\"y2\":676.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"No accounts added\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":624.6666666666666,\"x2\":345.3333333333333,\"y2\":691.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"Accounts\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":624.6666666666666,\"x2\":360.0,\"y2\":691.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":96.5,\"y\":648.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":83.5,\"y\":10.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"f35f447a-f240-4c7a-84c6-0fbabfddb890\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Accounts\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":132.0,\"y1\":657.0,\"x2\":61.0,\"y2\":639.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Accounts\",\"actionId\":\"cf50a078-177d-4d34-8d31-8c54766389f6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Accounts\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"f220f3c6-b784-437d-acd3-4b93c13c9c79\",\"cf50a078-177d-4d34-8d31-8c54766389f6\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Accounts","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.297000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ba82511-7b81-415f-81d7-ce2a5c969a50 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ba82511-7b81-415f-81d7-ce2a5c969a50
deleted file mode 100644
index 411695f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ba82511-7b81-415f-81d7-ce2a5c969a50
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7ba82511-7b81-415f-81d7-ce2a5c969a50","details":"{\"type\":\"CompoundAction\",\"name\":\"10 & 17-03-Disable status bar test\",\"actionId\":\"7ba82511-7b81-415f-81d7-ce2a5c969a50\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disable status bar\",\"actionId\":\"ef2a6727-9ec0-4614-be22-9eb1c77e7be7\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disable status bar\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"319506e2-39ca-44ff-8c00-87f4cc8e99fb\",\"displayText\":\"Disable status bar\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disable status bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":406.3333333333333,\"x2\":350.6666666666667,\"y2\":450.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":427.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"319506e2-39ca-44ff-8c00-87f4cc8e99fb\",\"firstText\":\"Disable status bar\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disable status bar\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":413.0,\"x2\":167.0,\"y2\":441.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disable status bar\",\"actionId\":\"76b883ca-0d0a-415a-9c71-4de1d46d461a\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disable status bar\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Disable status bar button\",\"actionId\":\"d55513ba-0e91-4d34-94ff-916a3e5b6bf9\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"class\",\"operator\":\"=\",\"value\":\"android.widget.Button\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Disable status bar\"}]},\"clickAfterValidation\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify Quick setting is no longer available\",\"actionId\":\"6a4b5022-bb3e-4d2d-beb4-7397b51bf994\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.systemui:id/settings_button\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ea7acd9b-b0cc-4a20-92c8-fdf7d47b298e\",\"displayText\":\"Open settings.\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"7a205745-3b90-4eb4-8b8c-83c62fde57b5\",\"displayText\":\"Open settings.\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/settings_button\",\"contentDesc\":\"Open settings.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":312.3333333333333,\"y1\":406.0,\"x2\":356.3333333333333,\"y2\":450.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":5.333333333333314,\"y\":6.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Open settings.\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/settings_button_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":312.3333333333333,\"y1\":406.0,\"x2\":356.3333333333333,\"y2\":450.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":329.0,\"y\":421.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":5.333333333333314,\"y\":6.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"7a205745-3b90-4eb4-8b8c-83c62fde57b5\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.systemui:id/settings_button\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":310.0,\"y1\":407.0,\"x2\":348.0,\"y2\":436.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify Notifications is no longer available\",\"actionId\":\"d5aa0e67-d10f-4080-a622-e8a70e7ba226\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Notifications\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"835b6284-67b2-4898-9bb9-bfce58103921\",\"displayText\":\"Notifications\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7a332baf-a7ce-4995-b88f-02cc7f1b8303\",\"displayText\":\"Notifications\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"72ed9c65-6e70-457a-b144-3f36f0139543\",\"displayText\":\"Notifications\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3f87299d-b453-488a-a375-f1fa8fe64966\",\"displayText\":\"Notifications\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/header_label\",\"text\":\"Notifications\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":7.333333333333333,\"y1\":159.0,\"x2\":107.0,\"y2\":203.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-7.833333333333336,\"y\":3.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Notifications\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":7.333333333333333,\"y1\":159.0,\"x2\":352.6666666666667,\"y2\":203.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Notifications\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":7.333333333333333,\"y1\":159.0,\"x2\":352.6666666666667,\"y2\":203.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Notifications\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":159.0,\"x2\":356.3333333333333,\"y2\":203.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":65.0,\"y\":177.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":115.0,\"y\":3.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"3f87299d-b453-488a-a375-f1fa8fe64966\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Notifications\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":164.0,\"x2\":121.0,\"y2\":191.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Reenable status bar\",\"actionId\":\"d4338cde-7e30-4920-adf6-4103c56ba487\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Reenable status bar\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify Quick setting bar is available\",\"actionId\":\"2cf70b6e-6c91-4b18-8538-d3848d96799b\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.systemui:id/settings_button\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3b6eed8c-25b1-4357-a220-73dd56ee5253\",\"displayText\":\"Open settings.\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"0afa4262-db4c-402e-ac23-1ed3c7fdf8a2\",\"displayText\":\"Open settings.\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/settings_button\",\"contentDesc\":\"Open settings.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":312.3333333333333,\"y1\":406.0,\"x2\":356.3333333333333,\"y2\":450.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.3333333333333144,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Open settings.\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/settings_button_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":312.3333333333333,\"y1\":406.0,\"x2\":356.3333333333333,\"y2\":450.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":333.0,\"y\":426.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":1.3333333333333144,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"0afa4262-db4c-402e-ac23-1ed3c7fdf8a2\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.systemui:id/settings_button\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":319.0,\"y1\":413.0,\"x2\":347.0,\"y2\":440.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify Notifications is available\",\"actionId\":\"286e62b5-37e4-4b63-a18d-cf54f1cfe38a\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Notifications\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4768ab1a-4ee6-4b46-9538-80222a1d7173\",\"isUniqueResourceId\":false,\"children\":[],\"checked\":false,\"isCheckableNode\":false,\"isClickableNode\":false,\"enabled\":false,\"bounds\":{\"x1\":60.5,\"y1\":172.5,\"x2\":60.5,\"y2\":172.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":60.5,\"y\":172.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":60.5,\"y\":172.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":true,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Notifications\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":13.0,\"y1\":160.0,\"x2\":108.0,\"y2\":185.0}}],\"childrenIdList\":[\"ef2a6727-9ec0-4614-be22-9eb1c77e7be7\",\"76b883ca-0d0a-415a-9c71-4de1d46d461a\",\"d55513ba-0e91-4d34-94ff-916a3e5b6bf9\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"6a4b5022-bb3e-4d2d-beb4-7397b51bf994\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"d5aa0e67-d10f-4080-a622-e8a70e7ba226\",\"d4338cde-7e30-4920-adf6-4103c56ba487\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"2cf70b6e-6c91-4b18-8538-d3848d96799b\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"286e62b5-37e4-4b63-a18d-cf54f1cfe38a\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"10 & 17-03-Disable status bar test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.104000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7be12173-7685-4bcd-bb2e-acdfbbe394a1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7be12173-7685-4bcd-bb2e-acdfbbe394a1
deleted file mode 100644
index ef394a4..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7be12173-7685-4bcd-bb2e-acdfbbe394a1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7be12173-7685-4bcd-bb2e-acdfbbe394a1","details":"{\"type\":\"CompoundAction\",\"name\":\"Draw pattern lock\",\"actionId\":\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Draw pattern\",\"actionId\":\"cea236fe-8a70-4afa-98ab-128da008be3c\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nimport re\\nd= Device.create_device_by_slot(0)\\n \\nif d.resource_id(\\\"com.android.settings:id/lockPattern\\\").verify_exist():\\n text = dict(d.resource_id(\\\"com.android.settings:id/lockPattern\\\").get_attributes())['bounds']\\nelif d.resource_id(\\\"com.android.systemui:id/lockPatternView\\\").verify_exist():\\n text = dict(d.resource_id(\\\"com.android.systemui:id/lockPatternView\\\").get_attributes())['bounds']\\nelif d.resource_id(\\\"com.android.systemui:id/lockPattern\\\").verify_exist():\\n text = dict(d.resource_id(\\\"com.android.systemui:id/lockPattern\\\").get_attributes())['bounds']\\n\\nx1 = int(re.findall(r'\\\\d+', text)[0])\\ny1 = int(re.findall(r'\\\\d+', text)[1])\\nx2 = int(re.findall(r'\\\\d+', text)[2])\\ny2 = int(re.findall(r'\\\\d+', text)[3])\\n\\nclass point1():\\n x = int(x2-((x2-x1)/6)*5)\\n y = int(y2-((y2-y1)/6)*5)\\n\\nclass point2():\\n x = int(x2-(x2-x1)/2)\\n y = int(y2-((y2-y1)/6)*5)\\n\\nclass point5():\\n x = int(x2-(x2-x1)/2)\\n y = int(y2-(y2-y1)/2)\\n\\nclass point8():\\n x = int(x2-(x2-x1)/2)\\n y = int(y2-(y2-y1)/6)\\n\\nselectors = [point1, point2, point5, point8]\\nd.drag(selectors)\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"cea236fe-8a70-4afa-98ab-128da008be3c\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Draw pattern lock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.036000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ccaea57-2cd8-466d-b5fa-abbfb89831b3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ccaea57-2cd8-466d-b5fa-abbfb89831b3
deleted file mode 100644
index 0175d97..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ccaea57-2cd8-466d-b5fa-abbfb89831b3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7ccaea57-2cd8-466d-b5fa-abbfb89831b3","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Start Test button\",\"actionId\":\"7ccaea57-2cd8-466d-b5fa-abbfb89831b3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/start_test_button\",\"actionId\":\"fc5f502c-e486-40c0-8aef-1ec2700203de\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/start_test_button\"}],\"childrenIdList\":[\"fc5f502c-e486-40c0-8aef-1ec2700203de\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Start Test button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.054000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7db88cc2-8f43-4668-a7bc-0afb68e49de3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7db88cc2-8f43-4668-a7bc-0afb68e49de3
deleted file mode 100644
index 3fb19b5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7db88cc2-8f43-4668-a7bc-0afb68e49de3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7db88cc2-8f43-4668-a7bc-0afb68e49de3","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if there is a notification in the notification shade\",\"actionId\":\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify there is a notification \\\"BubbleChat\\\" in Notification\",\"actionId\":\"b1986880-bda8-45c6-a5d0-7a9e1783f65d\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"BubbleChat\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"56d34bac-339b-4c9d-a99c-718a2b001049\",\"displayText\":\"BubbleChat\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"604d353e-7c56-40bd-ac95-822e3e814bcb\",\"displayText\":\"BubbleChat\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/conversation_text\",\"text\":\"BubbleChat\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":208.25,\"x2\":150.5,\"y2\":227.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":6.0,\"y\":3.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"BubbleChat\"},{\"uuid\":\"2210049d-7b6e-4c39-8c75-81508e5b0577\",\"displayText\":\"•\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_divider\",\"text\":\"•\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":157.5,\"y1\":210.0,\"x2\":161.0,\"y2\":225.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"•\"},{\"uuid\":\"68f36702-d0ba-4a54-b3bf-f95048b70895\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":168.0,\"y1\":210.0,\"x2\":222.5,\"y2\":225.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/conversation_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":194.25,\"x2\":261.0,\"y2\":227.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":106.0,\"y\":214.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":61.25,\"y\":-3.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"604d353e-7c56-40bd-ac95-822e3e814bcb\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"BubbleChat\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":69.0,\"y1\":202.0,\"x2\":143.0,\"y2\":227.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the Bubble Notification text\",\"actionId\":\"2ba55ae7-c0e8-404b-8b15-cd789d560977\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Is it me you're looking for?\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"bc533081-bf1c-4ebd-9439-4466f5bc0034\",\"displayText\":\"Is it me you're looking for?\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"5b1b6197-68d9-4be5-8123-e76a0be2f27c\",\"displayText\":\"Hello?\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/message_text\",\"text\":\"Hello?\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":246.0,\"x2\":107.5,\"y2\":262.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Hello?\"},{\"uuid\":\"d091df20-ec96-4e19-b605-db397de6149f\",\"displayText\":\"Is it me you're looking for?\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/message_text\",\"text\":\"Is it me you're looking for?\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":264.25,\"x2\":216.0,\"y2\":280.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.75,\"y\":-0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Is it me you're looking for?\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/group_message_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.5,\"y1\":246.0,\"x2\":216.0,\"y2\":280.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":145.5,\"y\":273.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.75,\"y\":-9.625,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d091df20-ec96-4e19-b605-db397de6149f\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Is it me you're looking for?\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":62.0,\"y1\":268.0,\"x2\":229.0,\"y2\":278.0}}],\"childrenIdList\":[\"15c75efc-b173-4eed-9a2c-164886355c98\",\"b1986880-bda8-45c6-a5d0-7a9e1783f65d\",\"2ba55ae7-c0e8-404b-8b15-cd789d560977\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if there is a notification in the notification shade","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.225000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7dddd0ac-0493-4e91-871a-e36348978323 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7dddd0ac-0493-4e91-871a-e36348978323
deleted file mode 100644
index e16bb19..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7dddd0ac-0493-4e91-871a-e36348978323
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7dddd0ac-0493-4e91-871a-e36348978323","details":"{\"type\":\"CompoundAction\",\"name\":\"test_BYOD Provisioning tests\",\"actionId\":\"7dddd0ac-0493-4e91-871a-e36348978323\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[],\"childrenIdList\":[\"a66b98b1-5ae4-4e60-9f51-1afb7c1c4f7e\",\"7265db9b-8461-4c01-8b11-809b8e346327\",\"e097807f-e110-411e-9f04-02442fad05d2\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_BYOD Provisioning tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.326000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7e951186-50c3-400e-a5c6-e931dd32a30b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7e951186-50c3-400e-a5c6-e931dd32a30b
deleted file mode 100644
index c620782..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7e951186-50c3-400e-a5c6-e931dd32a30b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7e951186-50c3-400e-a5c6-e931dd32a30b","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Go button\",\"actionId\":\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Go\",\"actionId\":\"cc915576-1b50-4fd7-ad78-fdaec3cd1fae\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Go\"}],\"childrenIdList\":[\"cc915576-1b50-4fd7-ad78-fdaec3cd1fae\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Go button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.084000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ebfac21-0046-438c-af8c-f21ea88f0357 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ebfac21-0046-438c-af8c-f21ea88f0357
deleted file mode 100644
index 9ac61a2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7ebfac21-0046-438c-af8c-f21ea88f0357
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7ebfac21-0046-438c-af8c-f21ea88f0357","details":"{\"type\":\"CompoundAction\",\"name\":\"15-01-Disallow add user\",\"actionId\":\"7ebfac21-0046-438c-af8c-f21ea88f0357\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow add user\",\"actionId\":\"f502a6af-bcc5-450b-8fec-e04a6c45c20c\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow add user\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0b311c31-4a3f-4c4b-b60b-e421a18fa126\",\"displayText\":\"Disallow add user\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow add user\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":73.33333333333333,\"x2\":360.0,\"y2\":117.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":62.5,\"y\":97.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":117.5,\"y\":-1.6666666666666714,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"0b311c31-4a3f-4c4b-b60b-e421a18fa126\",\"firstText\":\"Disallow add user\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow add user\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":80.0,\"x2\":122.0,\"y2\":114.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow add user\",\"actionId\":\"b19f38db-4368-4067-aafd-f408e550eb22\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow add user\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Add user\",\"actionId\":\"f66070ff-56e6-4190-bd8c-d15261cac418\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Add user\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"f502a6af-bcc5-450b-8fec-e04a6c45c20c\",\"b19f38db-4368-4067-aafd-f408e550eb22\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"12e01265-ef71-4a9b-92fa-96edbbf0df2a\",\"64db6b9d-caaa-442f-840a-80ef16030e55\",\"f66070ff-56e6-4190-bd8c-d15261cac418\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-01-Disallow add user","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.118000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7eec7b1d-4c98-48f8-ab8b-8c82006cfef4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7eec7b1d-4c98-48f8-ab8b-8c82006cfef4
deleted file mode 100644
index facf14c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7eec7b1d-4c98-48f8-ab8b-8c82006cfef4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7eec7b1d-4c98-48f8-ab8b-8c82006cfef4","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Decline button\",\"actionId\":\"7eec7b1d-4c98-48f8-ab8b-8c82006cfef4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Decline button\",\"actionId\":\"9ce34602-923c-4ba7-a5ff-8f85730bd4ec\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button2\"}],\"childrenIdList\":[\"9ce34602-923c-4ba7-a5ff-8f85730bd4ec\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Decline button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.071000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7f12c16f-51be-4732-bf1b-ef4b55841a99 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7f12c16f-51be-4732-bf1b-ef4b55841a99
deleted file mode 100644
index 38e00f0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/7f12c16f-51be-4732-bf1b-ef4b55841a99
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"7f12c16f-51be-4732-bf1b-ef4b55841a99","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch No Device Owner Tests\",\"actionId\":\"7f12c16f-51be-4732-bf1b-ef4b55841a99\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to No Device Owner Tests\",\"actionId\":\"be49e449-ac71-4b06-9782-c81a01175ee1\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"No Device Owner Tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"57461260-7fd4-4825-9d32-d496e8c9b0a5\",\"displayText\":\"No Device Owner Tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"No Device Owner Tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":418.0,\"x2\":351.3333333333333,\"y2\":460.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":431.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":7.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"57461260-7fd4-4825-9d32-d496e8c9b0a5\",\"firstText\":\"No Device Owner Tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"No Device Owner Tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":416.0,\"x2\":171.0,\"y2\":447.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, No Device Owner Tests\",\"actionId\":\"bab10e64-9b67-4a8d-b0d8-04ff7080e215\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"No Device Owner Tests\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"be49e449-ac71-4b06-9782-c81a01175ee1\",\"bab10e64-9b67-4a8d-b0d8-04ff7080e215\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch No Device Owner Tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.216000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8003eafa-d92b-4571-ba71-a68648526e4f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8003eafa-d92b-4571-ba71-a68648526e4f
deleted file mode 100644
index dddd9d0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8003eafa-d92b-4571-ba71-a68648526e4f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8003eafa-d92b-4571-ba71-a68648526e4f","details":"{\"type\":\"CompoundAction\",\"name\":\"Check the restriction message(Short message)\",\"actionId\":\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the short message\",\"actionId\":\"9c3e9961-9392-4502-9326-d26da3ac96ed\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"CONTAINS\",\"patternValue\":\"This action is disabled by your administrator\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"eb0f371d-b7e3-4a9e-adb1-69d418755192\",\"displayText\":\"This action is disabled by your administrator. Contact someone@example.com for support.\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"5eda0849-454a-46ae-a343-5cbe9b16a763\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"245babbd-b5b9-43b7-aba7-e6a81412f8c8\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e361938f-7e68-42c7-af97-0f727555ba87\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/admin_support_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":46.0,\"y1\":264.0,\"x2\":90.0,\"y2\":308.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"8b09b61a-bf6f-45a6-a67d-64e1d3e08566\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/admin_support_dialog_title\",\"text\":\"Action not allowed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":90.0,\"y1\":273.6666666666667,\"x2\":266.3333333333333,\"y2\":298.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":46.0,\"y1\":264.0,\"x2\":314.0,\"y2\":326.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"},{\"uuid\":\"e515f487-c5f6-498c-9af6-f18b5aef27e0\",\"displayText\":\"This action is disabled by your administrator. Contact someone@example.com for support.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6d3b9edc-6818-4080-a47f-86fbe594e87b\",\"displayText\":\"This action is disabled by your administrator. Contact someone@example.com for support.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7b779a7f-5519-4e7a-9d1b-6aaa02600959\",\"displayText\":\"This action is disabled by your administrator. Contact someone@example.com for support.\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/admin_support_msg\",\"text\":\"This action is disabled by your administrator. Contact someone@example.com for support.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":46.0,\"y1\":326.3333333333333,\"x2\":314.0,\"y2\":382.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":41.0,\"y\":7.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"This action is disabled by your administrator. Contact someone@example.com for support.\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":46.0,\"y1\":326.3333333333333,\"x2\":314.0,\"y2\":382.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"This action is disabled by your administrator. Contact someone@example.com for support.\"}],\"className\":\"android.widget.ScrollView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":46.0,\"y1\":326.3333333333333,\"x2\":314.0,\"y2\":382.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"This action is disabled by your administrator. Contact someone@example.com for support.\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":242.0,\"x2\":336.0,\"y2\":404.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.settings:id/custom\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":242.0,\"x2\":336.0,\"y2\":404.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":139.0,\"y\":347.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":41.0,\"y\":-23.66666666666663,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"7b779a7f-5519-4e7a-9d1b-6aaa02600959\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This action is disabled by your administrator\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":41.0,\"y1\":325.0,\"x2\":237.0,\"y2\":369.0}}],\"childrenIdList\":[\"9c3e9961-9392-4502-9326-d26da3ac96ed\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Check the restriction message(Short message)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.121000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8176eaad-a582-41ea-8d8e-9c8673e8ceb0 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8176eaad-a582-41ea-8d8e-9c8673e8ceb0
deleted file mode 100644
index df952b9..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8176eaad-a582-41ea-8d8e-9c8673e8ceb0
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8176eaad-a582-41ea-8d8e-9c8673e8ceb0","details":"{\"type\":\"CompoundAction\",\"name\":\"03-Keyguard disclosure\",\"actionId\":\"8176eaad-a582-41ea-8d8e-9c8673e8ceb0\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Keyguard disclosure\",\"actionId\":\"57a40634-3f0e-4d2e-a7ad-a445e9b78c6f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Keyguard disclosure\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"4f58978d-496b-4ac9-bab9-addaba663699\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"139b3453-f582-447b-972b-859865ac561b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"67cd8c5f-36a6-4c9b-8d2b-864002ac15ba\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"0e946f3c-2742-4939-9f44-ccb2168242d5\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"a48501b8-0cb4-4c0b-99e1-6bd0d8593cad\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"830f2320-036b-4e61-b60a-c35e153a1631\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"e9af0197-9a6a-4ccc-bc7f-0a1333e963e3\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"70207952-35ef-442f-926e-fedf2fe95120\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f0476871-0685-4ceb-93db-261bed0054d7\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b4c74ca8-b3cf-469f-b187-b907a123a0ad\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"982a50e6-6a31-4861-9833-b5de6aa59cfa\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"3538b846-9d0b-4b56-9326-5b277b345374\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f6ec14d0-793b-4ee5-88fd-940d29d4e2e2\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"08c4d4db-2b7e-49b3-9f96-6abc754111c2\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"5898060a-6ec6-46e2-8055-7703088777b7\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"004e336e-b08c-4e89-9841-6dcd32f7ef23\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ff5c607e-7cad-4a9d-b1ca-25cf761d0878\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"544ff00c-f3b1-4ba3-8434-9e733f9481f7\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"7f12c16f-51be-4732-bf1b-ef4b55841a99\",\"57a40634-3f0e-4d2e-a7ad-a445e9b78c6f\",\"608f1c50-237e-4f5d-94c6-0bbbcba87332\",\"1e49e89c-6a23-487a-86d9-a2244d725017\",\"4f58978d-496b-4ac9-bab9-addaba663699\",\"139b3453-f582-447b-972b-859865ac561b\",\"67cd8c5f-36a6-4c9b-8d2b-864002ac15ba\",\"0e946f3c-2742-4939-9f44-ccb2168242d5\",\"cae61682-7071-4c67-94c1-963ff2cbe978\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"608f1c50-237e-4f5d-94c6-0bbbcba87332\",\"cf6c2d6d-a4fe-4981-af4b-f561291f847b\",\"a48501b8-0cb4-4c0b-99e1-6bd0d8593cad\",\"830f2320-036b-4e61-b60a-c35e153a1631\",\"e9af0197-9a6a-4ccc-bc7f-0a1333e963e3\",\"70207952-35ef-442f-926e-fedf2fe95120\",\"cae61682-7071-4c67-94c1-963ff2cbe978\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"608f1c50-237e-4f5d-94c6-0bbbcba87332\",\"49bfb869-2ef5-4df6-8fff-3192112b82a2\",\"f0476871-0685-4ceb-93db-261bed0054d7\",\"b4c74ca8-b3cf-469f-b187-b907a123a0ad\",\"982a50e6-6a31-4861-9833-b5de6aa59cfa\",\"3538b846-9d0b-4b56-9326-5b277b345374\",\"cae61682-7071-4c67-94c1-963ff2cbe978\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"608f1c50-237e-4f5d-94c6-0bbbcba87332\",\"e1d66f34-6024-4d89-b511-399897ba2464\",\"f6ec14d0-793b-4ee5-88fd-940d29d4e2e2\",\"08c4d4db-2b7e-49b3-9f96-6abc754111c2\",\"5898060a-6ec6-46e2-8055-7703088777b7\",\"004e336e-b08c-4e89-9841-6dcd32f7ef23\",\"cae61682-7071-4c67-94c1-963ff2cbe978\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"72f62d5f-9a3a-4c4d-813c-96614b1c5845\",\"ff5c607e-7cad-4a9d-b1ca-25cf761d0878\",\"544ff00c-f3b1-4ba3-8434-9e733f9481f7\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"03-Keyguard disclosure","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.219000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82177f1b-37f0-4bec-95c6-02f1c0871c28 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82177f1b-37f0-4bec-95c6-02f1c0871c28
deleted file mode 100644
index f8b7444..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82177f1b-37f0-4bec-95c6-02f1c0871c28
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"82177f1b-37f0-4bec-95c6-02f1c0871c28","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Reset\\\" button\",\"actionId\":\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Reset\",\"actionId\":\"7d9d3c9a-bc1d-4d6a-af10-0c1725095410\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Reset\"}],\"childrenIdList\":[\"7d9d3c9a-bc1d-4d6a-af10-0c1725095410\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Reset\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.175000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82a744f4-d253-4c94-aa27-c798b739cfbc b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82a744f4-d253-4c94-aa27-c798b739cfbc
deleted file mode 100644
index 9d8f483..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82a744f4-d253-4c94-aa27-c798b739cfbc
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"82a744f4-d253-4c94-aa27-c798b739cfbc","details":"{\"type\":\"CompoundAction\",\"name\":\"test_View/Delete Instant Apps Test\",\"actionId\":\"82a744f4-d253-4c94-aa27-c798b739cfbc\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to View/Delete Instant Apps Test\",\"actionId\":\"ed8df76c-77b7-43c9-857a-43af01334b0f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"View/Delete Instant Apps Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"291226ab-a767-4dc5-a0af-19d3a57d4490\",\"displayText\":\"View/Delete Instant Apps Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"View/Delete Instant Apps Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":641.5,\"x2\":351.25,\"y2\":683.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":110.5,\"y\":662.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":69.5,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"291226ab-a767-4dc5-a0af-19d3a57d4490\",\"firstText\":\"View/Delete Instant Apps Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"View/Delete Instant Apps Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":646.0,\"x2\":214.0,\"y2\":679.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, View/Delete Instant Apps Test\",\"actionId\":\"386d0932-749d-430a-9983-f3159d3c7cb2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"View/Delete Instant Apps Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, see all button\",\"actionId\":\"2689b5ae-ede4-4457-9308-2ad2a72ff7b5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"See all\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, All apps field\",\"actionId\":\"96853c9e-24e5-499c-a7dd-f0e76946cae2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/text1\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Instant apps\",\"actionId\":\"11361ff9-57bb-4c2c-8e8d-f86b5d3c2945\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Instant apps\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,select Sample Instant App for Testing\",\"actionId\":\"b8a7b271-d993-40cf-8094-b0085192dee4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Sample Instant App for Testing\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Clear app exists\",\"actionId\":\"3b74fb4f-a28f-478a-8a0d-b09e166b6b37\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Clear app\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4111978c-2758-493b-b79c-8f19ce5c887b\",\"displayText\":\"Clear app\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"65357d22-8db0-4077-b114-a241878edcf8\",\"displayText\":\"Open\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6a9b31a3-1bef-437d-8526-1baffbae15c0\",\"displayText\":\"Open\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/launch\",\"text\":\"Open\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":7.0,\"y1\":199.0,\"x2\":166.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Open\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":7.0,\"y1\":199.0,\"x2\":173.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Open\"},{\"uuid\":\"dc55c337-01b9-4fda-b3c4-f535cee81558\",\"displayText\":\"Clear app\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/clear_data\",\"text\":\"Clear app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":180.0,\"y1\":199.0,\"x2\":346.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.5,\"y\":-17.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Clear app\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/instant_app_button_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":199.0,\"x2\":360.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":259.5,\"y\":254.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-79.5,\"y\":-17.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"dc55c337-01b9-4fda-b3c4-f535cee81558\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Clear app\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":217.0,\"y1\":243.0,\"x2\":302.0,\"y2\":266.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/clear_data\",\"actionId\":\"24d76560-5a8d-4ad3-8c54-e6974d1b0e7f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/clear_data\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, clear data button\",\"actionId\":\"866206c6-3390-49cc-82bd-a07703a21507\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"ed8df76c-77b7-43c9-857a-43af01334b0f\",\"386d0932-749d-430a-9983-f3159d3c7cb2\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"b53eeaf5-391f-4964-84fa-d086c2b938e1\",\"7ccaea57-2cd8-466d-b5fa-abbfb89831b3\",\"b9b98f7c-9a8d-4282-bd0f-1b4b81eac080\",\"2689b5ae-ede4-4457-9308-2ad2a72ff7b5\",\"96853c9e-24e5-499c-a7dd-f0e76946cae2\",\"11361ff9-57bb-4c2c-8e8d-f86b5d3c2945\",\"f89554c3-fe5e-4a96-aa56-261a920a689a\",\"b8a7b271-d993-40cf-8094-b0085192dee4\",\"3b74fb4f-a28f-478a-8a0d-b09e166b6b37\",\"24d76560-5a8d-4ad3-8c54-e6974d1b0e7f\",\"866206c6-3390-49cc-82bd-a07703a21507\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_instant_app_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsVerifierInstantApp.apk\"}}","name":"test_View/Delete Instant Apps Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.065000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82f3ce72-96fe-4814-8b68-119a165c3cbf b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82f3ce72-96fe-4814-8b68-119a165c3cbf
deleted file mode 100644
index 04d17c5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/82f3ce72-96fe-4814-8b68-119a165c3cbf
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"82f3ce72-96fe-4814-8b68-119a165c3cbf","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Device Owner Tests(Check image)\",\"actionId\":\"82f3ce72-96fe-4814-8b68-119a165c3cbf\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"b36ee844-6807-46a4-9073-3d5c83f730fd\",\"ba60c19c-dd7d-4503-86dc-57ae83dfa386\",\"33e57fb2-284d-43aa-9763-d9c0cd8d1d95\",\"841de16d-b420-4274-8775-20fff2d30def\",\"128d040e-8d30-4812-9cbb-b29efa47855e\",\"ec764a5f-6c81-496a-820b-00869272b2f4\",\"06e13f84-c348-470c-a237-ded70dacf408\",\"dbec061f-568e-4ffa-9d71-4a5494853625\",\"87a99bc2-662c-408a-891a-ebb93954ea8f\",\"2c04124a-9437-4127-9146-c1830d875dcb\",\"e0c4500d-daea-44e2-b105-6efa0f087cb1\",\"d1a32271-9bb8-464b-89ee-8eb121c9d8dd\",\"a418766b-dd6a-4c90-b127-e104546068c5\",\"35a90a2e-6709-4b9d-ad3f-07f3af03e889\",\"4f868606-0d5b-44a3-9c85-f9cb48c66dbb\",\"d3d29d0d-af3f-4124-bd80-755d201bbec0\",\"360c99e8-b022-42ab-b1c0-a27575885f2d\",\"3a510978-df33-499d-baab-b236c9960bd8\",\"048dadc7-e9b8-4451-b111-a128df8d095b\",\"c33097db-480e-433c-af22-ed22357d7c76\",\"77cd84d9-261a-488e-8fdb-5e3c36852267\",\"2208a8b1-a26d-407b-9780-6d30e4974e13\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_DeviceOwner_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsEmptyDeviceOwner.apk,\\n$uicd_permissionapp_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsPermissionApp.apk,\\n$uicd_NotificationBot_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/NotificationBot.apk,\\n$uicd_device_owner_WiFi_configuration_SSID_default=chtn,\\n$uicd_device_owner_WiFi_configuration_SSID=wifitest,\\n$uicd_Gmail_account=playinstallapk02@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\"}}","name":"test_Device Owner Tests(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.079000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8373f761-9983-4688-b193-59c4bc7a9bd3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8373f761-9983-4688-b193-59c4bc7a9bd3
deleted file mode 100644
index af92658..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8373f761-9983-4688-b193-59c4bc7a9bd3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8373f761-9983-4688-b193-59c4bc7a9bd3","details":"{\"type\":\"CompoundAction\",\"name\":\"Enter PIN number \\\"1688\\\"\",\"actionId\":\"8373f761-9983-4688-b193-59c4bc7a9bd3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"INPUT PIN number \\\"1688\\\"\",\"actionId\":\"297a3ab0-6653-42ab-800d-0d5edf01b66f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"1688\",\"isSingleChar\":false}],\"childrenIdList\":[\"297a3ab0-6653-42ab-800d-0d5edf01b66f\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Enter PIN number \"1688\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.267000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/838a9611-4bf1-4317-8599-98f7e872efdb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/838a9611-4bf1-4317-8599-98f7e872efdb
deleted file mode 100644
index a9b3d5e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/838a9611-4bf1-4317-8599-98f7e872efdb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"838a9611-4bf1-4317-8599-98f7e872efdb","details":"{\"type\":\"CompoundAction\",\"name\":\"Check if \\\"ring\\\", \\\"vibration\\\" setting is hidden\",\"actionId\":\"838a9611-4bf1-4317-8599-98f7e872efdb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Check if \\\"ring\\\", \\\"vibration\\\" setting is hidden\",\"actionId\":\"05fa84b2-b2b9-4380-bfba-9e946095e298\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"vibration\"},{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"ring\"},{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Notifications\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"68095495-91a4-402d-a763-6e7ff7427531\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Check if \"ring\", \"vibration\" setting is hidden","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.280000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/841de16d-b420-4274-8775-20fff2d30def b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/841de16d-b420-4274-8775-20fff2d30def
deleted file mode 100644
index fe6dae5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/841de16d-b420-4274-8775-20fff2d30def
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"841de16d-b420-4274-8775-20fff2d30def","details":"{\"type\":\"CompoundAction\",\"name\":\"04-Disallow configuring WiFi\",\"actionId\":\"841de16d-b420-4274-8775-20fff2d30def\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow configuring WiFi\",\"actionId\":\"870897e2-13ad-4ed9-80e4-80111605346e\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow configuring WiFi\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"50eb09f4-d8fc-40a3-a1d7-2e7e16c3ee03\",\"displayText\":\"Disallow configuring WiFi\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow configuring WiFi\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":467.75,\"x2\":351.25,\"y2\":509.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":100.5,\"y\":488.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":79.5,\"y\":0.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"50eb09f4-d8fc-40a3-a1d7-2e7e16c3ee03\",\"firstText\":\"Disallow configuring WiFi\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow configuring WiFi\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":475.0,\"x2\":196.0,\"y2\":502.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow configuring WiFi\",\"actionId\":\"426a92bd-d2ae-484c-a184-44fc682d9ca4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow configuring WiFi\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"724b3a84-526c-4578-b738-b30e5023092d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"870897e2-13ad-4ed9-80e4-80111605346e\",\"426a92bd-d2ae-484c-a184-44fc682d9ca4\",\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"724b3a84-526c-4578-b738-b30e5023092d\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"04-Disallow configuring WiFi","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.090000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/852558c2-18ad-4540-bab9-6f2da206f8cb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/852558c2-18ad-4540-bab9-6f2da206f8cb
deleted file mode 100644
index 6f4af61..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/852558c2-18ad-4540-bab9-6f2da206f8cb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"852558c2-18ad-4540-bab9-6f2da206f8cb","details":"{\"type\":\"CompoundAction\",\"name\":\"Open location permission of CTS-V\",\"actionId\":\"852558c2-18ad-4540-bab9-6f2da206f8cb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/settings_button\",\"actionId\":\"e0dc2558-d47e-4f27-b73c-47f39d253566\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/settings_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, App access to location\",\"actionId\":\"b930dcb3-3e11-40e9-aea2-ea4099991b1a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"App access to location\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to CTS Verifier\",\"actionId\":\"def07695-585e-45a4-a8ac-23c8b08f8079\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CTS Verifier\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b852b67a-cb6a-4ac0-88c5-964b46865672\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"5dfef27c-c8b6-4c62-b7ac-b66e6e21573f\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e8830a46-0ed3-4bc4-917b-e934c2e89f02\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":582.6666666666666,\"x2\":44.0,\"y2\":612.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.permissioncontroller:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":579.0,\"x2\":66.0,\"y2\":615.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"\"},{\"uuid\":\"21680a95-ed64-42c6-84cc-d53b5084be1d\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"981347bf-c020-4313-b9a5-9be0f675038e\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"CTS Verifier\",\"contentDesc\":\"CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":587.6666666666666,\"x2\":145.0,\"y2\":607.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.5,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":573.0,\"x2\":345.3333333333333,\"y2\":622.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":573.0,\"x2\":360.0,\"y2\":622.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":110.0,\"y\":596.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":70.0,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"981347bf-c020-4313-b9a5-9be0f675038e\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CTS Verifier\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":62.0,\"y1\":584.0,\"x2\":158.0,\"y2\":609.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"aee8c031-1c59-4448-a0d1-4af6b3c3c359\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"}],\"childrenIdList\":[\"e0dc2558-d47e-4f27-b73c-47f39d253566\",\"b930dcb3-3e11-40e9-aea2-ea4099991b1a\",\"def07695-585e-45a4-a8ac-23c8b08f8079\",\"aee8c031-1c59-4448-a0d1-4af6b3c3c359\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open location permission of CTS-V","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.004000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8539b68d-cf4f-4158-aeb6-2867807e7574 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8539b68d-cf4f-4158-aeb6-2867807e7574
deleted file mode 100644
index bd30055..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8539b68d-cf4f-4158-aeb6-2867807e7574
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8539b68d-cf4f-4158-aeb6-2867807e7574","details":"{\"type\":\"CompoundAction\",\"name\":\"Confirm Password lock \\\"a14725836\\\"\",\"actionId\":\"8539b68d-cf4f-4158-aeb6-2867807e7574\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Re-enter your password screen appear\",\"actionId\":\"9c3dae13-f0b5-4f59-9fa7-87f94fe2bd18\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Re-enter your password\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0298937d-b8e2-434d-8543-326efaf67ea4\",\"displayText\":\"Re-enter your password\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"dcfcc7e7-f251-48b0-b9be-51d1b08f7339\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/sud_layout_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":166.0,\"y1\":97.33333333333333,\"x2\":194.0,\"y2\":125.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"54331f24-87ad-401e-b79a-fb958345fce9\",\"displayText\":\"Re-enter your password\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/suc_layout_title\",\"text\":\"Re-enter your password\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":139.33333333333334,\"x2\":339.0,\"y2\":167.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.5,\"y\":3.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Re-enter your password\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/sud_layout_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":48.333333333333336,\"x2\":360.0,\"y2\":169.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":176.5,\"y\":150.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":3.5,\"y\":-41.66666666666666,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"54331f24-87ad-401e-b79a-fb958345fce9\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Re-enter your password\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":55.0,\"y1\":130.0,\"x2\":298.0,\"y2\":171.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Enter key\",\"actionId\":\"f09a15f3-7bf2-4047-96f6-d08cb70105bc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.inputmethod.latin:id/key_pos_ime_action\"}],\"childrenIdList\":[\"9c3dae13-f0b5-4f59-9fa7-87f94fe2bd18\",\"3935709f-effe-474a-96d0-07dd056d34f9\",\"f09a15f3-7bf2-4047-96f6-d08cb70105bc\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Confirm Password lock \"a14725836\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.266000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/860c941f-b0ac-4251-9e2d-78cab6e65c90 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/860c941f-b0ac-4251-9e2d-78cab6e65c90
deleted file mode 100644
index 091db01..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/860c941f-b0ac-4251-9e2d-78cab6e65c90
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"860c941f-b0ac-4251-9e2d-78cab6e65c90","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch screen lock message setting page\",\"actionId\":\"860c941f-b0ac-4251-9e2d-78cab6e65c90\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Display\",\"actionId\":\"5657fc91-a4d1-442f-8506-c92d4fcc1408\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Display\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1cecaf5d-b9c3-46fa-a98e-76568935ebfc\",\"displayText\":\"Display\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"976d2c61-9b67-4107-aad4-2a24e805cbc1\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"8dd9b8cf-d97f-4c4c-b56b-e44f78cbd531\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":410.0,\"x2\":45.5,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":406.5,\"x2\":63.0,\"y2\":445.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"7a05f8cc-6106-4698-8f67-d33d87353d9e\",\"displayText\":\"Display\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"75c83883-7529-492a-abc2-907a7ffdc1ea\",\"displayText\":\"Display\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Display\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":408.0,\"x2\":108.25,\"y2\":427.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.375,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Display\"},{\"uuid\":\"c3571ae7-973d-4607-8358-ca7ba3c89067\",\"displayText\":\"Styles, wallpapers, screen timeout, font size\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Styles, wallpapers, screen timeout, font size\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":427.0,\"x2\":300.5,\"y2\":443.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Styles, wallpapers, screen timeout, font size\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":394.0,\"x2\":346.0,\"y2\":457.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Display\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":394.0,\"x2\":360.0,\"y2\":457.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":416.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":9.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"75c83883-7529-492a-abc2-907a7ffdc1ea\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Display\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":51.0,\"y1\":405.0,\"x2\":133.0,\"y2\":428.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Display\",\"actionId\":\"8e64d631-18d8-4b32-8f34-28dd626bdb97\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Display\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Lock screen page\",\"actionId\":\"25bb9b48-4d44-407d-9d34-59bc49ed2310\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Lock screen\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"426f10c1-2d6a-4b6a-971c-077f207020a9\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"310ae8be-ec57-485a-bacc-dd905b003578\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1808208b-fb1e-452f-a551-d3ae51d76bd9\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Lock screen\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":615.25,\"x2\":139.25,\"y2\":634.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.375,\"y\":3.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Lock screen\"},{\"uuid\":\"c33c03ea-6511-49f5-a418-98abd8717a23\",\"displayText\":\"Show all notification content\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Show all notification content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":634.25,\"x2\":218.0,\"y2\":650.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Show all notification content\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":601.25,\"x2\":346.0,\"y2\":664.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Lock screen\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":601.25,\"x2\":360.0,\"y2\":664.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":105.5,\"y\":621.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":74.5,\"y\":12.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"1808208b-fb1e-452f-a551-d3ae51d76bd9\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Lock screen\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":53.0,\"y1\":613.0,\"x2\":158.0,\"y2\":629.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Lock screen\",\"actionId\":\"c5643a4f-3a9d-47c2-ba9d-d1b2bad11f31\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Lock screen\"}],\"childrenIdList\":[\"5657fc91-a4d1-442f-8506-c92d4fcc1408\",\"8e64d631-18d8-4b32-8f34-28dd626bdb97\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"25bb9b48-4d44-407d-9d34-59bc49ed2310\",\"c5643a4f-3a9d-47c2-ba9d-d1b2bad11f31\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch screen lock message setting page","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.213000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/863293b0-236f-46c2-9707-f3bf141fc9f8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/863293b0-236f-46c2-9707-f3bf141fc9f8
deleted file mode 100644
index b83787f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/863293b0-236f-46c2-9707-f3bf141fc9f8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"863293b0-236f-46c2-9707-f3bf141fc9f8","details":"{\"type\":\"CompoundAction\",\"name\":\"Start CTS-V\",\"actionId\":\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"childrenActions\":[],\"childrenIdList\":[\"023dd500-a856-4a6e-a2bb-a94d616de615\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Start CTS-V","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.988000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/873d0871-f3ae-42db-a3e2-f298e3c8c9d9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/873d0871-f3ae-42db-a3e2-f298e3c8c9d9
deleted file mode 100644
index 24db031..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/873d0871-f3ae-42db-a3e2-f298e3c8c9d9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"873d0871-f3ae-42db-a3e2-f298e3c8c9d9","details":"{\"type\":\"CompoundAction\",\"name\":\"03-Sharing of requested bugreport accepted while being taken\",\"actionId\":\"873d0871-f3ae-42db-a3e2-f298e3c8c9d9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Sharing of requested bugreport accepted while being taken\",\"actionId\":\"e163e6a4-2572-45c4-9ea9-4a0999bc1353\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Sharing of requested bugreport accepted while being taken\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Taking bugreport...\\\" is present\",\"actionId\":\"efbabf61-bb6f-4165-b885-7150214b8150\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Taking bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Taking bug report…\",\"actionId\":\"b995a157-d4af-4b8d-a0ec-ef098de44996\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Taking bug report\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY Message \\\"Your IT admin requested a bug report to help troubleshoot this device\\\" is present\",\"actionId\":\"17a65e69-8b25-44f4-a28c-ab28a5bf5b87\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Your IT admin requested a bug report to help troubleshoot this device\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Taking bug report\\\" notification is no longer present\",\"actionId\":\"34cc42f0-cadf-43cd-94f3-0119982125f1\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Taking bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Sharing bug report\\\" progress bar is present\",\"actionId\":\"d7e7cdf9-a92d-4a4e-ae9f-e91ebf3fe14f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Sharing bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"\\\"Bugreport shared successfully\\\" is present\",\"actionId\":\"65925e1c-fe18-4631-a28b-881c82f760d8\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.ui_selector import UiSelector\\n\\nd= Device.create_device_by_slot(0)\\n\\nbugreport_selector = UiSelector().text(\\\"Bugreport shared successfully\\\")\\nd.wait_for(selector=bugreport_selector, timeout=180)\\nd.text(\\\"Bugreport shared successfully\\\").swipe()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f43007cc-eebc-4ba5-97a8-872e904033a4\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"4f3ec13b-589a-4ca3-b456-7224028d0604\",\"e163e6a4-2572-45c4-9ea9-4a0999bc1353\",\"4275df2b-8d38-49a9-b956-6d5f06257f5a\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"efbabf61-bb6f-4165-b885-7150214b8150\",\"b995a157-d4af-4b8d-a0ec-ef098de44996\",\"17a65e69-8b25-44f4-a28c-ab28a5bf5b87\",\"377a3a65-66d4-4e05-ac35-b9e4196639e9\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"34cc42f0-cadf-43cd-94f3-0119982125f1\",\"d7e7cdf9-a92d-4a4e-ae9f-e91ebf3fe14f\",\"65925e1c-fe18-4631-a28b-881c82f760d8\",\"f43007cc-eebc-4ba5-97a8-872e904033a4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"03-Sharing of requested bugreport accepted while being taken","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.072000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/879b4b50-6fba-4899-ad51-c9819adc7dc6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/879b4b50-6fba-4899-ad51-c9819adc7dc6
deleted file mode 100644
index 0d65708..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/879b4b50-6fba-4899-ad51-c9819adc7dc6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"879b4b50-6fba-4899-ad51-c9819adc7dc6","details":"{\"type\":\"CompoundAction\",\"name\":\"16-08-Camera access permission\",\"actionId\":\"879b4b50-6fba-4899-ad51-c9819adc7dc6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Camera access permission\",\"actionId\":\"65e7d16b-9413-4398-a707-a2461a5b641a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Camera access permission\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"47d44466-a26c-4ad1-a534-ef2bcd8bcf89\",\"displayText\":\"Camera access permission\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Camera access permission\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":299.0,\"x2\":351.25,\"y2\":341.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":97.0,\"y\":320.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":83.0,\"y\":-0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"47d44466-a26c-4ad1-a534-ef2bcd8bcf89\",\"firstText\":\"Camera access permission\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Camera access permission\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":13.0,\"y1\":311.0,\"x2\":181.0,\"y2\":330.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Camera access permission\",\"actionId\":\"9f3dbb0f-75e3-408b-b746-4cc3f196810b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Camera access permission\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told that your administrator has granted camera access\",\"actionId\":\"1ecae25d-ffd0-4b33-9986-8c1a6aab99c7\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Camera permissions\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1ab23de4-8812-4308-90fb-36f0ed08cfe7\",\"displayText\":\"Camera permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ad566f5b-4273-4631-9c80-02230840b332\",\"displayText\":\"Camera permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"504a7223-2d81-4167-9244-871fd12317d8\",\"displayText\":\"Camera permissions\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Camera permissions\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":192.25,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.375,\"y\":6.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Camera permissions\"},{\"uuid\":\"bb19e360-64dd-4ae7-b092-4104b04e6f9e\",\"displayText\":\"Minimum 1 app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":148.5,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Minimum 1 app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Camera permissions\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":128.0,\"y\":395.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":52.0,\"y\":14.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"504a7223-2d81-4167-9244-871fd12317d8\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Camera permissions\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":64.0,\"y1\":383.0,\"x2\":192.0,\"y2\":408.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"85cdde49-1659-4aeb-a5a0-42fb08d7a6ff\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told that your administrator has granted camera access\",\"actionId\":\"d59ed507-e043-43d6-9fa3-d7be4faee9b3\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Camera permissions\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ff05b650-1854-4e0f-a42c-fad64f7e4c3d\",\"displayText\":\"Camera permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a867fa3a-1877-47e1-9fba-b8aa554eeafb\",\"displayText\":\"Camera permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c6a0e502-1b90-459c-86d5-a48cd8552de6\",\"displayText\":\"Camera permissions\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Camera permissions\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":192.25,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.125,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Camera permissions\"},{\"uuid\":\"f4818694-d7d2-4b18-8278-72035d572cb8\",\"displayText\":\"Minimum 1 app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":148.5,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Minimum 1 app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Camera permissions\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":125.5,\"y\":399.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":54.5,\"y\":10.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"c6a0e502-1b90-459c-86d5-a48cd8552de6\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Camera permissions\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":51.0,\"y1\":388.0,\"x2\":200.0,\"y2\":411.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Camera permissions\",\"actionId\":\"35e412ff-d12c-45d7-82ef-7675d9531aa6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Camera permissions\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"168b3ab4-4301-4967-b22d-ca5de1ec2700\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c928e778-8574-487d-b581-665748a7dcc6\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"65e7d16b-9413-4398-a707-a2461a5b641a\",\"9f3dbb0f-75e3-408b-b746-4cc3f196810b\",\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"1ecae25d-ffd0-4b33-9986-8c1a6aab99c7\",\"85cdde49-1659-4aeb-a5a0-42fb08d7a6ff\",\"034d5968-a791-4164-8b00-450ddadb3db1\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"d59ed507-e043-43d6-9fa3-d7be4faee9b3\",\"35e412ff-d12c-45d7-82ef-7675d9531aa6\",\"c06f1557-8c66-44c1-8dc2-dad782d2f597\",\"168b3ab4-4301-4967-b22d-ca5de1ec2700\",\"c928e778-8574-487d-b581-665748a7dcc6\",\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-08-Camera access permission","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.180000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/87a99bc2-662c-408a-891a-ebb93954ea8f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/87a99bc2-662c-408a-891a-ebb93954ea8f
deleted file mode 100644
index b2349da..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/87a99bc2-662c-408a-891a-ebb93954ea8f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"87a99bc2-662c-408a-891a-ebb93954ea8f","details":"{\"type\":\"CompoundAction\",\"name\":\"09-Disallow USB file transfer\",\"actionId\":\"87a99bc2-662c-408a-891a-ebb93954ea8f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow USB file transfer\",\"actionId\":\"142b5146-3cf6-4557-bd30-ce0c66989877\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow USB file transfer\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"400bf7f1-73ec-4d2e-ba25-b9e477dc65a5\",\"displayText\":\"Disallow USB file transfer\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow USB file transfer\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":450.3333333333333,\"x2\":350.6666666666667,\"y2\":494.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":93.5,\"y\":473.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":86.5,\"y\":-1.1666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"400bf7f1-73ec-4d2e-ba25-b9e477dc65a5\",\"firstText\":\"Disallow USB file transfer\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow USB file transfer\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":459.0,\"x2\":181.0,\"y2\":488.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow USB file transfer\",\"actionId\":\"b44d4a7c-7c57-47b6-913d-763529abe2ab\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow USB file transfer\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Charging this device via USB\",\"actionId\":\"1412d1dc-df33-4824-a518-3b1577d0a5a0\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Charging this device via USB\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a6cdc3eb-7aaa-4d26-8809-cc69fa0fba92\",\"displayText\":\"Charging this device via USB\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"9819149b-0b03-4927-a9cd-87a9a6d5f102\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.android.systemui:id/backgroundNormal\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":552.6666666666666,\"x2\":356.3333333333333,\"y2\":646.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"15fe7632-87e5-4387-9175-b0a87a7a7fde\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b86eeb44-3b84-4bcd-834e-cb3147b3efd5\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d5cdf7eb-2271-4f79-b3bf-c86c8dbab422\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6122aabc-3256-432b-a82b-190425f60998\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":18.333333333333332,\"y1\":567.3333333333334,\"x2\":33.666666666666664,\"y2\":584.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/header_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":18.333333333333332,\"y1\":567.3333333333334,\"x2\":37.666666666666664,\"y2\":584.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"a761c224-101c-4c0f-b572-7ed2ea9677b7\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"Android System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":40.333333333333336,\"y1\":568.3333333333334,\"x2\":118.66666666666667,\"y2\":583.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"},{\"uuid\":\"aeb9856f-62c6-4e7b-89c9-9752c34788b1\",\"displayText\":\"•\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/header_text_divider\",\"text\":\"•\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":122.66666666666667,\"y1\":568.3333333333334,\"x2\":126.33333333333333,\"y2\":583.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"•\"},{\"uuid\":\"dc8d6e30-a275-4fc2-ba56-af51e02077a1\",\"displayText\":\"Charging this device via USB\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/header_text\",\"text\":\"Charging this device via USB\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":130.33333333333334,\"y1\":568.3333333333334,\"x2\":269.6666666666667,\"y2\":583.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.5,\"y\":-0.33333333333325754,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Charging this device via USB\"},{\"uuid\":\"867e4201-1b9c-49cf-a501-4a874a6b6845\",\"displayText\":\"Expand\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/expand_button\",\"contentDesc\":\"Expand\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":309.3333333333333,\"y1\":553.6666666666666,\"x2\":353.3333333333333,\"y2\":597.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Expand\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/notification_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":552.6666666666666,\"x2\":356.3333333333333,\"y2\":598.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/expanded\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":552.6666666666666,\"x2\":356.3333333333333,\"y2\":646.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"},{\"uuid\":\"659b6507-c275-4b87-9042-2e9b66c3bfd2\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/fake_shadow\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":552.6666666666666,\"x2\":356.3333333333333,\"y2\":646.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":552.6666666666666,\"x2\":356.3333333333333,\"y2\":598.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":198.5,\"y\":576.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-18.5,\"y\":-0.33333333333337123,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"dc8d6e30-a275-4fc2-ba56-af51e02077a1\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Charging this device via USB\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":124.0,\"y1\":563.0,\"x2\":273.0,\"y2\":589.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Charging this device via USB\",\"actionId\":\"d32b4e4d-d5df-433e-86ff-66c06a3e8cef\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Charging this device via USB\"},{\"type\":\"ConditionClickAction\",\"name\":\"Click Charging this device via USB notification again if it is collapsed\",\"actionId\":\"7a49908c-38af-42cc-b20f-fc01919bdabd\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Charging this device via USB\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f1136c15-8621-4e12-980e-d51231cadf15\",\"displayText\":\"Charging this device via USB\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"10b8d250-7b6a-4cd1-80e1-6af743bb82a2\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.android.systemui:id/backgroundNormal\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":540.6666666666666,\"x2\":356.3333333333333,\"y2\":637.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"46884c8b-51e1-4024-acf2-c9bfb3d6a226\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"baf7fe68-b52c-4aae-8084-f1af9c54fd5f\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2b589873-46e5-4ff1-a12a-44d147760134\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7743f055-477b-4daf-976a-6bde64477719\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":18.333333333333332,\"y1\":555.3333333333334,\"x2\":33.666666666666664,\"y2\":572.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/header_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":18.333333333333332,\"y1\":555.3333333333334,\"x2\":37.666666666666664,\"y2\":572.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"2152aa86-3282-4fae-acc3-e1087d23286f\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"Android System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":40.333333333333336,\"y1\":556.3333333333334,\"x2\":118.66666666666667,\"y2\":571.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"},{\"uuid\":\"7025cbcb-97fd-4ba6-a466-6114abc1bf27\",\"displayText\":\"•\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/header_text_divider\",\"text\":\"•\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":122.66666666666667,\"y1\":556.3333333333334,\"x2\":126.33333333333333,\"y2\":571.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"•\"},{\"uuid\":\"72cef6e6-e578-404f-b307-4ffc0f06728e\",\"displayText\":\"Charging this device via USB\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/header_text\",\"text\":\"Charging this device via USB\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":130.33333333333334,\"y1\":556.3333333333334,\"x2\":269.6666666666667,\"y2\":571.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.0,\"y\":0.16666666666674246,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Charging this device via USB\"},{\"uuid\":\"57d7625d-708c-4084-b2c1-2cc262287b92\",\"displayText\":\"Expand\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/expand_button\",\"contentDesc\":\"Expand\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":309.3333333333333,\"y1\":541.6666666666666,\"x2\":353.3333333333333,\"y2\":585.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Expand\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/notification_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":540.6666666666666,\"x2\":356.3333333333333,\"y2\":586.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/expanded\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":540.6666666666666,\"x2\":356.3333333333333,\"y2\":637.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Android System\"},{\"uuid\":\"ffff79d1-8a5a-4d5c-9162-b0dbb7c8fbe5\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/fake_shadow\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":540.6666666666666,\"x2\":356.3333333333333,\"y2\":637.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.6666666666666665,\"y1\":540.6666666666666,\"x2\":356.3333333333333,\"y2\":586.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":197.0,\"y\":563.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-17.0,\"y\":0.16666666666662877,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"72cef6e6-e578-404f-b307-4ffc0f06728e\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Charging this device via USB\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":123.0,\"y1\":551.0,\"x2\":271.0,\"y2\":576.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if File transfer(MTP) is not displayed\",\"actionId\":\"89cbed0b-3048-48f7-a651-40f8469ff35a\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"CONTAINS\",\"patternValue\":\"File transfer\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1f0126b5-4b51-4fc5-8741-0917e32f733e\",\"displayText\":\"File transfer / Android Auto\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"039de253-df98-4b67-9c81-797a271fb166\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c506b754-f5ee-42ef-aaa1-b823933b6945\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.RadioButton\",\"resourceId\":\"android:id/checkbox\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":11.0,\"y1\":379.6666666666667,\"x2\":40.333333333333336,\"y2\":409.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/widget_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":370.0,\"x2\":51.333333333333336,\"y2\":419.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"00965e82-8c5f-4974-9422-0d0fb8890759\",\"displayText\":\"File transfer / Android Auto\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d96cb894-49de-4f8c-ad70-de0a87d7a676\",\"displayText\":\"File transfer / Android Auto\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"File transfer / Android Auto\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":384.6666666666667,\"x2\":242.66666666666666,\"y2\":404.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.3333333333333144,\"y\":-1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"File transfer / Android Auto\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":370.0,\"x2\":345.3333333333333,\"y2\":419.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"File transfer / Android Auto\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":370.0,\"x2\":360.0,\"y2\":419.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":154.0,\"y\":396.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":26.0,\"y\":-1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d96cb894-49de-4f8c-ad70-de0a87d7a676\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"File transfer\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":57.0,\"y1\":380.0,\"x2\":251.0,\"y2\":412.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Transfer photo(PTP) is not displayed\",\"actionId\":\"e443bdb0-2081-416d-8555-63c075c0e0f8\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"PTP\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"24ef02f9-c12e-401a-aff4-e487bdcc0378\",\"displayText\":\"PTP\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d06aba11-65e5-4740-ad12-b0431b242a41\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d961bdfc-8458-4c8b-9751-85f61c501cc0\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.RadioButton\",\"resourceId\":\"android:id/checkbox\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":11.0,\"y1\":526.6666666666666,\"x2\":40.333333333333336,\"y2\":556.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/widget_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":517.0,\"x2\":51.333333333333336,\"y2\":566.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"ca650c9a-3f69-463f-bd6b-a5db909fdb3e\",\"displayText\":\"PTP\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a7bc3656-6a9b-4fb7-b58c-20289520e115\",\"displayText\":\"PTP\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"PTP\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":531.6666666666666,\"x2\":90.66666666666667,\"y2\":551.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.666666666666657,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"PTP\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":517.0,\"x2\":345.3333333333333,\"y2\":566.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"PTP\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":517.0,\"x2\":360.0,\"y2\":566.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":85.0,\"y\":540.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":95.0,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"a7bc3656-6a9b-4fb7-b58c-20289520e115\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"PTP\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":58.0,\"y1\":528.0,\"x2\":112.0,\"y2\":553.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1e6f8609-7000-4220-9191-56fefc1e192b\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"142b5146-3cf6-4557-bd30-ce0c66989877\",\"b44d4a7c-7c57-47b6-913d-763529abe2ab\",\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"1412d1dc-df33-4824-a518-3b1577d0a5a0\",\"d32b4e4d-d5df-433e-86ff-66c06a3e8cef\",\"7a49908c-38af-42cc-b20f-fc01919bdabd\",\"89cbed0b-3048-48f7-a651-40f8469ff35a\",\"e443bdb0-2081-416d-8555-63c075c0e0f8\",\"1e6f8609-7000-4220-9191-56fefc1e192b\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"09-Disallow USB file transfer","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.102000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/87aa94cd-e4ba-4453-9d58-267514ce16bb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/87aa94cd-e4ba-4453-9d58-267514ce16bb
deleted file mode 100644
index 4dc6a7e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/87aa94cd-e4ba-4453-9d58-267514ce16bb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"87aa94cd-e4ba-4453-9d58-267514ce16bb","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn Adaptive Brightness on\",\"actionId\":\"87aa94cd-e4ba-4453-9d58-267514ce16bb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Turn Adaptive Brightness on\",\"actionId\":\"5269eb8f-828f-420e-9653-5aea9898e208\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell settings put system screen_brightness_mode 1\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"5269eb8f-828f-420e-9653-5aea9898e208\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn Adaptive Brightness on","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.275000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8a47ce64-ec2d-4a20-a91b-f89000b7e2bc b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8a47ce64-ec2d-4a20-a91b-f89000b7e2bc
deleted file mode 100644
index c8c124b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8a47ce64-ec2d-4a20-a91b-f89000b7e2bc
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8a47ce64-ec2d-4a20-a91b-f89000b7e2bc","details":"{\"type\":\"CompoundAction\",\"name\":\"16-14-Wipe on authentication failure\",\"actionId\":\"8a47ce64-ec2d-4a20-a91b-f89000b7e2bc\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Wipe on authentication failure\",\"actionId\":\"f67f7002-41b9-4864-97fc-13e587b2528d\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Wipe on authentication failure\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6eefa73f-6da5-4a9c-aafd-f6b7b068e49a\",\"displayText\":\"Wipe on authentication failure\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Wipe on authentication failure\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":523.6666666666666,\"x2\":351.3333333333333,\"y2\":565.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":122.0,\"y\":545.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":58.0,\"y\":-0.8333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"6eefa73f-6da5-4a9c-aafd-f6b7b068e49a\",\"firstText\":\"Wipe on authentication failure\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Wipe on authentication failure\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":533.0,\"x2\":238.0,\"y2\":558.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Wipe on authentication failure\",\"actionId\":\"e032e1a5-cfea-465d-9867-41eec93fe9ea\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Wipe on authentication failure\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told that all device data will be deleted if you mistype your password \",\"actionId\":\"ea784452-647d-463d-a118-605baa1b1425\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Failed password attempts before deleting all device data\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6b6b7661-fb0a-4588-b74d-ec3682a8bc19\",\"displayText\":\"Failed password attempts before deleting all device data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f741bb19-288d-4b48-81c5-d305000c501b\",\"displayText\":\"Failed password attempts before deleting all device data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"96341d97-5c70-4a67-8d0f-0893104d0e34\",\"displayText\":\"Failed password attempts before deleting all device data\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Failed password attempts before deleting all device data\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":568.0,\"x2\":346.0,\"y2\":604.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":8.0,\"y\":13.666666666666742,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Failed password attempts before deleting all device data\"},{\"uuid\":\"bf211428-2245-447e-afdd-fcfe8151d5e2\",\"displayText\":\"100 attempts\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"100 attempts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":604.3333333333334,\"x2\":136.33333333333334,\"y2\":621.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"100 attempts\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":554.0,\"x2\":346.0,\"y2\":635.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Failed password attempts before deleting all device data\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":554.0,\"x2\":360.0,\"y2\":635.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":196.5,\"y\":572.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-16.5,\"y\":22.166666666666742,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"96341d97-5c70-4a67-8d0f-0893104d0e34\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Failed password attempts before deleting all device data\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":61.0,\"y1\":558.0,\"x2\":332.0,\"y2\":587.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"6bfaa31b-7813-4636-95e6-98ff589a02be\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Limit\",\"actionId\":\"b33be532-e23a-4398-95da-9e078039b826\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set Limit\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told now that all device data will be deleted if you mistype your password \",\"actionId\":\"700db7dd-c171-4e4d-a082-33ca0dc0a49a\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Failed password attempts before deleting all device data\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"66262d61-11d7-4ca3-8e00-0df0568f7e2d\",\"displayText\":\"Failed password attempts before deleting all device data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0a63ef7e-89db-4325-8bdb-a565c90cb82b\",\"displayText\":\"Failed password attempts before deleting all device data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"73e6175b-c692-4159-b8f5-f2ba6a7c8084\",\"displayText\":\"Failed password attempts before deleting all device data\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Failed password attempts before deleting all device data\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":568.0,\"x2\":346.0,\"y2\":604.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":11.5,\"y\":8.666666666666742,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Failed password attempts before deleting all device data\"},{\"uuid\":\"ed2e5e61-b2c5-437d-a04f-0bc00aaf3d72\",\"displayText\":\"100 attempts\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"100 attempts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":604.3333333333334,\"x2\":136.33333333333334,\"y2\":621.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"100 attempts\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":554.0,\"x2\":346.0,\"y2\":635.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Failed password attempts before deleting all device data\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":554.0,\"x2\":360.0,\"y2\":635.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":193.0,\"y\":577.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-13.0,\"y\":17.166666666666742,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"73e6175b-c692-4159-b8f5-f2ba6a7c8084\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Failed password attempts before deleting all device data\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":561.0,\"x2\":332.0,\"y2\":594.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify it show 100 times\",\"actionId\":\"e05ba1f1-aac7-41b9-b7e1-7b84b0fb01e7\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"100 attempts\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"89345924-9fc9-472b-8703-5b03f89cc522\",\"displayText\":\"100 attempts\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d31f513a-d44b-4f31-acfe-78fe9a076a88\",\"displayText\":\"Failed password attempts before deleting all device data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"faa25ef0-7586-4a4f-b9a2-727751148958\",\"displayText\":\"Failed password attempts before deleting all device data\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Failed password attempts before deleting all device data\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":568.0,\"x2\":346.0,\"y2\":604.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Failed password attempts before deleting all device data\"},{\"uuid\":\"294ae1f3-7b53-4c8f-ba63-a8fd677b5d93\",\"displayText\":\"100 attempts\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"100 attempts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":604.3333333333334,\"x2\":136.33333333333334,\"y2\":621.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.3333333333333286,\"y\":2.3333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"100 attempts\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":554.0,\"x2\":346.0,\"y2\":635.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Failed password attempts before deleting all device data\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":554.0,\"x2\":360.0,\"y2\":635.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":102.0,\"y\":610.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":78.0,\"y\":-15.833333333333258,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"294ae1f3-7b53-4c8f-ba63-a8fd677b5d93\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"100 attempts\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":601.0,\"x2\":150.0,\"y2\":620.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"17c56e55-c56a-4ce1-aed0-a354f098d2d7\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"f67f7002-41b9-4864-97fc-13e587b2528d\",\"e032e1a5-cfea-465d-9867-41eec93fe9ea\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"ea784452-647d-463d-a118-605baa1b1425\",\"6bfaa31b-7813-4636-95e6-98ff589a02be\",\"b33be532-e23a-4398-95da-9e078039b826\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"700db7dd-c171-4e4d-a082-33ca0dc0a49a\",\"e05ba1f1-aac7-41b9-b7e1-7b84b0fb01e7\",\"17c56e55-c56a-4ce1-aed0-a354f098d2d7\",\"b17bcc33-34e0-4aba-a8ce-080ea0d0846c\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-14-Wipe on authentication failure","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.188000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8b18fc23-789a-4c41-9746-297a040e35a7 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8b18fc23-789a-4c41-9746-297a040e35a7
deleted file mode 100644
index dfe4c0c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8b18fc23-789a-4c41-9746-297a040e35a7
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8b18fc23-789a-4c41-9746-297a040e35a7","details":"{\"type\":\"CompoundAction\",\"name\":\"Check the restriction message(Long message)\",\"actionId\":\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Learn more button\",\"actionId\":\"6483582b-b2ab-4567-824a-593fc4214d1b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button3\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the long message\",\"actionId\":\"8bcc732d-78c2-4904-9ef5-0d149900d472\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"CONTAINS\",\"patternValue\":\"Your admin can monitor and manage apps and data associated with\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7371673d-6ff5-4232-b739-65a4397d3dab\",\"displayText\":\"Your admin can monitor and manage apps and data associated with this device, including settings, permissions, corporate access, network activity, and the device's location information.\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/admin_warning\",\"text\":\"Your admin can monitor and manage apps and data associated with this device, including settings, permissions, corporate access, network activity, and the device's location information.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":132.0,\"x2\":345.3333333333333,\"y2\":250.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":167.5,\"y\":171.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":12.5,\"y\":19.666666666666686,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"7371673d-6ff5-4232-b739-65a4397d3dab\",\"firstText\":\"Your admin can monitor and manage apps and data associated with this device, including settings, permissions, corporate access, network activity, and the device's location information.\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Your admin can monitor and manage apps and data associated with\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":13.0,\"y1\":140.0,\"x2\":322.0,\"y2\":203.0}}],\"childrenIdList\":[\"6483582b-b2ab-4567-824a-593fc4214d1b\",\"8bcc732d-78c2-4904-9ef5-0d149900d472\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Check the restriction message(Long message)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.122000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8b466564-08e5-4322-8992-36fa3998ddd2 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8b466564-08e5-4322-8992-36fa3998ddd2
deleted file mode 100644
index a58469a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8b466564-08e5-4322-8992-36fa3998ddd2
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8b466564-08e5-4322-8992-36fa3998ddd2","details":"{\"type\":\"CompoundAction\",\"name\":\"Scroll to the ringtone checked\",\"actionId\":\"8b466564-08e5-4322-8992-36fa3998ddd2\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"The ringtone checked\",\"actionId\":\"51bf0720-a524-479f-b429-50b51ffde02e\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.soundpicker:id/radio_button\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":false},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"52983a0a-4ebd-4ecd-be5b-f67c8a27f8b3\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null}],\"childrenIdList\":[\"51bf0720-a524-479f-b429-50b51ffde02e\",\"52983a0a-4ebd-4ecd-be5b-f67c8a27f8b3\"],\"repeatTime\":5,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Scroll to the ringtone checked","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.289000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8d1d94a2-d11b-4f87-a55a-3d13bc488360 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8d1d94a2-d11b-4f87-a55a-3d13bc488360
deleted file mode 100644
index 51f2c15..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8d1d94a2-d11b-4f87-a55a-3d13bc488360
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8d1d94a2-d11b-4f87-a55a-3d13bc488360","details":"{\"type\":\"CompoundAction\",\"name\":\"Make sure the main location switch on before test\",\"actionId\":\"8d1d94a2-d11b-4f87-a55a-3d13bc488360\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Turn main location switch on\",\"actionId\":\"371c64ad-a2a1-4664-94d5-a21451408f7a\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"Use location\\\").right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"Use location\\\").right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"371c64ad-a2a1-4664-94d5-a21451408f7a\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Make sure the main location switch on before test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.288000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8d92c21e-306b-4992-822e-10c25a38d781 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8d92c21e-306b-4992-822e-10c25a38d781
deleted file mode 100644
index 0458d9f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8d92c21e-306b-4992-822e-10c25a38d781
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8d92c21e-306b-4992-822e-10c25a38d781","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Camera Orientation(Check image)\",\"actionId\":\"8d92c21e-306b-4992-822e-10c25a38d781\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Camera Orientation\",\"actionId\":\"157b0d14-c1a4-45b8-b75c-a05df134eeff\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Camera Orientation\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"5534570b-25e5-4365-a9e6-869217876269\",\"displayText\":\"Camera Orientation\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Camera Orientation\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":641.0,\"x2\":351.3333333333333,\"y2\":683.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":76.5,\"y\":660.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":103.5,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"5534570b-25e5-4365-a9e6-869217876269\",\"firstText\":\"Camera Orientation\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Camera Orientation\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":650.0,\"x2\":150.0,\"y2\":671.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Camera Orientation\",\"actionId\":\"3b8e5694-13b4-4f74-a784-6b1f007cef6d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Camera Orientation\"},{\"type\":\"ScreenRotateAction\",\"name\":\"landscape\",\"actionId\":\"3a498ab1-e485-4d72-b298-cc20177bf1e5\",\"actionType\":\"SCREEN_ROTATE_ACTION\",\"createdBy\":\"riacheltseng\",\"deviceOrientation\":\"LANDSCAPE\"},{\"type\":\"ScreenCapAction\",\"name\":\"Camera:1 of 2-Orientation 1 of 4: 0 degree clockwise\",\"actionId\":\"04978340-3490-4de1-8acd-591b9239c7b3\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenCapAction\",\"name\":\"Camera:1 of 2-Orientation 2 of 4: 90 degree clockwise\",\"actionId\":\"c6f198b3-bd8a-4635-ab3e-8b5a05fbc27b\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenCapAction\",\"name\":\"Camera:1 of 2-Orientation 2 of 4: 180 degree clockwise\",\"actionId\":\"cba5f39c-a6dd-4f24-806e-e430ab025bff\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenCapAction\",\"name\":\"Camera:1 of 2-Orientation 2 of 4: 270 degree clockwise\",\"actionId\":\"0b20fade-16b3-4b8a-8aba-36ffca6189ff\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenCapAction\",\"name\":\"Camera:2 of 2-Orientation 1 of 4: 0 degree clockwise\",\"actionId\":\"f98f56e1-3bd6-439f-b7b6-0f2904391028\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenCapAction\",\"name\":\"Camera:2 of 2-Orientation 2 of 4: 90 degree clockwise\",\"actionId\":\"19eab02d-5db7-4f3a-b623-8cf1c2829f00\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenCapAction\",\"name\":\"Camera:2 of 2-Orientation 2 of 4: 180 degree clockwise\",\"actionId\":\"b5c8e6fc-5d26-4578-8d93-e7b64e8addd1\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenCapAction\",\"name\":\"Camera:2 of 2-Orientation 2 of 4: 270 degree clockwise\",\"actionId\":\"f0ebb5b0-6785-4a2b-9014-6fe9ad42ddc5\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenRotateAction\",\"name\":\"portrait\",\"actionId\":\"05081971-b967-4b64-ae12-f4678fadac9d\",\"actionType\":\"SCREEN_ROTATE_ACTION\",\"createdBy\":\"riacheltseng\",\"deviceOrientation\":\"PORTRAIT\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"157b0d14-c1a4-45b8-b75c-a05df134eeff\",\"3b8e5694-13b4-4f74-a784-6b1f007cef6d\",\"3a498ab1-e485-4d72-b298-cc20177bf1e5\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"04978340-3490-4de1-8acd-591b9239c7b3\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"c6f198b3-bd8a-4635-ab3e-8b5a05fbc27b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"cba5f39c-a6dd-4f24-806e-e430ab025bff\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"0b20fade-16b3-4b8a-8aba-36ffca6189ff\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"f98f56e1-3bd6-439f-b7b6-0f2904391028\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"19eab02d-5db7-4f3a-b623-8cf1c2829f00\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"b5c8e6fc-5d26-4578-8d93-e7b64e8addd1\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"f0ebb5b0-6785-4a2b-9014-6fe9ad42ddc5\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"05081971-b967-4b64-ae12-f4678fadac9d\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Camera Orientation(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.018000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8dd0e093-a239-45e8-ae92-b8ac6e3ad4b7 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8dd0e093-a239-45e8-ae92-b8ac6e3ad4b7
deleted file mode 100644
index 6abeab0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8dd0e093-a239-45e8-ae92-b8ac6e3ad4b7
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8dd0e093-a239-45e8-ae92-b8ac6e3ad4b7","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Camera Formats\",\"actionId\":\"8dd0e093-a239-45e8-ae92-b8ac6e3ad4b7\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Camera Formats\",\"actionId\":\"f3ed1c2d-eb98-4ef2-ad5a-b7e0356f7136\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Camera Formats\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8326abfd-265d-4beb-a900-feb7e59d8a9f\",\"displayText\":\"Camera Formats\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Camera Formats\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":506.75,\"x2\":351.25,\"y2\":548.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":74.0,\"y\":525.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":106.0,\"y\":2.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"8326abfd-265d-4beb-a900-feb7e59d8a9f\",\"firstText\":\"Camera Formats\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Camera Formats\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":511.0,\"x2\":140.0,\"y2\":540.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Camera Formats\",\"actionId\":\"7c562cc3-3e14-4291-8698-0d8bc89fa90a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Camera Formats\"},{\"type\":\"ScreenRotateAction\",\"name\":\"landscape\",\"actionId\":\"a3c846ab-0b64-4782-bcf5-74e8a359f84e\",\"actionType\":\"SCREEN_ROTATE_ACTION\",\"createdBy\":\"riacheltseng\",\"deviceOrientation\":\"LANDSCAPE\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"f3ed1c2d-eb98-4ef2-ad5a-b7e0356f7136\",\"7c562cc3-3e14-4291-8698-0d8bc89fa90a\",\"a3c846ab-0b64-4782-bcf5-74e8a359f84e\",\"1601f323-e824-4190-9ee0-350f0a1149ea\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Camera Formats","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.015000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8de23e46-4a22-4d4b-bc72-5588dfe25101 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8de23e46-4a22-4d4b-bc72-5588dfe25101
deleted file mode 100644
index f2e70e3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8de23e46-4a22-4d4b-bc72-5588dfe25101
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8de23e46-4a22-4d4b-bc72-5588dfe25101","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn On/Off Notification access\",\"actionId\":\"8de23e46-4a22-4d4b-bc72-5588dfe25101\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if Notification access setting was launched\",\"actionId\":\"65bb1a1b-66fa-4f1f-989b-f8275e43f0fb\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"class\",\"operator\":\"=\",\"value\":\"android.widget.TextView\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Notification access\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"47ffe031-5f07-4c5f-843a-ae768ba39073\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"CTS Verifier\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Allow notification access\",\"actionId\":\"4d5c0840-96ef-4155-b49d-c83367261c61\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Allow notification access\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Allow/turn off button\",\"actionId\":\"c8028e80-3278-4bdd-8bcf-0a7c51a3c5cf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"bba80e33-a630-4bc0-a6b2-6c01e5057a54\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"220815cc-f531-4988-b0de-dc0b51660155\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"65bb1a1b-66fa-4f1f-989b-f8275e43f0fb\",\"47ffe031-5f07-4c5f-843a-ae768ba39073\",\"4d5c0840-96ef-4155-b49d-c83367261c61\",\"c8028e80-3278-4bdd-8bcf-0a7c51a3c5cf\",\"bba80e33-a630-4bc0-a6b2-6c01e5057a54\",\"220815cc-f531-4988-b0de-dc0b51660155\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn On/Off Notification access","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.236000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8e5815c6-e55c-4dce-8aeb-8b2a62898a6a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8e5815c6-e55c-4dce-8aeb-8b2a62898a6a
deleted file mode 100644
index e2d3bf7..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8e5815c6-e55c-4dce-8aeb-8b2a62898a6a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8e5815c6-e55c-4dce-8aeb-8b2a62898a6a","details":"{\"type\":\"CompoundAction\",\"name\":\"Set CTS Verifier as your default phone app?\",\"actionId\":\"8e5815c6-e55c-4dce-8aeb-8b2a62898a6a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Check if \\\"CTS Verifier\\\" exists then do the following actions.\",\"actionId\":\"49170643-cc99-4a67-807c-a3df68b2bbf7\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.permissioncontroller:id/title\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"CTS Verifier\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"1a6df04e-7f94-4d3e-a9eb-47dd6fe049a0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, android:id/button1\",\"actionId\":\"4fd51ed7-f839-4b50-8f1c-b4c868e707dd\",\"actionType\":\"CLICK_ACTION\",\"actionDescription\":\"Set as default\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"49170643-cc99-4a67-807c-a3df68b2bbf7\",\"1a6df04e-7f94-4d3e-a9eb-47dd6fe049a0\",\"4fd51ed7-f839-4b50-8f1c-b4c868e707dd\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_null=null,\\n\"}}","name":"Set CTS Verifier as your default phone app?","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.283000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8ef662f7-4f74-4591-ae52-3225f30513b1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8ef662f7-4f74-4591-ae52-3225f30513b1
deleted file mode 100644
index fad7f78..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8ef662f7-4f74-4591-ae52-3225f30513b1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8ef662f7-4f74-4591-ae52-3225f30513b1","details":"{\"type\":\"CompoundAction\",\"name\":\"Dragging bubble to dismiss it on the screen\",\"actionId\":\"8ef662f7-4f74-4591-ae52-3225f30513b1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"PYSCRIPT-dragging bubble to dismiss it on the screen\",\"actionId\":\"3aaa7bfc-7fe4-4618-9b8d-14497d88155f\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.ui_object import UiObject\\nfrom python_uiautomator.ui_selector import UiSelector\\nfrom python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\n\\npoint1 = UiObject(UiSelector().resource_id(\\\"com.android.systemui:id/bubble_view\\\"), d).get_center_pos()\\npoint2 = UiObject(UiSelector().resource_id(\\\"com.android.cts.verifier:id/info_button\\\"), d).get_center_pos()\\n\\nselectors = [point1, point2]\\n \\nd.drag(selectors)\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"3aaa7bfc-7fe4-4618-9b8d-14497d88155f\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Dragging bubble to dismiss it on the screen","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.228000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8f00d919-0c82-4e55-8710-3a76734da2b3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8f00d919-0c82-4e55-8710-3a76734da2b3
deleted file mode 100644
index c5f37e3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8f00d919-0c82-4e55-8710-3a76734da2b3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8f00d919-0c82-4e55-8710-3a76734da2b3","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Shortcut Reset Rate-limiting Test\",\"actionId\":\"8f00d919-0c82-4e55-8710-3a76734da2b3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Install CTS Robot helper apk\",\"actionId\":\"09d98569-d030-4e9f-a855-2205a05e1b11\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"install -r -t $uicd_NotificationBot_apk_path\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Shortcut Reset Rate-limiting Test\",\"actionId\":\"b7c555db-e606-4858-818d-7426db25fe74\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Shortcut Reset Rate-limiting Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"291c670b-77b5-4f06-9bb1-18d84039c61b\",\"displayText\":\"Shortcut Reset Rate-limiting Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Shortcut Reset Rate-limiting Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":505.0,\"x2\":350.6666666666667,\"y2\":549.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":129.0,\"y\":530.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":51.0,\"y\":-3.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"291c670b-77b5-4f06-9bb1-18d84039c61b\",\"firstText\":\"Shortcut Reset Rate-limiting Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Shortcut Reset Rate-limiting Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":511.0,\"x2\":251.0,\"y2\":549.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Shortcut Reset Rate-limiting Test\",\"actionId\":\"b341512d-17da-41e0-8f05-0f06559925c0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Shortcut Reset Rate-limiting Test\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 15 secs\",\"actionId\":\"1bf8c189-8d93-4d26-a671-6a52ba610c47\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Find the Shortcut Reset Rate-limiting Test notification\",\"actionId\":\"994d27a3-daf7-4131-8fe4-6ed6a93551a4\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"$uicd_notification_reply_field\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"$uicd_notification_reply_field\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"$uicd_notification_reply_field\"}]},\"clickAfterValidation\":true},{\"type\":\"InputAction\",\"name\":\"INPUT Test String\",\"actionId\":\"b536843f-de61-45cc-91e9-dbfe979b9ca5\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"Shortcut reset rate limiting test\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/remote_input_send\",\"actionId\":\"5461159b-ffac-45ac-b4fa-368ff21e5c81\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.systemui:id/remote_input_send\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 15 secs\",\"actionId\":\"12fd45cb-b52e-49f1-b0d3-b358c0871634\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"riacheltseng\"}],\"childrenIdList\":[\"09d98569-d030-4e9f-a855-2205a05e1b11\",\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"b7c555db-e606-4858-818d-7426db25fe74\",\"b341512d-17da-41e0-8f05-0f06559925c0\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"1bf8c189-8d93-4d26-a671-6a52ba610c47\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"994d27a3-daf7-4131-8fe4-6ed6a93551a4\",\"b536843f-de61-45cc-91e9-dbfe979b9ca5\",\"5461159b-ffac-45ac-b4fa-368ff21e5c81\",\"12fd45cb-b52e-49f1-b0d3-b358c0871634\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_NotificationBot_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/NotificationBot.apk\\n$uicd_notification_reply_field=android:id/reply_icon_action\"}}","name":"test_Shortcut Reset Rate-limiting Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.240000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8f2375c4-da47-4673-b46d-88bfca894fbf b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8f2375c4-da47-4673-b46d-88bfca894fbf
deleted file mode 100644
index da53239..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/8f2375c4-da47-4673-b46d-88bfca894fbf
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"8f2375c4-da47-4673-b46d-88bfca894fbf","details":"{\"type\":\"CompoundAction\",\"name\":\"16-06-Location access permission\",\"actionId\":\"8f2375c4-da47-4673-b46d-88bfca894fbf\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Location access permission\",\"actionId\":\"9aeb40eb-6307-4167-b812-99c4f96a7ef6\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Location access permission\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0627f69f-20e0-4331-a855-9a4efd300318\",\"displayText\":\"Location access permission\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Location access permission\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":297.25,\"x2\":351.25,\"y2\":339.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":99.0,\"y\":316.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":81.0,\"y\":2.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"0627f69f-20e0-4331-a855-9a4efd300318\",\"firstText\":\"Location access permission\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Location access permission\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":299.0,\"x2\":188.0,\"y2\":333.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Location access permission\",\"actionId\":\"5676b90a-3caf-4cfa-8f74-879ff7e79376\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Location access permission\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told that your administrator has granted location access\",\"actionId\":\"aa29008f-89de-4f7e-adce-66195fe282d7\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Location permissions\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"eb9309c1-e4e3-4bef-b54e-4a5e3d95b8af\",\"displayText\":\"Location permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"23bf0ad0-43e0-4ee4-ab2d-350d8a5e09c1\",\"displayText\":\"Location permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cb2c35f4-a285-455c-b97e-d61e3cb737a3\",\"displayText\":\"Location permissions\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Location permissions\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":196.5,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.25,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Location permissions\"},{\"uuid\":\"09de48cb-fbee-408e-bd7b-faa0d088238e\",\"displayText\":\"Minimum 1 app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":148.5,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Minimum 1 app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Location permissions\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":132.0,\"y\":400.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":48.0,\"y\":9.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"cb2c35f4-a285-455c-b97e-d61e3cb737a3\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Location permissions\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":55.0,\"y1\":390.0,\"x2\":209.0,\"y2\":411.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"2a170e60-409e-4ef2-a1cb-1f338b9405b2\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told now that your administrator has granted location access\",\"actionId\":\"836b0c3c-b2ab-44a9-84c6-3dbd823419b6\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Location permissions\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"05ceb6a4-69c9-48a4-b731-2db97dece63b\",\"displayText\":\"Location permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b2275521-cf7d-4ea8-9de3-907f732daa33\",\"displayText\":\"Location permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"be530706-a90d-4006-a4ff-b6130ea1bcb3\",\"displayText\":\"Location permissions\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Location permissions\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":196.5,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.75,\"y\":2.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Location permissions\"},{\"uuid\":\"ba9df400-2f3a-43a1-97a0-fb95943b7d92\",\"displayText\":\"Minimum 1 app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":148.5,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Minimum 1 app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Location permissions\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":131.5,\"y\":399.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":48.5,\"y\":10.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"be530706-a90d-4006-a4ff-b6130ea1bcb3\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Location permissions\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":46.0,\"y1\":386.0,\"x2\":217.0,\"y2\":412.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Location permissions\",\"actionId\":\"6db8b067-f33d-46f6-a081-40e8cf85d547\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Location permissions\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"fdda3d75-68aa-4dc9-bcf4-171f28668b4e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1adedfb2-6a4c-4774-8dd9-99216dca81d9\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"9aeb40eb-6307-4167-b812-99c4f96a7ef6\",\"5676b90a-3caf-4cfa-8f74-879ff7e79376\",\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"aa29008f-89de-4f7e-adce-66195fe282d7\",\"2a170e60-409e-4ef2-a1cb-1f338b9405b2\",\"034d5968-a791-4164-8b00-450ddadb3db1\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"836b0c3c-b2ab-44a9-84c6-3dbd823419b6\",\"6db8b067-f33d-46f6-a081-40e8cf85d547\",\"c06f1557-8c66-44c1-8dc2-dad782d2f597\",\"fdda3d75-68aa-4dc9-bcf4-171f28668b4e\",\"1adedfb2-6a4c-4774-8dd9-99216dca81d9\",\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-06-Location access permission","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.174000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91970b4b-d060-46b2-bbd3-d8042def443a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91970b4b-d060-46b2-bbd3-d8042def443a
deleted file mode 100644
index 481c945..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91970b4b-d060-46b2-bbd3-d8042def443a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"91970b4b-d060-46b2-bbd3-d8042def443a","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify that not allowed message of password lock\",\"actionId\":\"91970b4b-d060-46b2-bbd3-d8042def443a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"If Set password appear, verify the now allowed message should be appear\",\"actionId\":\"f812196f-28e4-4916-bf71-10b747a4742d\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"For security, set password\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f245ef4a-5426-4439-a120-211db4818ba7\",\"displayText\":\"For security, set password\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/sud_layout_description\",\"text\":\"For security, set password\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":172.0,\"x2\":339.0,\"y2\":211.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":185.5,\"y\":183.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-5.5,\"y\":8.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"f245ef4a-5426-4439-a120-211db4818ba7\",\"firstText\":\"For security, set password\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"For security, set password\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":94.0,\"y1\":172.0,\"x2\":277.0,\"y2\":195.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the message -Ascending, descending, or repeated sequence of digits isn't allowed\",\"actionId\":\"06190448-08e9-4034-8d99-7264dcc70a49\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Ascending, descending, or repeated sequence of digits isn't allowed\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1836718d-ad82-4a16-b23a-4872bfa6a896\",\"displayText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f6b4f8f5-ff1d-4725-99e0-f7ab88e9f83b\",\"displayText\":\"Must contain at least 1 non-numerical character\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/description_text\",\"text\":\"Must contain at least 1 non-numerical character\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":291.6666666666667,\"x2\":339.0,\"y2\":308.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Must contain at least 1 non-numerical character\"},{\"uuid\":\"443bcc65-710d-40b1-b8a6-72f30b4ca542\",\"displayText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/description_text\",\"text\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":308.6666666666667,\"x2\":339.0,\"y2\":340.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.5,\"y\":-2.1666666666666288,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\"}],\"className\":\"androidx.recyclerview.widget.RecyclerView\",\"resourceId\":\"com.android.settings:id/password_requirements_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":291.6666666666667,\"x2\":339.0,\"y2\":340.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":182.5,\"y\":326.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.5,\"y\":-10.666666666666629,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"443bcc65-710d-40b1-b8a6-72f30b4ca542\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":32.0,\"y1\":314.0,\"x2\":333.0,\"y2\":339.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the message-Must contain at least 1 non-numerical character\",\"actionId\":\"3bc67fff-8ae2-45ae-b39a-e8c191749f77\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Must contain at least 1 non-numerical character\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6ae5e575-634e-43b9-92d1-6e0724a434eb\",\"displayText\":\"Must contain at least 1 non-numerical character\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"4239a0d9-4d20-499b-bd25-f89a6ed8733b\",\"displayText\":\"Must contain at least 1 non-numerical character\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/description_text\",\"text\":\"Must contain at least 1 non-numerical character\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":291.6666666666667,\"x2\":339.0,\"y2\":308.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":5.0,\"y\":1.6666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Must contain at least 1 non-numerical character\"},{\"uuid\":\"3b235603-41fc-4814-aa81-473f7f334e1b\",\"displayText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/description_text\",\"text\":\"Ascending, descending, or repeated sequence of digits isn't allowed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":308.6666666666667,\"x2\":339.0,\"y2\":340.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Ascending, descending, or repeated sequence of digits isn't allowed\"}],\"className\":\"androidx.recyclerview.widget.RecyclerView\",\"resourceId\":\"com.android.settings:id/password_requirements_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":291.6666666666667,\"x2\":339.0,\"y2\":340.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":175.0,\"y\":298.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":5.0,\"y\":17.33333333333337,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"4239a0d9-4d20-499b-bd25-f89a6ed8733b\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Must contain at least 1 non-numerical character\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":31.0,\"y1\":291.0,\"x2\":319.0,\"y2\":306.0}}],\"childrenIdList\":[\"f812196f-28e4-4916-bf71-10b747a4742d\",\"06190448-08e9-4034-8d99-7264dcc70a49\",\"3bc67fff-8ae2-45ae-b39a-e8c191749f77\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify that not allowed message of password lock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.261000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91ab1016-e46b-4681-802a-30de34592081 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91ab1016-e46b-4681-802a-30de34592081
deleted file mode 100644
index 4846ad8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91ab1016-e46b-4681-802a-30de34592081
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"91ab1016-e46b-4681-802a-30de34592081","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Set Org\\\" button\",\"actionId\":\"91ab1016-e46b-4681-802a-30de34592081\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Org\",\"actionId\":\"0c3bd2a9-f3ee-49f0-a8be-f9e83ac6d5e5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set Org\"}],\"childrenIdList\":[\"0c3bd2a9-f3ee-49f0-a8be-f9e83ac6d5e5\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Set Org\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.190000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91b86fe0-4aca-4858-9bc1-ed4be34940fa b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91b86fe0-4aca-4858-9bc1-ed4be34940fa
deleted file mode 100644
index 2df53ca..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/91b86fe0-4aca-4858-9bc1-ed4be34940fa
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"91b86fe0-4aca-4858-9bc1-ed4be34940fa","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Open Settings\\\" button\",\"actionId\":\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Open Settings\",\"actionId\":\"a2933edb-d5a3-4ed0-87b6-e7fd8414012c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Open Settings\"}],\"childrenIdList\":[\"a2933edb-d5a3-4ed0-87b6-e7fd8414012c\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Open Settings\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.170000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/935be38e-341a-455b-a52d-709e620f3641 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/935be38e-341a-455b-a52d-709e620f3641
deleted file mode 100644
index e054c14..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/935be38e-341a-455b-a52d-709e620f3641
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"935be38e-341a-455b-a52d-709e620f3641","details":"{\"type\":\"CompoundAction\",\"name\":\"test-Keyguard Password Verification\",\"actionId\":\"935be38e-341a-455b-a52d-709e620f3641\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Keyguard Password Verification\",\"actionId\":\"97c40e2e-07d3-4764-b014-bffb80eadc56\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Keyguard Password Verification\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"23e1f551-ef56-4fb7-a542-bbbb6baeaebd\",\"displayText\":\"Keyguard Password Verification\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Keyguard Password Verification\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":455.3333333333333,\"x2\":351.3333333333333,\"y2\":497.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":114.5,\"y\":481.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":65.5,\"y\":-4.666666666666686,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"23e1f551-ef56-4fb7-a542-bbbb6baeaebd\",\"firstText\":\"Keyguard Password Verification\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Keyguard Password Verification\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":468.0,\"x2\":225.0,\"y2\":494.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Keyguard Password Verification\",\"actionId\":\"bc27a09d-a588-4399-a068-c5d1df241393\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Keyguard Password Verification\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set password button\",\"actionId\":\"3575c64a-8599-48b1-adca-775bf2c992cb\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/lock_set_btn\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Change password button\",\"actionId\":\"b1bb3dbe-afd2-4fbf-a5f0-e43db41b6bcd\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/lock_change_btn\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if lock screen appear\",\"actionId\":\"804bb5dc-95ea-4900-8ac5-32cee98977cf\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Re-enter your PIN\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Re-enter your password\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Confirm your pattern\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, change password\",\"actionId\":\"422753a2-bc8f-4815-8192-b1a39a086e5c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/lock_change_btn\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, None\",\"actionId\":\"8863d0ec-1da8-4d2a-a6ec-04e029094b20\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"None\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, yes, remove button\",\"actionId\":\"9de52c9f-1443-4c57-9ce0-dadc002e0a3f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"97c40e2e-07d3-4764-b014-bffb80eadc56\",\"bc27a09d-a588-4399-a068-c5d1df241393\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"3575c64a-8599-48b1-adca-775bf2c992cb\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"796b7e21-e7e7-4631-8bc3-72894b072e96\",\"06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a\",\"2090e04a-10af-4fc3-8149-1f22a584eb67\",\"b1bb3dbe-afd2-4fbf-a5f0-e43db41b6bcd\",\"804bb5dc-95ea-4900-8ac5-32cee98977cf\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"796b7e21-e7e7-4631-8bc3-72894b072e96\",\"0bb19e90-9994-4d49-9188-fe2405a8dc37\",\"06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a\",\"422753a2-bc8f-4815-8192-b1a39a086e5c\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"bc9471bc-a314-40a4-952b-24a9d2db4974\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"8863d0ec-1da8-4d2a-a6ec-04e029094b20\",\"9de52c9f-1443-4c57-9ce0-dadc002e0a3f\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test-Keyguard Password Verification","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.251000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/96e13653-8ab0-44a3-9bed-ddd32181cd28 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/96e13653-8ab0-44a3-9bed-ddd32181cd28
deleted file mode 100644
index 459bac2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/96e13653-8ab0-44a3-9bed-ddd32181cd28
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"96e13653-8ab0-44a3-9bed-ddd32181cd28","details":"{\"type\":\"CompoundAction\",\"name\":\"15-27-Set permitted accessibility services\",\"actionId\":\"96e13653-8ab0-44a3-9bed-ddd32181cd28\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"a67e968f-ab80-4c16-87c6-76e7c22da2b7\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-27-Set permitted accessibility services","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.161000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/96f52bf6-6606-42ab-8b3a-fd6c554ea30a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/96f52bf6-6606-42ab-8b3a-fd6c554ea30a
deleted file mode 100644
index c96b831..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/96f52bf6-6606-42ab-8b3a-fd6c554ea30a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"96f52bf6-6606-42ab-8b3a-fd6c554ea30a","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn Stay awake on\",\"actionId\":\"96f52bf6-6606-42ab-8b3a-fd6c554ea30a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Turn Stay awake on\",\"actionId\":\"58d19180-f71a-49a7-a58c-d6f0e143fb10\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell settings put global stay_on_while_plugged_in 7\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"58d19180-f71a-49a7-a58c-d6f0e143fb10\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn Stay awake on","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.276000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/97168770-8a71-4ad5-b1a3-6fad42f11159 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/97168770-8a71-4ad5-b1a3-6fad42f11159
deleted file mode 100644
index 66b46e8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/97168770-8a71-4ad5-b1a3-6fad42f11159
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"97168770-8a71-4ad5-b1a3-6fad42f11159","details":"{\"type\":\"CompoundAction\",\"name\":\"16-09-Default apps\",\"actionId\":\"97168770-8a71-4ad5-b1a3-6fad42f11159\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Default apps\",\"actionId\":\"be60afb3-34f2-4750-b058-6c7208b38b9f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Default apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"2405b8a1-ed53-4757-bd8b-7c64f12e5027\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Default apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":367.0,\"x2\":351.25,\"y2\":409.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":53.0,\"y\":388.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":127.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"2405b8a1-ed53-4757-bd8b-7c64f12e5027\",\"firstText\":\"Default apps\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Default apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":379.0,\"x2\":104.0,\"y2\":397.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Default apps\",\"actionId\":\"774601e9-9efc-4653-bc75-9ae6345afc25\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Default apps\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told that your administrator set any default apps\",\"actionId\":\"b7bf508a-5f4e-406f-b51c-093e00d487a6\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Default apps\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1c0eed75-23fc-4f0f-9600-e91ef7d1bf54\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"fa2a88bb-468f-4b14-b39c-21224e1ece8b\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a63d10a7-18f9-441c-b071-737d416286c1\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Default apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":142.5,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.25,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default apps\"},{\"uuid\":\"ea2449ed-2ee3-4a1d-ae98-e198b74bb4f6\",\"displayText\":\"6 apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"6 apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":100.0,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"6 apps\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default apps\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":104.0,\"y\":400.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":76.0,\"y\":9.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"a63d10a7-18f9-441c-b071-737d416286c1\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Default apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":386.0,\"x2\":154.0,\"y2\":414.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"82d0c265-8243-4109-90e3-e6cd7940fccc\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Default Apps\",\"actionId\":\"9bb1e820-1185-49a8-8b5f-0fb6a2567a68\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set Default Apps\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told that your administrator has set 6 default apps\",\"actionId\":\"8b89daab-8bd9-4dc6-b416-3c3edb2d47e6\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Default apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a8b2c97d-42f1-464d-b109-9de2faa749db\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"5f5d5e06-ad9b-4e61-bb3f-62a2dbbfdf25\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"9300abeb-84be-42c3-9842-c7580ecaca38\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Default apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":142.5,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.25,\"y\":4.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default apps\"},{\"uuid\":\"785d3334-1f4e-4b9f-9f06-210ea18c4745\",\"displayText\":\"6 apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"6 apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":100.0,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"6 apps\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default apps\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":103.0,\"y\":397.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":77.0,\"y\":12.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"9300abeb-84be-42c3-9842-c7580ecaca38\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Default apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":56.0,\"y1\":387.0,\"x2\":150.0,\"y2\":408.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify has set 6 default apps\",\"actionId\":\"a18d792e-64d9-4ef1-9e05-12e7a5cea577\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"6 apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"49461b06-43dd-44d9-b618-7e2b5d8ab637\",\"displayText\":\"6 apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"d19fc45f-b27f-4f64-aaf8-19e84069f00e\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"01c77e55-0b3b-489e-bb49-0a1a50ac36c8\",\"displayText\":\"Default apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Default apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":142.5,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default apps\"},{\"uuid\":\"6f964019-80c9-4c2e-be60-e1d6f0cf09aa\",\"displayText\":\"6 apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"6 apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":100.0,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.0,\"y\":3.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"6 apps\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default apps\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":78.5,\"y\":416.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":101.5,\"y\":-6.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"6f964019-80c9-4c2e-be60-e1d6f0cf09aa\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"6 apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":48.0,\"y1\":403.0,\"x2\":109.0,\"y2\":429.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Default apps\",\"actionId\":\"a035ab93-8613-4ff4-b9b2-d1d4df91ed0b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Default apps\"},{\"type\":\"PythonScriptAction\",\"name\":\"Verify with 6 elements in it and each elements shows the CTS Verifier is the default app\",\"actionId\":\"3108cfb8-b7ad-440c-9ef5-5cdd8dc72064\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\nuicd_util = UICDPythonUtil()\\nd= Device.create_device_by_slot(0)\\n\\nresult_1 = d.text(\\\"Calendar app\\\").down().text(\\\"CTS Verifier\\\").verify_exist()\\nresult_2 = d.text(\\\"Camera app\\\").down().text(\\\"CTS Verifier\\\").verify_exist()\\nresult_3 = d.text(\\\"Contacts app\\\").down().text(\\\"CTS Verifier\\\").verify_exist()\\nresult_4 = d.text(\\\"Email client app\\\").down().text(\\\"CTS Verifier\\\").verify_exist()\\nresult_5 = d.text(\\\"Map app\\\").down().text(\\\"CTS Verifier\\\").verify_exist()\\nresult_6 = d.text(\\\"Phone app\\\").down().text(\\\"CTS Verifier\\\").verify_exist()\\nuicd_util.assert_true(result_1, \\\"Element not found\\\")\\nuicd_util.assert_true(result_2, \\\"Element not found\\\")\\nuicd_util.assert_true(result_3, \\\"Element not found\\\")\\nuicd_util.assert_true(result_4, \\\"Element not found\\\")\\nuicd_util.assert_true(result_5, \\\"Element not found\\\")\\nuicd_util.assert_true(result_6, \\\"Element not found\\\")\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"748699ae-b36c-491f-949d-238c82971cc3\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"0551a398-f877-4cdf-a8e2-14f6dc45385c\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"be60afb3-34f2-4750-b058-6c7208b38b9f\",\"774601e9-9efc-4653-bc75-9ae6345afc25\",\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"b7bf508a-5f4e-406f-b51c-093e00d487a6\",\"82d0c265-8243-4109-90e3-e6cd7940fccc\",\"9bb1e820-1185-49a8-8b5f-0fb6a2567a68\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"8b89daab-8bd9-4dc6-b416-3c3edb2d47e6\",\"a18d792e-64d9-4ef1-9e05-12e7a5cea577\",\"a035ab93-8613-4ff4-b9b2-d1d4df91ed0b\",\"3108cfb8-b7ad-440c-9ef5-5cdd8dc72064\",\"748699ae-b36c-491f-949d-238c82971cc3\",\"0551a398-f877-4cdf-a8e2-14f6dc45385c\",\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-09-Default apps","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.181000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/97af8f29-fc99-451c-a57b-81f59621b304 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/97af8f29-fc99-451c-a57b-81f59621b304
deleted file mode 100644
index 0976b03..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/97af8f29-fc99-451c-a57b-81f59621b304
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"97af8f29-fc99-451c-a57b-81f59621b304","details":"{\"type\":\"CompoundAction\",\"name\":\"15-20 Disallow config screen timeout\",\"actionId\":\"97af8f29-fc99-451c-a57b-81f59621b304\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"ddbc4d31-a035-4eec-814a-def0efb2bfa5\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-20 Disallow config screen timeout","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.149000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/992e890c-3aa6-43e1-9940-2a9f042811d6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/992e890c-3aa6-43e1-9940-2a9f042811d6
deleted file mode 100644
index e6d46fd..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/992e890c-3aa6-43e1-9940-2a9f042811d6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"992e890c-3aa6-43e1-9940-2a9f042811d6","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Set New Password Complexity Test\",\"actionId\":\"992e890c-3aa6-43e1-9940-2a9f042811d6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Set New Password Complexity Test\",\"actionId\":\"22752d5b-b559-47cb-9990-ca30abe64cd1\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set New Password Complexity Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"39efbd7b-1857-475b-90e8-d7a6b4d14f89\",\"displayText\":\"Set New Password Complexity Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Set New Password Complexity Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":443.3333333333333,\"x2\":351.3333333333333,\"y2\":485.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":122.0,\"y\":468.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":58.0,\"y\":-4.166666666666686,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"39efbd7b-1857-475b-90e8-d7a6b4d14f89\",\"firstText\":\"Set New Password Complexity Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set New Password Complexity Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":460.0,\"x2\":234.0,\"y2\":477.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set New Password Complexity Test\",\"actionId\":\"e37b19b5-9283-460b-9b22-7c7a71bc098f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set New Password Complexity Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/set_complexity_high_btn\",\"actionId\":\"ebfcc6f5-ad0a-4b84-9872-d044962310b8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_complexity_high_btn\"},{\"type\":\"InputAction\",\"name\":\"INPUT number \\\"11111111\\\"\",\"actionId\":\"bd803b0a-e2a5-4062-9df8-c359782d6b00\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"11111111\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/set_complexity_medium_btn\",\"actionId\":\"d31797fa-1f42-47f0-a26f-9996966fc861\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_complexity_medium_btn\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/set_complexity_low_btn\",\"actionId\":\"2fc9c1d3-fd70-4d12-b578-38055ab535fc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_complexity_low_btn\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/set_complexity_none_btn\",\"actionId\":\"a1f5a109-ba3d-439a-bd05-d3cafd513dcf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_complexity_none_btn\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, None\",\"actionId\":\"b835601a-7cb9-4405-93ef-71854d1dfe0f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"None\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, yes, remove button\",\"actionId\":\"b4ee13f7-566d-4a26-b351-92da70f324c4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"22752d5b-b559-47cb-9990-ca30abe64cd1\",\"e37b19b5-9283-460b-9b22-7c7a71bc098f\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"ebfcc6f5-ad0a-4b84-9872-d044962310b8\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"0e190c32-3e45-4bd4-8d81-8eab2da1758e\",\"bd803b0a-e2a5-4062-9df8-c359782d6b00\",\"91970b4b-d060-46b2-bbd3-d8042def443a\",\"2b20f950-6cf8-4040-93c8-a51819425441\",\"c3259a91-454a-42a5-b169-2d282d70f076\",\"675d3384-df03-4693-9846-646f622b5ce0\",\"7966cf53-7a34-44cc-9193-2c7dd347fe81\",\"d31797fa-1f42-47f0-a26f-9996966fc861\",\"ffe766f2-11f5-449d-9b89-e5ff06f5a835\",\"8539b68d-cf4f-4158-aeb6-2867807e7574\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"0e190c32-3e45-4bd4-8d81-8eab2da1758e\",\"b9e13d9a-43e6-44b0-a3f6-48b3de93d39a\",\"2b20f950-6cf8-4040-93c8-a51819425441\",\"91970b4b-d060-46b2-bbd3-d8042def443a\",\"c3259a91-454a-42a5-b169-2d282d70f076\",\"2c2679b8-694c-4f76-9e68-e769699ab06a\",\"f9ed0da0-0e19-4117-8b66-467e80d9285c\",\"2fc9c1d3-fd70-4d12-b578-38055ab535fc\",\"67230d49-da52-4a23-a712-504be0de8619\",\"658953ad-c875-417b-87a1-5c75ca2fff86\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"796b7e21-e7e7-4631-8bc3-72894b072e96\",\"0bb19e90-9994-4d49-9188-fe2405a8dc37\",\"06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a\",\"a1f5a109-ba3d-439a-bd05-d3cafd513dcf\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"bc9471bc-a314-40a4-952b-24a9d2db4974\",\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"b835601a-7cb9-4405-93ef-71854d1dfe0f\",\"b4ee13f7-566d-4a26-b351-92da70f324c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Set New Password Complexity Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.260000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9a43346d-fd4d-4892-8938-bb911c5f1fff b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9a43346d-fd4d-4892-8938-bb911c5f1fff
deleted file mode 100644
index 571d642..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9a43346d-fd4d-4892-8938-bb911c5f1fff
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"9a43346d-fd4d-4892-8938-bb911c5f1fff","details":"{\"type\":\"CompoundAction\",\"name\":\"New_15_Open app cross profiles from the work side\",\"actionId\":\"9a43346d-fd4d-4892-8938-bb911c5f1fff\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Open app cross profiles from the work side\",\"actionId\":\"f3272c50-2f14-4311-ad4a-40dff01a5691\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Open app cross profiles from the work side\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b11902b7-0e29-4bd8-9037-f96a1b113632\",\"displayText\":\"Open app cross profiles from the personal side\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Open app cross profiles from the personal side\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":469.0,\"x2\":360.0,\"y2\":513.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":167.0,\"y\":493.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":13.0,\"y\":-2.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"b11902b7-0e29-4bd8-9037-f96a1b113632\",\"firstText\":\"Open app cross profiles from the personal side\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Open app cross profiles from the work side\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":481.0,\"x2\":329.0,\"y2\":506.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Open app cross profiles from the work side\",\"actionId\":\"1f52c8bd-c0c9-49ac-b230-4049746b2a05\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Open app cross profiles from the work side\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work\",\"actionId\":\"9b33ec2c-9960-4b45-a12a-8b4a5ad0c182\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"08a9f591-a700-42fe-8926-f3e7ceed75d3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"},{\"type\":\"ConditionValidationAction\",\"name\":\"You selected the ctsverifier option\",\"actionId\":\"f3a2a9a6-8600-4cfb-9ab9-94492d626560\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"You selected the ctsverifier option\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button_finish\",\"actionId\":\"c3e2dd64-e8a4-4a32-aee9-6015ba2b8e2c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/button_finish\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Personal\",\"actionId\":\"898fcff4-c182-40db-a667-54e7167b19f1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Personal\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"f3a6e155-5e47-4887-991b-863e87ea2838\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"},{\"type\":\"ConditionValidationAction\",\"name\":\"You selected the personal option.\",\"actionId\":\"612a9e09-a6e5-4fb9-ac41-b15ff189dff4\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"You selected the personal option.\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button_finish\",\"actionId\":\"3e52e7cf-7d71-4cd6-9782-978e70c859bd\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/button_finish\"}],\"childrenIdList\":[\"ddb13fe9-0508-4af0-b71e-ef96fc1f518a\",\"f3272c50-2f14-4311-ad4a-40dff01a5691\",\"1f52c8bd-c0c9-49ac-b230-4049746b2a05\",\"dd4aaec7-a59b-4646-8cc4-039a19853f62\",\"9b33ec2c-9960-4b45-a12a-8b4a5ad0c182\",\"08a9f591-a700-42fe-8926-f3e7ceed75d3\",\"f3a2a9a6-8600-4cfb-9ab9-94492d626560\",\"c3e2dd64-e8a4-4a32-aee9-6015ba2b8e2c\",\"dd4aaec7-a59b-4646-8cc4-039a19853f62\",\"898fcff4-c182-40db-a667-54e7167b19f1\",\"f3a6e155-5e47-4887-991b-863e87ea2838\",\"612a9e09-a6e5-4fb9-ac41-b15ff189dff4\",\"3e52e7cf-7d71-4cd6-9782-978e70c859bd\",\"18b49457-9342-4842-aee7-3a76bd7dbedc\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"New_15_Open app cross profiles from the work side","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.317000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9b9343fa-a795-4169-883b-32dca700c4b6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9b9343fa-a795-4169-883b-32dca700c4b6
deleted file mode 100644
index 51358d0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9b9343fa-a795-4169-883b-32dca700c4b6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"9b9343fa-a795-4169-883b-32dca700c4b6","details":"{\"type\":\"CompoundAction\",\"name\":\"Tap center of screen\",\"actionId\":\"9b9343fa-a795-4169-883b-32dca700c4b6\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Tap center of screen\",\"actionId\":\"c2e6ab14-ab06-4d4b-91ac-f51063f01d24\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\n\\ncenter_1 = d.info()['dimension_x']/2\\ncenter_2 = d.info()['dimension_y']/2\\nd.click(center_1,center_2)\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"c2e6ab14-ab06-4d4b-91ac-f51063f01d24\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Tap center of screen","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.064000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9be89845-047e-4ef4-98dc-caa8cd186c76 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9be89845-047e-4ef4-98dc-caa8cd186c76
deleted file mode 100644
index a2ab6f3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9be89845-047e-4ef4-98dc-caa8cd186c76
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"9be89845-047e-4ef4-98dc-caa8cd186c76","details":"{\"type\":\"CompoundAction\",\"name\":\"Open Settings\",\"actionId\":\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Open Settings\",\"actionId\":\"bdf5ef81-0243-4873-8895-cbd992d6fc4b\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"shell am start -n com.android.settings/.Settings\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"700c10f3-2945-460b-bc5a-dc5a5fdc0f96\",\"bdf5ef81-0243-4873-8895-cbd992d6fc4b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open Settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.998000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9d556fec-d14c-44d9-870f-0dbfc41ffb86 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9d556fec-d14c-44d9-870f-0dbfc41ffb86
deleted file mode 100644
index fd786df..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9d556fec-d14c-44d9-870f-0dbfc41ffb86
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"9d556fec-d14c-44d9-870f-0dbfc41ffb86","details":"{\"type\":\"CompoundAction\",\"name\":\"15-16-Disallow uninstall apps\",\"actionId\":\"9d556fec-d14c-44d9-870f-0dbfc41ffb86\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow uninstall apps\",\"actionId\":\"cce7c724-2cf5-4776-9bf3-86c491dcd796\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow uninstall apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"34e60958-80e6-4bad-a45f-5dca6387be17\",\"displayText\":\"Disallow uninstall apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow uninstall apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":488.0,\"x2\":360.0,\"y2\":532.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":81.0,\"y\":512.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":99.0,\"y\":-2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"34e60958-80e6-4bad-a45f-5dca6387be17\",\"firstText\":\"Disallow uninstall apps\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow uninstall apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":498.0,\"x2\":159.0,\"y2\":526.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow uninstall apps\",\"actionId\":\"cca1ba48-a894-47b5-afa6-21d2ef28bc8a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow uninstall apps\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to fine CtsPermissionApp\",\"actionId\":\"b1ac511d-9b7b-4a48-b600-5fe64dfcc3a4\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CtsPermissionApp\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4aedd429-23ff-4399-bdc4-ec946dfcefaf\",\"displayText\":\"CtsPermissionApp\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2760e551-5653-4bb3-8d8f-79e42d2c8caf\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ceede705-0d2b-4b3f-a5dd-8ed552880815\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":510.6666666666667,\"x2\":44.0,\"y2\":540.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":507.0,\"x2\":66.0,\"y2\":543.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"43edbd1e-6ec0-416b-a3af-08b14dceaffc\",\"displayText\":\"CtsPermissionApp\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f7f9cc52-8027-4643-b41b-8c37b0171ca3\",\"displayText\":\"CtsPermissionApp\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"CtsPermissionApp\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":506.6666666666667,\"x2\":188.33333333333334,\"y2\":526.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.8333333333333286,\"y\":2.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"CtsPermissionApp\"},{\"uuid\":\"4f97cc1f-4832-4645-85f4-32af1a2474d8\",\"displayText\":\"92.67 kB\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"92.67 kB\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":526.3333333333334,\"x2\":345.3333333333333,\"y2\":544.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"92.67 kB\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":492.0,\"x2\":345.3333333333333,\"y2\":558.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"CtsPermissionApp\"}],\"className\":\"android.widget.LinearLayout\",\"contentDesc\":\"CtsPermissionApp\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":492.0,\"x2\":360.0,\"y2\":558.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":131.0,\"y\":514.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":49.0,\"y\":11.333333333333258,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"f7f9cc52-8027-4643-b41b-8c37b0171ca3\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CtsPermissionApp\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":65.0,\"y1\":497.0,\"x2\":197.0,\"y2\":531.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, CtsPermissionApp\",\"actionId\":\"996b4172-2413-4746-a6af-703bc1f0dd8a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CtsPermissionApp\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, uninstall button\",\"actionId\":\"81fcb024-74cd-4017-9a5b-1b6d22705a0a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button2\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"cce7c724-2cf5-4776-9bf3-86c491dcd796\",\"cca1ba48-a894-47b5-afa6-21d2ef28bc8a\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"b1ac511d-9b7b-4a48-b600-5fe64dfcc3a4\",\"996b4172-2413-4746-a6af-703bc1f0dd8a\",\"81fcb024-74cd-4017-9a5b-1b6d22705a0a\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-16-Disallow uninstall apps","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.144000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9e63b2da-d744-4a93-907f-3486c60407cb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9e63b2da-d744-4a93-907f-3486c60407cb
deleted file mode 100644
index 29d4ca6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/9e63b2da-d744-4a93-907f-3486c60407cb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"9e63b2da-d744-4a93-907f-3486c60407cb","details":"{\"type\":\"CompoundAction\",\"name\":\"05_Work status icon is displayed\",\"actionId\":\"9e63b2da-d744-4a93-907f-3486c60407cb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Work status icon is displayed\",\"actionId\":\"3bbc4c1a-fbfe-4b2a-a65d-bfe791d1e5cb\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Work status icon is displayed\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"824bc59e-2db5-4347-ada3-98c82dac2bfa\",\"displayText\":\"Work status icon is displayed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Work status icon is displayed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":482.6666666666667,\"x2\":360.0,\"y2\":524.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":108.0,\"y\":507.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":72.0,\"y\":-3.3333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"824bc59e-2db5-4347-ada3-98c82dac2bfa\",\"firstText\":\"Work status icon is displayed\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Work status icon is displayed\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":208.0,\"y1\":516.0,\"x2\":8.0,\"y2\":498.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work status icon is displayed\",\"actionId\":\"9ff295af-5b07-4e7f-9a0b-f0adedaceed8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work status icon is displayed\"},{\"type\":\"PythonScriptAction\",\"name\":\"Check Work status icon is displayed\",\"actionId\":\"cdf96096-d8d5-423e-bb32-d688a89ac86a\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\n\\nuicd_util = UICDPythonUtil()\\nd = Device.create_device_by_slot(0)\\nresult = d.resource_id(\\\"com.android.systemui:id/statusIcons\\\").content_desc(\\\"Work profile\\\").verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button_finish\",\"actionId\":\"b9b69fa4-bf14-4cea-a7f1-b83601acfc71\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/button_finish\"}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"3bbc4c1a-fbfe-4b2a-a65d-bfe791d1e5cb\",\"9ff295af-5b07-4e7f-9a0b-f0adedaceed8\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"cdf96096-d8d5-423e-bb32-d688a89ac86a\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"b9b69fa4-bf14-4cea-a7f1-b83601acfc71\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"05_Work status icon is displayed","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.295000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a0835500-a2a2-4908-a93e-522b12c44507 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a0835500-a2a2-4908-a93e-522b12c44507
deleted file mode 100644
index e7a98d2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a0835500-a2a2-4908-a93e-522b12c44507
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a0835500-a2a2-4908-a93e-522b12c44507","details":"{\"type\":\"CompoundAction\",\"name\":\"15-18 Disallow config location\",\"actionId\":\"a0835500-a2a2-4908-a93e-522b12c44507\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-18 Disallow config location","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.146000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a0c5135b-fa0e-4dc2-99be-662638d5c19e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a0c5135b-fa0e-4dc2-99be-662638d5c19e
deleted file mode 100644
index 6a3df62..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a0c5135b-fa0e-4dc2-99be-662638d5c19e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a0c5135b-fa0e-4dc2-99be-662638d5c19e","details":"{\"type\":\"CompoundAction\",\"name\":\"test_VR Tests\",\"actionId\":\"a0c5135b-fa0e-4dc2-99be-662638d5c19e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to \\\"VR Tests\\\"\",\"actionId\":\"13b60322-d097-4ee3-9d25-397d33740979\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"VR Tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"505c5bdf-4484-41c6-a044-9fd4d5c32147\",\"isUniqueResourceId\":false,\"children\":[],\"checked\":false,\"isCheckableNode\":false,\"isClickableNode\":false,\"enabled\":false,\"bounds\":{\"x1\":61.5,\"y1\":705.5,\"x2\":61.5,\"y2\":705.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":61.5,\"y\":705.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":61.5,\"y\":705.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":true,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"VR Tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":693.0,\"x2\":119.0,\"y2\":718.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, VR Tests\",\"actionId\":\"0a258629-6d59-4ec3-873b-a4a38785df10\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"VR Tests\"},{\"type\":\"PythonScriptAction\",\"name\":\"Enable VR helper services\",\"actionId\":\"5c08fa84-bef8-4f86-9906-6202f952bc2c\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"Press Allow\",\"actionId\":\"c430674b-d2bd-44a1-94ba-0234cf0d4843\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"Press allow VR Listener for CTS Verifier\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/button1\"}]},\"clickAfterValidation\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ba5f57ad-fd63-4886-9171-e5311e37c5e0\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT - 10 sec\",\"actionId\":\"be53c4c8-c188-499c-ac21-a1a647803586\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"pololee\"},{\"type\":\"WaitAction\",\"name\":\"WAIT - 15 sec\",\"actionId\":\"88921366-c372-4345-97e7-0e530d2120f4\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"pololee\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier to disable VR Listener\",\"actionId\":\"0167402d-49a9-4259-b2dd-4c651ada299f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"337ba925-c52f-43d7-a4fe-c7f714507221\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"13b60322-d097-4ee3-9d25-397d33740979\",\"0a258629-6d59-4ec3-873b-a4a38785df10\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"04292ddc-e958-49b5-8fd7-a4dd0cf8ff43\",\"5c08fa84-bef8-4f86-9906-6202f952bc2c\",\"c430674b-d2bd-44a1-94ba-0234cf0d4843\",\"ba5f57ad-fd63-4886-9171-e5311e37c5e0\",\"04292ddc-e958-49b5-8fd7-a4dd0cf8ff43\",\"be53c4c8-c188-499c-ac21-a1a647803586\",\"04292ddc-e958-49b5-8fd7-a4dd0cf8ff43\",\"88921366-c372-4345-97e7-0e530d2120f4\",\"04292ddc-e958-49b5-8fd7-a4dd0cf8ff43\",\"0167402d-49a9-4259-b2dd-4c651ada299f\",\"337ba925-c52f-43d7-a4fe-c7f714507221\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_VR Tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.285000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a1add8e6-5408-417e-942b-2663863fcdd6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a1add8e6-5408-417e-942b-2663863fcdd6
deleted file mode 100644
index 2cddf0a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a1add8e6-5408-417e-942b-2663863fcdd6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a1add8e6-5408-417e-942b-2663863fcdd6","details":"{\"type\":\"CompoundAction\",\"name\":\"15-17 & 17-06-08-Disallow config date time\",\"actionId\":\"a1add8e6-5408-417e-942b-2663863fcdd6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config date time\",\"actionId\":\"89cddcfd-7c74-4eb8-a159-578cad4bd232\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config date time\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"56bb3d32-7910-4e5d-98b0-9564cbd32135\",\"displayText\":\"Disallow config date time\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config date time\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":533.0,\"x2\":360.0,\"y2\":577.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":556.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":-1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"56bb3d32-7910-4e5d-98b0-9564cbd32135\",\"firstText\":\"Disallow config date time\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config date time\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":1.0,\"y1\":541.0,\"x2\":175.0,\"y2\":571.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config date time\",\"actionId\":\"55bb29d4-417f-4230-9d61-00f334cf3a93\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config date time\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Use network-provided time\",\"actionId\":\"992fb836-0ae2-4d18-bac6-018cc8b79e88\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Use network-provided time\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b651d2e6-761d-4986-9744-da3fda40c5fb\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"226d392f-1b52-412d-875d-26c8d373c88e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"89cddcfd-7c74-4eb8-a159-578cad4bd232\",\"55bb29d4-417f-4230-9d61-00f334cf3a93\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"992fb836-0ae2-4d18-bac6-018cc8b79e88\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"b651d2e6-761d-4986-9744-da3fda40c5fb\",\"226d392f-1b52-412d-875d-26c8d373c88e\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-17 & 17-06-08-Disallow config date time","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.146000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a28853a0-0f2d-4148-807e-1387a6a31d3a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a28853a0-0f2d-4148-807e-1387a6a31d3a
deleted file mode 100644
index bf7649d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a28853a0-0f2d-4148-807e-1387a6a31d3a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a28853a0-0f2d-4148-807e-1387a6a31d3a","details":"{\"type\":\"CompoundAction\",\"name\":\"16-15-Quick settings disclosure\",\"actionId\":\"a28853a0-0f2d-4148-807e-1387a6a31d3a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Quick settings disclosure\",\"actionId\":\"d2247f32-bc99-43a5-b052-777c63392102\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Quick settings disclosure\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"48559b89-ebb9-42dc-b6ad-ac20e4bc4e8a\",\"displayText\":\"Quick settings disclosure\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Quick settings disclosure\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":566.0,\"x2\":351.3333333333333,\"y2\":608.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":105.5,\"y\":589.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":74.5,\"y\":-2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"48559b89-ebb9-42dc-b6ad-ac20e4bc4e8a\",\"firstText\":\"Quick settings disclosure\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Quick settings disclosure\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":573.0,\"x2\":203.0,\"y2\":605.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Quick settings disclosure\",\"actionId\":\"6e8723b8-1dbb-47ea-ad2b-167f033ab810\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Quick settings disclosure\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that at the bottom of Quick Settings you are told the device is managed\",\"actionId\":\"4e0b91d1-fe47-4ccc-b185-165903a0edde\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"This device belongs to your organization\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a7a7ee21-ccb4-4d3b-b98d-36c047cce394\",\"displayText\":\"This device belongs to your organization\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"407e0c64-a07e-4e80-b682-fdb7f26fcc10\",\"displayText\":\"This device belongs to your organization\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/footer_text\",\"text\":\"This device belongs to your organization\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":73.66666666666667,\"y1\":366.6666666666667,\"x2\":265.3333333333333,\"y2\":381.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.5,\"y\":3.3333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"This device belongs to your organization\"},{\"uuid\":\"33b372e8-5734-4f08-92d2-49c4a3d27837\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.systemui:id/footer_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":272.3333333333333,\"y1\":366.6666666666667,\"x2\":286.3333333333333,\"y2\":380.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":59.666666666666664,\"y1\":354.3333333333333,\"x2\":300.3333333333333,\"y2\":393.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":169.0,\"y\":370.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":11.0,\"y\":3.3333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"407e0c64-a07e-4e80-b682-fdb7f26fcc10\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This device belongs to your organization\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":67.0,\"y1\":354.0,\"x2\":271.0,\"y2\":387.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that at the bottom of Quick Settings, you are told the device is managed by \\\"Foo, Inc\\\"\",\"actionId\":\"a86a9465-a6e4-4c7a-9db0-b210599cdba2\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"This device belongs to Foo, Inc.\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a11be856-59db-4ae5-9294-25086cfcebed\",\"displayText\":\"This device belongs to Foo, Inc.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"52433a5f-539d-4975-afa0-a73d991dcf75\",\"displayText\":\"This device belongs to Foo, Inc.\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/footer_text\",\"text\":\"This device belongs to Foo, Inc.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":95.33333333333333,\"y1\":366.6666666666667,\"x2\":243.33333333333334,\"y2\":381.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":5.833333333333343,\"y\":1.3333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"This device belongs to Foo, Inc.\"},{\"uuid\":\"45dee6fc-546c-4929-9bfb-c356e8b54be9\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.systemui:id/footer_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":250.33333333333334,\"y1\":366.6666666666667,\"x2\":264.3333333333333,\"y2\":380.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":81.33333333333333,\"y1\":354.3333333333333,\"x2\":278.3333333333333,\"y2\":393.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":163.5,\"y\":372.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":16.333333333333314,\"y\":1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"52433a5f-539d-4975-afa0-a73d991dcf75\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This device belongs to Foo, Inc.\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":80.0,\"y1\":360.0,\"x2\":247.0,\"y2\":385.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, click \\\"This device belongs to Foo, Inc.\\\"\",\"actionId\":\"0f4d21d9-a38d-40f0-9a74-f91ea93896d8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"This device belongs to Foo, Inc.\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that a dialog informing you about device monitoring opens\",\"actionId\":\"9f86c41a-da8c-4d20-bdc2-c6a6907999dd\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"This device belongs to Foo, Inc..\\n\\nYour IT admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device's location information.\\n\\nFor more information, contact your IT admin.\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"efcc99e0-fc18-4e80-9d19-96846e7da517\",\"displayText\":\"This device belongs to Foo, Inc..\\n\\nYour IT admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device's location information.\\n\\nFor more information, contact your IT admin.\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"2a37ea76-6a5c-41aa-9395-e8439d9a75de\",\"displayText\":\"Device management\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/device_management_subtitle\",\"text\":\"Device management\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":35.0,\"y1\":278.3333333333333,\"x2\":325.0,\"y2\":319.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Device management\"},{\"uuid\":\"3d1e7689-f30a-4b69-a0c8-ddcf3949eb91\",\"displayText\":\"This device belongs to Foo, Inc..\\n\\nYour IT admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device's location information.\\n\\nFor more information, contact your IT admin.\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/device_management_warning\",\"text\":\"This device belongs to Foo, Inc..\\n\\nYour IT admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device's location information.\\n\\nFor more information, contact your IT admin.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":35.0,\"y1\":319.6666666666667,\"x2\":325.0,\"y2\":453.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":6.0,\"y\":-58.66666666666663,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"This device belongs to Foo, Inc..\\n\\nYour IT admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device's location information.\\n\\nFor more information, contact your IT admin.\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/device_management_disclosures\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":35.0,\"y1\":278.3333333333333,\"x2\":325.0,\"y2\":474.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":174.0,\"y\":445.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":6.0,\"y\":-68.83333333333337,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"3d1e7689-f30a-4b69-a0c8-ddcf3949eb91\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This device belongs to Foo, Inc..\\n\\nYour IT admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device's location information.\\n\\nFor more information, contact your IT admin.\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":32.0,\"y1\":433.0,\"x2\":316.0,\"y2\":457.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, view Policies\",\"actionId\":\"0f34f0bf-7f60-4a07-a489-010fb7489b5e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button2\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that a screen informing you what your managing organization can do is shown\",\"actionId\":\"bbd7aa85-02e9-4860-a762-0c58451ad617\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Managed device info\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"955f23d4-e140-4271-bcfa-952f7492f4c7\",\"displayText\":\"Managed device info\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"a5b40732-49f3-4ea6-bd05-f05ee2dd445e\",\"displayText\":\"Navigate up\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageButton\",\"contentDesc\":\"Navigate up\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":48.333333333333336,\"x2\":49.0,\"y2\":97.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Navigate up\"},{\"uuid\":\"edb1ed97-b0e2-47a1-865a-43233c36fd4b\",\"displayText\":\"Managed device info\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Managed device info\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":61.0,\"x2\":234.0,\"y2\":84.66666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.5,\"y\":-0.6666666666666572,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Managed device info\"},{\"uuid\":\"4234266a-b5be-467a-920a-6f8ef5257fa0\",\"displayText\":\"Search settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"76bc2ca6-1cbc-4fd3-bcf4-69f52a37f44e\",\"displayText\":\"Search settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"contentDesc\":\"Search settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":276.0,\"y1\":51.666666666666664,\"x2\":318.0,\"y2\":93.66666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Search settings\"},{\"uuid\":\"69eddb53-7e16-4c08-b68b-e10fd76bca20\",\"displayText\":\"Help & feedback\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"contentDesc\":\"Help & feedback\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":318.0,\"y1\":51.666666666666664,\"x2\":360.0,\"y2\":93.66666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Help & feedback\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":276.0,\"y1\":48.333333333333336,\"x2\":360.0,\"y2\":97.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Search settings\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"com.android.settings:id/action_bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":48.333333333333336,\"x2\":360.0,\"y2\":97.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":153.0,\"y\":73.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":27.0,\"y\":-0.6666666666666714,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"edb1ed97-b0e2-47a1-865a-43233c36fd4b\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Managed device info\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":62.0,\"x2\":252.0,\"y2\":85.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that a screen informing you what your managing organization can do is shown\",\"actionId\":\"d5c84c9d-a3d7-40e5-ad6c-73f782396319\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"40f82272-be41-47fc-8975-0b58bf0e9deb\",\"displayText\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0a59d049-da0f-4283-8bfb-79a59a3243fb\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"1944756e-7e9e-46f6-9708-058ebb3da344\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":568.0,\"x2\":35.0,\"y2\":589.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":554.0,\"x2\":63.0,\"y2\":592.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"20359582-0360-43f7-9b36-d85d3d6f8810\",\"displayText\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":554.0,\"x2\":346.0,\"y2\":656.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":33.5,\"y\":8.666666666666742,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":554.0,\"x2\":360.0,\"y2\":656.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":171.0,\"y\":596.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":9.0,\"y\":8.666666666666742,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"20359582-0360-43f7-9b36-d85d3d6f8810\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"To provide access to your work data, your organization may change settings and install software on your device.\\n\\nFor more details, contact your organization's admin.\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":56.0,\"y1\":575.0,\"x2\":286.0,\"y2\":618.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"dc8ec7bd-8995-439a-a5ce-a9385630bdbe\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"d2247f32-bc99-43a5-b052-777c63392102\",\"6e8723b8-1dbb-47ea-ad2b-167f033ab810\",\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"4e0b91d1-fe47-4ccc-b185-165903a0edde\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"91ab1016-e46b-4681-802a-30de34592081\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"a86a9465-a6e4-4c7a-9db0-b210599cdba2\",\"0f4d21d9-a38d-40f0-9a74-f91ea93896d8\",\"9f86c41a-da8c-4d20-bdc2-c6a6907999dd\",\"0f34f0bf-7f60-4a07-a489-010fb7489b5e\",\"bbd7aa85-02e9-4860-a762-0c58451ad617\",\"d5c84c9d-a3d7-40e5-ad6c-73f782396319\",\"dc8ec7bd-8995-439a-a5ce-a9385630bdbe\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-15-Quick settings disclosure","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.189000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a3737847-5957-4a6a-a50c-242e80b93d8a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a3737847-5957-4a6a-a50c-242e80b93d8a
deleted file mode 100644
index 20c0564..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a3737847-5957-4a6a-a50c-242e80b93d8a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a3737847-5957-4a6a-a50c-242e80b93d8a","details":"{\"type\":\"CompoundAction\",\"name\":\"Check if \\\"Advanced\\\" exists\",\"actionId\":\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Advanced\",\"actionId\":\"aa51540f-a929-447d-b563-259c1cc89cba\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Advanced\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0281d927-72d5-4e4d-b2a4-d5fd2281692d\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"58a1006e-e48f-401c-832c-706631b5312d\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3a43c120-86a0-4b49-8bb3-d18b6c16bd31\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":692.6666666666666,\"x2\":36.666666666666664,\"y2\":714.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":689.0,\"x2\":66.0,\"y2\":718.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"8706fc6f-c3ac-4b91-915c-f65b964db7b2\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a322eb48-1098-4a7d-bbac-0bd53257638d\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Advanced\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":686.0,\"x2\":123.33333333333333,\"y2\":703.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.1666666666666572,\"y\":1.8333333333332575,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Advanced\"},{\"uuid\":\"0b495dc3-a81d-4abd-874c-3928b916497a\",\"displayText\":\"Device admin apps, SIM card lock, Encryption & credentials, Trust agents, App pinning, Confirm SIM deletion\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Device admin apps, SIM card lock, Encryption & credentials, Trust agents, App pinning, Confirm SIM deletion\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":703.6666666666666,\"x2\":345.3333333333333,\"y2\":721.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Device admin apps, SIM card lock, Encryption & credentials, Trust agents, App pinning, Confirm SIM deletion\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":671.3333333333334,\"x2\":345.3333333333333,\"y2\":736.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Advanced\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":671.3333333333334,\"x2\":360.0,\"y2\":736.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":94.5,\"y\":693.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":85.5,\"y\":10.666666666666742,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"a322eb48-1098-4a7d-bbac-0bd53257638d\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Advanced\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":58.0,\"y1\":683.0,\"x2\":131.0,\"y2\":703.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ConditionValidationAction\",\"name\":\"Check if \\\"Advanced\\\" exists\",\"actionId\":\"e09cd4dd-79e2-42e4-baf4-0f07e69ffcc4\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Advanced\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"Click \\\"Advanced\\\"\",\"actionId\":\"3ffa3c2c-475b-4084-ba8a-0132149c2d51\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Advanced\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"aa51540f-a929-447d-b563-259c1cc89cba\",\"e09cd4dd-79e2-42e4-baf4-0f07e69ffcc4\",\"3ffa3c2c-475b-4084-ba8a-0132149c2d51\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Check if \"Advanced\" exists","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.000000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a3c0955c-29f4-4488-af69-d765f068c4ea b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a3c0955c-29f4-4488-af69-d765f068c4ea
deleted file mode 100644
index 949c78f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a3c0955c-29f4-4488-af69-d765f068c4ea
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a3c0955c-29f4-4488-af69-d765f068c4ea","details":"{\"type\":\"CompoundAction\",\"name\":\"test_CA Cert Notification on Boot test\",\"actionId\":\"a3c0955c-29f4-4488-af69-d765f068c4ea\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to CA Cert Notification on Boot test\",\"actionId\":\"221f9022-2e98-49f1-a5b7-5340d6b5b525\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CA Cert Notification on Boot test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"898e321a-76fb-49f8-bf0d-618c12be7ccc\",\"displayText\":\"CA Cert Notification on Boot test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"CA Cert Notification on Boot test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":142.75,\"x2\":351.25,\"y2\":184.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":115.5,\"y\":165.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":64.5,\"y\":-1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"898e321a-76fb-49f8-bf0d-618c12be7ccc\",\"firstText\":\"CA Cert Notification on Boot test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CA Cert Notification on Boot test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":149.0,\"x2\":223.0,\"y2\":181.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, CA Cert Notification on Boot test\",\"actionId\":\"05598024-8ee9-4790-aead-1e5428fcd8a5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CA Cert Notification on Boot test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/check_creds\",\"actionId\":\"e9b3130d-95b4-46ce-af95-6e33b43c3093\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/check_creds\"},{\"type\":\"RebootAction\",\"name\":\"REBOOT and wait 55 secs\",\"actionId\":\"b2dbe8c5-2dae-4ad8-8570-3e737d43988c\",\"actionType\":\"REBOOT_ACTION\",\"createdBy\":\"riacheltseng\",\"onlyReconnectToDevice\":false,\"reconnectTimeInSec\":55},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to CA Cert Notification on Boot test\",\"actionId\":\"9032070d-a5cc-4a30-8613-26427982e7de\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CA Cert Notification on Boot test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6ae23df1-ef36-438c-8073-e0253d362a1a\",\"displayText\":\"CA Cert Notification on Boot test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"CA Cert Notification on Boot test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":444.0,\"x2\":351.25,\"y2\":486.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":119.0,\"y\":466.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":61.0,\"y\":-1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"6ae23df1-ef36-438c-8073-e0253d362a1a\",\"firstText\":\"CA Cert Notification on Boot test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CA Cert Notification on Boot test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":454.0,\"x2\":231.0,\"y2\":478.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, CA Cert Notification on Boot test\",\"actionId\":\"570fca9c-2b75-4c5e-9f3d-0607de67cb24\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CA Cert Notification on Boot test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Remove button\",\"actionId\":\"c6cb54d8-cb7b-43f7-ad2c-f16ac373ffea\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button2\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, OK button\",\"actionId\":\"f6891f25-4c6c-433c-9887-99392f90ced1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c9c95a27-478d-4d6f-bc60-bebadada633e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"221f9022-2e98-49f1-a5b7-5340d6b5b525\",\"05598024-8ee9-4790-aead-1e5428fcd8a5\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"e9b3130d-95b4-46ce-af95-6e33b43c3093\",\"ce88edc2-4ae3-4424-9d5b-906134e04383\",\"325e2c82-fd6d-4027-8dd7-1d331c3d5345\",\"b2dbe8c5-2dae-4ad8-8570-3e737d43988c\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"9032070d-a5cc-4a30-8613-26427982e7de\",\"570fca9c-2b75-4c5e-9f3d-0607de67cb24\",\"6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a\",\"c6cb54d8-cb7b-43f7-ad2c-f16ac373ffea\",\"f6891f25-4c6c-433c-9887-99392f90ced1\",\"c9c95a27-478d-4d6f-bc60-bebadada633e\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_CA Cert Notification on Boot test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.232000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a418766b-dd6a-4c90-b127-e104546068c5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a418766b-dd6a-4c90-b127-e104546068c5
deleted file mode 100644
index 5dd6f07..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a418766b-dd6a-4c90-b127-e104546068c5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a418766b-dd6a-4c90-b127-e104546068c5","details":"{\"type\":\"CompoundAction\",\"name\":\"14-Permissions lockdown\",\"actionId\":\"a418766b-dd6a-4c90-b127-e104546068c5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"d2619d97-b114-47f1-bade-ff3e0e4d37f7\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"14-Permissions lockdown","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.109000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a5cd361e-a0c1-493b-9029-bc0855d3503c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a5cd361e-a0c1-493b-9029-bc0855d3503c
deleted file mode 100644
index 820c69e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a5cd361e-a0c1-493b-9029-bc0855d3503c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a5cd361e-a0c1-493b-9029-bc0855d3503c","details":"{\"type\":\"CompoundAction\",\"name\":\"Assert the main location go into 'off' state\",\"actionId\":\"a5cd361e-a0c1-493b-9029-bc0855d3503c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Assert the main location go into 'off' state\",\"actionId\":\"cb32d22d-e2fa-4211-8734-43cb15e17c26\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\nuicd_util = UICDPythonUtil()\\nd = Device.create_device_by_slot(0)\\n\\nresult = d.text(\\\"Use location\\\").right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"cb32d22d-e2fa-4211-8734-43cb15e17c26\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Assert the main location go into 'off' state","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.286000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a66b98b1-5ae4-4e60-9f51-1afb7c1c4f7e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a66b98b1-5ae4-4e60-9f51-1afb7c1c4f7e
deleted file mode 100644
index 4e1b85b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a66b98b1-5ae4-4e60-9f51-1afb7c1c4f7e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a66b98b1-5ae4-4e60-9f51-1afb7c1c4f7e","details":"{\"type\":\"CompoundAction\",\"name\":\"01_Custom provisioning color(Check image)\",\"actionId\":\"a66b98b1-5ae4-4e60-9f51-1afb7c1c4f7e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to BYOD Provisioning tests\",\"actionId\":\"9305f64d-63b6-463e-a32d-aa7c2ea27641\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"BYOD Provisioning tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6a915a5b-1686-4e79-99bd-02882dc707c1\",\"displayText\":\"BYOD Provisioning tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"BYOD Provisioning tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":452.0,\"x2\":351.3333333333333,\"y2\":494.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":95.0,\"y\":474.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":85.0,\"y\":-1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"6a915a5b-1686-4e79-99bd-02882dc707c1\",\"firstText\":\"BYOD Provisioning tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"BYOD Provisioning tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":12.0,\"y1\":463.0,\"x2\":178.0,\"y2\":486.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, BYOD Provisioning tests\",\"actionId\":\"12ce61c6-65b2-4ca4-8fcd-1e5865c58c1f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"BYOD Provisioning tests\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Custom provisioning color\",\"actionId\":\"2fbf1cd5-1860-4e66-84cf-392223f9ca7b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Custom provisioning color\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Go\",\"actionId\":\"c4d10957-3b20-4842-ac60-02fa44f0bbcb\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Go\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"455db14b-266c-4d20-bdb1-bb9dd1a45267\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"15e17bf5-3168-413c-b462-7de40ebef050\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button1\",\"actionId\":\"a5ff5148-61a9-4d95-a682-4f76bf358707\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"c6ce936e-5dc7-4eee-a2a0-171ccb438ae7\",\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"9305f64d-63b6-463e-a32d-aa7c2ea27641\",\"12ce61c6-65b2-4ca4-8fcd-1e5865c58c1f\",\"2fbf1cd5-1860-4e66-84cf-392223f9ca7b\",\"c4d10957-3b20-4842-ac60-02fa44f0bbcb\",\"455db14b-266c-4d20-bdb1-bb9dd1a45267\",\"15e17bf5-3168-413c-b462-7de40ebef050\",\"a5ff5148-61a9-4d95-a682-4f76bf358707\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"01_Custom provisioning color(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.311000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a67e968f-ab80-4c16-87c6-76e7c22da2b7 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a67e968f-ab80-4c16-87c6-76e7c22da2b7
deleted file mode 100644
index fadafda..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a67e968f-ab80-4c16-87c6-76e7c22da2b7
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a67e968f-ab80-4c16-87c6-76e7c22da2b7","details":"{\"type\":\"CompoundAction\",\"name\":\"15-27 & 17-06-12-Set permitted accessibility services\",\"actionId\":\"a67e968f-ab80-4c16-87c6-76e7c22da2b7\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Set permitted accessibility services\",\"actionId\":\"1abd2937-a382-476e-bd32-00f255c37b88\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set permitted accessibility services\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3cd19048-0836-4289-a347-e3296839f21c\",\"displayText\":\"Set permitted accessibility services\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Set permitted accessibility services\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":554.75,\"x2\":360.0,\"y2\":596.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":124.0,\"y\":572.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":56.0,\"y\":3.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"3cd19048-0836-4289-a347-e3296839f21c\",\"firstText\":\"Set permitted accessibility services\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set permitted accessibility services\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":562.0,\"x2\":245.0,\"y2\":583.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set permitted accessibility services\",\"actionId\":\"27f33003-d25d-4f10-955b-b2d34ecbaa2d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set permitted accessibility services\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Dummy accessibility service\",\"actionId\":\"b73961d3-52ed-4178-8bae-d71b0f0eae7c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Dummy accessibility service\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b7590283-564f-405a-b9c2-2039a24022ab\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1b11fffd-8285-4c49-b222-cc26ca1be872\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"1abd2937-a382-476e-bd32-00f255c37b88\",\"27f33003-d25d-4f10-955b-b2d34ecbaa2d\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"b73961d3-52ed-4178-8bae-d71b0f0eae7c\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"b7590283-564f-405a-b9c2-2039a24022ab\",\"1b11fffd-8285-4c49-b222-cc26ca1be872\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-27 & 17-06-12-Set permitted accessibility services","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.162000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a91daeb8-73a8-424c-8e9f-c3c6ddef543c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a91daeb8-73a8-424c-8e9f-c3c6ddef543c
deleted file mode 100644
index 01587f1..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/a91daeb8-73a8-424c-8e9f-c3c6ddef543c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a91daeb8-73a8-424c-8e9f-c3c6ddef543c","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Camera Intents\",\"actionId\":\"a91daeb8-73a8-424c-8e9f-c3c6ddef543c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Camera Intents\",\"actionId\":\"f65f8853-2e4a-4ae6-8aac-5c06d6bb282c\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Camera Intents\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a4a5f3dc-a527-447d-9e6c-12820c9d0ebd\",\"displayText\":\"Camera Intents\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Camera Intents\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":631.3333333333334,\"x2\":350.6666666666667,\"y2\":675.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":65.5,\"y\":654.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":114.5,\"y\":-1.1666666666666288,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"a4a5f3dc-a527-447d-9e6c-12820c9d0ebd\",\"firstText\":\"Camera Intents\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Camera Intents\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":12.0,\"y1\":644.0,\"x2\":119.0,\"y2\":665.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Camera Intents\",\"actionId\":\"3124ccf8-0fb4-4a68-895e-18606d20ee89\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Camera Intents\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/deny_radio_button\",\"actionId\":\"92b8c505-cd99-44af-ab95-ffc201923a68\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.permissioncontroller:id/deny_radio_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/allow_always_radio_button\",\"actionId\":\"6e1c090f-9647-485d-81ae-f99214e89c27\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.permissioncontroller:id/allow_always_radio_button\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"f65f8853-2e4a-4ae6-8aac-5c06d6bb282c\",\"3124ccf8-0fb4-4a68-895e-18606d20ee89\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"852558c2-18ad-4540-bab9-6f2da206f8cb\",\"92b8c505-cd99-44af-ab95-ffc201923a68\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"339f5cb7-0ae4-4405-bd6b-ebf91aa53125\",\"26e141bc-1cb7-4228-865c-40de24919e2d\",\"29474691-30f5-4d1c-a1ac-afe0beb0e971\",\"29474691-30f5-4d1c-a1ac-afe0beb0e971\",\"1c5b786d-f4e0-44ea-8833-ab551a67815c\",\"852558c2-18ad-4540-bab9-6f2da206f8cb\",\"6e1c090f-9647-485d-81ae-f99214e89c27\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_camera=Camera,\\n$uicd_camera_take_photo=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_mode=Video,\\n$uicd_camera_video_record=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_stop=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_done=Done,\"}}","name":"test_Camera Intents","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.016000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/acc515c6-092f-4d36-898f-4c8d33652223 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/acc515c6-092f-4d36-898f-4c8d33652223
deleted file mode 100644
index 56f7e0c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/acc515c6-092f-4d36-898f-4c8d33652223
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"acc515c6-092f-4d36-898f-4c8d33652223","details":"{\"type\":\"CompoundAction\",\"name\":\"13_Personal ringtones\",\"actionId\":\"acc515c6-092f-4d36-898f-4c8d33652223\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Personal ringtones\",\"actionId\":\"d3c31cec-7b08-4148-bdb7-cfc2d9f5413a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Personal ringtones\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"25106337-e464-4d71-8fdd-f8328883219e\",\"displayText\":\"Personal ringtones\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Personal ringtones\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":469.3333333333333,\"x2\":360.0,\"y2\":513.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":71.0,\"y\":487.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":109.0,\"y\":3.8333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"25106337-e464-4d71-8fdd-f8328883219e\",\"firstText\":\"Personal ringtones\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Personal ringtones\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":140.0,\"y1\":499.0,\"x2\":2.0,\"y2\":476.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Personal ringtones\",\"actionId\":\"5f33ed69-53d9-4c79-bc5b-b41feaf0a65c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Personal ringtones\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Work phone ringtone\",\"actionId\":\"67af81f1-6745-4cd0-981e-3c206c6e18e5\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Work phone ringtone\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"970d15ec-b894-42fd-b904-c33ab23e1ee3\",\"displayText\":\"Work phone ringtone\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e2f3e010-f999-4506-bd4f-f8505b982cc0\",\"displayText\":\"Work phone ringtone\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"bdc812d2-80a0-4e67-9935-d06a71e07d0e\",\"displayText\":\"Work phone ringtone\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Work phone ringtone\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":550.6666666666666,\"x2\":205.66666666666666,\"y2\":570.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.6666666666666856,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Work phone ringtone\"},{\"uuid\":\"7b0489b4-0af8-4a80-97e8-5f005a28ad3c\",\"displayText\":\"The Big Adventure\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"The Big Adventure\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":570.3333333333334,\"x2\":172.0,\"y2\":588.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"The Big Adventure\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":536.0,\"x2\":345.3333333333333,\"y2\":602.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Work phone ringtone\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":536.0,\"x2\":360.0,\"y2\":602.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":137.5,\"y\":560.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":42.5,\"y\":9.333333333333258,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"bdc812d2-80a0-4e67-9935-d06a71e07d0e\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Work phone ringtone\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":59.0,\"y1\":548.0,\"x2\":216.0,\"y2\":572.0},\"scrollOrientation\":2,\"scrollMaxNumber\":10},{\"type\":\"PythonScriptAction\",\"name\":\"Turn off - Use personal profile sounds\",\"actionId\":\"fdbd3e1a-b7f9-49b0-944a-7ef440422630\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"Use personal profile sounds\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist():\\n d.text(\\\"Use personal profile sounds\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Phone ringtone\",\"actionId\":\"748906c2-7f6c-46c8-afed-47c3b0fc6816\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Phone ringtone\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a3023dff-082b-40f9-9e99-354f49d20e19\",\"displayText\":\"Phone ringtone\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2d84b96f-a8fe-46b2-b3df-a06f1c2a040a\",\"displayText\":\"Phone ringtone\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1cacb24b-d79a-4848-af17-82f4fa369d91\",\"displayText\":\"Phone ringtone\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Phone ringtone\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":528.6666666666666,\"x2\":167.33333333333334,\"y2\":548.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.1666666666666714,\"y\":2.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Phone ringtone\"},{\"uuid\":\"19c9feb7-f6c5-4d67-8ed1-b5f38c898be8\",\"displayText\":\"The Big Adventure\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"The Big Adventure\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":548.3333333333334,\"x2\":172.0,\"y2\":566.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"The Big Adventure\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":514.0,\"x2\":345.3333333333333,\"y2\":580.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Phone ringtone\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":514.0,\"x2\":360.0,\"y2\":580.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":115.5,\"y\":536.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":64.5,\"y\":11.333333333333258,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"1cacb24b-d79a-4848-af17-82f4fa369d91\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Phone ringtone\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":62.0,\"y1\":523.0,\"x2\":169.0,\"y2\":549.0},\"scrollOrientation\":1,\"scrollMaxNumber\":10},{\"type\":\"ClickAction\",\"name\":\"Click Action, Phone ringtone\",\"actionId\":\"41e16e70-66ab-4e72-baf7-ba80b73b9d7a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Phone ringtone\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Pixel Sounds\",\"actionId\":\"ac84be73-5081-4f90-b3a1-d817b54b4516\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Pixel Sounds\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Default notification sound\",\"actionId\":\"a661501b-7b9f-4319-bd1d-75c734d5d817\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Default notification sound\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Pixel Sounds\",\"actionId\":\"ca992073-73e1-410e-b3db-e6d5b73cd45a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Pixel Sounds\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Default alarm sound\",\"actionId\":\"5c0e8c0c-9521-4977-90a0-4575aae53ebf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Default alarm sound\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Pixel Sounds\",\"actionId\":\"6a4f1ed1-106b-48b2-ae68-5d03fdf3c056\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Pixel Sounds\"},{\"type\":\"PythonScriptAction\",\"name\":\"Verify that the work sounds are different to the personal values just set.\",\"actionId\":\"97ee805f-07a5-4333-b361-8ca147924dbf\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n\\n\\nd= Device.create_device_by_slot(0)\\n \\npersonal_phone_ring = dict(d.text(\\\"Phone ringtone\\\").sibling().get_attributes())[\\\"text\\\"]\\nprint(\\\"Phone ringtone:\\\", personal_phone_ring)\\npersonal_default_notification = dict(d.text(\\\"Default notification sound\\\").sibling().get_attributes())[\\\"text\\\"]\\nprint(\\\"Default notification sound:\\\", personal_default_notification)\\npersonal_default_alarm = dict(d.text(\\\"Default alarm sound\\\").sibling().get_attributes())[\\\"text\\\"]\\nprint(\\\"Default alarm sound:\\\", personal_default_alarm)\\nd.swipe_up()\\nwork_phone_ring = dict(d.text(\\\"Work phone ringtone\\\").sibling().get_attributes())[\\\"text\\\"]\\nprint(\\\"Work phone ringtone:\\\", work_phone_ring)\\nwork_default_notification = dict(d.text(\\\"Default work notification sound\\\").sibling().get_attributes())[\\\"text\\\"]\\nprint(\\\"Default work notification sound:\\\", work_default_notification)\\nwork_default_alarm = dict(d.text(\\\"Default work alarm sound\\\").sibling().get_attributes())[\\\"text\\\"]\\nprint(\\\"Default work alarm sound:\\\", work_default_alarm)\\n\\nif personal_phone_ring != work_phone_ring and personal_default_notification != work_default_notification and personal_default_alarm != work_default_alarm:\\n d.back()\\nelse:\\n print(\\\"The ringtones should not be the same between Personal and Work.\\\")\\n d.back()\\n d.back()\\n uicd_util = UICDPythonUtil()\\n uicd_util.fail_test()\\n\\n \\n\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"d3c31cec-7b08-4148-bdb7-cfc2d9f5413a\",\"5f33ed69-53d9-4c79-bc5b-b41feaf0a65c\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"67af81f1-6745-4cd0-981e-3c206c6e18e5\",\"fdbd3e1a-b7f9-49b0-944a-7ef440422630\",\"748906c2-7f6c-46c8-afed-47c3b0fc6816\",\"41e16e70-66ab-4e72-baf7-ba80b73b9d7a\",\"ac84be73-5081-4f90-b3a1-d817b54b4516\",\"8b466564-08e5-4322-8992-36fa3998ddd2\",\"05139d97-d39c-43cd-8ad4-a276c3fcf5a6\",\"a661501b-7b9f-4319-bd1d-75c734d5d817\",\"ca992073-73e1-410e-b3db-e6d5b73cd45a\",\"8b466564-08e5-4322-8992-36fa3998ddd2\",\"05139d97-d39c-43cd-8ad4-a276c3fcf5a6\",\"5c0e8c0c-9521-4977-90a0-4575aae53ebf\",\"6a4f1ed1-106b-48b2-ae68-5d03fdf3c056\",\"8b466564-08e5-4322-8992-36fa3998ddd2\",\"05139d97-d39c-43cd-8ad4-a276c3fcf5a6\",\"97ee805f-07a5-4333-b361-8ca147924dbf\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"13_Personal ringtones","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.306000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ad921587-e363-4652-ae6b-9d95ff9bba16 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ad921587-e363-4652-ae6b-9d95ff9bba16
deleted file mode 100644
index 582e792..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ad921587-e363-4652-ae6b-9d95ff9bba16
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ad921587-e363-4652-ae6b-9d95ff9bba16","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if screen back to Logout\",\"actionId\":\"ad921587-e363-4652-ae6b-9d95ff9bba16\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Verify if screen back to Logout\",\"actionId\":\"b6159057-6f85-4a20-acab-3fd79a7b13f7\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Set up device owner\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Logout\"}]},\"clickAfterValidation\":false},{\"type\":\"WaitAction\",\"name\":\"WAIT 15 secs for device out of Managed user\",\"actionId\":\"6c4d9d45-0537-4739-87c4-c7a260767ec2\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"riacheltseng\"}],\"childrenIdList\":[\"b6159057-6f85-4a20-acab-3fd79a7b13f7\",\"b50df53e-f816-49d2-b907-500f3f4f3b5a\",\"6c4d9d45-0537-4739-87c4-c7a260767ec2\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"b50df53e-f816-49d2-b907-500f3f4f3b5a\",\"b36ee844-6807-46a4-9073-3d5c83f730fd\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if screen back to Logout","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.206000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ae20d771-d892-4065-aa06-90335e33a588 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ae20d771-d892-4065-aa06-90335e33a588
deleted file mode 100644
index 88bf616..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ae20d771-d892-4065-aa06-90335e33a588
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ae20d771-d892-4065-aa06-90335e33a588","details":"{\"type\":\"CompoundAction\",\"name\":\"17-06-07-Disallow uninstall apps\",\"actionId\":\"ae20d771-d892-4065-aa06-90335e33a588\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow uninstall apps\",\"actionId\":\"a4265c2c-226e-4cba-8171-623ac76551a4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow uninstall apps\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find \\\"Keep Notes\\\"\",\"actionId\":\"b3a085b8-0247-48c8-aa56-6ad989e4f14f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Keep Notes\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b821ad62-577f-444b-b1c6-749f52ab6283\",\"displayText\":\"Keep Notes\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"fb5cb26b-3d50-46dc-9e71-7d9ea220f0b5\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e0b3fc0a-d6b5-490b-b44f-e8336762357b\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":291.25,\"x2\":42.0,\"y2\":319.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":287.75,\"x2\":63.0,\"y2\":322.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"6c76d5f7-c179-4682-9f25-8b2ddc66164b\",\"displayText\":\"Keep Notes\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"15f94e43-3705-4ed2-bec2-cf5550715b66\",\"displayText\":\"Keep Notes\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Keep Notes\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":287.5,\"x2\":136.5,\"y2\":306.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.25,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Keep Notes\"},{\"uuid\":\"230e24b7-c920-4529-b893-f0b550c7d9dc\",\"displayText\":\"29.57 MB\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"29.57 MB\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":306.5,\"x2\":346.0,\"y2\":323.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"29.57 MB\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":273.5,\"x2\":346.0,\"y2\":337.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Keep Notes\"}],\"className\":\"android.widget.LinearLayout\",\"contentDesc\":\"Keep Notes\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":273.5,\"x2\":360.0,\"y2\":337.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":101.0,\"y\":296.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":79.0,\"y\":8.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"15f94e43-3705-4ed2-bec2-cf5550715b66\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Keep Notes\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":53.0,\"y1\":285.0,\"x2\":149.0,\"y2\":308.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Keep Notes\",\"actionId\":\"7325e53f-5f33-4e37-83ab-41e7c46c7bfd\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Keep Notes\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Uninstall button\",\"actionId\":\"c80d64c6-fdbd-4711-b43f-f7e80897d884\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button2\"}],\"childrenIdList\":[\"a4265c2c-226e-4cba-8171-623ac76551a4\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"b3a085b8-0247-48c8-aa56-6ad989e4f14f\",\"7325e53f-5f33-4e37-83ab-41e7c46c7bfd\",\"c80d64c6-fdbd-4711-b43f-f7e80897d884\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"17-06-07-Disallow uninstall apps","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.204000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/af677fa8-0e4c-4c4e-9159-f91129b44e83 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/af677fa8-0e4c-4c4e-9159-f91129b44e83
deleted file mode 100644
index 6f9c93c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/af677fa8-0e4c-4c4e-9159-f91129b44e83
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"af677fa8-0e4c-4c4e-9159-f91129b44e83","details":"{\"type\":\"CompoundAction\",\"name\":\"Enter PIN number \\\"14725836\\\"\",\"actionId\":\"af677fa8-0e4c-4c4e-9159-f91129b44e83\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"INPUT number 14725836\",\"actionId\":\"a0d51bf7-589f-4d4e-978f-5315d8b05253\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"14725836\",\"isSingleChar\":false}],\"childrenIdList\":[\"a0d51bf7-589f-4d4e-978f-5315d8b05253\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Enter PIN number \"14725836\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.263000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/afa8e79c-e104-4611-830d-f7aac106a6a6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/afa8e79c-e104-4611-830d-f7aac106a6a6
deleted file mode 100644
index f95b2c5..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/afa8e79c-e104-4611-830d-f7aac106a6a6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"afa8e79c-e104-4611-830d-f7aac106a6a6","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Take Photo\\\" button\",\"actionId\":\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/take_picture_button\",\"actionId\":\"837f91ff-6f9e-4cef-ab56-50f87eda09b5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/take_picture_button\"}],\"childrenIdList\":[\"837f91ff-6f9e-4cef-ab56-50f87eda09b5\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Take Photo\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.013000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b17bcc33-34e0-4aba-a8ce-080ea0d0846c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b17bcc33-34e0-4aba-a8ce-080ea0d0846c
deleted file mode 100644
index f7fe520..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b17bcc33-34e0-4aba-a8ce-080ea0d0846c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b17bcc33-34e0-4aba-a8ce-080ea0d0846c","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Finish\\\" button\",\"actionId\":\"b17bcc33-34e0-4aba-a8ce-080ea0d0846c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Finish\",\"actionId\":\"26e5b5bb-d879-422b-8d40-76dec0a0155f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Finish\"}],\"childrenIdList\":[\"26e5b5bb-d879-422b-8d40-76dec0a0155f\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Finish\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.183000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b1c2250d-2c83-4698-8e4f-e80b296153d9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b1c2250d-2c83-4698-8e4f-e80b296153d9
deleted file mode 100644
index ebfb579..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b1c2250d-2c83-4698-8e4f-e80b296153d9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b1c2250d-2c83-4698-8e4f-e80b296153d9","details":"{\"type\":\"CompoundAction\",\"name\":\"Take photo\",\"actionId\":\"b1c2250d-2c83-4698-8e4f-e80b296153d9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Take photo\",\"actionId\":\"84e0e867-0d3b-497e-87c0-f20f473d783a\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"$uicd_camera_take_photo\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"$uicd_camera_take_photo\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"$uicd_camera_take_photo\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"84e0e867-0d3b-497e-87c0-f20f473d783a\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Take photo","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.010000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4
deleted file mode 100644
index 41da12a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"WiFi config lockdown off\\\"\",\"actionId\":\"b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, WiFi config lockdown off\",\"actionId\":\"e038ba66-7f44-4fab-a449-9f5e328cf952\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"WiFi config lockdown off\"}],\"childrenIdList\":[\"e038ba66-7f44-4fab-a449-9f5e328cf952\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"WiFi config lockdown off\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.087000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b36ee844-6807-46a4-9073-3d5c83f730fd b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b36ee844-6807-46a4-9073-3d5c83f730fd
deleted file mode 100644
index 2b5dba8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b36ee844-6807-46a4-9073-3d5c83f730fd
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b36ee844-6807-46a4-9073-3d5c83f730fd","details":"{\"type\":\"CompoundAction\",\"name\":\"01-Check device owner\",\"actionId\":\"b36ee844-6807-46a4-9073-3d5c83f730fd\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Device Owner Tests\",\"actionId\":\"6245e6b0-92de-4482-91a2-b046f0248a44\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device Owner Tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"753dac54-11b4-49c9-acea-859bca20f0ed\",\"displayText\":\"Device Owner Tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Device Owner Tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":328.0,\"x2\":351.25,\"y2\":370.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":83.0,\"y\":346.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":97.0,\"y\":3.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"753dac54-11b4-49c9-acea-859bca20f0ed\",\"firstText\":\"Device Owner Tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device Owner Tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":334.0,\"x2\":164.0,\"y2\":358.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Device Owner Tests\",\"actionId\":\"8e353fd7-3827-43f3-b918-76ddbff4104d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device Owner Tests\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Check device owner\",\"actionId\":\"91da1b93-9f8c-4111-b224-34a232d85946\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Check device owner\"}],\"childrenIdList\":[\"4c401ff4-c80e-44d8-b94c-819dc1366093\",\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"6245e6b0-92de-4482-91a2-b046f0248a44\",\"8e353fd7-3827-43f3-b918-76ddbff4104d\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"5595e3fe-1f8d-453a-a103-8d15ac2ec05d\",\"150ccde5-c230-418d-a286-b413af7f297b\",\"91da1b93-9f8c-4111-b224-34a232d85946\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_DeviceOwner_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsEmptyDeviceOwner.apk,\"}}","name":"01-Check device owner","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.080000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b3a44797-fe64-4100-8e0e-9ccbd497c945 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b3a44797-fe64-4100-8e0e-9ccbd497c945
deleted file mode 100644
index bdafb8e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b3a44797-fe64-4100-8e0e-9ccbd497c945
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b3a44797-fe64-4100-8e0e-9ccbd497c945","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Telecom Outgoing Call Test\",\"actionId\":\"b3a44797-fe64-4100-8e0e-9ccbd497c945\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Telecom Outgoing Call Test\",\"actionId\":\"d13f7d12-039b-48be-a9dd-fe0133fe43bc\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Telecom Outgoing Call Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"10da5ab1-89f1-4263-95b2-623d845b41f4\",\"displayText\":\"Telecom Outgoing Call Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Telecom Outgoing Call Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":242.0,\"x2\":350.6666666666667,\"y2\":286.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":109.5,\"y\":261.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":70.5,\"y\":2.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"10da5ab1-89f1-4263-95b2-623d845b41f4\",\"firstText\":\"Telecom Outgoing Call Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Telecom Outgoing Call Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":212.0,\"y1\":273.0,\"x2\":7.0,\"y2\":250.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Telecom Outgoing Call Test\",\"actionId\":\"c8265735-4746-4de3-aaff-1652755204ae\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Telecom Outgoing Call Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/telecom_outgoing_call_register_enable_phone_account_button\",\"actionId\":\"5c8500a7-7b97-4430-9d96-0bb9c6288f63\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/telecom_outgoing_call_register_enable_phone_account_button\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"362882b6-9a1a-48f5-ad83-108b375fb17a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Make calls with\",\"actionId\":\"4b4f41aa-4a10-4494-9a6b-3a1da0c42daa\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Make calls with\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier Test\",\"actionId\":\"79417030-08c3-42be-b501-6ecaaa93f8ff\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CTS Verifier Test\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7a0f1bb5-cc28-40c5-a525-660d1e2bac7a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/telecom_outgoing_call_confirm_register_button\",\"actionId\":\"212250c9-e7a9-4cc7-bdff-6be2fe9476bf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/telecom_outgoing_call_confirm_register_button\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Confirm Register button disabled\",\"actionId\":\"5aaf544e-5b05-4a5a-9a6f-fc639dfa9774\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/telecom_outgoing_call_confirm_register_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/telecom_outgoing_call_dial_button\",\"actionId\":\"90bebca5-af52-45b2-ab46-2781e5481202\",\"actionType\":\"CLICK_ACTION\",\"actionDescription\":\"Click \\\"Dial\\\" button in CTS-V\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/telecom_outgoing_call_dial_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/dialpad_voice_call_button\",\"actionId\":\"80fda295-cd29-4be0-90a7-dac04ba286ce\",\"actionType\":\"CLICK_ACTION\",\"actionDescription\":\"Make a phone call\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.dialer:id/dialpad_voice_call_button\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Phone is Dialing\",\"actionId\":\"4bd28314-d330-4d09-8d23-a0ce26efbe05\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Dialing\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"3eeec101-789e-4531-9ec1-30d51978d8ea\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/telecom_outgoing_call_confirm_button\",\"actionId\":\"fa91da7c-6367-4480-b037-9e5d9f487dbb\",\"actionType\":\"CLICK_ACTION\",\"actionDescription\":\"Click Confirm\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/telecom_outgoing_call_confirm_button\"}],\"childrenIdList\":[\"caa6ccab-46bc-4259-abd1-dabe145e275a\",\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"d13f7d12-039b-48be-a9dd-fe0133fe43bc\",\"c8265735-4746-4de3-aaff-1652755204ae\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"5c8500a7-7b97-4430-9d96-0bb9c6288f63\",\"645e8103-d449-40d0-abba-6d734e783792\",\"362882b6-9a1a-48f5-ad83-108b375fb17a\",\"4b4f41aa-4a10-4494-9a6b-3a1da0c42daa\",\"79417030-08c3-42be-b501-6ecaaa93f8ff\",\"7a0f1bb5-cc28-40c5-a525-660d1e2bac7a\",\"212250c9-e7a9-4cc7-bdff-6be2fe9476bf\",\"5aaf544e-5b05-4a5a-9a6f-fc639dfa9774\",\"90bebca5-af52-45b2-ab46-2781e5481202\",\"80fda295-cd29-4be0-90a7-dac04ba286ce\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"4bd28314-d330-4d09-8d23-a0ce26efbe05\",\"3eeec101-789e-4531-9ec1-30d51978d8ea\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"fa91da7c-6367-4480-b037-9e5d9f487dbb\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Telecom Outgoing Call Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.279000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b40e7a89-24b7-4cf7-8942-4733b0536edc b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b40e7a89-24b7-4cf7-8942-4733b0536edc
deleted file mode 100644
index becf0c2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b40e7a89-24b7-4cf7-8942-4733b0536edc
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b40e7a89-24b7-4cf7-8942-4733b0536edc","details":"{\"type\":\"CompoundAction\",\"name\":\"Open Camera\",\"actionId\":\"b40e7a89-24b7-4cf7-8942-4733b0536edc\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Open Camera\",\"actionId\":\"611cae14-8173-4f20-bae5-22875450407e\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"$uicd_camera\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"$uicd_camera\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"$uicd_camera\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"611cae14-8173-4f20-bae5-22875450407e\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open Camera","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.003000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b50df53e-f816-49d2-b907-500f3f4f3b5a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b50df53e-f816-49d2-b907-500f3f4f3b5a
deleted file mode 100644
index e8e3afd..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b50df53e-f816-49d2-b907-500f3f4f3b5a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b50df53e-f816-49d2-b907-500f3f4f3b5a","details":"{\"type\":\"CompoundAction\",\"name\":\"Press Back key 6 times\",\"actionId\":\"b50df53e-f816-49d2-b907-500f3f4f3b5a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b386cfc1-2565-4ea8-b56f-a6d07541e615\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"b386cfc1-2565-4ea8-b56f-a6d07541e615\"],\"repeatTime\":6,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Press Back key 6 times","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.119000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b531da69-1e61-4e75-a6b1-7e005df80c7b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b531da69-1e61-4e75-a6b1-7e005df80c7b
deleted file mode 100644
index c156971..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b531da69-1e61-4e75-a6b1-7e005df80c7b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b531da69-1e61-4e75-a6b1-7e005df80c7b","details":"{\"type\":\"CompoundAction\",\"name\":\"Disable CTS-V admin\",\"actionId\":\"b531da69-1e61-4e75-a6b1-7e005df80c7b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Check if CTS Verifier admin is enabled if yes, deactivate it.\",\"actionId\":\"1dcff6bb-c93e-409b-aca4-39dcc1fd27bb\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nif d.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist():\\n d.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n d.resource_id(\\\"com.android.settings:id/action_button\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"1dcff6bb-c93e-409b-aca4-39dcc1fd27bb\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Disable CTS-V admin","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.053000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b53eeaf5-391f-4964-84fa-d086c2b938e1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b53eeaf5-391f-4964-84fa-d086c2b938e1
deleted file mode 100644
index f5bbab8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b53eeaf5-391f-4964-84fa-d086c2b938e1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b53eeaf5-391f-4964-84fa-d086c2b938e1","details":"{\"type\":\"CompoundAction\",\"name\":\"Install Instant App\",\"actionId\":\"b53eeaf5-391f-4964-84fa-d086c2b938e1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Install instant app\",\"actionId\":\"ab89519e-1241-4943-a355-57bad0d44469\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"install -r --instant $uicd_instant_app_path\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"ab89519e-1241-4943-a355-57bad0d44469\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Install Instant App","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.055000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b6c8e3c8-6ab1-4886-8f5e-037dd9346a51 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b6c8e3c8-6ab1-4886-8f5e-037dd9346a51
deleted file mode 100644
index cc55bc3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b6c8e3c8-6ab1-4886-8f5e-037dd9346a51
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b6c8e3c8-6ab1-4886-8f5e-037dd9346a51","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn Stay awake off\",\"actionId\":\"b6c8e3c8-6ab1-4886-8f5e-037dd9346a51\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Turn Stay awake off\",\"actionId\":\"ea0170c6-5413-4b72-8365-653b5a61fffb\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell settings put global stay_on_while_plugged_in 0\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"ea0170c6-5413-4b72-8365-653b5a61fffb\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn Stay awake off","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.273000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b70fe893-88de-4879-90ab-c2929211baa8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b70fe893-88de-4879-90ab-c2929211baa8
deleted file mode 100644
index 76cc6d7..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b70fe893-88de-4879-90ab-c2929211baa8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b70fe893-88de-4879-90ab-c2929211baa8","details":"{\"type\":\"CompoundAction\",\"name\":\"Press Go on dialog\",\"actionId\":\"b70fe893-88de-4879-90ab-c2929211baa8\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button3\",\"actionId\":\"da228971-231b-40ec-b5b6-618dacddce25\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button3\"}],\"childrenIdList\":[\"da228971-231b-40ec-b5b6-618dacddce25\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Press Go on dialog","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.291000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b9b98f7c-9a8d-4282-bd0f-1b4b81eac080 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b9b98f7c-9a8d-4282-bd0f-1b4b81eac080
deleted file mode 100644
index efe6c97..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b9b98f7c-9a8d-4282-bd0f-1b4b81eac080
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b9b98f7c-9a8d-4282-bd0f-1b4b81eac080","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Apps & notifcations\",\"actionId\":\"b9b98f7c-9a8d-4282-bd0f-1b4b81eac080\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Apps & notifications\",\"actionId\":\"63c410cd-2a89-4d57-8d91-27c6f800e857\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Apps & notifications\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a3591475-0e54-43a2-a7d2-a1f914690a17\",\"displayText\":\"Apps & notifications\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1052a1bf-1198-4ac3-a8cd-8106aa3c4bc6\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"8c6125ff-4353-4f34-ba0e-c00b34a362c7\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":280.75,\"x2\":45.5,\"y2\":312.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":277.25,\"x2\":63.0,\"y2\":315.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"89951143-8162-4131-b9f0-edc05b0a495d\",\"displayText\":\"Apps & notifications\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"8ebe5dc9-740b-4527-9194-fa249d939739\",\"displayText\":\"Apps & notifications\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Apps & notifications\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":278.75,\"x2\":189.0,\"y2\":297.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.0,\"y\":-1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Apps & notifications\"},{\"uuid\":\"d75317d8-a467-40e1-b94d-73e4f85598c7\",\"displayText\":\"Assistant, recent apps, default apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Assistant, recent apps, default apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":297.75,\"x2\":258.0,\"y2\":314.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Assistant, recent apps, default apps\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":264.75,\"x2\":346.0,\"y2\":328.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Apps & notifications\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":264.75,\"x2\":360.0,\"y2\":328.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":128.0,\"y\":289.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":52.0,\"y\":7.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"8ebe5dc9-740b-4527-9194-fa249d939739\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Apps & notifications\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":56.0,\"y1\":278.0,\"x2\":200.0,\"y2\":301.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Apps & notifications\",\"actionId\":\"109177c2-85e9-4740-abd6-932a7efe1ad5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Apps & notifications\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"63c410cd-2a89-4d57-8d91-27c6f800e857\",\"109177c2-85e9-4740-abd6-932a7efe1ad5\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Apps & notifcations","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.065000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b9e13d9a-43e6-44b0-a3f6-48b3de93d39a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b9e13d9a-43e6-44b0-a3f6-48b3de93d39a
deleted file mode 100644
index 118d956..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/b9e13d9a-43e6-44b0-a3f6-48b3de93d39a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b9e13d9a-43e6-44b0-a3f6-48b3de93d39a","details":"{\"type\":\"CompoundAction\",\"name\":\"Enter PIN or Password \\\"2468\\\"\",\"actionId\":\"b9e13d9a-43e6-44b0-a3f6-48b3de93d39a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"INPUT number \\\"2468\\\"\",\"actionId\":\"badb6abb-cbee-4352-9452-1f06f6459083\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"2468\",\"isSingleChar\":false}],\"childrenIdList\":[\"badb6abb-cbee-4352-9452-1f06f6459083\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Enter PIN or Password \"2468\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.254000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ba60c19c-dd7d-4503-86dc-57ae83dfa386 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ba60c19c-dd7d-4503-86dc-57ae83dfa386
deleted file mode 100644
index 80f88b7..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ba60c19c-dd7d-4503-86dc-57ae83dfa386
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ba60c19c-dd7d-4503-86dc-57ae83dfa386","details":"{\"type\":\"CompoundAction\",\"name\":\"02-Device administrator settings\",\"actionId\":\"ba60c19c-dd7d-4503-86dc-57ae83dfa386\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Device administrator settings\",\"actionId\":\"1c89cedd-a8e4-42fe-ab22-95af748bec46\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device administrator settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"78cdbe24-64df-4a2e-a312-a9f5a227f515\",\"displayText\":\"Device administrator settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Device administrator settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":381.75,\"x2\":351.25,\"y2\":423.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":104.0,\"y\":404.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":76.0,\"y\":-1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"78cdbe24-64df-4a2e-a312-a9f5a227f515\",\"firstText\":\"Device administrator settings\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device administrator settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":389.0,\"x2\":201.0,\"y2\":419.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Device administrator settings\",\"actionId\":\"454e6140-760e-4839-b9eb-f6388794b93a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device administrator settings\"}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"1c89cedd-a8e4-42fe-ab22-95af748bec46\",\"454e6140-760e-4839-b9eb-f6388794b93a\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"d5c77251-9663-4eaa-b708-68a67fc8189f\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"02-Device administrator settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.083000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bad420dc-5e82-4d72-abc6-3b748c8fffdf b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bad420dc-5e82-4d72-abc6-3b748c8fffdf
deleted file mode 100644
index 8de0a7a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bad420dc-5e82-4d72-abc6-3b748c8fffdf
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bad420dc-5e82-4d72-abc6-3b748c8fffdf","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Device admin apps\",\"actionId\":\"bad420dc-5e82-4d72-abc6-3b748c8fffdf\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Security\",\"actionId\":\"ce237ffe-9f9c-43ed-98e2-091a681a3279\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Security\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1e2fd7ec-16e9-4773-a8eb-accb73211b90\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a39af5dd-352a-48f2-98e6-3d0467b86345\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2797b751-7488-4eaa-a51c-e2c8b3be9f62\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":102.33333333333333,\"x2\":45.333333333333336,\"y2\":133.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":98.66666666666667,\"x2\":63.0,\"y2\":137.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"a2ffeacf-df87-41c0-a571-5c572ac174a4\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"561eb4b9-97f7-4b8e-8a5e-bd36d25a8e74\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Security\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":100.0,\"x2\":115.66666666666667,\"y2\":119.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.166666666666657,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Security\"},{\"uuid\":\"9d0b3abc-a9b8-41f4-933e-2cbbc7756785\",\"displayText\":\"Play Protect, screen lock, fingerprint\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Play Protect, screen lock, fingerprint\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":119.0,\"x2\":259.3333333333333,\"y2\":136.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Play Protect, screen lock, fingerprint\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":86.0,\"x2\":346.0,\"y2\":150.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Security\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":86.0,\"x2\":360.0,\"y2\":150.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":95.5,\"y\":108.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":84.5,\"y\":10.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"561eb4b9-97f7-4b8e-8a5e-bd36d25a8e74\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Security\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":58.0,\"y1\":98.0,\"x2\":133.0,\"y2\":118.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Security\",\"actionId\":\"19e3df40-07a1-42cc-9e4d-5dbbf8b158fd\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Security\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Advanced\",\"actionId\":\"7efe8458-75dc-46eb-8745-d3ac9b258e8d\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Advanced\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c254fe86-3d86-4e6e-80c1-38235397e09a\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"349843c2-c30f-45e8-8627-3a79b6e51f91\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"40e657e3-7fd8-42cf-ab41-4a0acaaef64e\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":556.3333333333334,\"x2\":35.0,\"y2\":577.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":552.6666666666666,\"x2\":63.0,\"y2\":581.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"fe5ce6fd-7f9d-46f1-ae8a-74d7ed8137bc\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"67532ca6-077b-418e-b7f3-937b2896a290\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Advanced\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":550.0,\"x2\":117.33333333333333,\"y2\":567.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.8333333333333428,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Advanced\"},{\"uuid\":\"e394cfda-eb88-4657-b073-3605d245f0b6\",\"displayText\":\"App pinning, Confirm SIM deletion\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"App pinning, Confirm SIM deletion\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":567.0,\"x2\":248.33333333333334,\"y2\":584.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"App pinning, Confirm SIM deletion\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":536.0,\"x2\":346.0,\"y2\":598.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Advanced\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":536.0,\"x2\":360.0,\"y2\":598.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":557.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":9.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"67532ca6-077b-418e-b7f3-937b2896a290\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Advanced\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":57.0,\"y1\":549.0,\"x2\":127.0,\"y2\":566.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Advanced\",\"actionId\":\"24787c09-a68d-4299-b149-08350e5038a6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Advanced\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Device admin apps\",\"actionId\":\"e8801432-f033-4a9c-93e5-7a9b124d79fb\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device admin apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"64b69a6f-7d3e-41f5-997d-14475901db70\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e471a754-e3e0-4f79-8dbe-343d85cb071f\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c1d51d10-99af-4421-ab48-bc123a6da2d7\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Device admin apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":367.3333333333333,\"x2\":182.66666666666666,\"y2\":386.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.6666666666666714,\"y\":2.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Device admin apps\"},{\"uuid\":\"61240b78-bcc5-41f7-b500-e28a8b67d1ad\",\"displayText\":\"1 active app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"1 active app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":386.3333333333333,\"x2\":129.33333333333334,\"y2\":403.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"1 active app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":353.3333333333333,\"x2\":346.0,\"y2\":417.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Device admin apps\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":353.3333333333333,\"x2\":360.0,\"y2\":417.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":124.5,\"y\":374.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":55.5,\"y\":10.833333333333314,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"c1d51d10-99af-4421-ab48-bc123a6da2d7\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device admin apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":52.0,\"y1\":357.0,\"x2\":197.0,\"y2\":392.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Device admin apps\",\"actionId\":\"30c0258c-0644-4495-a37f-e4859f90fc04\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device admin apps\"}],\"childrenIdList\":[\"2dad0955-cdab-4973-bd4f-b46db4fe4534\",\"ce237ffe-9f9c-43ed-98e2-091a681a3279\",\"19e3df40-07a1-42cc-9e4d-5dbbf8b158fd\",\"7efe8458-75dc-46eb-8745-d3ac9b258e8d\",\"24787c09-a68d-4299-b149-08350e5038a6\",\"e8801432-f033-4a9c-93e5-7a9b124d79fb\",\"30c0258c-0644-4495-a37f-e4859f90fc04\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Device admin apps","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.319000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3
deleted file mode 100644
index 8005254..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3","details":"{\"type\":\"CompoundAction\",\"name\":\"Assert the main location go into 'on' state\",\"actionId\":\"bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Assert the main location go into 'on' state\",\"actionId\":\"dd17f56c-90ba-43a5-a337-a7f15b23c01b\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\n \\nuicd_util = UICDPythonUtil()\\nd = Device.create_device_by_slot(0)\\n\\nresult = d.text(\\\"Use location\\\").right().resource_id(\\\"com.android.settings:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"dd17f56c-90ba-43a5-a337-a7f15b23c01b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Assert the main location go into 'on' state","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.286000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb6f039b-70ef-41a6-9880-20e383ba74d5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb6f039b-70ef-41a6-9880-20e383ba74d5
deleted file mode 100644
index 55dcdfd..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb6f039b-70ef-41a6-9880-20e383ba74d5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bb6f039b-70ef-41a6-9880-20e383ba74d5","details":"{\"type\":\"CompoundAction\",\"name\":\"Confirm PIN or Password lock \\\"1234\\\"\",\"actionId\":\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if need to re-Enter PIN or password\",\"actionId\":\"4a7f84a4-ed63-4249-9bbd-5b80145f5882\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Re-enter your PIN\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Re-enter your password\"},{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/pinEntry\"},{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/passwordEntry\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Enter\",\"actionId\":\"336f35ce-a6e5-49b2-a46e-7e97caa8cf43\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.inputmethod.latin:id/key_pos_ime_action\"},{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/key_enter\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"4a7f84a4-ed63-4249-9bbd-5b80145f5882\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"336f35ce-a6e5-49b2-a46e-7e97caa8cf43\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Confirm PIN or Password lock \"1234\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.034000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb7fdd5f-0d61-4a6b-bd0f-589f5da59832 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb7fdd5f-0d61-4a6b-bd0f-589f5da59832
deleted file mode 100644
index a92454b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bb7fdd5f-0d61-4a6b-bd0f-589f5da59832
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bb7fdd5f-0d61-4a6b-bd0f-589f5da59832","details":"{\"type\":\"CompoundAction\",\"name\":\"17-02-Device administrator settings\",\"actionId\":\"bb7fdd5f-0d61-4a6b-bd0f-589f5da59832\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Device administrator settings\",\"actionId\":\"ef8343fb-d75a-47d6-833c-7fa23fc2d105\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device administrator settings\"}],\"childrenIdList\":[\"ef8343fb-d75a-47d6-833c-7fa23fc2d105\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"d5c77251-9663-4eaa-b708-68a67fc8189f\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"17-02-Device administrator settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.199000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc4f5534-26cb-4b19-b548-609b6c8e326e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc4f5534-26cb-4b19-b548-609b6c8e326e
deleted file mode 100644
index 1b53f39..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc4f5534-26cb-4b19-b548-609b6c8e326e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bc4f5534-26cb-4b19-b548-609b6c8e326e","details":"{\"type\":\"CompoundAction\",\"name\":\"Open quick settings\",\"actionId\":\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Open quick settings\",\"actionId\":\"185a2bfe-ad56-42bb-9f2e-d3529ecbef1c\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"commandLine\":\"shell cmd statusbar expand-settings\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"185a2bfe-ad56-42bb-9f2e-d3529ecbef1c\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open quick settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.980000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc8d1d81-e862-43e2-aa54-1056b9e26f14 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc8d1d81-e862-43e2-aa54-1056b9e26f14
deleted file mode 100644
index da27155..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc8d1d81-e862-43e2-aa54-1056b9e26f14
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bc8d1d81-e862-43e2-aa54-1056b9e26f14","details":"{\"type\":\"CompoundAction\",\"name\":\"16-02-Retrieve traffic logs\",\"actionId\":\"bc8d1d81-e862-43e2-aa54-1056b9e26f14\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Retrieve traffic logs\",\"actionId\":\"dd85c789-d117-4cc4-8845-8d4a087f8ec9\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Retrieve traffic logs\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"cc2530f1-0427-406e-bf04-18d8360ad66b\",\"displayText\":\"Retrieve traffic logs\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Retrieve traffic logs\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":125.25,\"x2\":351.25,\"y2\":167.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":75.5,\"y\":147.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":104.5,\"y\":-0.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"cc2530f1-0427-406e-bf04-18d8360ad66b\",\"firstText\":\"Retrieve traffic logs\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Retrieve traffic logs\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":132.0,\"x2\":142.0,\"y2\":162.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Retrieve traffic logs\",\"actionId\":\"373d2751-f61f-4f23-a25f-cbad0f2f568e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Retrieve traffic logs\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Retrieve Traffic Logs\",\"actionId\":\"87907d2b-c2be-4cb5-a7a3-823889390ec4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Retrieve Traffic Logs\"},{\"type\":\"PythonScriptAction\",\"name\":\"Verify that you are told traffic logs were last retrieved at the time you pressed\",\"actionId\":\"c504b79f-7701-41f7-b0b4-b657f7810680\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\nfrom python_uiautomator.constant import MatchOption\\n\\nuicd_util = UICDPythonUtil()\\nd= Device.create_device_by_slot(0)\\n\\ntime = dict(d.resource_id(\\\"com.android.systemui:id/clock\\\").get_attributes())['text']\\n\\nresult = d.text(\\\"Most recent network traffic log\\\").down().text(time, MatchOption.CONTAINS).verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"888e6b6b-3a6c-469a-98f7-f5d63af8e424\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"dd85c789-d117-4cc4-8845-8d4a087f8ec9\",\"373d2751-f61f-4f23-a25f-cbad0f2f568e\",\"87907d2b-c2be-4cb5-a7a3-823889390ec4\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"c504b79f-7701-41f7-b0b4-b657f7810680\",\"888e6b6b-3a6c-469a-98f7-f5d63af8e424\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-02-Retrieve traffic logs","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.169000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc9471bc-a314-40a4-952b-24a9d2db4974 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc9471bc-a314-40a4-952b-24a9d2db4974
deleted file mode 100644
index 17d8c9a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bc9471bc-a314-40a4-952b-24a9d2db4974
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bc9471bc-a314-40a4-952b-24a9d2db4974","details":"{\"type\":\"CompoundAction\",\"name\":\"Confirm PIN or Password lock \\\"2468\\\"\",\"actionId\":\"bc9471bc-a314-40a4-952b-24a9d2db4974\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if need to re-Enter PIN or password\",\"actionId\":\"11d17c24-61c3-415a-98c6-a27ccf1a2d04\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Re-enter your password\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Re-enter your PIN\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Enter key\",\"actionId\":\"634f2c0a-5b87-4b27-acb7-174cbe8aee03\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.inputmethod.latin:id/key_pos_ime_action\"}],\"childrenIdList\":[\"11d17c24-61c3-415a-98c6-a27ccf1a2d04\",\"b9e13d9a-43e6-44b0-a3f6-48b3de93d39a\",\"634f2c0a-5b87-4b27-acb7-174cbe8aee03\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Confirm PIN or Password lock \"2468\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.255000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bcc40c72-d997-4128-80a1-6aca3603c260 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bcc40c72-d997-4128-80a1-6aca3603c260
deleted file mode 100644
index 868ab6e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bcc40c72-d997-4128-80a1-6aca3603c260
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bcc40c72-d997-4128-80a1-6aca3603c260","details":"{\"type\":\"CompoundAction\",\"name\":\"Check the restriction message(default)\",\"actionId\":\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if screen show action not allowed\",\"actionId\":\"94b994cc-7693-4e62-97bf-9f665defe78d\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Action not allowed\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"cff335b1-3a0b-4b42-aa25-5c51c1bd0d33\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"fb23b3b3-14ae-47bf-844e-698b33a0ae54\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"4ecd7979-b70e-4fdb-baf6-8651ff3ae30c\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"29f2a1f1-afe1-4051-95ae-23f9241e3474\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/admin_support_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":296.0,\"x2\":86.25,\"y2\":338.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"2d5820c0-53d2-4e48-a098-cd27dde09303\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/admin_support_dialog_title\",\"text\":\"Action not allowed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":86.25,\"y1\":305.25,\"x2\":254.0,\"y2\":328.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-13.375,\"y\":3.875,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":296.0,\"x2\":315.75,\"y2\":355.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"},{\"uuid\":\"47ce8759-4ace-4887-9dda-7c45390fde13\",\"displayText\":\"If you have questions, contact your IT admin\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"fe49b8ec-54a5-496a-ac8b-a273584a5f03\",\"displayText\":\"If you have questions, contact your IT admin\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6c8d48ff-eb00-4906-91d8-5b1346a46839\",\"displayText\":\"If you have questions, contact your IT admin\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/admin_support_msg\",\"text\":\"If you have questions, contact your IT admin\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":355.5,\"x2\":315.75,\"y2\":392.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"If you have questions, contact your IT admin\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":355.5,\"x2\":315.75,\"y2\":392.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"If you have questions, contact your IT admin\"}],\"className\":\"android.widget.ScrollView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":355.5,\"x2\":315.75,\"y2\":392.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"If you have questions, contact your IT admin\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.25,\"y1\":275.0,\"x2\":336.75,\"y2\":413.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.settings:id/custom\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.25,\"y1\":275.0,\"x2\":336.75,\"y2\":413.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":183.5,\"y\":313.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.5,\"y\":31.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"2d5820c0-53d2-4e48-a098-cd27dde09303\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Action not allowed\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":103.0,\"y1\":296.0,\"x2\":264.0,\"y2\":330.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the support message\",\"actionId\":\"20e4a0e7-1855-4583-978e-bfa7ab4bfb88\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"If you have questions, contact your IT admin\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f0466ffe-b4cf-4ce9-a057-6d1802f5bdf4\",\"displayText\":\"If you have questions, contact your IT admin\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"a9f2f8ff-81d5-400d-a0bc-dfe95012c133\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"922bece1-4bec-4445-9ab4-77bc7fb3d834\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0e0ca6b7-a3f4-4b80-a6b4-370a5152f094\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/admin_support_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":296.0,\"x2\":86.25,\"y2\":338.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"ccb874ef-adb6-45bf-b118-cc1181d86da7\",\"displayText\":\"Action not allowed\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/admin_support_dialog_title\",\"text\":\"Action not allowed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":86.25,\"y1\":305.25,\"x2\":254.0,\"y2\":328.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":296.0,\"x2\":315.75,\"y2\":355.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"},{\"uuid\":\"1662ccd6-6e74-43c6-bd6c-3e46ef24c834\",\"displayText\":\"If you have questions, contact your IT admin\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b4730a5c-430e-4b43-9093-2074c2c1f5f4\",\"displayText\":\"If you have questions, contact your IT admin\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7fbf424c-2da3-4d73-9943-1e9ceb031641\",\"displayText\":\"If you have questions, contact your IT admin\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/admin_support_msg\",\"text\":\"If you have questions, contact your IT admin\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":355.5,\"x2\":315.75,\"y2\":392.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":19.5,\"y\":2.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"If you have questions, contact your IT admin\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":355.5,\"x2\":315.75,\"y2\":392.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"If you have questions, contact your IT admin\"}],\"className\":\"android.widget.ScrollView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":355.5,\"x2\":315.75,\"y2\":392.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"If you have questions, contact your IT admin\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.25,\"y1\":275.0,\"x2\":336.75,\"y2\":413.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Action not allowed\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.settings:id/custom\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.25,\"y1\":275.0,\"x2\":336.75,\"y2\":413.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":160.5,\"y\":371.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":19.5,\"y\":-27.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"7fbf424c-2da3-4d73-9943-1e9ceb031641\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"If you have questions, contact your IT admin\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":39.0,\"y1\":351.0,\"x2\":282.0,\"y2\":392.0}}],\"childrenIdList\":[\"94b994cc-7693-4e62-97bf-9f665defe78d\",\"20e4a0e7-1855-4583-978e-bfa7ab4bfb88\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Check the restriction message(default)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.092000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bd22d00c-3bff-4749-8763-3323c17809bb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bd22d00c-3bff-4749-8763-3323c17809bb
deleted file mode 100644
index 1016d0c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bd22d00c-3bff-4749-8763-3323c17809bb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bd22d00c-3bff-4749-8763-3323c17809bb","details":"{\"type\":\"CompoundAction\",\"name\":\"01-Check device owner\",\"actionId\":\"bd22d00c-3bff-4749-8763-3323c17809bb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Device Owner Requesting Bugreport Tests\",\"actionId\":\"dbf0addd-4733-491b-9b38-5b989f160787\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device Owner Requesting Bugreport Tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"52b034ca-28ce-4a48-be67-8671e24e5957\",\"displayText\":\"Device Owner Requesting Bugreport Tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Device Owner Requesting Bugreport Tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":472.5,\"x2\":351.25,\"y2\":514.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":153.5,\"y\":496.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":26.5,\"y\":-2.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"52b034ca-28ce-4a48-be67-8671e24e5957\",\"firstText\":\"Device Owner Requesting Bugreport Tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device Owner Requesting Bugreport Tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":476.0,\"x2\":305.0,\"y2\":516.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Device Owner Requesting Bugreport Tests\",\"actionId\":\"d0da9ad2-a0ab-474f-9002-b6a84d17de99\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device Owner Requesting Bugreport Tests\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Check device owner\",\"actionId\":\"778d8f21-4564-4786-9887-3ff1d93f9592\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Check device owner\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"dbf0addd-4733-491b-9b38-5b989f160787\",\"d0da9ad2-a0ab-474f-9002-b6a84d17de99\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"5595e3fe-1f8d-453a-a103-8d15ac2ec05d\",\"150ccde5-c230-418d-a286-b413af7f297b\",\"778d8f21-4564-4786-9887-3ff1d93f9592\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_DeviceOwner_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsEmptyDeviceOwner.apk,\"}}","name":"01-Check device owner","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.068000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bdac4f2a-64a2-460c-a210-399cd652cfa8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bdac4f2a-64a2-460c-a210-399cd652cfa8
deleted file mode 100644
index 9016e6d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bdac4f2a-64a2-460c-a210-399cd652cfa8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bdac4f2a-64a2-460c-a210-399cd652cfa8","details":"{\"type\":\"CompoundAction\",\"name\":\"06-Remove device owner\",\"actionId\":\"bdac4f2a-64a2-460c-a210-399cd652cfa8\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Remove device owner\",\"actionId\":\"72c8c604-9718-4de2-ba0d-e022242afd4a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Remove device owner\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Remove device owner\",\"actionId\":\"414ef652-7275-46d0-bd13-5e676b425ead\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Remove device owner\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY screen back to main screen of Bugreport\",\"actionId\":\"53d7d663-1773-4d07-b43f-8e312bc49b9f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Set up device owner\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"Click pass button if all tests passed\",\"actionId\":\"867efea8-7d6f-4e9f-8d83-8016fc0eb82f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/pass_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"4f3ec13b-589a-4ca3-b456-7224028d0604\",\"72c8c604-9718-4de2-ba0d-e022242afd4a\",\"414ef652-7275-46d0-bd13-5e676b425ead\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"53d7d663-1773-4d07-b43f-8e312bc49b9f\",\"867efea8-7d6f-4e9f-8d83-8016fc0eb82f\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"06-Remove device owner","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.078000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/be00d800-5235-410e-a535-55a76d9200b9 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/be00d800-5235-410e-a535-55a76d9200b9
deleted file mode 100644
index 6d55c54..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/be00d800-5235-410e-a535-55a76d9200b9
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"be00d800-5235-410e-a535-55a76d9200b9","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Open settings\\\" button\",\"actionId\":\"be00d800-5235-410e-a535-55a76d9200b9\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/open_settings_button\",\"actionId\":\"8484c46a-840d-49c8-b0e8-c0bf989c0a2c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/open_settings_button\"}],\"childrenIdList\":[\"8484c46a-840d-49c8-b0e8-c0bf989c0a2c\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Open settings\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.120000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bfcd3a5c-3fa3-4976-9b6e-aea47e073512 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bfcd3a5c-3fa3-4976-9b6e-aea47e073512
deleted file mode 100644
index 42ff5c4..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/bfcd3a5c-3fa3-4976-9b6e-aea47e073512
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bfcd3a5c-3fa3-4976-9b6e-aea47e073512","details":"{\"type\":\"CompoundAction\",\"name\":\"16-16-Keyguard disclosure\",\"actionId\":\"bfcd3a5c-3fa3-4976-9b6e-aea47e073512\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Keyguard disclosure\",\"actionId\":\"e65a665d-d16d-4c2e-bf72-f74f646a012f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Keyguard disclosure\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a0b90385-e088-4eb5-b5f6-626636bd563f\",\"displayText\":\"Keyguard disclosure\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Keyguard disclosure\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":609.0,\"x2\":351.3333333333333,\"y2\":651.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":81.5,\"y\":631.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":98.5,\"y\":-1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"a0b90385-e088-4eb5-b5f6-626636bd563f\",\"firstText\":\"Keyguard disclosure\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Keyguard disclosure\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":17.0,\"y1\":617.0,\"x2\":146.0,\"y2\":645.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Keyguard disclosure\",\"actionId\":\"b36c6d9b-089a-4bea-9a1b-9c4b314742ec\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Keyguard disclosure\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"241877f5-1b6e-4a0b-987c-cc4b5bb380da\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1718a081-392f-4b0c-ac27-fe779618bf14\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"bec5a405-a5c3-496e-b9e9-b51279ef9cf4\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"497dd745-c6ed-4dff-8c37-0b293b5dc7bc\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"232ccd6e-1202-4e90-941b-7c3697eb5e55\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"b4e62ae2-e6f5-44e5-967c-39e7dc6be368\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"9af94c95-37ae-4b2a-a772-71250cc15c35\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b40c8465-84f8-48f0-8699-609cb02ea88c\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"0d18bdb6-2e79-4b64-886a-4b28f685637d\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"e54e4d37-f069-4f57-8f31-c2955799376b\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"91e27c95-3b0f-47c0-98fe-76d10c286fb9\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"ff8c0104-4aea-4e73-9cdf-8a3e4723d45f\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c959fcb9-1a71-426a-b50b-7b1f0815f044\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"23e799da-1a48-4e17-9e3d-bff5e87528e8\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"53eeae00-858b-4eb4-a41e-eeed8c1a86a7\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"5f2b7831-99b4-4446-a32f-5963862e4b0e\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"ff3f6c04-e849-4f36-929e-2ee97e603236\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"584884d5-5dbb-4aa4-ab88-a2330dab7a1e\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"430fe8b8-0176-46d5-bf76-28d68ba3999c\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"3c5f469b-8e0c-4db6-ac2b-97e725f0ec8f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"b4a6ba4e-a989-4446-bcde-644e6a15606d\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"aa8be087-d313-4428-904b-78a621818074\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"c0dacf95-341d-4e66-a298-2623c8fcee98\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"6f97605e-2c60-4243-9d2a-4496f55a26ba\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"16b93f18-3250-4660-900a-7e5aee87c64f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f1e39972-3203-47f8-85fb-66902ae03179\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"e65a665d-d16d-4c2e-bf72-f74f646a012f\",\"b36c6d9b-089a-4bea-9a1b-9c4b314742ec\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"1e49e89c-6a23-487a-86d9-a2244d725017\",\"241877f5-1b6e-4a0b-987c-cc4b5bb380da\",\"1718a081-392f-4b0c-ac27-fe779618bf14\",\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"bec5a405-a5c3-496e-b9e9-b51279ef9cf4\",\"497dd745-c6ed-4dff-8c37-0b293b5dc7bc\",\"764101e3-1eaa-47e8-854f-68434c4c994c\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"91ab1016-e46b-4681-802a-30de34592081\",\"232ccd6e-1202-4e90-941b-7c3697eb5e55\",\"b4e62ae2-e6f5-44e5-967c-39e7dc6be368\",\"1fe89bff-e8fd-40da-a6b7-e91443c69389\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"cf6c2d6d-a4fe-4981-af4b-f561291f847b\",\"9af94c95-37ae-4b2a-a772-71250cc15c35\",\"b40c8465-84f8-48f0-8699-609cb02ea88c\",\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"0d18bdb6-2e79-4b64-886a-4b28f685637d\",\"e54e4d37-f069-4f57-8f31-c2955799376b\",\"764101e3-1eaa-47e8-854f-68434c4c994c\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"91ab1016-e46b-4681-802a-30de34592081\",\"91e27c95-3b0f-47c0-98fe-76d10c286fb9\",\"ff8c0104-4aea-4e73-9cdf-8a3e4723d45f\",\"1fe89bff-e8fd-40da-a6b7-e91443c69389\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"49bfb869-2ef5-4df6-8fff-3192112b82a2\",\"c959fcb9-1a71-426a-b50b-7b1f0815f044\",\"23e799da-1a48-4e17-9e3d-bff5e87528e8\",\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"53eeae00-858b-4eb4-a41e-eeed8c1a86a7\",\"5f2b7831-99b4-4446-a32f-5963862e4b0e\",\"764101e3-1eaa-47e8-854f-68434c4c994c\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"91ab1016-e46b-4681-802a-30de34592081\",\"ff3f6c04-e849-4f36-929e-2ee97e603236\",\"584884d5-5dbb-4aa4-ab88-a2330dab7a1e\",\"1fe89bff-e8fd-40da-a6b7-e91443c69389\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"e1d66f34-6024-4d89-b511-399897ba2464\",\"430fe8b8-0176-46d5-bf76-28d68ba3999c\",\"3c5f469b-8e0c-4db6-ac2b-97e725f0ec8f\",\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"b4a6ba4e-a989-4446-bcde-644e6a15606d\",\"aa8be087-d313-4428-904b-78a621818074\",\"764101e3-1eaa-47e8-854f-68434c4c994c\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"91ab1016-e46b-4681-802a-30de34592081\",\"c0dacf95-341d-4e66-a298-2623c8fcee98\",\"6f97605e-2c60-4243-9d2a-4496f55a26ba\",\"1fe89bff-e8fd-40da-a6b7-e91443c69389\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"72f62d5f-9a3a-4c4d-813c-96614b1c5845\",\"16b93f18-3250-4660-900a-7e5aee87c64f\",\"f1e39972-3203-47f8-85fb-66902ae03179\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-16-Keyguard disclosure","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.192000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c053d68c-aa89-494f-9a6d-a24f4eba7de4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c053d68c-aa89-494f-9a6d-a24f4eba7de4
deleted file mode 100644
index db7b595..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c053d68c-aa89-494f-9a6d-a24f4eba7de4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c053d68c-aa89-494f-9a6d-a24f4eba7de4","details":"{\"type\":\"CompoundAction\",\"name\":\"02-Quick settings disclosure\",\"actionId\":\"c053d68c-aa89-494f-9a6d-a24f4eba7de4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Quick settings disclosure\",\"actionId\":\"2696cccb-f4b1-4b1f-b5ef-fe93f2345a11\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Quick settings disclosure\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"8e5ce0be-86f8-4632-acb8-efce21460712\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b352895c-6ca2-4c19-b2f1-61c9ad01ff50\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"7f12c16f-51be-4732-bf1b-ef4b55841a99\",\"2696cccb-f4b1-4b1f-b5ef-fe93f2345a11\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"cae61682-7071-4c67-94c1-963ff2cbe978\",\"8e5ce0be-86f8-4632-acb8-efce21460712\",\"b352895c-6ca2-4c19-b2f1-61c9ad01ff50\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"02-Quick settings disclosure","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.217000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c06f1557-8c66-44c1-8dc2-dad782d2f597 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c06f1557-8c66-44c1-8dc2-dad782d2f597
deleted file mode 100644
index b50e610..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c06f1557-8c66-44c1-8dc2-dad782d2f597
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c06f1557-8c66-44c1-8dc2-dad782d2f597","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify that the list contains the CTS Verifier app\",\"actionId\":\"c06f1557-8c66-44c1-8dc2-dad782d2f597\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify the list contains the CTS Verifier app\",\"actionId\":\"ff81af88-2d59-43cd-9f3d-b114090d6217\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CTS Verifier\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4cb611c8-e15c-4a54-8e4d-c937b1707148\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"96788dbb-cbbb-4929-ba76-d24d923e25b5\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"96a96ab1-c914-47a6-9b10-cbe10455e45d\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":83.0,\"x2\":42.0,\"y2\":111.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":79.5,\"x2\":63.0,\"y2\":114.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"12d60304-e034-41db-8a15-524e1064b2d7\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"66150d52-d64f-48d0-9464-108aec7af89a\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":87.5,\"x2\":137.75,\"y2\":106.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":7.375,\"y\":-1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":73.5,\"x2\":346.0,\"y2\":120.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"CTS Verifier\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":73.5,\"x2\":360.0,\"y2\":120.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":93.0,\"y\":98.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":87.0,\"y\":-1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"66150d52-d64f-48d0-9464-108aec7af89a\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CTS Verifier\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":44.0,\"y1\":82.0,\"x2\":142.0,\"y2\":115.0}}],\"childrenIdList\":[\"ff81af88-2d59-43cd-9f3d-b114090d6217\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify that the list contains the CTS Verifier app","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.177000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0787b92-a6be-4e72-a8b9-7b99d133be03 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0787b92-a6be-4e72-a8b9-7b99d133be03
deleted file mode 100644
index 81af778..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0787b92-a6be-4e72-a8b9-7b99d133be03
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c0787b92-a6be-4e72-a8b9-7b99d133be03","details":"{\"type\":\"CompoundAction\",\"name\":\"test_KeyChain Storage Test\",\"actionId\":\"c0787b92-a6be-4e72-a8b9-7b99d133be03\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to KeyChain Storage Test\",\"actionId\":\"1c6e97ce-d813-4868-9482-2d82626b542c\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"KeyChain Storage Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b57011bc-0755-401d-a052-8681d4613aa4\",\"displayText\":\"KeyChain Storage Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"KeyChain Storage Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":542.0,\"x2\":350.6666666666667,\"y2\":586.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":100.0,\"y\":567.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":80.0,\"y\":-3.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"b57011bc-0755-401d-a052-8681d4613aa4\",\"firstText\":\"KeyChain Storage Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"KeyChain Storage Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":544.0,\"x2\":194.0,\"y2\":590.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, KeyChain Storage Test\",\"actionId\":\"e36a7f24-a571-40a4-bc1c-fb358312e46f\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"KeyChain Storage Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/user_certificate\",\"actionId\":\"e0778a1e-fe4a-49a6-be08-13d83b4174c7\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.certinstaller:id/user_certificate\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify Cert KeyChainTet Key appear\",\"actionId\":\"9d93043e-c8a4-4041-8052-93e4b0e0267b\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"KeyChainTest Keys\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7269421a-1723-4c91-9ff3-3d1e608b8484\",\"displayText\":\"KeyChainTest Keys\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"839353dc-e92f-4e1c-8036-59221752d5d0\",\"displayText\":\"Certificate name\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ce537625-73fa-4c17-948e-59fb7eaafcaf\",\"displayText\":\"Certificate name\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"84e4e1c0-3e78-4f09-ac07-bc2538dc36d5\",\"displayText\":\"Certificate name\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Certificate name\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":38.666666666666664,\"y1\":353.3333333333333,\"x2\":321.3333333333333,\"y2\":371.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Certificate name\"},{\"uuid\":\"1268255d-f29c-4c00-8831-745a1848e532\",\"displayText\":\"KeyChainTest Keys\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.EditText\",\"resourceId\":\"com.android.certinstaller:id/certificate_name\",\"text\":\"KeyChainTest Keys\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":38.666666666666664,\"y1\":371.0,\"x2\":321.3333333333333,\"y2\":412.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":64.0,\"y\":0.16666666666662877,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"KeyChainTest Keys\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":338.6666666666667,\"x2\":336.0,\"y2\":427.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Certificate name\"}],\"className\":\"android.widget.ScrollView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":338.6666666666667,\"x2\":336.0,\"y2\":427.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Certificate name\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/custom\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":338.6666666666667,\"x2\":336.0,\"y2\":427.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":116.0,\"y\":391.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":64.0,\"y\":-8.666666666666629,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"1268255d-f29c-4c00-8831-745a1848e532\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"KeyChainTest Keys\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":35.0,\"y1\":381.0,\"x2\":197.0,\"y2\":402.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, select button\",\"actionId\":\"a98c3909-2198-4b01-948e-965d61fb92a4\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"1923dc3d-d1dc-4de2-9093-4482317b65c2\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Encryption & credentials\",\"actionId\":\"8d6baeed-119f-48f9-81a5-d4b18f0f6683\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Encryption & credentials\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f54875ef-9094-4ff7-b30b-68e8e9ab14dd\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c98f7d82-32af-489d-a1a5-9a7805658ec9\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b0cb87d1-49d6-45e9-a46a-d33f04bdb773\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Encryption & credentials\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":713.0,\"x2\":226.66666666666666,\"y2\":732.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.3333333333333144,\"y\":-0.16666666666674246,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Encryption & credentials\"},{\"uuid\":\"3163c280-bbb9-4ca3-9123-639f74d1a745\",\"displayText\":\"Encrypted\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Encrypted\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":732.6666666666666,\"x2\":124.0,\"y2\":736.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Encrypted\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":698.3333333333334,\"x2\":345.3333333333333,\"y2\":736.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Encryption & credentials\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":698.3333333333334,\"x2\":360.0,\"y2\":736.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":143.0,\"y\":723.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":37.0,\"y\":-5.8333333333332575,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"b0cb87d1-49d6-45e9-a46a-d33f04bdb773\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Encryption & credentials\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":60.0,\"y1\":712.0,\"x2\":226.0,\"y2\":734.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Encryption & credentials\",\"actionId\":\"21fcb392-c011-46b3-a0ab-b64f24f822f9\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Encryption & credentials\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Clear credentials\",\"actionId\":\"06b49de5-040f-49b6-ae07-992b28309a5c\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Clear credentials\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"8c9c888e-186f-4459-9c74-4847497b7fbc\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7bedf4fb-c79a-4b0c-a1c0-d40e9e524a7d\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"1c6e97ce-d813-4868-9482-2d82626b542c\",\"e36a7f24-a571-40a4-bc1c-fb358312e46f\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"e0778a1e-fe4a-49a6-be08-13d83b4174c7\",\"21408006-0414-473e-87dd-282a2f4cce97\",\"9d93043e-c8a4-4041-8052-93e4b0e0267b\",\"21408006-0414-473e-87dd-282a2f4cce97\",\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"a98c3909-2198-4b01-948e-965d61fb92a4\",\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"1923dc3d-d1dc-4de2-9093-4482317b65c2\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"8d6baeed-119f-48f9-81a5-d4b18f0f6683\",\"21fcb392-c011-46b3-a0ab-b64f24f822f9\",\"06b49de5-040f-49b6-ae07-992b28309a5c\",\"21408006-0414-473e-87dd-282a2f4cce97\",\"8c9c888e-186f-4459-9c74-4847497b7fbc\",\"7bedf4fb-c79a-4b0c-a1c0-d40e9e524a7d\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_KeyChain Storage Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.258000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0bfb788-3dfc-45f1-8def-af860884289c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0bfb788-3dfc-45f1-8def-af860884289c
deleted file mode 100644
index 2713f0b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0bfb788-3dfc-45f1-8def-af860884289c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c0bfb788-3dfc-45f1-8def-af860884289c","details":"{\"type\":\"CompoundAction\",\"name\":\"16-11-Always-on VPN\",\"actionId\":\"c0bfb788-3dfc-45f1-8def-af860884289c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Always-on VPN\",\"actionId\":\"0bb98e47-fb28-44e6-b73c-33bb3ae8b459\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Always-on VPN\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"010d6b7d-a228-4433-91c7-9c098d2a1d85\",\"displayText\":\"Always-on VPN\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Always-on VPN\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":536.0,\"x2\":351.3333333333333,\"y2\":578.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":62.5,\"y\":553.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":117.5,\"y\":3.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"010d6b7d-a228-4433-91c7-9c098d2a1d85\",\"firstText\":\"Always-on VPN\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Always-on VPN\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":542.0,\"x2\":117.0,\"y2\":565.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Always-on VPN\",\"actionId\":\"e99c0f45-90db-4b93-85e4-5ec1ccc17688\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Always-on VPN\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told that an always-on VPN is set\",\"actionId\":\"5427a518-29b8-4461-859a-fa6be96c51ba\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Always-on VPN turned on\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"54edb3da-2350-4b10-b928-2d4b2714562b\",\"displayText\":\"Always-on VPN turned on\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ecf44072-2d88-4088-a673-90d5b7a5c74b\",\"displayText\":\"Always-on VPN turned on\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"13a4f5f4-1b79-40a8-a096-24e824ed9f5e\",\"displayText\":\"Always-on VPN turned on\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Always-on VPN turned on\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":415.6666666666667,\"x2\":226.0,\"y2\":434.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.0,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Always-on VPN turned on\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":401.6666666666667,\"x2\":346.0,\"y2\":448.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Always-on VPN turned on\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":401.6666666666667,\"x2\":360.0,\"y2\":448.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":142.5,\"y\":426.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":37.5,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"13a4f5f4-1b79-40a8-a096-24e824ed9f5e\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Always-on VPN turned on\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":49.0,\"y1\":411.0,\"x2\":236.0,\"y2\":442.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c2d8bba8-f7a4-48e6-85a3-506e53ec1728\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set VPN\",\"actionId\":\"da44edef-c56f-44f8-aa4b-632c3dcb3645\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set VPN\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told that an always-on VPN is set\",\"actionId\":\"7f285292-827d-44d3-a817-fdc43ab13432\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Always-on VPN turned on\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ce9dafe7-c036-4d81-8933-db39303e7950\",\"displayText\":\"Always-on VPN turned on\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1e2015d4-c375-47a8-9621-2ecccd109f4a\",\"displayText\":\"Always-on VPN turned on\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a4677e7f-2e3b-4f22-99e4-2086b96b8f3c\",\"displayText\":\"Always-on VPN turned on\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Always-on VPN turned on\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":415.6666666666667,\"x2\":226.0,\"y2\":434.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-10.0,\"y\":2.6666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Always-on VPN turned on\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":401.6666666666667,\"x2\":346.0,\"y2\":448.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Always-on VPN turned on\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":401.6666666666667,\"x2\":360.0,\"y2\":448.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":154.5,\"y\":422.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":25.5,\"y\":2.6666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"a4677e7f-2e3b-4f22-99e4-2086b96b8f3c\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Always-on VPN turned on\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":62.0,\"y1\":413.0,\"x2\":247.0,\"y2\":432.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"0322890d-33c3-4d1e-9b18-ed40e461eb20\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"0bb98e47-fb28-44e6-b73c-33bb3ae8b459\",\"e99c0f45-90db-4b93-85e4-5ec1ccc17688\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"5427a518-29b8-4461-859a-fa6be96c51ba\",\"c2d8bba8-f7a4-48e6-85a3-506e53ec1728\",\"da44edef-c56f-44f8-aa4b-632c3dcb3645\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"7f285292-827d-44d3-a817-fdc43ab13432\",\"0322890d-33c3-4d1e-9b18-ed40e461eb20\",\"b17bcc33-34e0-4aba-a8ce-080ea0d0846c\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-11-Always-on VPN","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.184000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0d95bab-a71d-4109-b402-01d3bad36422 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0d95bab-a71d-4109-b402-01d3bad36422
deleted file mode 100644
index b17f206..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c0d95bab-a71d-4109-b402-01d3bad36422
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c0d95bab-a71d-4109-b402-01d3bad36422","details":"{\"type\":\"CompoundAction\",\"name\":\"15-26-Set password quality\",\"actionId\":\"c0d95bab-a71d-4109-b402-01d3bad36422\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Set password quality\",\"actionId\":\"7d8b0171-8393-4cb8-a310-5f096ecb1ded\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set password quality\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"bd068d12-c854-4a60-a1f6-0ae68a0cf777\",\"displayText\":\"Set password quality\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Set password quality\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":511.75,\"x2\":360.0,\"y2\":553.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":71.5,\"y\":534.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":108.5,\"y\":-1.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"bd068d12-c854-4a60-a1f6-0ae68a0cf777\",\"firstText\":\"Set password quality\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set password quality\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":521.0,\"x2\":141.0,\"y2\":548.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set password quality\",\"actionId\":\"9d6a23fe-7f95-4e2b-ba2b-325ba4b0a047\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set password quality\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Unspecified\",\"actionId\":\"5da30f75-f68d-44c5-9dd3-32305c408963\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Unspecified\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, item1-Something\",\"actionId\":\"a151822b-f0ba-490d-8820-1acafe3dbf3d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Something\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, something\",\"actionId\":\"a2ef32d7-5fa7-4471-abc7-bbe28899cbba\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Something\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, item2-Numeric\",\"actionId\":\"80e4fc4e-6f4f-4052-93ea-751f51713570\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Numeric\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Numeric\",\"actionId\":\"d1ffb3d0-b493-44f7-8b9d-5459a8a79fbc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Numeric\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, item 3-Numeric (Complex)\",\"actionId\":\"19f5d843-7d66-4a1b-bbff-371c3c02079d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Numeric (Complex)\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Numeric (Complex)\",\"actionId\":\"405bd214-5891-4b66-93e3-b439eb020d6e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Numeric (Complex)\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, item4-Alphabetic\",\"actionId\":\"3f344e29-b6ea-47e5-9575-399f0457f165\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Alphabetic\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Alphabetic\",\"actionId\":\"a08627ca-2256-4ac4-9b80-b6c990885a23\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Alphabetic\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,item5- Alphanumeric\",\"actionId\":\"d3c252ea-d103-4f55-aa6a-05d903151df5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Alphanumeric\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Alphanumeric\",\"actionId\":\"82635839-2f00-467c-a4ef-86c29bfd607f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Alphanumeric\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, item6-Complex\",\"actionId\":\"f4e7c2ea-e028-4790-bcc6-5e77ac53bc9e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Complex\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"7d8b0171-8393-4cb8-a310-5f096ecb1ded\",\"9d6a23fe-7f95-4e2b-ba2b-325ba4b0a047\",\"5da30f75-f68d-44c5-9dd3-32305c408963\",\"a151822b-f0ba-490d-8820-1acafe3dbf3d\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"cccc0cd1-82fd-4292-8d4d-2028be141809\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"a2ef32d7-5fa7-4471-abc7-bbe28899cbba\",\"80e4fc4e-6f4f-4052-93ea-751f51713570\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"3e3b1b72-32eb-4f57-a45f-d477fdcb1993\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"d1ffb3d0-b493-44f7-8b9d-5459a8a79fbc\",\"19f5d843-7d66-4a1b-bbff-371c3c02079d\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"3e3b1b72-32eb-4f57-a45f-d477fdcb1993\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"405bd214-5891-4b66-93e3-b439eb020d6e\",\"3f344e29-b6ea-47e5-9575-399f0457f165\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"5225d3a3-cf6f-48c8-ab8a-e04571eb69dc\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"a08627ca-2256-4ac4-9b80-b6c990885a23\",\"d3c252ea-d103-4f55-aa6a-05d903151df5\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"5225d3a3-cf6f-48c8-ab8a-e04571eb69dc\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"82635839-2f00-467c-a4ef-86c29bfd607f\",\"f4e7c2ea-e028-4790-bcc6-5e77ac53bc9e\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"5225d3a3-cf6f-48c8-ab8a-e04571eb69dc\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-26-Set password quality","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.158000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c1068330-ea63-4e42-8806-773d1152094f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c1068330-ea63-4e42-8806-773d1152094f
deleted file mode 100644
index d36359f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c1068330-ea63-4e42-8806-773d1152094f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c1068330-ea63-4e42-8806-773d1152094f","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if screen back to main screen of Device Owner Tests\",\"actionId\":\"c1068330-ea63-4e42-8806-773d1152094f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if screen back to main of Device Owner Tests\",\"actionId\":\"76a6f1d4-5e1d-4268-854a-e887333c8ad9\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set up device owner\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0a8a8c46-deca-4d1e-a86d-b8e8f4b10585\",\"displayText\":\"Set up device owner\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.cts.verifier:id/set_device_owner_button\",\"text\":\"Set up device owner\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":267.75,\"x2\":351.25,\"y2\":309.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":173.0,\"y\":286.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":7.0,\"y\":2.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"0a8a8c46-deca-4d1e-a86d-b8e8f4b10585\",\"firstText\":\"Set up device owner\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set up device owner\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":91.0,\"y1\":272.0,\"x2\":255.0,\"y2\":301.0}}],\"childrenIdList\":[\"76a6f1d4-5e1d-4268-854a-e887333c8ad9\",\"370c511c-5950-4b3a-b832-60f2a606a27a\",\"b36ee844-6807-46a4-9073-3d5c83f730fd\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if screen back to main screen of Device Owner Tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.083000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c131f309-79ae-48c8-a354-4410a90e97e4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c131f309-79ae-48c8-a354-4410a90e97e4
deleted file mode 100644
index 1c06a0d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c131f309-79ae-48c8-a354-4410a90e97e4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c131f309-79ae-48c8-a354-4410a90e97e4","details":"{\"type\":\"CompoundAction\",\"name\":\"11 & 17-04 -Disable keyguard test\",\"actionId\":\"c131f309-79ae-48c8-a354-4410a90e97e4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disable keyguard\",\"actionId\":\"5b69aea5-0e68-4f23-85d7-366035e21a6a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disable keyguard\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"853a3828-63ba-419d-ab31-21a5f23ff227\",\"displayText\":\"Disable keyguard\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disable keyguard\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":451.3333333333333,\"x2\":350.6666666666667,\"y2\":495.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":70.0,\"y\":472.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":110.0,\"y\":1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"853a3828-63ba-419d-ab31-21a5f23ff227\",\"firstText\":\"Disable keyguard\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disable keyguard\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":458.0,\"x2\":132.0,\"y2\":486.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disable keyguard\",\"actionId\":\"08d4e663-6674-4136-a7a6-e51448e674ae\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disable keyguard\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Disable keyguard button\",\"actionId\":\"76992197-a69d-4272-8d78-afe276e36d1c\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"delayAfterActionMs\":3000,\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"class\",\"operator\":\"=\",\"value\":\"android.widget.Button\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Disable keyguard\"}]},\"clickAfterValidation\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"42709ea0-4da8-45ec-8984-45c918dbcb98\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"1e58c03f-e985-4447-bd49-41937ea7cfab\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify no keyguard was shown\",\"actionId\":\"29bb81fb-b7ea-4cf2-8484-e38e3c814185\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.systemui:id/lock_icon\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"cf374a62-689a-477a-9fb4-d05217d6b72b\",\"displayText\":\"Unlock\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"3baa02c4-7e44-40d0-9338-f719c8673fab\",\"displayText\":\"Unlock\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.systemui:id/lock_icon\",\"contentDesc\":\"Unlock\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":160.66666666666666,\"y1\":40.333333333333336,\"x2\":199.33333333333334,\"y2\":79.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":4.5,\"y\":-5.833333333333329,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Unlock\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/lock_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":160.66666666666666,\"y1\":22.0,\"x2\":199.33333333333334,\"y2\":115.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":175.5,\"y\":65.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":4.5,\"y\":3.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"3baa02c4-7e44-40d0-9338-f719c8673fab\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.systemui:id/lock_icon\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":143.0,\"y1\":35.0,\"x2\":208.0,\"y2\":96.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Reenable keyguard\",\"actionId\":\"89e8dff0-9afc-4530-9613-0e65d1d2f5ee\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Reenable keyguard\"},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"523bfc29-6cf6-47ef-b518-d662ad759fb0\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"bfeb1664-756d-4d24-8974-67ae68b0705b\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify keyguard was shown\",\"actionId\":\"7339507e-3170-40e6-bb52-2a8063cde9d1\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.systemui:id/lock_icon\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"cd8b20c2-f109-493e-916e-70e3a33ea489\",\"displayText\":\"Unlock\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"bb7f8089-6686-4a93-9ff8-f22e19e8f911\",\"displayText\":\"Unlock\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.systemui:id/lock_icon\",\"contentDesc\":\"Unlock\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":160.66666666666666,\"y1\":40.333333333333336,\"x2\":199.33333333333334,\"y2\":79.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.5,\"y\":-0.3333333333333286,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Unlock\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/lock_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":160.66666666666666,\"y1\":22.0,\"x2\":199.33333333333334,\"y2\":115.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":176.5,\"y\":60.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":3.5,\"y\":8.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"bb7f8089-6686-4a93-9ff8-f22e19e8f911\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.systemui:id/lock_icon\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":139.0,\"y1\":39.0,\"x2\":214.0,\"y2\":81.0}}],\"childrenIdList\":[\"5b69aea5-0e68-4f23-85d7-366035e21a6a\",\"08d4e663-6674-4136-a7a6-e51448e674ae\",\"76992197-a69d-4272-8d78-afe276e36d1c\",\"42709ea0-4da8-45ec-8984-45c918dbcb98\",\"1e58c03f-e985-4447-bd49-41937ea7cfab\",\"29bb81fb-b7ea-4cf2-8484-e38e3c814185\",\"89e8dff0-9afc-4530-9613-0e65d1d2f5ee\",\"523bfc29-6cf6-47ef-b518-d662ad759fb0\",\"bfeb1664-756d-4d24-8974-67ae68b0705b\",\"7339507e-3170-40e6-bb52-2a8063cde9d1\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"11 & 17-04 -Disable keyguard test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.107000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c1d1e74e-9d20-482f-9c48-58faaf8b8c7f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c1d1e74e-9d20-482f-9c48-58faaf8b8c7f
deleted file mode 100644
index b888881..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c1d1e74e-9d20-482f-9c48-58faaf8b8c7f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c1d1e74e-9d20-482f-9c48-58faaf8b8c7f","details":"{\"type\":\"CompoundAction\",\"name\":\"15-19-Disallow aireplane mode\",\"actionId\":\"c1d1e74e-9d20-482f-9c48-58faaf8b8c7f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow airplane mode\",\"actionId\":\"f175068a-2b51-42af-b3c7-559319c419f6\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow airplane mode\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1d16a949-c93c-4a6e-88f8-60ece1476e19\",\"displayText\":\"Disallow airplane mode\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow airplane mode\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":263.0,\"x2\":360.0,\"y2\":307.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":97.5,\"y\":284.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":82.5,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"1d16a949-c93c-4a6e-88f8-60ece1476e19\",\"firstText\":\"Disallow airplane mode\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow airplane mode\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":275.0,\"x2\":189.0,\"y2\":294.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow airplane mode\",\"actionId\":\"ba056e8c-3d4c-4a2e-983d-b4837d503450\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow airplane mode\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Airplane mode\",\"actionId\":\"89223836-8361-4201-a910-4ef35f30f5a6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Airplane mode\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"841f6260-944f-4b8e-8c3e-3e27e649ca2b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7b66f85c-141e-41d8-baff-6f4329b1ba58\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"SwipeAction\",\"name\":\"left\",\"actionId\":\"63ce82c0-1db7-443e-81e8-8247f17fdc66\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":340,\"startY\":320,\"endX\":20,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, Airplane mode\",\"actionId\":\"8be617af-a738-4a5d-9502-727ef7e03349\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Airplane mode\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"cd0ba14c-facd-4cb4-baa6-ed88431479a2\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"f175068a-2b51-42af-b3c7-559319c419f6\",\"ba056e8c-3d4c-4a2e-983d-b4837d503450\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"89223836-8361-4201-a910-4ef35f30f5a6\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"841f6260-944f-4b8e-8c3e-3e27e649ca2b\",\"7b66f85c-141e-41d8-baff-6f4329b1ba58\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"63ce82c0-1db7-443e-81e8-8247f17fdc66\",\"8be617af-a738-4a5d-9502-727ef7e03349\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"cd0ba14c-facd-4cb4-baa6-ed88431479a2\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-19-Disallow aireplane mode","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.149000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c21b516b-b794-463c-8bd1-649826d334bb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c21b516b-b794-463c-8bd1-649826d334bb
deleted file mode 100644
index 7eb0d1f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c21b516b-b794-463c-8bd1-649826d334bb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c21b516b-b794-463c-8bd1-649826d334bb","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Instant Apps Recents Test(Check image)\",\"actionId\":\"c21b516b-b794-463c-8bd1-649826d334bb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Instant Apps Recents Test\",\"actionId\":\"452cfcaf-5031-4ce5-9422-4e79f98c0886\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Instant Apps Recents Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4ebd8dc6-7a1c-4ea7-b0dc-e8e992523455\",\"displayText\":\"Instant Apps Recents Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Instant Apps Recents Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":442.25,\"x2\":351.25,\"y2\":484.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":95.5,\"y\":463.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":84.5,\"y\":0.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"4ebd8dc6-7a1c-4ea7-b0dc-e8e992523455\",\"firstText\":\"Instant Apps Recents Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Instant Apps Recents Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":3.0,\"y1\":446.0,\"x2\":188.0,\"y2\":480.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Instant Apps Recents Test\",\"actionId\":\"ad160ae1-c955-4f1f-b0d6-c76716f85968\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Instant Apps Recents Test\"},{\"type\":\"InputAction\",\"name\":\"Overview Button\",\"actionId\":\"cfd27d2b-a361-4b8d-a6ad-88502c1afcc7\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":187,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"9adcd6c7-039e-4486-9786-7a4210a34894\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"4a5cc2d0-916c-420e-8ea6-9712c92e8c60\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"452cfcaf-5031-4ce5-9422-4e79f98c0886\",\"ad160ae1-c955-4f1f-b0d6-c76716f85968\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"b53eeaf5-391f-4964-84fa-d086c2b938e1\",\"7ccaea57-2cd8-466d-b5fa-abbfb89831b3\",\"f89554c3-fe5e-4a96-aa56-261a920a689a\",\"cfd27d2b-a361-4b8d-a6ad-88502c1afcc7\",\"9adcd6c7-039e-4486-9786-7a4210a34894\",\"9b9343fa-a795-4169-883b-32dca700c4b6\",\"f89554c3-fe5e-4a96-aa56-261a920a689a\",\"4a5cc2d0-916c-420e-8ea6-9712c92e8c60\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_instant_app_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsVerifierInstantApp.apk\"}}","name":"test_Instant Apps Recents Test(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.063000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c3259a91-454a-42a5-b169-2d282d70f076 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c3259a91-454a-42a5-b169-2d282d70f076
deleted file mode 100644
index e21c4a3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c3259a91-454a-42a5-b169-2d282d70f076
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c3259a91-454a-42a5-b169-2d282d70f076","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Clear button\",\"actionId\":\"c3259a91-454a-42a5-b169-2d282d70f076\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Clear\",\"actionId\":\"aed25a5f-d7fc-4f44-9704-41d17dd8876b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Clear\"}],\"childrenIdList\":[\"aed25a5f-d7fc-4f44-9704-41d17dd8876b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Clear button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.262000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c33097db-480e-433c-af22-ed22357d7c76 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c33097db-480e-433c-af22-ed22357d7c76
deleted file mode 100644
index 75ca7ac..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c33097db-480e-433c-af22-ed22357d7c76
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c33097db-480e-433c-af22-ed22357d7c76","details":"{\"type\":\"CompoundAction\",\"name\":\"22-Network Logging UI(Check image)\",\"actionId\":\"c33097db-480e-433c-af22-ed22357d7c76\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Network Logging UI\",\"actionId\":\"00bb4d7d-0cfa-4f1c-a9df-d6d44c983c5b\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Network Logging UI\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d344adad-79d2-400c-97ec-9ecc30d19426\",\"displayText\":\"Network Logging UI\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Network Logging UI\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":545.0,\"x2\":351.25,\"y2\":587.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":78.0,\"y\":565.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":102.0,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d344adad-79d2-400c-97ec-9ecc30d19426\",\"firstText\":\"Network Logging UI\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Network Logging UI\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":553.0,\"x2\":151.0,\"y2\":577.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Network Logging UI\",\"actionId\":\"5bbe7930-8fb4-45c4-8f6d-d8f00f0f91b5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Network Logging UI\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told that your device is managed\",\"actionId\":\"dffaef8a-e21c-4638-be67-bbb7d39f68f4\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"This device belongs to your organization\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7585edc2-3d63-4e1e-9986-2de79db2746d\",\"displayText\":\"This device belongs to your organization\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"665fd56b-dd15-475b-bdf7-e1c731bc62d7\",\"displayText\":\"This device belongs to your organization\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/footer_text\",\"text\":\"This device belongs to your organization\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":74.25,\"y1\":360.5,\"x2\":264.5,\"y2\":374.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.375,\"y\":4.125,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"This device belongs to your organization\"},{\"uuid\":\"1cda8e82-c28f-4861-bb08-73504da1219f\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.systemui:id/footer_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":271.5,\"y1\":360.5,\"x2\":285.5,\"y2\":374.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":60.25,\"y1\":348.25,\"x2\":299.5,\"y2\":387.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":167.0,\"y\":363.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":12.875,\"y\":4.125,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"665fd56b-dd15-475b-bdf7-e1c731bc62d7\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This device belongs to your organization\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":69.0,\"y1\":347.0,\"x2\":265.0,\"y2\":380.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Enable Network Logging\",\"actionId\":\"e1949e3a-a29c-4bd4-bb14-6f4bd4671f70\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Enable Network Logging\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP-Check that an icon appeared next to the text about device management\",\"actionId\":\"cec57167-1485-4e63-917b-0b2d9b83ab52\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that device is managed\",\"actionId\":\"793e0e1b-8e8c-4374-a196-7cf63d07832e\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Your organization owns this device and may monitor network traffic\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3148c677-321c-41e7-aa9b-d1b6947c0666\",\"displayText\":\"Your organization owns this device and may monitor network traffic\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"9e18750e-7547-4e88-8a69-f56597311f6d\",\"displayText\":\"Your organization owns this device and may monitor network traffic\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/footer_text\",\"text\":\"Your organization owns this device and may monitor network traffic\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":360.5,\"x2\":321.5,\"y2\":374.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Your organization owns this device and may monitor network traffic\"},{\"uuid\":\"f4a8bc35-24c1-41a0-9be2-79be73405c16\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.systemui:id/footer_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":328.5,\"y1\":360.5,\"x2\":342.5,\"y2\":374.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":348.25,\"x2\":356.5,\"y2\":387.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":155.0,\"y\":364.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":25.0,\"y\":3.625,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"3148c677-321c-41e7-aa9b-d1b6947c0666\",\"firstText\":\"Your organization owns this device and may monitor network traffic\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Your organization owns this device and may monitor network traffic\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":86.0,\"y1\":349.0,\"x2\":224.0,\"y2\":379.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"05ed8764-76c4-443e-8de4-e91ad9ea61bd\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP-Verify that a notification including the same icon popped up\",\"actionId\":\"24c89f2a-1d49-4d44-a5bc-56aafd848981\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Your organization manages this device and may monitor network traffic. Tap for details.\",\"actionId\":\"114f14bc-f910-4345-ade8-81db5fb83e10\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Your organization manages this device and may monitor network traffic. Tap for details.\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that managed message\",\"actionId\":\"6d9b92ea-715f-48d2-86e8-481b38456dba\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Your admin has turned on network logging, which monitors traffic on your device.\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"9a0e404b-ed01-4079-abf3-60002cad348d\",\"displayText\":\"Your admin has turned on network logging, which monitors traffic on your device.\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"b2e5932f-33af-4c06-aa8d-4107a105892e\",\"displayText\":\"Network logging\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/network_logging_subtitle\",\"text\":\"Network logging\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":35.0,\"y1\":391.75,\"x2\":325.0,\"y2\":432.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Network logging\"},{\"uuid\":\"60dc8730-799e-4ad0-a29c-598e1a197600\",\"displayText\":\"Your admin has turned on network logging, which monitors traffic on your device.\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.systemui:id/network_logging_warning\",\"text\":\"Your admin has turned on network logging, which monitors traffic on your device.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":35.0,\"y1\":432.5,\"x2\":325.0,\"y2\":468.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":11.0,\"y\":1.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Your admin has turned on network logging, which monitors traffic on your device.\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.systemui:id/network_logging_disclosures\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":35.0,\"y1\":391.75,\"x2\":325.0,\"y2\":489.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":169.0,\"y\":449.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":11.0,\"y\":-8.625,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"60dc8730-799e-4ad0-a29c-598e1a197600\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Your admin has turned on network logging, which monitors traffic on your device.\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":33.0,\"y1\":429.0,\"x2\":305.0,\"y2\":469.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, View Policies button\",\"actionId\":\"596901ce-4220-4ba2-bd8f-0b82daca0a46\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button2\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify \\\"Managed device info\\\" page is opened\",\"actionId\":\"579e17ab-5d2e-49ac-92f6-cb62e7e2de69\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Managed device info\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"322f2f77-6b6b-4480-b949-f92d214e27ce\",\"displayText\":\"Managed device info\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"3e67fd70-9d0c-41ea-8917-e048e64f9223\",\"displayText\":\"Navigate up\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageButton\",\"contentDesc\":\"Navigate up\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":24.5,\"x2\":49.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Navigate up\"},{\"uuid\":\"0b9396b1-952f-408d-bef5-1b0e1bf4d6ab\",\"displayText\":\"Managed device info\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"text\":\"Managed device info\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":37.25,\"x2\":232.5,\"y2\":60.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.75,\"y\":2.375,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Managed device info\"},{\"uuid\":\"b153cd1f-e915-42b5-b5aa-180f9aea0a34\",\"displayText\":\"Search settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f084e7e9-161c-47d9-9d4b-921ee1c80cc0\",\"displayText\":\"Search settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"contentDesc\":\"Search settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":276.0,\"y1\":28.0,\"x2\":318.0,\"y2\":70.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Search settings\"},{\"uuid\":\"6e99af5a-9ced-40b3-abb6-164b79f0828d\",\"displayText\":\"Help & feedback\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"contentDesc\":\"Help & feedback\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":318.0,\"y1\":28.0,\"x2\":360.0,\"y2\":70.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Help & feedback\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":276.0,\"y1\":24.5,\"x2\":360.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Search settings\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"com.android.settings:id/action_bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":24.5,\"x2\":360.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":152.5,\"y\":46.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":27.5,\"y\":2.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"0b9396b1-952f-408d-bef5-1b0e1bf4d6ab\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Managed device info\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":55.0,\"y1\":37.0,\"x2\":250.0,\"y2\":56.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c786fec8-1892-4520-93dd-5980d14a7e06\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disable Network Logging\",\"actionId\":\"38e43ec3-c0f8-4147-9225-1b833261b29f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disable Network Logging\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that the notification is disappeared\",\"actionId\":\"d5a864e4-4dad-4b4c-9332-8e68571b114a\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Your organization manages this device and may monitor network traffic. Tap for details.\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"230c5813-d58c-43be-bba8-d0d0b2be3bed\",\"displayText\":\"Your organization manages this device and may monitor network traffic. Tap for details.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"57a4b720-c73b-416e-9763-3794ea067666\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.android.systemui:id/backgroundNormal\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":194.25,\"x2\":356.5,\"y2\":303.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"4014b68f-2507-4b19-a5a2-771f80e31457\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"acb61c4a-025a-49fc-ac84-894fbc4cd54f\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"4d7de95f-4b44-4c6b-8c79-efad79bc1f5d\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7914fdbb-3f8a-467e-9a84-7938b3484f9b\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"fa1993f1-248d-4885-8277-538cc5d54ba0\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":208.25,\"x2\":31.75,\"y2\":224.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/header_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":208.25,\"x2\":36.0,\"y2\":224.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"fa75a523-472e-4a38-a7cf-3bed005a8131\",\"displayText\":\"Android System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"Android System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":38.75,\"y1\":209.0,\"x2\":112.75,\"y2\":223.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Android System\"},{\"uuid\":\"7045e0be-e3e6-424b-97ad-65f12b6eb2d3\",\"displayText\":\"•\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/time_divider\",\"text\":\"•\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":116.25,\"y1\":209.0,\"x2\":119.75,\"y2\":223.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"•\"},{\"uuid\":\"0e5f493e-5220-4ce2-bd72-bed3e1cc7884\",\"displayText\":\"now\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/time\",\"text\":\"now\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":123.25,\"y1\":209.0,\"x2\":143.0,\"y2\":223.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"now\"},{\"uuid\":\"dd7dc43f-2f22-470b-9220-89ed40ffdb3f\",\"displayText\":\"Alerted\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/alerted_icon\",\"contentDesc\":\"Alerted\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":148.25,\"y1\":210.75,\"x2\":158.75,\"y2\":221.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Alerted\"},{\"uuid\":\"41702fec-5549-4078-bcef-8d394bc99cf4\",\"displayText\":\"Collapse\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/expand_button\",\"contentDesc\":\"Collapse\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":311.75,\"y1\":195.0,\"x2\":353.75,\"y2\":237.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Collapse\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/notification_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":194.25,\"x2\":356.5,\"y2\":238.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Android System\"},{\"uuid\":\"70f0ad06-eee3-4e47-a42e-d4d18b703d6c\",\"displayText\":\"Device is managed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ec97d920-93e7-4ae6-b417-216c449151ac\",\"displayText\":\"Device is managed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f609b7a0-69dd-4fbb-87ba-e45682ed015d\",\"displayText\":\"Device is managed\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"daca5554-e4ef-4121-8764-b556352ffa63\",\"displayText\":\"Device is managed\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Device is managed\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":234.5,\"x2\":342.5,\"y2\":251.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Device is managed\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/line1\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":234.5,\"x2\":342.5,\"y2\":251.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Device is managed\"},{\"uuid\":\"f56b6d10-402f-4189-b9bb-24d0c5471d2c\",\"displayText\":\"Your organization manages this device and may monitor network traffic. Tap for details.\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/big_text\",\"text\":\"Your organization manages this device and may monitor network traffic. Tap for details.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":251.5,\"x2\":342.5,\"y2\":285.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":58.0,\"y\":-3.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Your organization manages this device and may monitor network traffic. Tap for details.\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/notification_main_column\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":234.5,\"x2\":356.5,\"y2\":285.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Device is managed\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/notification_action_list_margin_target\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":234.5,\"x2\":356.5,\"y2\":285.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Device is managed\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/status_bar_latest_event_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":194.25,\"x2\":356.5,\"y2\":303.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Android System\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/expanded\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":194.25,\"x2\":356.5,\"y2\":303.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Android System\"},{\"uuid\":\"b05e5b39-9fe1-48ac-ae22-772d7aa19e79\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/fake_shadow\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":194.25,\"x2\":356.5,\"y2\":303.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":194.25,\"x2\":356.5,\"y2\":303.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":122.0,\"y\":272.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":58.0,\"y\":-23.375,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"f56b6d10-402f-4189-b9bb-24d0c5471d2c\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Your organization manages this device and may monitor network traffic. Tap for details.\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":259.0,\"x2\":234.0,\"y2\":285.0}}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"00bb4d7d-0cfa-4f1c-a9df-d6d44c983c5b\",\"5bbe7930-8fb4-45c4-8f6d-d8f00f0f91b5\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"dffaef8a-e21c-4638-be67-bbb7d39f68f4\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"e1949e3a-a29c-4bd4-bb14-6f4bd4671f70\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"cec57167-1485-4e63-917b-0b2d9b83ab52\",\"793e0e1b-8e8c-4374-a196-7cf63d07832e\",\"05ed8764-76c4-443e-8de4-e91ad9ea61bd\",\"24c89f2a-1d49-4d44-a5bc-56aafd848981\",\"114f14bc-f910-4345-ade8-81db5fb83e10\",\"6d9b92ea-715f-48d2-86e8-481b38456dba\",\"596901ce-4220-4ba2-bd8f-0b82daca0a46\",\"579e17ab-5d2e-49ac-92f6-cb62e7e2de69\",\"c786fec8-1892-4520-93dd-5980d14a7e06\",\"38e43ec3-c0f8-4147-9225-1b833261b29f\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"d5a864e4-4dad-4b4c-9332-8e68571b114a\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"22-Network Logging UI(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.211000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c3700e79-6895-4fa0-8b1b-d34c5fa5b82d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c3700e79-6895-4fa0-8b1b-d34c5fa5b82d
deleted file mode 100644
index a3054b8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c3700e79-6895-4fa0-8b1b-d34c5fa5b82d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c3700e79-6895-4fa0-8b1b-d34c5fa5b82d","details":"{\"type\":\"CompoundAction\",\"name\":\"02-Sharing of requested bugreport declined while being taken\",\"actionId\":\"c3700e79-6895-4fa0-8b1b-d34c5fa5b82d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Sharing of requested bugreport declined while being taken\",\"actionId\":\"c82b9ab3-de34-4f18-bc12-8224225b4adf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Sharing of requested bugreport declined while being taken\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Taking bugreport...\\\" with an indefinite progress bar is present\",\"actionId\":\"c86f4fd4-58a2-48a2-8a8f-6d6c3995ca97\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Taking bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"160a5cd3-079d-477a-b32a-a27755bd8e0e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 10 secs\",\"actionId\":\"9a3d1b5f-0310-4ba5-a2ab-7228f2ae0ecc\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":10000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Bugreport is already being collected on this device\\\" is present\",\"actionId\":\"c8d42c9b-f92f-49b6-afe0-241ed9548b87\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Bugreport is already being collected on this device\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Dismiss Bugreport is already being collected on this device notification\",\"actionId\":\"3930b14e-2ed4-43aa-8013-87a0fcebed44\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Bugreport is already being collected on this device\\\").swipe()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, Taking bug report…\",\"actionId\":\"5d6e4cc7-9dd5-4d77-86cc-99b74d6453a1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Taking bug report\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY a message \\\"Your IT admin requested a bug report to help troubleshoot this device....\\\" is present\",\"actionId\":\"86f20e37-2538-49da-be05-4fbc10d470a3\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Your IT admin requested a bug report to help troubleshoot this device\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY Bugreport sharing declined is present\",\"actionId\":\"63d14aa1-4fed-473d-bac0-f1e216e8625d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Bugreport sharing declined\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Dismiss \\\"Bugreport sharing declined\\\" message\",\"actionId\":\"38fed661-0791-4f83-81fa-9f2275bf03b5\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Bugreport sharing declined\\\").swipe()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"414f5f8a-5661-4a49-b421-ba573c5fc964\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"4f3ec13b-589a-4ca3-b456-7224028d0604\",\"c82b9ab3-de34-4f18-bc12-8224225b4adf\",\"4275df2b-8d38-49a9-b956-6d5f06257f5a\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"c86f4fd4-58a2-48a2-8a8f-6d6c3995ca97\",\"160a5cd3-079d-477a-b32a-a27755bd8e0e\",\"4275df2b-8d38-49a9-b956-6d5f06257f5a\",\"9a3d1b5f-0310-4ba5-a2ab-7228f2ae0ecc\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"c8d42c9b-f92f-49b6-afe0-241ed9548b87\",\"3930b14e-2ed4-43aa-8013-87a0fcebed44\",\"5d6e4cc7-9dd5-4d77-86cc-99b74d6453a1\",\"86f20e37-2538-49da-be05-4fbc10d470a3\",\"7eec7b1d-4c98-48f8-ab8b-8c82006cfef4\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"63d14aa1-4fed-473d-bac0-f1e216e8625d\",\"38fed661-0791-4f83-81fa-9f2275bf03b5\",\"414f5f8a-5661-4a49-b421-ba573c5fc964\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"02-Sharing of requested bugreport declined while being taken","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.069000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c42d7405-be13-45c1-bead-84f86ce54262 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c42d7405-be13-45c1-bead-84f86ce54262
deleted file mode 100644
index 513675f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c42d7405-be13-45c1-bead-84f86ce54262
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c42d7405-be13-45c1-bead-84f86ce54262","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Alarms and Timers Tests-Full Alarm Test\",\"actionId\":\"c42d7405-be13-45c1-bead-84f86ce54262\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Full Alarm Test\",\"actionId\":\"ffd5966f-98b8-4666-a2db-2d44f04d699b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Full Alarm Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Create Alarm\",\"actionId\":\"3efddd8c-9c9a-4d8d-a9d8-4670eee4f4e9\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Create Alarm\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Name of alarm is Create Alarm Test\",\"actionId\":\"02328500-b1c7-456e-8366-71ed7e9dfb81\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/edit_label\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Create Alarm Test\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Vibrate is ON\",\"actionId\":\"f7f689be-9f31-43bc-a53c-5f210a2d6f2d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"true\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Vibrate\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Ringtone is Silent\",\"actionId\":\"49a5145f-95d1-4f1a-85ef-ad537532b0ef\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/choose_ringtone\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Silent\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Time is 01:23\",\"actionId\":\"094356bc-f74d-4e3a-905d-72a89e69b414\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.google.android.deskclock:id/digital_clock\"},{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"1:23 AM\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Repeat checked\",\"actionId\":\"bde74e88-3bb6-4723-9c8f-9fcdd2990cef\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"true\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Repeat\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Sunday Disabled\",\"actionId\":\"59b8d8d9-0465-4c6a-b629-c2619cb22802\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Sunday\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"S\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Monday Enabled\",\"actionId\":\"05293815-3949-4daf-bb63-a08ada48cf67\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Monday\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"M\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Tuesday Disabled\",\"actionId\":\"72110d77-9ccf-4ad8-9056-5897f2d3e558\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Tuesday\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"T\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Wednesday Enabled\",\"actionId\":\"be1f507d-e416-4d40-840e-089e59eae5b2\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Wednesday\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"W\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"true\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Thursday Disabled\",\"actionId\":\"e5a59014-f680-4a8a-9539-3bbe65eb7fed\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Thursday\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"T\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Friday Disabled\",\"actionId\":\"e1471055-1d9c-4d54-9729-d074efbe428b\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Friday\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"F\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-Saturday Disabled\",\"actionId\":\"fca70b2a-7dde-4e0a-93e3-220691553957\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"Saturday\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"S\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"20fec6ee-8d99-4900-981a-e9ebb44be7ec\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"3832f622-3408-4968-9429-c0c9e11905d5\",\"ffd5966f-98b8-4666-a2db-2d44f04d699b\",\"3efddd8c-9c9a-4d8d-a9d8-4670eee4f4e9\",\"02328500-b1c7-456e-8366-71ed7e9dfb81\",\"f7f689be-9f31-43bc-a53c-5f210a2d6f2d\",\"49a5145f-95d1-4f1a-85ef-ad537532b0ef\",\"094356bc-f74d-4e3a-905d-72a89e69b414\",\"bde74e88-3bb6-4723-9c8f-9fcdd2990cef\",\"59b8d8d9-0465-4c6a-b629-c2619cb22802\",\"05293815-3949-4daf-bb63-a08ada48cf67\",\"72110d77-9ccf-4ad8-9056-5897f2d3e558\",\"be1f507d-e416-4d40-840e-089e59eae5b2\",\"e5a59014-f680-4a8a-9539-3bbe65eb7fed\",\"e1471055-1d9c-4d54-9729-d074efbe428b\",\"fca70b2a-7dde-4e0a-93e3-220691553957\",\"61f8f3bd-bae5-4a38-949c-f759cda9375e\",\"20fec6ee-8d99-4900-981a-e9ebb44be7ec\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Alarms and Timers Tests-Full Alarm Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.030000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c60af00e-9503-4c6d-a6f1-410419405024 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c60af00e-9503-4c6d-a6f1-410419405024
deleted file mode 100644
index 4087cda..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c60af00e-9503-4c6d-a6f1-410419405024
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c60af00e-9503-4c6d-a6f1-410419405024","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Instant Apps Notification Test\",\"actionId\":\"c60af00e-9503-4c6d-a6f1-410419405024\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Instant Apps Notification Test\",\"actionId\":\"60edd4ca-a93d-4d7f-97a4-4907eed14c7f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Instant Apps Notification Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f4241561-970d-47eb-9714-6f6c4259a557\",\"displayText\":\"Instant Apps Notification Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Instant Apps Notification Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":403.0,\"x2\":351.25,\"y2\":445.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":105.5,\"y\":421.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":74.5,\"y\":2.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"f4241561-970d-47eb-9714-6f6c4259a557\",\"firstText\":\"Instant Apps Notification Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Instant Apps Notification Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":7.0,\"y1\":409.0,\"x2\":204.0,\"y2\":434.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Instant Apps Notification Test\",\"actionId\":\"2f84faf3-ab47-4f4b-b90c-e62ce2d6d56e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Instant Apps Notification Test\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Instant Apps\",\"actionId\":\"095f080a-7fd4-4ea0-8e16-b827ee951652\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Instant Apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c69e19de-dc88-4964-9a75-4e5e516719e7\",\"displayText\":\"Instant Apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"633977bb-467b-4cba-8b6c-5dee631c51ac\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.android.systemui:id/backgroundNormal\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":607.0,\"x2\":356.5,\"y2\":690.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"1ebbc8d7-6764-4a37-b735-8b2dfae8feac\",\"displayText\":\"Instant Apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"07b6d02d-14c7-456d-9a63-b12fab505430\",\"displayText\":\"Instant Apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7412303f-6487-4d27-881e-9199db1d8d7b\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"85ee0ecb-7be0-401b-b411-ecb12725ccd6\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":621.0,\"x2\":31.75,\"y2\":636.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/header_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":621.0,\"x2\":36.0,\"y2\":636.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"92936681-8f8e-49be-aac6-fab972677e8a\",\"displayText\":\"Instant Apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"Instant Apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":38.75,\"y1\":621.75,\"x2\":98.0,\"y2\":636.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.375,\"y\":-0.625,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Instant Apps\"},{\"uuid\":\"2e34e3b8-27b7-4203-b379-e2f628875146\",\"displayText\":\"•\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/header_text_divider\",\"text\":\"•\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":101.5,\"y1\":621.75,\"x2\":105.0,\"y2\":636.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"•\"},{\"uuid\":\"1bab14f0-52ca-4966-a627-cffc3e6615ae\",\"displayText\":\"Sample Instant App for Testing running\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/header_text\",\"text\":\"Sample Instant App for Testing running\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":108.5,\"y1\":621.75,\"x2\":290.25,\"y2\":636.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Sample Instant App for Testing running\"},{\"uuid\":\"002e0d34-b830-4c72-b807-f124b2b662be\",\"displayText\":\"Expand\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/expand_button\",\"contentDesc\":\"Expand\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":311.75,\"y1\":607.75,\"x2\":353.75,\"y2\":649.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Expand\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/notification_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":607.0,\"x2\":356.5,\"y2\":650.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Instant Apps\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/expanded\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":607.0,\"x2\":356.5,\"y2\":690.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Instant Apps\"},{\"uuid\":\"58e50ba0-c6ce-4fd5-8cb8-75dec9eff367\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/fake_shadow\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":607.0,\"x2\":356.5,\"y2\":690.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":607.0,\"x2\":356.5,\"y2\":650.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":67.0,\"y\":629.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":113.0,\"y\":-0.625,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"92936681-8f8e-49be-aac6-fab972677e8a\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Instant Apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":36.0,\"y1\":621.0,\"x2\":98.0,\"y2\":638.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Instant Apps\",\"actionId\":\"af875290-c5b8-4348-be63-026a49461725\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Instant Apps\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find \\\"Go to browser\\\"\",\"actionId\":\"2eba5ece-5384-4ee2-bc0e-ec53715406ab\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Go to browser\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"62dc1ff3-5d3e-47c9-b140-558877390db3\",\"displayText\":\"Go to browser\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"8613e30b-898b-4288-81c5-0c31d7dfd275\",\"displayText\":\"Go to browser\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/action0\",\"text\":\"Go to browser\",\"contentDesc\":\"Go to browser\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":7.0,\"y1\":552.5,\"x2\":110.25,\"y2\":594.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.625,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Go to browser\"},{\"uuid\":\"80e24fd8-d525-453e-98a4-f2c8a93379c2\",\"displayText\":\"App info\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/action0\",\"text\":\"App info\",\"contentDesc\":\"App info\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":113.75,\"y1\":552.5,\"x2\":182.75,\"y2\":594.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"App info\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/actions\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":547.25,\"x2\":346.0,\"y2\":599.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":58.0,\"y\":571.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":116.75,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"8613e30b-898b-4288-81c5-0c31d7dfd275\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Go to browser\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":11.0,\"y1\":561.0,\"x2\":105.0,\"y2\":582.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Go to browser\",\"actionId\":\"0a7a88e0-c5f2-44d2-8333-e3f05c48b495\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Go to browser\"},{\"type\":\"ConditionClickAction\",\"name\":\"Click Accept button if need\",\"actionId\":\"fe129759-c832-4a13-ad55-a53364c03404\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.chrome:id/terms_accept\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"42122879-cb6f-4fb3-91e6-0f187bda61a0\",\"displayText\":\"Accept & continue\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.chrome:id/terms_accept\",\"text\":\"Accept & continue\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":117.5,\"y1\":667.25,\"x2\":242.25,\"y2\":709.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":176.0,\"y\":687.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":3.875,\"y\":0.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"42122879-cb6f-4fb3-91e6-0f187bda61a0\",\"firstText\":\"Accept & continue\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.chrome:id/terms_accept\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":121.0,\"y1\":675.0,\"x2\":231.0,\"y2\":700.0}},{\"type\":\"ConditionClickAction\",\"name\":\"Click No thanks button if need\",\"actionId\":\"b60d3684-2ed9-4f9c-b182-f4bb500f6eeb\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.chrome:id/negative_button\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"afc5f759-f8a3-470b-827b-8f498db8d6bb\",\"displayText\":\"No thanks\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"a0acaea9-9e3a-4d02-9713-c680858f2592\",\"displayText\":\"No thanks\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.chrome:id/negative_button\",\"text\":\"No thanks\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":662.0,\"x2\":92.5,\"y2\":704.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.75,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"No thanks\"},{\"uuid\":\"ac0b2a13-ed1f-425d-af35-082dab4b7618\",\"displayText\":\"Add account\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.chrome:id/positive_button\",\"text\":\"Add account\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":253.0,\"y1\":662.0,\"x2\":346.0,\"y2\":704.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Add account\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.chrome:id/button_bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":648.0,\"x2\":360.0,\"y2\":718.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":50.5,\"y\":682.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":129.5,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"a0acaea9-9e3a-4d02-9713-c680858f2592\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.chrome:id/negative_button\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":19.0,\"y1\":670.0,\"x2\":82.0,\"y2\":695.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Make sure chrome is launched\",\"actionId\":\"b896a3f9-3d3d-47f6-add9-e71a8e1c4d29\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.chrome:id/url_bar\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"63f07e27-a17e-4394-8e2b-41800cc91877\",\"displayText\":\"source.android.com\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"233abf52-7767-4cea-9baa-42a9ee36d851\",\"displayText\":\"Connection is secure. Site information\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f19314c2-3aed-4c3d-90d4-7597d35bdc04\",\"displayText\":\"Connection is secure. Site information\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.chrome:id/location_bar_status_icon\",\"contentDesc\":\"Connection is secure. Site information\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":50.75,\"y1\":24.5,\"x2\":75.25,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Connection is secure. Site information\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.chrome:id/location_bar_status\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":50.75,\"y1\":24.5,\"x2\":78.75,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Connection is secure. Site information\"},{\"uuid\":\"bfb1fa3e-c94c-419a-a6c7-03836a55dc3f\",\"displayText\":\"source.android.com\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.EditText\",\"resourceId\":\"com.android.chrome:id/url_bar\",\"text\":\"source.android.com\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":78.75,\"y1\":27.25,\"x2\":267.25,\"y2\":70.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":19.5,\"y\":-3.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"source.android.com\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.chrome:id/location_bar\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":42.0,\"y1\":24.5,\"x2\":276.0,\"y2\":73.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":153.5,\"y\":52.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":5.5,\"y\":-3.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"bfb1fa3e-c94c-419a-a6c7-03836a55dc3f\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.chrome:id/url_bar\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":71.0,\"y1\":44.0,\"x2\":236.0,\"y2\":60.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ad8fc312-e1f4-48da-a807-9ed0b6c8b5e6\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"eefa0086-ede5-414e-a697-040388fb86e3\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Instant Apps Notification Test\",\"actionId\":\"ac2027a0-fd92-44b4-904a-016e89d04a6a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Instant Apps Notification Test\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Instant Apps\",\"actionId\":\"58df2879-50df-4a02-a7ac-3bdc5a625840\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Instant Apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f08440f1-5a50-4098-8edd-2c3969a5c093\",\"displayText\":\"Instant Apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"08ea76e4-1b02-4038-bc7a-3ce4edb757f1\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.android.systemui:id/backgroundNormal\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":556.0,\"x2\":356.5,\"y2\":690.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"e4025e30-f419-483a-acdc-dea7e1fa8232\",\"displayText\":\"Instant Apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7354c344-2bb9-41bb-8de2-bb29b49282d4\",\"displayText\":\"Instant Apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"14194c11-290a-4ce9-bf40-8b11d81b7c65\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2577300b-584e-4860-9f09-3574a65486bf\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":570.0,\"x2\":31.75,\"y2\":585.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"android:id/header_icon_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":17.5,\"y1\":570.0,\"x2\":36.0,\"y2\":585.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"d46ab90f-dd68-4b91-b81b-058eeff6ea17\",\"displayText\":\"Instant Apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/app_name_text\",\"text\":\"Instant Apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":38.75,\"y1\":570.75,\"x2\":98.0,\"y2\":585.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.875,\"y\":0.375,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Instant Apps\"},{\"uuid\":\"b8563b0c-7fb2-4588-bc41-24143e6b048f\",\"displayText\":\"•\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/header_text_divider\",\"text\":\"•\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":101.5,\"y1\":570.75,\"x2\":105.0,\"y2\":585.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"•\"},{\"uuid\":\"fb6ca8d7-4631-40cd-bc14-ad50bc193fc7\",\"displayText\":\"Sample Instant App for Testing running\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/header_text\",\"text\":\"Sample Instant App for Testing running\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":108.5,\"y1\":570.75,\"x2\":290.25,\"y2\":585.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Sample Instant App for Testing running\"},{\"uuid\":\"d6fd1428-652f-4698-a2db-bda4869345d6\",\"displayText\":\"Expand\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/expand_button\",\"contentDesc\":\"Expand\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":311.75,\"y1\":556.75,\"x2\":353.75,\"y2\":598.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Expand\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"android:id/notification_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":556.0,\"x2\":356.5,\"y2\":599.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Instant Apps\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/expanded\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":556.0,\"x2\":356.5,\"y2\":690.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Instant Apps\"},{\"uuid\":\"b0595566-00f2-4a8b-886f-1f5a2ccb1ef0\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.systemui:id/fake_shadow\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":556.0,\"x2\":356.5,\"y2\":690.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":556.0,\"x2\":356.5,\"y2\":599.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":67.5,\"y\":577.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":112.5,\"y\":0.375,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d46ab90f-dd68-4b91-b81b-058eeff6ea17\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Instant Apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":34.0,\"y1\":569.0,\"x2\":101.0,\"y2\":586.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Instant Apps\",\"actionId\":\"e17ce462-0957-4138-97ca-52235c25aaed\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Instant Apps\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to App info\",\"actionId\":\"37022be6-ce98-4be9-82c3-7b7987cde34a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"App info\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"71f512b3-cd17-4b5e-875e-ecb84c7df4a7\",\"displayText\":\"App info\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"32eb1597-d627-40f5-8a8e-4645e6153c98\",\"displayText\":\"Go to browser\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/action0\",\"text\":\"Go to browser\",\"contentDesc\":\"Go to browser\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":7.0,\"y1\":560.75,\"x2\":110.25,\"y2\":602.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Go to browser\"},{\"uuid\":\"bf937e1e-9a4b-4235-a86d-6a7f23663b15\",\"displayText\":\"App info\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"android:id/action0\",\"text\":\"App info\",\"contentDesc\":\"App info\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":113.75,\"y1\":560.75,\"x2\":182.75,\"y2\":602.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-3.25,\"y\":-1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"App info\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/actions\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":555.5,\"x2\":346.0,\"y2\":608.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":151.5,\"y\":583.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":23.25,\"y\":-1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"bf937e1e-9a4b-4235-a86d-6a7f23663b15\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"App info\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":122.0,\"y1\":573.0,\"x2\":181.0,\"y2\":593.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, App info\",\"actionId\":\"d30e138d-1391-4c89-b51c-dd1fd9b7a577\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"App info\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Sample Instant App for Testing exists\",\"actionId\":\"34b311bf-df6f-43b2-881f-af839ba5a0ab\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Sample Instant App for Testing\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e4169270-9c5e-4f72-8986-442473170888\",\"displayText\":\"Sample Instant App for Testing\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"30b2fdcb-12ff-4413-a5d8-dd4e6e6f1afb\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/entity_header_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":158.75,\"y1\":94.5,\"x2\":200.75,\"y2\":136.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"eec16089-d23d-4171-9da8-1bb12563f840\",\"displayText\":\"Sample Instant App for Testing\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/entity_header_title\",\"text\":\"Sample Instant App for Testing\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":55.75,\"y1\":143.5,\"x2\":304.0,\"y2\":166.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.375,\"y\":-0.375,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Sample Instant App for Testing\"},{\"uuid\":\"dbb1aa78-b770-4457-9fd3-3ecfdb43a77b\",\"displayText\":\"Instant app\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/install_type\",\"text\":\"Instant app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":149.0,\"y1\":168.5,\"x2\":210.5,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Instant app\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/entity_header_content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":55.75,\"y1\":94.5,\"x2\":304.0,\"y2\":185.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":178.5,\"y\":155.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":1.375,\"y\":-15.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"eec16089-d23d-4171-9da8-1bb12563f840\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Sample Instant App for Testing\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":48.0,\"y1\":143.0,\"x2\":309.0,\"y2\":168.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if it have \\\"Clear app\\\" button\",\"actionId\":\"b5bd21bf-e715-47b5-aab6-9bc2a79e6e1c\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Clear app\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6dea178b-b8e6-477e-8b56-1f42c53dd77c\",\"displayText\":\"Clear app\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"1c4b2e7d-5c51-465d-84eb-d375509e4f81\",\"displayText\":\"Open\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7603d570-4e90-4124-8ce3-1f800f3f03ce\",\"displayText\":\"Open\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/launch\",\"text\":\"Open\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":7.0,\"y1\":199.0,\"x2\":166.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Open\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":7.0,\"y1\":199.0,\"x2\":173.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Open\"},{\"uuid\":\"f8106978-ff86-491b-becb-4de7c797f813\",\"displayText\":\"Clear app\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/clear_data\",\"text\":\"Clear app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":180.0,\"y1\":199.0,\"x2\":346.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-7.5,\"y\":-14.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Clear app\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/instant_app_button_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":199.0,\"x2\":360.0,\"y2\":275.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":270.5,\"y\":251.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-90.5,\"y\":-14.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"f8106978-ff86-491b-becb-4de7c797f813\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Clear app\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":230.0,\"y1\":240.0,\"x2\":311.0,\"y2\":263.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"258e655e-e26e-4e29-98c3-afdd74f6e184\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"bc567504-591b-488a-ad4f-a57f249ec160\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"60edd4ca-a93d-4d7f-97a4-4907eed14c7f\",\"2f84faf3-ab47-4f4b-b90c-e62ce2d6d56e\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"b53eeaf5-391f-4964-84fa-d086c2b938e1\",\"7ccaea57-2cd8-466d-b5fa-abbfb89831b3\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"095f080a-7fd4-4ea0-8e16-b827ee951652\",\"af875290-c5b8-4348-be63-026a49461725\",\"2eba5ece-5384-4ee2-bc0e-ec53715406ab\",\"0a7a88e0-c5f2-44d2-8333-e3f05c48b495\",\"fe129759-c832-4a13-ad55-a53364c03404\",\"b60d3684-2ed9-4f9c-b182-f4bb500f6eeb\",\"b896a3f9-3d3d-47f6-add9-e71a8e1c4d29\",\"ad8fc312-e1f4-48da-a807-9ed0b6c8b5e6\",\"eefa0086-ede5-414e-a697-040388fb86e3\",\"ac2027a0-fd92-44b4-904a-016e89d04a6a\",\"b53eeaf5-391f-4964-84fa-d086c2b938e1\",\"7ccaea57-2cd8-466d-b5fa-abbfb89831b3\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"58df2879-50df-4a02-a7ac-3bdc5a625840\",\"e17ce462-0957-4138-97ca-52235c25aaed\",\"37022be6-ce98-4be9-82c3-7b7987cde34a\",\"d30e138d-1391-4c89-b51c-dd1fd9b7a577\",\"34b311bf-df6f-43b2-881f-af839ba5a0ab\",\"b5bd21bf-e715-47b5-aab6-9bc2a79e6e1c\",\"258e655e-e26e-4e29-98c3-afdd74f6e184\",\"bc567504-591b-488a-ad4f-a57f249ec160\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_instant_app_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsVerifierInstantApp.apk\"}}","name":"test_Instant Apps Notification Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.059000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c6612b18-5a86-4e82-b7fe-7487ddc09db1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c6612b18-5a86-4e82-b7fe-7487ddc09db1
deleted file mode 100644
index 076d923..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c6612b18-5a86-4e82-b7fe-7487ddc09db1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c6612b18-5a86-4e82-b7fe-7487ddc09db1","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn on Do not Disturb on quick setting\",\"actionId\":\"c6612b18-5a86-4e82-b7fe-7487ddc09db1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Check if Do Not Distrub Off\",\"actionId\":\"61c1bc00-0673-4d7d-983c-d8fdf1ba84c3\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"contains\",\"value\":\"Do Not Disturb\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Off\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Do Not Disturb\",\"actionId\":\"65e66960-ec07-46a2-944b-5ba7ddefc473\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Do Not Disturb\"}],\"childrenIdList\":[\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"61c1bc00-0673-4d7d-983c-d8fdf1ba84c3\",\"65e66960-ec07-46a2-944b-5ba7ddefc473\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn on Do not Disturb on quick setting","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.982000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c6ce936e-5dc7-4eee-a2a0-171ccb438ae7 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c6ce936e-5dc7-4eee-a2a0-171ccb438ae7
deleted file mode 100644
index 9312408..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c6ce936e-5dc7-4eee-a2a0-171ccb438ae7
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c6ce936e-5dc7-4eee-a2a0-171ccb438ae7","details":"{\"type\":\"CompoundAction\",\"name\":\"Remove work profile\",\"actionId\":\"c6ce936e-5dc7-4eee-a2a0-171ccb438ae7\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/search_action_bar_title\",\"actionId\":\"98c9afcc-d9e7-4614-97c2-5d89cab713d5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/search_action_bar_title\"},{\"type\":\"InputAction\",\"name\":\"INPUT-Accounts\",\"actionId\":\"ad39ceb2-b31e-47b7-81a5-350b28e77a48\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":0,\"inputString\":\"Accounts\",\"isSingleChar\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"Click-to enter Accounts\",\"actionId\":\"fb7b15cb-5d31-417a-b0a9-99ea66474db5\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/title\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Accounts\"}]},\"clickAfterValidation\":true},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-if Work Tab exists\",\"actionId\":\"9201ce40-fcc9-4a62-8a31-41365908a922\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Work\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work\",\"actionId\":\"4ba59711-a35b-4174-ac43-a323e1e9792d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Remove work profile\",\"actionId\":\"c39cf09f-d2c8-40a9-b08c-318ec94c8a77\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Remove work profile\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button1\",\"actionId\":\"346d40ca-1dd4-4d0a-94da-cda07fe2c567\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"98c9afcc-d9e7-4614-97c2-5d89cab713d5\",\"ad39ceb2-b31e-47b7-81a5-350b28e77a48\",\"fb7b15cb-5d31-417a-b0a9-99ea66474db5\",\"9201ce40-fcc9-4a62-8a31-41365908a922\",\"4ba59711-a35b-4174-ac43-a323e1e9792d\",\"c39cf09f-d2c8-40a9-b08c-318ec94c8a77\",\"346d40ca-1dd4-4d0a-94da-cda07fe2c567\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Remove work profile","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.310000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c7a524d7-b4b3-4e41-a6ae-2deaa4af43e5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c7a524d7-b4b3-4e41-a6ae-2deaa4af43e5
deleted file mode 100644
index 3e352db..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c7a524d7-b4b3-4e41-a6ae-2deaa4af43e5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c7a524d7-b4b3-4e41-a6ae-2deaa4af43e5","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Off Body Sensor Tests\",\"actionId\":\"c7a524d7-b4b3-4e41-a6ae-2deaa4af43e5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Off Body Sensor Tests\",\"actionId\":\"89023b43-dffd-4474-92c5-701b6573f26f\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Off Body Sensor Tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0de4ee46-4a4b-40ad-98f9-83d96224da1c\",\"displayText\":\"Off Body Sensor Tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Off Body Sensor Tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":436.6666666666667,\"x2\":350.6666666666667,\"y2\":480.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":91.0,\"y\":458.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":89.0,\"y\":0.6666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"0de4ee46-4a4b-40ad-98f9-83d96224da1c\",\"firstText\":\"Off Body Sensor Tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Off Body Sensor Tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":446.0,\"x2\":172.0,\"y2\":470.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Off Body Sensor Tests\",\"actionId\":\"7b1708f0-7eb9-4732-9e14-37ad0bdfc7e2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Off Body Sensor Tests\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/next_button\",\"actionId\":\"fe013b7f-b390-445c-93f4-95053a4d4fed\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/next_button\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-If it's in CTS-V main list\",\"actionId\":\"99120672-e5d0-4700-9b71-c8aa917147b8\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/export\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"49d12aa6-c679-44be-ba72-a6c46a5cd4d7\",\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"89023b43-dffd-4474-92c5-701b6573f26f\",\"7b1708f0-7eb9-4732-9e14-37ad0bdfc7e2\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"fe013b7f-b390-445c-93f4-95053a4d4fed\",\"99120672-e5d0-4700-9b71-c8aa917147b8\",\"49c301ea-be46-4ac5-87fc-21262da2994c\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Off Body Sensor Tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.271000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c8aa9cc8-5d60-4130-b8ed-217545c43231 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c8aa9cc8-5d60-4130-b8ed-217545c43231
deleted file mode 100644
index 0f0f5d9..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c8aa9cc8-5d60-4130-b8ed-217545c43231
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c8aa9cc8-5d60-4130-b8ed-217545c43231","details":"{\"type\":\"CompoundAction\",\"name\":\"07_Profile-aware device administrator settings(Check image)\",\"actionId\":\"c8aa9cc8-5d60-4130-b8ed-217545c43231\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Profile-aware device administrator settings\",\"actionId\":\"d9080a57-44df-4b1b-bc35-e90295aa35af\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Profile-aware device administrator settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"513aac93-a0c2-4436-b042-cf8764a56af6\",\"displayText\":\"Profile-aware device administrator settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Profile-aware device administrator settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":635.3333333333334,\"x2\":360.0,\"y2\":679.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":150.0,\"y\":653.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":30.0,\"y\":3.8333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"513aac93-a0c2-4436-b042-cf8764a56af6\",\"firstText\":\"Profile-aware device administrator settings\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Profile-aware device administrator settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":300.0,\"y1\":670.0,\"x2\":0.0,\"y2\":637.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Profile-aware device administrator settings\",\"actionId\":\"e515e029-cdbf-4c52-9f64-a6d74d666169\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Profile-aware device administrator settings\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Device admin apps\",\"actionId\":\"ca8b7a55-c4f7-4698-94f7-9e1a00cc3884\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device admin apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"429561a8-b5bb-45be-b678-7504ef997c87\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e7f67b14-059e-4cda-a937-5b73d4195d09\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"21e248b8-8f30-4e34-a9df-8523a67bfe13\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Device admin apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":368.3333333333333,\"x2\":191.0,\"y2\":388.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":-0.8333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Device admin apps\"},{\"uuid\":\"bf4c56c9-3b3a-4cc1-ac76-b184d4c4bd2f\",\"displayText\":\"1 active app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"1 active app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":388.0,\"x2\":136.0,\"y2\":405.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"1 active app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":353.6666666666667,\"x2\":345.3333333333333,\"y2\":420.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Device admin apps\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":353.6666666666667,\"x2\":360.0,\"y2\":420.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":128.5,\"y\":379.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":51.5,\"y\":8.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"21e248b8-8f30-4e34-a9df-8523a67bfe13\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device admin apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":63.0,\"y1\":368.0,\"x2\":194.0,\"y2\":390.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Device admin apps\",\"actionId\":\"e6d13da6-3032-497f-a223-7fe8a4ff5be6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device admin apps\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"f087073d-f517-4f78-8fda-892fad960713\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"PythonScriptAction\",\"name\":\"Tap CTS Verifier with badge\",\"actionId\":\"f1101331-e0b9-4c6a-8888-6db99a694264\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nd.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"9efd333e-6f4f-4f1e-bc11-10a1ca5643c6\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Remove work profile\",\"actionId\":\"83bd0fb1-6280-4ab9-bf9b-07a11cafa0ee\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.settings:id/action_button\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Remove work profile\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"Deactivate not exists\",\"actionId\":\"bc991532-da3a-4843-a609-7616eacb3c50\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.settings:id/action_button\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Deactivate\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"d9080a57-44df-4b1b-bc35-e90295aa35af\",\"e515e029-cdbf-4c52-9f64-a6d74d666169\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"ca8b7a55-c4f7-4698-94f7-9e1a00cc3884\",\"e6d13da6-3032-497f-a223-7fe8a4ff5be6\",\"f087073d-f517-4f78-8fda-892fad960713\",\"f1101331-e0b9-4c6a-8888-6db99a694264\",\"9efd333e-6f4f-4f1e-bc11-10a1ca5643c6\",\"83bd0fb1-6280-4ab9-bf9b-07a11cafa0ee\",\"bc991532-da3a-4843-a609-7616eacb3c50\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"07_Profile-aware device administrator settings(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.299000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c9423320-3e9d-40ed-8a84-957a48931121 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c9423320-3e9d-40ed-8a84-957a48931121
deleted file mode 100644
index eaa2ba9..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c9423320-3e9d-40ed-8a84-957a48931121
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c9423320-3e9d-40ed-8a84-957a48931121","details":"{\"type\":\"CompoundAction\",\"name\":\"Enter password \\\"a1688\\\"\",\"actionId\":\"c9423320-3e9d-40ed-8a84-957a48931121\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"INPUT password \\\"a1688\\\"\",\"actionId\":\"62f2c070-fdef-4c02-be0d-7954c373e117\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"a1688\",\"isSingleChar\":false}],\"childrenIdList\":[\"62f2c070-fdef-4c02-be0d-7954c373e117\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Enter password \"a1688\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.268000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c98b2d13-1b60-48d2-b05b-00252bb1c900 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c98b2d13-1b60-48d2-b05b-00252bb1c900
deleted file mode 100644
index de04e64..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/c98b2d13-1b60-48d2-b05b-00252bb1c900
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c98b2d13-1b60-48d2-b05b-00252bb1c900","details":"{\"type\":\"CompoundAction\",\"name\":\"06_Profile-aware accounts settings\",\"actionId\":\"c98b2d13-1b60-48d2-b05b-00252bb1c900\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Profile-aware accounts settings\",\"actionId\":\"cd6ede55-0ef9-4694-b9cb-0eaaa9b0ed36\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Profile-aware accounts settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d079c408-e579-40ca-a054-231d2389ed48\",\"displayText\":\"Add account\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"f0869d0e-44b7-4c8a-9263-5862fd57378e\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7a8985ce-dfee-4c72-a5b3-eb10f95b0029\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":22.0,\"y1\":159.33333333333334,\"x2\":345.3333333333333,\"y2\":166.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":159.33333333333334,\"x2\":360.0,\"y2\":166.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"068a1410-b8dc-4740-afa9-340a71e626ee\",\"displayText\":\"Add account\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"40ae673d-b9a3-496b-af2f-def50d0242bc\",\"displayText\":\"Add account\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"35e3b624-0b80-43ab-9a66-9186e86e3152\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"fc2abbdf-2b0f-4f60-8541-34448fbc9197\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":180.0,\"x2\":36.666666666666664,\"y2\":202.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":176.33333333333334,\"x2\":66.0,\"y2\":205.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"cf6fcc7e-3672-499c-ab06-ce40f2adf188\",\"displayText\":\"Add account\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cc27a308-be3c-418e-92ad-887685d92594\",\"displayText\":\"Add account\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Add account\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":181.33333333333334,\"x2\":150.0,\"y2\":201.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Add account\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":166.66666666666666,\"x2\":345.3333333333333,\"y2\":215.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Add account\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":166.66666666666666,\"x2\":360.0,\"y2\":215.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Add account\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":166.66666666666666,\"x2\":360.0,\"y2\":215.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Add account\"},{\"uuid\":\"73e31f79-b157-443f-a8ef-fc0f109dc386\",\"displayText\":\"Auto-sync personal data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cec93d2f-6fdb-4188-a2c5-6541891e6e3d\",\"displayText\":\"Auto-sync personal data\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3322d129-2103-40d9-aab7-2b27fcb32f8e\",\"displayText\":\"Auto-sync personal data\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Auto-sync personal data\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":230.33333333333334,\"x2\":227.33333333333334,\"y2\":250.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Auto-sync personal data\"},{\"uuid\":\"0978177d-4f8c-497a-8a15-f0a6225c1b9f\",\"displayText\":\"Let apps refresh data automatically\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Let apps refresh data automatically\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":250.0,\"x2\":269.6666666666667,\"y2\":267.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Let apps refresh data automatically\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":215.66666666666666,\"x2\":288.0,\"y2\":282.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Auto-sync personal data\"},{\"uuid\":\"48225620-1255-4725-9f3e-d45a6666372d\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"9bef7560-f31b-469c-ab3a-9bed612ce3c4\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Switch\",\"resourceId\":\"android:id/switch_widget\",\"checked\":true,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":302.6666666666667,\"y1\":236.66666666666666,\"x2\":345.3333333333333,\"y2\":261.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/widget_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":288.0,\"y1\":215.66666666666666,\"x2\":345.3333333333333,\"y2\":282.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":215.66666666666666,\"x2\":360.0,\"y2\":282.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Auto-sync personal data\"}],\"className\":\"androidx.recyclerview.widget.RecyclerView\",\"resourceId\":\"com.android.settings:id/recycler_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":144.66666666666666,\"x2\":360.0,\"y2\":736.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":255.5,\"y\":415.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-75.5,\"y\":24.833333333333314,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"d079c408-e579-40ca-a054-231d2389ed48\",\"firstText\":\"Add account\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Profile-aware accounts settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":275.0,\"y1\":440.0,\"x2\":236.0,\"y2\":391.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Profile-aware accounts settings\",\"actionId\":\"4fb6b5e1-ab88-4c38-889b-eaa165d72845\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Profile-aware accounts settings\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work\",\"actionId\":\"0aa5c244-67b3-4ab1-acca-b56c8b34721c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Remove work profile\",\"actionId\":\"0cb9dda6-9438-4ed3-8b07-7138ccd3fb0c\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Remove work profile\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"afb02412-b7be-4d31-b239-18b6fe19ebec\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"63a47b5d-dee5-4970-aa06-12372abb5c92\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"cd6ede55-0ef9-4694-b9cb-0eaaa9b0ed36\",\"4fb6b5e1-ab88-4c38-889b-eaa165d72845\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"7b8a5983-efee-45ea-aaa2-9aaf6d82e063\",\"4aa267cc-73f0-487e-aa22-e57d487ff769\",\"0aa5c244-67b3-4ab1-acca-b56c8b34721c\",\"0cb9dda6-9438-4ed3-8b07-7138ccd3fb0c\",\"afb02412-b7be-4d31-b239-18b6fe19ebec\",\"63a47b5d-dee5-4970-aa06-12372abb5c92\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"06_Profile-aware accounts settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.297000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/caa6ccab-46bc-4259-abd1-dabe145e275a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/caa6ccab-46bc-4259-abd1-dabe145e275a
deleted file mode 100644
index 3cfe90a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/caa6ccab-46bc-4259-abd1-dabe145e275a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"caa6ccab-46bc-4259-abd1-dabe145e275a","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn off airplane mode\",\"actionId\":\"caa6ccab-46bc-4259-abd1-dabe145e275a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Network & internet\",\"actionId\":\"30dd6bb5-0e8e-437c-a5ca-929acabdee98\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Network & internet\"},{\"type\":\"PythonScriptAction\",\"name\":\"Turn airplane mode switch off\",\"actionId\":\"57c638fb-4944-47a6-97d2-4e764a1edf6e\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"Airplane mode\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist():\\n d.text(\\\"Airplane mode\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"30dd6bb5-0e8e-437c-a5ca-929acabdee98\",\"57c638fb-4944-47a6-97d2-4e764a1edf6e\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn off airplane mode","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.275000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cae61682-7071-4c67-94c1-963ff2cbe978 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cae61682-7071-4c67-94c1-963ff2cbe978
deleted file mode 100644
index 9447023..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cae61682-7071-4c67-94c1-963ff2cbe978
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cae61682-7071-4c67-94c1-963ff2cbe978","details":"{\"type\":\"CompoundAction\",\"name\":\"VERIFY you are not told the device is managed\",\"actionId\":\"cae61682-7071-4c67-94c1-963ff2cbe978\",\"actionType\":\"COMPOUND_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY on the lock screen, you are not told the device is managed\",\"actionId\":\"8081fb6b-d9e3-405a-8cb5-16761a9d655d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"This device belongs to your organization\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"8081fb6b-d9e3-405a-8cb5-16761a9d655d\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"VERIFY you are not told the device is managed","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.218000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cc9d7c01-f4f6-418f-8017-afcfe3344147 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cc9d7c01-f4f6-418f-8017-afcfe3344147
deleted file mode 100644
index bcbc5d3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cc9d7c01-f4f6-418f-8017-afcfe3344147
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cc9d7c01-f4f6-418f-8017-afcfe3344147","details":"{\"type\":\"CompoundAction\",\"name\":\"test_BYOD Managed Provisioning\",\"actionId\":\"cc9d7c01-f4f6-418f-8017-afcfe3344147\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[],\"childrenIdList\":[\"015882d1-9ce9-4b67-a7e3-925ee0798fe4\",\"6d46cead-4200-4830-ab73-aa5b72d8cee0\",\"731c2600-1169-402e-91ee-98a4dd31506f\",\"5e7a1b39-3e17-45e2-863f-ad55e97d901f\",\"9e63b2da-d744-4a93-907f-3486c60407cb\",\"c98b2d13-1b60-48d2-b05b-00252bb1c900\",\"c8aa9cc8-5d60-4130-b8ed-217545c43231\",\"d9789ba1-6855-459c-9d3f-30799e7dcb87\",\"4994c7d8-acaf-4272-b8f5-6768561cf2cf\",\"1d4b27f3-51f7-4f20-b674-f5a097b6d7d5\",\"11db7055-3e2e-475f-8620-1bef6bb6f5bd\",\"d342c4dd-f898-4df1-aa92-cf6ac97d772a\",\"acc515c6-092f-4d36-898f-4c8d33652223\",\"1a737a07-f83f-41f1-8831-ca5c16ce3268\",\"9a43346d-fd4d-4892-8938-bb911c5f1fff\",\"0cd14890-b229-4bdf-a5e5-0e86f7805dfe\",\"06b95829-83ea-43e3-9620-11c733b49b41\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_BYOD Managed Provisioning","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.315000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cccc0cd1-82fd-4292-8d4d-2028be141809 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cccc0cd1-82fd-4292-8d4d-2028be141809
deleted file mode 100644
index 5c9d579..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cccc0cd1-82fd-4292-8d4d-2028be141809
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cccc0cd1-82fd-4292-8d4d-2028be141809","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify None/Swipe\",\"actionId\":\"cccc0cd1-82fd-4292-8d4d-2028be141809\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, None\",\"actionId\":\"f0138472-d27a-4940-b9e4-910fff2eba50\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"None\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"60137e1c-eae7-477b-acfc-ec2ff20d2088\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Swipe\",\"actionId\":\"8bc0da01-a47f-484f-a4a5-39bdb64927ba\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Swipe\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"d0d39131-6ffc-4f38-88d8-9929a44d0bf3\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"f0138472-d27a-4940-b9e4-910fff2eba50\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"60137e1c-eae7-477b-acfc-ec2ff20d2088\",\"8bc0da01-a47f-484f-a4a5-39bdb64927ba\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"d0d39131-6ffc-4f38-88d8-9929a44d0bf3\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify None/Swipe","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.158000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cd0de494-22a4-45d1-b5b4-74d5585cccf8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cd0de494-22a4-45d1-b5b4-74d5585cccf8
deleted file mode 100644
index 4d09736..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cd0de494-22a4-45d1-b5b4-74d5585cccf8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cd0de494-22a4-45d1-b5b4-74d5585cccf8","details":"{\"type\":\"CompoundAction\",\"name\":\"15-25-Set maximum time to lock\",\"actionId\":\"cd0de494-22a4-45d1-b5b4-74d5585cccf8\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Set maximum time to lock\",\"actionId\":\"26dc6e6d-5b02-4118-b2c2-dba7d776ad13\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set maximum time to lock\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d971bb80-98e9-46c4-9409-42a4e659e44d\",\"displayText\":\"Set maximum time to lock\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Set maximum time to lock\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":467.3333333333333,\"x2\":360.0,\"y2\":511.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":94.0,\"y\":488.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":86.0,\"y\":1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"d971bb80-98e9-46c4-9409-42a4e659e44d\",\"firstText\":\"Set maximum time to lock\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set maximum time to lock\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":0.0,\"y1\":470.0,\"x2\":188.0,\"y2\":506.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set maximum time to lock\",\"actionId\":\"4d896eee-a7eb-400b-9f52-f35217f51709\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set maximum time to lock\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/edit_text_widget\",\"actionId\":\"a0b6adce-d7e3-4f1f-918d-7e6ab93fa2dc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/edit_text_widget\"},{\"type\":\"InputAction\",\"name\":\"INPUT 60 secs\",\"actionId\":\"a4345a2b-8749-46b0-857b-3f8903aada5d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"60\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/update_button\",\"actionId\":\"24d3baf7-2b9a-4295-812e-f8095d4e07f6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/update_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Screen timeout\",\"actionId\":\"1b285ea0-826e-4747-9e91-ed9f980f7d57\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Screen timeout\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify \\\"2 minutes\\\" option is disabled\",\"actionId\":\"f9ec331e-9c6e-4d37-bab0-97cb588992c5\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"2 minutes\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4f5a6965-a7b9-4999-af33-d421d8e979e9\",\"displayText\":\"2 minutes\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0b025044-54ab-490d-8f59-ec515c62b2f1\",\"displayText\":\"2 minutes\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.CheckedTextView\",\"resourceId\":\"com.android.settings:id/text1\",\"text\":\"2 minutes\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":42.333333333333336,\"y1\":333.0,\"x2\":314.0,\"y2\":362.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":52.16666666666666,\"y\":-2.8333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"2 minutes\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":325.6666666666667,\"x2\":336.0,\"y2\":369.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":126.0,\"y\":350.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":54.0,\"y\":-2.8333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"0b025044-54ab-490d-8f59-ec515c62b2f1\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"2 minutes\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":83.0,\"y1\":335.0,\"x2\":169.0,\"y2\":366.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify \\\"5 minutes\\\" option is disabled\",\"actionId\":\"59d405ee-bbd9-4b2b-ab09-59ceaa563a37\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"5 minutes\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"24de7ba8-998d-40ae-ba99-4e6fc54a3d17\",\"displayText\":\"5 minutes\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"47b68cd4-e966-48f8-8965-7d806b34973b\",\"displayText\":\"5 minutes\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.CheckedTextView\",\"resourceId\":\"com.android.settings:id/text1\",\"text\":\"5 minutes\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":42.333333333333336,\"y1\":377.0,\"x2\":314.0,\"y2\":406.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":51.16666666666666,\"y\":0.6666666666666288,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"5 minutes\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":369.6666666666667,\"x2\":336.0,\"y2\":413.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":127.0,\"y\":391.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":53.0,\"y\":0.6666666666666856,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"47b68cd4-e966-48f8-8965-7d806b34973b\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"5 minutes\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":86.0,\"y1\":382.0,\"x2\":168.0,\"y2\":400.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify \\\"10 minutes\\\" option is disabled\",\"actionId\":\"60858fd2-c7eb-4b87-b739-5a1e5bf4da68\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"10 minutes\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e9f38417-dd3f-430f-b603-9780192ecd77\",\"displayText\":\"10 minutes\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"34d3da4b-2759-49f6-9892-ee81fa991113\",\"displayText\":\"10 minutes\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.CheckedTextView\",\"resourceId\":\"com.android.settings:id/text1\",\"text\":\"10 minutes\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":42.333333333333336,\"y1\":421.0,\"x2\":314.0,\"y2\":450.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":49.16666666666666,\"y\":-1.3333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"10 minutes\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":413.6666666666667,\"x2\":336.0,\"y2\":457.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":129.0,\"y\":437.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":51.0,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"34d3da4b-2759-49f6-9892-ee81fa991113\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"10 minutes\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":88.0,\"y1\":419.0,\"x2\":170.0,\"y2\":455.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify \\\"30 minutes\\\" option is disabled\",\"actionId\":\"45e1e11c-461a-46bd-8a0a-c594644b2285\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"30 minutes\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c1e7d77d-0754-49e6-b90a-2162fb67033f\",\"displayText\":\"30 minutes\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1927f0b6-43ef-4850-bfd2-90ee7631b366\",\"displayText\":\"30 minutes\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.CheckedTextView\",\"resourceId\":\"com.android.settings:id/text1\",\"text\":\"30 minutes\",\"checked\":true,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":42.333333333333336,\"y1\":465.0,\"x2\":314.0,\"y2\":494.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":41.16666666666666,\"y\":4.666666666666629,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"30 minutes\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":457.6666666666667,\"x2\":336.0,\"y2\":501.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":137.0,\"y\":475.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":43.0,\"y\":4.666666666666686,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"1927f0b6-43ef-4850-bfd2-90ee7631b366\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"30 minutes\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":82.0,\"y1\":458.0,\"x2\":192.0,\"y2\":492.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7d0e5c2d-5235-4801-9c0f-84d55d773e4a\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c6432d73-2d26-493c-9367-282be274154f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"26dc6e6d-5b02-4118-b2c2-dba7d776ad13\",\"4d896eee-a7eb-400b-9f52-f35217f51709\",\"a0b6adce-d7e3-4f1f-918d-7e6ab93fa2dc\",\"a4345a2b-8749-46b0-857b-3f8903aada5d\",\"24d3baf7-2b9a-4295-812e-f8095d4e07f6\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"1b285ea0-826e-4747-9e91-ed9f980f7d57\",\"f9ec331e-9c6e-4d37-bab0-97cb588992c5\",\"59d405ee-bbd9-4b2b-ab09-59ceaa563a37\",\"60858fd2-c7eb-4b87-b739-5a1e5bf4da68\",\"45e1e11c-461a-46bd-8a0a-c594644b2285\",\"7d0e5c2d-5235-4801-9c0f-84d55d773e4a\",\"c6432d73-2d26-493c-9367-282be274154f\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-25-Set maximum time to lock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.157000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ce88edc2-4ae3-4424-9d5b-906134e04383 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ce88edc2-4ae3-4424-9d5b-906134e04383
deleted file mode 100644
index 8aef373..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ce88edc2-4ae3-4424-9d5b-906134e04383
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ce88edc2-4ae3-4424-9d5b-906134e04383","details":"{\"type\":\"CompoundAction\",\"name\":\"If myCert is not installed, install Cert\",\"actionId\":\"ce88edc2-4ae3-4424-9d5b-906134e04383\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if \\\"Internet Widgits Pty Ltd\\\" is installed\",\"actionId\":\"87bc524f-14d6-4067-be1b-a046c4eae407\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Internet Widgits Pty Ltd\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4b2bc858-9a28-4653-b927-7869b3416a9a\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c1da4401-16f4-4baa-a8bb-9147a765979b\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"bd98b7bd-75dd-4075-84df-7c231153c8c3\",\"displayText\":\"Internet Widgits Pty Ltd\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/trusted_credential_subject_primary\",\"text\":\"Internet Widgits Pty Ltd\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":135.75,\"x2\":180.25,\"y2\":157.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-5.375,\"y\":-4.125,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Internet Widgits Pty Ltd\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":122.5,\"x2\":290.5,\"y2\":186.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Internet Widgits Pty Ltd\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":122.5,\"x2\":360.0,\"y2\":186.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":102.5,\"y\":150.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":77.5,\"y\":4.125,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"bd98b7bd-75dd-4075-84df-7c231153c8c3\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Internet Widgits Pty Ltd\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":130.0,\"x2\":201.0,\"y2\":171.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"94e7f6c1-47e8-49d9-ae47-512ca88cc5f0\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action,install credential button\",\"actionId\":\"81d42fdc-79f1-4796-9579-22f1ed6d72c7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/install\"}],\"childrenIdList\":[\"87bc524f-14d6-4067-be1b-a046c4eae407\",\"94e7f6c1-47e8-49d9-ae47-512ca88cc5f0\",\"81d42fdc-79f1-4796-9579-22f1ed6d72c7\",\"0e355b97-b105-4074-8e2f-c4d1e0a69a08\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"If myCert is not installed, install Cert","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.233000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf14915f-d938-43d7-b09b-40a0a3c80fd8 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf14915f-d938-43d7-b09b-40a0a3c80fd8
deleted file mode 100644
index 45681bb..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf14915f-d938-43d7-b09b-40a0a3c80fd8
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cf14915f-d938-43d7-b09b-40a0a3c80fd8","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Notification Attention Management Test\",\"actionId\":\"cf14915f-d938-43d7-b09b-40a0a3c80fd8\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Notification Attention Management Test\",\"actionId\":\"7bd094e4-2785-47a3-9136-8122a7bdd769\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Notification Attention Management Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"20f2465f-a7e9-47f6-aa1d-7157d20292a5\",\"displayText\":\"Notification Attention Management Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Notification Attention Management Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":410.0,\"x2\":351.25,\"y2\":452.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":152.0,\"y\":436.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":28.0,\"y\":-5.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"20f2465f-a7e9-47f6-aa1d-7157d20292a5\",\"firstText\":\"Notification Attention Management Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Notification Attention Management Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":420.0,\"x2\":300.0,\"y2\":452.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Notification Attention Management Test\",\"actionId\":\"d69daab9-62bf-46a5-8cf1-1846dc81f9e1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Notification Attention Management Test\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 140 secs\",\"actionId\":\"b3a65456-1a70-4ea5-accb-b2338de56288\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":140000,\"createdBy\":\"riacheltseng\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"7c43caea-dcb9-4b28-a0cb-51cd57a0d934\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"f209be60-7130-45fa-9c05-7eee3d680ad5\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"InputAction\",\"name\":\"Volume Up Button\",\"actionId\":\"1b655105-467b-461c-88ea-3c6b6735986d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":24,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/ringer_icon\",\"actionId\":\"31efac54-1dc1-4e8a-9a73-5c74a0ff40b7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.systemui:id/ringer_icon\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"7bd094e4-2785-47a3-9136-8122a7bdd769\",\"d69daab9-62bf-46a5-8cf1-1846dc81f9e1\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"8de23e46-4a22-4d4b-bc72-5588dfe25101\",\"b3a65456-1a70-4ea5-accb-b2338de56288\",\"7c43caea-dcb9-4b28-a0cb-51cd57a0d934\",\"f209be60-7130-45fa-9c05-7eee3d680ad5\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"1b655105-467b-461c-88ea-3c6b6735986d\",\"31efac54-1dc1-4e8a-9a73-5c74a0ff40b7\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Notification Attention Management Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.235000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf1e8e8c-2104-46f1-8b28-4d372b86fc49 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf1e8e8c-2104-46f1-8b28-4d372b86fc49
deleted file mode 100644
index 4b704b2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf1e8e8c-2104-46f1-8b28-4d372b86fc49
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cf1e8e8c-2104-46f1-8b28-4d372b86fc49","details":"{\"type\":\"CompoundAction\",\"name\":\"Check if it's on the main screen of BYOD\",\"actionId\":\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-if it's on the main screen of BYOD\",\"actionId\":\"d7b2582d-c790-4797-bdd4-8cbbb3a48b7f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/prepare_test_button\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"d7b2582d-c790-4797-bdd4-8cbbb3a48b7f\",\"015882d1-9ce9-4b67-a7e3-925ee0798fe4\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Check if it's on the main screen of BYOD","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.290000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf6c2d6d-a4fe-4981-af4b-f561291f847b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf6c2d6d-a4fe-4981-af4b-f561291f847b
deleted file mode 100644
index d9992a1..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/cf6c2d6d-a4fe-4981-af4b-f561291f847b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cf6c2d6d-a4fe-4981-af4b-f561291f847b","details":"{\"type\":\"CompoundAction\",\"name\":\"Set Pattern lock\",\"actionId\":\"cf6c2d6d-a4fe-4981-af4b-f561291f847b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Pattern\",\"actionId\":\"365a2c39-b92c-4113-897c-3609e2aedcb1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Pattern\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"02bbd6f1-ca03-4a2f-bf68-31b7bdc4b77c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm\",\"actionId\":\"d6b9fed9-3c85-44a9-9fee-7381f1475333\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"365a2c39-b92c-4113-897c-3609e2aedcb1\",\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\",\"02bbd6f1-ca03-4a2f-bf68-31b7bdc4b77c\",\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\",\"d6b9fed9-3c85-44a9-9fee-7381f1475333\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set Pattern lock","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.041000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d1023735-52c1-48bc-9dc7-a7b03a15ca7b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d1023735-52c1-48bc-9dc7-a7b03a15ca7b
deleted file mode 100644
index 0468b58..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d1023735-52c1-48bc-9dc7-a7b03a15ca7b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d1023735-52c1-48bc-9dc7-a7b03a15ca7b","details":"{\"type\":\"CompoundAction\",\"name\":\"Set long support message\",\"actionId\":\"d1023735-52c1-48bc-9dc7-a7b03a15ca7b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, long_msg_button\",\"actionId\":\"8ff4933a-eab3-4686-96e1-e1ef26ee295f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/long_msg_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, set_default_message button\",\"actionId\":\"7675aa09-f5c4-443d-9d4b-734f0a947128\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_default_message\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,set_message button\",\"actionId\":\"e24fcb3a-3b1b-4ddb-8ada-4201f381dd5d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/set_message\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ecf3aa8f-0328-4be8-aab3-b551ddc6bb6b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"8ff4933a-eab3-4686-96e1-e1ef26ee295f\",\"7675aa09-f5c4-443d-9d4b-734f0a947128\",\"e24fcb3a-3b1b-4ddb-8ada-4201f381dd5d\",\"ecf3aa8f-0328-4be8-aab3-b551ddc6bb6b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set long support message","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.117000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d1a32271-9bb8-464b-89ee-8eb121c9d8dd b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d1a32271-9bb8-464b-89ee-8eb121c9d8dd
deleted file mode 100644
index bf14998..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d1a32271-9bb8-464b-89ee-8eb121c9d8dd
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d1a32271-9bb8-464b-89ee-8eb121c9d8dd","details":"{\"type\":\"CompoundAction\",\"name\":\"13-Setting the user icon(Check image)\",\"actionId\":\"d1a32271-9bb8-464b-89ee-8eb121c9d8dd\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Setting the user icon\",\"actionId\":\"6e5c00d4-9d10-4468-b5a4-fdbd31c0167c\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Setting the user icon\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e3cad612-fe56-4882-a8d0-8017d8b8a9db\",\"displayText\":\"Setting the user icon\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Setting the user icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":447.0,\"x2\":350.6666666666667,\"y2\":491.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":84.5,\"y\":470.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":95.5,\"y\":-1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"e3cad612-fe56-4882-a8d0-8017d8b8a9db\",\"firstText\":\"Setting the user icon\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Setting the user icon\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":455.0,\"x2\":160.0,\"y2\":485.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Setting the user icon\",\"actionId\":\"ef890741-c43e-4bd7-84f2-42d65fd2f0b8\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Setting the user icon\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set user icon 1\",\"actionId\":\"074a502b-e7a9-416e-add9-ae9899e323c2\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set user icon 1\"},{\"type\":\"ScreenCapAction\",\"name\":\"Make sure the icon of User set to 1\",\"actionId\":\"241bf6cd-f3bf-425b-a812-de55943b1133\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow set user icon\",\"actionId\":\"9b113e37-d001-4796-becf-141bca700eb8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow set user icon\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set user icon 2\",\"actionId\":\"4862aab7-3e07-4260-ac59-cfd8b44d4be0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set user icon 2\"},{\"type\":\"ScreenCapAction\",\"name\":\"Make sure the icon of users set to 2\",\"actionId\":\"324ae2d1-78c6-49a3-8a2c-79df5e379934\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, You (Owner)\",\"actionId\":\"f3785f52-60ff-4bae-9c47-3f4277922a00\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"You (Owner)\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/user_photo\",\"actionId\":\"1e59e30f-85ac-4daf-b9f4-623d5f239149\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/user_photo\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Take a photo\",\"actionId\":\"6a4283ef-e5ff-4752-b953-be92d8508664\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Take a photo\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ed433b99-96c3-4e6b-ba73-4fec739edcdd\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/user_photo\",\"actionId\":\"5b800199-1f10-46e5-b995-26ee075cc79d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/user_photo\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Choose an image\",\"actionId\":\"22e71fd0-3635-45df-9e60-a11bd72d0dd1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Choose an image\"}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"6e5c00d4-9d10-4468-b5a4-fdbd31c0167c\",\"ef890741-c43e-4bd7-84f2-42d65fd2f0b8\",\"074a502b-e7a9-416e-add9-ae9899e323c2\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"12e01265-ef71-4a9b-92fa-96edbbf0df2a\",\"64db6b9d-caaa-442f-840a-80ef16030e55\",\"241bf6cd-f3bf-425b-a812-de55943b1133\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"9b113e37-d001-4796-becf-141bca700eb8\",\"4862aab7-3e07-4260-ac59-cfd8b44d4be0\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"12e01265-ef71-4a9b-92fa-96edbbf0df2a\",\"324ae2d1-78c6-49a3-8a2c-79df5e379934\",\"f3785f52-60ff-4bae-9c47-3f4277922a00\",\"1e59e30f-85ac-4daf-b9f4-623d5f239149\",\"6a4283ef-e5ff-4752-b953-be92d8508664\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"ed433b99-96c3-4e6b-ba73-4fec739edcdd\",\"5b800199-1f10-46e5-b995-26ee075cc79d\",\"22e71fd0-3635-45df-9e60-a11bd72d0dd1\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"370c511c-5950-4b3a-b832-60f2a606a27a\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"13-Setting the user icon(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.108000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d2619d97-b114-47f1-bade-ff3e0e4d37f7 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d2619d97-b114-47f1-bade-ff3e0e4d37f7
deleted file mode 100644
index 5fd6a47..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d2619d97-b114-47f1-bade-ff3e0e4d37f7
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d2619d97-b114-47f1-bade-ff3e0e4d37f7","details":"{\"type\":\"CompoundAction\",\"name\":\"Start Permissions lockdown test\",\"actionId\":\"d2619d97-b114-47f1-bade-ff3e0e4d37f7\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Install permission app \",\"actionId\":\"9487fcb4-c17b-42be-97f2-2dc1a6c185b9\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"commandLine\":\"install -r -t $uicd_permissionapp_apk_path\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Permissions lockdown\",\"actionId\":\"62227202-9881-4935-80ab-4292e02bcca0\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Permissions lockdown\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0052d9f2-01ed-4517-9209-7407cbd0f18c\",\"displayText\":\"Permissions lockdown\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Permissions lockdown\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":465.0,\"x2\":350.6666666666667,\"y2\":509.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":98.5,\"y\":491.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":81.5,\"y\":-4.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"0052d9f2-01ed-4517-9209-7407cbd0f18c\",\"firstText\":\"Permissions lockdown\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Permissions lockdown\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":474.0,\"x2\":192.0,\"y2\":508.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Permissions lockdown\",\"actionId\":\"c0d22eec-11d5-4ecf-847b-f4f18138b316\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Permissions lockdown\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, select \\\"Grant\\\"\",\"actionId\":\"7854c052-4761-4332-8ada-429466f7d506\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/permission_allow\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY Allow is selected and can't be changed.\",\"actionId\":\"d0517510-51ab-49ac-abcc-e612b4487f7f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Allow\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"true\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Click the information icon of Deny item\",\"actionId\":\"87fc6fc3-f006-4e95-92c3-179a3e08a5c2\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Enabled by admin\\\").right().resource_id(\\\"com.android.permissioncontroller:id/widget_frame\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, select \\\"Let user decide\\\"\",\"actionId\":\"e204a952-f4ed-4df0-a3b4-efb3ebe26aa3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/permission_default\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Make sure Allow is enabled and can be select.\",\"actionId\":\"e63b4673-3bbf-495a-96a5-46c1d62ab4ba\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Allow\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY Deny is enabled and can be selected\",\"actionId\":\"ffb99b6e-b0e1-44ec-8a19-ea77b8a821a1\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"true\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Deny\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action,select \\\"Deny\\\"\",\"actionId\":\"7470dc8b-dd1b-40cb-bf8d-7b2eb2640197\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/permission_deny\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY Deny is selected and can't be changed\",\"actionId\":\"bf16488b-de68-4eff-9961-5950b2aed87a\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Deny\"},{\"field\":\"checked\",\"operator\":\"=\",\"value\":\"true\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Click the information icon of Deny item\",\"actionId\":\"eb5f9855-19ae-41b9-908f-9e48d3edff9e\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Disabled by admin\\\").right().resource_id(\\\"com.android.permissioncontroller:id/widget_frame\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"9487fcb4-c17b-42be-97f2-2dc1a6c185b9\",\"62227202-9881-4935-80ab-4292e02bcca0\",\"c0d22eec-11d5-4ecf-847b-f4f18138b316\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"7854c052-4761-4332-8ada-429466f7d506\",\"f94a4fd0-90ed-46b2-bd68-e769b2b4175c\",\"e272f61e-5e1a-434d-ab44-5ae9abf260fc\",\"d0517510-51ab-49ac-abcc-e612b4487f7f\",\"87fc6fc3-f006-4e95-92c3-179a3e08a5c2\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"e204a952-f4ed-4df0-a3b4-efb3ebe26aa3\",\"f94a4fd0-90ed-46b2-bd68-e769b2b4175c\",\"e272f61e-5e1a-434d-ab44-5ae9abf260fc\",\"e63b4673-3bbf-495a-96a5-46c1d62ab4ba\",\"ffb99b6e-b0e1-44ec-8a19-ea77b8a821a1\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"7470dc8b-dd1b-40cb-bf8d-7b2eb2640197\",\"f94a4fd0-90ed-46b2-bd68-e769b2b4175c\",\"e272f61e-5e1a-434d-ab44-5ae9abf260fc\",\"bf16488b-de68-4eff-9961-5950b2aed87a\",\"eb5f9855-19ae-41b9-908f-9e48d3edff9e\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_permissionapp_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsPermissionApp.apk\"}}","name":"Start Permissions lockdown test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.111000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3400679-ef71-4a3e-a0a9-98cb51c83da6 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3400679-ef71-4a3e-a0a9-98cb51c83da6
deleted file mode 100644
index 8a8587f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3400679-ef71-4a3e-a0a9-98cb51c83da6
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d3400679-ef71-4a3e-a0a9-98cb51c83da6","details":"{\"type\":\"CompoundAction\",\"name\":\"Click settings of connected WiFi\",\"actionId\":\"d3400679-ef71-4a3e-a0a9-98cb51c83da6\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, connect WiFI settings\",\"actionId\":\"9300464d-0fbf-414b-9265-1096f6f17a59\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/settings_button_no_background\"}],\"childrenIdList\":[\"9300464d-0fbf-414b-9265-1096f6f17a59\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click settings of connected WiFi","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.088000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d342c4dd-f898-4df1-aa92-cf6ac97d772a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d342c4dd-f898-4df1-aa92-cf6ac97d772a
deleted file mode 100644
index 2bea4f2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d342c4dd-f898-4df1-aa92-cf6ac97d772a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d342c4dd-f898-4df1-aa92-cf6ac97d772a","details":"{\"type\":\"CompoundAction\",\"name\":\"12_Profile-aware printing settings(Check image)\",\"actionId\":\"d342c4dd-f898-4df1-aa92-cf6ac97d772a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Profile-aware printing settings\",\"actionId\":\"7a924fea-ab0d-4078-89b6-5118db245ccb\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Profile-aware printing settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"9a11233a-60d2-4422-8515-ed62fef9d945\",\"displayText\":\"Profile-aware printing settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Profile-aware printing settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":654.3333333333334,\"x2\":360.0,\"y2\":698.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":109.5,\"y\":678.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":70.5,\"y\":-1.6666666666666288,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"9a11233a-60d2-4422-8515-ed62fef9d945\",\"firstText\":\"Profile-aware printing settings\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Profile-aware printing settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":219.0,\"y1\":695.0,\"x2\":0.0,\"y2\":661.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Profile-aware printing settings\",\"actionId\":\"8fc5c4fd-8001-47e9-9af6-e22fe629c25c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Profile-aware printing settings\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Personal\",\"actionId\":\"78176265-99ce-40f7-aaa2-e1bc6d2ad6bf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Personal\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Work\",\"actionId\":\"f229fed4-e730-4874-871d-e39f292c06d7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Work\"},{\"type\":\"ScreenCapAction\",\"name\":\"SCREEN CAP\",\"actionId\":\"89bccc44-b5da-46f7-88b5-b12e65ce6c59\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"pololee\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"6a72a181-38f8-4be6-8ea7-89c93e88aa4c\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"7a924fea-ab0d-4078-89b6-5118db245ccb\",\"8fc5c4fd-8001-47e9-9af6-e22fe629c25c\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"78176265-99ce-40f7-aaa2-e1bc6d2ad6bf\",\"4aa267cc-73f0-487e-aa22-e57d487ff769\",\"f229fed4-e730-4874-871d-e39f292c06d7\",\"89bccc44-b5da-46f7-88b5-b12e65ce6c59\",\"6a72a181-38f8-4be6-8ea7-89c93e88aa4c\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"12_Profile-aware printing settings(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.305000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3450ee9-4ee0-4753-bb29-15c5b3906285 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3450ee9-4ee0-4753-bb29-15c5b3906285
deleted file mode 100644
index 6c7e176..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3450ee9-4ee0-4753-bb29-15c5b3906285
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d3450ee9-4ee0-4753-bb29-15c5b3906285","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn Auto-rotate on\",\"actionId\":\"d3450ee9-4ee0-4753-bb29-15c5b3906285\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Turn Auto-rotate on\",\"actionId\":\"35a60d30-7678-44fe-af81-306d28d3d5b7\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"shell settings put system accelerometer_rotation 1\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"35a60d30-7678-44fe-af81-306d28d3d5b7\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn Auto-rotate on","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.275000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d348b7ed-2aae-47cb-b900-44247d03c629 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d348b7ed-2aae-47cb-b900-44247d03c629
deleted file mode 100644
index 5f0cb32..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d348b7ed-2aae-47cb-b900-44247d03c629
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d348b7ed-2aae-47cb-b900-44247d03c629","details":"{\"type\":\"CompoundAction\",\"name\":\"Enter PIN or Password \\\"1234\\\"\",\"actionId\":\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"INPUT number \\\"1234\\\"\",\"actionId\":\"65501580-e4ed-417b-a4e8-7c6b2dbe14e2\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"1234\",\"isSingleChar\":false}],\"childrenIdList\":[\"65501580-e4ed-417b-a4e8-7c6b2dbe14e2\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Enter PIN or Password \"1234\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.035000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d36bec86-b515-4a70-9f5e-2dfcce3d0306 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d36bec86-b515-4a70-9f5e-2dfcce3d0306
deleted file mode 100644
index dad79fc..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d36bec86-b515-4a70-9f5e-2dfcce3d0306
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d36bec86-b515-4a70-9f5e-2dfcce3d0306","details":"{\"type\":\"CompoundAction\",\"name\":\"test_CA Cert install via intent\",\"actionId\":\"d36bec86-b515-4a70-9f5e-2dfcce3d0306\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to CA Cert install via intent\",\"actionId\":\"54b96994-589c-4bcf-95de-e580c6063c41\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"CA Cert install via intent\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"238d91b2-f224-4507-8264-7a8e0c607031\",\"displayText\":\"CA Cert install via intent\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"CA Cert install via intent\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":283.6666666666667,\"x2\":350.6666666666667,\"y2\":327.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.5,\"y\":307.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":87.5,\"y\":-1.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"238d91b2-f224-4507-8264-7a8e0c607031\",\"firstText\":\"CA Cert install via intent\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"CA Cert install via intent\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":292.0,\"x2\":175.0,\"y2\":322.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, CA Cert install via intent\",\"actionId\":\"0fdcedbc-1c5f-4842-b5cf-cf87de0357d3\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"CA Cert install via intent\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/run_test_button\",\"actionId\":\"de9f2901-0d31-41fc-b687-332d7f3bd106\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/run_test_button\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify a dialog show that CA Certificates can put their privacy at risk and must be installed via Setting\",\"actionId\":\"2495e8b4-393b-44bf-b6d1-fcff4eb0bbfd\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"This certificate from CTS Verifier must be installed in Settings. Only install CA certificates from organizations you trust.\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1a449e52-335c-487e-89da-730ab24e782e\",\"displayText\":\"This certificate from CTS Verifier must be installed in Settings. Only install CA certificates from organizations you trust.\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"06bf5f84-d932-4ace-9579-260f4567572d\",\"displayText\":\"This certificate from CTS Verifier must be installed in Settings. Only install CA certificates from organizations you trust.\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b9003c95-2095-4bbe-a7cb-3db6593c95c4\",\"displayText\":\"This certificate from CTS Verifier must be installed in Settings. Only install CA certificates from organizations you trust.\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/message\",\"text\":\"This certificate from CTS Verifier must be installed in Settings. Only install CA certificates from organizations you trust.\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":358.0,\"x2\":336.0,\"y2\":412.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":5.5,\"y\":-1.8333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"This certificate from CTS Verifier must be installed in Settings. Only install CA certificates from organizations you trust.\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":358.0,\"x2\":336.0,\"y2\":412.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"This certificate from CTS Verifier must be installed in Settings. Only install CA certificates from organizations you trust.\"}],\"className\":\"android.widget.ScrollView\",\"resourceId\":\"android:id/scrollView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":24.0,\"y1\":358.0,\"x2\":336.0,\"y2\":412.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":174.5,\"y\":387.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":5.5,\"y\":-1.8333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"b9003c95-2095-4bbe-a7cb-3db6593c95c4\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This certificate from CTS Verifier must be installed in Settings. Only install CA certificates from organizations you trust.\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":34.0,\"y1\":361.0,\"x2\":315.0,\"y2\":413.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"2830ebac-80c7-43f1-bcb6-c9e984f81e68\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"54b96994-589c-4bcf-95de-e580c6063c41\",\"0fdcedbc-1c5f-4842-b5cf-cf87de0357d3\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"de9f2901-0d31-41fc-b687-332d7f3bd106\",\"2495e8b4-393b-44bf-b6d1-fcff4eb0bbfd\",\"2830ebac-80c7-43f1-bcb6-c9e984f81e68\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_CA Cert install via intent","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.256000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d36c21f6-ffb6-4ae5-82d5-664ec268f648 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d36c21f6-ffb6-4ae5-82d5-664ec268f648
deleted file mode 100644
index 3a8491a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d36c21f6-ffb6-4ae5-82d5-664ec268f648
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d36c21f6-ffb6-4ae5-82d5-664ec268f648","details":"{\"type\":\"CompoundAction\",\"name\":\"17-04-Disable keyguard\",\"actionId\":\"d36c21f6-ffb6-4ae5-82d5-664ec268f648\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"c131f309-79ae-48c8-a354-4410a90e97e4\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"17-04-Disable keyguard","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.200000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3945e10-840f-4cae-8f1a-39db0e4ac6cb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3945e10-840f-4cae-8f1a-39db0e4ac6cb
deleted file mode 100644
index 4065c79..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3945e10-840f-4cae-8f1a-39db0e4ac6cb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d3945e10-840f-4cae-8f1a-39db0e4ac6cb","details":"{\"type\":\"CompoundAction\",\"name\":\"Switch the work profile location for different state\",\"actionId\":\"d3945e10-840f-4cae-8f1a-39db0e4ac6cb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Switch the work profile location for different state\",\"actionId\":\"1656a1ed-45e9-4e9d-8e3d-29cd6c1176b6\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nd.text(\\\"Location for work profile\\\").right().resource_id(\\\"android:id/switch_widget\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"1656a1ed-45e9-4e9d-8e3d-29cd6c1176b6\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Switch the work profile location for different state","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.288000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3d29d0d-af3f-4124-bd80-755d201bbec0 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3d29d0d-af3f-4124-bd80-755d201bbec0
deleted file mode 100644
index 376c20c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d3d29d0d-af3f-4124-bd80-755d201bbec0
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d3d29d0d-af3f-4124-bd80-755d201bbec0","details":"{\"type\":\"CompoundAction\",\"name\":\"17-Managed User\",\"actionId\":\"d3d29d0d-af3f-4124-bd80-755d201bbec0\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Managed User\",\"actionId\":\"e27281ac-6cf0-464d-9d39-2f2e3feda9e5\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Managed User\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"16bcca19-b2f2-4328-a3e0-2f3222acc35b\",\"displayText\":\"Managed User\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Managed User\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":532.3333333333334,\"x2\":351.3333333333333,\"y2\":574.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":57.5,\"y\":550.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":122.5,\"y\":2.8333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"16bcca19-b2f2-4328-a3e0-2f3222acc35b\",\"firstText\":\"Managed User\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Managed User\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":536.0,\"x2\":106.0,\"y2\":565.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Managed User\",\"actionId\":\"579edabd-322c-4d9c-a465-564cc482db68\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Managed User\"},{\"type\":\"WaitAction\",\"name\":\"WAIT for 20 secs to enter Managed User\",\"actionId\":\"80e58a45-6db4-4b9a-9c1d-1175551b911a\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":20000,\"createdBy\":\"riacheltseng\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 20 secs for back to CTS-V\",\"actionId\":\"4fdf535e-4f06-4284-8438-e199871ee6f0\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":20000,\"createdBy\":\"riacheltseng\"},{\"type\":\"InputAction\",\"name\":\"Overview Button\",\"actionId\":\"ff7a0fbb-361a-40fe-9c18-9cc3d4b0e8be\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":187,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"e27281ac-6cf0-464d-9d39-2f2e3feda9e5\",\"579edabd-322c-4d9c-a465-564cc482db68\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"80e58a45-6db4-4b9a-9c1d-1175551b911a\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"e690407d-25d7-42eb-9553-9f328ee32f0d\",\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"1133e24d-4564-4009-8872-280f93f6fb3e\",\"bb7fdd5f-0d61-4a6b-bd0f-589f5da59832\",\"0ec64b5f-e737-4075-9eb8-5de22223c304\",\"d36c21f6-ffb6-4ae5-82d5-664ec268f648\",\"03d55006-a23c-4f22-a56d-2d8de633cf3c\",\"5e0f41ed-e9c6-4d11-b3a2-815b415268db\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"4fdf535e-4f06-4284-8438-e199871ee6f0\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"ff7a0fbb-361a-40fe-9c18-9cc3d4b0e8be\",\"9b9343fa-a795-4169-883b-32dca700c4b6\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_Gmail_account=playinstallapk02@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\"}}","name":"17-Managed User","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.197000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d52e2b4c-6bf6-4d93-af37-785ce2d74664 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d52e2b4c-6bf6-4d93-af37-785ce2d74664
deleted file mode 100644
index 09e2015..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d52e2b4c-6bf6-4d93-af37-785ce2d74664
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d52e2b4c-6bf6-4d93-af37-785ce2d74664","details":"{\"type\":\"CompoundAction\",\"name\":\"01-Device owner provisioning\",\"actionId\":\"d52e2b4c-6bf6-4d93-af37-785ce2d74664\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Device owner provisioning\",\"actionId\":\"267e23e2-efcc-46c8-ac9a-35ebc5bcad3e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device owner provisioning\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Start provisioning\",\"actionId\":\"015030ca-5189-4b0f-a7a3-4487d633fe4a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Start provisioning\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify a warning dialog telling the device is already set up\",\"actionId\":\"189da650-ab28-4337-abbd-d073143771b4\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device is already set up\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b227ebd8-b653-486e-9f1a-7b7eebb96d50\",\"displayText\":\"Device is already set up\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"1ffd403f-4198-4a64-b76f-06a5b33ba336\",\"displayText\":\"Device is already set up\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/alertTitle\",\"text\":\"Device is already set up\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.25,\"y1\":315.75,\"x2\":315.75,\"y2\":339.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":40.0,\"y\":0.375,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Device is already set up\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/title_template\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.25,\"y1\":300.0,\"x2\":336.75,\"y2\":339.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":140.0,\"y\":327.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":40.0,\"y\":-7.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"1ffd403f-4198-4a64-b76f-06a5b33ba336\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device is already set up\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":39.0,\"y1\":316.0,\"x2\":241.0,\"y2\":338.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, OK button\",\"actionId\":\"5dfe7588-8313-4822-8a39-be6a68b4f220\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"7f12c16f-51be-4732-bf1b-ef4b55841a99\",\"267e23e2-efcc-46c8-ac9a-35ebc5bcad3e\",\"015030ca-5189-4b0f-a7a3-4487d633fe4a\",\"189da650-ab28-4337-abbd-d073143771b4\",\"5dfe7588-8313-4822-8a39-be6a68b4f220\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"01-Device owner provisioning","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.215000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d5c77251-9663-4eaa-b708-68a67fc8189f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d5c77251-9663-4eaa-b708-68a67fc8189f
deleted file mode 100644
index 48322da..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d5c77251-9663-4eaa-b708-68a67fc8189f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d5c77251-9663-4eaa-b708-68a67fc8189f","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if CTS Verfier admin exists and is activated and can't be disabled\",\"actionId\":\"d5c77251-9663-4eaa-b708-68a67fc8189f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Device admin apps\",\"actionId\":\"26087d8e-8a3c-4d5b-a7b1-be3d2d63a8a1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device admin apps\"},{\"type\":\"PythonScriptAction\",\"name\":\"Click the enabled admin of CTS Verifier \",\"actionId\":\"3c2214b6-34bb-4ebb-874c-aec0ec48c598\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nif d.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist():\\n d.text(\\\"CTS Verifier\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if \\\"deactivate this device admin app\\\" button is disabled\",\"actionId\":\"9d4a006c-b7bb-4530-90c8-df05c0b8c5b1\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.settings:id/action_button\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"26087d8e-8a3c-4d5b-a7b1-be3d2d63a8a1\",\"3c2214b6-34bb-4ebb-874c-aec0ec48c598\",\"9d4a006c-b7bb-4530-90c8-df05c0b8c5b1\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if CTS Verfier admin exists and is activated and can't be disabled","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.085000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d725d8a2-cb38-4a29-9857-a510943cf7fd b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d725d8a2-cb38-4a29-9857-a510943cf7fd
deleted file mode 100644
index e26324e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d725d8a2-cb38-4a29-9857-a510943cf7fd
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d725d8a2-cb38-4a29-9857-a510943cf7fd","details":"{\"type\":\"CompoundAction\",\"name\":\"Open CTS-V\",\"actionId\":\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"Open CTS-V\",\"actionId\":\"e340af31-b288-49f2-836b-30208e2bb235\",\"actionType\":\"COMMAND_LINE_ACTION\",\"createdBy\":\"pololee\",\"commandLine\":\"shell am start -n com.android.cts.verifier/.CtsVerifierActivity\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"}],\"childrenIdList\":[\"e340af31-b288-49f2-836b-30208e2bb235\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Open CTS-V","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325438.991000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d7cdb82c-060e-4a47-83c1-c1b9f6396683 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d7cdb82c-060e-4a47-83c1-c1b9f6396683
deleted file mode 100644
index c8ce9ba..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d7cdb82c-060e-4a47-83c1-c1b9f6396683
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d7cdb82c-060e-4a47-83c1-c1b9f6396683","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Reset options page\",\"actionId\":\"d7cdb82c-060e-4a47-83c1-c1b9f6396683\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to System\",\"actionId\":\"d88c1c73-f929-4a0e-8324-ecc5c25f7b49\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"System\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3a8ad221-3634-45be-b92a-4e9ea637f932\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"248422f2-9a9d-4602-91c2-4920f0e35fcd\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a397215e-f365-4cb1-aa34-e5ba377e73d2\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":492.6666666666667,\"x2\":47.666666666666664,\"y2\":525.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":489.0,\"x2\":66.0,\"y2\":529.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"8c77f6fc-1ca0-41dc-9553-073deda25c49\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"98750a01-5d7c-4dd7-8c6c-dbf5de0f179f\",\"displayText\":\"System\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"System\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":490.6666666666667,\"x2\":115.0,\"y2\":510.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.5,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"System\"},{\"uuid\":\"667f7d47-2727-45c1-b372-0c4bc27d0ee5\",\"displayText\":\"Languages, gestures, time, backup\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Languages, gestures, time, backup\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":510.3333333333333,\"x2\":266.6666666666667,\"y2\":528.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Languages, gestures, time, backup\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":476.0,\"x2\":345.3333333333333,\"y2\":542.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"System\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":476.0,\"x2\":360.0,\"y2\":542.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":95.0,\"y\":500.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":85.0,\"y\":9.333333333333314,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"98750a01-5d7c-4dd7-8c6c-dbf5de0f179f\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"System\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":58.0,\"y1\":489.0,\"x2\":132.0,\"y2\":511.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, System\",\"actionId\":\"38d6a79f-d745-4e95-9309-54b38dc0b663\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"System\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Reset options\",\"actionId\":\"8d14d708-23e0-43ce-905c-0dcb31f29849\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Reset options\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"d88c1c73-f929-4a0e-8324-ecc5c25f7b49\",\"38d6a79f-d745-4e95-9309-54b38dc0b663\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"8d14d708-23e0-43ce-905c-0dcb31f29849\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Reset options page","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.099000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d9789ba1-6855-459c-9d3f-30799e7dcb87 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d9789ba1-6855-459c-9d3f-30799e7dcb87
deleted file mode 100644
index f6ebddf..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/d9789ba1-6855-459c-9d3f-30799e7dcb87
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d9789ba1-6855-459c-9d3f-30799e7dcb87","details":"{\"type\":\"CompoundAction\",\"name\":\"08_Profile-aware trusted credential settings\",\"actionId\":\"d9789ba1-6855-459c-9d3f-30799e7dcb87\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Profile-aware trusted credential settings\",\"actionId\":\"24f8918d-a39f-48a0-8f27-7764621af61c\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Profile-aware trusted credential settings\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"df350ea2-b025-42b8-9542-18a406769929\",\"displayText\":\"Profile-aware trusted credential settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Profile-aware trusted credential settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":474.3333333333333,\"x2\":360.0,\"y2\":518.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":142.5,\"y\":494.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":37.5,\"y\":2.3333333333333712,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"df350ea2-b025-42b8-9542-18a406769929\",\"firstText\":\"Profile-aware trusted credential settings\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Profile-aware trusted credential settings\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":278.0,\"y1\":506.0,\"x2\":7.0,\"y2\":482.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Profile-aware trusted credential settings\",\"actionId\":\"1042fbb3-dbd4-4c67-adc0-b73d686d87f0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Profile-aware trusted credential settings\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Encryption & credentials\",\"actionId\":\"82d0920f-ce49-46b4-8a1f-ff417e56c4d9\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Encryption & credentials\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7ed6a9bf-d414-4b7e-99bb-34d71b27293c\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ecf3c3ab-a580-498b-a3dc-69cde608285b\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b988f19f-242c-43e8-a2be-6602b8fdc295\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Encryption & credentials\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":484.0,\"x2\":226.66666666666666,\"y2\":503.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-5.666666666666686,\"y\":-0.6666666666666288,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Encryption & credentials\"},{\"uuid\":\"7c0a8549-1915-4a45-9b4d-042eb2bab410\",\"displayText\":\"Encrypted\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Encrypted\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":503.6666666666667,\"x2\":124.0,\"y2\":521.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Encrypted\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":469.3333333333333,\"x2\":345.3333333333333,\"y2\":536.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Encryption & credentials\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":469.3333333333333,\"x2\":360.0,\"y2\":536.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":152.0,\"y\":494.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":28.0,\"y\":8.166666666666629,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"b988f19f-242c-43e8-a2be-6602b8fdc295\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Encryption & credentials\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":242.0,\"y1\":507.0,\"x2\":62.0,\"y2\":482.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Encryption & credentials\",\"actionId\":\"49da4fc0-a23d-4777-84eb-df3c404ba137\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Encryption & credentials\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Trusted credentials\",\"actionId\":\"fae84bc2-2bf2-4173-a63e-04b917202f2c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Trusted credentials\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, SYSTEM\",\"actionId\":\"77d5207c-8585-4644-b52c-686e476ae74d\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"SYSTEM\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, USER\",\"actionId\":\"ad1d23da-8932-4936-a10c-cc2d46ccaac3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"USER\"}],\"childrenIdList\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"24f8918d-a39f-48a0-8f27-7764621af61c\",\"1042fbb3-dbd4-4c67-adc0-b73d686d87f0\",\"b70fe893-88de-4879-90ab-c2929211baa8\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"82d0920f-ce49-46b4-8a1f-ff417e56c4d9\",\"49da4fc0-a23d-4777-84eb-df3c404ba137\",\"fae84bc2-2bf2-4173-a63e-04b917202f2c\",\"77d5207c-8585-4644-b52c-686e476ae74d\",\"4aa267cc-73f0-487e-aa22-e57d487ff769\",\"ad1d23da-8932-4936-a10c-cc2d46ccaac3\",\"4aa267cc-73f0-487e-aa22-e57d487ff769\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"11862730-912f-4b3c-99d6-cff28c749559\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"08_Profile-aware trusted credential settings","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.300000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/da770381-d17c-48ca-8aba-def4338ef96b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/da770381-d17c-48ca-8aba-def4338ef96b
deleted file mode 100644
index 3d43654..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/da770381-d17c-48ca-8aba-def4338ef96b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"da770381-d17c-48ca-8aba-def4338ef96b","details":"{\"type\":\"CompoundAction\",\"name\":\"Press back key 3 times\",\"actionId\":\"da770381-d17c-48ca-8aba-def4338ef96b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"7e45941a-6152-42e8-9034-d6e38002e957\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"7e45941a-6152-42e8-9034-d6e38002e957\"],\"repeatTime\":3,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Press back key 3 times","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.016000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dab0d2a9-befa-4378-bea1-b9d830417b93 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dab0d2a9-befa-4378-bea1-b9d830417b93
deleted file mode 100644
index f5dc305..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dab0d2a9-befa-4378-bea1-b9d830417b93
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"dab0d2a9-befa-4378-bea1-b9d830417b93","details":"{\"type\":\"CompoundAction\",\"name\":\"Switch the main location switch at the top of the screen on/off\",\"actionId\":\"dab0d2a9-befa-4378-bea1-b9d830417b93\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Turn main location on/off\",\"actionId\":\"a54d197e-cb99-41ff-8a85-609a3ede5ee0\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nd.text(\\\"Use location\\\").right().resource_id(\\\"com.android.settings:id/switch_widget\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"a54d197e-cb99-41ff-8a85-609a3ede5ee0\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Switch the main location switch at the top of the screen on/off","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.288000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dbec061f-568e-4ffa-9d71-4a5494853625 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dbec061f-568e-4ffa-9d71-4a5494853625
deleted file mode 100644
index 89b4baa..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dbec061f-568e-4ffa-9d71-4a5494853625
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"dbec061f-568e-4ffa-9d71-4a5494853625","details":"{\"type\":\"CompoundAction\",\"name\":\"08-Disallow configuring Bluetooth\",\"actionId\":\"dbec061f-568e-4ffa-9d71-4a5494853625\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow configuring Bluetooth\",\"actionId\":\"8ebf73d4-a368-4159-b642-3b753e3a0c54\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow configuring Bluetooth\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b519d9fa-3e2c-40d7-ab16-530bdc80681a\",\"displayText\":\"Disallow configuring Bluetooth\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow configuring Bluetooth\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":405.3333333333333,\"x2\":350.6666666666667,\"y2\":449.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":119.5,\"y\":428.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":60.5,\"y\":-1.1666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"b519d9fa-3e2c-40d7-ab16-530bdc80681a\",\"firstText\":\"Disallow configuring Bluetooth\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow configuring Bluetooth\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":415.0,\"x2\":229.0,\"y2\":442.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow configuring Bluetooth\",\"actionId\":\"aa78953b-dc4e-42ba-a11e-46b41b4e3829\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow configuring Bluetooth\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY Pair new device function is disabled\",\"actionId\":\"48be674a-d5be-4c04-824c-240df6cf9a78\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Pair new device\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Pair new device\",\"actionId\":\"30295be0-6a21-4111-8a0f-ea37e47112d2\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Pair new device\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"4a7d36bc-2b32-4781-83c5-7c608dbe964c\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c2f56922-8a58-406b-9168-96f58069e178\",\"actionType\":\"INPUT_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"8ebf73d4-a368-4159-b642-3b753e3a0c54\",\"aa78953b-dc4e-42ba-a11e-46b41b4e3829\",\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"48be674a-d5be-4c04-824c-240df6cf9a78\",\"30295be0-6a21-4111-8a0f-ea37e47112d2\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"4a7d36bc-2b32-4781-83c5-7c608dbe964c\",\"c2f56922-8a58-406b-9168-96f58069e178\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"08-Disallow configuring Bluetooth","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.101000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dc47dc72-9a74-4b16-9c5f-4d2cd0560854 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dc47dc72-9a74-4b16-9c5f-4d2cd0560854
deleted file mode 100644
index 0123d53..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dc47dc72-9a74-4b16-9c5f-4d2cd0560854
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"dc47dc72-9a74-4b16-9c5f-4d2cd0560854","details":"{\"type\":\"CompoundAction\",\"name\":\"Deactivate this device admin app - Sensor\",\"actionId\":\"dc47dc72-9a74-4b16-9c5f-4d2cd0560854\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Toggle Sensor... switch off\",\"actionId\":\"3c803ca4-cca9-4749-a535-0d5ceefe0be0\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"Sensor Tests Device Admin Receiver\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").verify_exist():\\n d.text(\\\"Sensor Tests Device Admin Receiver\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"true\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/action_button\",\"actionId\":\"eab03aa8-6d2b-4f76-865b-6057c2ef5e77\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/action_button\"}],\"childrenIdList\":[\"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e\",\"3c803ca4-cca9-4749-a535-0d5ceefe0be0\",\"eab03aa8-6d2b-4f76-865b-6057c2ef5e77\",\"da770381-d17c-48ca-8aba-def4338ef96b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Deactivate this device admin app - Sensor","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.276000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dd4aaec7-a59b-4646-8cc4-039a19853f62 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dd4aaec7-a59b-4646-8cc4-039a19853f62
deleted file mode 100644
index 2402e98..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dd4aaec7-a59b-4646-8cc4-039a19853f62
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"dd4aaec7-a59b-4646-8cc4-039a19853f62","details":"{\"type\":\"CompoundAction\",\"name\":\"Press Go on dialog\",\"actionId\":\"dd4aaec7-a59b-4646-8cc4-039a19853f62\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button3\",\"actionId\":\"2dbee3ca-1283-470e-a940-d29a0a396bec\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":false,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button3\"}],\"childrenIdList\":[\"2dbee3ca-1283-470e-a940-d29a0a396bec\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Press Go on dialog","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.322000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ddb13fe9-0508-4af0-b71e-ef96fc1f518a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ddb13fe9-0508-4af0-b71e-ef96fc1f518a
deleted file mode 100644
index 4379213..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ddb13fe9-0508-4af0-b71e-ef96fc1f518a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ddb13fe9-0508-4af0-b71e-ef96fc1f518a","details":"{\"type\":\"CompoundAction\",\"name\":\"Check if it's on the main screen of BYOD\",\"actionId\":\"ddb13fe9-0508-4af0-b71e-ef96fc1f518a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-if it's on the main screen of BYOD\",\"actionId\":\"31d1de1e-bad7-46d0-941f-a2be387ff6b1\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.cts.verifier:id/prepare_test_button\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"31d1de1e-bad7-46d0-941f-a2be387ff6b1\",\"544656b1-7930-44f1-ba63-fdafd4b08b09\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Check if it's on the main screen of BYOD","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.317000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ddbc4d31-a035-4eec-814a-def0efb2bfa5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ddbc4d31-a035-4eec-814a-def0efb2bfa5
deleted file mode 100644
index 4e5a879..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ddbc4d31-a035-4eec-814a-def0efb2bfa5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ddbc4d31-a035-4eec-814a-def0efb2bfa5","details":"{\"type\":\"CompoundAction\",\"name\":\"15-20 & 17-06-10-Disallow config screen timeout\",\"actionId\":\"ddbc4d31-a035-4eec-814a-def0efb2bfa5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config screen timeout\",\"actionId\":\"ba6b5401-c43c-4116-8834-8c49a2e4b974\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config screen timeout\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4d1688ef-b022-438c-979c-d4eed8fa0c84\",\"displayText\":\"Disallow config screen timeout\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config screen timeout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":308.0,\"x2\":360.0,\"y2\":352.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":106.0,\"y\":327.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":74.0,\"y\":3.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"4d1688ef-b022-438c-979c-d4eed8fa0c84\",\"firstText\":\"Disallow config screen timeout\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config screen timeout\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":311.0,\"x2\":204.0,\"y2\":343.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config screen timeout\",\"actionId\":\"4271cbae-d6f5-441d-8c7d-382f8ce523c6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config screen timeout\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Screen timeout\",\"actionId\":\"33f0c04a-0879-46af-8848-423bc5e44898\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Screen timeout\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"5c08790a-de4d-4a43-a1d1-46a688383499\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"57a95ead-4278-435f-9375-aa9eee2003d6\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"ba6b5401-c43c-4116-8834-8c49a2e4b974\",\"4271cbae-d6f5-441d-8c7d-382f8ce523c6\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"33f0c04a-0879-46af-8848-423bc5e44898\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"5c08790a-de4d-4a43-a1d1-46a688383499\",\"57a95ead-4278-435f-9375-aa9eee2003d6\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-20 & 17-06-10-Disallow config screen timeout","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.150000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dec009bd-6ca5-4baa-81d1-a00929a711a4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dec009bd-6ca5-4baa-81d1-a00929a711a4
deleted file mode 100644
index f4fc8bb..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dec009bd-6ca5-4baa-81d1-a00929a711a4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"dec009bd-6ca5-4baa-81d1-a00929a711a4","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Condition Provider test\",\"actionId\":\"dec009bd-6ca5-4baa-81d1-a00929a711a4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Condition Provider test\",\"actionId\":\"ce660a6f-6636-4ae3-a3aa-74797604f9a9\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Condition Provider test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"fd76e63f-1b3b-45a0-8c5d-7d319d05bfd0\",\"displayText\":\"Condition Provider test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Condition Provider test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":410.0,\"x2\":350.6666666666667,\"y2\":454.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":97.0,\"y\":437.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":83.0,\"y\":-5.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"fd76e63f-1b3b-45a0-8c5d-7d319d05bfd0\",\"firstText\":\"Condition Provider test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Condition Provider test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":12.0,\"y1\":420.0,\"x2\":182.0,\"y2\":455.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Condition Provider test\",\"actionId\":\"764f69e1-13ea-4221-9366-1ed04690f270\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Condition Provider test\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 55 secs\",\"actionId\":\"f9f5c8ed-a060-4df8-97bb-394c3b954ec4\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":55000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify automatic Zen Rule listing page exists\",\"actionId\":\"02c07c4a-39e1-43fb-9d3c-691a04cfb82a\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.settings:id/zen_automatic_rule_widget\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"efeafd59-78ca-4f2a-8d96-ee7588d72b9b\",\"displayText\":\"Settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"12bfc9ab-5050-4143-9728-386ef9c5b916\",\"displayText\":\"Sleeping\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e65d9021-cee1-409d-8d2f-00b47581f464\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0bb82810-401f-49de-9cfa-c1f2d21d45c3\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.CheckBox\",\"resourceId\":\"android:id/checkbox\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":158.33333333333334,\"x2\":44.0,\"y2\":187.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/checkbox_container\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":151.0,\"x2\":66.0,\"y2\":195.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"4b110a12-9171-4ab6-9a50-78392b8f4d2a\",\"displayText\":\"Sleeping\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cd351bc4-d1e0-4aed-85b6-9d3bea853300\",\"displayText\":\"Sleeping\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Sleeping\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":154.33333333333334,\"x2\":123.0,\"y2\":174.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Sleeping\"},{\"uuid\":\"b28a275c-580d-40a7-ae8f-bb7da867027b\",\"displayText\":\"Off\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Off\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":174.0,\"x2\":84.33333333333333,\"y2\":191.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Off\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":139.66666666666666,\"x2\":285.6666666666667,\"y2\":206.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Sleeping\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":139.66666666666666,\"x2\":300.3333333333333,\"y2\":206.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Sleeping\"},{\"uuid\":\"a6a7739c-350b-4f44-a187-82aef1c26c84\",\"displayText\":\"Settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"743a2b2c-b9c2-45df-bbc7-2d38a590bf68\",\"displayText\":\"Settings\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"13728183-9eb0-471a-b039-28ca2a953454\",\"displayText\":\"Settings\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/zen_automatic_rule_widget\",\"contentDesc\":\"Settings\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":305.0,\"y1\":139.66666666666666,\"x2\":356.3333333333333,\"y2\":206.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":2.6666666666666288,\"y\":-0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Settings\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":305.0,\"y1\":139.66666666666666,\"x2\":356.3333333333333,\"y2\":206.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Settings\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/widget_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":301.3333333333333,\"y1\":139.66666666666666,\"x2\":360.0,\"y2\":206.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Settings\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":139.66666666666666,\"x2\":360.0,\"y2\":206.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":328.0,\"y\":173.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-148.0,\"y\":-0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"13728183-9eb0-471a-b039-28ca2a953454\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.settings:id/zen_automatic_rule_widget\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":309.0,\"y1\":159.0,\"x2\":347.0,\"y2\":188.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"5c49717e-2937-422a-9734-5fc15b8b2257\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to pass button\",\"actionId\":\"03ddbb83-3325-4bd6-888a-e4030741d032\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.cts.verifier:id/iva_action_button_pass\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"5bb54e06-2484-4852-a552-d2f6a0b8401b\",\"displayText\":\"Pass\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"6330b730-1d26-436d-beef-f901b0aaeedb\",\"displayText\":\"Pass\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.cts.verifier:id/nls_status\",\"contentDesc\":\"Pass\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":348.3333333333333,\"x2\":47.666666666666664,\"y2\":386.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pass\"},{\"uuid\":\"a24a7f1a-9f3b-4a63-8493-89d8a39335b1\",\"displayText\":\"Was the automatic rule screen shown?\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.cts.verifier:id/nls_instructions\",\"text\":\"Was the automatic rule screen shown?\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":47.666666666666664,\"y1\":339.0,\"x2\":350.6666666666667,\"y2\":361.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Was the automatic rule screen shown?\"},{\"uuid\":\"ea6e4381-6e9e-4fb0-a8d4-22a468649afa\",\"displayText\":\"Pass\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.cts.verifier:id/iva_action_button_pass\",\"text\":\"Pass\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":361.3333333333333,\"x2\":332.3333333333333,\"y2\":405.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":1.1666666666666572,\"y\":-0.6666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pass\"},{\"uuid\":\"d60ba4d2-33e0-4497-a659-04a3305b36d0\",\"displayText\":\"Fail\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.cts.verifier:id/iva_action_button_fail\",\"text\":\"Fail\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":405.3333333333333,\"x2\":332.3333333333333,\"y2\":449.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Fail\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":339.0,\"x2\":350.6666666666667,\"y2\":449.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":198.0,\"y\":384.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-18.0,\"y\":10.166666666666629,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"ea6e4381-6e9e-4fb0-a8d4-22a468649afa\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.cts.verifier:id/iva_action_button_pass\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":163.0,\"y1\":377.0,\"x2\":233.0,\"y2\":391.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/iva_action_button_pass\",\"actionId\":\"7d721a63-0ebd-4ca5-be5b-cf0798913b21\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/iva_action_button_pass\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"716e4fd6-9e8a-4128-a3e4-1dfb1a63f4d2\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, 123\",\"actionId\":\"9d613358-0e1a-4b3d-aeaf-385a8aebe8cb\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"123\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"c83eb4f7-4cee-4926-a4d7-000aae67814f\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, 123\",\"actionId\":\"d254e52c-6f38-4452-83ec-8f28d0177425\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"123\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"9a7bf5ac-407f-429d-bba6-b59bf36ad109\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, More options\",\"actionId\":\"04775cd0-58b4-4510-be20-d69eb1221fcc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"More options\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Delete schedules\",\"actionId\":\"fbff2dad-9f80-4166-bc09-7045fe67f305\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Delete schedules\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, 123\",\"actionId\":\"9b834c3e-56ef-4d6e-99dd-61db72944a96\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"123\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, delete button\",\"actionId\":\"dea6bcc9-ca10-4d05-973b-8b836fe1ece0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"53f20cb8-3502-48fa-8f03-cca8aa91b536\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 50 secs\",\"actionId\":\"3ed217d7-47c7-4cde-be23-4a8f92dec580\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":50000,\"createdBy\":\"riacheltseng\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"8e98e0e8-60d0-42fb-abae-e48e27407e31\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"WaitAction\",\"name\":\"WAIT 15 secs\",\"actionId\":\"32701b80-c099-4199-81ae-7551bf6919c2\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"riacheltseng\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"ce660a6f-6636-4ae3-a3aa-74797604f9a9\",\"764f69e1-13ea-4221-9366-1ed04690f270\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"e4555fba-a19a-4a6c-8f12-d3202b0203f5\",\"f9f5c8ed-a060-4df8-97bb-394c3b954ec4\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"02c07c4a-39e1-43fb-9d3c-691a04cfb82a\",\"5c49717e-2937-422a-9734-5fc15b8b2257\",\"03ddbb83-3325-4bd6-888a-e4030741d032\",\"7d721a63-0ebd-4ca5-be5b-cf0798913b21\",\"716e4fd6-9e8a-4128-a3e4-1dfb1a63f4d2\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"9d613358-0e1a-4b3d-aeaf-385a8aebe8cb\",\"c83eb4f7-4cee-4926-a4d7-000aae67814f\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"d254e52c-6f38-4452-83ec-8f28d0177425\",\"9a7bf5ac-407f-429d-bba6-b59bf36ad109\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"04775cd0-58b4-4510-be20-d69eb1221fcc\",\"fbff2dad-9f80-4166-bc09-7045fe67f305\",\"9b834c3e-56ef-4d6e-99dd-61db72944a96\",\"dea6bcc9-ca10-4d05-973b-8b836fe1ece0\",\"53f20cb8-3502-48fa-8f03-cca8aa91b536\",\"3ed217d7-47c7-4cde-be23-4a8f92dec580\",\"8e98e0e8-60d0-42fb-abae-e48e27407e31\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"e4555fba-a19a-4a6c-8f12-d3202b0203f5\",\"32701b80-c099-4199-81ae-7551bf6919c2\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Condition Provider test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.234000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dfed233b-4141-4e7e-a70f-5884c712f689 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dfed233b-4141-4e7e-a70f-5884c712f689
deleted file mode 100644
index 16729b7..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/dfed233b-4141-4e7e-a70f-5884c712f689
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"dfed233b-4141-4e7e-a70f-5884c712f689","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Device Owner Requesting Bugreport Tests\",\"actionId\":\"dfed233b-4141-4e7e-a70f-5884c712f689\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"bd22d00c-3bff-4749-8763-3323c17809bb\",\"c3700e79-6895-4fa0-8b1b-d34c5fa5b82d\",\"873d0871-f3ae-42db-a3e2-f298e3c8c9d9\",\"1e25fe0b-764b-414e-b3e3-e9c11269ad93\",\"e2d2a682-55b0-4e2c-ad2d-801e77f1cb6f\",\"bdac4f2a-64a2-460c-a210-399cd652cfa8\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_DeviceOwner_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsEmptyDeviceOwner.apk\"}}","name":"test_Device Owner Requesting Bugreport Tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.067000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e056b93a-c19a-4f20-9cd8-640a8523dec4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e056b93a-c19a-4f20-9cd8-640a8523dec4
deleted file mode 100644
index 68af427..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e056b93a-c19a-4f20-9cd8-640a8523dec4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e056b93a-c19a-4f20-9cd8-640a8523dec4","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Screen Lock Test\",\"actionId\":\"e056b93a-c19a-4f20-9cd8-640a8523dec4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Screen Lock Test\",\"actionId\":\"b090a4fe-5d9d-4dc1-b051-6c5822826311\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Screen Lock Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f07272aa-c527-4508-9c5f-a1bdc36aa1d8\",\"displayText\":\"Screen Lock Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Screen Lock Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":454.3333333333333,\"x2\":351.3333333333333,\"y2\":496.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":71.5,\"y\":470.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":108.5,\"y\":4.833333333333314,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"f07272aa-c527-4508-9c5f-a1bdc36aa1d8\",\"firstText\":\"Screen Lock Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Screen Lock Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":450.0,\"x2\":138.0,\"y2\":491.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Screen Lock Test\",\"actionId\":\"b7864415-06bb-47af-be20-09adf26564d3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Screen Lock Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/da_force_lock_button\",\"actionId\":\"a7bb69b5-e7c7-4ca7-8c4a-0324ebedc641\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/da_force_lock_button\"},{\"type\":\"ConditionClickAction\",\"name\":\"Enable Admin if needs\",\"actionId\":\"bad2d852-da60-407f-9565-4ffe2922cfc9\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.settings:id/action_button\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e4751da0-7060-4fc0-8299-24518742e566\",\"displayText\":\"Activate this device admin app\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"b7347450-5f43-4b6c-961c-973d5aa62f43\",\"displayText\":\"Activate this device admin app\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/action_button\",\"text\":\"Activate this device admin app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":590.3333333333334,\"x2\":197.66666666666666,\"y2\":637.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.8333333333333286,\"y\":3.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Activate this device admin app\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/restricted_action\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":590.3333333333334,\"x2\":197.66666666666666,\"y2\":637.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":98.0,\"y\":610.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":0.8333333333333286,\"y\":3.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"b7347450-5f43-4b6c-961c-973d5aa62f43\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.settings:id/action_button\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":3.0,\"y1\":599.0,\"x2\":193.0,\"y2\":622.0}},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Enter button\",\"actionId\":\"887ecebd-8a62-49f9-b8aa-b954ff80d597\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/key_enter\"}]},\"clickAfterValidation\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify successful message pop up.\",\"actionId\":\"f481e469-4199-4564-a74b-bc33167653f0\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"It appears the screen was locked successfully!\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"cc58ec1d-ed6d-4f71-a072-ba55cfe26b03\",\"displayText\":\"It appears the screen was locked successfully!\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"99003cc8-e7a5-479c-8c47-6e52232784e9\",\"displayText\":\"It appears the screen was locked successfully!\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"9bd6f512-a344-49a7-a677-de32fca934c8\",\"displayText\":\"It appears the screen was locked successfully!\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/message\",\"text\":\"It appears the screen was locked successfully!\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.333333333333332,\"y1\":370.0,\"x2\":336.6666666666667,\"y2\":405.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":23.5,\"y\":-1.3333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"It appears the screen was locked successfully!\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.333333333333332,\"y1\":370.0,\"x2\":336.6666666666667,\"y2\":405.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"firstText\":\"It appears the screen was locked successfully!\"}],\"className\":\"android.widget.ScrollView\",\"resourceId\":\"android:id/scrollView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":23.333333333333332,\"y1\":370.0,\"x2\":336.6666666666667,\"y2\":405.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":156.5,\"y\":389.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":23.5,\"y\":-1.3333333333333712,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":3,\"leafNodeContext\":\"9bd6f512-a344-49a7-a677-de32fca934c8\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"It appears the screen was locked successfully!\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":36.0,\"y1\":369.0,\"x2\":277.0,\"y2\":409.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, OK button\",\"actionId\":\"62984b4b-93dd-47d9-8064-897cb1aa38e5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"49bfb869-2ef5-4df6-8fff-3192112b82a2\",\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"b090a4fe-5d9d-4dc1-b051-6c5822826311\",\"b7864415-06bb-47af-be20-09adf26564d3\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"a7bb69b5-e7c7-4ca7-8c4a-0324ebedc641\",\"bad2d852-da60-407f-9565-4ffe2922cfc9\",\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"887ecebd-8a62-49f9-b8aa-b954ff80d597\",\"f481e469-4199-4564-a74b-bc33167653f0\",\"62984b4b-93dd-47d9-8064-897cb1aa38e5\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"72f62d5f-9a3a-4c4d-813c-96614b1c5845\",\"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e\",\"b531da69-1e61-4e75-a6b1-7e005df80c7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Screen Lock Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.054000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e097807f-e110-411e-9f04-02442fad05d2 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e097807f-e110-411e-9f04-02442fad05d2
deleted file mode 100644
index 9231ae4..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e097807f-e110-411e-9f04-02442fad05d2
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e097807f-e110-411e-9f04-02442fad05d2","details":"{\"type\":\"CompoundAction\",\"name\":\"03_Custom terms\",\"actionId\":\"e097807f-e110-411e-9f04-02442fad05d2\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to BYOD Provisioning tests\",\"actionId\":\"689ac858-78ed-434c-81d7-b6aaff66751a\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"BYOD Provisioning tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c8f2e97b-999d-4945-b357-334d83664687\",\"displayText\":\"BYOD Provisioning tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"BYOD Provisioning tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.666666666666666,\"y1\":700.0,\"x2\":351.3333333333333,\"y2\":729.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":93.5,\"y\":722.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":86.5,\"y\":-7.3333333333332575,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"c8f2e97b-999d-4945-b357-334d83664687\",\"firstText\":\"BYOD Provisioning tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"BYOD Provisioning tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":713.0,\"x2\":177.0,\"y2\":731.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, BYOD Provisioning tests\",\"actionId\":\"5458f6a1-3c61-461f-b23d-fa15f62605d0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"BYOD Provisioning tests\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Custom terms\",\"actionId\":\"c8c1e8b0-d4b3-4bf8-bdc2-b9d99bab7057\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Custom terms\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Go\",\"actionId\":\"8641e5cf-17d3-4d9c-a44b-59af86650e01\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Go\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/show_terms_button\",\"actionId\":\"6d8593d7-f3d4-4fc9-9fd9-e40f124aa61b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.managedprovisioning:id/show_terms_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Company ABC\",\"actionId\":\"7fe2f714-d46d-466b-ae68-0acbe3890bb0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Company ABC\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY-if \\\"Company Terms Content\\\" exists\",\"actionId\":\"4229e42c-539a-45d3-b11d-4bd1e1bcc67e\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Company Terms Content\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"13b4cb17-4b49-4cbf-ab56-ce61684d4385\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"644fd0d0-10fd-49d2-a348-7639a623f3eb\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/button1\",\"actionId\":\"5570b3ce-3e70-4950-8d7a-6b5989df06e2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"689ac858-78ed-434c-81d7-b6aaff66751a\",\"5458f6a1-3c61-461f-b23d-fa15f62605d0\",\"c8c1e8b0-d4b3-4bf8-bdc2-b9d99bab7057\",\"8641e5cf-17d3-4d9c-a44b-59af86650e01\",\"6d8593d7-f3d4-4fc9-9fd9-e40f124aa61b\",\"7fe2f714-d46d-466b-ae68-0acbe3890bb0\",\"4229e42c-539a-45d3-b11d-4bd1e1bcc67e\",\"13b4cb17-4b49-4cbf-ab56-ce61684d4385\",\"644fd0d0-10fd-49d2-a348-7639a623f3eb\",\"5570b3ce-3e70-4950-8d7a-6b5989df06e2\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"03_Custom terms","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.313000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e09a8291-7909-4e13-aadd-413ef0f26bdc b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e09a8291-7909-4e13-aadd-413ef0f26bdc
deleted file mode 100644
index 9dabfca..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e09a8291-7909-4e13-aadd-413ef0f26bdc
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e09a8291-7909-4e13-aadd-413ef0f26bdc","details":"{\"type\":\"CompoundAction\",\"name\":\"16-07-Microphone access permission\",\"actionId\":\"e09a8291-7909-4e13-aadd-413ef0f26bdc\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Microphone access permission\",\"actionId\":\"4a87a566-fddb-412b-aabb-470220f9b335\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Microphone access permission\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"318d1078-c652-4730-a88d-eeb7113597af\",\"displayText\":\"Microphone access permission\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Microphone access permission\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":340.25,\"x2\":351.25,\"y2\":382.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":112.0,\"y\":362.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":68.0,\"y\":-0.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"318d1078-c652-4730-a88d-eeb7113597af\",\"firstText\":\"Microphone access permission\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Microphone access permission\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":346.0,\"x2\":215.0,\"y2\":378.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Microphone access permission\",\"actionId\":\"09ca85fc-93e9-48cb-a6a9-fd20f941d39e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Microphone access permission\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told your administrator has granted Microphone access to any apps\",\"actionId\":\"1aab4771-080b-4813-a17a-01a4b9989dbb\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Microphone permissions\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"23849589-0c46-42e8-a08c-49e170975995\",\"displayText\":\"Microphone permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"0b062104-fef4-4a6e-988d-47fcf777c28d\",\"displayText\":\"Microphone permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"bd0c3993-f065-40c3-9513-8bb1bf3b0ee5\",\"displayText\":\"Microphone permissions\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Microphone permissions\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":217.75,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.375,\"y\":3.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Microphone permissions\"},{\"uuid\":\"654a51c3-5ee6-48e6-83fa-0adbcdd5b8c2\",\"displayText\":\"Minimum 1 app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":148.5,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Minimum 1 app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Microphone permissions\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":137.0,\"y\":398.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":43.0,\"y\":11.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"bd0c3993-f065-40c3-9513-8bb1bf3b0ee5\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Microphone permissions\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":52.0,\"y1\":385.0,\"x2\":222.0,\"y2\":411.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1e94de22-9abd-4dd4-95d9-b61a902e62ee\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told your administrator has granted Microphone access to CTS Verifier\",\"actionId\":\"e5480b1e-56de-4971-8508-231c81b7148b\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Microphone permissions\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a9dc2a97-c475-4f18-aa32-ddfb2a51a3d0\",\"displayText\":\"Microphone permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e656469a-ac7f-46f4-8b4f-5cfea9f30773\",\"displayText\":\"Microphone permissions\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"edee4917-c053-4b7b-89b2-180467432a54\",\"displayText\":\"Microphone permissions\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Microphone permissions\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":217.75,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":10.375,\"y\":8.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Microphone permissions\"},{\"uuid\":\"15e5eedd-9537-4c74-af28-500c72966965\",\"displayText\":\"Minimum 1 app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Minimum 1 app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":148.5,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Minimum 1 app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Microphone permissions\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":130.0,\"y\":393.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":50.0,\"y\":16.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"edee4917-c053-4b7b-89b2-180467432a54\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Microphone permissions\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":39.0,\"y1\":381.0,\"x2\":221.0,\"y2\":406.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Microphone permissions\",\"actionId\":\"1a2f07ff-bad8-4556-b8d6-48829a19f6c1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Microphone permissions\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"dd031db0-d627-4967-8884-6352e4390a98\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"bbd7fe1e-666f-49d5-bc8f-88cbd1efa8a8\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"4a87a566-fddb-412b-aabb-470220f9b335\",\"09ca85fc-93e9-48cb-a6a9-fd20f941d39e\",\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"1aab4771-080b-4813-a17a-01a4b9989dbb\",\"1e94de22-9abd-4dd4-95d9-b61a902e62ee\",\"034d5968-a791-4164-8b00-450ddadb3db1\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"e5480b1e-56de-4971-8508-231c81b7148b\",\"1a2f07ff-bad8-4556-b8d6-48829a19f6c1\",\"c06f1557-8c66-44c1-8dc2-dad782d2f597\",\"dd031db0-d627-4967-8884-6352e4390a98\",\"bbd7fe1e-666f-49d5-bc8f-88cbd1efa8a8\",\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-07-Microphone access permission","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.178000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e0c4500d-daea-44e2-b105-6efa0f087cb1 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e0c4500d-daea-44e2-b105-6efa0f087cb1
deleted file mode 100644
index 5e48257..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e0c4500d-daea-44e2-b105-6efa0f087cb1
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e0c4500d-daea-44e2-b105-6efa0f087cb1","details":"{\"type\":\"CompoundAction\",\"name\":\"11-Disable keyguard\",\"actionId\":\"e0c4500d-daea-44e2-b105-6efa0f087cb1\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"c131f309-79ae-48c8-a354-4410a90e97e4\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"11-Disable keyguard","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.104000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e1d66f34-6024-4d89-b511-399897ba2464 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e1d66f34-6024-4d89-b511-399897ba2464
deleted file mode 100644
index 647546b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e1d66f34-6024-4d89-b511-399897ba2464
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e1d66f34-6024-4d89-b511-399897ba2464","details":"{\"type\":\"CompoundAction\",\"name\":\"Set Password lock to \\\"1234\\\"\",\"actionId\":\"e1d66f34-6024-4d89-b511-399897ba2464\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Password\",\"actionId\":\"bed0f330-f9b7-425e-b9c0-ed00b5f95b1e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Password\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"33a996a7-6fa4-4b66-b59c-61911261a7ca\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm button\",\"actionId\":\"3ce2c23e-bed9-46d6-a33c-094c15255f36\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"bed0f330-f9b7-425e-b9c0-ed00b5f95b1e\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"33a996a7-6fa4-4b66-b59c-61911261a7ca\",\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"3ce2c23e-bed9-46d6-a33c-094c15255f36\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Set Password lock to \"1234\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.038000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e242b517-2878-473b-bf43-ae1e7c299f21 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e242b517-2878-473b-bf43-ae1e7c299f21
deleted file mode 100644
index bd31b3d..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e242b517-2878-473b-bf43-ae1e7c299f21
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e242b517-2878-473b-bf43-ae1e7c299f21","details":"{\"type\":\"CompoundAction\",\"name\":\"16-04-Retrieve security logs\",\"actionId\":\"e242b517-2878-473b-bf43-ae1e7c299f21\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Retrieve security logs\",\"actionId\":\"767fef70-741f-48c9-b1f2-4c76f475ae98\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Retrieve security logs\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a007c986-fe01-425b-90c9-f253674c6c65\",\"displayText\":\"Retrieve security logs\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Retrieve security logs\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":211.25,\"x2\":351.25,\"y2\":253.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":85.0,\"y\":230.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":95.0,\"y\":1.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"a007c986-fe01-425b-90c9-f253674c6c65\",\"firstText\":\"Retrieve security logs\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Retrieve security logs\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":14.0,\"y1\":219.0,\"x2\":156.0,\"y2\":242.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Retrieve security logs\",\"actionId\":\"1f93bcf6-5e85-4234-90cf-c6a6de95b6a3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Retrieve security logs\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Retrieve Security Logs\",\"actionId\":\"72bea6cf-8f40-4fd0-b25b-6e97f4c7be81\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Retrieve Security Logs\"},{\"type\":\"PythonScriptAction\",\"name\":\"Verify that you are told security logs were last retrieved at the time you pressed\",\"actionId\":\"da61f100-d343-4081-8bd3-482e947d1cbe\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.uicd_python_util import UICDPythonUtil\\nfrom python_uiautomator.constant import MatchOption\\n\\nuicd_util = UICDPythonUtil()\\nd= Device.create_device_by_slot(0)\\n\\ntime = dict(d.resource_id(\\\"com.android.systemui:id/clock\\\").get_attributes())['text']\\n\\nresult = d.text(\\\"Most recent security log\\\").down().text(time, MatchOption.CONTAINS).verify_exist()\\nuicd_util.assert_true(result, \\\"Element not found\\\")\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"19b5a25b-903b-4e57-874a-274407e66fdb\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"767fef70-741f-48c9-b1f2-4c76f475ae98\",\"1f93bcf6-5e85-4234-90cf-c6a6de95b6a3\",\"72bea6cf-8f40-4fd0-b25b-6e97f4c7be81\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"da61f100-d343-4081-8bd3-482e947d1cbe\",\"19b5a25b-903b-4e57-874a-274407e66fdb\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-04-Retrieve security logs","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.172000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e26e0b7d-f764-43a4-972e-1879b9ce2b3a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e26e0b7d-f764-43a4-972e-1879b9ce2b3a
deleted file mode 100644
index 4b9d62c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e26e0b7d-f764-43a4-972e-1879b9ce2b3a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e26e0b7d-f764-43a4-972e-1879b9ce2b3a","details":"{\"type\":\"CompoundAction\",\"name\":\"Collapse Bubble\",\"actionId\":\"e26e0b7d-f764-43a4-972e-1879b9ce2b3a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Collapse Bubble\",\"actionId\":\"ce45663f-02cc-499f-b72d-63fa6a2515f6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.systemui:id/bubble_view\"}],\"childrenIdList\":[\"ce45663f-02cc-499f-b72d-63fa6a2515f6\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Collapse Bubble","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.227000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e272f61e-5e1a-434d-ab44-5ae9abf260fc b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e272f61e-5e1a-434d-ab44-5ae9abf260fc
deleted file mode 100644
index 9f560ecf..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e272f61e-5e1a-434d-ab44-5ae9abf260fc
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e272f61e-5e1a-434d-ab44-5ae9abf260fc","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Permission of contacts\",\"actionId\":\"e272f61e-5e1a-434d-ab44-5ae9abf260fc\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Permissions\",\"actionId\":\"a4d7cb7c-0699-4796-9d29-8e2904265acc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Permissions\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Contacts\",\"actionId\":\"93d84cd1-cf09-4a62-9898-2eda3fe51018\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Contacts\"}],\"childrenIdList\":[\"a4d7cb7c-0699-4796-9d29-8e2904265acc\",\"93d84cd1-cf09-4a62-9898-2eda3fe51018\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Permission of contacts","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.113000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2afa6de-5d79-4e1f-ad1a-b6e88e31e5a3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2afa6de-5d79-4e1f-ad1a-b6e88e31e5a3
deleted file mode 100644
index 754c981..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2afa6de-5d79-4e1f-ad1a-b6e88e31e5a3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e2afa6de-5d79-4e1f-ad1a-b6e88e31e5a3","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Bubble Notification Tests\",\"actionId\":\"e2afa6de-5d79-4e1f-ad1a-b6e88e31e5a3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Bubble Notification Tests\",\"actionId\":\"685979e5-3870-49c1-bfc5-918edcc49ed6\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Bubble Notification Tests\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"2c0537fe-0145-4457-9e7a-f3c50873157d\",\"displayText\":\"Bubble Notification Tests\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Bubble Notification Tests\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":400.25,\"x2\":351.25,\"y2\":442.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":91.0,\"y\":419.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":89.0,\"y\":2.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"2c0537fe-0145-4457-9e7a-f3c50873157d\",\"firstText\":\"Bubble Notification Tests\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Bubble Notification Tests\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":10.0,\"y1\":410.0,\"x2\":172.0,\"y2\":428.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Bubble Notification Tests\",\"actionId\":\"f0983adb-dd69-49ba-87cc-b9743ad938cc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Bubble Notification Tests\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Enable bubbles for CTS Verifier\",\"actionId\":\"afdd8c0f-6ff3-4506-bdd2-be552c021a9b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, All conversations can bubble\",\"actionId\":\"8153f38f-2ee0-4bef-a704-29e0201b9536\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/bubble_all_label\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"5382f206-1f12-407c-b56d-9e63b7e0224d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step 1-Send a bubble with notification\",\"actionId\":\"19fadb00-593a-4fb4-84e4-c33410cd8d0c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step 2- Update bubble to hide notification\",\"actionId\":\"dc311f71-daa8-41b1-9b8c-2c654c240fa1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step 3- Update bubble to show notification\",\"actionId\":\"df9d8789-1767-4841-8a89-2e996ef3f294\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step 4- Remove bubble\",\"actionId\":\"6fb3380d-5c04-4a02-b7f4-d7dd6cb3f4dc\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step 5-Add bubble\",\"actionId\":\"ca0f5702-f8ce-49f7-aa80-676f3afdcd85\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Step 6-Open Bubble\",\"actionId\":\"3cd70629-4895-4ae4-9d19-a2581af30c3c\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/bubble_view\"}]},\"clickAfterValidation\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step 7- Update bubble to show notification\",\"actionId\":\"656b5f04-a88a-4f87-a10a-2230f02605d9\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step 8- Send bubble notification\",\"actionId\":\"223c381e-028a-457f-ab96-bb2a631dd512\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"PythonScriptAction\",\"name\":\"PYSCRIPT-Dismiss notification\",\"actionId\":\"47d111bc-f1ac-43c5-a890-42e3e77ff5ad\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\n\\nd.text(\\\"BubbleChat\\\").parent().parent().swipe()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, Step 9 - Send auto-expanded bubble notification\",\"actionId\":\"3277fa21-cbca-490b-9eb5-a1d28310651f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/bubble_test_button\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY that a bubble appears on screen, auto-expanded\",\"actionId\":\"dadce6ee-6e0b-4435-a2fb-4c5278460f5a\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/bubble_expanded_view\"}]},\"clickAfterValidation\":false}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"685979e5-3870-49c1-bfc5-918edcc49ed6\",\"f0983adb-dd69-49ba-87cc-b9743ad938cc\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"afdd8c0f-6ff3-4506-bdd2-be552c021a9b\",\"8153f38f-2ee0-4bef-a704-29e0201b9536\",\"5382f206-1f12-407c-b56d-9e63b7e0224d\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"19fadb00-593a-4fb4-84e4-c33410cd8d0c\",\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"dc311f71-daa8-41b1-9b8c-2c654c240fa1\",\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"37bd58c3-6297-4c65-ac3f-e575ec7b3986\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"df9d8789-1767-4841-8a89-2e996ef3f294\",\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"6fb3380d-5c04-4a02-b7f4-d7dd6cb3f4dc\",\"696f0a59-5696-49f9-8573-34cfc71c3c61\",\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"ca0f5702-f8ce-49f7-aa80-676f3afdcd85\",\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"3cd70629-4895-4ae4-9d19-a2581af30c3c\",\"1c0d44ff-5ed3-4ea1-b931-f2cb903c504b\",\"008221ef-2f19-4071-9311-cfbe47857bb3\",\"e26e0b7d-f764-43a4-972e-1879b9ce2b3a\",\"37bd58c3-6297-4c65-ac3f-e575ec7b3986\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"656b5f04-a88a-4f87-a10a-2230f02605d9\",\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"8ef662f7-4f74-4591-ae52-3225f30513b1\",\"696f0a59-5696-49f9-8573-34cfc71c3c61\",\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"223c381e-028a-457f-ab96-bb2a631dd512\",\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"47d111bc-f1ac-43c5-a890-42e3e77ff5ad\",\"37bd58c3-6297-4c65-ac3f-e575ec7b3986\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"3277fa21-cbca-490b-9eb5-a1d28310651f\",\"dadce6ee-6e0b-4435-a2fb-4c5278460f5a\",\"e26e0b7d-f764-43a4-972e-1879b9ce2b3a\",\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"8ef662f7-4f74-4591-ae52-3225f30513b1\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Bubble Notification Tests","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.223000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2d2a682-55b0-4e2c-ad2d-801e77f1cb6f b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2d2a682-55b0-4e2c-ad2d-801e77f1cb6f
deleted file mode 100644
index 868db2c..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2d2a682-55b0-4e2c-ad2d-801e77f1cb6f
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e2d2a682-55b0-4e2c-ad2d-801e77f1cb6f","details":"{\"type\":\"CompoundAction\",\"name\":\"05-Sharing of requested bugreport accepted after having been taken\",\"actionId\":\"e2d2a682-55b0-4e2c-ad2d-801e77f1cb6f\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Sharing of requested bugreport accepted after having been taken\",\"actionId\":\"82a500ca-d7ad-4fab-a452-c6b3588eabf5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Sharing of requested bugreport accepted after having been taken\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Taking bug report\\\" progress bar is present\",\"actionId\":\"7733b655-21f9-44c5-afe1-97358053ca56\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Taking bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"WaitAction\",\"name\":\"WAIT 125 secs(Wait for bugreport to be collected)\",\"actionId\":\"34f1ad4a-22c7-4f82-a585-c0281c000455\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":125000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Taking bug report\\\" is dismissed\",\"actionId\":\"c1c5ec25-0be6-4c20-822f-28279986a2e9\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Taking bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY a message \\\"Your admin requested a bug report to help troubleshoot this device\\\" is shown\",\"actionId\":\"ef1cea85-6b99-47cc-9a1d-4aee62be60c6\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Your admin requested a bug report to help troubleshoot this device\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, SHARE button\",\"actionId\":\"fea370bd-1052-4438-9459-87f938731d74\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"SHARE\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Share bug report\\\" is dismissed\",\"actionId\":\"4821b549-5274-4aa2-9a3e-a7d8e369e270\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"Share bug report\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY \\\"Bugreport shared successfully\\\" is present\",\"actionId\":\"b12ad70c-c64f-4d8b-a8cd-4c32b06fc36d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Bugreport shared successfully\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Dismiss \\\"Bugreport shared successfully\\\" notification\",\"actionId\":\"2ad839f1-ef46-4546-a5f8-3120fc16b0af\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Bugreport shared successfully\\\").swipe()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"97f395fe-d251-4879-b38b-308966952508\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"4f3ec13b-589a-4ca3-b456-7224028d0604\",\"82a500ca-d7ad-4fab-a452-c6b3588eabf5\",\"4275df2b-8d38-49a9-b956-6d5f06257f5a\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"7733b655-21f9-44c5-afe1-97358053ca56\",\"34f1ad4a-22c7-4f82-a585-c0281c000455\",\"c1c5ec25-0be6-4c20-822f-28279986a2e9\",\"ef1cea85-6b99-47cc-9a1d-4aee62be60c6\",\"fea370bd-1052-4438-9459-87f938731d74\",\"4821b549-5274-4aa2-9a3e-a7d8e369e270\",\"b12ad70c-c64f-4d8b-a8cd-4c32b06fc36d\",\"2ad839f1-ef46-4546-a5f8-3120fc16b0af\",\"97f395fe-d251-4879-b38b-308966952508\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"05-Sharing of requested bugreport accepted after having been taken","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.077000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2eae039-e0f9-4bad-a122-3b67582d0cb2 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2eae039-e0f9-4bad-a122-3b67582d0cb2
deleted file mode 100644
index d023605..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e2eae039-e0f9-4bad-a122-3b67582d0cb2
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e2eae039-e0f9-4bad-a122-3b67582d0cb2","details":"{\"type\":\"CompoundAction\",\"name\":\"16-10-Default keyboard\",\"actionId\":\"e2eae039-e0f9-4bad-a122-3b67582d0cb2\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Default keyboard\",\"actionId\":\"ee7819cd-9ce8-4899-ba54-38e0074e3cbd\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Default keyboard\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"aa8b68ae-baf9-44f6-b60d-7e0fd6e149b8\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Default keyboard\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":469.25,\"x2\":351.25,\"y2\":511.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":67.5,\"y\":489.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":112.5,\"y\":0.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"aa8b68ae-baf9-44f6-b60d-7e0fd6e149b8\",\"firstText\":\"Default keyboard\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Default keyboard\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":480.0,\"x2\":130.0,\"y2\":499.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Default keyboard\",\"actionId\":\"0439169c-ca8e-43e2-bcd1-160703425820\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Default keyboard\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are not told the default keyboard has been set\",\"actionId\":\"1c0899ad-1dda-4846-9f75-a8959d54b5e1\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Default keyboard\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"28cf2df7-2323-4f53-bacb-7b6325560b4a\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"49baf45e-a2b2-429d-a850-7a1a1d8fd659\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b36a3cf8-ef8d-4f48-9dd5-39e1c99d4bc2\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Default keyboard\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":171.75,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.875,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default keyboard\"},{\"uuid\":\"c7d1556c-68df-49d4-b749-7e4a4d54fcd4\",\"displayText\":\"Set to CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Set to CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":161.75,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Set to CTS Verifier\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default keyboard\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":116.5,\"y\":400.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":63.5,\"y\":9.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"b36a3cf8-ef8d-4f48-9dd5-39e1c99d4bc2\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Default keyboard\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":57.0,\"y1\":392.0,\"x2\":176.0,\"y2\":408.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"ef72371f-c6e8-4a50-98aa-7ea054319170\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Keyboard\",\"actionId\":\"fef28d99-3a7d-40b4-898e-a22ed680386f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set Keyboard\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that you are told the default keyboard has been set\",\"actionId\":\"be43d35c-a5a2-4830-a89d-e2bcec92cb10\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Default keyboard\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"37e7e8fb-e30e-4ead-b194-cc7caf039f54\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cca5b21d-f27c-46a2-ba1e-51fce9e05719\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"1ade400c-a68b-4259-a7c8-8e1d4ffd1ef5\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Default keyboard\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":171.75,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":3.875,\"y\":3.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default keyboard\"},{\"uuid\":\"d63e5e7d-c6f9-4771-b039-aa5f7d6bd68c\",\"displayText\":\"Set to CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Set to CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":161.75,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Set to CTS Verifier\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default keyboard\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":113.5,\"y\":398.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":66.5,\"y\":11.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"1ade400c-a68b-4259-a7c8-8e1d4ffd1ef5\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Default keyboard\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":60.0,\"y1\":388.0,\"x2\":167.0,\"y2\":409.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify default keyboard has been set to CTS Verifier\",\"actionId\":\"90cecc91-6d86-4571-bcf1-95ffb6f0da6b\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Set to CTS Verifier\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"5c1c3fdc-976e-44e0-ab63-ea6a739e1aa8\",\"displayText\":\"Set to CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c210eba9-c0e0-4b9e-9e81-e262615001c5\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7ab3ae73-6eff-471c-a42c-f4ec4c06946f\",\"displayText\":\"Default keyboard\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Default keyboard\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":392.0,\"x2\":171.75,\"y2\":411.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default keyboard\"},{\"uuid\":\"afa1f558-7907-4b87-b5ff-d52af67d6056\",\"displayText\":\"Set to CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Set to CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":411.0,\"x2\":161.75,\"y2\":427.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.625,\"y\":-0.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Set to CTS Verifier\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":378.0,\"x2\":346.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Default keyboard\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":378.0,\"x2\":360.0,\"y2\":441.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":117.0,\"y\":419.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":63.0,\"y\":-9.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"afa1f558-7907-4b87-b5ff-d52af67d6056\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Set to CTS Verifier\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":57.0,\"y1\":411.0,\"x2\":177.0,\"y2\":428.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"daf53e8f-2b0a-48e5-a567-b9a21de6dc2d\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"03e19599-15d9-4cff-acc4-88b977853f25\",\"ee7819cd-9ce8-4899-ba54-38e0074e3cbd\",\"0439169c-ca8e-43e2-bcd1-160703425820\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"1c0899ad-1dda-4846-9f75-a8959d54b5e1\",\"ef72371f-c6e8-4a50-98aa-7ea054319170\",\"fef28d99-3a7d-40b4-898e-a22ed680386f\",\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"be43d35c-a5a2-4830-a89d-e2bcec92cb10\",\"90cecc91-6d86-4571-bcf1-95ffb6f0da6b\",\"daf53e8f-2b0a-48e5-a567-b9a21de6dc2d\",\"b17bcc33-34e0-4aba-a8ce-080ea0d0846c\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"16-10-Default keyboard","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.183000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e395e5d8-df59-4e7d-bf18-6cd65da3ff8b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e395e5d8-df59-4e7d-bf18-6cd65da3ff8b
deleted file mode 100644
index 73de011..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e395e5d8-df59-4e7d-bf18-6cd65da3ff8b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e395e5d8-df59-4e7d-bf18-6cd65da3ff8b","details":"{\"type\":\"CompoundAction\",\"name\":\"15-21 & 17-06-11-Disallow config brightness\",\"actionId\":\"e395e5d8-df59-4e7d-bf18-6cd65da3ff8b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config brightness\",\"actionId\":\"ca0b8d87-626e-4edb-8638-01f41ab5b4e7\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config brightness\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3bd16eb8-ecff-46a9-bfb9-90b59dd78647\",\"displayText\":\"Disallow config brightness\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config brightness\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":227.33333333333334,\"x2\":360.0,\"y2\":271.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":253.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":-3.6666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"3bd16eb8-ecff-46a9-bfb9-90b59dd78647\",\"firstText\":\"Disallow config brightness\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config brightness\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":239.0,\"x2\":178.0,\"y2\":267.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config brightness\",\"actionId\":\"e061bfff-7981-44c2-9bcd-11cf0b33a94a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config brightness\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Brightness level\",\"actionId\":\"8c6e9670-fdc7-4b1b-bbc4-4fc471c2f61a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Brightness level\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"14668751-483e-4d6f-8c25-29efebfc65f4\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Adaptive brightness\",\"actionId\":\"693440eb-630c-4fc4-acc5-8841593b17fb\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Adaptive brightness\"},{\"type\":\"ConditionValidationAction\",\"name\":\"Click Adaptive brightness\",\"actionId\":\"242b682a-16e5-42e3-877b-8f68adfcce83\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/title\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Adaptive brightness\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"ca0b8d87-626e-4edb-8638-01f41ab5b4e7\",\"e061bfff-7981-44c2-9bcd-11cf0b33a94a\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"8c6e9670-fdc7-4b1b-bbc4-4fc471c2f61a\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"14668751-483e-4d6f-8c25-29efebfc65f4\",\"693440eb-630c-4fc4-acc5-8841593b17fb\",\"242b682a-16e5-42e3-877b-8f68adfcce83\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-21 & 17-06-11-Disallow config brightness","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.152000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e4555fba-a19a-4a6c-8f12-d3202b0203f5 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e4555fba-a19a-4a6c-8f12-d3202b0203f5
deleted file mode 100644
index bf3837f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e4555fba-a19a-4a6c-8f12-d3202b0203f5
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e4555fba-a19a-4a6c-8f12-d3202b0203f5","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn On/Off Do Not Disturb function\",\"actionId\":\"e4555fba-a19a-4a6c-8f12-d3202b0203f5\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if Do Not Disturb access setting was launched\",\"actionId\":\"e8b43c87-76c3-45d9-911f-67d87c23915f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Do Not Disturb access\"},{\"field\":\"class\",\"operator\":\"=\",\"value\":\"android.widget.TextView\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, CTS Verifier\",\"actionId\":\"9be3bf62-a25f-484d-ace4-b2219539c7e4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"CTS Verifier\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Allow Do Not Disturb\",\"actionId\":\"77b09900-7e21-4f4a-a27d-b7348165d743\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Allow Do Not Disturb\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, OK/Allow button\",\"actionId\":\"10983ab9-7c29-4535-bd2d-265587b98b70\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"a0a8084e-831f-4e95-9ef7-7817f1f5d582\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"1264a39b-e022-4fc8-94fd-53d54511a8e6\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"e8b43c87-76c3-45d9-911f-67d87c23915f\",\"9be3bf62-a25f-484d-ace4-b2219539c7e4\",\"77b09900-7e21-4f4a-a27d-b7348165d743\",\"10983ab9-7c29-4535-bd2d-265587b98b70\",\"a0a8084e-831f-4e95-9ef7-7817f1f5d582\",\"1264a39b-e022-4fc8-94fd-53d54511a8e6\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn On/Off Do Not Disturb function","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.235000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e66ce1e2-883e-465b-8d82-3cdb852cc679 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e66ce1e2-883e-465b-8d82-3cdb852cc679
deleted file mode 100644
index cb52aad..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e66ce1e2-883e-465b-8d82-3cdb852cc679
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e66ce1e2-883e-465b-8d82-3cdb852cc679","details":"{\"type\":\"CompoundAction\",\"name\":\"17-06-02-Disallow controlling apps\",\"actionId\":\"e66ce1e2-883e-465b-8d82-3cdb852cc679\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"InputAction\",\"name\":\"Home Button\",\"actionId\":\"64dec389-ec54-44ff-b290-c0dcb10433e9\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":3,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Play Store\",\"actionId\":\"04be83b8-00f5-44c7-80e7-0a5e030d22c5\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Play Store\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Search for apps & games\",\"actionId\":\"3de50fd6-3612-48d9-8623-b191684547eb\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Search for apps & games\"},{\"type\":\"InputAction\",\"name\":\"INPUT \\\"Google Keep\\\"\",\"actionId\":\"df66dba9-36c7-4eaa-b137-b0266e9acc7e\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"Google Keep\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Google Keep - Notes and Lists\",\"actionId\":\"0da09d94-3f76-447f-baf4-a7e31eac60ce\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Google Keep\"},{\"type\":\"ConditionClickAction\",\"name\":\"ConditionClickAction-install button\",\"actionId\":\"1140f7be-5866-4299-8506-ea4550e125d7\",\"actionType\":\"CONDITION_CLICK_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Install\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"de507563-492f-4d6e-834b-bf588aae5ab2\",\"displayText\":\"Install\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"890680ca-72b4-49c9-b873-ca806dc61dd1\",\"displayText\":\"Install\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ff6505dc-744a-4c90-8afc-9b908b6166bb\",\"displayText\":\"Install\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"05ef8300-facb-47f5-afc5-d0ce41450823\",\"displayText\":\"Install\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cfbec9a8-342f-4759-85d3-ec8a5df16f3c\",\"displayText\":\"Install\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.vending:id/0_resource_name_obfuscated\",\"text\":\"Install\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":249.0,\"x2\":339.0,\"y2\":280.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":4.0,\"y\":3.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Install\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"com.android.vending:id/0_resource_name_obfuscated\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":243.75,\"x2\":339.0,\"y2\":285.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Install\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.vending:id/0_resource_name_obfuscated\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":243.75,\"x2\":339.0,\"y2\":285.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Install\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.vending:id/0_resource_name_obfuscated\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":243.75,\"x2\":339.0,\"y2\":285.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Install\"}],\"className\":\"android.widget.FrameLayout\",\"resourceId\":\"com.android.vending:id/0_resource_name_obfuscated\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":243.75,\"x2\":339.0,\"y2\":285.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":176.0,\"y\":261.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":4.0,\"y\":3.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"cfbec9a8-342f-4759-85d3-ec8a5df16f3c\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Install\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":129.0,\"y1\":249.0,\"x2\":223.0,\"y2\":274.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow controlling apps\",\"actionId\":\"19d67ce1-df9e-4b85-95b8-08617ddd275f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow controlling apps\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/search_app_list_menu\",\"actionId\":\"6da4c545-1e81-4a23-9926-e3fa1b6e7ac8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/search_app_list_menu\"},{\"type\":\"InputAction\",\"name\":\"INPUT \\\"Keep Note\\\"\",\"actionId\":\"8678d97e-bbc7-40f9-b404-5c954a4577cb\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":0,\"inputString\":\"Keep Note\",\"isSingleChar\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Keep Notes\",\"actionId\":\"137529c1-8a26-43be-8867-b433dabb3418\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Keep Notes\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, uninstall button\",\"actionId\":\"86bd601c-0cd8-4502-b86a-65512d5f80a9\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button2\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"4dffadee-27c6-407a-a91d-cd9fe62f7ea0\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"eb8928d7-183a-4f4f-aecc-4f1ef4eb9929\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find Contacts\",\"actionId\":\"5ff9f752-10cc-40dc-a2bb-2dec90ed19de\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Contacts\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"65570f90-74a2-4ee0-8dca-cf48dd24d99a\",\"displayText\":\"Contacts\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"374048f4-6d58-400e-b940-415e961f3f3a\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3061bb4a-29b3-40b7-948a-d4a11d3369e6\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":218.25,\"x2\":42.0,\"y2\":246.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":214.75,\"x2\":63.0,\"y2\":249.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"5b8e8282-37d3-4052-8faf-03ea95dda64f\",\"displayText\":\"Contacts\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"00932122-6321-458e-9972-db1a61beb6f1\",\"displayText\":\"Contacts\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Contacts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":214.5,\"x2\":121.0,\"y2\":233.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.5,\"y\":2.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Contacts\"},{\"uuid\":\"94bec34c-c4d0-42c2-b5d4-b05c28b88d5b\",\"displayText\":\"22.64 MB\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"22.64 MB\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":233.5,\"x2\":346.0,\"y2\":250.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"22.64 MB\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":200.5,\"x2\":346.0,\"y2\":264.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Contacts\"}],\"className\":\"android.widget.LinearLayout\",\"contentDesc\":\"Contacts\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":200.5,\"x2\":360.0,\"y2\":264.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.5,\"y\":222.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":87.5,\"y\":10.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"00932122-6321-458e-9972-db1a61beb6f1\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Contacts\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":58.0,\"y1\":210.0,\"x2\":127.0,\"y2\":234.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Contacts\",\"actionId\":\"b0d15976-6e31-48f1-b4ce-b7ef2128f531\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Contacts\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disable button\",\"actionId\":\"f38bfa82-93ea-4f43-a37f-f42e11c06945\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button2\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"979b1310-6b33-4aa3-9f3d-56ce29a587e2\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Force stop button\",\"actionId\":\"a0f13bde-bc9a-40a8-90d6-9cc9c8aa8d5e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button3\"}],\"childrenIdList\":[\"64dec389-ec54-44ff-b290-c0dcb10433e9\",\"04be83b8-00f5-44c7-80e7-0a5e030d22c5\",\"23c5fa74-3416-4a41-84a9-3f348940a081\",\"3de50fd6-3612-48d9-8623-b191684547eb\",\"df66dba9-36c7-4eaa-b137-b0266e9acc7e\",\"0da09d94-3f76-447f-baf4-a7e31eac60ce\",\"1140f7be-5866-4299-8506-ea4550e125d7\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"19d67ce1-df9e-4b85-95b8-08617ddd275f\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"6da4c545-1e81-4a23-9926-e3fa1b6e7ac8\",\"8678d97e-bbc7-40f9-b404-5c954a4577cb\",\"137529c1-8a26-43be-8867-b433dabb3418\",\"86bd601c-0cd8-4502-b86a-65512d5f80a9\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"4dffadee-27c6-407a-a91d-cd9fe62f7ea0\",\"eb8928d7-183a-4f4f-aecc-4f1ef4eb9929\",\"5ff9f752-10cc-40dc-a2bb-2dec90ed19de\",\"b0d15976-6e31-48f1-b4ce-b7ef2128f531\",\"f38bfa82-93ea-4f43-a37f-f42e11c06945\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"979b1310-6b33-4aa3-9f3d-56ce29a587e2\",\"a0f13bde-bc9a-40a8-90d6-9cc9c8aa8d5e\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_Gmail_account=playinstallapk02@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\"}}","name":"17-06-02-Disallow controlling apps","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.202000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e690407d-25d7-42eb-9553-9f328ee32f0d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e690407d-25d7-42eb-9553-9f328ee32f0d
deleted file mode 100644
index 49e8ea1..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e690407d-25d7-42eb-9553-9f328ee32f0d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e690407d-25d7-42eb-9553-9f328ee32f0d","details":"{\"type\":\"CompoundAction\",\"name\":\"Turn on 3-button navigation\",\"actionId\":\"e690407d-25d7-42eb-9553-9f328ee32f0d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, System navigation\",\"actionId\":\"1aa293cd-73ac-4d1d-bfbc-fe147ce518a4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"System navigation\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, 3-button navigation\",\"actionId\":\"62c4fe1e-e58b-4649-a8a4-81112d1c8443\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"3-button navigation\"}],\"childrenIdList\":[\"514adc8f-fe99-4674-89cf-24028055b96e\",\"1aa293cd-73ac-4d1d-bfbc-fe147ce518a4\",\"62c4fe1e-e58b-4649-a8a4-81112d1c8443\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Turn on 3-button navigation","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.198000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e6aec7f0-e259-4914-9474-2ca7a5e3f45d b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e6aec7f0-e259-4914-9474-2ca7a5e3f45d
deleted file mode 100644
index 9a33ae2..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e6aec7f0-e259-4914-9474-2ca7a5e3f45d
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e6aec7f0-e259-4914-9474-2ca7a5e3f45d","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Recent Task Removal Test\",\"actionId\":\"e6aec7f0-e259-4914-9474-2ca7a5e3f45d\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Recent Task Removal Test\",\"actionId\":\"f5a403e6-00e6-4f44-9c17-2768a32ae806\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Recent Task Removal Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"5895863f-d55b-4f72-b5fe-fc71e2eec8db\",\"displayText\":\"Recent Task Removal Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Recent Task Removal Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":316.3333333333333,\"x2\":350.6666666666667,\"y2\":360.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":100.5,\"y\":340.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":79.5,\"y\":-1.6666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"5895863f-d55b-4f72-b5fe-fc71e2eec8db\",\"firstText\":\"Recent Task Removal Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Recent Task Removal Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":328.0,\"x2\":195.0,\"y2\":352.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Recent Task Removal Test\",\"actionId\":\"895fbc25-3366-4ddb-bdd6-4ac661fbb745\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Recent Task Removal Test\"},{\"type\":\"CommandLineAction\",\"name\":\"Install Force stop helper apk\",\"actionId\":\"b0001977-c6d2-4d27-8903-73830d2369dc\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":1000,\"createdBy\":\"pololee\",\"commandLine\":\"install -r -t $uicd_recent_task_removal_apk_path\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/fs_launch_test_app_button\",\"actionId\":\"a2ce74be-eb28-4dc7-bf87-c4a5cba7cee1\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/fs_launch_test_app_button\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"a6da420e-6e41-4e60-8d64-9ef381b1ecaa\",\"actionType\":\"INPUT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Overview Button\",\"actionId\":\"73a8899a-e53d-4465-afef-a3f8732b0d48\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":187,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Force stop helper app\",\"actionId\":\"ae889334-bbdf-4516-af9a-f82769dcec40\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Force stop helper app\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"36108037-17b8-4ba9-884a-796152105563\",\"displayText\":\"CTS Verifier\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"64cb6ef1-0ff1-470a-a31e-a95712e9112a\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.google.android.apps.nexuslauncher:id/snapshot\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":44.0,\"y1\":77.66666666666667,\"x2\":316.0,\"y2\":597.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"2382fca4-9ccd-4684-975b-111f12bec17c\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.google.android.apps.nexuslauncher:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":158.0,\"y1\":55.666666666666664,\"x2\":202.0,\"y2\":99.66666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"contentDesc\":\"CTS Verifier\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":44.0,\"y1\":55.666666666666664,\"x2\":316.0,\"y2\":597.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":155.0,\"y\":424.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":25.0,\"y\":-97.83333333333337,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"36108037-17b8-4ba9-884a-796152105563\",\"firstText\":\"CTS Verifier\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Force stop helper app\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":201.0,\"y1\":457.0,\"x2\":109.0,\"y2\":392.0},\"scrollOrientation\":3,\"scrollMaxNumber\":30},{\"type\":\"PythonScriptAction\",\"name\":\"Remove Force stop helper app from Recent apps\",\"actionId\":\"f6d805cd-b61a-4027-af3d-9c9f611efa7e\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import DirectionType\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nd.content_desc(\\\"Force stop helper app\\\").swipe(direction=DirectionType.UP)\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"2e70cc21-bc5c-455b-bfff-880a68716c19\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT-5 sec for processing\",\"actionId\":\"87502a7d-d5eb-4d6b-ae9e-ab77215d13e0\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":5000,\"createdBy\":\"pololee\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"f5a403e6-00e6-4f44-9c17-2768a32ae806\",\"895fbc25-3366-4ddb-bdd6-4ac661fbb745\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"b0001977-c6d2-4d27-8903-73830d2369dc\",\"a2ce74be-eb28-4dc7-bf87-c4a5cba7cee1\",\"a6da420e-6e41-4e60-8d64-9ef381b1ecaa\",\"73a8899a-e53d-4465-afef-a3f8732b0d48\",\"ae889334-bbdf-4516-af9a-f82769dcec40\",\"f6d805cd-b61a-4027-af3d-9c9f611efa7e\",\"2e70cc21-bc5c-455b-bfff-880a68716c19\",\"87502a7d-d5eb-4d6b-ae9e-ab77215d13e0\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_recent_task_removal_apk_path=$HOME/Downloads/CTS-V/android-cts-verifier-6722941/android-cts-verifier/CtsForceStopHelper.apk,\"}}","name":"test_Recent Task Removal Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.250000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e7c7dfa6-ef14-40bd-8f3d-dc7fac99aefe b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e7c7dfa6-ef14-40bd-8f3d-dc7fac99aefe
deleted file mode 100644
index d457b14..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e7c7dfa6-ef14-40bd-8f3d-dc7fac99aefe
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e7c7dfa6-ef14-40bd-8f3d-dc7fac99aefe","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Telecom Enable Phone Account Test\",\"actionId\":\"e7c7dfa6-ef14-40bd-8f3d-dc7fac99aefe\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Telecom Enable Phone Account Test\",\"actionId\":\"84d68153-d9a6-469b-9a26-e43852239408\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Telecom Enable Phone Account Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"39b8898e-3263-44c0-bae8-2534f9c8e193\",\"displayText\":\"Telecom Enable Phone Account Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Telecom Enable Phone Account Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":9.333333333333334,\"y1\":274.0,\"x2\":350.6666666666667,\"y2\":318.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":132.5,\"y\":295.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":47.5,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"39b8898e-3263-44c0-bae8-2534f9c8e193\",\"firstText\":\"Telecom Enable Phone Account Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Telecom Enable Phone Account Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":6.0,\"y1\":283.0,\"x2\":259.0,\"y2\":308.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Telecom Enable Phone Account Test\",\"actionId\":\"5600271f-5983-4647-bc0c-16ae30141f2a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Telecom Enable Phone Account Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/telecom_enable_phone_account_register_button\",\"actionId\":\"94d17352-5835-4982-8886-64febe5751e1\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/telecom_enable_phone_account_register_button\"},{\"type\":\"InputAction\",\"name\":\"Home Button\",\"actionId\":\"8ee48438-5510-4126-8a7a-ff25704dc8b5\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":3,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, Phone\",\"actionId\":\"8b0031c6-5100-46b4-96ce-83ba4946cb9a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Phone\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/three_dot_menu_or_clear_icon_view\",\"actionId\":\"9f8aa0a7-5e1c-486b-a5ce-fc6f68a52705\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.dialer:id/three_dot_menu_or_clear_icon_view\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Settings\",\"actionId\":\"7dcae317-00f9-4682-b8d3-6e3c885135fb\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Settings\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Calls\",\"actionId\":\"4ceba6c6-6849-4a6f-887a-d5b2ab86a8a8\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Calls\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Calling accounts\",\"actionId\":\"7e5cc11b-1396-4632-b075-1a742d119199\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Calling accounts\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/telecom_enable_phone_account_confirm_button\",\"actionId\":\"77ac697f-69d3-409b-937c-7e46a793d8cf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/telecom_enable_phone_account_confirm_button\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"84d68153-d9a6-469b-9a26-e43852239408\",\"5600271f-5983-4647-bc0c-16ae30141f2a\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"94d17352-5835-4982-8886-64febe5751e1\",\"8ee48438-5510-4126-8a7a-ff25704dc8b5\",\"8b0031c6-5100-46b4-96ce-83ba4946cb9a\",\"9f8aa0a7-5e1c-486b-a5ce-fc6f68a52705\",\"7dcae317-00f9-4682-b8d3-6e3c885135fb\",\"4ceba6c6-6849-4a6f-887a-d5b2ab86a8a8\",\"7e5cc11b-1396-4632-b075-1a742d119199\",\"645e8103-d449-40d0-abba-6d734e783792\",\"370c511c-5950-4b3a-b832-60f2a606a27a\",\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"77ac697f-69d3-409b-937c-7e46a793d8cf\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Telecom Enable Phone Account Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.277000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28
deleted file mode 100644
index 0576980..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Pass\\\" button\",\"actionId\":\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/test_step_passed\",\"actionId\":\"13366230-ea3a-4367-9ebb-1c9efd70eff6\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/test_step_passed\"}],\"childrenIdList\":[\"13366230-ea3a-4367-9ebb-1c9efd70eff6\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Pass\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.224000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e85d4353-bdbe-4671-9f3f-b94ec6b06b0e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e85d4353-bdbe-4671-9f3f-b94ec6b06b0e
deleted file mode 100644
index 79780c4..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e85d4353-bdbe-4671-9f3f-b94ec6b06b0e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e","details":"{\"type\":\"CompoundAction\",\"name\":\"Launch Device admin apps\",\"actionId\":\"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Security\",\"actionId\":\"67ad6999-e805-4dde-b912-51cd2299ec31\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Security\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"43aa6f30-f577-4ac4-93b7-fb0df1cc5c3f\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"f12d66d7-efcc-438a-bf4e-d9200581af61\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"3e692e1c-cef1-40bb-a506-3fbf40da7c83\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":102.33333333333333,\"x2\":45.333333333333336,\"y2\":133.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":98.66666666666667,\"x2\":63.0,\"y2\":137.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"e35bb38d-652c-4771-8bd1-a26d868257b8\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ebb69f7e-51d4-4fae-b2cf-af6fa9ba8e87\",\"displayText\":\"Security\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Security\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":100.0,\"x2\":115.66666666666667,\"y2\":119.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.166666666666657,\"y\":1.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Security\"},{\"uuid\":\"bddd42af-f9cf-4d8b-a77e-6d73ef9cdfac\",\"displayText\":\"Play Protect, screen lock, fingerprint\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Play Protect, screen lock, fingerprint\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":119.0,\"x2\":259.3333333333333,\"y2\":136.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Play Protect, screen lock, fingerprint\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":86.0,\"x2\":346.0,\"y2\":150.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Security\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":86.0,\"x2\":360.0,\"y2\":150.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":95.5,\"y\":108.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":84.5,\"y\":10.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"ebb69f7e-51d4-4fae-b2cf-af6fa9ba8e87\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Security\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":58.0,\"y1\":98.0,\"x2\":133.0,\"y2\":118.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Security\",\"actionId\":\"ac66f102-a1d5-4209-a9b6-d85a806aa7cf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Security\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Advanced\",\"actionId\":\"b925e889-ac82-47bf-859f-c835a7ae2983\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Advanced\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"7c54e5ec-c2e7-4372-ba73-03a31c90f07f\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2d6144f1-e6e8-42c9-97c8-7ccb51d6b481\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"9f9efb3e-1f9f-4cf8-8258-5732eb852fa8\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":556.3333333333334,\"x2\":35.0,\"y2\":577.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":552.6666666666666,\"x2\":63.0,\"y2\":581.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"d9b52971-b421-4a57-8a71-7e270deb2a82\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"8b93fe5d-82d7-4dee-994c-f485ec681bec\",\"displayText\":\"Advanced\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Advanced\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":550.0,\"x2\":117.33333333333333,\"y2\":567.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.8333333333333428,\"y\":1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Advanced\"},{\"uuid\":\"a5cf05c4-6504-4942-b49d-3ddc76928a14\",\"displayText\":\"App pinning, Confirm SIM deletion\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"App pinning, Confirm SIM deletion\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":567.0,\"x2\":248.33333333333334,\"y2\":584.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"App pinning, Confirm SIM deletion\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":536.0,\"x2\":346.0,\"y2\":598.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Advanced\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":536.0,\"x2\":360.0,\"y2\":598.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":92.0,\"y\":557.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":88.0,\"y\":9.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"8b93fe5d-82d7-4dee-994c-f485ec681bec\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Advanced\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":57.0,\"y1\":549.0,\"x2\":127.0,\"y2\":566.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Advanced\",\"actionId\":\"f8abe51a-d1b2-442d-825f-439908727019\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Advanced\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Device admin apps\",\"actionId\":\"e078222d-892b-479e-a3ae-1c6afd06981b\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device admin apps\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e0488ca2-95a4-43c0-accf-ada3e01b1e60\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"323c4598-1321-4c0c-9f9a-2db918496062\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"af009cfd-f790-4d81-8a0d-1fa77fe55963\",\"displayText\":\"Device admin apps\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Device admin apps\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":367.3333333333333,\"x2\":182.66666666666666,\"y2\":386.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-1.6666666666666714,\"y\":2.3333333333333144,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Device admin apps\"},{\"uuid\":\"02125a2d-3f61-4a30-b281-6a6b1ca53d91\",\"displayText\":\"1 active app\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"1 active app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":386.3333333333333,\"x2\":129.33333333333334,\"y2\":403.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"1 active app\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":353.3333333333333,\"x2\":346.0,\"y2\":417.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Device admin apps\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":353.3333333333333,\"x2\":360.0,\"y2\":417.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":124.5,\"y\":374.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":55.5,\"y\":10.833333333333314,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"af009cfd-f790-4d81-8a0d-1fa77fe55963\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device admin apps\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":52.0,\"y1\":357.0,\"x2\":197.0,\"y2\":392.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Device admin apps\",\"actionId\":\"f83b79f0-7b21-4965-a1e7-84115f9d8430\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device admin apps\"}],\"childrenIdList\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"67ad6999-e805-4dde-b912-51cd2299ec31\",\"ac66f102-a1d5-4209-a9b6-d85a806aa7cf\",\"b925e889-ac82-47bf-859f-c835a7ae2983\",\"f8abe51a-d1b2-442d-825f-439908727019\",\"e078222d-892b-479e-a3ae-1c6afd06981b\",\"f83b79f0-7b21-4965-a1e7-84115f9d8430\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Launch Device admin apps","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.052000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e8f7b797-087f-4398-b4e2-358fe50416f3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e8f7b797-087f-4398-b4e2-358fe50416f3
deleted file mode 100644
index 19ee256..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e8f7b797-087f-4398-b4e2-358fe50416f3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e8f7b797-087f-4398-b4e2-358fe50416f3","details":"{\"type\":\"CompoundAction\",\"name\":\"15-10-Disallow factory reset\",\"actionId\":\"e8f7b797-087f-4398-b4e2-358fe50416f3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow factory reset\",\"actionId\":\"65a889e1-d55b-479e-88e9-8019d42a940d\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow factory reset\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a614a67e-8e5a-4d0e-8fcd-73d84e59f427\",\"displayText\":\"Disallow factory reset\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow factory reset\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":478.3333333333333,\"x2\":360.0,\"y2\":522.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":85.0,\"y\":507.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":95.0,\"y\":-7.166666666666629,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"a614a67e-8e5a-4d0e-8fcd-73d84e59f427\",\"firstText\":\"Disallow factory reset\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow factory reset\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":490.0,\"x2\":168.0,\"y2\":525.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow factory reset\",\"actionId\":\"6c9a3dcb-2f59-4fb9-816e-532e183d9309\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow factory reset\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Erase all data (factory reset)\",\"actionId\":\"99f1e91d-7598-49e5-947a-63a5ee5db9b0\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Erase all data (factory reset)\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"65a889e1-d55b-479e-88e9-8019d42a940d\",\"6c9a3dcb-2f59-4fb9-816e-532e183d9309\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"d7cdb82c-060e-4a47-83c1-c1b9f6396683\",\"99f1e91d-7598-49e5-947a-63a5ee5db9b0\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-10-Disallow factory reset","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.135000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e92b83d0-131c-4ef1-aaab-49103f238136 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e92b83d0-131c-4ef1-aaab-49103f238136
deleted file mode 100644
index e5035e3..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/e92b83d0-131c-4ef1-aaab-49103f238136
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e92b83d0-131c-4ef1-aaab-49103f238136","details":"{\"type\":\"CompoundAction\",\"name\":\"15-02-Disallow adjust volume\",\"actionId\":\"e92b83d0-131c-4ef1-aaab-49103f238136\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"0e30ea6e-be38-468e-8499-790b05a37760\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-02-Disallow adjust volume","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.124000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/eb48590b-4827-44e1-a2bd-9c3416e92404 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/eb48590b-4827-44e1-a2bd-9c3416e92404
deleted file mode 100644
index 313e51f..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/eb48590b-4827-44e1-a2bd-9c3416e92404
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"eb48590b-4827-44e1-a2bd-9c3416e92404","details":"{\"type\":\"CompoundAction\",\"name\":\"17-06-03-Disallow config Wi-Fi\",\"actionId\":\"eb48590b-4827-44e1-a2bd-9c3416e92404\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config Wi-Fi\",\"actionId\":\"ba5ce41d-e198-4af6-b5c7-88dc7a40352b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config Wi-Fi\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"04030feb-27be-41c6-bd7a-a8f31e3d37a5\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"ba5ce41d-e198-4af6-b5c7-88dc7a40352b\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"04030feb-27be-41c6-bd7a-a8f31e3d37a5\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"17-06-03-Disallow config Wi-Fi","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.203000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ec014d61-87cd-4f31-bd58-01ea49f2fe46 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ec014d61-87cd-4f31-bd58-01ea49f2fe46
deleted file mode 100644
index 92b1d94..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ec014d61-87cd-4f31-bd58-01ea49f2fe46
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ec014d61-87cd-4f31-bd58-01ea49f2fe46","details":"{\"type\":\"CompoundAction\",\"name\":\"Screen on device\",\"actionId\":\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"shareWith\":\"pololee\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if status bar exists\",\"actionId\":\"9cd82c9a-af66-4cc0-95c2-01d14adcb40a\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.systemui:id/status_bar\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4ac3bb02-4772-406a-9e99-b39155c732d8\",\"displayText\":\"Apps list\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"142ba0da-005e-4f99-b3c8-dfad6f1cd2a1\",\"displayText\":\"Apps list\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"contentDesc\":\"Apps list\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":171.66666666666666,\"y1\":579.3333333333334,\"x2\":188.33333333333334,\"y2\":585.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Apps list\"}],\"className\":\"android.view.View\",\"resourceId\":\"com.google.android.apps.nexuslauncher:id/scrim_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":0.0,\"x2\":360.0,\"y2\":690.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":185.5,\"y\":25.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-5.5,\"y\":319.8333333333333,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"4ac3bb02-4772-406a-9e99-b39155c732d8\",\"firstText\":\"Apps list\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.systemui:id/status_bar\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":17.0,\"y1\":6.0,\"x2\":354.0,\"y2\":45.0}},{\"type\":\"InputAction\",\"name\":\"Power Button\",\"actionId\":\"4393a845-0125-413d-9bd7-03ae0ead3e62\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":26,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"9cd82c9a-af66-4cc0-95c2-01d14adcb40a\",\"4393a845-0125-413d-9bd7-03ae0ead3e62\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Screen on device","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.050000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ec764a5f-6c81-496a-820b-00869272b2f4 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ec764a5f-6c81-496a-820b-00869272b2f4
deleted file mode 100644
index 17205d6..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ec764a5f-6c81-496a-820b-00869272b2f4
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ec764a5f-6c81-496a-820b-00869272b2f4","details":"{\"type\":\"CompoundAction\",\"name\":\"06-Disallow data roaming\",\"actionId\":\"ec764a5f-6c81-496a-820b-00869272b2f4\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow data roaming\",\"actionId\":\"10292eed-6f07-4a8e-b746-3ed46ea77eac\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow data roaming\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"3937f70d-7826-4dab-bf2c-dbbd8658f7cf\",\"displayText\":\"Disallow data roaming\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow data roaming\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":553.75,\"x2\":351.25,\"y2\":595.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":81.0,\"y\":576.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":99.0,\"y\":-1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"3937f70d-7826-4dab-bf2c-dbbd8658f7cf\",\"firstText\":\"Disallow data roaming\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow data roaming\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":559.0,\"x2\":157.0,\"y2\":593.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow data roaming\",\"actionId\":\"2017e2a9-e8a4-49da-9a57-b7a2d6e18926\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow data roaming\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY if Data Roaming is disabled\",\"actionId\":\"67e69aa6-09b7-439b-9de5-935917770637\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Roaming\"},{\"field\":\"enabled\",\"operator\":\"=\",\"value\":\"false\"}]},\"clickAfterValidation\":false},{\"type\":\"ClickAction\",\"name\":\"Click Action, Roaming\",\"actionId\":\"f72e0a06-2d82-488a-b997-609487dca006\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Roaming\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"a6d008d4-2d85-4d34-a2e0-5ee85670b952\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"40335097-264a-417f-8b61-fb66965a164b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"c1068330-ea63-4e42-8806-773d1152094f\",\"10292eed-6f07-4a8e-b746-3ed46ea77eac\",\"2017e2a9-e8a4-49da-9a57-b7a2d6e18926\",\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"67e69aa6-09b7-439b-9de5-935917770637\",\"f72e0a06-2d82-488a-b997-609487dca006\",\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"a6d008d4-2d85-4d34-a2e0-5ee85670b952\",\"40335097-264a-417f-8b61-fb66965a164b\",\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"06-Disallow data roaming","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.097000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ed26761a-7dc5-4235-a35f-48025edbd3f3 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ed26761a-7dc5-4235-a35f-48025edbd3f3
deleted file mode 100644
index 7215b9a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ed26761a-7dc5-4235-a35f-48025edbd3f3
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ed26761a-7dc5-4235-a35f-48025edbd3f3","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Alarms and Timers Tests-Set Alarm Test\",\"actionId\":\"ed26761a-7dc5-4235-a35f-48025edbd3f3\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Alarm Test\",\"actionId\":\"d25d2a84-bf35-484f-83e9-296eae3c7f3c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT\",\"selector\":\"Set Alarm Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Set Alarm\",\"actionId\":\"72458175-85cc-4a16-8836-c9ab50337d38\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set Alarm\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - UI to manage alarms\",\"actionId\":\"5e148d0d-5bd1-4519-9aae-4397b58df44d\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"timePicker\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/timePicker\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - UI to manage alarms\",\"actionId\":\"1875c96a-f2f3-46a3-817f-8aa111099f87\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"time_header\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/time_header\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - UI to manage alarms\",\"actionId\":\"c68217f5-c171-432b-a9cd-75f5b782b11f\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"ampm_layout\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/ampm_layout\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - UI to manage alarms\",\"actionId\":\"21c2c96d-dea4-448b-9827-cab2c7860736\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"radial_picker\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"android:id/radial_picker\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - click 6\",\"actionId\":\"affa2bba-591b-4040-838e-84832e6d9805\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"Alarm set for 6:00\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"6\"}]},\"clickAfterValidation\":true},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY - click 0\",\"actionId\":\"f9d16bb9-e5e7-4427-a85d-11cc18b916fc\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"actionDescription\":\"Alarm set for 6:00\",\"delayAfterActionMs\":3000,\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"0\"}]},\"clickAfterValidation\":true},{\"type\":\"ClickAction\",\"name\":\"Click Action, OK\",\"actionId\":\"5e2e4b66-1a1f-461f-ada1-418f13aa075f\",\"actionType\":\"CLICK_ACTION\",\"actionDescription\":\"id/button1\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY\",\"actionId\":\"515058f4-60b7-4ab1-965b-623111426d53\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"text\",\"operator\":\"contains\",\"value\":\"6:00\"}]},\"clickAfterValidation\":false},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"bb66d1a1-583b-4c5f-8eb8-d636ab1aeb32\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"pololee\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"3832f622-3408-4968-9429-c0c9e11905d5\",\"d25d2a84-bf35-484f-83e9-296eae3c7f3c\",\"72458175-85cc-4a16-8836-c9ab50337d38\",\"5e148d0d-5bd1-4519-9aae-4397b58df44d\",\"1875c96a-f2f3-46a3-817f-8aa111099f87\",\"c68217f5-c171-432b-a9cd-75f5b782b11f\",\"21c2c96d-dea4-448b-9827-cab2c7860736\",\"affa2bba-591b-4040-838e-84832e6d9805\",\"f9d16bb9-e5e7-4427-a85d-11cc18b916fc\",\"5e2e4b66-1a1f-461f-ada1-418f13aa075f\",\"515058f4-60b7-4ab1-965b-623111426d53\",\"61f8f3bd-bae5-4a38-949c-f759cda9375e\",\"bb66d1a1-583b-4c5f-8eb8-d636ab1aeb32\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Alarms and Timers Tests-Set Alarm Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.032000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ed37b636-1904-49d8-a5cc-4f6046f1358b b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ed37b636-1904-49d8-a5cc-4f6046f1358b
deleted file mode 100644
index 67f48e8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ed37b636-1904-49d8-a5cc-4f6046f1358b
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ed37b636-1904-49d8-a5cc-4f6046f1358b","details":"{\"type\":\"CompoundAction\",\"name\":\"Click\\\"Clear restriction(before leaving test)\\\" button\",\"actionId\":\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Clear restriction (before leaving test)\",\"actionId\":\"24589f88-c551-4bf6-a354-f7b7ab0ba638\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Clear restriction (before leaving test)\"}],\"childrenIdList\":[\"24589f88-c551-4bf6-a354-f7b7ab0ba638\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click\"Clear restriction(before leaving test)\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.093000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ef1953d2-3590-451b-a0a5-e129f37a328e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ef1953d2-3590-451b-a0a5-e129f37a328e
deleted file mode 100644
index 3181841..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ef1953d2-3590-451b-a0a5-e129f37a328e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ef1953d2-3590-451b-a0a5-e129f37a328e","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Device Admin Uninstall Test\",\"actionId\":\"ef1953d2-3590-451b-a0a5-e129f37a328e\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"CommandLineAction\",\"name\":\"install CtsEmptyDeviceAdmin_apk\",\"actionId\":\"8a4a0b5e-fd80-42ee-a50a-0aaeeb7b87fa\",\"actionType\":\"COMMAND_LINE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"commandLine\":\"install -r -t $uicd_CtsEmptyDeviceAdmin_apk_path\",\"isAdbCommand\":true,\"expectedReturnCode\":\"0\",\"commandlineExecutionTimeoutSec\":5,\"needShellOutput\":false,\"uicdVariableName\":\"\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Device Admin Uninstall Test\",\"actionId\":\"bd5b3775-00b7-47ea-a9ea-b48b4078ef70\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Device Admin Uninstall Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8143ab23-8ec9-4f7e-9630-15a342e26a14\",\"displayText\":\"Device Admin Uninstall Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Device Admin Uninstall Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":592.75,\"x2\":351.25,\"y2\":634.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":103.5,\"y\":614.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":76.5,\"y\":-0.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"8143ab23-8ec9-4f7e-9630-15a342e26a14\",\"firstText\":\"Device Admin Uninstall Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Device Admin Uninstall Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":8.0,\"y1\":597.0,\"x2\":199.0,\"y2\":631.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Device Admin Uninstall Test\",\"actionId\":\"a807ff56-8eed-440c-a542-2a8b9dc9db7f\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Device Admin Uninstall Test\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/enable_device_admin_button\",\"actionId\":\"55047c1c-54d3-4cac-99a7-6feb9713b7e1\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/enable_device_admin_button\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to active button\",\"actionId\":\"8c4435cc-20f8-4ad3-aaee-acba7df1e9d1\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.settings:id/action_button\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"cf2d2f1a-de43-4194-8bc2-5b3507a8c53e\",\"displayText\":\"Activate this device admin app\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"41a6b34b-2f3b-4e4b-a653-54b93027335c\",\"displayText\":\"Activate this device admin app\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/action_button\",\"text\":\"Activate this device admin app\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":469.0,\"x2\":197.66666666666666,\"y2\":511.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-17.16666666666667,\"y\":-0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Activate this device admin app\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/restricted_action\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":469.0,\"x2\":197.66666666666666,\"y2\":511.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":116.0,\"y\":490.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-17.16666666666667,\"y\":-0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"41a6b34b-2f3b-4e4b-a653-54b93027335c\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.settings:id/action_button\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":8.0,\"y1\":475.0,\"x2\":224.0,\"y2\":506.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, activate button\",\"actionId\":\"9851f9da-39e4-4ace-98eb-92771d9993e3\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/action_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, id/open_app_details_button\",\"actionId\":\"c57c005f-7f00-4e73-9508-9c5dfea2c72f\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/open_app_details_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, uninstall button\",\"actionId\":\"bcfc37ff-b8a2-4ff4-902b-02abaa0b2cbb\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/button2\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to deactivate and uninstall button\",\"actionId\":\"7896dfe9-22dd-4178-864b-db47abb77999\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"pololee\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"com.android.settings:id/action_button\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"23c3fba7-acd9-48fb-9249-96838c9c46a1\",\"displayText\":\"Deactivate & uninstall\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"a9de4a8d-b7ef-46aa-bc90-0f26c7c5b3be\",\"displayText\":\"Deactivate & uninstall\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.Button\",\"resourceId\":\"com.android.settings:id/action_button\",\"text\":\"Deactivate & uninstall\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":512.0,\"x2\":144.66666666666666,\"y2\":554.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.6666666666666714,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Deactivate & uninstall\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/restricted_action\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":512.0,\"x2\":144.66666666666666,\"y2\":554.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":73.0,\"y\":533.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.6666666666666714,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"a9de4a8d-b7ef-46aa-bc90-0f26c7c5b3be\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"com.android.settings:id/action_button\",\"selectedType\":\"RESOURCE_ID\",\"selectedBound\":{\"x1\":9.0,\"y1\":517.0,\"x2\":137.0,\"y2\":549.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, deactivate and uninstall button\",\"actionId\":\"e53288c2-609e-49d1-908c-1dfa808f2fde\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.settings:id/action_button\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, OK button\",\"actionId\":\"ef677300-4561-4670-aad6-1aab61b49782\",\"actionType\":\"CLICK_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"pololee\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"android:id/button1\"}],\"childrenIdList\":[\"8a4a0b5e-fd80-42ee-a50a-0aaeeb7b87fa\",\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"bd5b3775-00b7-47ea-a9ea-b48b4078ef70\",\"a807ff56-8eed-440c-a542-2a8b9dc9db7f\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"55047c1c-54d3-4cac-99a7-6feb9713b7e1\",\"8c4435cc-20f8-4ad3-aaee-acba7df1e9d1\",\"9851f9da-39e4-4ace-98eb-92771d9993e3\",\"c57c005f-7f00-4e73-9508-9c5dfea2c72f\",\"bcfc37ff-b8a2-4ff4-902b-02abaa0b2cbb\",\"7896dfe9-22dd-4178-864b-db47abb77999\",\"e53288c2-609e-49d1-908c-1dfa808f2fde\",\"ef677300-4561-4670-aad6-1aab61b49782\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"$uicd_CtsEmptyDeviceAdmin_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsEmptyDeviceAdmin.apk\"}}","name":"test_Device Admin Uninstall Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.048000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/efa1531b-c47e-47c6-9d0b-adc244b0a251 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/efa1531b-c47e-47c6-9d0b-adc244b0a251
deleted file mode 100644
index 92cbe9e..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/efa1531b-c47e-47c6-9d0b-adc244b0a251
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"efa1531b-c47e-47c6-9d0b-adc244b0a251","details":"{\"type\":\"CompoundAction\",\"name\":\"Main flow\",\"actionId\":\"efa1531b-c47e-47c6-9d0b-adc244b0a251\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"13c45392-93fc-4bf8-8983-fd7be6dc8af6\",\"a91daeb8-73a8-424c-8e9f-c3c6ddef543c\",\"8d92c21e-306b-4992-822e-10c25a38d781\",\"3d93f0c9-abd2-4d15-92a3-5fc55f696ba9\",\"69b2597b-78ef-450d-975a-d5bef105c512\",\"c42d7405-be13-45c1-bead-84f86ce54262\",\"ed26761a-7dc5-4235-a35f-48025edbd3f3\",\"10a43a2f-1557-43cb-b85f-95ced16d5bb4\",\"7afb9f81-dffa-45af-ad3e-2a3a5b7b4bc8\",\"24e3e587-1271-4917-a395-3feff520ca73\",\"ef1953d2-3590-451b-a0a5-e129f37a328e\",\"06810fdd-824c-400e-bbff-edf98e42d3e8\",\"e056b93a-c19a-4f20-9cd8-640a8523dec4\",\"c60af00e-9503-4c6d-a6f1-410419405024\",\"c21b516b-b794-463c-8bd1-649826d334bb\",\"82a744f4-d253-4c94-aa27-c798b739cfbc\",\"dfed233b-4141-4e7e-a70f-5884c712f689\",\"82f3ce72-96fe-4814-8b68-119a165c3cbf\",\"56cbd2d5-2a74-4b2f-aaf1-d2fe2aa5f479\",\"e2afa6de-5d79-4e1f-ad1a-b6e88e31e5a3\",\"6ab4ade4-e911-49f5-8972-bdc1b31049c5\",\"a3c0955c-29f4-4488-af69-d765f068c4ea\",\"dec009bd-6ca5-4baa-81d1-a00929a711a4\",\"cf14915f-d938-43d7-b09b-40a0a3c80fd8\",\"f22363c9-d58a-4b5b-8f6a-91b236ec8d11\",\"fa3d7096-4016-48dd-94f4-f199e7a2a978\",\"8f00d919-0c82-4e55-8710-3a76734da2b3\",\"40e973e7-1cab-4d00-918a-195bb7aab758\",\"e6aec7f0-e259-4914-9474-2ca7a5e3f45d\",\"935be38e-341a-455b-a52d-709e620f3641\",\"d36bec86-b515-4a70-9f5e-2dfcce3d0306\",\"c0787b92-a6be-4e72-a8b9-7b99d133be03\",\"992e890c-3aa6-43e1-9940-2a9f042811d6\",\"65349586-080c-4006-843f-5d5d8b9e9cd9\",\"c7a524d7-b4b3-4e41-a6ae-2deaa4af43e5\",\"e7c7dfa6-ef14-40bd-8f3d-dc7fac99aefe\",\"b3a44797-fe64-4100-8e0e-9ccbd497c945\",\"44fc4c64-e1d3-4482-8b56-b1c0c547722d\",\"3c16507a-cc79-4124-a23e-b402ec47f45b\",\"24c45902-8535-4376-b06f-88f06b115ca6\",\"a0c5135b-fa0e-4dc2-99be-662638d5c19e\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"# Camera\\n$uicd_camera=Camera,\\n$uicd_camera_take_photo=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_mode=Video,\\n$uicd_camera_video_record=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_video_stop=com.google.android.GoogleCamera:id/shutter_button,\\n$uicd_camera_done=Done,\\n\\n# Device administration\\n$uicd_CtsEmptyDeviceAdmin_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsEmptyDeviceAdmin.apk,\\n\\n# Instant APPs\\n$uicd_instant_app_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsVerifierInstantApp.apk,\\n\\n# Managed provisioning\\n$uicd_DeviceOwner_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsEmptyDeviceOwner.apk,\\n$uicd_permissionapp_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsPermissionApp.apk,\\n$uicd_NotificationBot_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/NotificationBot.apk,\\n$uicd_device_owner_WiFi_configuration_SSID_default=chtn,\\n$uicd_device_owner_WiFi_configuration_SSID=wifitest,\\n$uicd_Gmail_account=playinstallapk01@gmail.com,\\n$uicd_Gmail_account_password=@DoubleCare20,\\n\\n# Notifications\\n$uicd_NotificationBot_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/NotificationBot.apk,\\n$uicd_notification_reply_field=android:id/reply_icon_action,\\n\\n# Other\\n$uicd_recent_task_removal_apk_path=$HOME/Documents/rvc_release/android-cts-verifier/CtsForceStopHelper.apk,\"}}","name":"Main flow","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.066000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f00f3a0d-8419-4e58-a636-d75d84accafb b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f00f3a0d-8419-4e58-a636-d75d84accafb
deleted file mode 100644
index cf88191..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f00f3a0d-8419-4e58-a636-d75d84accafb
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f00f3a0d-8419-4e58-a636-d75d84accafb","details":"{\"type\":\"CompoundAction\",\"name\":\"15-05-Disallow config credentials\",\"actionId\":\"f00f3a0d-8419-4e58-a636-d75d84accafb\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow config credentials\",\"actionId\":\"9d3dc510-b1b9-47f4-98d0-779104009936\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow config credentials\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"97542e37-dde0-484c-bcc7-49a9abdb5889\",\"displayText\":\"Disallow config credentials\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow config credentials\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":253.33333333333334,\"x2\":360.0,\"y2\":297.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":108.0,\"y\":275.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":72.0,\"y\":0.3333333333333144,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"97542e37-dde0-484c-bcc7-49a9abdb5889\",\"firstText\":\"Disallow config credentials\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow config credentials\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":4.0,\"y1\":263.0,\"x2\":212.0,\"y2\":287.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow config credentials\",\"actionId\":\"872646b3-7169-484b-b107-ccc06a0145ec\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow config credentials\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"004a5c66-7254-40fd-909a-b8614a1a1273\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to find Encryption & credentials\",\"actionId\":\"5095b69f-89dd-4f11-b89a-98c84e2d977b\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Encryption & credentials\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"77aa9924-4e3e-4e8a-bdd4-516e77fea936\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"23bd03c4-b956-4b43-b7e8-d9bb6030e2a2\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b8d8a8a8-2ff4-4fdc-b4f9-04397134106e\",\"displayText\":\"Encryption & credentials\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Encryption & credentials\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":626.0,\"x2\":226.66666666666666,\"y2\":645.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.16666666666668561,\"y\":4.8333333333332575,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Encryption & credentials\"},{\"uuid\":\"2475d56f-aec3-4425-b991-6ab3054e8503\",\"displayText\":\"Encrypted\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Encrypted\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":645.6666666666666,\"x2\":124.0,\"y2\":663.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Encrypted\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":611.3333333333334,\"x2\":345.3333333333333,\"y2\":676.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Encryption & credentials\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":611.3333333333334,\"x2\":360.0,\"y2\":676.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":146.5,\"y\":631.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":33.5,\"y\":12.666666666666742,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"b8d8a8a8-2ff4-4fdc-b4f9-04397134106e\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Encryption & credentials\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":64.0,\"y1\":616.0,\"x2\":229.0,\"y2\":646.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Encryption & credentials\",\"actionId\":\"aa5d8ecd-c201-4c94-9b5d-5c82ee7dc457\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Encryption & credentials\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, User credentials\",\"actionId\":\"217e855f-9702-4d83-bcfb-7b9c626a329b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"User credentials\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"9d3dc510-b1b9-47f4-98d0-779104009936\",\"872646b3-7169-484b-b107-ccc06a0145ec\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"004a5c66-7254-40fd-909a-b8614a1a1273\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"5095b69f-89dd-4f11-b89a-98c84e2d977b\",\"aa5d8ecd-c201-4c94-9b5d-5c82ee7dc457\",\"217e855f-9702-4d83-bcfb-7b9c626a329b\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"da770381-d17c-48ca-8aba-def4338ef96b\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-05-Disallow config credentials","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.130000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f22363c9-d58a-4b5b-8f6a-91b236ec8d11 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f22363c9-d58a-4b5b-8f6a-91b236ec8d11
deleted file mode 100644
index f69d8e8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f22363c9-d58a-4b5b-8f6a-91b236ec8d11
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f22363c9-d58a-4b5b-8f6a-91b236ec8d11","details":"{\"type\":\"CompoundAction\",\"name\":\"test_Notification Listener Test\",\"actionId\":\"f22363c9-d58a-4b5b-8f6a-91b236ec8d11\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Notification Listener Test\",\"actionId\":\"9b4402ce-60ed-4448-9a3f-2fa8ff0bdd23\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Notification Listener Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"873ae20b-21ed-44bf-945b-aca6f6c1115a\",\"displayText\":\"Notification Listener Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Notification Listener Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":484.5,\"x2\":351.25,\"y2\":526.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":116.5,\"y\":510.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":63.5,\"y\":-5.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"873ae20b-21ed-44bf-945b-aca6f6c1115a\",\"firstText\":\"Notification Listener Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Notification Listener Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":9.0,\"y1\":498.0,\"x2\":224.0,\"y2\":523.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, Notification Listener Test\",\"actionId\":\"377e39d1-8349-44f8-944d-c189c16cf696\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Notification Listener Test\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 110 secs\",\"actionId\":\"edb17a61-6b02-4f0c-9b88-a8f01b21c570\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":110000,\"createdBy\":\"riacheltseng\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"d1d0d0e3-0325-4ac3-83ab-f2483c8a872f\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, All CTS Verifier notifications\",\"actionId\":\"27e06b61-9f6c-4539-9fc8-dcbd62ccb3c9\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"All CTS Verifier notifications\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"f7068f54-6d2e-4517-a4d7-37a87e1c026f\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 8 secs\",\"actionId\":\"63a70bb0-cce5-480a-9be2-45be19467105\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":8000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, All CTS Verifier notifications\",\"actionId\":\"ff451397-8713-401e-b817-b929416c36b2\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"All CTS Verifier notifications\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"cf19e48c-219e-435d-8514-ad56237d5d29\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 8 secs\",\"actionId\":\"c2079094-0afa-4d14-9677-ef3ee2493d9b\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":8000,\"createdBy\":\"riacheltseng\"},{\"type\":\"ClickAction\",\"name\":\"Click Action,Show notifications\",\"actionId\":\"bb478376-b412-43a9-815f-e3329efd84c3\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Show notifications\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"b2a86040-8e64-49fa-9f14-bce7526a1b6b\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 8 secs\",\"actionId\":\"9e5ff320-3a21-4e06-a117-9a2ca90221ea\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":8000,\"createdBy\":\"riacheltseng\"},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"707087a7-7121-47e1-aaf7-cb099d7b9f42\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, All \\\"ReceiveChannelGroupBlockNoticeTest\\\" notifications\",\"actionId\":\"bccd9eaa-de70-414e-901e-159a40cb25d5\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"All \\\"ReceiveChannelGroupBlockNoticeTest\\\" notifications\"},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"e9b099cb-9904-4ac4-a212-a69a0c78f356\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"WaitAction\",\"name\":\"WAIT 40 secs\",\"actionId\":\"3e436301-fda3-4ff5-b3bd-fe97826310e9\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":40000,\"createdBy\":\"riacheltseng\"},{\"type\":\"WaitAction\",\"name\":\"WAIT 15 secs\",\"actionId\":\"18a81bd9-ea94-45b1-847b-550999eca4ac\",\"actionType\":\"WAIT_ACTION\",\"delayAfterActionMs\":15000,\"createdBy\":\"riacheltseng\"}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"9b4402ce-60ed-4448-9a3f-2fa8ff0bdd23\",\"377e39d1-8349-44f8-944d-c189c16cf696\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"8de23e46-4a22-4d4b-bc72-5588dfe25101\",\"edb17a61-6b02-4f0c-9b88-a8f01b21c570\",\"d1d0d0e3-0325-4ac3-83ab-f2483c8a872f\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"27e06b61-9f6c-4539-9fc8-dcbd62ccb3c9\",\"f7068f54-6d2e-4517-a4d7-37a87e1c026f\",\"63a70bb0-cce5-480a-9be2-45be19467105\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"ff451397-8713-401e-b817-b929416c36b2\",\"cf19e48c-219e-435d-8514-ad56237d5d29\",\"c2079094-0afa-4d14-9677-ef3ee2493d9b\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"bb478376-b412-43a9-815f-e3329efd84c3\",\"b2a86040-8e64-49fa-9f14-bce7526a1b6b\",\"9e5ff320-3a21-4e06-a117-9a2ca90221ea\",\"707087a7-7121-47e1-aaf7-cb099d7b9f42\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"bccd9eaa-de70-414e-901e-159a40cb25d5\",\"e9b099cb-9904-4ac4-a212-a69a0c78f356\",\"3e436301-fda3-4ff5-b3bd-fe97826310e9\",\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"8de23e46-4a22-4d4b-bc72-5588dfe25101\",\"18a81bd9-ea94-45b1-847b-550999eca4ac\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_Notification Listener Test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.237000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f31620ba-a28e-44ed-a592-02cf02b7e2a0 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f31620ba-a28e-44ed-a592-02cf02b7e2a0
deleted file mode 100644
index 1f204a8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f31620ba-a28e-44ed-a592-02cf02b7e2a0
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f31620ba-a28e-44ed-a592-02cf02b7e2a0","details":"{\"type\":\"CompoundAction\",\"name\":\"15-23-Disallow lockscreen unredacted notification\",\"actionId\":\"f31620ba-a28e-44ed-a592-02cf02b7e2a0\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Disallow lockscreen unredacted notification\",\"actionId\":\"21b6aef1-c2dc-4e5c-ba07-2568305f913e\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Disallow lockscreen unredacted notification\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"9e2086af-783e-4257-8361-e704f46b0cba\",\"displayText\":\"Disallow lockscreen unredacted notification\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"Disallow lockscreen unredacted notification\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":317.3333333333333,\"x2\":360.0,\"y2\":361.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":152.0,\"y\":340.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":28.0,\"y\":-0.6666666666666856,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"9e2086af-783e-4257-8361-e704f46b0cba\",\"firstText\":\"Disallow lockscreen unredacted notification\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Disallow lockscreen unredacted notification\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":5.0,\"y1\":322.0,\"x2\":299.0,\"y2\":358.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Disallow lockscreen unredacted notification\",\"actionId\":\"f8c6a354-e3b8-4d7e-9af8-04dd7bb46c1e\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Disallow lockscreen unredacted notification\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Display\",\"actionId\":\"b536fdd6-7401-41b9-89c0-fe8139b3b8c3\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Display\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"1c721d06-49f5-45cd-a601-7f82de9ee2f9\",\"displayText\":\"Display\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"bca3ee7a-6328-495a-9c07-51f95d7fce9b\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"13b3d2ab-996a-48a3-a1be-616e1609aff0\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":426.3333333333333,\"x2\":47.666666666666664,\"y2\":459.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.666666666666666,\"y1\":422.6666666666667,\"x2\":66.0,\"y2\":463.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"fe488c68-4120-4b40-b53d-a3bbd4e4b222\",\"displayText\":\"Display\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"bc3aadb9-dece-4b38-97b3-03c663498cd1\",\"displayText\":\"Display\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Display\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":424.3333333333333,\"x2\":113.33333333333333,\"y2\":444.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-0.8333333333333428,\"y\":1.6666666666666288,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Display\"},{\"uuid\":\"c586eb59-299c-45cc-99b1-716aad7d46a7\",\"displayText\":\"Styles, wallpapers, screen timeout, font size\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Styles, wallpapers, screen timeout, font size\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":444.0,\"x2\":318.0,\"y2\":461.6666666666667},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Styles, wallpapers, screen timeout, font size\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":409.6666666666667,\"x2\":345.3333333333333,\"y2\":476.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"Display\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":409.6666666666667,\"x2\":360.0,\"y2\":476.3333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":90.5,\"y\":432.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":89.5,\"y\":10.5,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"bc3aadb9-dece-4b38-97b3-03c663498cd1\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Display\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":53.0,\"y1\":414.0,\"x2\":128.0,\"y2\":451.0},\"scrollOrientation\":2,\"scrollMaxNumber\":3},{\"type\":\"ClickAction\",\"name\":\"Click Action, Display\",\"actionId\":\"ae854f18-e336-4528-8a28-5ff09ee9fab4\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Display\"},{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to Lock screen\",\"actionId\":\"7f7ffcba-8421-4533-98ad-c9b443b3be88\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Lock screen\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"f100b6c6-13eb-47f4-a2fc-aa703123b058\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"ca609ef5-d367-4b68-808a-8b582b4d9aab\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b7d31630-dea2-474d-87ab-3d8016d7e7b6\",\"displayText\":\"Lock screen\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Lock screen\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":557.3333333333334,\"x2\":146.0,\"y2\":577.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.5,\"y\":3.1666666666667425,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Lock screen\"},{\"uuid\":\"2867647c-f2c0-4f54-b816-709539993011\",\"displayText\":\"Show all notification content\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/summary\",\"text\":\"Show all notification content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":577.0,\"x2\":230.0,\"y2\":594.6666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Show all notification content\"}],\"className\":\"android.widget.RelativeLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":66.0,\"y1\":542.6666666666666,\"x2\":345.3333333333333,\"y2\":609.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"Lock screen\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":542.6666666666666,\"x2\":360.0,\"y2\":609.3333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":112.5,\"y\":564.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":67.5,\"y\":12.0,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"b7d31630-dea2-474d-87ab-3d8016d7e7b6\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Lock screen\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":63.0,\"y1\":554.0,\"x2\":162.0,\"y2\":574.0},\"scrollOrientation\":2,\"scrollMaxNumber\":5},{\"type\":\"ClickAction\",\"name\":\"Click Action, Lock screen\",\"actionId\":\"9056de71-3a39-4fe8-ab4a-9083c41e482a\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Lock screen\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Notifications on lock screen\",\"actionId\":\"c8eb6efb-41bd-4159-98e1-12f5dcb15493\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Notifications on lock screen\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Show all notification content\",\"actionId\":\"c2c0d8c0-6be6-4138-8f62-24eb325cb200\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Show all notification content\"}],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"21b6aef1-c2dc-4e5c-ba07-2568305f913e\",\"f8c6a354-e3b8-4d7e-9af8-04dd7bb46c1e\",\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"be00d800-5235-410e-a535-55a76d9200b9\",\"b536fdd6-7401-41b9-89c0-fe8139b3b8c3\",\"ae854f18-e336-4528-8a28-5ff09ee9fab4\",\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"7f7ffcba-8421-4533-98ad-c9b443b3be88\",\"9056de71-3a39-4fe8-ab4a-9083c41e482a\",\"c8eb6efb-41bd-4159-98e1-12f5dcb15493\",\"c2c0d8c0-6be6-4138-8f62-24eb325cb200\",\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-23-Disallow lockscreen unredacted notification","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.154000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f67dea91-f1e8-4f94-a80f-2374f15cb791 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f67dea91-f1e8-4f94-a80f-2374f15cb791
deleted file mode 100644
index 9028663..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f67dea91-f1e8-4f94-a80f-2374f15cb791
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f67dea91-f1e8-4f94-a80f-2374f15cb791","details":"{\"type\":\"CompoundAction\",\"name\":\"15-12-Disallow install unknown sources\",\"actionId\":\"f67dea91-f1e8-4f94-a80f-2374f15cb791\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[],\"childrenIdList\":[\"44291145-6774-4ba3-9caf-731853cef58e\",\"5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"15-12-Disallow install unknown sources","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.135000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f89554c3-fe5e-4a96-aa56-261a920a689a b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f89554c3-fe5e-4a96-aa56-261a920a689a
deleted file mode 100644
index d777e5a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f89554c3-fe5e-4a96-aa56-261a920a689a
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f89554c3-fe5e-4a96-aa56-261a920a689a","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if Sample Instant App for Testing exists\",\"actionId\":\"f89554c3-fe5e-4a96-aa56-261a920a689a\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Sample Instant App for Testing exists\",\"actionId\":\"f85838de-f882-4371-ad6a-3171e2c43406\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Sample Instant App for Testing\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"8499d36f-64d1-46d0-8acb-8233ad98a4d6\",\"displayText\":\"Sample Instant App for Testing\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7dd2e523-a18d-47d1-8bf5-9fa4de4f8510\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.google.android.apps.nexuslauncher:id/snapshot\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":42.0,\"y1\":73.0,\"x2\":318.0,\"y2\":604.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"},{\"uuid\":\"d5b5bc93-6f5a-4b93-8ae0-06a27b61fad2\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.view.View\",\"resourceId\":\"com.google.android.apps.nexuslauncher:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":159.0,\"y1\":52.0,\"x2\":201.0,\"y2\":94.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"firstText\":\"\"}],\"className\":\"android.widget.FrameLayout\",\"contentDesc\":\"Sample Instant App for Testing\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":42.0,\"y1\":52.0,\"x2\":318.0,\"y2\":604.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":146.0,\"y\":88.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":34.0,\"y\":239.875,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"8499d36f-64d1-46d0-8acb-8233ad98a4d6\",\"firstText\":\"Sample Instant App for Testing\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Sample Instant App for Testing\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":48.0,\"y1\":73.0,\"x2\":244.0,\"y2\":104.0}}],\"childrenIdList\":[\"f85838de-f882-4371-ad6a-3171e2c43406\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if Sample Instant App for Testing exists","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.057000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f94a4fd0-90ed-46b2-bd68-e769b2b4175c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f94a4fd0-90ed-46b2-bd68-e769b2b4175c
deleted file mode 100644
index 6f5f391..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f94a4fd0-90ed-46b2-bd68-e769b2b4175c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f94a4fd0-90ed-46b2-bd68-e769b2b4175c","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Open Application Settings\\\" button\",\"actionId\":\"f94a4fd0-90ed-46b2-bd68-e769b2b4175c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/open_settings\",\"actionId\":\"b0af5a7a-c541-4c72-b9f1-96d5787fca9c\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/open_settings\"}],\"childrenIdList\":[\"b0af5a7a-c541-4c72-b9f1-96d5787fca9c\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Open Application Settings\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.112000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f9a2bad7-a95c-4899-a5a1-c5eb32932abf b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f9a2bad7-a95c-4899-a5a1-c5eb32932abf
deleted file mode 100644
index 7b87088..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f9a2bad7-a95c-4899-a5a1-c5eb32932abf
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f9a2bad7-a95c-4899-a5a1-c5eb32932abf","details":"{\"type\":\"CompoundAction\",\"name\":\"Make sure the work profile location switch on before test\",\"actionId\":\"f9a2bad7-a95c-4899-a5a1-c5eb32932abf\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"pololee\",\"childrenActions\":[{\"type\":\"PythonScriptAction\",\"name\":\"Turn work profile location switch on\",\"actionId\":\"10c5d033-3cba-4952-923e-5345b7bb7d42\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"pololee\",\"script\":\"from python_uiautomator.device import Device\\n\\n\\nd = Device.create_device_by_slot(0)\\n\\nif d.text(\\\"Location for work profile\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").verify_exist():\\n d.text(\\\"Location for work profile\\\").right().resource_id(\\\"android:id/switch_widget\\\").attributes(\\\"checked\\\", \\\"false\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"10c5d033-3cba-4952-923e-5345b7bb7d42\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Make sure the work profile location switch on before test","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.288000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f9ed0da0-0e19-4117-8b66-467e80d9285c b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f9ed0da0-0e19-4117-8b66-467e80d9285c
deleted file mode 100644
index d00c744..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/f9ed0da0-0e19-4117-8b66-467e80d9285c
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f9ed0da0-0e19-4117-8b66-467e80d9285c","details":"{\"type\":\"CompoundAction\",\"name\":\"Verify if set Password screen appear, set password to \\\"a1688\\\"\",\"actionId\":\"f9ed0da0-0e19-4117-8b66-467e80d9285c\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if set Password screen appear\",\"actionId\":\"4ae4e855-d59c-4efa-acdd-8e7090b597af\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"For security, set password\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"b27f6737-1476-4839-8427-0366a01d47ad\",\"displayText\":\"For security, set password\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/sud_layout_description\",\"text\":\"For security, set password\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":172.0,\"x2\":339.0,\"y2\":211.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":186.0,\"y\":176.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.0,\"y\":15.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"b27f6737-1476-4839-8427-0366a01d47ad\",\"firstText\":\"For security, set password\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"For security, set password\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":91.0,\"y1\":160.0,\"x2\":281.0,\"y2\":192.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Next\",\"actionId\":\"c851bc7c-f698-4a13-bdb2-0230e43c82af\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Next\"},{\"type\":\"ClickAction\",\"name\":\"Click Action, Confirm\",\"actionId\":\"2d2cb40e-905a-4e07-a19c-844c9c19a726\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Confirm\"}],\"childrenIdList\":[\"4ae4e855-d59c-4efa-acdd-8e7090b597af\",\"c9423320-3e9d-40ed-8a84-957a48931121\",\"c851bc7c-f698-4a13-bdb2-0230e43c82af\",\"c9423320-3e9d-40ed-8a84-957a48931121\",\"2d2cb40e-905a-4e07-a19c-844c9c19a726\",\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Verify if set Password screen appear, set password to \"a1688\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.268000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fa171789-d776-46b6-ac6f-39961c4c3414 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fa171789-d776-46b6-ac6f-39961c4c3414
deleted file mode 100644
index 9522f61..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fa171789-d776-46b6-ac6f-39961c4c3414
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"fa171789-d776-46b6-ac6f-39961c4c3414","details":"{\"type\":\"CompoundAction\",\"name\":\"Click \\\"Set restriction\\\" button\",\"actionId\":\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Set restriction\",\"actionId\":\"000999c3-2861-4129-8b33-23f0a7a13168\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Set restriction\"}],\"childrenIdList\":[\"000999c3-2861-4129-8b33-23f0a7a13168\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click \"Set restriction\" button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.091000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fa3d7096-4016-48dd-94f4-f199e7a2a978 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fa3d7096-4016-48dd-94f4-f199e7a2a978
deleted file mode 100644
index 3edaec8..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fa3d7096-4016-48dd-94f4-f199e7a2a978
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"fa3d7096-4016-48dd-94f4-f199e7a2a978","details":"{\"type\":\"CompoundAction\",\"name\":\"test_QS Media Controls Test(Check image)\",\"actionId\":\"fa3d7096-4016-48dd-94f4-f199e7a2a978\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScrollScreenContentValidationAction\",\"name\":\"Scroll to QS Media Controls Test\",\"actionId\":\"36e98444-f9b6-4847-9c51-14129f9a879d\",\"actionType\":\"SCROLL_SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"QS Media Controls Test\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"427c0420-515d-427f-a185-784770d67627\",\"displayText\":\"QS Media Controls Test\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/text1\",\"text\":\"QS Media Controls Test\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":8.75,\"y1\":265.75,\"x2\":351.25,\"y2\":307.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":88.5,\"y\":290.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":91.5,\"y\":-3.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"427c0420-515d-427f-a185-784770d67627\",\"firstText\":\"QS Media Controls Test\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"QS Media Controls Test\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":2.0,\"y1\":273.0,\"x2\":175.0,\"y2\":307.0},\"scrollOrientation\":2,\"scrollMaxNumber\":30},{\"type\":\"ClickAction\",\"name\":\"Click Action, QS Media Controls Test\",\"actionId\":\"eccf9bf1-0347-4c8b-ad65-22902e111a79\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"QS Media Controls Test\"},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY the media player contains the strings Song\",\"actionId\":\"81bfd30e-6f7e-4655-8a74-1d22f612c75c\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/header_title\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Song\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY the media player contains the strings Artist\",\"actionId\":\"40795c4f-5c7d-4cf4-9124-5bb1c6d9873b\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/header_artist\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"Artist\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Click Pass button\",\"actionId\":\"52ed673a-8074-494d-8b9c-31c24e199645\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Check that the media player contains the strings Song and Artist.\\\", MatchOption.CONTAINS).down().resource_id(\\\"com.android.cts.verifier:id/iva_action_button_pass\\\").click()\\n\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ScreenCapAction\",\"name\":\"Check that the media player contains a solid yellow image\",\"actionId\":\"b8ac90ea-ff6f-485e-972a-ca6f2b7a2aa6\",\"actionType\":\"SCREEN_CAP_ACTION\",\"createdBy\":\"riacheltseng\"},{\"type\":\"PythonScriptAction\",\"name\":\"Click pass button\",\"actionId\":\"2089c5aa-f57c-45bb-bfec-59d5b36aacb2\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Check that the media player contains a solid yellow image.\\\", MatchOption.CONTAINS).down().resource_id(\\\"com.android.cts.verifier:id/iva_action_button_pass\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY that the media player contains a progress bar showing 6 seconds have elapsed of a one minute long track\",\"actionId\":\"a6e04211-c24d-4393-b5b2-125f33f0af86\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/media_elapsed_time\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"00:06\"}]},\"clickAfterValidation\":false},{\"type\":\"ConditionValidationAction\",\"name\":\"VERIFY that the media player contains a progress bar showing 6 seconds have elapsed of a one minute long track\",\"actionId\":\"7fb4df7e-5ffc-4d6e-9f41-4caf71637e60\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"and\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"com.android.systemui:id/media_total_time\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"01:00\"}]},\"clickAfterValidation\":false},{\"type\":\"PythonScriptAction\",\"name\":\"Click pass button\",\"actionId\":\"8ad38071-95c5-44d1-a54c-a8beab7abc56\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Check that the media player contains a progress bar showing 6 seconds have elapsed \\\", MatchOption.CONTAINS).down().resource_id(\\\"com.android.cts.verifier:id/iva_action_button_pass\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"SwipeAction\",\"name\":\"up\",\"actionId\":\"3bdb642f-e9ea-4396-a432-00c2861477ba\",\"actionType\":\"SWIPE_ACTION\",\"delayAfterActionMs\":2000,\"createdBy\":\"riacheltseng\",\"startX\":180,\"startY\":620,\"endX\":180,\"endY\":320,\"startPointNodeContext\":null,\"endPointNodeContext\":null},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons appear for rewind\",\"actionId\":\"a8caef7d-f176-4064-a58a-c409a814ad71\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"rewind\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"c11b2a36-8ec2-4fb2-b324-e39e3310bb51\",\"displayText\":\"rewind\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action0\",\"contentDesc\":\"rewind\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":61.0,\"y1\":546.75,\"x2\":103.0,\"y2\":588.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":81.5,\"y\":563.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":0.5,\"y\":4.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"c11b2a36-8ec2-4fb2-b324-e39e3310bb51\",\"firstText\":\"rewind\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"rewind\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":66.0,\"y1\":549.0,\"x2\":97.0,\"y2\":578.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons appear for previous track\",\"actionId\":\"fdbe24d4-5cb7-474a-88de-625b7ae1b65e\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"previous track\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"91fa7489-fb5e-4ba4-b54a-1663b0bdd372\",\"displayText\":\"previous track\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action1\",\"contentDesc\":\"previous track\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":110.0,\"y1\":546.75,\"x2\":152.0,\"y2\":588.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":128.5,\"y\":564.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":2.5,\"y\":3.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"91fa7489-fb5e-4ba4-b54a-1663b0bdd372\",\"firstText\":\"previous track\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"previous track\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":117.0,\"y1\":552.0,\"x2\":140.0,\"y2\":576.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons appear for pause\",\"actionId\":\"e8053e0c-f1e6-4452-b0ca-3ffef68a0e25\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"pause\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"0d6c4ca5-5218-4689-9c2d-924fe0bf4d49\",\"displayText\":\"pause\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action2\",\"contentDesc\":\"pause\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":159.0,\"y1\":546.75,\"x2\":201.0,\"y2\":588.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":177.5,\"y\":566.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":2.5,\"y\":1.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"0d6c4ca5-5218-4689-9c2d-924fe0bf4d49\",\"firstText\":\"pause\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"pause\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":158.0,\"y1\":551.0,\"x2\":197.0,\"y2\":581.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons appear for next track\",\"actionId\":\"0c59a0de-6cf5-4bd0-9b80-48a3f0c80a24\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"next track\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ec704c76-9b71-489b-9304-b27310e94a6d\",\"displayText\":\"next track\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action3\",\"contentDesc\":\"next track\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":208.0,\"y1\":546.75,\"x2\":250.0,\"y2\":588.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":224.0,\"y\":561.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":5.0,\"y\":6.25,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"ec704c76-9b71-489b-9304-b27310e94a6d\",\"firstText\":\"next track\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"next track\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":209.0,\"y1\":546.0,\"x2\":239.0,\"y2\":577.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons appear for fast forward\",\"actionId\":\"0794a730-678a-41c7-a9a2-2d5c48457e02\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"fast forward\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a92ac963-f5e8-4336-9fc8-68f51c053c2b\",\"displayText\":\"fast forward\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action4\",\"contentDesc\":\"fast forward\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":257.0,\"y1\":546.75,\"x2\":299.0,\"y2\":588.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":278.0,\"y\":565.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":2.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"a92ac963-f5e8-4336-9fc8-68f51c053c2b\",\"firstText\":\"fast forward\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"fast forward\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":258.0,\"y1\":550.0,\"x2\":298.0,\"y2\":580.0}},{\"type\":\"PythonScriptAction\",\"name\":\"Click pass button\",\"actionId\":\"18570b3c-6c3d-4510-adc2-154ed756a7d7\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Check that icons appear for rewind, previous track, pause, next track and fast forward\\\", MatchOption.CONTAINS).down().resource_id(\\\"com.android.cts.verifier:id/iva_action_button_pass\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ClickAction\",\"name\":\"Click Action, Phone speaker\",\"actionId\":\"59ce4786-baa1-4065-897d-ca7424dd41cf\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.systemui:id/media_seamless_text\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that the Output Switcher opens\",\"actionId\":\"26ca34c0-d23d-46be-87ab-332ad44b6e4d\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Pair new device\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"ac4478cf-2748-45d6-8079-f32ba454b6f1\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"e1c10f20-b870-4793-b697-a42ac846a587\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"60d4a2de-dbeb-471e-ba0b-d17992d92ce3\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"40d3f96a-2b0d-49a1-9cc8-f04f6fcd2ebe\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"cfa01955-de4c-45b2-80a2-d6f3cb81d8f0\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e2390bb7-4249-48b2-9a52-7902775c1d5d\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"037f8327-e0bc-4ff1-b4a5-46ddf98774f0\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"00fba652-f7c1-4ce8-8820-000d04567cf8\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a51043ba-c79e-4344-8632-83e26297dd37\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":12.25,\"y1\":558.75,\"x2\":54.25,\"y2\":600.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":558.75,\"x2\":54.25,\"y2\":600.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"95846cab-ad45-4678-b5f5-74549a06283b\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"95ab5459-e571-45c5-9634-952141f6616f\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Phone speaker\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":560.0,\"x2\":159.75,\"y2\":579.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"},{\"uuid\":\"606c6123-e037-443e-abeb-9bb65fc276f5\",\"displayText\":\"12.0\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.SeekBar\",\"text\":\"12.0\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":583.5,\"x2\":325.0,\"y2\":599.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"12.0\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":553.5,\"x2\":356.5,\"y2\":606.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":606.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/row_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":606.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":606.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"},{\"uuid\":\"cc6fdc8b-0e80-450d-8fe8-63d123ca71ee\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"c0dfd7e6-c6e9-43df-998f-7c687001fc6f\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"7db04c8d-d387-45ef-982d-3029f64d5e5a\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e0c28804-b7b3-4466-8e0f-c8da3e453073\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"85868258-d77b-4ddb-823b-fc37c424ddd6\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":12.25,\"y1\":606.0,\"x2\":54.25,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":606.0,\"x2\":54.25,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"ba9f7668-b99e-46ff-886f-b562edead5f4\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"fa72b7b5-d2be-4148-bc09-7088acf5ae08\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Pair new device\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":617.5,\"x2\":165.5,\"y2\":636.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-6.625,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":606.0,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":606.0,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/row_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":606.0,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":606.0,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"androidx.recyclerview.widget.RecyclerView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"com.android.settings:id/slice_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":116.5,\"y\":626.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":63.5,\"y\":-25.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"fa72b7b5-d2be-4148-bc09-7088acf5ae08\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Pair new device\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":53.0,\"y1\":616.0,\"x2\":180.0,\"y2\":637.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that the Output Switcher opens\",\"actionId\":\"55313067-ca6b-4d77-98c9-6be522c52858\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Phone speaker\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"98a9a357-f358-45b2-aee7-f144f544f328\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"d8e8ae7b-0af2-4610-b1e6-8fbe480dc6f6\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"89645db7-a0fb-4fc3-a8a8-7248a734c7b1\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.view.View\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"4da66d3f-01bf-420c-a00c-ecdba9098df1\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2899b6c4-74b3-4a27-abf4-fcd45dc127cc\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"74d404d1-9994-4b5e-921e-649fc8bb127b\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"17880b52-ddb3-496b-b0cf-a3570b6f855f\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"fb653c28-392b-4dee-86ab-a45d72ea8831\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"e96ca0eb-ef88-440c-9b80-0543371f19af\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":12.25,\"y1\":558.75,\"x2\":54.25,\"y2\":600.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":558.75,\"x2\":54.25,\"y2\":600.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"f0150c84-f36b-4b1a-b0ab-514ab7a5e157\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b583e21a-5161-4c94-96d8-4521f2c665fc\",\"displayText\":\"Phone speaker\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Phone speaker\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":560.0,\"x2\":159.75,\"y2\":579.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-10.0,\"y\":0.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"},{\"uuid\":\"e1f9c34f-debb-4900-b701-9123a3d374b7\",\"displayText\":\"12.0\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.SeekBar\",\"text\":\"12.0\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":583.5,\"x2\":325.0,\"y2\":599.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"12.0\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":553.5,\"x2\":356.5,\"y2\":606.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":606.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/row_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":606.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":606.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"},{\"uuid\":\"d6fafe11-3307-40df-af55-5113a08a6c45\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"da0f5fa4-74d0-4900-a949-174bff063fa0\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"2ea42556-e107-4a23-bd70-3fe6edeb8825\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"49fe928d-fbda-4738-b76f-a351dba8b419\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"a0c153ee-ae8e-4ab9-b599-15d3f9cd228c\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":12.25,\"y1\":606.0,\"x2\":54.25,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":606.0,\"x2\":54.25,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"\"},{\"uuid\":\"47f8ba42-ef2b-449f-bfae-d4d0c3fb010c\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b59a128b-576f-49ab-baf4-2b6e07df337f\",\"displayText\":\"Pair new device\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"Pair new device\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":617.5,\"x2\":165.5,\"y2\":636.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"android:id/content\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":54.25,\"y1\":606.0,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":606.0,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/row_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":606.0,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":606.0,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Pair new device\"}],\"className\":\"androidx.recyclerview.widget.RecyclerView\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.widget.FrameLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"firstText\":\"Phone speaker\"}],\"className\":\"android.view.ViewGroup\",\"resourceId\":\"com.android.settings:id/slice_view\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":3.5,\"y1\":553.5,\"x2\":356.5,\"y2\":648.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":117.0,\"y\":569.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":63.0,\"y\":31.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":0,\"leafNodeContext\":\"b583e21a-5161-4c94-96d8-4521f2c665fc\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Phone speaker\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":62.0,\"y1\":559.0,\"x2\":172.0,\"y2\":579.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"4d3a83fc-8509-4395-be05-46877cee6cdf\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true},{\"type\":\"PythonScriptAction\",\"name\":\"Click pass button\",\"actionId\":\"a5fe19c7-cf7b-4142-8c8d-45b785c04215\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Check that the Output Switcher opens.\\\", MatchOption.CONTAINS).down().resource_id(\\\"com.android.cts.verifier:id/iva_action_button_pass\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons appear for previous track\",\"actionId\":\"ce0773ff-46ce-459b-b9b4-e82c9f7334ee\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"previous track\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"d01fea46-c99e-4474-8d06-58230f249e6e\",\"displayText\":\"previous track\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action1\",\"contentDesc\":\"previous track\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":199.0,\"y1\":189.25,\"x2\":241.0,\"y2\":231.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":216.0,\"y\":208.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":4.0,\"y\":1.75,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"d01fea46-c99e-4474-8d06-58230f249e6e\",\"firstText\":\"previous track\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"previous track\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":199.0,\"y1\":189.0,\"x2\":233.0,\"y2\":228.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons appear for pause\",\"actionId\":\"a177adce-6a0d-4835-93b0-15ed9a362315\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"pause\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"a9916e01-635e-42b4-b530-b6a75405e07c\",\"displayText\":\"pause\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action2\",\"contentDesc\":\"pause\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":248.0,\"y1\":189.25,\"x2\":290.0,\"y2\":231.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":271.0,\"y\":206.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-2.0,\"y\":3.75,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"a9916e01-635e-42b4-b530-b6a75405e07c\",\"firstText\":\"pause\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"pause\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":258.0,\"y1\":192.0,\"x2\":284.0,\"y2\":221.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons appear for next track\",\"actionId\":\"ea22734e-7d89-4609-a998-e097a2f5fd02\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"next track\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"e0f5d0d3-ff9d-4c42-95d2-abdb6b425633\",\"displayText\":\"next track\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action3\",\"contentDesc\":\"next track\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":297.0,\"y1\":189.25,\"x2\":339.0,\"y2\":231.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":315.5,\"y\":211.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":2.5,\"y\":-1.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"e0f5d0d3-ff9d-4c42-95d2-abdb6b425633\",\"firstText\":\"next track\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"next track\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":299.0,\"y1\":203.0,\"x2\":332.0,\"y2\":220.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons don't appear rewind\",\"actionId\":\"90ac64fe-8ec4-46a2-a772-994068f210f7\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"rewind\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"850ba66b-01d4-4c74-83e1-9973a61116e6\",\"displayText\":\"rewind\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action0\",\"contentDesc\":\"rewind\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":61.0,\"y1\":546.75,\"x2\":103.0,\"y2\":588.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":78.5,\"y\":568.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":3.5,\"y\":-0.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"850ba66b-01d4-4c74-83e1-9973a61116e6\",\"firstText\":\"rewind\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"rewind\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":63.0,\"y1\":554.0,\"x2\":94.0,\"y2\":582.0}},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify that icons don''t appear for fast forward\",\"actionId\":\"b648618c-448d-4682-8349-fa3fed1978b0\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"fast forward\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"4fcb9bd9-3e63-4343-b297-a27bf019469f\",\"displayText\":\"fast forward\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageButton\",\"resourceId\":\"com.android.systemui:id/action4\",\"contentDesc\":\"fast forward\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":true,\"enabled\":false,\"bounds\":{\"x1\":257.0,\"y1\":546.75,\"x2\":299.0,\"y2\":588.75},\"clickedPos\":{\"confidentLevel\":2,\"x\":273.5,\"y\":568.0,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":4.5,\"y\":-0.25,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":1,\"leafNodeContext\":\"4fcb9bd9-3e63-4343-b297-a27bf019469f\",\"firstText\":\"fast forward\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"fast forward\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":257.0,\"y1\":555.0,\"x2\":290.0,\"y2\":581.0}},{\"type\":\"PythonScriptAction\",\"name\":\"Click pass button\",\"actionId\":\"0c67be6e-1981-42fe-93f1-f89f2e9b4e78\",\"actionType\":\"PYTHON_SCRIPT_ACTION\",\"createdBy\":\"riacheltseng\",\"script\":\"from python_uiautomator.device import Device\\nfrom python_uiautomator.constant import MatchOption\\n\\nd= Device.create_device_by_slot(0)\\nd.text(\\\"Check that icons appear for only previous track, pause and next track.\\\", MatchOption.CONTAINS).down().resource_id(\\\"com.android.cts.verifier:id/iva_action_button_pass\\\").click()\",\"expectedReturnCode\":\"0\",\"isPathProvided\":false,\"path\":null}],\"childrenIdList\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"36e98444-f9b6-4847-9c51-14129f9a879d\",\"eccf9bf1-0347-4c8b-ad65-22902e111a79\",\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"81bfd30e-6f7e-4655-8a74-1d22f612c75c\",\"40795c4f-5c7d-4cf4-9124-5bb1c6d9873b\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"52ed673a-8074-494d-8b9c-31c24e199645\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"b8ac90ea-ff6f-485e-972a-ca6f2b7a2aa6\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"2089c5aa-f57c-45bb-bfec-59d5b36aacb2\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"a6e04211-c24d-4393-b5b2-125f33f0af86\",\"7fb4df7e-5ffc-4d6e-9f41-4caf71637e60\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"8ad38071-95c5-44d1-a54c-a8beab7abc56\",\"3bdb642f-e9ea-4396-a432-00c2861477ba\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"a8caef7d-f176-4064-a58a-c409a814ad71\",\"fdbe24d4-5cb7-474a-88de-625b7ae1b65e\",\"e8053e0c-f1e6-4452-b0ca-3ffef68a0e25\",\"0c59a0de-6cf5-4bd0-9b80-48a3f0c80a24\",\"0794a730-678a-41c7-a9a2-2d5c48457e02\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"18570b3c-6c3d-4510-adc2-154ed756a7d7\",\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"59ce4786-baa1-4065-897d-ca7424dd41cf\",\"26ca34c0-d23d-46be-87ab-332ad44b6e4d\",\"55313067-ca6b-4d77-98c9-6be522c52858\",\"4d3a83fc-8509-4395-be05-46877cee6cdf\",\"a5fe19c7-cf7b-4142-8c8d-45b785c04215\",\"15c75efc-b173-4eed-9a2c-164886355c98\",\"ce0773ff-46ce-459b-b9b4-e82c9f7334ee\",\"a177adce-6a0d-4835-93b0-15ed9a362315\",\"ea22734e-7d89-4609-a998-e097a2f5fd02\",\"90ac64fe-8ec4-46a2-a772-994068f210f7\",\"b648618c-448d-4682-8349-fa3fed1978b0\",\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"0c67be6e-1981-42fe-93f1-f89f2e9b4e78\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"test_QS Media Controls Test(Check image)","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.238000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fb524e6c-60b2-4211-b7e4-37f76f26a3ef b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fb524e6c-60b2-4211-b7e4-37f76f26a3ef
deleted file mode 100644
index dc4211b..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fb524e6c-60b2-4211-b7e4-37f76f26a3ef
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"fb524e6c-60b2-4211-b7e4-37f76f26a3ef","details":"{\"type\":\"CompoundAction\",\"name\":\"04-Add account disclosure\",\"actionId\":\"fb524e6c-60b2-4211-b7e4-37f76f26a3ef\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, Add account disclosure\",\"actionId\":\"89eddd9a-4f58-4124-bce8-40aa061572c7\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"TEXT_EQUALS\",\"selector\":\"Add account disclosure\"},{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify you are not told that the device is managed\",\"actionId\":\"b3d74c88-dee2-4eeb-a0a7-822836071871\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"CONTAINS\",\"patternValue\":\"This device is managed by your organization. Learn more\"},\"stopWhenFalse\":false,\"stopType\":\"STOP_TEST_IF_TRUE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"6cae0685-ef34-402f-8bef-53fa156a2b72\",\"displayText\":\"This device is managed by your organization. Learn more\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"b053a04d-d2b4-4f31-8a02-5860351f02e9\",\"isUniqueResourceId\":false,\"children\":[{\"uuid\":\"5f3509e0-2248-4b20-8067-07d760f24329\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"android:id/icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":369.5,\"x2\":35.0,\"y2\":390.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/icon_frame\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":14.0,\"y1\":355.5,\"x2\":63.0,\"y2\":394.0},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"\"},{\"uuid\":\"79a49fb3-447b-476f-9724-056cffe6d2d2\",\"displayText\":\"This device is managed by your organization. Learn more\",\"isUniqueResourceId\":false,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"android:id/title\",\"text\":\"This device is managed by your organization. Learn more\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":63.0,\"y1\":355.5,\"x2\":346.0,\"y2\":414.25},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":24.5,\"y\":9.375,\"isPhysicalPos\":false,\"validPos\":true},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"firstText\":\"This device is managed by your organization. Learn more\"}],\"className\":\"android.widget.LinearLayout\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":355.5,\"x2\":360.0,\"y2\":418.5},\"clickedPos\":{\"confidentLevel\":2,\"x\":180.0,\"y\":375.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":11.5,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":2,\"leafNodeContext\":\"79a49fb3-447b-476f-9724-056cffe6d2d2\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"This device is managed by your organization. Learn more\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":54.0,\"y1\":365.0,\"x2\":306.0,\"y2\":386.0}},{\"type\":\"InputAction\",\"name\":\"Back Button\",\"actionId\":\"09b1de0a-7d9c-4905-859c-57cf5092ce88\",\"actionType\":\"INPUT_ACTION\",\"createdBy\":\"riacheltseng\",\"keyCode\":4,\"inputString\":null,\"isSingleChar\":true}],\"childrenIdList\":[\"7f12c16f-51be-4732-bf1b-ef4b55841a99\",\"89eddd9a-4f58-4124-bce8-40aa061572c7\",\"608f1c50-237e-4f5d-94c6-0bbbcba87332\",\"b3d74c88-dee2-4eeb-a0a7-822836071871\",\"09b1de0a-7d9c-4905-859c-57cf5092ce88\",\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"04-Add account disclosure","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.222000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fdcaf63b-bd85-431d-a212-51c1af4d3204 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fdcaf63b-bd85-431d-a212-51c1af4d3204
deleted file mode 100644
index b3827d0..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fdcaf63b-bd85-431d-a212-51c1af4d3204
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"fdcaf63b-bd85-431d-a212-51c1af4d3204","details":"{\"type\":\"CompoundAction\",\"name\":\"Click Next button\",\"actionId\":\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ClickAction\",\"name\":\"Click Action, id/action_next\",\"actionId\":\"317f92ac-22e2-4b9b-b270-712fec8310e8\",\"actionType\":\"CLICK_ACTION\",\"deviceIndex\":1,\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.android.cts.verifier:id/action_next\"}],\"childrenIdList\":[\"317f92ac-22e2-4b9b-b270-712fec8310e8\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Click Next button","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.259000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fde8df69-89b4-42eb-8f6a-d67be2ca8770 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fde8df69-89b4-42eb-8f6a-d67be2ca8770
deleted file mode 100644
index 58cc823..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/fde8df69-89b4-42eb-8f6a-d67be2ca8770
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"fde8df69-89b4-42eb-8f6a-d67be2ca8770","details":"{\"type\":\"CompoundAction\",\"name\":\"Start recording\",\"actionId\":\"fde8df69-89b4-42eb-8f6a-d67be2ca8770\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ConditionValidationAction\",\"name\":\"Start recording\",\"actionId\":\"6e1f87ae-1227-4208-a5aa-9e5d7f839d06\",\"actionType\":\"CONDITION_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_TEST_IF_FALSE\",\"query\":{\"condition\":\"or\",\"rules\":[{\"field\":\"resourceId\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_record\"},{\"field\":\"text\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_record\"},{\"field\":\"contentDesc\",\"operator\":\"=\",\"value\":\"$uicd_camera_video_record\"}]},\"clickAfterValidation\":true}],\"childrenIdList\":[\"6e1f87ae-1227-4208-a5aa-9e5d7f839d06\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Start recording","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.005000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ffe766f2-11f5-449d-9b89-e5ff06f5a835 b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ffe766f2-11f5-449d-9b89-e5ff06f5a835
deleted file mode 100644
index ab4f48a..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases/ffe766f2-11f5-449d-9b89-e5ff06f5a835
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ffe766f2-11f5-449d-9b89-e5ff06f5a835","details":"{\"type\":\"CompoundAction\",\"name\":\"Confirm PIN lock \\\"14725836\\\"\",\"actionId\":\"ffe766f2-11f5-449d-9b89-e5ff06f5a835\",\"actionType\":\"COMPOUND_ACTION\",\"createdBy\":\"riacheltseng\",\"childrenActions\":[{\"type\":\"ScreenContentValidationAction\",\"name\":\"Verify if Re-enter your PIN screen appear\",\"actionId\":\"79864d94-6d67-45e9-9da5-85a175acde95\",\"actionType\":\"SCREEN_CONTENT_VALIDATION_ACTION\",\"createdBy\":\"riacheltseng\",\"textValidator\":{\"contentMatchType\":\"EQUALS\",\"patternValue\":\"Re-enter your PIN\"},\"stopWhenFalse\":true,\"stopType\":\"STOP_CURRENT_COMPOUND_IF_FALSE\",\"isOcrMode\":false,\"savedNodeContext\":{\"uuid\":\"78b47be2-089e-44bf-a95f-499ee567885a\",\"displayText\":\"Re-enter your PIN\",\"isUniqueResourceId\":true,\"children\":[{\"uuid\":\"8ff28a5b-1cbb-45bb-9a40-aa998d0a58e1\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.ImageView\",\"resourceId\":\"com.android.settings:id/sud_layout_icon\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":166.0,\"y1\":97.33333333333333,\"x2\":194.0,\"y2\":125.33333333333333},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":4,\"firstText\":\"\"},{\"uuid\":\"b153876f-78a9-4f3d-b78c-eb1d763bebb5\",\"displayText\":\"Re-enter your PIN\",\"isUniqueResourceId\":true,\"children\":[],\"className\":\"android.widget.TextView\",\"resourceId\":\"com.android.settings:id/suc_layout_title\",\"text\":\"Re-enter your PIN\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":21.0,\"y1\":139.33333333333334,\"x2\":339.0,\"y2\":167.66666666666666},\"clickedPos\":{\"confidentLevel\":2,\"x\":0.0,\"y\":0.0,\"isPhysicalPos\":false,\"validPos\":false},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.5,\"y\":-1.0,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":4,\"firstText\":\"Re-enter your PIN\"}],\"className\":\"android.widget.LinearLayout\",\"resourceId\":\"com.android.settings:id/sud_layout_header\",\"checked\":false,\"isCheckableNode\":true,\"isClickableNode\":false,\"enabled\":true,\"bounds\":{\"x1\":0.0,\"y1\":48.333333333333336,\"x2\":360.0,\"y2\":169.33333333333334},\"clickedPos\":{\"confidentLevel\":2,\"x\":184.5,\"y\":154.5,\"isPhysicalPos\":false,\"validPos\":true},\"relativePos\":{\"confidentLevel\":2,\"x\":-4.5,\"y\":-45.66666666666666,\"isPhysicalPos\":false,\"validPos\":false},\"isRawXYPosition\":false,\"isClickedCurrentNode\":false,\"xmlLayerIndex\":4,\"leafNodeContext\":\"b153876f-78a9-4f3d-b78c-eb1d763bebb5\",\"firstText\":\"\"},\"contextStorageType\":\"TEXT_BASED\",\"screenContentSearchType\":\"FULLSCREEN\",\"selectedText\":\"Re-enter your PIN\",\"selectedType\":\"DISPLAY_TEXT\",\"selectedBound\":{\"x1\":84.0,\"y1\":140.0,\"x2\":285.0,\"y2\":169.0}},{\"type\":\"ClickAction\",\"name\":\"Click Action, Enter key\",\"actionId\":\"0d96dc56-3ede-458c-be62-2eb1f6a19a5b\",\"actionType\":\"CLICK_ACTION\",\"createdBy\":\"riacheltseng\",\"nodeContext\":null,\"isRawXY\":false,\"isDoubleClick\":false,\"failTestIfNotFound\":true,\"isByElement\":true,\"isOcrMode\":false,\"strategy\":\"RESOURCEID\",\"selector\":\"com.google.android.inputmethod.latin:id/key_pos_ime_action\"}],\"childrenIdList\":[\"79864d94-6d67-45e9-9da5-85a175acde95\",\"af677fa8-0e4c-4c4e-9159-f91129b44e83\",\"0d96dc56-3ede-458c-be62-2eb1f6a19a5b\"],\"repeatTime\":1,\"failAtTheEnd\":false,\"forceDeviceOnChildren\":false,\"runAlwaysRecursive\":false,\"additionalData\":{\"version\":\"1\",\"globalVariableStr\":\"\"}}","name":"Confirm PIN lock \"14725836\"","type":"CompoundAction","tag":"","description":"","created_by":"riacheltseng","created_at":1607325439.265000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases_tree/63104176-2f2c-4ad5-8af9-db1c78ae7a9e b/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases_tree/63104176-2f2c-4ad5-8af9-db1c78ae7a9e
deleted file mode 100644
index 3b30aef..0000000
--- a/tools/cts-verifier-automation/CTS-V_automation_11_r1_v1/testcases_tree/63104176-2f2c-4ad5-8af9-db1c78ae7a9e
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"63104176-2f2c-4ad5-8af9-db1c78ae7a9e","user_id":"","project_id":"37a24f51-c935-40ba-904e-4929ace49644","group_id":"","tree_details":"{\"id\":\"#\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CTS-V\",\"id\":\"1\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Audio\",\"id\":\"DA27BDD0-0F33-4392-A111-F83CA91AE550\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"77FF44E3-3BB5-494A-BF92-4B5FC6953030\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click I'm done\",\"id\":\"2abe83e3-a05c-4599-9007-3efbabf97020\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2abe83e3-a05c-4599-9007-3efbabf97020\"]},{\"value\":\"Turn off Do not disturb on quick setting\",\"id\":\"0c8249de-dac1-4b3c-852d-cfc4fbbfefbb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0c8249de-dac1-4b3c-852d-cfc4fbbfefbb\"]},{\"value\":\"Turn on Do not Disturb on quick setting\",\"id\":\"c6612b18-5a86-4e82-b7fe-7487ddc09db1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c6612b18-5a86-4e82-b7fe-7487ddc09db1\"]}]},{\"value\":\"test_Ringer Mode Tests\",\"id\":\"13c45392-93fc-4bf8-8983-fd7be6dc8af6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"13c45392-93fc-4bf8-8983-fd7be6dc8af6\"]}]},{\"value\":\"Camera\",\"id\":\"E3ECC07D-A462-4A52-B41D-B367ABE53B7A\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"5F798FA5-FC2F-4345-B5A6-992843727318\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Camera Intents\",\"id\":\"A4F6CC7E-D042-48B7-86EC-4980FDDD03CC\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click Start Test button\",\"id\":\"740de7a4-51a7-411c-bf5f-424945116764\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"740de7a4-51a7-411c-bf5f-424945116764\"]},{\"value\":\"Open Camera\",\"id\":\"b40e7a89-24b7-4cf7-8942-4733b0536edc\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b40e7a89-24b7-4cf7-8942-4733b0536edc\"]},{\"value\":\"Open location permission of CTS-V\",\"id\":\"852558c2-18ad-4540-bab9-6f2da206f8cb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"852558c2-18ad-4540-bab9-6f2da206f8cb\"]},{\"value\":\"Start recording\",\"id\":\"fde8df69-89b4-42eb-8f6a-d67be2ca8770\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"fde8df69-89b4-42eb-8f6a-d67be2ca8770\"]},{\"value\":\"Stop recording\",\"id\":\"3815d172-f8cb-41b5-9bb3-5b3694bebd96\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3815d172-f8cb-41b5-9bb3-5b3694bebd96\"]},{\"value\":\"Sub-cases\",\"id\":\"87B3A9F7-E4C9-43BF-BDC0-56E90A95DAA0\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Camera Intents-Test 1\",\"id\":\"339f5cb7-0ae4-4405-bd6b-ebf91aa53125\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"339f5cb7-0ae4-4405-bd6b-ebf91aa53125\"]},{\"value\":\"Camera Intents-Test 2\",\"id\":\"26e141bc-1cb7-4228-865c-40de24919e2d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"26e141bc-1cb7-4228-865c-40de24919e2d\"]},{\"value\":\"Camera Intents-Test 3 and 4\",\"id\":\"29474691-30f5-4d1c-a1ac-afe0beb0e971\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"29474691-30f5-4d1c-a1ac-afe0beb0e971\"]},{\"value\":\"Camera Intents-Test 5\",\"id\":\"1c5b786d-f4e0-44ea-8833-ab551a67815c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1c5b786d-f4e0-44ea-8833-ab551a67815c\"]}]},{\"value\":\"Take photo\",\"id\":\"b1c2250d-2c83-4698-8e4f-e80b296153d9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b1c2250d-2c83-4698-8e4f-e80b296153d9\"]}]},{\"value\":\"Camera Orientation\",\"id\":\"71EE444F-6C00-4EBE-904B-86F3B60BE2A6\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click \\\"Take Photo\\\" button\",\"id\":\"afa8e79c-e104-4611-830d-f7aac106a6a6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"afa8e79c-e104-4611-830d-f7aac106a6a6\"]}]},{\"value\":\"Camera Performance\",\"id\":\"41BC0D73-3277-440D-A39E-30F2AE72EB37\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"If Test result alert screen pop up, dismiss it.\",\"id\":\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"15bf913f-b3ab-4580-aaea-4a8bb50191b1\"]}]}]},{\"value\":\"test_Camera Formats\",\"id\":\"8dd0e093-a239-45e8-ae92-b8ac6e3ad4b7\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8dd0e093-a239-45e8-ae92-b8ac6e3ad4b7\"]},{\"value\":\"test_Camera Intents\",\"id\":\"a91daeb8-73a8-424c-8e9f-c3c6ddef543c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a91daeb8-73a8-424c-8e9f-c3c6ddef543c\"]},{\"value\":\"test_Camera Orientation(Check image)\",\"id\":\"8d92c21e-306b-4992-822e-10c25a38d781\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8d92c21e-306b-4992-822e-10c25a38d781\"]},{\"value\":\"test_Camera Performance\",\"id\":\"3d93f0c9-abd2-4d15-92a3-5fc55f696ba9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3d93f0c9-abd2-4d15-92a3-5fc55f696ba9\"]}]},{\"value\":\"Car\",\"id\":\"9C6325A7-F116-4853-AE26-AB4C22E8054C\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"test_Car Dock Test\",\"id\":\"69b2597b-78ef-450d-975a-d5bef105c512\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"69b2597b-78ef-450d-975a-d5bef105c512\"]}]},{\"value\":\"Clock\",\"id\":\"710A9895-E03E-4496-A57F-F2F946AD5A25\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"11FEA4B2-3E36-45F8-92C3-B7E70D3D634A\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Delete the alarm\",\"id\":\"61f8f3bd-bae5-4a38-949c-f759cda9375e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"61f8f3bd-bae5-4a38-949c-f759cda9375e\"]},{\"value\":\"Open Alarms and Timers Tests \",\"id\":\"3832f622-3408-4968-9429-c0c9e11905d5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3832f622-3408-4968-9429-c0c9e11905d5\"]}]},{\"value\":\"test_Alarms and Timers Tests-Full Alarm Test\",\"id\":\"c42d7405-be13-45c1-bead-84f86ce54262\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c42d7405-be13-45c1-bead-84f86ce54262\"]},{\"value\":\"test_Alarms and Timers Tests-Set Alarm Test\",\"id\":\"ed26761a-7dc5-4235-a35f-48025edbd3f3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ed26761a-7dc5-4235-a35f-48025edbd3f3\"]},{\"value\":\"test_Alarms and Timers Tests-Set Timer Test\",\"id\":\"10a43a2f-1557-43cb-b85f-95ced16d5bb4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"10a43a2f-1557-43cb-b85f-95ced16d5bb4\"]},{\"value\":\"test_Alarms and Timers Tests-Show Alarms Test\",\"id\":\"7afb9f81-dffa-45af-ad3e-2a3a5b7b4bc8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7afb9f81-dffa-45af-ad3e-2a3a5b7b4bc8\"]}]},{\"value\":\"Device Administration\",\"id\":\"BC7AC88A-290B-4DB0-ACE3-352EC4DBFE4E\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Screen Lock Test\",\"id\":\"EDD03C7C-D9EE-40DF-AE33-FA7D6C782801\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Confirm PIN or Password lock \\\"1234\\\"\",\"id\":\"bb6f039b-70ef-41a6-9880-20e383ba74d5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bb6f039b-70ef-41a6-9880-20e383ba74d5\"]},{\"value\":\"Confirm Pattern lock\",\"id\":\"3efd7d24-773f-4254-9432-207fa91ad20f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3efd7d24-773f-4254-9432-207fa91ad20f\"]},{\"value\":\"Draw pattern lock\",\"id\":\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7be12173-7685-4bcd-bb2e-acdfbbe394a1\"]},{\"value\":\"Enter PIN or Password \\\"1234\\\"\",\"id\":\"d348b7ed-2aae-47cb-b900-44247d03c629\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d348b7ed-2aae-47cb-b900-44247d03c629\"]},{\"value\":\"Set \\\"PIN\\\" lock to \\\"1234\\\"\",\"id\":\"49bfb869-2ef5-4df6-8fff-3192112b82a2\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"49bfb869-2ef5-4df6-8fff-3192112b82a2\"]},{\"value\":\"Set Password lock to \\\"1234\\\"\",\"id\":\"e1d66f34-6024-4d89-b511-399897ba2464\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e1d66f34-6024-4d89-b511-399897ba2464\"]},{\"value\":\"Set Pattern lock\",\"id\":\"cf6c2d6d-a4fe-4981-af4b-f561291f847b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"cf6c2d6d-a4fe-4981-af4b-f561291f847b\"]},{\"value\":\"Set screen lock to \\\"None\\\"\",\"id\":\"72f62d5f-9a3a-4c4d-813c-96614b1c5845\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"72f62d5f-9a3a-4c4d-813c-96614b1c5845\"]},{\"value\":\"Set screen lock to \\\"Swipe\\\"\",\"id\":\"1e49e89c-6a23-487a-86d9-a2244d725017\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1e49e89c-6a23-487a-86d9-a2244d725017\"]}]},{\"value\":\"test_Device Admin Tapjacking Test\",\"id\":\"24e3e587-1271-4917-a395-3feff520ca73\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"24e3e587-1271-4917-a395-3feff520ca73\"]},{\"value\":\"test_Device Admin Uninstall Test\",\"id\":\"ef1953d2-3590-451b-a0a5-e129f37a328e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ef1953d2-3590-451b-a0a5-e129f37a328e\"]},{\"value\":\"test_Policy Serialization Test\",\"id\":\"06810fdd-824c-400e-bbff-edf98e42d3e8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"06810fdd-824c-400e-bbff-edf98e42d3e8\"]},{\"value\":\"test_Screen Lock Test\",\"id\":\"e056b93a-c19a-4f20-9cd8-640a8523dec4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e056b93a-c19a-4f20-9cd8-640a8523dec4\"]}]},{\"value\":\"Instant Apps\",\"id\":\"046B5069-964F-46DC-B884-86017EAA21CE\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"12F1DCE2-4FAC-4691-A55F-5E5B293989A6\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click Start Test button\",\"id\":\"7ccaea57-2cd8-466d-b5fa-abbfb89831b3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7ccaea57-2cd8-466d-b5fa-abbfb89831b3\"]},{\"value\":\"Install Instant App\",\"id\":\"b53eeaf5-391f-4964-84fa-d086c2b938e1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b53eeaf5-391f-4964-84fa-d086c2b938e1\"]},{\"value\":\"Verify if Sample Instant App for Testing exists\",\"id\":\"f89554c3-fe5e-4a96-aa56-261a920a689a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"f89554c3-fe5e-4a96-aa56-261a920a689a\"]}]},{\"value\":\"test_Instant Apps Notification Test\",\"id\":\"c60af00e-9503-4c6d-a6f1-410419405024\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c60af00e-9503-4c6d-a6f1-410419405024\"]},{\"value\":\"test_Instant Apps Recents Test(Check image)\",\"id\":\"c21b516b-b794-463c-8bd1-649826d334bb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c21b516b-b794-463c-8bd1-649826d334bb\"]},{\"value\":\"test_View/Delete Instant Apps Test\",\"id\":\"82a744f4-d253-4c94-aa27-c798b739cfbc\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"82a744f4-d253-4c94-aa27-c798b739cfbc\"]}]},{\"value\":\"Main flow\",\"id\":\"efa1531b-c47e-47c6-9d0b-adc244b0a251\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"efa1531b-c47e-47c6-9d0b-adc244b0a251\"]},{\"value\":\"Managed Provisioning\",\"id\":\"7FCECBB4-E7F4-44C1-81FC-CA7CEB894CDD\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"6400C53C-6174-43FD-A7AD-5FE260F1EF88\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"BYOD Managed Provisioning\",\"id\":\"914A5FF9-405D-45EA-8DFD-57E48265A006\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"11_Profile-aware location settings\",\"id\":\"53A90239-1420-4EBC-A32D-C04DA55D071C\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Assert the main location go into 'off' state\",\"id\":\"a5cd361e-a0c1-493b-9029-bc0855d3503c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a5cd361e-a0c1-493b-9029-bc0855d3503c\"]},{\"value\":\"Assert the main location go into 'on' state\",\"id\":\"bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bb60c1a1-ad06-43a9-b25c-a447f7bd0ad3\"]},{\"value\":\"Assert the work profile location go disabled and into 'off' state\",\"id\":\"5caa8a3a-bdb2-4642-87b7-b5d5f855b32b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5caa8a3a-bdb2-4642-87b7-b5d5f855b32b\"]},{\"value\":\"Assert the work profile location go enabled and into its previous state off\",\"id\":\"46149c51-f989-4ff1-98c5-18a09bcb4fa5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"46149c51-f989-4ff1-98c5-18a09bcb4fa5\"]},{\"value\":\"Assert the work profile location go enabled and into its previous state on\",\"id\":\"73572186-21d3-4f07-9b89-dd5f35a0a943\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"73572186-21d3-4f07-9b89-dd5f35a0a943\"]},{\"value\":\"Make sure the main location switch on before test\",\"id\":\"8d1d94a2-d11b-4f87-a55a-3d13bc488360\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8d1d94a2-d11b-4f87-a55a-3d13bc488360\"]},{\"value\":\"Make sure the work profile location switch on before test\",\"id\":\"f9a2bad7-a95c-4899-a5a1-c5eb32932abf\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"f9a2bad7-a95c-4899-a5a1-c5eb32932abf\"]},{\"value\":\"Switch the main location switch at the top of the screen on/off\",\"id\":\"dab0d2a9-befa-4378-bea1-b9d830417b93\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"dab0d2a9-befa-4378-bea1-b9d830417b93\"]},{\"value\":\"Switch the work profile location for different state\",\"id\":\"d3945e10-840f-4cae-8f1a-39db0e4ac6cb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d3945e10-840f-4cae-8f1a-39db0e4ac6cb\"]}]},{\"value\":\"13_Personal ringtones\",\"id\":\"B7FEB91D-F263-4647-B1F3-15FE61709900\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Scroll to the ringtone checked\",\"id\":\"8b466564-08e5-4322-8992-36fa3998ddd2\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8b466564-08e5-4322-8992-36fa3998ddd2\"]},{\"value\":\"Select the different ringtone (downward else upward)\",\"id\":\"05139d97-d39c-43cd-8ad4-a276c3fcf5a6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"05139d97-d39c-43cd-8ad4-a276c3fcf5a6\"]}]},{\"value\":\"Check if it's on the main screen of BYOD\",\"id\":\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"cf1e8e8c-2104-46f1-8b28-4d372b86fc49\"]},{\"value\":\"Press Go on dialog\",\"id\":\"b70fe893-88de-4879-90ab-c2929211baa8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b70fe893-88de-4879-90ab-c2929211baa8\"]},{\"value\":\"Press Pass on dialog\",\"id\":\"11862730-912f-4b3c-99d6-cff28c749559\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"11862730-912f-4b3c-99d6-cff28c749559\"]},{\"value\":\"Sub-cases\",\"id\":\"D760FE32-D1D1-4A64-9BAD-0DA84D00BB1D\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"01_Profile owner installed\",\"id\":\"015882d1-9ce9-4b67-a7e3-925ee0798fe4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"015882d1-9ce9-4b67-a7e3-925ee0798fe4\"]},{\"value\":\"02_Full disk encryption enabled\",\"id\":\"6d46cead-4200-4830-ab73-aa5b72d8cee0\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"6d46cead-4200-4830-ab73-aa5b72d8cee0\"]},{\"value\":\"03_Badged work apps visible in launcher(Check image)\",\"id\":\"731c2600-1169-402e-91ee-98a4dd31506f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"731c2600-1169-402e-91ee-98a4dd31506f\"]},{\"value\":\"04_Work notification is badged(Check image)\",\"id\":\"5e7a1b39-3e17-45e2-863f-ad55e97d901f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5e7a1b39-3e17-45e2-863f-ad55e97d901f\"]},{\"value\":\"05_Work status icon is displayed\",\"id\":\"9e63b2da-d744-4a93-907f-3486c60407cb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"9e63b2da-d744-4a93-907f-3486c60407cb\"]},{\"value\":\"06_Profile-aware accounts settings\",\"id\":\"c98b2d13-1b60-48d2-b05b-00252bb1c900\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c98b2d13-1b60-48d2-b05b-00252bb1c900\"]},{\"value\":\"07_Profile-aware device administrator settings(Check image)\",\"id\":\"c8aa9cc8-5d60-4130-b8ed-217545c43231\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c8aa9cc8-5d60-4130-b8ed-217545c43231\"]},{\"value\":\"08_Profile-aware trusted credential settings\",\"id\":\"d9789ba1-6855-459c-9d3f-30799e7dcb87\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d9789ba1-6855-459c-9d3f-30799e7dcb87\"]},{\"value\":\"09_Profile-aware user settings\",\"id\":\"4994c7d8-acaf-4272-b8f5-6768561cf2cf\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4994c7d8-acaf-4272-b8f5-6768561cf2cf\"]},{\"value\":\"10_Profile-aware app settings(Check image)\",\"id\":\"1d4b27f3-51f7-4f20-b674-f5a097b6d7d5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1d4b27f3-51f7-4f20-b674-f5a097b6d7d5\"]},{\"value\":\"11_Profile-aware location settings\",\"id\":\"11db7055-3e2e-475f-8620-1bef6bb6f5bd\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"11db7055-3e2e-475f-8620-1bef6bb6f5bd\"]},{\"value\":\"12_Profile-aware printing settings(Check image)\",\"id\":\"d342c4dd-f898-4df1-aa92-cf6ac97d772a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d342c4dd-f898-4df1-aa92-cf6ac97d772a\"]},{\"value\":\"13_Personal ringtones\",\"id\":\"acc515c6-092f-4d36-898f-4c8d33652223\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"acc515c6-092f-4d36-898f-4c8d33652223\"]},{\"value\":\"27_Confirm pattern lock test\",\"id\":\"3be8537e-efa4-4056-ba31-899cb90c8702\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3be8537e-efa4-4056-ba31-899cb90c8702\"]},{\"value\":\"30_Personal password test\",\"id\":\"60e745a0-f30e-4679-a41a-45afbf5ace0e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"60e745a0-f30e-4679-a41a-45afbf5ace0e\"]}]},{\"value\":\"Verify Personal and Work tabs\",\"id\":\"4aa267cc-73f0-487e-aa22-e57d487ff769\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4aa267cc-73f0-487e-aa22-e57d487ff769\"]}]},{\"value\":\"BYOD Provisioning tests\",\"id\":\"33BE4401-789B-4AFA-B094-AD3F728C15DD\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Remove work profile\",\"id\":\"c6ce936e-5dc7-4eee-a2a0-171ccb438ae7\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c6ce936e-5dc7-4eee-a2a0-171ccb438ae7\"]},{\"value\":\"Sub-cases\",\"id\":\"49FA0E71-DDB7-4D93-BB51-0705E1726273\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"01_Custom provisioning color(Check image)\",\"id\":\"a66b98b1-5ae4-4e60-9f51-1afb7c1c4f7e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a66b98b1-5ae4-4e60-9f51-1afb7c1c4f7e\"]},{\"value\":\"02_Custom provisioning image(Check image)\",\"id\":\"7265db9b-8461-4c01-8b11-809b8e346327\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7265db9b-8461-4c01-8b11-809b8e346327\"]},{\"value\":\"03_Custom terms\",\"id\":\"e097807f-e110-411e-9f04-02442fad05d2\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e097807f-e110-411e-9f04-02442fad05d2\"]}]}]},{\"value\":\"Device Owner Requesting Bugreport Tests\",\"id\":\"4C74B2E4-1C12-47ED-B8B2-C5B4DF0785C7\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click Decline button\",\"id\":\"7eec7b1d-4c98-48f8-ab8b-8c82006cfef4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7eec7b1d-4c98-48f8-ab8b-8c82006cfef4\"]},{\"value\":\"Click Request bugreport button\",\"id\":\"4275df2b-8d38-49a9-b956-6d5f06257f5a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4275df2b-8d38-49a9-b956-6d5f06257f5a\"]},{\"value\":\"Click Share button\",\"id\":\"377a3a65-66d4-4e05-ac35-b9e4196639e9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"377a3a65-66d4-4e05-ac35-b9e4196639e9\"]},{\"value\":\"Sub-cases\",\"id\":\"C11E9586-0D08-45AC-8361-66EE085F6C47\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"01-Check device owner\",\"id\":\"bd22d00c-3bff-4749-8763-3323c17809bb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bd22d00c-3bff-4749-8763-3323c17809bb\"]},{\"value\":\"02-Sharing of requested bugreport declined while being taken\",\"id\":\"c3700e79-6895-4fa0-8b1b-d34c5fa5b82d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c3700e79-6895-4fa0-8b1b-d34c5fa5b82d\"]},{\"value\":\"03-Sharing of requested bugreport accepted while being taken\",\"id\":\"873d0871-f3ae-42db-a3e2-f298e3c8c9d9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"873d0871-f3ae-42db-a3e2-f298e3c8c9d9\"]},{\"value\":\"04-Sharing of requested bugreport declined after having been taken\",\"id\":\"1e25fe0b-764b-414e-b3e3-e9c11269ad93\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1e25fe0b-764b-414e-b3e3-e9c11269ad93\"]},{\"value\":\"05-Sharing of requested bugreport accepted after having been taken\",\"id\":\"e2d2a682-55b0-4e2c-ad2d-801e77f1cb6f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e2d2a682-55b0-4e2c-ad2d-801e77f1cb6f\"]},{\"value\":\"06-Remove device owner\",\"id\":\"bdac4f2a-64a2-460c-a210-399cd652cfa8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bdac4f2a-64a2-460c-a210-399cd652cfa8\"]}]},{\"value\":\"Verify if screen back to Device Owner requesting Bugreport \",\"id\":\"4f3ec13b-589a-4ca3-b456-7224028d0604\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4f3ec13b-589a-4ca3-b456-7224028d0604\"]}]},{\"value\":\"Device Owner Tests\",\"id\":\"AD3511CC-9A26-43CF-9C89-C4C82116982F\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"02 & 17-02-Device administrator settings\",\"id\":\"0D9B315F-1C19-4E7F-AAFC-8CB650B52DC0\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Verify if CTS Verfier admin exists and is activated and can't be disabled\",\"id\":\"d5c77251-9663-4eaa-b708-68a67fc8189f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d5c77251-9663-4eaa-b708-68a67fc8189f\"]}]},{\"value\":\"03-WiFi configuration lockdown\",\"id\":\"1E225608-0E94-459F-89FA-6D51CF552CC2\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click \\\"Go to WiFi Setting\\\" button\",\"id\":\"0b2baaab-b94e-4348-8e3b-e13dc302c5ab\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0b2baaab-b94e-4348-8e3b-e13dc302c5ab\"]},{\"value\":\"Click \\\"WiFi config lockdown off\\\"\",\"id\":\"b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b2f63ae3-ba10-4c63-9aa5-b55ab182a2c4\"]},{\"value\":\"Click \\\"WiFi config lockdown on\\\"\",\"id\":\"440786b7-f1d9-4c77-ad81-28068fe6a608\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"440786b7-f1d9-4c77-ad81-28068fe6a608\"]},{\"value\":\"Click settings of connected WiFi\",\"id\":\"d3400679-ef71-4a3e-a0a9-98cb51c83da6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d3400679-ef71-4a3e-a0a9-98cb51c83da6\"]}]},{\"value\":\"15 & 17-06-Policy transparency test\",\"id\":\"6AF5405C-B557-4D84-B38C-9D4E96E68D7B\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"15-02 & 17-06-01-Disallow adjust volume test\",\"id\":\"0e30ea6e-be38-468e-8499-790b05a37760\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0e30ea6e-be38-468e-8499-790b05a37760\"]},{\"value\":\"15-12 & 17-06-04-Disallow install unknown sources\",\"id\":\"5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5d3b6fb3-0e69-4463-ae02-693b7a7e2f6c\"]},{\"value\":\"15-13 & 17-06-05-Disallow modify accounts test\",\"id\":\"0c73b50f-d48d-4082-a091-3d4f55f77369\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0c73b50f-d48d-4082-a091-3d4f55f77369\"]},{\"value\":\"15-15 & 17-06-06-Disallow share location\",\"id\":\"3c4bab75-4bac-49fa-8264-5f4c3504c60b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3c4bab75-4bac-49fa-8264-5f4c3504c60b\"]},{\"value\":\"15-17 & 17-06-08-Disallow config date time\",\"id\":\"a1add8e6-5408-417e-942b-2663863fcdd6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a1add8e6-5408-417e-942b-2663863fcdd6\"]},{\"value\":\"15-18 & 17-06-09-Disallow config location\",\"id\":\"6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"6f25a9fc-c4ab-4de4-ab9e-3df9737e1f1b\"]},{\"value\":\"15-20 & 17-06-10-Disallow config screen timeout\",\"id\":\"ddbc4d31-a035-4eec-814a-def0efb2bfa5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ddbc4d31-a035-4eec-814a-def0efb2bfa5\"]},{\"value\":\"15-21 & 17-06-11-Disallow config brightness\",\"id\":\"e395e5d8-df59-4e7d-bf18-6cd65da3ff8b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e395e5d8-df59-4e7d-bf18-6cd65da3ff8b\"]},{\"value\":\"15-26 Set password quality\",\"id\":\"C6F90C4A-5B2C-44F4-9173-4EBE7A36452D\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Verify None/Swipe\",\"id\":\"cccc0cd1-82fd-4292-8d4d-2028be141809\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"cccc0cd1-82fd-4292-8d4d-2028be141809\"]},{\"value\":\"Verify None/Swipe/Patten/PIN lock\",\"id\":\"5225d3a3-cf6f-48c8-ab8a-e04571eb69dc\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5225d3a3-cf6f-48c8-ab8a-e04571eb69dc\"]},{\"value\":\"Verify None/Swipe/Pattern lock\",\"id\":\"3e3b1b72-32eb-4f57-a45f-d477fdcb1993\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3e3b1b72-32eb-4f57-a45f-d477fdcb1993\"]}]},{\"value\":\"15-27 & 17-06-12-Set permitted accessibility services\",\"id\":\"a67e968f-ab80-4c16-87c6-76e7c22da2b7\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a67e968f-ab80-4c16-87c6-76e7c22da2b7\"]},{\"value\":\"15-28 & 17-06-13-Set permitted input methods\",\"id\":\"238c6d52-12d8-4d83-ae19-c703bcc6ec24\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"238c6d52-12d8-4d83-ae19-c703bcc6ec24\"]},{\"value\":\"Click \\\"Open settings\\\" button\",\"id\":\"be00d800-5235-410e-a535-55a76d9200b9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"be00d800-5235-410e-a535-55a76d9200b9\"]},{\"value\":\"Launch Dummy input method\",\"id\":\"72a6fa67-df5f-4c18-849a-8212e749417e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"72a6fa67-df5f-4c18-849a-8212e749417e\"]},{\"value\":\"Set restriction off by turning off the switch bar\",\"id\":\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"15aa571c-2e4d-43c0-b9c7-07b4f23041c4\"]},{\"value\":\"Set restriction on by turning on the switch bar\",\"id\":\"5ee29e64-400f-4c6f-ba29-d9442740b560\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5ee29e64-400f-4c6f-ba29-d9442740b560\"]},{\"value\":\"Verify if screen back to 15-Policy transparency test\",\"id\":\"44291145-6774-4ba3-9caf-731853cef58e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"44291145-6774-4ba3-9caf-731853cef58e\"]}]},{\"value\":\"16-Managed device info tests\",\"id\":\"B9100E9E-00C6-4667-B5CC-1BA0FAA7E52B\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click \\\"Clear Org\\\" button\",\"id\":\"3aefa26b-3d3e-4320-b4b0-9569556fd846\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3aefa26b-3d3e-4320-b4b0-9569556fd846\"]},{\"value\":\"Click \\\"Finish\\\" button\",\"id\":\"b17bcc33-34e0-4aba-a8ce-080ea0d0846c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b17bcc33-34e0-4aba-a8ce-080ea0d0846c\"]},{\"value\":\"Click \\\"Grant\\\" button\",\"id\":\"034d5968-a791-4164-8b00-450ddadb3db1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"034d5968-a791-4164-8b00-450ddadb3db1\"]},{\"value\":\"Click \\\"Open Settings\\\" button\",\"id\":\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"91b86fe0-4aca-4858-9bc1-ed4be34940fa\"]},{\"value\":\"Click \\\"Reset\\\" button\",\"id\":\"82177f1b-37f0-4bec-95c6-02f1c0871c28\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"82177f1b-37f0-4bec-95c6-02f1c0871c28\"]},{\"value\":\"Click \\\"Set Org\\\" button\",\"id\":\"91ab1016-e46b-4681-802a-30de34592081\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"91ab1016-e46b-4681-802a-30de34592081\"]},{\"value\":\"Verify if screen back to Managed device info tests page\",\"id\":\"03e19599-15d9-4cff-acc4-88b977853f25\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"03e19599-15d9-4cff-acc4-88b977853f25\"]},{\"value\":\"Verify that on the lock screen, you are told the device is managed\",\"id\":\"764101e3-1eaa-47e8-854f-68434c4c994c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"764101e3-1eaa-47e8-854f-68434c4c994c\"]},{\"value\":\"Verify that on the lock screen, you are told the device is managed by \\\"Foo, Inc\\\"\",\"id\":\"1fe89bff-e8fd-40da-a6b7-e91443c69389\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1fe89bff-e8fd-40da-a6b7-e91443c69389\"]},{\"value\":\"Verify that the list contains the CTS Verifier app\",\"id\":\"c06f1557-8c66-44c1-8dc2-dad782d2f597\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c06f1557-8c66-44c1-8dc2-dad782d2f597\"]}]},{\"value\":\"17-Managed User\",\"id\":\"8D59012D-9EB2-4C65-9632-400668A1471C\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Turn on 3-button navigation\",\"id\":\"e690407d-25d7-42eb-9553-9f328ee32f0d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e690407d-25d7-42eb-9553-9f328ee32f0d\"]}]},{\"value\":\"19-Logout\",\"id\":\"2F029129-3B54-4371-A4BC-18F5C526398B\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Verify if screen back to Logout\",\"id\":\"ad921587-e363-4652-ae6b-9d95ff9bba16\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ad921587-e363-4652-ae6b-9d95ff9bba16\"]}]},{\"value\":\"Check the restriction message(Long message)\",\"id\":\"8b18fc23-789a-4c41-9746-297a040e35a7\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8b18fc23-789a-4c41-9746-297a040e35a7\"]},{\"value\":\"Check the restriction message(Short message)\",\"id\":\"8003eafa-d92b-4571-ba71-a68648526e4f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8003eafa-d92b-4571-ba71-a68648526e4f\"]},{\"value\":\"Check the restriction message(default)\",\"id\":\"bcc40c72-d997-4128-80a1-6aca3603c260\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bcc40c72-d997-4128-80a1-6aca3603c260\"]},{\"value\":\"Click \\\"Set restriction\\\" button\",\"id\":\"fa171789-d776-46b6-ac6f-39961c4c3414\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"fa171789-d776-46b6-ac6f-39961c4c3414\"]},{\"value\":\"Click Go button\",\"id\":\"7e951186-50c3-400e-a5c6-e931dd32a30b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7e951186-50c3-400e-a5c6-e931dd32a30b\"]},{\"value\":\"Click\\\"Clear restriction(before leaving test)\\\" button\",\"id\":\"ed37b636-1904-49d8-a5cc-4f6046f1358b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ed37b636-1904-49d8-a5cc-4f6046f1358b\"]},{\"value\":\"Delete managed users\",\"id\":\"4c401ff4-c80e-44d8-b94c-819dc1366093\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4c401ff4-c80e-44d8-b94c-819dc1366093\"]},{\"value\":\"Sub-cases\",\"id\":\"096E1AF7-83B9-4517-949E-D8D769791124\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"01-Check device owner\",\"id\":\"b36ee844-6807-46a4-9073-3d5c83f730fd\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b36ee844-6807-46a4-9073-3d5c83f730fd\"]},{\"value\":\"02-Device administrator settings\",\"id\":\"ba60c19c-dd7d-4503-86dc-57ae83dfa386\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ba60c19c-dd7d-4503-86dc-57ae83dfa386\"]},{\"value\":\"03-WiFi configuration lockdown\",\"id\":\"33e57fb2-284d-43aa-9763-d9c0cd8d1d95\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"33e57fb2-284d-43aa-9763-d9c0cd8d1d95\"]},{\"value\":\"04-Disallow configuring WiFi\",\"id\":\"841de16d-b420-4274-8775-20fff2d30def\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"841de16d-b420-4274-8775-20fff2d30def\"]},{\"value\":\"05-Disallow configuring VPN\",\"id\":\"128d040e-8d30-4812-9cbb-b29efa47855e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"128d040e-8d30-4812-9cbb-b29efa47855e\"]},{\"value\":\"06-Disallow data roaming\",\"id\":\"ec764a5f-6c81-496a-820b-00869272b2f4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ec764a5f-6c81-496a-820b-00869272b2f4\"]},{\"value\":\"07-Disallow factory reset\",\"id\":\"06e13f84-c348-470c-a237-ded70dacf408\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"06e13f84-c348-470c-a237-ded70dacf408\"]},{\"value\":\"08-Disallow configuring Bluetooth\",\"id\":\"dbec061f-568e-4ffa-9d71-4a5494853625\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"dbec061f-568e-4ffa-9d71-4a5494853625\"]},{\"value\":\"09-Disallow USB file transfer\",\"id\":\"87a99bc2-662c-408a-891a-ebb93954ea8f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"87a99bc2-662c-408a-891a-ebb93954ea8f\"]},{\"value\":\"10 & 17-03-Disable status bar test\",\"id\":\"7ba82511-7b81-415f-81d7-ce2a5c969a50\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7ba82511-7b81-415f-81d7-ce2a5c969a50\"]},{\"value\":\"10-Disable status bar\",\"id\":\"2c04124a-9437-4127-9146-c1830d875dcb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2c04124a-9437-4127-9146-c1830d875dcb\"]},{\"value\":\"11 & 17-04 -Disable keyguard test\",\"id\":\"c131f309-79ae-48c8-a354-4410a90e97e4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c131f309-79ae-48c8-a354-4410a90e97e4\"]},{\"value\":\"11-Disable keyguard\",\"id\":\"e0c4500d-daea-44e2-b105-6efa0f087cb1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e0c4500d-daea-44e2-b105-6efa0f087cb1\"]},{\"value\":\"13-Setting the user icon(Check image)\",\"id\":\"d1a32271-9bb8-464b-89ee-8eb121c9d8dd\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d1a32271-9bb8-464b-89ee-8eb121c9d8dd\"]},{\"value\":\"14-Permissions lockdown\",\"id\":\"a418766b-dd6a-4c90-b127-e104546068c5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a418766b-dd6a-4c90-b127-e104546068c5\"]},{\"value\":\"15-01-Disallow add user\",\"id\":\"7ebfac21-0046-438c-af8c-f21ea88f0357\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7ebfac21-0046-438c-af8c-f21ea88f0357\"]},{\"value\":\"15-02-Disallow adjust volume\",\"id\":\"e92b83d0-131c-4ef1-aaab-49103f238136\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e92b83d0-131c-4ef1-aaab-49103f238136\"]},{\"value\":\"15-03-Disallow controlling apps\",\"id\":\"4a5899ed-71fd-4562-8aab-737e20b84297\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4a5899ed-71fd-4562-8aab-737e20b84297\"]},{\"value\":\"15-04-Disallow config cell broadcasts\",\"id\":\"446a3aa1-905d-4268-8532-5bf77fe7fbe6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"446a3aa1-905d-4268-8532-5bf77fe7fbe6\"]},{\"value\":\"15-05-Disallow config credentials\",\"id\":\"f00f3a0d-8419-4e58-a636-d75d84accafb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"f00f3a0d-8419-4e58-a636-d75d84accafb\"]},{\"value\":\"15-06-Disallow config mobile networks\",\"id\":\"3dabca21-35c3-4633-99c0-52e3a5a0d012\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3dabca21-35c3-4633-99c0-52e3a5a0d012\"]},{\"value\":\"15-07-Disallow config tethering\",\"id\":\"1f828567-b1d4-4874-94a1-22d939057e69\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1f828567-b1d4-4874-94a1-22d939057e69\"]},{\"value\":\"15-08-Disallow config Wi-Fi\",\"id\":\"78f39e06-715e-4c47-a787-b2802a1a12ab\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"78f39e06-715e-4c47-a787-b2802a1a12ab\"]},{\"value\":\"15-10-Disallow factory reset\",\"id\":\"e8f7b797-087f-4398-b4e2-358fe50416f3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e8f7b797-087f-4398-b4e2-358fe50416f3\"]},{\"value\":\"15-12-Disallow install unknown sources\",\"id\":\"f67dea91-f1e8-4f94-a80f-2374f15cb791\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"f67dea91-f1e8-4f94-a80f-2374f15cb791\"]},{\"value\":\"15-13-Disallow modify accounts\",\"id\":\"78ad3920-ae49-4f06-b220-781c5b1e53e5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"78ad3920-ae49-4f06-b220-781c5b1e53e5\"]},{\"value\":\"15-14-Disallow network reset\",\"id\":\"365f65bd-c7be-4d20-9b37-7694dfa81ba1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"365f65bd-c7be-4d20-9b37-7694dfa81ba1\"]},{\"value\":\"15-15-Disallow share location\",\"id\":\"477825e2-33af-4238-acac-4dce5c1c5b84\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"477825e2-33af-4238-acac-4dce5c1c5b84\"]},{\"value\":\"15-16-Disallow uninstall apps\",\"id\":\"9d556fec-d14c-44d9-870f-0dbfc41ffb86\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"9d556fec-d14c-44d9-870f-0dbfc41ffb86\"]},{\"value\":\"15-17 Disallow config date time\",\"id\":\"14ca85a4-dc82-479e-87f5-afd492728ac1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"14ca85a4-dc82-479e-87f5-afd492728ac1\"]},{\"value\":\"15-18 Disallow config location\",\"id\":\"a0835500-a2a2-4908-a93e-522b12c44507\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a0835500-a2a2-4908-a93e-522b12c44507\"]},{\"value\":\"15-19-Disallow aireplane mode\",\"id\":\"c1d1e74e-9d20-482f-9c48-58faaf8b8c7f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c1d1e74e-9d20-482f-9c48-58faaf8b8c7f\"]},{\"value\":\"15-20 Disallow config screen timeout\",\"id\":\"97af8f29-fc99-451c-a57b-81f59621b304\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"97af8f29-fc99-451c-a57b-81f59621b304\"]},{\"value\":\"15-21-Disallow config brightness\",\"id\":\"4da412fa-0048-4a4b-9ba8-d4aabc5dd6a1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4da412fa-0048-4a4b-9ba8-d4aabc5dd6a1\"]},{\"value\":\"15-22-Set auto(network) time required\",\"id\":\"151b7e7c-814c-42fc-b2f9-d9aeb0b9d86b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"151b7e7c-814c-42fc-b2f9-d9aeb0b9d86b\"]},{\"value\":\"15-23-Disallow lockscreen unredacted notification\",\"id\":\"f31620ba-a28e-44ed-a592-02cf02b7e2a0\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"f31620ba-a28e-44ed-a592-02cf02b7e2a0\"]},{\"value\":\"15-24-Set lock screen info\",\"id\":\"02368e5e-0086-4c12-9a05-55c25015d488\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"02368e5e-0086-4c12-9a05-55c25015d488\"]},{\"value\":\"15-25-Set maximum time to lock\",\"id\":\"cd0de494-22a4-45d1-b5b4-74d5585cccf8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"cd0de494-22a4-45d1-b5b4-74d5585cccf8\"]},{\"value\":\"15-26-Set password quality\",\"id\":\"c0d95bab-a71d-4109-b402-01d3bad36422\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c0d95bab-a71d-4109-b402-01d3bad36422\"]},{\"value\":\"15-27-Set permitted accessibility services\",\"id\":\"96e13653-8ab0-44a3-9bed-ddd32181cd28\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"96e13653-8ab0-44a3-9bed-ddd32181cd28\"]},{\"value\":\"15-28-Set permitted input methods\",\"id\":\"1075b85b-6357-4973-af77-ddd3ef41fbbf\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1075b85b-6357-4973-af77-ddd3ef41fbbf\"]},{\"value\":\"15-Policy transparency test\",\"id\":\"35a90a2e-6709-4b9d-ad3f-07f3af03e889\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"35a90a2e-6709-4b9d-ad3f-07f3af03e889\"]},{\"value\":\"16-01-Managed device info page\",\"id\":\"137e850e-d1e1-4fda-85f0-7a71c6aa39d8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"137e850e-d1e1-4fda-85f0-7a71c6aa39d8\"]},{\"value\":\"16-02-Retrieve traffic logs\",\"id\":\"bc8d1d81-e862-43e2-aa54-1056b9e26f14\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bc8d1d81-e862-43e2-aa54-1056b9e26f14\"]},{\"value\":\"16-03-Request bug report\",\"id\":\"4e7e041d-2ca6-409d-9c9f-544c4f9a4a0a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4e7e041d-2ca6-409d-9c9f-544c4f9a4a0a\"]},{\"value\":\"16-04-Retrieve security logs\",\"id\":\"e242b517-2878-473b-bf43-ae1e7c299f21\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e242b517-2878-473b-bf43-ae1e7c299f21\"]},{\"value\":\"16-05-Enterprise-installed apps\",\"id\":\"0e6339c1-dd60-4126-9c18-82a1171245ce\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0e6339c1-dd60-4126-9c18-82a1171245ce\"]},{\"value\":\"16-06-Location access permission\",\"id\":\"8f2375c4-da47-4673-b46d-88bfca894fbf\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8f2375c4-da47-4673-b46d-88bfca894fbf\"]},{\"value\":\"16-07-Microphone access permission\",\"id\":\"e09a8291-7909-4e13-aadd-413ef0f26bdc\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e09a8291-7909-4e13-aadd-413ef0f26bdc\"]},{\"value\":\"16-08-Camera access permission\",\"id\":\"879b4b50-6fba-4899-ad51-c9819adc7dc6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"879b4b50-6fba-4899-ad51-c9819adc7dc6\"]},{\"value\":\"16-09-Default apps\",\"id\":\"97168770-8a71-4ad5-b1a3-6fad42f11159\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"97168770-8a71-4ad5-b1a3-6fad42f11159\"]},{\"value\":\"16-10-Default keyboard\",\"id\":\"e2eae039-e0f9-4bad-a122-3b67582d0cb2\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e2eae039-e0f9-4bad-a122-3b67582d0cb2\"]},{\"value\":\"16-11-Always-on VPN\",\"id\":\"c0bfb788-3dfc-45f1-8def-af860884289c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c0bfb788-3dfc-45f1-8def-af860884289c\"]},{\"value\":\"16-12-Global HTTP Proxy\",\"id\":\"2776b178-6e89-4fea-9f72-a7733427ef39\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2776b178-6e89-4fea-9f72-a7733427ef39\"]},{\"value\":\"16-13-Trusted CA certs\",\"id\":\"63dd640e-a661-47cc-964a-e73a3d4c0f1f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"63dd640e-a661-47cc-964a-e73a3d4c0f1f\"]},{\"value\":\"16-14-Wipe on authentication failure\",\"id\":\"8a47ce64-ec2d-4a20-a91b-f89000b7e2bc\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8a47ce64-ec2d-4a20-a91b-f89000b7e2bc\"]},{\"value\":\"16-15-Quick settings disclosure\",\"id\":\"a28853a0-0f2d-4148-807e-1387a6a31d3a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a28853a0-0f2d-4148-807e-1387a6a31d3a\"]},{\"value\":\"16-16-Keyguard disclosure\",\"id\":\"bfcd3a5c-3fa3-4976-9b6e-aea47e073512\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bfcd3a5c-3fa3-4976-9b6e-aea47e073512\"]},{\"value\":\"16-17-Add account disclosure\",\"id\":\"76a9632c-6b66-4bec-9423-e4f09af91996\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"76a9632c-6b66-4bec-9423-e4f09af91996\"]},{\"value\":\"16-Managed device info tests\",\"id\":\"4f868606-0d5b-44a3-9c85-f9cb48c66dbb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"4f868606-0d5b-44a3-9c85-f9cb48c66dbb\"]},{\"value\":\"17-01-Check affiliated profile owner\",\"id\":\"1133e24d-4564-4009-8872-280f93f6fb3e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1133e24d-4564-4009-8872-280f93f6fb3e\"]},{\"value\":\"17-02-Device administrator settings\",\"id\":\"bb7fdd5f-0d61-4a6b-bd0f-589f5da59832\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bb7fdd5f-0d61-4a6b-bd0f-589f5da59832\"]},{\"value\":\"17-03-Disable status bar\",\"id\":\"0ec64b5f-e737-4075-9eb8-5de22223c304\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0ec64b5f-e737-4075-9eb8-5de22223c304\"]},{\"value\":\"17-04-Disable keyguard\",\"id\":\"d36c21f6-ffb6-4ae5-82d5-664ec268f648\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d36c21f6-ffb6-4ae5-82d5-664ec268f648\"]},{\"value\":\"17-05-Disallow remove user\",\"id\":\"03d55006-a23c-4f22-a56d-2d8de633cf3c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"03d55006-a23c-4f22-a56d-2d8de633cf3c\"]},{\"value\":\"17-06-02-Disallow controlling apps\",\"id\":\"e66ce1e2-883e-465b-8d82-3cdb852cc679\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e66ce1e2-883e-465b-8d82-3cdb852cc679\"]},{\"value\":\"17-06-03-Disallow config Wi-Fi\",\"id\":\"eb48590b-4827-44e1-a2bd-9c3416e92404\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"eb48590b-4827-44e1-a2bd-9c3416e92404\"]},{\"value\":\"17-06-07-Disallow uninstall apps\",\"id\":\"ae20d771-d892-4065-aa06-90335e33a588\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ae20d771-d892-4065-aa06-90335e33a588\"]},{\"value\":\"17-06-Policy transparency test\",\"id\":\"5e0f41ed-e9c6-4d11-b3a2-815b415268db\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5e0f41ed-e9c6-4d11-b3a2-815b415268db\"]},{\"value\":\"17-Managed User\",\"id\":\"d3d29d0d-af3f-4124-bd80-755d201bbec0\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d3d29d0d-af3f-4124-bd80-755d201bbec0\"]},{\"value\":\"19-Logout\",\"id\":\"360c99e8-b022-42ab-b1c0-a27575885f2d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"360c99e8-b022-42ab-b1c0-a27575885f2d\"]},{\"value\":\"20-Disallow user switch\",\"id\":\"3a510978-df33-499d-baab-b236c9960bd8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3a510978-df33-499d-baab-b236c9960bd8\"]},{\"value\":\"21-Disallow remove user\",\"id\":\"048dadc7-e9b8-4451-b111-a128df8d095b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"048dadc7-e9b8-4451-b111-a128df8d095b\"]},{\"value\":\"22-Network Logging UI(Check image)\",\"id\":\"c33097db-480e-433c-af22-ed22357d7c76\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c33097db-480e-433c-af22-ed22357d7c76\"]},{\"value\":\"23-Customize Lock Screen Message\",\"id\":\"77cd84d9-261a-488e-8fdb-5e3c36852267\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"77cd84d9-261a-488e-8fdb-5e3c36852267\"]},{\"value\":\"24-Remove device owner\",\"id\":\"2208a8b1-a26d-407b-9780-6d30e4974e13\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2208a8b1-a26d-407b-9780-6d30e4974e13\"]}]},{\"value\":\"Turn on Multiple users switch bar\",\"id\":\"64db6b9d-caaa-442f-840a-80ef16030e55\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"64db6b9d-caaa-442f-840a-80ef16030e55\"]},{\"value\":\"Verify if screen back to main screen of Device Owner Tests\",\"id\":\"c1068330-ea63-4e42-8806-773d1152094f\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c1068330-ea63-4e42-8806-773d1152094f\"]}]},{\"value\":\"Enable Device Owner\",\"id\":\"150ccde5-c230-418d-a286-b413af7f297b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"150ccde5-c230-418d-a286-b413af7f297b\"]},{\"value\":\"Install Device Owner\",\"id\":\"5595e3fe-1f8d-453a-a103-8d15ac2ec05d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5595e3fe-1f8d-453a-a103-8d15ac2ec05d\"]},{\"value\":\"No Device Owner Tests\",\"id\":\"AE19D609-E847-4668-901F-E087ECB6F3DB\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click \\\"Go\\\" button\",\"id\":\"608f1c50-237e-4f5d-94c6-0bbbcba87332\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"608f1c50-237e-4f5d-94c6-0bbbcba87332\"]},{\"value\":\"Launch No Device Owner Tests\",\"id\":\"7f12c16f-51be-4732-bf1b-ef4b55841a99\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7f12c16f-51be-4732-bf1b-ef4b55841a99\"]},{\"value\":\"Sub-cases\",\"id\":\"673BD6C0-E1A2-49B0-BCA0-533D8D9DF0E8\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"01-Device owner provisioning\",\"id\":\"d52e2b4c-6bf6-4d93-af37-785ce2d74664\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d52e2b4c-6bf6-4d93-af37-785ce2d74664\"]},{\"value\":\"02-Quick settings disclosure\",\"id\":\"c053d68c-aa89-494f-9a6d-a24f4eba7de4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c053d68c-aa89-494f-9a6d-a24f4eba7de4\"]},{\"value\":\"03-Keyguard disclosure\",\"id\":\"8176eaad-a582-41ea-8d8e-9c8673e8ceb0\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8176eaad-a582-41ea-8d8e-9c8673e8ceb0\"]},{\"value\":\"04-Add account disclosure\",\"id\":\"fb524e6c-60b2-4211-b7e4-37f76f26a3ef\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"fb524e6c-60b2-4211-b7e4-37f76f26a3ef\"]}]},{\"value\":\"VERIFY you are not told the device is managed\",\"id\":\"cae61682-7071-4c67-94c1-963ff2cbe978\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"cae61682-7071-4c67-94c1-963ff2cbe978\"]}]},{\"value\":\"Permissions lockdown test\",\"id\":\"874444DF-6E77-4225-A645-C24386EA1DF0\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click \\\"Open Application Settings\\\" button\",\"id\":\"f94a4fd0-90ed-46b2-bd68-e769b2b4175c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"f94a4fd0-90ed-46b2-bd68-e769b2b4175c\"]},{\"value\":\"Launch Permission of contacts\",\"id\":\"e272f61e-5e1a-434d-ab44-5ae9abf260fc\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e272f61e-5e1a-434d-ab44-5ae9abf260fc\"]},{\"value\":\"Start Permissions lockdown test\",\"id\":\"d2619d97-b114-47f1-bade-ff3e0e4d37f7\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d2619d97-b114-47f1-bade-ff3e0e4d37f7\"]}]},{\"value\":\"Set long support message\",\"id\":\"d1023735-52c1-48bc-9dc7-a7b03a15ca7b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d1023735-52c1-48bc-9dc7-a7b03a15ca7b\"]},{\"value\":\"Set short support message\",\"id\":\"336938a2-a45e-4245-a4a7-2f8704bc265d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"336938a2-a45e-4245-a4a7-2f8704bc265d\"]}]},{\"value\":\"test_BYOD Managed Provisioning\",\"id\":\"cc9d7c01-f4f6-418f-8017-afcfe3344147\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"cc9d7c01-f4f6-418f-8017-afcfe3344147\"]},{\"value\":\"test_BYOD Provisioning tests\",\"id\":\"7dddd0ac-0493-4e91-871a-e36348978323\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7dddd0ac-0493-4e91-871a-e36348978323\"]},{\"value\":\"test_Device Owner Requesting Bugreport Tests\",\"id\":\"dfed233b-4141-4e7e-a70f-5884c712f689\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"dfed233b-4141-4e7e-a70f-5884c712f689\"]},{\"value\":\"test_Device Owner Tests(Check image)\",\"id\":\"82f3ce72-96fe-4814-8b68-119a165c3cbf\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"82f3ce72-96fe-4814-8b68-119a165c3cbf\"]},{\"value\":\"test_No Device Owner Tests\",\"id\":\"56cbd2d5-2a74-4b2f-aaf1-d2fe2aa5f479\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"56cbd2d5-2a74-4b2f-aaf1-d2fe2aa5f479\"]}]},{\"value\":\"Notification\",\"id\":\"E6743F92-26F3-4A42-BFCC-0A218E2C3E20\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"25020E7F-1F6B-4B76-A9CF-D349A4C3CC11\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Bubble Notification Tests\",\"id\":\"EB2556C8-6175-45D4-89BB-EE6430917DDB\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click \\\"Pass\\\" button\",\"id\":\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e7f9f493-a79b-4e07-8b28-1ac9a5ef5d28\"]},{\"value\":\"Collapse Bubble\",\"id\":\"e26e0b7d-f764-43a4-972e-1879b9ce2b3a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e26e0b7d-f764-43a4-972e-1879b9ce2b3a\"]},{\"value\":\"Dragging bubble to dismiss it on the screen\",\"id\":\"8ef662f7-4f74-4591-ae52-3225f30513b1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8ef662f7-4f74-4591-ae52-3225f30513b1\"]},{\"value\":\"If \\\"Chat using bubble\\\" tips appear dismiss it \",\"id\":\"1c0d44ff-5ed3-4ea1-b931-f2cb903c504b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1c0d44ff-5ed3-4ea1-b931-f2cb903c504b\"]},{\"value\":\"If \\\"Control bubbles anytime\\\" tips appear, dismiss it\",\"id\":\"008221ef-2f19-4071-9311-cfbe47857bb3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"008221ef-2f19-4071-9311-cfbe47857bb3\"]},{\"value\":\"Verify if there is a notification in the notification shade\",\"id\":\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7db88cc2-8f43-4668-a7bc-0afb68e49de3\"]},{\"value\":\"Verify if there is bubble on the screen\",\"id\":\"3c520b0e-60ae-408c-9345-478080bfe14c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3c520b0e-60ae-408c-9345-478080bfe14c\"]},{\"value\":\"Verify that the bubble is removed from the screen\",\"id\":\"696f0a59-5696-49f9-8573-34cfc71c3c61\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"696f0a59-5696-49f9-8573-34cfc71c3c61\"]},{\"value\":\"Verify there is no notification in the notification shade\",\"id\":\"37bd58c3-6297-4c65-ac3f-e575ec7b3986\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"37bd58c3-6297-4c65-ac3f-e575ec7b3986\"]}]},{\"value\":\"Check certificate on notification status bar\",\"id\":\"6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"6e39d7bc-eca0-4c2d-9c8e-bf47cd2eca1a\"]},{\"value\":\"Click \\\"Go\\\" button\",\"id\":\"553582bb-ae2d-4759-a0a7-f73067bf7e89\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"553582bb-ae2d-4759-a0a7-f73067bf7e89\"]},{\"value\":\"Click Pass button\",\"id\":\"1ed2536c-bc42-41ff-8528-dea80280c9fd\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1ed2536c-bc42-41ff-8528-dea80280c9fd\"]},{\"value\":\"Click launch Settings button\",\"id\":\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"6d4037a3-a4e4-4bab-9f39-afc62304cf57\"]},{\"value\":\"Condition Provider test\",\"id\":\"C77DF5A2-949C-48F6-AEC4-93A217F73902\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Turn On/Off Do Not Disturb function\",\"id\":\"e4555fba-a19a-4a6c-8f12-d3202b0203f5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e4555fba-a19a-4a6c-8f12-d3202b0203f5\"]}]},{\"value\":\"If myCert is installed, press back key\",\"id\":\"325e2c82-fd6d-4027-8dd7-1d331c3d5345\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"325e2c82-fd6d-4027-8dd7-1d331c3d5345\"]},{\"value\":\"If myCert is not installed, install Cert\",\"id\":\"ce88edc2-4ae3-4424-9d5b-906134e04383\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ce88edc2-4ae3-4424-9d5b-906134e04383\"]},{\"value\":\"Install CA\",\"id\":\"0e355b97-b105-4074-8e2f-c4d1e0a69a08\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0e355b97-b105-4074-8e2f-c4d1e0a69a08\"]},{\"value\":\"Turn On/Off Notification access\",\"id\":\"8de23e46-4a22-4d4b-bc72-5588dfe25101\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8de23e46-4a22-4d4b-bc72-5588dfe25101\"]},{\"value\":\"Verify if find myCA.cer on screen\",\"id\":\"1dd91c68-25ae-4631-8387-ea9aae5957e9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1dd91c68-25ae-4631-8387-ea9aae5957e9\"]}]},{\"value\":\"test_Bubble Notification Tests\",\"id\":\"e2afa6de-5d79-4e1f-ad1a-b6e88e31e5a3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e2afa6de-5d79-4e1f-ad1a-b6e88e31e5a3\"]},{\"value\":\"test_CA Cert Notification Test\",\"id\":\"6ab4ade4-e911-49f5-8972-bdc1b31049c5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"6ab4ade4-e911-49f5-8972-bdc1b31049c5\"]},{\"value\":\"test_CA Cert Notification on Boot test\",\"id\":\"a3c0955c-29f4-4488-af69-d765f068c4ea\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a3c0955c-29f4-4488-af69-d765f068c4ea\"]},{\"value\":\"test_Condition Provider test\",\"id\":\"dec009bd-6ca5-4baa-81d1-a00929a711a4\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"dec009bd-6ca5-4baa-81d1-a00929a711a4\"]},{\"value\":\"test_Notification Attention Management Test\",\"id\":\"cf14915f-d938-43d7-b09b-40a0a3c80fd8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"cf14915f-d938-43d7-b09b-40a0a3c80fd8\"]},{\"value\":\"test_Notification Listener Test\",\"id\":\"f22363c9-d58a-4b5b-8f6a-91b236ec8d11\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"f22363c9-d58a-4b5b-8f6a-91b236ec8d11\"]},{\"value\":\"test_QS Media Controls Test(Check image)\",\"id\":\"fa3d7096-4016-48dd-94f4-f199e7a2a978\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"fa3d7096-4016-48dd-94f4-f199e7a2a978\"]},{\"value\":\"test_Shortcut Reset Rate-limiting Test\",\"id\":\"8f00d919-0c82-4e55-8710-3a76734da2b3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8f00d919-0c82-4e55-8710-3a76734da2b3\"]}]},{\"value\":\"Other\",\"id\":\"DCA44B40-A3E5-4EEE-A9F3-6FB4146F6ECD\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"test_Battery Saver Test\",\"id\":\"40e973e7-1cab-4d00-918a-195bb7aab758\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"40e973e7-1cab-4d00-918a-195bb7aab758\"]},{\"value\":\"test_Recent Task Removal Test\",\"id\":\"e6aec7f0-e259-4914-9474-2ca7a5e3f45d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e6aec7f0-e259-4914-9474-2ca7a5e3f45d\"]}]},{\"value\":\"Security\",\"id\":\"76A342AD-B872-4507-A5D6-0AD3A7ACF584\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"1FB9E4B3-4EA5-4306-B8D6-315391BED393\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click Done button if need\",\"id\":\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2fb8a428-0ad6-4d59-a36e-8ba24663af7b\"]},{\"value\":\"Click Next button\",\"id\":\"fdcaf63b-bd85-431d-a212-51c1af4d3204\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"fdcaf63b-bd85-431d-a212-51c1af4d3204\"]},{\"value\":\"Click OK button\",\"id\":\"21408006-0414-473e-87dd-282a2f4cce97\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"21408006-0414-473e-87dd-282a2f4cce97\"]},{\"value\":\"Confirm PIN or Password lock \\\"2468\\\"\",\"id\":\"bc9471bc-a314-40a4-952b-24a9d2db4974\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bc9471bc-a314-40a4-952b-24a9d2db4974\"]},{\"value\":\"Enter PIN or Password \\\"2468\\\"\",\"id\":\"b9e13d9a-43e6-44b0-a3f6-48b3de93d39a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b9e13d9a-43e6-44b0-a3f6-48b3de93d39a\"]},{\"value\":\"Random select 2 lock type\",\"id\":\"0e190c32-3e45-4bd4-8d81-8eab2da1758e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0e190c32-3e45-4bd4-8d81-8eab2da1758e\"]},{\"value\":\"Random select 3 lock type\",\"id\":\"796b7e21-e7e7-4631-8bc3-72894b072e96\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"796b7e21-e7e7-4631-8bc3-72894b072e96\"]},{\"value\":\"Set new Password Complexity Test\",\"id\":\"94ACDD0A-CA2E-4101-95B3-033C9D5D00E1\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Click Clear button\",\"id\":\"c3259a91-454a-42a5-b169-2d282d70f076\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c3259a91-454a-42a5-b169-2d282d70f076\"]},{\"value\":\"Click Continue without Pixel Imprint or Continue without face unlock\",\"id\":\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"27b9a87d-9b7b-4f55-a259-45a91ee67a64\"]},{\"value\":\"Confirm PIN lock \\\"14725836\\\"\",\"id\":\"ffe766f2-11f5-449d-9b89-e5ff06f5a835\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ffe766f2-11f5-449d-9b89-e5ff06f5a835\"]},{\"value\":\"Confirm PIN lock \\\"1688\\\"\",\"id\":\"67230d49-da52-4a23-a712-504be0de8619\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"67230d49-da52-4a23-a712-504be0de8619\"]},{\"value\":\"Confirm Password lock \\\"a14725836\\\"\",\"id\":\"8539b68d-cf4f-4158-aeb6-2867807e7574\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8539b68d-cf4f-4158-aeb6-2867807e7574\"]},{\"value\":\"Confirm Password lock \\\"a1688\\\"\",\"id\":\"658953ad-c875-417b-87a1-5c75ca2fff86\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"658953ad-c875-417b-87a1-5c75ca2fff86\"]},{\"value\":\"Enter PIN number \\\"14725836\\\"\",\"id\":\"af677fa8-0e4c-4c4e-9159-f91129b44e83\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"af677fa8-0e4c-4c4e-9159-f91129b44e83\"]},{\"value\":\"Enter PIN number \\\"1688\\\"\",\"id\":\"8373f761-9983-4688-b193-59c4bc7a9bd3\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8373f761-9983-4688-b193-59c4bc7a9bd3\"]},{\"value\":\"Enter password \\\"a14725836\\\"\",\"id\":\"3935709f-effe-474a-96d0-07dd056d34f9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3935709f-effe-474a-96d0-07dd056d34f9\"]},{\"value\":\"Enter password \\\"a1688\\\"\",\"id\":\"c9423320-3e9d-40ed-8a84-957a48931121\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c9423320-3e9d-40ed-8a84-957a48931121\"]},{\"value\":\"Verify if set PIN screen appear, set PIN to \\\"1688\\\"\",\"id\":\"2c2679b8-694c-4f76-9e68-e769699ab06a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2c2679b8-694c-4f76-9e68-e769699ab06a\"]},{\"value\":\"Verify if set PIN screen appear, set PIN to \\\"14725836\\\"\",\"id\":\"675d3384-df03-4693-9846-646f622b5ce0\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"675d3384-df03-4693-9846-646f622b5ce0\"]},{\"value\":\"Verify if set Password appear, set password to \\\"a14725836\\\"\",\"id\":\"7966cf53-7a34-44cc-9193-2c7dd347fe81\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7966cf53-7a34-44cc-9193-2c7dd347fe81\"]},{\"value\":\"Verify if set Password screen appear, set password to \\\"a1688\\\"\",\"id\":\"f9ed0da0-0e19-4117-8b66-467e80d9285c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"f9ed0da0-0e19-4117-8b66-467e80d9285c\"]},{\"value\":\"Verify that not allowed message of PIN lock\",\"id\":\"2b20f950-6cf8-4040-93c8-a51819425441\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2b20f950-6cf8-4040-93c8-a51819425441\"]},{\"value\":\"Verify that not allowed message of password lock\",\"id\":\"91970b4b-d060-46b2-bbd3-d8042def443a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"91970b4b-d060-46b2-bbd3-d8042def443a\"]}]},{\"value\":\"Verify if set PIN or Password screen appear, set password to \\\"1234\\\"\",\"id\":\"2090e04a-10af-4fc3-8149-1f22a584eb67\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2090e04a-10af-4fc3-8149-1f22a584eb67\"]},{\"value\":\"Verify if set PIN or Password screen appear, set password to \\\"2468\\\"\",\"id\":\"0bb19e90-9994-4d49-9188-fe2405a8dc37\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0bb19e90-9994-4d49-9188-fe2405a8dc37\"]},{\"value\":\"Verify if set pattern lock appear, set pattern\",\"id\":\"06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"06f4ee63-7ae5-4c0a-b4e8-56fa7a21f33a\"]}]},{\"value\":\"test-Keyguard Password Verification\",\"id\":\"935be38e-341a-455b-a52d-709e620f3641\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"935be38e-341a-455b-a52d-709e620f3641\"]},{\"value\":\"test_CA Cert install via intent\",\"id\":\"d36bec86-b515-4a70-9f5e-2dfcce3d0306\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d36bec86-b515-4a70-9f5e-2dfcce3d0306\"]},{\"value\":\"test_KeyChain Storage Test\",\"id\":\"c0787b92-a6be-4e72-a8b9-7b99d133be03\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c0787b92-a6be-4e72-a8b9-7b99d133be03\"]},{\"value\":\"test_Set New Password Complexity Test\",\"id\":\"992e890c-3aa6-43e1-9940-2a9f042811d6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"992e890c-3aa6-43e1-9940-2a9f042811d6\"]}]},{\"value\":\"Sensors\",\"id\":\"89A2ACA9-F8DA-41FA-84FE-EA921F6B8829\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"C008FCA1-7ED0-4C80-A3DF-D7F609DE2705\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Off Body Sensor Tests\",\"id\":\"59D8230C-CD89-471C-A923-443D32965C58\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Activate this device admin app - Sensor\",\"id\":\"59dc74cf-f26b-4e66-85e1-4fb8ce477ae9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"59dc74cf-f26b-4e66-85e1-4fb8ce477ae9\"]},{\"value\":\"Deactivate this device admin app - Sensor\",\"id\":\"dc47dc72-9a74-4b16-9c5f-4d2cd0560854\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"dc47dc72-9a74-4b16-9c5f-4d2cd0560854\"]},{\"value\":\"Sensor presetting\",\"id\":\"49d12aa6-c679-44be-ba72-a6c46a5cd4d7\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"49d12aa6-c679-44be-ba72-a6c46a5cd4d7\"]},{\"value\":\"Sensor teardown\",\"id\":\"49c301ea-be46-4ac5-87fc-21262da2994c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"49c301ea-be46-4ac5-87fc-21262da2994c\"]},{\"value\":\"Turn Adaptive Brightness off\",\"id\":\"1013c0fa-aac7-432d-aed1-e33c58b4d603\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1013c0fa-aac7-432d-aed1-e33c58b4d603\"]},{\"value\":\"Turn Adaptive Brightness on\",\"id\":\"87aa94cd-e4ba-4453-9d58-267514ce16bb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"87aa94cd-e4ba-4453-9d58-267514ce16bb\"]},{\"value\":\"Turn Auto-rotate off\",\"id\":\"2468d1f3-142c-41da-b713-09b253fe81f6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"2468d1f3-142c-41da-b713-09b253fe81f6\"]},{\"value\":\"Turn Auto-rotate on\",\"id\":\"d3450ee9-4ee0-4753-bb29-15c5b3906285\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d3450ee9-4ee0-4753-bb29-15c5b3906285\"]},{\"value\":\"Turn Locaion on\",\"id\":\"59eff0da-e8a3-4322-9f00-9a3bd9237e10\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"59eff0da-e8a3-4322-9f00-9a3bd9237e10\"]},{\"value\":\"Turn Location off\",\"id\":\"050ca8c7-6332-41f5-af2b-8a02b680bf14\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"050ca8c7-6332-41f5-af2b-8a02b680bf14\"]},{\"value\":\"Turn Stay awake off\",\"id\":\"b6c8e3c8-6ab1-4886-8f5e-037dd9346a51\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b6c8e3c8-6ab1-4886-8f5e-037dd9346a51\"]},{\"value\":\"Turn Stay awake on\",\"id\":\"96f52bf6-6606-42ab-8b3a-fd6c554ea30a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"96f52bf6-6606-42ab-8b3a-fd6c554ea30a\"]},{\"value\":\"Turn off airplane mode\",\"id\":\"caa6ccab-46bc-4259-abd1-dabe145e275a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"caa6ccab-46bc-4259-abd1-dabe145e275a\"]},{\"value\":\"Turn on airplane mode\",\"id\":\"460b5da5-d44f-4f91-ad3a-68715ff4684c\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"460b5da5-d44f-4f91-ad3a-68715ff4684c\"]}]}]},{\"value\":\"test_6DoF Test\",\"id\":\"65349586-080c-4006-843f-5d5d8b9e9cd9\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"65349586-080c-4006-843f-5d5d8b9e9cd9\"]},{\"value\":\"test_Off Body Sensor Tests\",\"id\":\"c7a524d7-b4b3-4e41-a6ae-2deaa4af43e5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"c7a524d7-b4b3-4e41-a6ae-2deaa4af43e5\"]}]},{\"value\":\"Telecom\",\"id\":\"87EF0028-2A22-43FD-94DE-4B51C6584726\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"D64ED4CE-24F8-4AB6-88C9-1C94CBCEA4E4\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Enable calling account\",\"id\":\"645e8103-d449-40d0-abba-6d734e783792\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"645e8103-d449-40d0-abba-6d734e783792\"]}]},{\"value\":\"test_Telecom Enable Phone Account Test\",\"id\":\"e7c7dfa6-ef14-40bd-8f3d-dc7fac99aefe\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e7c7dfa6-ef14-40bd-8f3d-dc7fac99aefe\"]},{\"value\":\"test_Telecom Outgoing Call Test\",\"id\":\"b3a44797-fe64-4100-8e0e-9ccbd497c945\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b3a44797-fe64-4100-8e0e-9ccbd497c945\"]}]},{\"value\":\"Telephony\",\"id\":\"8AF3FB05-F534-48B7-9B8D-B19378F4DBD7\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"B945FC9E-2CE7-4AD5-ABDB-82156881269C\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Hide settings in voicemail test\",\"id\":\"3EF127E3-967C-4613-AAF3-53E2BC52824E\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Check if \\\"ring\\\", \\\"vibration\\\" setting is hidden\",\"id\":\"838a9611-4bf1-4317-8599-98f7e872efdb\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"838a9611-4bf1-4317-8599-98f7e872efdb\"]},{\"value\":\"If \\\"Advanced Settings\\\" exists do the following actions\",\"id\":\"34391efa-20da-4c54-a657-418d1b4a5ddd\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"34391efa-20da-4c54-a657-418d1b4a5ddd\"]}]},{\"value\":\"Hide voicemail in call settings test\",\"id\":\"10AD5F43-16FA-4F91-BEBE-D1D6E2DF89DD\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Set CTS Verifier as your default phone app?\",\"id\":\"8e5815c6-e55c-4dce-8aeb-8b2a62898a6a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"8e5815c6-e55c-4dce-8aeb-8b2a62898a6a\"]}]}]},{\"value\":\"test_Hide settings in voicemail test(Check image)\",\"id\":\"44fc4c64-e1d3-4482-8b56-b1c0c547722d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"44fc4c64-e1d3-4482-8b56-b1c0c547722d\"]},{\"value\":\"test_Hide voicemail in call settings test(Check image)\",\"id\":\"3c16507a-cc79-4124-a23e-b402ec47f45b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"3c16507a-cc79-4124-a23e-b402ec47f45b\"]},{\"value\":\"test_System Implements Telecom Intents\",\"id\":\"24c45902-8535-4376-b06f-88f06b115ca6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"24c45902-8535-4376-b06f-88f06b115ca6\"]}]},{\"value\":\"Tiles\",\"id\":\"C81DC175-2E1E-4F9A-BE51-817F46C56248\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"A940C4EA-5856-4F5A-A9C4-BE0BDA5C3943\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Assert absent for Tile Service for CTS Verifier \",\"id\":\"6f268fc7-772a-426d-ab18-4e9b2eefa03e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"6f268fc7-772a-426d-ab18-4e9b2eefa03e\"]},{\"value\":\"Assert present for Tile Service for CTS Verifier \",\"id\":\"5f45dc78-6a4a-4b87-b860-01e0c4b7a04d\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5f45dc78-6a4a-4b87-b860-01e0c4b7a04d\"]}]},{\"value\":\"test_Tile Service Test\",\"id\":\"020685b0-8828-4ca8-be07-4146718f24fe\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"020685b0-8828-4ca8-be07-4146718f24fe\"]}]},{\"value\":\"Utility\",\"id\":\"35A27E79-F9EC-46A0-A35C-29CAB676C5FB\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"General\",\"id\":\"07177D14-5C80-4653-A5D5-32420459E5B0\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Close CTS-V\",\"id\":\"023dd500-a856-4a6e-a2bb-a94d616de615\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"023dd500-a856-4a6e-a2bb-a94d616de615\"]},{\"value\":\"Close Settings\",\"id\":\"700c10f3-2945-460b-bc5a-dc5a5fdc0f96\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"700c10f3-2945-460b-bc5a-dc5a5fdc0f96\"]},{\"value\":\"Collapse status bar\",\"id\":\"31902e22-dd19-4a14-9a1f-5bca034bacd5\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"31902e22-dd19-4a14-9a1f-5bca034bacd5\"]},{\"value\":\"Disable CTS-V admin\",\"id\":\"b531da69-1e61-4e75-a6b1-7e005df80c7b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b531da69-1e61-4e75-a6b1-7e005df80c7b\"]},{\"value\":\"Dismiss instructions\",\"id\":\"1601f323-e824-4190-9ee0-350f0a1149ea\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"1601f323-e824-4190-9ee0-350f0a1149ea\"]},{\"value\":\"Login Gmail\",\"id\":\"23c5fa74-3416-4a41-84a9-3f348940a081\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"23c5fa74-3416-4a41-84a9-3f348940a081\"]},{\"value\":\"Open CTS-V\",\"id\":\"d725d8a2-cb38-4a29-9857-a510943cf7fd\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d725d8a2-cb38-4a29-9857-a510943cf7fd\"]},{\"value\":\"Open Notifications status bar\",\"id\":\"15c75efc-b173-4eed-9a2c-164886355c98\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"15c75efc-b173-4eed-9a2c-164886355c98\"]},{\"value\":\"Open Settings\",\"id\":\"9be89845-047e-4ef4-98dc-caa8cd186c76\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"9be89845-047e-4ef4-98dc-caa8cd186c76\"]},{\"value\":\"Open quick settings\",\"id\":\"bc4f5534-26cb-4b19-b548-609b6c8e326e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"bc4f5534-26cb-4b19-b548-609b6c8e326e\"]},{\"value\":\"Press Back key 5 times\",\"id\":\"370c511c-5950-4b3a-b832-60f2a606a27a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"370c511c-5950-4b3a-b832-60f2a606a27a\"]},{\"value\":\"Press Back key 6 times\",\"id\":\"b50df53e-f816-49d2-b907-500f3f4f3b5a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b50df53e-f816-49d2-b907-500f3f4f3b5a\"]},{\"value\":\"Press back key 3 times\",\"id\":\"da770381-d17c-48ca-8aba-def4338ef96b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"da770381-d17c-48ca-8aba-def4338ef96b\"]},{\"value\":\"Press back key 4 times\",\"id\":\"5cab765b-34d5-4922-a223-6322eaf241ae\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"5cab765b-34d5-4922-a223-6322eaf241ae\"]},{\"value\":\"Screen on device\",\"id\":\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"ec014d61-87cd-4f31-bd58-01ea49f2fe46\"]},{\"value\":\"Slide up to unlock screen\",\"id\":\"6c314101-5195-49ff-88e9-8f78cc8c697b\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"6c314101-5195-49ff-88e9-8f78cc8c697b\"]},{\"value\":\"Start CTS-V\",\"id\":\"863293b0-236f-46c2-9707-f3bf141fc9f8\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"863293b0-236f-46c2-9707-f3bf141fc9f8\"]},{\"value\":\"Tap center of screen\",\"id\":\"9b9343fa-a795-4169-883b-32dca700c4b6\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"9b9343fa-a795-4169-883b-32dca700c4b6\"]},{\"value\":\"Validate Pass button\",\"id\":\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"41618467-e1d1-4cb0-ba3c-c3230a3442bf\"]}]},{\"value\":\"Settings\",\"id\":\"1F1B2765-ED32-41C8-B1E0-DFF2F53457EB\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Check if \\\"Advanced\\\" exists\",\"id\":\"a3737847-5957-4a6a-a50c-242e80b93d8a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a3737847-5957-4a6a-a50c-242e80b93d8a\"]},{\"value\":\"Launch Apps & notifcations\",\"id\":\"b9b98f7c-9a8d-4282-bd0f-1b4b81eac080\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"b9b98f7c-9a8d-4282-bd0f-1b4b81eac080\"]},{\"value\":\"Launch Device admin apps\",\"id\":\"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"e85d4353-bdbe-4671-9f3f-b94ec6b06b0e\"]},{\"value\":\"Launch Gestures settings\",\"id\":\"514adc8f-fe99-4674-89cf-24028055b96e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"514adc8f-fe99-4674-89cf-24028055b96e\"]},{\"value\":\"Launch Location settings\",\"id\":\"31d97492-1de9-41be-8213-c67eb06406b1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"31d97492-1de9-41be-8213-c67eb06406b1\"]},{\"value\":\"Launch Multiple users page\",\"id\":\"12e01265-ef71-4a9b-92fa-96edbbf0df2a\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"12e01265-ef71-4a9b-92fa-96edbbf0df2a\"]},{\"value\":\"Launch Reset options page\",\"id\":\"d7cdb82c-060e-4a47-83c1-c1b9f6396683\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"d7cdb82c-060e-4a47-83c1-c1b9f6396683\"]},{\"value\":\"Launch Screen lock setting page\",\"id\":\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0ce4e1fa-96a5-4d0d-aa86-a410676c6bf7\"]},{\"value\":\"Launch Sound settings\",\"id\":\"0009ed57-c961-41b7-bcbe-d71e6f0abac1\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"0009ed57-c961-41b7-bcbe-d71e6f0abac1\"]},{\"value\":\"Launch screen lock message setting page\",\"id\":\"860c941f-b0ac-4251-9e2d-78cab6e65c90\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"860c941f-b0ac-4251-9e2d-78cab6e65c90\"]},{\"value\":\"New_Launch Accounts\",\"id\":\"7b8a5983-efee-45ea-aaa2-9aaf6d82e063\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"7b8a5983-efee-45ea-aaa2-9aaf6d82e063\"]}]}]},{\"value\":\"VR\",\"id\":\"BD2D8BBB-5CB4-4F03-A146-32377F03BEA6\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"CPD\",\"id\":\"F15B7E6E-F92A-42A9-B776-F396E07381B7\",\"emitLoadNextLevel\":false,\"children\":[{\"value\":\"Launch (VR) Settings/ VR mode activity\",\"id\":\"04292ddc-e958-49b5-8fd7-a4dd0cf8ff43\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"04292ddc-e958-49b5-8fd7-a4dd0cf8ff43\"]}]},{\"value\":\"test_VR Tests\",\"id\":\"a0c5135b-fa0e-4dc2-99be-662638d5c19e\",\"emitLoadNextLevel\":false,\"children\":[],\"additionalData\":[\"a0c5135b-fa0e-4dc2-99be-662638d5c19e\"]}]}]}]}","created_by":"riacheltseng","created_at":1607072064.000000000}
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/OWNERS b/tools/cts-verifier-automation/OWNERS
deleted file mode 100644
index 11df4a6..0000000
--- a/tools/cts-verifier-automation/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-normancheung@google.com
-pololee@google.com
-riacheltseng@google.com
-sunvincent@google.com
\ No newline at end of file
diff --git a/tools/cts-verifier-automation/README b/tools/cts-verifier-automation/README
deleted file mode 100644
index 76b39cc..0000000
--- a/tools/cts-verifier-automation/README
+++ /dev/null
@@ -1,9 +0,0 @@
-CTS Verifier Automation
----------------------
-
-This is a set of configurable automated testcases to help in reducing the manual effort for
-executing CTS-Verifier.
-These cases are intended to be used with UIConductor (https://github.com/google/android-uiconductor)
-
-The cases are designed to be easily modified for custom implemented Android user interfaces,
-focusing on the modifications to global variables which affect how the testcases use UI elements.
\ No newline at end of file
diff --git a/tools/utils/java-cert-list-generator.sh b/tools/utils/java-cert-list-generator.sh
index 1f33c4a..b69bec6 100755
--- a/tools/utils/java-cert-list-generator.sh
+++ b/tools/utils/java-cert-list-generator.sh
@@ -40,14 +40,12 @@
*/
package android.security.cts;
-import android.platform.test.annotations.SecurityTest;
/**
* Run "./cts/tools/utils/java-cert-list-generator.sh >
* cts/tests/tests/security/src/android/security/cts/CertificateData.java"
* to generate this file.
*/
-@SecurityTest
class CertificateData {
static final String[] CERTIFICATE_DATA = {
STARTCLASS