diff --git a/tests/Android.bp b/tests/Android.bp index e7f408487d..135a6e009a 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -58,6 +58,7 @@ filegroup { "src/com/android/launcher3/util/rule/SimpleActivityRule.java", "src/com/android/launcher3/util/rule/TestStabilityRule.java", "src/com/android/launcher3/util/rule/TISBindRule.java", + "src/com/android/launcher3/util/viewcapture_analysis/*.java", "src/com/android/launcher3/testcomponent/BaseTestingActivity.java", "src/com/android/launcher3/testcomponent/OtherBaseTestingActivity.java", "src/com/android/launcher3/testcomponent/CustomShortcutConfigActivity.java", diff --git a/tests/src/com/android/launcher3/util/rule/ViewCaptureRule.kt b/tests/src/com/android/launcher3/util/rule/ViewCaptureRule.kt index 8e2aea8ff0..b2a2f7f64a 100644 --- a/tests/src/com/android/launcher3/util/rule/ViewCaptureRule.kt +++ b/tests/src/com/android/launcher3/util/rule/ViewCaptureRule.kt @@ -24,6 +24,7 @@ import com.android.app.viewcapture.SimpleViewCapture import com.android.app.viewcapture.ViewCapture.MAIN_EXECUTOR import com.android.app.viewcapture.data.ExportedData import com.android.launcher3.util.ActivityLifecycleCallbacksAdapter +import com.android.launcher3.util.viewcapture_analysis.ViewCaptureAnalyzer import java.util.function.Supplier import org.junit.rules.TestRule import org.junit.runner.Description @@ -82,6 +83,8 @@ class ViewCaptureRule(var alreadyOpenActivitySupplier: Supplier) : Te // is removed while onDraw is running, resulting in an IllegalStateException. MAIN_EXECUTOR.execute { windowListenerCloseables.onEach(SafeCloseable::close) } } + + ViewCaptureAnalyzer.assertNoAnomalies(viewCaptureData) } private fun startCapture( diff --git a/tests/src/com/android/launcher3/util/viewcapture_analysis/AlphaJumpDetector.java b/tests/src/com/android/launcher3/util/viewcapture_analysis/AlphaJumpDetector.java index e40fb79b1b..2501801c42 100644 --- a/tests/src/com/android/launcher3/util/viewcapture_analysis/AlphaJumpDetector.java +++ b/tests/src/com/android/launcher3/util/viewcapture_analysis/AlphaJumpDetector.java @@ -28,33 +28,101 @@ import java.util.Set; * Invisible views are treated as if they had zero alpha. */ final class AlphaJumpDetector extends AnomalyDetector { + // Commonly used parts of the paths to ignore. + private static final String CONTENT = "DecorView|LinearLayout|FrameLayout:id/content|"; + private static final String DRAG_LAYER = + CONTENT + "LauncherRootView:id/launcher|DragLayer:id/drag_layer|"; + // Paths of nodes that are excluded from analysis. private static final Collection PATHS_TO_IGNORE = Set.of( - "DecorView|LinearLayout|FrameLayout:id/content|LauncherRootView:id/launcher|DragLayer" - + ":id/drag_layer|SearchContainerView:id/apps_view|SearchRecyclerView:id" - + "/search_results_list_view|SearchResultSmallIconRow", - "DecorView|LinearLayout|FrameLayout:id/content|LauncherRootView:id/launcher|DragLayer" - + ":id/drag_layer|SearchContainerView:id/apps_view|SearchRecyclerView:id" - + "/search_results_list_view|SearchResultIcon", - "DecorView|LinearLayout|FrameLayout:id/content|LauncherRootView:id/launcher|DragLayer" - + ":id/drag_layer|LauncherRecentsView:id/overview_panel|TaskView", - "DecorView|LinearLayout|FrameLayout:id/content|LauncherRootView:id/launcher|DragLayer" - + ":id/drag_layer|WidgetsFullSheet|SpringRelativeLayout:id/container" - + "|WidgetsRecyclerView:id/primary_widgets_list_view|WidgetsListHeader:id" - + "/widgets_list_header", - "DecorView|LinearLayout|FrameLayout:id/content|LauncherRootView:id/launcher|DragLayer" - + ":id/drag_layer|WidgetsFullSheet|SpringRelativeLayout:id/container" - + "|WidgetsRecyclerView:id/primary_widgets_list_view" - + "|StickyHeaderLayout$EmptySpaceView", - "DecorView|LinearLayout|FrameLayout:id/content|LauncherRootView:id/launcher|DragLayer" - + ":id/drag_layer|SearchContainerView:id/apps_view|AllAppsRecyclerView:id" - + "/apps_list_view|BubbleTextView:id/icon", - "DecorView|LinearLayout|FrameLayout:id/content|LauncherRootView:id/launcher|DragLayer" - + ":id/drag_layer|LauncherRecentsView:id/overview_panel|ClearAllButton:id" - + "/clear_all", - "DecorView|LinearLayout|FrameLayout:id/content|LauncherRootView:id/launcher|DragLayer" - + ":id/drag_layer|NexusOverviewActionsView:id/overview_actions_view" - + "|LinearLayout:id/action_buttons" + CONTENT + + "AddItemDragLayer:id/add_item_drag_layer|AddItemWidgetsBottomSheet:id" + + "/add_item_bottom_sheet|LinearLayout:id/add_item_bottom_sheet_content" + + "|ScrollView:id/widget_preview_scroll_view|WidgetCell:id/widget_cell" + + "|WidgetCellPreview:id/widget_preview_container|ImageView:id/widget_badge", + CONTENT + + "AddItemDragLayer:id/add_item_drag_layer|AddItemWidgetsBottomSheet:id" + + "/add_item_bottom_sheet|LinearLayout:id/add_item_bottom_sheet_content" + + "|ScrollView:id/widget_preview_scroll_view|WidgetCell:id/widget_cell" + + "|WidgetCellPreview:id/widget_preview_container|WidgetCell$1|FrameLayout" + + "|ImageView:id/icon", + CONTENT + "AddItemDragLayer:id/add_item_drag_layer|View", + DRAG_LAYER + + "AppWidgetResizeFrame|FrameLayout|ImageButton:id/widget_reconfigure_button", + DRAG_LAYER + + "AppWidgetResizeFrame|FrameLayout|ImageView:id/widget_resize_bottom_handle", + DRAG_LAYER + "AppWidgetResizeFrame|FrameLayout|ImageView:id/widget_resize_frame", + DRAG_LAYER + "AppWidgetResizeFrame|FrameLayout|ImageView:id/widget_resize_left_handle", + DRAG_LAYER + "AppWidgetResizeFrame|FrameLayout|ImageView:id/widget_resize_right_handle", + DRAG_LAYER + "AppWidgetResizeFrame|FrameLayout|ImageView:id/widget_resize_top_handle", + DRAG_LAYER + "FloatingTaskView|FloatingTaskThumbnailView:id/thumbnail", + DRAG_LAYER + "FloatingTaskView|SplitPlaceholderView:id/split_placeholder", + DRAG_LAYER + "Folder|FolderPagedView:id/folder_content", + DRAG_LAYER + "LauncherAllAppsContainerView:id/apps_view", + DRAG_LAYER + "LauncherDragView", + DRAG_LAYER + "LauncherRecentsView:id/overview_panel", + DRAG_LAYER + + "NexusOverviewActionsView:id/overview_actions_view|FrameLayout:id" + + "/select_mode_buttons|ImageButton:id/close", + DRAG_LAYER + + "NexusOverviewActionsView:id/overview_actions_view|LinearLayout:id" + + "/action_buttons|Button:id/action_screenshot", + DRAG_LAYER + + "NexusOverviewActionsView:id/overview_actions_view|LinearLayout:id" + + "/action_buttons|Button:id/action_select", + DRAG_LAYER + + "NexusOverviewActionsView:id/overview_actions_view|LinearLayout:id" + + "/action_buttons|Button:id/action_split", + DRAG_LAYER + + "NexusOverviewActionsView:id/overview_actions_view|LinearLayout:id" + + "/action_buttons|Space:id/action_split_space", + DRAG_LAYER + + "PopupContainerWithArrow:id/popup_container|LinearLayout:id" + + "/deep_shortcuts_container|DeepShortcutView:id/deep_shortcut_material" + + "|DeepShortcutTextView:id/bubble_text", + DRAG_LAYER + + "PopupContainerWithArrow:id/popup_container|LinearLayout:id" + + "/deep_shortcuts_container|DeepShortcutView:id/deep_shortcut_material|View" + + ":id/icon", + DRAG_LAYER + + "PopupContainerWithArrow:id/popup_container|LinearLayout:id" + + "/system_shortcuts_container|DeepShortcutView:id/system_shortcut" + + "|BubbleTextView:id/bubble_text", + DRAG_LAYER + + "PopupContainerWithArrow:id/popup_container|LinearLayout:id" + + "/system_shortcuts_container|DeepShortcutView:id/system_shortcut|View:id" + + "/icon", + DRAG_LAYER + + "PopupContainerWithArrow:id/popup_container|LinearLayout:id" + + "/system_shortcuts_container|ImageView", + DRAG_LAYER + + "PopupContainerWithArrow:id/popup_container|LinearLayout:id" + + "/widget_shortcut_container|DeepShortcutView:id/system_shortcut" + + "|BubbleTextView:id/bubble_text", + DRAG_LAYER + + "PopupContainerWithArrow:id/popup_container|LinearLayout:id" + + "/widget_shortcut_container|DeepShortcutView:id/system_shortcut|View:id/icon", + DRAG_LAYER + "SearchContainerView:id/apps_view", + DRAG_LAYER + "Snackbar|TextView:id/action", + DRAG_LAYER + "Snackbar|TextView:id/label", + DRAG_LAYER + "SplitInstructionsView|AppCompatTextView:id/split_instructions_text", + DRAG_LAYER + "TaskMenuView|LinearLayout:id/menu_option_layout", + DRAG_LAYER + "TaskMenuView|TextView:id/task_name", + DRAG_LAYER + "View", + DRAG_LAYER + "WidgetsFullSheet|SpringRelativeLayout:id/container", + DRAG_LAYER + "WidgetsTwoPaneSheet|SpringRelativeLayout:id/container", + CONTENT + "LauncherRootView:id/launcher|FloatingIconView", + CONTENT + + "LauncherRootView|RecentsDragLayer:id/drag_layer|FallbackRecentsView:id" + + "/overview_panel", + CONTENT + + "LauncherRootView|RecentsDragLayer:id/drag_layer|NexusOverviewActionsView" + + ":id/overview_actions_view|LinearLayout:id/action_buttons|Button:id" + + "/action_screenshot", + CONTENT + + "LauncherRootView|RecentsDragLayer:id/drag_layer|NexusOverviewActionsView" + + ":id/overview_actions_view|LinearLayout:id/action_buttons|Button:id" + + "/action_select" ); // Minimal increase or decrease of view's alpha between frames that triggers the error. private static final float ALPHA_JUMP_THRESHOLD = 1f;