Compare commits
48 Commits
746eeb767d
...
fix/purge-
| Author | SHA1 | Date | |
|---|---|---|---|
| 6abb519e3b | |||
| 4e91db01c9 | |||
| e55abc5a8a | |||
| 03105437b8 | |||
| b9c29a5a2d | |||
| 71310b8e84 | |||
| 073a90c38c | |||
| 44fae37cc7 | |||
| 48071cc9b8 | |||
| 10a85a91f1 | |||
| 5bf0053884 | |||
| a846462d02 | |||
| 0dbafd0a82 | |||
| 83e5b94ddf | |||
| dd8285e1ce | |||
| ac5d5351a6 | |||
| ad012b4cd4 | |||
| 5fcf1f180b | |||
| 9a74d89477 | |||
| dc4b576bc1 | |||
| e94dfe8c5c | |||
| 7aa6bfccf6 | |||
| 5fef014cb4 | |||
| 0bdfd999d2 | |||
| 4ad559e107 | |||
| f220e09193 | |||
| de2a1c104f | |||
| 52c553827f | |||
| cd64794f55 | |||
| bd9148e6e9 | |||
| 1e1bba6b16 | |||
| 2b992cf2a8 | |||
| c051c3a4c3 | |||
| 3006020106 | |||
| 3b9465a3bc | |||
| 5d50228945 | |||
| 7277f27fae | |||
| ee3de811d3 | |||
| c93333928a | |||
| 12937cb2c1 | |||
| 097a5753f9 | |||
| 9ee6aab831 | |||
| da804b174a | |||
| 93175b7caf | |||
| e37d92cdfd | |||
| 1c38dabe79 | |||
| 7b8daa7670 | |||
| a7449a1db3 |
3
.gitignore
vendored
@@ -10,6 +10,9 @@
|
||||
!test_config.yml
|
||||
*.json
|
||||
*.xml
|
||||
!tests/fixtures/*.xml
|
||||
!tests/fixtures/*.jpg
|
||||
!tests/fixtures/*.json
|
||||
logs/
|
||||
*.pyc
|
||||
__pycache__/
|
||||
|
||||
@@ -32,6 +32,20 @@ class CommentPlugin(BehaviorPlugin):
|
||||
if ctx.session_state.check_limit(SessionState.Limit.COMMENTS):
|
||||
return False
|
||||
|
||||
# Safety Guard: Do not comment on stories or grids
|
||||
xml_lower = (ctx.context_xml or "").lower()
|
||||
STORY_MARKERS = (
|
||||
"reel_viewer_media_layout",
|
||||
"reel_viewer_header",
|
||||
"reel_viewer_progress_bar",
|
||||
"reel_viewer_root",
|
||||
)
|
||||
if any(marker in xml_lower for marker in STORY_MARKERS):
|
||||
return False
|
||||
|
||||
if "explore_action_bar" in xml_lower or "profile_tabs_container" in xml_lower:
|
||||
return False
|
||||
|
||||
config = self.get_config(ctx)
|
||||
comment_pct = float(config.get("percentage", getattr(ctx.configs.args, "comment_percentage", 0))) / 100.0
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ class FollowPlugin(BehaviorPlugin):
|
||||
|
||||
nav_graph = QNavGraph(ctx.device)
|
||||
|
||||
if nav_graph.do("tap follow button"):
|
||||
if nav_graph.do("tap 'Follow' button"):
|
||||
logger.info(f"🤝 [Follow] Followed @{ctx.username} ✓")
|
||||
ctx.session_state.add_interaction(source=ctx.username, succeed=True, followed=True, scraped=False)
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ from time import sleep
|
||||
|
||||
from GramAddict.core.behaviors import BehaviorContext, BehaviorPlugin, BehaviorResult
|
||||
from GramAddict.core.diagnostic_dump import dump_ui_state
|
||||
from GramAddict.core.physics.humanized_input import humanized_scroll
|
||||
from GramAddict.core.situational_awareness import SituationalAwarenessEngine, SituationType
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
@@ -69,23 +68,4 @@ class ObstacleGuardPlugin(BehaviorPlugin):
|
||||
|
||||
return BehaviorResult(executed=True, should_skip=True) # Restart loop for same post or next
|
||||
|
||||
else: # SituationType.NORMAL
|
||||
nav_graph = ctx.cognitive_stack.get("nav_graph")
|
||||
current_state = nav_graph.current_state if nav_graph else "Unknown"
|
||||
|
||||
# The 'row_feed_button_like' marker is ONLY present in classic feeds.
|
||||
# Do not enforce this check for ReelsFeed, OwnProfile, FollowList, etc.
|
||||
classic_feed_states = ["home_feed", "HOME_FEED", "explore_feed", "EXPLORE_FEED", "user_feed", "USER_FEED"]
|
||||
|
||||
if "row_feed_button_like" not in xml and current_state in classic_feed_states:
|
||||
logger.info("🧩 [ObstacleGuard] Missing feed markers. Scrolling...")
|
||||
ctx.shared_state["consecutive_marker_misses"] = misses + 1
|
||||
if ctx.shared_state["consecutive_marker_misses"] >= 3:
|
||||
logger.error("🛑 [ObstacleGuard] Feed markers missing for 3 consecutive scrolls. Giving up.")
|
||||
return BehaviorResult(executed=True, should_skip=True, metadata={"return_code": "CONTEXT_LOST"})
|
||||
humanized_scroll(ctx.device)
|
||||
return BehaviorResult(executed=True, should_skip=True)
|
||||
else:
|
||||
ctx.shared_state["consecutive_marker_misses"] = 0
|
||||
|
||||
return BehaviorResult(executed=False)
|
||||
|
||||
@@ -21,6 +21,7 @@ from GramAddict.core.dojo_engine import DojoEngine
|
||||
|
||||
# Cognitive Stack
|
||||
from GramAddict.core.dopamine_engine import DopamineEngine
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
from GramAddict.core.growth_brain import GrowthBrain
|
||||
from GramAddict.core.log import configure_logger
|
||||
from GramAddict.core.perception.feed_analysis import (
|
||||
@@ -51,7 +52,6 @@ from GramAddict.core.physics.timing import (
|
||||
wait_for_story_loaded as _wait_for_story_loaded_impl,
|
||||
)
|
||||
from GramAddict.core.q_nav_graph import QNavGraph
|
||||
from GramAddict.core.resonance_engine import ResonanceEngine
|
||||
from GramAddict.core.sensors.honeypot_radome import HoneypotRadome
|
||||
from GramAddict.core.session_state import SessionState, SessionStateEncoder
|
||||
from GramAddict.core.swarm_protocol import SwarmProtocol
|
||||
@@ -177,16 +177,18 @@ def start_bot(**kwargs):
|
||||
)
|
||||
persona_interests = [p.strip() for p in persona_raw.split(",") if p.strip()] if persona_raw else []
|
||||
|
||||
from GramAddict.core.interaction import LLMWriter
|
||||
from GramAddict.core.qdrant_memory import DMMemoryDB, ParasocialCRMDB
|
||||
from GramAddict.core.resonance_engine import ResonanceEngine
|
||||
|
||||
dopamine = DopamineEngine()
|
||||
crm_db = ParasocialCRMDB()
|
||||
dm_memory_db = DMMemoryDB()
|
||||
resonance_oracle = ResonanceEngine(username, persona_interests=persona_interests, crm=crm_db)
|
||||
writer = LLMWriter(username, persona_interests, configs)
|
||||
active_inference = ActiveInferenceEngine(username)
|
||||
|
||||
# Core Autonomous Engines
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
|
||||
GoalExecutor.get_instance(device, username)
|
||||
zero_engine = ZeroLatencyEngine(device)
|
||||
@@ -238,6 +240,7 @@ def start_bot(**kwargs):
|
||||
"darwin": darwin,
|
||||
"crm": crm_db,
|
||||
"dm_memory": dm_memory_db,
|
||||
"writer": writer,
|
||||
}
|
||||
|
||||
from GramAddict.core.behaviors import PluginRegistry
|
||||
@@ -346,9 +349,7 @@ def start_bot(**kwargs):
|
||||
logger.info(
|
||||
f"🧠 [Agent Orchestrator] Session started. Strategy: {growth_brain.strategy} | Persona: {getattr(configs.args, 'agent_persona', 'unknown')}"
|
||||
)
|
||||
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
|
||||
# 1. Starten wir den GOAP Executor, um die UI-Struktur autonom zu erfassen
|
||||
goap = GoalExecutor.get_instance(device, username)
|
||||
|
||||
# --- PHASE 0: Autonomous Profile Scanning ---
|
||||
@@ -444,10 +445,13 @@ def start_bot(**kwargs):
|
||||
has_scanned_own_profile = True
|
||||
|
||||
while not dopamine.is_app_session_over():
|
||||
# 1. Ask the Growth Brain for a Desire
|
||||
current_desire = growth_brain.get_current_desire(dopamine)
|
||||
# 1. Ask the Growth Brain for a Strategic Objective
|
||||
success_rates = getattr(session_state, "successfulInteractions", {})
|
||||
current_goal = growth_brain.get_current_goal(
|
||||
dopamine, getattr(configs.args, "goals", []), success_rates=success_rates
|
||||
)
|
||||
|
||||
if current_desire == "ShiftContext":
|
||||
if current_goal == "ShiftContext":
|
||||
logger.info("🧠 [Free Will] Boredom critical. Forcing app restart to clear context.")
|
||||
device.app_stop(device.app_id)
|
||||
random_sleep(2.0, 4.0)
|
||||
@@ -456,13 +460,35 @@ def start_bot(**kwargs):
|
||||
dopamine.boredom = max(0.0, dopamine.boredom * 0.2)
|
||||
continue
|
||||
|
||||
# 2. Execution: GOAP Plan & Execute (Autonomous Mode)
|
||||
if getattr(configs.args, "goals", None):
|
||||
logger.info(f"🤖 Autonomous Mode Active. Delegating to GoalExecutor for: {current_goal}")
|
||||
|
||||
goal_executor = GoalExecutor(device=device, bot_username=getattr(configs.args, "username", ""))
|
||||
|
||||
result = goal_executor.achieve(current_goal)
|
||||
|
||||
if result:
|
||||
logger.info("✅ Goal achieved autonomously!")
|
||||
else:
|
||||
logger.warning(f"⚠️ Goal execution failed for: {current_goal}")
|
||||
|
||||
continue # The GoalExecutor handles navigation internally
|
||||
|
||||
# --- LEGACY PROCEDURAL FALLBACK (For config without goals) ---
|
||||
current_desire = current_goal
|
||||
|
||||
# 2. Map Desire to Sub-Feed
|
||||
target_map = {
|
||||
"DiscoverNewContent": ["ExploreFeed", "ReelsFeed"],
|
||||
"NurtureCommunity": ["HomeFeed", "StoriesFeed"],
|
||||
"SocialReciprocity": ["FollowingList", "MessageInbox"],
|
||||
"SocialReciprocity": ["FollowingList"],
|
||||
}
|
||||
|
||||
dm_config = configs.get_plugin_config("dm_reply")
|
||||
if dm_config.get("enabled", False):
|
||||
target_map["SocialReciprocity"].append("MessageInbox")
|
||||
|
||||
import secrets
|
||||
|
||||
options = target_map.get(current_desire, ["HomeFeed"])
|
||||
@@ -860,7 +886,11 @@ def _run_zero_latency_feed_loop(
|
||||
|
||||
elif governance_decision == "CHECK_CURIOSITY":
|
||||
logger.info("👀 [Curiosity] Spontaneously checking DMs / Notifications...")
|
||||
explore_target = random.choice(["MessageInbox", "Notifications"])
|
||||
dm_config = configs.get_plugin_config("dm_reply")
|
||||
if dm_config.get("enabled", False):
|
||||
explore_target = random.choice(["MessageInbox", "Notifications"])
|
||||
else:
|
||||
explore_target = "Notifications"
|
||||
|
||||
if explore_target == "MessageInbox":
|
||||
nav_graph.do("tap direct message icon inbox")
|
||||
|
||||
@@ -23,8 +23,12 @@ class Config:
|
||||
if is_pytest:
|
||||
self.args = []
|
||||
else:
|
||||
self.args = sys.argv
|
||||
self.args = list(sys.argv)
|
||||
self.module = False
|
||||
|
||||
if not self.module and "--config" not in self.args:
|
||||
if os.path.exists("config.yml"):
|
||||
self.args.extend(["--config", "config.yml"])
|
||||
self.config = None
|
||||
self.config_list = None
|
||||
self.actions = {}
|
||||
@@ -81,6 +85,9 @@ class Config:
|
||||
self.username = self.username[0]
|
||||
self.debug = self.config.get("debug", False)
|
||||
self.app_id = self.config.get("app_id", "com.instagram.android")
|
||||
|
||||
# Autonomous Agent Goals
|
||||
self.goals = self.config.get("goals", [])
|
||||
else:
|
||||
if "--debug" in self.args:
|
||||
self.debug = True
|
||||
@@ -142,7 +149,7 @@ class Config:
|
||||
self.parser.add_argument(
|
||||
"--blank-start",
|
||||
action="store_true",
|
||||
help="Wipe all learned navigation and telepathic memories on boot to start 100% blank.",
|
||||
help="Wipe all learned navigation and telepathic memories on boot to start 100%% blank.",
|
||||
)
|
||||
|
||||
# Interaction settings
|
||||
@@ -308,7 +315,7 @@ class Config:
|
||||
logger.debug(f"Arguments used: {' '.join(sys.argv[1:])}")
|
||||
if self.config:
|
||||
logger.debug(f"Config used: {self.config}")
|
||||
if len(sys.argv) <= 1:
|
||||
if len(sys.argv) <= 1 and not self.config:
|
||||
self.parser.print_help()
|
||||
exit(0)
|
||||
if self.config:
|
||||
|
||||
@@ -158,6 +158,10 @@ class DeviceFacade:
|
||||
def press(self, key):
|
||||
self.deviceV2.press(key)
|
||||
|
||||
@adb_retry()
|
||||
def back(self):
|
||||
self.deviceV2.press("back")
|
||||
|
||||
@adb_retry()
|
||||
def click(self, x=None, y=None, obj=None):
|
||||
if obj:
|
||||
|
||||
@@ -7,12 +7,50 @@ from GramAddict.core.session_state import SessionState
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Hard cap: maximum DM replies per inbox visit to prevent spam.
|
||||
MAX_REPLIES_PER_INBOX_VISIT = 3
|
||||
|
||||
# Sentinel values that indicate missing message context.
|
||||
_EMPTY_CONTEXT_SENTINELS = frozenset({"no previous context", "", "none", "n/a"})
|
||||
|
||||
|
||||
# Structural resource-IDs that indicate a real "Send" button.
|
||||
def _is_send_button(node: dict) -> bool:
|
||||
"""Semantic verification: returns True if the node is identified as a Send button."""
|
||||
desc = (node.get("description") or node.get("desc", "")).lower()
|
||||
text = (node.get("text") or "").lower()
|
||||
rid = (node.get("id") or node.get("resource_id", "")).lower()
|
||||
|
||||
# Accept if semantic markers indicate sending
|
||||
if any(m in rid for m in ["send", "composer_button"]):
|
||||
return True
|
||||
if any(m in desc for m in ["send", "absenden"]):
|
||||
return True
|
||||
if text == "send" or text == "absenden":
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def _run_zero_latency_dm_loop(device, zero_engine, nav_graph, configs, session_state, current_target, cognitive_stack):
|
||||
"""
|
||||
Executes the autonomous Direct Messaging logic in the Zero-Latency architecture.
|
||||
Assumes the bot is already at the "MessageInbox" UI state.
|
||||
|
||||
Safety guarantees:
|
||||
- Refuses to execute if dm_reply plugin is disabled in config.
|
||||
- Skips threads with no extractable text context.
|
||||
- Structurally verifies the Send button before logging success.
|
||||
- Hard-caps replies per inbox visit to MAX_REPLIES_PER_INBOX_VISIT.
|
||||
"""
|
||||
# ── Kill-Switch: Respect dm_reply.enabled config ──
|
||||
dm_plugin_config = configs.get_plugin_config("dm_reply")
|
||||
if not dm_plugin_config.get("enabled", False):
|
||||
logger.warning(
|
||||
"🛑 [DM Engine] dm_reply plugin is DISABLED in config. Refusing to process inbox.",
|
||||
extra={"color": f"{Fore.RED}"},
|
||||
)
|
||||
return "BOREDOM_CHANGE_FEED"
|
||||
|
||||
logger.info(
|
||||
f"🧠 [DM Engine] Initiating inbox processing in {current_target}...",
|
||||
extra={"color": f"{Style.BRIGHT}{Fore.CYAN}"},
|
||||
@@ -30,6 +68,7 @@ def _run_zero_latency_dm_loop(device, zero_engine, nav_graph, configs, session_s
|
||||
session_state.totalMessages = 0
|
||||
|
||||
failed_attempts = 0
|
||||
replies_this_visit = 0
|
||||
|
||||
while not dopamine.is_app_session_over():
|
||||
# Limits check
|
||||
@@ -44,16 +83,14 @@ def _run_zero_latency_dm_loop(device, zero_engine, nav_graph, configs, session_s
|
||||
xml_dump = device.dump_hierarchy()
|
||||
|
||||
# --- Zero Trust Structural Guard ---
|
||||
# -----------------------------------
|
||||
# ZERO TRUST STRUCTURAL GUARD
|
||||
# -----------------------------------
|
||||
# Validate we are actually in the Inbox or a Thread.
|
||||
# Hallucinations can lead to "Privacy Settings" or "Profile" screens.
|
||||
is_inbox = (
|
||||
'resource-id="com.instagram.android:id/inbox_refreshable_thread_list_recyclerview"' in xml_dump
|
||||
or 'resource-id="com.instagram.android:id/direct_inbox_action_bar"' in xml_dump
|
||||
)
|
||||
is_thread = 'resource-id="com.instagram.android:id/direct_thread_header"' in xml_dump
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity, ScreenType
|
||||
|
||||
identity_engine = ScreenIdentity(getattr(configs.args, "username", ""))
|
||||
screen_info = identity_engine.identify(xml_dump)
|
||||
|
||||
screen_type = screen_info["screen_type"]
|
||||
is_inbox = screen_type == ScreenType.DM_INBOX
|
||||
is_thread = screen_type == ScreenType.DM_THREAD
|
||||
|
||||
if is_thread:
|
||||
logger.warning("⚠️ [Structural Guard] DM Engine trapped in an open thread. Escaping...")
|
||||
@@ -63,9 +100,11 @@ def _run_zero_latency_dm_loop(device, zero_engine, nav_graph, configs, session_s
|
||||
sleep(1.5)
|
||||
continue
|
||||
|
||||
if not is_inbox and not is_thread:
|
||||
if not is_inbox:
|
||||
# We have drifted somewhere entirely alien (like Privacy Settings)
|
||||
logger.error("🛑 [Structural Guard] Alien context detected. Not in Inbox. Triggering CONTEXT_LOST.")
|
||||
logger.error(
|
||||
f"🛑 [Structural Guard] Alien context detected ({screen_type}). Not in Inbox. Triggering CONTEXT_LOST."
|
||||
)
|
||||
return "CONTEXT_LOST"
|
||||
# -----------------------------------
|
||||
|
||||
@@ -92,54 +131,80 @@ def _run_zero_latency_dm_loop(device, zero_engine, nav_graph, configs, session_s
|
||||
|
||||
logger.debug(f"Last received message context: {context_text}")
|
||||
|
||||
# Verify we aren't at limits before sending
|
||||
if not getattr(configs.args, "disable_ai_messaging", False):
|
||||
# Configure models
|
||||
model = getattr(configs.args, "ai_condenser_model", "llama3.2:1b")
|
||||
url = getattr(configs.args, "ai_condenser_url", "http://localhost:11434/api/generate")
|
||||
|
||||
# Generate response
|
||||
prompt = f"You are replying to a direct message on Instagram. The last message you received was: '{context_text}'. Keep it short, casual, and friendly. Do not use hashtags."
|
||||
|
||||
response_dict = query_llm(
|
||||
url=url,
|
||||
model=model,
|
||||
prompt=prompt,
|
||||
format_json=False,
|
||||
timeout=120,
|
||||
max_tokens=100,
|
||||
temperature=0.7,
|
||||
# ── Context Guard: Skip threads with no extractable message ──
|
||||
if context_text.strip().lower() in _EMPTY_CONTEXT_SENTINELS:
|
||||
logger.warning(
|
||||
"⏭️ [DM Engine] Thread has no extractable message context (story reply / media-only). Skipping."
|
||||
)
|
||||
device.press("back")
|
||||
sleep(1.5)
|
||||
continue
|
||||
|
||||
if response_dict and "response" in response_dict:
|
||||
response_text = response_dict["response"].strip()
|
||||
# Find the input field
|
||||
input_nodes = telepathic._extract_semantic_nodes(
|
||||
thread_xml, "find the message input text field", threshold=0.7
|
||||
# Verify we aren't at limits before sending
|
||||
# ── Iteration Cap: Prevent DM spam ──
|
||||
if replies_this_visit >= MAX_REPLIES_PER_INBOX_VISIT:
|
||||
logger.info(
|
||||
f"🛑 [DM Engine] Reached max replies per inbox visit ({MAX_REPLIES_PER_INBOX_VISIT}). Exiting."
|
||||
)
|
||||
device.press("back")
|
||||
sleep(1.0)
|
||||
return "BOREDOM_CHANGE_FEED"
|
||||
|
||||
# Configure models
|
||||
model = getattr(configs.args, "ai_condenser_model", "llama3.2:1b")
|
||||
url = getattr(configs.args, "ai_condenser_url", "http://localhost:11434/api/generate")
|
||||
|
||||
# Generate response
|
||||
prompt = f"You are replying to a direct message on Instagram. The last message you received was: '{context_text}'. Keep it short, casual, and friendly. Do not use hashtags."
|
||||
|
||||
response_dict = query_llm(
|
||||
url=url,
|
||||
model=model,
|
||||
prompt=prompt,
|
||||
format_json=False,
|
||||
timeout=120,
|
||||
max_tokens=100,
|
||||
temperature=0.7,
|
||||
)
|
||||
|
||||
if response_dict and "response" in response_dict:
|
||||
response_text = response_dict["response"].strip()
|
||||
# Find the input field
|
||||
input_nodes = telepathic._extract_semantic_nodes(
|
||||
thread_xml, "find the message input text field", threshold=0.7
|
||||
)
|
||||
if input_nodes and not input_nodes[0].get("skip"):
|
||||
in_node = input_nodes[0]
|
||||
_humanized_click(device, in_node["x"], in_node["y"])
|
||||
sleep(1.0)
|
||||
|
||||
# Type the message
|
||||
ghost_type(device, response_text, speed="fast")
|
||||
sleep(1.0)
|
||||
|
||||
# Find Send button
|
||||
send_xml = device.dump_hierarchy()
|
||||
send_nodes = telepathic._extract_semantic_nodes(
|
||||
send_xml, "find the send message button", threshold=0.8
|
||||
)
|
||||
if input_nodes and not input_nodes[0].get("skip"):
|
||||
in_node = input_nodes[0]
|
||||
_humanized_click(device, in_node["x"], in_node["y"])
|
||||
sleep(1.0)
|
||||
|
||||
# Type the message
|
||||
ghost_type(device, response_text, speed="fast")
|
||||
sleep(1.0)
|
||||
if send_nodes and not send_nodes[0].get("skip"):
|
||||
s_node = send_nodes[0]
|
||||
|
||||
# Find Send button
|
||||
send_xml = device.dump_hierarchy()
|
||||
send_nodes = telepathic._extract_semantic_nodes(
|
||||
send_xml, "find the send message button", threshold=0.8
|
||||
)
|
||||
|
||||
if send_nodes and not send_nodes[0].get("skip"):
|
||||
s_node = send_nodes[0]
|
||||
# ── Send Button Structural Verification ──
|
||||
if not _is_send_button(s_node):
|
||||
s_rid = s_node.get("original_attribs", {}).get("resource-id", "unknown")
|
||||
logger.warning(
|
||||
f"⚠️ [DM Engine] Refused to click non-Send element: {s_rid}. Aborting reply."
|
||||
)
|
||||
else:
|
||||
_humanized_click(device, s_node["x"], s_node["y"])
|
||||
logger.info(
|
||||
"✅ [DM Engine] Successfully sent a generated reply.", extra={"color": Fore.GREEN}
|
||||
"✅ [DM Engine] Successfully sent a generated reply.",
|
||||
extra={"color": Fore.GREEN},
|
||||
)
|
||||
|
||||
session_state.totalMessages += 1
|
||||
replies_this_visit += 1
|
||||
dm_memory = cognitive_stack.get("dm_memory")
|
||||
if dm_memory:
|
||||
dm_memory.log_sent_dm("unknown_target", response_text, "", [])
|
||||
@@ -150,10 +215,12 @@ def _run_zero_latency_dm_loop(device, zero_engine, nav_graph, configs, session_s
|
||||
|
||||
# If keyboard was open, the first back only closed it. Check if still in thread.
|
||||
check_xml = device.dump_hierarchy()
|
||||
if (
|
||||
'resource-id="com.instagram.android:id/direct_thread_header"' in check_xml
|
||||
or 'resource-id="com.instagram.android:id/row_thread_composer_edittext"' in check_xml
|
||||
):
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity, ScreenType
|
||||
|
||||
check_identity = ScreenIdentity(getattr(configs.args, "username", ""))
|
||||
check_screen = check_identity.identify(check_xml)
|
||||
|
||||
if check_screen["screen_type"] == ScreenType.DM_THREAD:
|
||||
device.press("back")
|
||||
sleep(1.0)
|
||||
|
||||
@@ -174,10 +241,12 @@ def _run_zero_latency_dm_loop(device, zero_engine, nav_graph, configs, session_s
|
||||
sleep(1.0)
|
||||
|
||||
check_xml = device.dump_hierarchy()
|
||||
if (
|
||||
'resource-id="com.instagram.android:id/direct_thread_header"' in check_xml
|
||||
or 'resource-id="com.instagram.android:id/row_thread_composer_edittext"' in check_xml
|
||||
):
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity, ScreenType
|
||||
|
||||
check_identity = ScreenIdentity(getattr(configs.args, "username", ""))
|
||||
check_screen = check_identity.identify(check_xml)
|
||||
|
||||
if check_screen["screen_type"] == ScreenType.DM_THREAD:
|
||||
device.press("back")
|
||||
sleep(1.0)
|
||||
|
||||
|
||||
@@ -17,15 +17,13 @@ import logging
|
||||
import time
|
||||
from typing import Any, Dict, List
|
||||
|
||||
from GramAddict.core.utils import random_sleep
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
from GramAddict.core.navigation.knowledge import NavigationKnowledge
|
||||
from GramAddict.core.navigation.path_memory import PathMemory
|
||||
from GramAddict.core.navigation.planner import GoalPlanner
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity, ScreenType
|
||||
from GramAddict.core.utils import random_sleep
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Re-export for backward compatibility (optional but helps minimize import breakage)
|
||||
__all__ = ["GoalExecutor", "ScreenIdentity", "ScreenType", "PathMemory", "NavigationKnowledge", "GoalPlanner"]
|
||||
@@ -119,10 +117,12 @@ class GoalExecutor:
|
||||
consecutive_back_presses = 0
|
||||
MAX_CONSECUTIVE_BACK = 3
|
||||
explored_nav_actions = set()
|
||||
visited_screens = set()
|
||||
for step_num in range(max_steps):
|
||||
# PERCEIVE
|
||||
screen = self.perceive()
|
||||
screen_type = screen["screen_type"]
|
||||
visited_screens.add(screen_type)
|
||||
|
||||
if last_screen_type and screen_type != last_screen_type:
|
||||
logger.debug(
|
||||
@@ -146,7 +146,7 @@ class GoalExecutor:
|
||||
screen["available_actions"] = masked_available
|
||||
|
||||
logger.debug(
|
||||
f"📍 [GOAP Step {step_num + 1}] On: {screen_type.value} | "
|
||||
f"📍 [GOAP Step {step_num + 1}] Goal: '{goal}' | On: {screen_type.value} | "
|
||||
f"Available: {screen.get('available_actions', [])[:5]}"
|
||||
)
|
||||
|
||||
@@ -173,7 +173,13 @@ class GoalExecutor:
|
||||
continue
|
||||
|
||||
# PLAN
|
||||
action = self.planner.plan_next_step(goal, screen, explored_nav_actions=explored_nav_actions, action_failures=self.action_failures)
|
||||
action = self.planner.plan_next_step(
|
||||
goal,
|
||||
screen,
|
||||
explored_nav_actions=explored_nav_actions,
|
||||
action_failures=self.action_failures,
|
||||
visited_screens=visited_screens,
|
||||
)
|
||||
|
||||
if action is None:
|
||||
# Goal achieved!
|
||||
@@ -199,6 +205,21 @@ class GoalExecutor:
|
||||
# Reset failures for this action since it eventually succeeded
|
||||
self.action_failures[action] = 0
|
||||
|
||||
if "scroll" in action.lower():
|
||||
logger.debug(
|
||||
"📍 [GOAP State] Scrolled successfully. Clearing explored actions to allow retrying off-screen elements."
|
||||
)
|
||||
explored_nav_actions.clear()
|
||||
# Keep action_failures for synthetic intents, but clear them for structural actions
|
||||
# so that the HD Map can retry route actions that might now be visible!
|
||||
from GramAddict.core.screen_topology import ScreenTopology
|
||||
|
||||
keys_to_clear = [
|
||||
k for k in self.action_failures.keys() if ScreenTopology.is_structural_action(screen_type, k)
|
||||
]
|
||||
for k in keys_to_clear:
|
||||
del self.action_failures[k]
|
||||
|
||||
# ── Back-Press Circuit Breaker ──
|
||||
if action == "press back":
|
||||
consecutive_back_presses += 1
|
||||
@@ -306,6 +327,25 @@ class GoalExecutor:
|
||||
self._get_sae().ensure_clear_screen(max_attempts=3)
|
||||
return False
|
||||
|
||||
# ── Pre-Click Semantic Match Guard ──
|
||||
# For toggle intents (follow/like/save), verify the selected node
|
||||
# semantically matches the intent BEFORE clicking. This prevents
|
||||
# VLM hallucinations from clicking photo grid items when looking
|
||||
# for follow buttons.
|
||||
from GramAddict.core.perception.action_memory import _intent_matches_node
|
||||
|
||||
node_semantic = (
|
||||
f"text: '{best_node.get('text', '')}', "
|
||||
f"desc: '{best_node.get('description', '')}', "
|
||||
f"id: '{best_node.get('id', '')}'"
|
||||
)
|
||||
if not _intent_matches_node(action, node_semantic):
|
||||
logger.warning(
|
||||
f"🛡️ [GOAP Execute] Pre-click rejection: node does not match intent '{action}'. "
|
||||
f"Node: {node_semantic}"
|
||||
)
|
||||
return False
|
||||
|
||||
# Execute click
|
||||
self.device.click(obj=best_node)
|
||||
import random
|
||||
@@ -322,9 +362,16 @@ class GoalExecutor:
|
||||
# Determine if this was a navigation or an interaction
|
||||
is_navigation = any(k in action.lower() for k in ["tab", "open", "go to", "navigate", "following list"])
|
||||
action_success = False
|
||||
ui_changed = post_xml != xml_dump
|
||||
|
||||
# ── UI Change Detection with Noise Threshold ──
|
||||
# Raw string diffs of < 50 bytes are noise (timestamps, whitespace, counters).
|
||||
# A real navigation changes the XML by hundreds/thousands of bytes.
|
||||
MIN_UI_CHANGE_BYTES = 50
|
||||
xml_delta = abs(len(post_xml) - len(xml_dump))
|
||||
ui_changed = post_xml != xml_dump and xml_delta >= MIN_UI_CHANGE_BYTES
|
||||
logger.debug(
|
||||
f"[GOAP Verify] ui_changed={ui_changed}, " f"xml_len_pre={len(xml_dump)}, xml_len_post={len(post_xml)}"
|
||||
f"[GOAP Verify] ui_changed={ui_changed}, "
|
||||
f"xml_len_pre={len(xml_dump)}, xml_len_post={len(post_xml)}, delta={xml_delta}b"
|
||||
)
|
||||
|
||||
if is_navigation:
|
||||
|
||||
@@ -94,6 +94,33 @@ class GrowthBrain:
|
||||
logger.info(f"🧠 [GrowthBrain] Strategy '{self.strategy}' dictated Desire: {selected_desire}")
|
||||
return selected_desire
|
||||
|
||||
def get_current_goal(self, dopamine_engine, available_goals: list[str], success_rates: dict = None) -> str:
|
||||
"""
|
||||
Autonomously selects the next strategic goal.
|
||||
If no goals are configured, falls back to legacy desires.
|
||||
Weights goals based on session success rates if provided.
|
||||
"""
|
||||
import random
|
||||
|
||||
if not available_goals:
|
||||
# Legacy Desire Mapping (Fallback)
|
||||
return self.get_current_desire(dopamine_engine)
|
||||
|
||||
if dopamine_engine.boredom > 80:
|
||||
return "ShiftContext" # High boredom triggers a context shift
|
||||
|
||||
if not success_rates:
|
||||
return random.choice(available_goals)
|
||||
|
||||
weights = []
|
||||
for goal in available_goals:
|
||||
base_weight = 1.0
|
||||
success_count = success_rates.get(goal, 0)
|
||||
weight = base_weight + float(success_count)
|
||||
weights.append(weight)
|
||||
|
||||
return random.choices(available_goals, weights=weights, k=1)[0]
|
||||
|
||||
def get_circadian_pacing(self) -> float:
|
||||
"""
|
||||
Adjusts activity levels based on the current local time
|
||||
|
||||
86
GramAddict/core/interaction.py
Normal file
@@ -0,0 +1,86 @@
|
||||
import logging
|
||||
from typing import Dict
|
||||
|
||||
from GramAddict.core.llm_provider import query_llm
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class LLMWriter:
|
||||
"""
|
||||
The Creative Engine — Content Generation for Interactions.
|
||||
|
||||
Generates high-fidelity, persona-aligned comments and messages.
|
||||
Replaces legacy static 'comment_list' with dynamic, contextual resonance.
|
||||
"""
|
||||
|
||||
def __init__(self, username: str, persona_interests: list[str], configs):
|
||||
self.username = username
|
||||
self.persona_interests = persona_interests
|
||||
self.configs = configs
|
||||
self.args = getattr(configs, "args", None)
|
||||
|
||||
def generate_comment(self, post_data: Dict) -> str:
|
||||
"""
|
||||
Generates a human-like comment based on post data and persona interests.
|
||||
"""
|
||||
if not post_data:
|
||||
logger.warning("✍️ [Writer] No post data provided. Using generic fallback.")
|
||||
return "Cool!"
|
||||
|
||||
caption = post_data.get("caption", "")
|
||||
description = post_data.get("description", "")
|
||||
target_username = post_data.get("username", "the user")
|
||||
|
||||
# Build context for the LLM
|
||||
context = f"Post by @{target_username}\n"
|
||||
if caption:
|
||||
context += f"Caption: {caption}\n"
|
||||
if description:
|
||||
context += f"Visual Description: {description}\n"
|
||||
|
||||
interests_str = ", ".join(self.persona_interests) if self.persona_interests else "general interesting things"
|
||||
|
||||
prompt = (
|
||||
f"You are an Instagram user interested in: {interests_str}.\n"
|
||||
f"You want to leave a brief, friendly, and authentic comment on the following post:\n\n"
|
||||
f"{context}\n"
|
||||
f"INSTRUCTIONS:\n"
|
||||
f"1. Keep it under 10 words.\n"
|
||||
f"2. Be casual and human. Avoid overly formal language or sounding like a bot.\n"
|
||||
f"3. Do NOT use more than one emoji.\n"
|
||||
f"4. Do NOT use hashtags.\n"
|
||||
f"5. Focus on something specific in the post if possible.\n"
|
||||
f"6. Reply with ONLY the comment text."
|
||||
)
|
||||
|
||||
model = getattr(self.args, "ai_writer_model", getattr(self.args, "ai_model", "llama3.2:1b"))
|
||||
url = getattr(
|
||||
self.args, "ai_writer_url", getattr(self.args, "ai_model_url", "http://localhost:11434/api/generate")
|
||||
)
|
||||
|
||||
logger.info(f"✍️ [Writer] Generating comment for @{target_username} using {model}...")
|
||||
|
||||
try:
|
||||
response_dict = query_llm(
|
||||
url=url,
|
||||
model=model,
|
||||
prompt=prompt,
|
||||
system="You are a friendly Instagram user. You write short, authentic comments.",
|
||||
format_json=False,
|
||||
timeout=60,
|
||||
temperature=0.7, # Add some variety to avoid 'the to the' loops
|
||||
)
|
||||
|
||||
if response_dict and "response" in response_dict:
|
||||
comment = response_dict["response"].strip().strip('"')
|
||||
# Basic cleaning to remove LLM artifacts
|
||||
comment = comment.split("\n")[0] # Take only first line
|
||||
if not comment:
|
||||
return "Nice!"
|
||||
return comment
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"✍️ [Writer] Failed to generate comment: {e}")
|
||||
|
||||
return "Great post! 🔥"
|
||||
@@ -287,6 +287,12 @@ def query_llm(
|
||||
req_data["images"] = images_b64
|
||||
if format_json:
|
||||
req_data["format"] = "json"
|
||||
else:
|
||||
# For free-text calls (Brain action extraction), explicitly disable
|
||||
# thinking mode. Reasoning models like qwen3.5 put EVERYTHING in
|
||||
# the thinking block and return response='', which is useless for
|
||||
# action extraction. think=false forces a direct response.
|
||||
req_data["think"] = False
|
||||
|
||||
# Ollama passes configs inside 'options'
|
||||
if temperature is not None or max_tokens is not None:
|
||||
@@ -344,16 +350,27 @@ def query_llm(
|
||||
return {"response": content}
|
||||
else:
|
||||
# Ollama returns response OR thinking (for reasoning models)
|
||||
content = resp_json.get("response") or resp_json.get("thinking") or ""
|
||||
raw_response = resp_json.get("response", "")
|
||||
raw_thinking = resp_json.get("thinking", "")
|
||||
|
||||
logger.debug(f"DEBUG LLM PAYLOAD: response='{raw_response}', thinking='{raw_thinking}'")
|
||||
|
||||
# CRITICAL: For free-text mode (format_json=False), do NOT substitute
|
||||
# thinking for empty response. The thinking block is REASONING, not
|
||||
# a decision. The Brain parser would extract random actions from it.
|
||||
# For JSON mode (format_json=True), falling back to thinking IS correct
|
||||
# because reasoning models may place structured output in the thinking block.
|
||||
if format_json:
|
||||
content = raw_response or raw_thinking or ""
|
||||
extracted = extract_json(content)
|
||||
if not extracted:
|
||||
# Log more context if JSON extraction fails
|
||||
logger.debug(f"Ollama raw content (for JSON extraction): {content[:200]}...")
|
||||
raise ValueError("Ollama returned non-JSON content when JSON was expected.")
|
||||
resp_json["response"] = extracted
|
||||
logger.warning(f"Failed to extract JSON from content: {content[:100]}")
|
||||
else:
|
||||
content = extracted
|
||||
else:
|
||||
content = raw_response
|
||||
|
||||
return resp_json
|
||||
return {"response": content}
|
||||
except requests.exceptions.ConnectionError:
|
||||
logger.error(f"⚠️ [LLM Provider] Connection refused for {model} at {url}. Is the service running?")
|
||||
except Exception as e:
|
||||
|
||||
87
GramAddict/core/navigation/brain.py
Normal file
@@ -0,0 +1,87 @@
|
||||
import logging
|
||||
from typing import List, Optional
|
||||
|
||||
from GramAddict.core.config import Config
|
||||
from GramAddict.core.llm_provider import query_llm
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def ask_brain_for_action(
|
||||
goal: str, screen_type: str, available_actions: List[str], explored_actions: set, context: dict = None
|
||||
) -> Optional[str]:
|
||||
"""Asks the VLM to decide the best available action to reach the goal, considering failures."""
|
||||
if not available_actions:
|
||||
return None
|
||||
|
||||
cfg = Config()
|
||||
url = (
|
||||
getattr(cfg.args, "ai_model_url", "http://localhost:11434/api/generate")
|
||||
if hasattr(cfg, "args")
|
||||
else "http://localhost:11434/api/generate"
|
||||
)
|
||||
model = getattr(cfg.args, "ai_model", "qwen3.5:latest") if hasattr(cfg, "args") else "qwen3.5:latest"
|
||||
|
||||
prompt = (
|
||||
f"You are an autonomous Instagram agent. Your ultimate goal is: '{goal}'.\n"
|
||||
f"You are currently on the screen: {screen_type}.\n"
|
||||
f"These actions are available to you right now: {available_actions}\n"
|
||||
)
|
||||
if explored_actions:
|
||||
prompt += f"You recently tried these actions but they failed or didn't help: {list(explored_actions)}\n"
|
||||
if context:
|
||||
prompt += f"Context: {context}\n"
|
||||
|
||||
prompt += (
|
||||
"INSTRUCTIONS:\n"
|
||||
"1. Reason about where you are. Consider the screen type and what actions make sense on that screen.\n"
|
||||
"2. If the goal requires navigating away from the current screen, choose the action that moves you closest to the goal.\n"
|
||||
"3. 'scroll down' reveals more UI elements on scrollable screens (feeds, profiles, lists). If your target is likely on this screen but not currently visible, you MUST choose 'scroll down'.\n"
|
||||
"4. 'press back' exits the current screen and returns to the previous one. Use it when you are on a screen that doesn't lead to your goal.\n"
|
||||
"5. DO NOT hallucinate actions. Reply ONLY with the exact string from the available actions list.\n"
|
||||
"6. Reply with ONLY the action string, nothing else."
|
||||
)
|
||||
|
||||
try:
|
||||
response = query_llm(
|
||||
url=url,
|
||||
model=model,
|
||||
prompt="Choose the next best action.",
|
||||
system=prompt,
|
||||
format_json=False,
|
||||
max_tokens=250,
|
||||
)
|
||||
if response:
|
||||
result = response if isinstance(response, str) else response.get("response", "")
|
||||
result = result.strip().strip("'\"")
|
||||
|
||||
# 1. Exact match check (ideal case)
|
||||
for act in available_actions:
|
||||
if act.lower() == result.lower():
|
||||
return act
|
||||
|
||||
# 2. Strict line-by-line check (often the model outputs the action on the last line)
|
||||
for line in reversed(result.splitlines()):
|
||||
line = line.strip().strip("'\"")
|
||||
for act in available_actions:
|
||||
if act.lower() == line.lower():
|
||||
return act
|
||||
|
||||
# 3. Fuzzy match (find the LAST mentioned action in the text, assuming it's the conclusion)
|
||||
best_act = None
|
||||
best_idx = -1
|
||||
for act in available_actions:
|
||||
idx = result.lower().rfind(act.lower())
|
||||
if idx > best_idx:
|
||||
best_idx = idx
|
||||
best_act = act
|
||||
|
||||
if best_act:
|
||||
logger.warning(f"🧠 [Brain] Extracted action '{best_act}' from verbose LLM output.")
|
||||
return best_act
|
||||
|
||||
logger.warning(f"🧠 [Brain] LLM returned an invalid action or no action found: '{result[:100]}...'. Falling back.")
|
||||
except Exception as e:
|
||||
logger.debug(f"🧠 [Brain] Error querying LLM: {e}")
|
||||
|
||||
return None
|
||||
@@ -109,7 +109,7 @@ class PathMemory:
|
||||
try:
|
||||
from qdrant_client import models
|
||||
|
||||
point_id = self._db._get_id(seed)
|
||||
point_id = self._db.generate_uuid(seed)
|
||||
self._db.client.delete(
|
||||
collection_name=self._db.collection_name, points_selector=models.PointIdsList(points=[point_id])
|
||||
)
|
||||
|
||||
@@ -17,7 +17,14 @@ class GoalPlanner:
|
||||
def __init__(self, username: str):
|
||||
self.knowledge = NavigationKnowledge(username)
|
||||
|
||||
def plan_next_step(self, goal: str, screen: Dict[str, Any], explored_nav_actions: set = None, action_failures: dict = None) -> Optional[str]:
|
||||
def plan_next_step(
|
||||
self,
|
||||
goal: str,
|
||||
screen: Dict[str, Any],
|
||||
explored_nav_actions: set = None,
|
||||
action_failures: dict = None,
|
||||
visited_screens: set = None,
|
||||
) -> Optional[str]:
|
||||
"""Plans the NEXT single action to take toward the goal."""
|
||||
screen_type = screen["screen_type"]
|
||||
available = screen.get("available_actions", [])
|
||||
@@ -34,7 +41,9 @@ class GoalPlanner:
|
||||
|
||||
# ── 3. Am I on the right screen? If not, navigate there ──
|
||||
selected_tab = screen.get("selected_tab")
|
||||
nav_action = self._plan_navigation(goal_lower, screen_type, available, selected_tab, explored_nav_actions, action_failures)
|
||||
nav_action = self._plan_navigation(
|
||||
goal_lower, screen_type, available, selected_tab, explored_nav_actions, action_failures, visited_screens
|
||||
)
|
||||
if nav_action:
|
||||
return nav_action
|
||||
|
||||
@@ -71,6 +80,7 @@ class GoalPlanner:
|
||||
selected_tab: Optional[str] = None,
|
||||
explored_nav_actions: set = None,
|
||||
action_failures: dict = None,
|
||||
visited_screens: set = None,
|
||||
) -> Optional[str]:
|
||||
"""If we're on the wrong screen, figure out how to navigate.
|
||||
|
||||
@@ -89,7 +99,38 @@ class GoalPlanner:
|
||||
else:
|
||||
logger.debug(f"🛡️ [Aversive Filter] Masking trapped action: '{action}'")
|
||||
available = safe_available
|
||||
|
||||
|
||||
visited_screens = visited_screens or set()
|
||||
|
||||
# 0b. No-Op Guard & Anti-Loop Guard:
|
||||
# - Strip tab actions that navigate to the CURRENT screen.
|
||||
# - Strip actions that navigate to PREVIOUSLY VISITED screens (except back-tracking).
|
||||
noop_actions = set()
|
||||
for action in available:
|
||||
expected = ScreenTopology.expected_screen_for_action(action, screen_type)
|
||||
if expected == screen_type:
|
||||
noop_actions.add(action)
|
||||
logger.debug(f"🛡️ [No-Op Guard] Stripping '{action}' — leads back to {screen_type.name}")
|
||||
elif expected in visited_screens and action != "press back":
|
||||
noop_actions.add(action)
|
||||
logger.debug(f"🛡️ [Anti-Loop Guard] Stripping '{action}' — leads to visited {expected.name}")
|
||||
|
||||
# Also strip actions where the HD Map says they go TO the current screen from OTHER screens
|
||||
for src_screen, transitions in ScreenTopology.TRANSITIONS.items():
|
||||
if src_screen == screen_type:
|
||||
continue # We already handled this screen's own transitions
|
||||
for action, dest in transitions.items():
|
||||
if dest == screen_type and action in available:
|
||||
noop_actions.add(action)
|
||||
logger.debug(
|
||||
f"🛡️ [No-Op Guard] Stripping '{action}' — known to navigate to current {screen_type.name}"
|
||||
)
|
||||
elif dest in visited_screens and action in available and action != "press back":
|
||||
noop_actions.add(action)
|
||||
logger.debug(f"🛡️ [Anti-Loop Guard] Stripping '{action}' — known to navigate to visited {dest.name}")
|
||||
|
||||
available = [a for a in available if a not in noop_actions]
|
||||
|
||||
# Build avoid_actions for HD Map route planning
|
||||
avoid_actions = (explored_nav_actions or set()).copy()
|
||||
if action_failures:
|
||||
@@ -97,7 +138,30 @@ class GoalPlanner:
|
||||
if count >= 2: # MAX_RETRIES is 2 in goap
|
||||
avoid_actions.add(act)
|
||||
|
||||
# ── 1. HD Map Routing (Primary Strategy) ──
|
||||
target_screen = ScreenTopology.goal_to_target_screen(goal)
|
||||
|
||||
# ── 1. HD Map Pre-Check for Dead Ends ──
|
||||
# If the topological map KNOWS the target is unreachable due to action_failures,
|
||||
# we must preempt the Brain from blindly routing into a dead end.
|
||||
if target_screen and target_screen != screen_type:
|
||||
route = ScreenTopology.find_route(screen_type, target_screen, avoid_actions=avoid_actions)
|
||||
if route is None and ScreenTopology.find_route(screen_type, target_screen):
|
||||
logger.warning(
|
||||
f"🛡️ [HD Map] Target {target_screen.name} is unreachable due to masked edges! Preventing Brain from blind routing."
|
||||
)
|
||||
return None
|
||||
|
||||
# ── 2. Brain-Driven Decision Making (Primary Strategy) ──
|
||||
# The user explicitly wants the AI to be the primary driver of goals.
|
||||
from GramAddict.core.navigation.brain import ask_brain_for_action
|
||||
|
||||
brain_action = ask_brain_for_action(goal, screen_type.name, available, avoid_actions)
|
||||
if brain_action:
|
||||
logger.info(f"🧠 [Brain] Decided to execute: '{brain_action}' (to achieve: '{goal}')")
|
||||
return brain_action
|
||||
|
||||
# ── 2. HD Map Routing (Fallback) ──
|
||||
# If the Brain doesn't know what to do, try the deterministic topological map.
|
||||
target_screen = ScreenTopology.goal_to_target_screen(goal)
|
||||
if target_screen and target_screen != screen_type:
|
||||
route = ScreenTopology.find_route(screen_type, target_screen, avoid_actions=avoid_actions)
|
||||
@@ -112,9 +176,11 @@ class GoalPlanner:
|
||||
)
|
||||
return next_action
|
||||
else:
|
||||
logger.warning(f"🛡️ [HD Map] Route action '{next_action}' is trapped. Falling back.")
|
||||
logger.warning(f"🛡️ [HD Map] Route action '{next_action}' is trapped. Skipping HD Map.")
|
||||
else:
|
||||
logger.debug(f"🛡️ [HD Map] Route action '{next_action}' already explored. Falling back.")
|
||||
logger.debug(
|
||||
f"🛡️ [HD Map] Route action '{next_action}' already explored and failed. Skipping HD Map."
|
||||
)
|
||||
|
||||
# ── 2. Learned Knowledge (Qdrant) ──
|
||||
required_screens = self.knowledge.get_requirements(goal)
|
||||
|
||||
@@ -5,6 +5,20 @@ from GramAddict.core.perception.spatial_parser import SpatialNode
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Semantic Match Keywords — SSOT for intent → element validation
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
# Maps toggle-intent keywords to required element markers.
|
||||
# If the intent contains the key, the clicked element MUST
|
||||
# contain at least one of the corresponding markers in its
|
||||
# text, content_desc, or resource_id.
|
||||
TOGGLE_INTENT_MARKERS = {
|
||||
"follow": ["follow", "gefolgt", "abonnieren"],
|
||||
"like": ["like", "heart", "gefällt"],
|
||||
"save": ["save", "saved", "bookmark", "speichern"],
|
||||
}
|
||||
|
||||
|
||||
class ActionMemory:
|
||||
"""
|
||||
@@ -36,7 +50,11 @@ class ActionMemory:
|
||||
logger.debug(f"🧠 [ActionMemory] Tracking tentative click for intent: '{intent}' -> {semantic_string}")
|
||||
|
||||
def confirm_click(self, intent: str = None):
|
||||
"""Positive Reinforcement: Confirms the last click was successful."""
|
||||
"""Positive Reinforcement: Confirms the last click was successful.
|
||||
|
||||
Guard: Refuses to store in Qdrant if the clicked element does not
|
||||
semantically match the intent. Prevents memory poisoning.
|
||||
"""
|
||||
ctx = self._last_click_context
|
||||
if not ctx:
|
||||
return
|
||||
@@ -44,7 +62,19 @@ class ActionMemory:
|
||||
if intent and ctx["intent"] != intent:
|
||||
return
|
||||
|
||||
logger.info(f"✅ [ActionMemory] Confirming success for '{ctx['intent']}'. Boosting confidence.")
|
||||
# ── Semantic Mismatch Guard ──
|
||||
if not _intent_matches_node(ctx["intent"], ctx["semantic_string"]):
|
||||
logger.warning(
|
||||
f"🛡️ [ActionMemory] BLOCKED confirm_click for '{ctx['intent']}' — "
|
||||
f"clicked element does not match intent: {ctx['semantic_string']}"
|
||||
)
|
||||
self._last_click_context = None
|
||||
return
|
||||
|
||||
logger.info(
|
||||
f"✅ [ActionMemory] Confirming success for '{ctx['intent']}'. Boosting confidence.",
|
||||
extra={"color": "\x1b[32m"}
|
||||
)
|
||||
|
||||
# Store or boost in Qdrant
|
||||
try:
|
||||
@@ -68,7 +98,10 @@ class ActionMemory:
|
||||
if intent and ctx["intent"] != intent:
|
||||
return
|
||||
|
||||
logger.warning(f"❌ [ActionMemory] Click failed for '{ctx['intent']}'. Applying penalty.")
|
||||
logger.warning(
|
||||
f"❌ [ActionMemory] Click failed for '{ctx['intent']}'. Applying penalty.",
|
||||
extra={"color": "\x1b[31m"}
|
||||
)
|
||||
|
||||
try:
|
||||
self.ui_memory.decay_confidence(ctx["intent"], ctx["xml_context"])
|
||||
@@ -83,15 +116,29 @@ class ActionMemory:
|
||||
"""
|
||||
Structural and Visual verification: Did the UI actually change after the click?
|
||||
"""
|
||||
# Specific check for explore grid
|
||||
if "first image in explore grid" in intent or "grid item" in intent:
|
||||
if "row_feed_photo_imageview" in post_click_xml or "row_feed_button_like" in post_click_xml:
|
||||
intent_lower = intent.lower()
|
||||
post_xml_lower = post_click_xml.lower()
|
||||
|
||||
# Specific check for opening a post (from explore/profile grid)
|
||||
if "view a post" in intent_lower or "first image" in intent_lower or "grid item" in intent_lower:
|
||||
if "row_feed_photo_imageview" in post_xml_lower or "row_feed_button_like" in post_xml_lower or "clips_viewer_view_pager" in post_xml_lower:
|
||||
return True
|
||||
if "explore_action_bar" in post_click_xml and "row_feed_button_like" not in post_click_xml:
|
||||
if "explore_action_bar" in post_xml_lower and "row_feed_button_like" not in post_xml_lower and "clips_viewer" not in post_xml_lower:
|
||||
return None # Still on grid, inconclusive
|
||||
|
||||
state_toggles = ["like", "save", "follow", "heart"]
|
||||
is_toggle = any(t in intent.lower() for t in state_toggles)
|
||||
is_toggle = any(t in intent_lower for t in state_toggles)
|
||||
|
||||
# ── State-Specific Structural Verification ──
|
||||
# If it was a follow, the resulting XML MUST contain "Following", "Requested", "Abonniert" or "Angefragt"
|
||||
if "follow" in intent_lower:
|
||||
FOLLOW_SUCCESS_MARKERS = ["following", "requested", "abonniert", "angefragt", "gefolgt"]
|
||||
if any(m in post_xml_lower for m in FOLLOW_SUCCESS_MARKERS):
|
||||
logger.info("✅ [ActionMemory] Structural check confirmed follow success.")
|
||||
return True
|
||||
else:
|
||||
logger.warning("⚠️ [ActionMemory] Follow success markers NOT found in post-click XML.")
|
||||
# We don't return False immediately because it might take a second to update
|
||||
|
||||
# If we are highly confident (e.g. pulled from Qdrant memory), bypass heavy VLM
|
||||
if device and confidence < 0.95:
|
||||
@@ -102,9 +149,15 @@ class ActionMemory:
|
||||
|
||||
evaluator = SemanticEvaluator()
|
||||
|
||||
# Build context of what was actually clicked
|
||||
clicked_context = ""
|
||||
if self._last_click_context:
|
||||
clicked_context = f"The element that was tapped: {self._last_click_context['semantic_string']}. "
|
||||
|
||||
# Ask VLM to be the absolute source of truth
|
||||
prompt = (
|
||||
f"The user just attempted to perform the action: '{intent}'. "
|
||||
f"{clicked_context}"
|
||||
f"Look at the current screen carefully. Was the action successful? "
|
||||
)
|
||||
if is_toggle:
|
||||
@@ -112,6 +165,7 @@ class ActionMemory:
|
||||
"If the intent was 'follow', does the button now indicate 'Following' or 'Requested'? "
|
||||
"If it was 'like', is the heart icon clearly active/red? "
|
||||
"If the screen shifted completely to a profile when you just wanted to like/follow from a feed, it FAILED. "
|
||||
"If the tapped element does NOT sound like a like/follow button (e.g. it's a caption, comment field, or post content), it FAILED. "
|
||||
)
|
||||
else:
|
||||
prompt += (
|
||||
@@ -138,7 +192,16 @@ class ActionMemory:
|
||||
logger.error(f"Failed to query VLM for visual verification: {e}")
|
||||
# Fallthrough to structural delta if VLM crashes
|
||||
|
||||
# Fallback to structural delta if no device, VLM fails, or high confidence bypass
|
||||
# ── Pre-Structural Semantic Gate ──
|
||||
if is_toggle and self._last_click_context:
|
||||
if not _intent_matches_node(intent, self._last_click_context["semantic_string"]):
|
||||
logger.warning(
|
||||
f"🛡️ [ActionMemory] Semantic mismatch: '{intent}' does not match "
|
||||
f"clicked element {self._last_click_context['semantic_string']}. Verification FAIL."
|
||||
)
|
||||
return False
|
||||
|
||||
# Fallback to structural delta
|
||||
diff = abs(len(pre_click_xml) - len(post_click_xml))
|
||||
|
||||
if is_toggle:
|
||||
@@ -151,11 +214,67 @@ class ActionMemory:
|
||||
logger.debug(f"🧠 [ActionMemory] Structural delta detected for toggle '{intent}'. Verification PASS.")
|
||||
return True
|
||||
else:
|
||||
# If the intent is an abstract goal (like "find customers"), diff > 50 is NOT enough.
|
||||
# We must force visual VLM confirmation because clicking the wrong thing (like "Create highlight")
|
||||
# also produces a large diff but achieves the wrong goal.
|
||||
if diff > 50:
|
||||
logger.debug(
|
||||
f"🧠 [ActionMemory] Structural change detected for navigation '{intent}'. Verification PASS."
|
||||
)
|
||||
return True
|
||||
# Is it a standard structural transition?
|
||||
from GramAddict.core.screen_topology import ScreenTopology
|
||||
|
||||
logger.warning(f"⚠️ [ActionMemory] No structural change detected for '{intent}'. Verification FAIL.")
|
||||
return False
|
||||
# We don't have screen type here, so we just check if it's in the HD Map keys
|
||||
is_standard = any(intent in transitions for transitions in ScreenTopology.TRANSITIONS.values())
|
||||
if is_standard:
|
||||
logger.debug(
|
||||
f"🧠 [ActionMemory] Structural change detected for known navigation '{intent}'. Verification PASS."
|
||||
)
|
||||
return True
|
||||
else:
|
||||
logger.info(
|
||||
f"👁️ [ActionMemory] Abstract intent '{intent}' caused UI change. Forcing VLM visual verification..."
|
||||
)
|
||||
# For abstract intents, we must visually verify if it actually helped!
|
||||
# If device is available, we use VLM. If not, we fail safe.
|
||||
if device:
|
||||
from GramAddict.core.perception.semantic_evaluator import SemanticEvaluator
|
||||
|
||||
evaluator = SemanticEvaluator()
|
||||
prompt = f"The user just attempted to perform the action: '{intent}'. Does the current screen match the expected outcome? Answer ONLY with the word YES or NO."
|
||||
try:
|
||||
response = evaluator._query_vlm(prompt, device.get_screenshot_b64())
|
||||
if response and "yes" in response.lower() and "no" not in response.lower():
|
||||
return True
|
||||
else:
|
||||
logger.warning(f"⚠️ [ActionMemory] VLM rejected success for abstract intent '{intent}'.")
|
||||
return False
|
||||
except Exception as e:
|
||||
logger.error(f"VLM visual verification failed: {e}")
|
||||
|
||||
logger.warning(f"⚠️ [ActionMemory] Cannot visually verify abstract intent '{intent}'. Failing safe.")
|
||||
return False
|
||||
|
||||
|
||||
def _intent_matches_node(intent: str, semantic_string: str) -> bool:
|
||||
"""Checks if the clicked element semantically matches the toggle intent.
|
||||
|
||||
For toggle intents (follow, like, save), the clicked element MUST contain
|
||||
at least one of the required keywords in its text/desc/id. This prevents
|
||||
photo grid items, captions, and other unrelated elements from being
|
||||
falsely confirmed as successful interactions.
|
||||
|
||||
For non-toggle intents, returns True (no restriction).
|
||||
"""
|
||||
intent_lower = intent.lower()
|
||||
semantic_lower = semantic_string.lower()
|
||||
|
||||
for intent_keyword, required_markers in TOGGLE_INTENT_MARKERS.items():
|
||||
if intent_keyword in intent_lower:
|
||||
if any(marker in semantic_lower for marker in required_markers):
|
||||
return True
|
||||
logger.debug(
|
||||
f"🛡️ [SemanticGuard] Intent '{intent}' requires markers "
|
||||
f"{required_markers} but element has: {semantic_string}"
|
||||
)
|
||||
return False
|
||||
|
||||
# Non-toggle intents pass through
|
||||
return True
|
||||
|
||||
@@ -64,8 +64,8 @@ def extract_post_content(context_xml: str) -> dict:
|
||||
# 1. Learn/extract post author dynamically
|
||||
author_node = telepath.find_best_node(context_xml, "post author username header", min_confidence=0.75)
|
||||
|
||||
# 🛡️ Anti-Hallucination Guard: The author header is always near the top. Ignore names in the comment section.
|
||||
if author_node and author_node.get("y", 0) < 1000 and author_node.get("original_attribs", {}).get("text"):
|
||||
# 🛡️ Anti-Hallucination Guard: Ensure we actually found text.
|
||||
if author_node and author_node.get("original_attribs", {}).get("text"):
|
||||
result["username"] = author_node["original_attribs"]["text"].strip()
|
||||
|
||||
# 2. Learn/extract post media description dynamically
|
||||
|
||||
@@ -8,15 +8,17 @@ from GramAddict.core.perception.spatial_parser import SpatialNode
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Navigation tab intent → resource_id keyword mapping
|
||||
# These are STRUCTURAL guards (bottom 15% zone), not string-matching heuristics.
|
||||
_NAV_TAB_MAP = {
|
||||
"tap home tab": "feed_tab",
|
||||
"tap explore tab": "search_tab",
|
||||
"tap reels tab": "clips_tab",
|
||||
"tap profile tab": "profile_tab",
|
||||
"tap messages tab": "direct_tab",
|
||||
}
|
||||
|
||||
def _humanize_desc(desc: str) -> str:
|
||||
"""
|
||||
Inserts a space between numbers and letters to fix Instagram's concatenated content-desc.
|
||||
Example: "991following" -> "991 following", "140Kfollowers" -> "140K followers"
|
||||
"""
|
||||
if not desc:
|
||||
return ""
|
||||
import re
|
||||
|
||||
return re.sub(r"(\d[KMBkmb]?)([a-z])", r"\1 \2", desc)
|
||||
|
||||
|
||||
class IntentResolver:
|
||||
@@ -39,31 +41,13 @@ class IntentResolver:
|
||||
# ──────────────────────────────────────────────
|
||||
|
||||
def resolve(
|
||||
self, intent_description: str, candidates: List[SpatialNode], screen_height: int = 2400, device=None
|
||||
self, intent_description: str, candidates: List[SpatialNode], device=None, screen_height: int = 2400
|
||||
) -> Optional[SpatialNode]:
|
||||
if not candidates:
|
||||
return None
|
||||
|
||||
intent_lower = intent_description.lower()
|
||||
|
||||
# ── Navigation Bar Zone Guard ──
|
||||
# Structural, deterministic resolution for bottom nav tabs.
|
||||
tab_keyword = _NAV_TAB_MAP.get(intent_lower)
|
||||
if tab_keyword:
|
||||
nav_zone_y = int(screen_height * 0.85)
|
||||
nav_candidates = [
|
||||
n for n in candidates if n.y1 >= nav_zone_y and tab_keyword in (n.resource_id or "").lower()
|
||||
]
|
||||
if nav_candidates:
|
||||
return nav_candidates[0]
|
||||
tab_label = intent_lower.replace("tap ", "").replace(" tab", "")
|
||||
nav_candidates = [
|
||||
n for n in candidates if n.y1 >= nav_zone_y and tab_label in (n.content_desc or "").lower()
|
||||
]
|
||||
if nav_candidates:
|
||||
return nav_candidates[0]
|
||||
return None
|
||||
|
||||
# Block abstract goals from leaking into node clicks
|
||||
abstract_goals = ["open profile", "open explore", "open following", "learn own profile"]
|
||||
if intent_lower in abstract_goals:
|
||||
@@ -71,11 +55,21 @@ class IntentResolver:
|
||||
|
||||
# ── PRIMARY PATH: Visual Discovery ──
|
||||
# If we have a device, the VLM SEES the screen and decides.
|
||||
if device:
|
||||
result = self._visual_discovery(intent_description, candidates, device)
|
||||
if result:
|
||||
return result
|
||||
logger.warning(f"👁️ [Visual Discovery] No match found for '{intent_description}', trying text fallback.")
|
||||
if device is not None and (
|
||||
hasattr(device, "screenshot") or hasattr(getattr(device, "deviceV2", None), "screenshot")
|
||||
):
|
||||
logger.info("📸 Device screenshot capability detected. Enforcing visual discovery.")
|
||||
return self._visual_discovery(intent_description, candidates, device)
|
||||
|
||||
# --- Strict VLM Hallucination Guard (Text-only Fallback) ---
|
||||
# For known structural targets that the text-based VLM frequently hallucinates when they are missing,
|
||||
# we enforce a strict failure.
|
||||
if "following list" in intent_lower or "followers list" in intent_lower or "tap message button" in intent_lower:
|
||||
logger.warning(
|
||||
f"🛡️ [Hallucination Guard] Intent '{intent_description}' is a strict structural target. "
|
||||
"Since it wasn't resolved by fast-paths, it is missing. Rejecting VLM fallback."
|
||||
)
|
||||
return None
|
||||
|
||||
# ── FALLBACK: Text-based VLM resolution ──
|
||||
# Only used when device is unavailable (e.g., unit tests without screenshots).
|
||||
@@ -95,45 +89,83 @@ class IntentResolver:
|
||||
annotated_b64: Base64-encoded JPEG of the annotated screenshot.
|
||||
box_map: Dict mapping box number → SpatialNode for coordinate lookup.
|
||||
"""
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
from PIL import ImageDraw
|
||||
|
||||
img = device.deviceV2.screenshot()
|
||||
|
||||
# Stage 1: Basic area filter + exclude system UI and notifications
|
||||
pre_filtered = [
|
||||
n for n in candidates
|
||||
if 200 < n.area < 400000
|
||||
and "com.android.systemui" not in (n.resource_id or "")
|
||||
and "notification:" not in (n.content_desc or "").lower()
|
||||
and "per cent" not in (n.content_desc or "").lower()
|
||||
]
|
||||
# Stage 1: Basic area filter + exclude system UI and notifications (ALREADY HANDLED in _visual_discovery)
|
||||
pre_filtered = candidates
|
||||
|
||||
# Stage 2: Spatial deduplication — if a node is fully contained
|
||||
# within another candidate, suppress the child. This eliminates
|
||||
# redundant sub-nodes (e.g., followers_label inside followers_stacked).
|
||||
def _is_contained(child: SpatialNode, parent: SpatialNode) -> bool:
|
||||
# Stage 2: Spatial deduplication
|
||||
# A node could completely contain another.
|
||||
# If parent is clickable and child is not: suppress child (e.g. text inside button)
|
||||
# If parent is not clickable and child is: suppress parent (e.g. layout container around button)
|
||||
# If both are not clickable: suppress parent (keep the smaller, more specific text)
|
||||
# If both are clickable: keep both! (e.g. nested buttons like row and camera icon)
|
||||
def _contains(parent: SpatialNode, child: SpatialNode) -> bool:
|
||||
return (
|
||||
parent.x1 <= child.x1 and parent.y1 <= child.y1
|
||||
and parent.x2 >= child.x2 and parent.y2 >= child.y2
|
||||
and parent is not child
|
||||
parent.x1 <= child.x1
|
||||
and parent.y1 <= child.y1
|
||||
and parent.x2 >= child.x2
|
||||
and parent.y2 >= child.y2
|
||||
and parent.node_id != child.node_id
|
||||
)
|
||||
|
||||
# Sort by area descending so parents come first
|
||||
to_suppress = set()
|
||||
# Sort by area DESCENDING so we process largest (parents) first
|
||||
pre_filtered.sort(key=lambda n: n.area, reverse=True)
|
||||
visible_candidates = []
|
||||
for node in pre_filtered:
|
||||
is_child = any(_is_contained(node, parent) for parent in visible_candidates)
|
||||
if not is_child:
|
||||
visible_candidates.append(node)
|
||||
|
||||
for i, parent in enumerate(pre_filtered):
|
||||
for j in range(i + 1, len(pre_filtered)):
|
||||
child = pre_filtered[j]
|
||||
if _contains(parent, child):
|
||||
if parent.clickable and not child.clickable:
|
||||
to_suppress.add(child.node_id)
|
||||
# Merge semantic info from child to parent if missing
|
||||
if (
|
||||
child.text
|
||||
and child.text not in (parent.text or "")
|
||||
and child.text not in (parent.content_desc or "")
|
||||
):
|
||||
parent.content_desc = f"{(parent.content_desc or '')} {child.text}".strip()
|
||||
if (
|
||||
child.content_desc
|
||||
and child.content_desc not in (parent.text or "")
|
||||
and child.content_desc not in (parent.content_desc or "")
|
||||
):
|
||||
parent.content_desc = f"{(parent.content_desc or '')} {child.content_desc}".strip()
|
||||
elif not parent.clickable and child.clickable:
|
||||
to_suppress.add(parent.node_id)
|
||||
# Pass any semantic info down just in case
|
||||
if parent.content_desc and not child.content_desc:
|
||||
child.content_desc = parent.content_desc
|
||||
if parent.text and not child.text:
|
||||
child.text = parent.text
|
||||
elif not parent.clickable and not child.clickable:
|
||||
to_suppress.add(parent.node_id)
|
||||
if parent.content_desc and not child.content_desc:
|
||||
child.content_desc = parent.content_desc
|
||||
elif parent.clickable and child.clickable:
|
||||
# Keep both, distinct nested interactables
|
||||
pass
|
||||
|
||||
visible_candidates = [n for n in pre_filtered if n.node_id not in to_suppress]
|
||||
|
||||
draw = ImageDraw.Draw(img)
|
||||
box_map: Dict[int, SpatialNode] = {}
|
||||
|
||||
# Color palette for distinct boxes
|
||||
colors = [
|
||||
(255, 0, 0), (0, 200, 0), (0, 0, 255), (255, 165, 0),
|
||||
(128, 0, 128), (0, 200, 200), (255, 20, 147), (0, 128, 0),
|
||||
(255, 215, 0), (70, 130, 180),
|
||||
(255, 0, 0),
|
||||
(0, 200, 0),
|
||||
(0, 0, 255),
|
||||
(255, 165, 0),
|
||||
(128, 0, 128),
|
||||
(0, 200, 200),
|
||||
(255, 20, 147),
|
||||
(0, 128, 0),
|
||||
(255, 215, 0),
|
||||
(70, 130, 180),
|
||||
]
|
||||
|
||||
for i, node in enumerate(visible_candidates):
|
||||
@@ -183,10 +215,78 @@ class IntentResolver:
|
||||
from GramAddict.core.config import Config
|
||||
from GramAddict.core.llm_provider import query_telepathic_llm
|
||||
|
||||
# Pre-filter candidates by area and system UI before any semantic matching
|
||||
candidates = [
|
||||
n
|
||||
for n in candidates
|
||||
if 200 < n.area < 400000
|
||||
and "com.android.systemui" not in (n.resource_id or "")
|
||||
and "notification:" not in (n.content_desc or "").lower()
|
||||
and "per cent" not in (n.content_desc or "").lower()
|
||||
]
|
||||
|
||||
# --- Strict Button Guard ---
|
||||
# If the intent specifically asks for a "button", "icon", or "tab",
|
||||
# filter out candidates that contain long text (e.g. captions, comments)
|
||||
# to prevent the VLM from hallucinating text nodes as interactive buttons.
|
||||
intent_lower = intent_description.lower()
|
||||
if "button" in intent_lower or "icon" in intent_lower or "tab" in intent_lower:
|
||||
filtered_candidates = []
|
||||
for node in candidates:
|
||||
text_len = len(node.text or "")
|
||||
if text_len < 40:
|
||||
filtered_candidates.append(node)
|
||||
else:
|
||||
logger.debug(f"🛡️ [Strict Button Guard] Filtered out node with long text: '{node.text[:20]}...'")
|
||||
candidates = filtered_candidates
|
||||
|
||||
# --- Post/Grid Item Guard ---
|
||||
# VLMs frequently hallucinate 'Search' when asked to tap a post. We must pre-filter.
|
||||
if "first post" in intent_lower or "grid item" in intent_lower:
|
||||
grid_candidates = []
|
||||
for node in candidates:
|
||||
desc = (node.content_desc or "").lower()
|
||||
# Posts/grid items usually have 'row X, column Y', 'photos by', or 'reel by'
|
||||
if "row 1" in desc or "column" in desc or "photos by" in desc or "reel by" in desc:
|
||||
grid_candidates.append(node)
|
||||
|
||||
if grid_candidates:
|
||||
logger.info(f"🎯 [Grid Guard] Filtered to {len(grid_candidates)} actual grid candidates.")
|
||||
candidates = grid_candidates
|
||||
|
||||
# --- Semantic Match Guard ---
|
||||
# If the intent explicitly quotes a target (e.g., "tap 'New Message'"),
|
||||
# we strictly filter candidates to those whose text or content_desc contains the quote.
|
||||
import re
|
||||
|
||||
quotes = re.findall(r"['\"](.*?)['\"]", intent_description)
|
||||
if quotes:
|
||||
target_text = quotes[0].lower()
|
||||
pattern = r"\b" + re.escape(target_text) + r"\b"
|
||||
semantic_candidates = []
|
||||
for node in candidates:
|
||||
n_text = (node.text or "").lower()
|
||||
n_desc = (node.content_desc or "").lower()
|
||||
if re.search(pattern, n_text) or re.search(pattern, n_desc):
|
||||
semantic_candidates.append(node)
|
||||
|
||||
if semantic_candidates:
|
||||
if len(semantic_candidates) == 1:
|
||||
logger.info(f"🎯 [Semantic Guard] Exact match found for '{target_text}', skipping VLM.")
|
||||
return semantic_candidates[0]
|
||||
else:
|
||||
logger.info(
|
||||
f"🎯 [Semantic Guard] {len(semantic_candidates)} matches found for '{target_text}'. Reducing candidates for VLM."
|
||||
)
|
||||
candidates = semantic_candidates
|
||||
else:
|
||||
logger.warning(
|
||||
f"⚠️ [Semantic Guard] No candidates found containing '{target_text}'. Returning None to prevent hallucination."
|
||||
)
|
||||
return None
|
||||
|
||||
try:
|
||||
annotated_b64, box_map = self._annotate_screenshot_with_candidates(
|
||||
device, candidates
|
||||
)
|
||||
annotated_b64, box_map = self._annotate_screenshot_with_candidates(device, candidates)
|
||||
except Exception as e:
|
||||
logger.warning(f"⚠️ [Visual Discovery] Screenshot annotation failed: {e}")
|
||||
return None
|
||||
@@ -194,17 +294,61 @@ class IntentResolver:
|
||||
if not box_map:
|
||||
return None
|
||||
|
||||
self.last_box_map = box_map
|
||||
|
||||
cfg = Config()
|
||||
model = getattr(cfg.args, "ai_telepathic_model", "llava:latest")
|
||||
url = getattr(cfg.args, "ai_telepathic_url", "http://localhost:11434/api/generate")
|
||||
|
||||
# Build a compact legend of what each box contains
|
||||
box_legend_lines = []
|
||||
for idx in sorted(box_map.keys()):
|
||||
node = box_map[idx]
|
||||
label_parts = []
|
||||
if node.content_desc:
|
||||
desc = _humanize_desc(node.content_desc)
|
||||
label_parts.append(f"desc='{desc[:50]}'")
|
||||
if node.text and node.text != node.content_desc:
|
||||
text = _humanize_desc(node.text)
|
||||
label_parts.append(f"text='{text[:50]}'")
|
||||
if not label_parts:
|
||||
label_parts.append("(no visible text)")
|
||||
box_legend_lines.append(f" [{idx}] {', '.join(label_parts)}")
|
||||
box_legend = "\n".join(box_legend_lines)
|
||||
print("BOX LEGEND:")
|
||||
print(box_legend)
|
||||
|
||||
prompt = (
|
||||
f"You are looking at a mobile app screenshot with numbered bounding boxes drawn around interactive UI elements.\n"
|
||||
f"Each box has a number label (0, 1, 2, ...) in a colored rectangle.\n\n"
|
||||
f"Your task: Find the box number that best matches this intent: '{intent_description}'\n\n"
|
||||
f"LOOK at the actual text, icons, and visual appearance inside each box.\n"
|
||||
f"Do NOT guess based on position alone — read the actual content.\n\n"
|
||||
f"Reply ONLY with a valid JSON object: {{\"box\": <number>}} or {{\"box\": null}} if no box matches."
|
||||
f"Each box has a number label in a colored rectangle.\n\n"
|
||||
f"Box legend (what each box contains):\n{box_legend}\n\n"
|
||||
f"Your task: Find the exact box number that corresponds to this intent: '{intent_description}'\n\n"
|
||||
f"CRITICAL RULES:\n"
|
||||
f"1. If the intent contains a word in quotes (e.g., 'Search', 'New Message'), you MUST look at the Box legend and pick the box that contains that word (case-insensitive). Do not pick anything else.\n"
|
||||
f"2. For icons without text:\n"
|
||||
f" - 'like button' = HEART-SHAPED ICON (♡/❤), usually has desc='Like'.\n"
|
||||
f" - 'comment button' = SPEECH BUBBLE ICON, usually has desc='Comment'.\n"
|
||||
f"3. Do NOT select text, captions, or view counts if looking for an icon.\n"
|
||||
f"4. Ignore numbers inside the text itself. Do not confuse the text '19' with Box [19].\n"
|
||||
f"5. If the intent contains 'following', you MUST pick the box containing 'following'. Do NOT pick 'followers' or 'Follow'.\n"
|
||||
f"6. If the intent is to tap a 'post', 'first post', or 'grid item':\n"
|
||||
f" - Look for boxes with descriptions containing 'photos by', 'Reel by', or 'row 1, column 1'.\n"
|
||||
f" - Pick the FIRST matching box index (e.g. if [0] says '6 photos...', return 0, NOT 6).\n"
|
||||
f" - Do NOT pick navigation buttons like 'Search'.\n"
|
||||
f"7. If the intent is a bottom navigation tab (e.g. 'profile tab', 'home tab'):\n"
|
||||
f" - These are always at the BOTTOM edge of the screen.\n"
|
||||
f" - 'profile tab' is usually the furthest right icon (your avatar).\n"
|
||||
f" - 'home tab' is the furthest left icon (house).\n"
|
||||
f" - 'explore tab' is the magnifying glass.\n"
|
||||
f" - 'reels tab' is the video clapperboard.\n"
|
||||
f"8. If the intent involves 'author username' or 'author profile':\n"
|
||||
f" - Pick the profile picture (e.g. 'Profile picture of <username>') or the username text.\n"
|
||||
f" - NEVER pick a 'Follow' button. Do NOT pick 'Follow <username>'.\n"
|
||||
f"9. If the intent is 'save post':\n"
|
||||
f" - The save icon is the bookmark icon on the bottom right of the post image/video.\n"
|
||||
f" - Usually has desc='Add to Saved' or 'Save'. Do NOT pick the post text or other action buttons.\n"
|
||||
f"10. If the exact control is NOT visible, return null. Do NOT guess.\n\n"
|
||||
f'Reply ONLY with a valid JSON object: {{"box": <number>}} or {{"box": null}}'
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -254,7 +398,8 @@ class IntentResolver:
|
||||
filtered_candidates = [n for n in candidates if n.area < 500000]
|
||||
if "profile" in intent_lower:
|
||||
filtered_candidates = [
|
||||
n for n in filtered_candidates
|
||||
n
|
||||
for n in filtered_candidates
|
||||
if not any(kw in (n.resource_id or "").lower() for kw in ("tab", "navigation", "action_bar"))
|
||||
]
|
||||
if not filtered_candidates:
|
||||
@@ -266,8 +411,8 @@ class IntentResolver:
|
||||
|
||||
node_context = []
|
||||
for i, node in enumerate(filtered_candidates):
|
||||
text = node.text or ""
|
||||
desc = node.content_desc or ""
|
||||
text = _humanize_desc(node.text or "")
|
||||
desc = _humanize_desc(node.content_desc or "")
|
||||
res_id = node.resource_id or ""
|
||||
node_context.append(f"[{i}] text='{text}', desc='{desc}', id='{res_id}', bounds=[{node.y1},{node.y2}]")
|
||||
|
||||
@@ -275,9 +420,15 @@ class IntentResolver:
|
||||
f"You are a Spatial UI Intent Resolver.\n"
|
||||
f"Goal: Find the single best UI element to interact with to satisfy the intent: '{intent_description}'.\n"
|
||||
f"Candidates:\n" + "\n".join(node_context) + "\n\n"
|
||||
"CRITICAL RULES:\n"
|
||||
"1. If the intent is a bottom navigation tab (e.g. 'profile tab', 'home tab'):\n"
|
||||
" - These are always at the BOTTOM of the screen (typically y > 2100).\n"
|
||||
" - 'profile tab' is usually the furthest right.\n"
|
||||
" - 'home tab' is the furthest left.\n"
|
||||
" - Do NOT select 'Go to <user>'s profile' or other header text.\n"
|
||||
"2. If none of the candidates clearly and safely match the intent, return null.\n\n"
|
||||
"Reply ONLY with a valid JSON object strictly matching this schema:\n"
|
||||
'{"selected_index": <integer or null>}\n'
|
||||
"If none of the candidates match the intent, return null."
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -296,5 +447,3 @@ class IntentResolver:
|
||||
logger.warning(f"⚠️ [IntentResolver] Text-based VLM resolution failed ({e}).")
|
||||
|
||||
return None
|
||||
|
||||
|
||||
|
||||
@@ -164,16 +164,7 @@ class ScreenIdentity:
|
||||
logger.info("🛡️ [ScreenIdentity] Content-creation overlay detected → MODAL")
|
||||
return ScreenType.MODAL
|
||||
|
||||
# Priority 1: Check Qdrant Semantic Cache
|
||||
if signature and self.screen_memory and self.screen_memory.is_connected:
|
||||
cached_type_str = self.screen_memory.get_screen_type(signature, similarity_threshold=0.92)
|
||||
if cached_type_str:
|
||||
try:
|
||||
return ScreenType[cached_type_str]
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
# Priority 2: Structural Heuristics (Instant, for core tabs)
|
||||
# Priority 1: Structural Heuristics (100% Deterministic)
|
||||
if "unified_follow_list_tab_layout" in ids or "follow_list_container" in ids:
|
||||
return ScreenType.FOLLOW_LIST
|
||||
|
||||
@@ -188,19 +179,48 @@ class ScreenIdentity:
|
||||
if any(marker in ids for marker in REELS_MARKERS):
|
||||
return ScreenType.REELS_FEED
|
||||
|
||||
# DM thread detection — structural markers present inside DM conversations
|
||||
if "direct_thread_header" in ids or "row_thread_composer_edittext" in ids:
|
||||
# DM thread detection — Semantic app-agnostic markers (chat input fields)
|
||||
chat_input_markers = ["Message...", "Nachricht...", "Type a message", "Nachricht senden", "Send a message"]
|
||||
if any(marker in texts for marker in chat_input_markers) or "direct_thread_header" in ids:
|
||||
return ScreenType.DM_THREAD
|
||||
|
||||
# Priority 2: Check Qdrant Semantic Cache (Fuzzy/VLM derived)
|
||||
if signature and self.screen_memory and self.screen_memory.is_connected:
|
||||
cached_type_str = self.screen_memory.get_screen_type(signature, similarity_threshold=0.92)
|
||||
if cached_type_str:
|
||||
try:
|
||||
return ScreenType[cached_type_str]
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
if "row_feed_button_like" in ids and "row_feed_photo_profile_name" in ids and not selected_tab:
|
||||
return ScreenType.POST_DETAIL
|
||||
|
||||
# Story view structural markers — present in full-screen story viewer.
|
||||
# Stories hide the navigation tab bar, so selected_tab is always None.
|
||||
# Must be checked BEFORE tab-based fallbacks to prevent UNKNOWN classification.
|
||||
STORY_MARKERS = (
|
||||
"reel_viewer_media_layout",
|
||||
"reel_viewer_header",
|
||||
"reel_viewer_progress_bar",
|
||||
"reel_viewer_root",
|
||||
"story_viewer_container",
|
||||
"reel_viewer_content_layout",
|
||||
)
|
||||
if any(marker in ids for marker in STORY_MARKERS):
|
||||
return ScreenType.STORY_VIEW
|
||||
# Fallback: content-desc "Like Story" or "Send story" confirms story context
|
||||
if "like story" in desc_lower or "send story" in desc_lower or "nachricht senden" in desc_lower:
|
||||
return ScreenType.STORY_VIEW
|
||||
|
||||
if selected_tab == "feed_tab":
|
||||
return ScreenType.HOME_FEED
|
||||
if selected_tab == "clips_tab":
|
||||
return ScreenType.REELS_FEED
|
||||
if selected_tab == "search_tab":
|
||||
return ScreenType.EXPLORE_GRID
|
||||
if "action_bar_search_edit_text" in ids and "search_tab" in ids:
|
||||
return ScreenType.EXPLORE_GRID
|
||||
if selected_tab == "profile_tab":
|
||||
return ScreenType.OWN_PROFILE
|
||||
if selected_tab == "direct_tab":
|
||||
@@ -214,11 +234,11 @@ class ScreenIdentity:
|
||||
|
||||
cfg = Config()
|
||||
url = (
|
||||
getattr(cfg.args, "ai_embedding_url", "http://localhost:11434/api/chat")
|
||||
getattr(cfg.args, "ai_model_url", "http://localhost:11434/api/generate")
|
||||
if hasattr(cfg, "args")
|
||||
else "http://localhost:11434/api/chat"
|
||||
else "http://localhost:11434/api/generate"
|
||||
)
|
||||
model = getattr(cfg.args, "ai_embedding_model", "llama3") if hasattr(cfg, "args") else "llama3"
|
||||
model = getattr(cfg.args, "ai_model", "qwen3.5:latest") if hasattr(cfg, "args") else "qwen3.5:latest"
|
||||
|
||||
layout_context = (
|
||||
f"Selected Tab: {selected_tab}\nResource IDs: {list(ids)}\nVisible Texts context: {texts[:10]}\n"
|
||||
@@ -284,7 +304,7 @@ class ScreenIdentity:
|
||||
if "back" in desc_lower:
|
||||
actions.append("tap back button")
|
||||
if any("follow" in e.get("text", "").lower() for e in clickable_elements):
|
||||
actions.append("tap follow button")
|
||||
actions.append("tap 'Follow' button")
|
||||
|
||||
if screen_type == ScreenType.OWN_PROFILE or screen_type == ScreenType.OTHER_PROFILE:
|
||||
if "message" in desc_lower or "nachricht" in desc_lower:
|
||||
@@ -299,10 +319,11 @@ class ScreenIdentity:
|
||||
|
||||
# Grid items
|
||||
if screen_type == ScreenType.EXPLORE_GRID:
|
||||
actions.append("tap first grid item")
|
||||
actions.append("tap first post")
|
||||
|
||||
# Scroll
|
||||
actions.append("scroll down")
|
||||
actions.append("scroll up")
|
||||
actions.append("press back")
|
||||
|
||||
return list(set(actions)) # Deduplicate
|
||||
|
||||
@@ -149,10 +149,15 @@ class SpatialParser:
|
||||
# Filter zero-area nodes early
|
||||
if right > left and bottom > top:
|
||||
self._node_counter += 1
|
||||
text_val = attrib.get("text", "").strip()
|
||||
hint_val = attrib.get("hint", "").strip()
|
||||
if not text_val and hint_val:
|
||||
text_val = hint_val
|
||||
|
||||
node = SpatialNode(
|
||||
node_id=f"n_{self._node_counter}",
|
||||
class_name=attrib.get("class", ""),
|
||||
text=attrib.get("text", "").strip(),
|
||||
text=text_val,
|
||||
content_desc=attrib.get("content-desc", "").strip(),
|
||||
resource_id=attrib.get("resource-id", "").strip(),
|
||||
bounds=(left, top, right, bottom),
|
||||
|
||||
@@ -135,7 +135,16 @@ def align_active_post(device):
|
||||
"""
|
||||
aligned = False
|
||||
attempts = 0
|
||||
max_attempts = 3
|
||||
max_attempts = 5 # Increased for structural retry loop
|
||||
|
||||
# Intents for structural discovery
|
||||
intents = [
|
||||
"post author header profile",
|
||||
"post username name",
|
||||
"row_feed_photo_profile_name", # ID fallback
|
||||
"clips_viewer_author_container", # Reels fallback
|
||||
"feed post content", # Final desperation
|
||||
]
|
||||
|
||||
while not aligned and attempts < max_attempts:
|
||||
attempts += 1
|
||||
@@ -144,15 +153,19 @@ def align_active_post(device):
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
telepath = TelepathicEngine.get_instance()
|
||||
target_node = telepath.find_best_node(
|
||||
xml, "post author header profile", min_confidence=0.4, device=device, track=False
|
||||
)
|
||||
|
||||
target_node = None
|
||||
for intent in intents:
|
||||
target_node = telepath.find_best_node(xml, intent, min_confidence=0.35, device=device, track=False)
|
||||
if target_node:
|
||||
break
|
||||
|
||||
if target_node:
|
||||
original_attribs = target_node.get("original_attribs", {})
|
||||
bounds = original_attribs.get("bounds")
|
||||
|
||||
# If bounds is a tuple from SpatialNode.to_dict()
|
||||
if isinstance(bounds, tuple) and len(bounds) == 4:
|
||||
if isinstance(bounds, (tuple, list)) and len(bounds) == 4:
|
||||
left, t, r, b = bounds
|
||||
else:
|
||||
# Fallback to string parsing
|
||||
@@ -162,44 +175,65 @@ def align_active_post(device):
|
||||
if m:
|
||||
left, t, r, b = map(int, m.groups())
|
||||
else:
|
||||
break # Cannot parse bounds
|
||||
logger.warning(f"📐 [Alignment] Could not parse bounds: {bounds}")
|
||||
continue
|
||||
|
||||
# Check if this is a false positive (e.g. bottom bar item misclassified)
|
||||
# Post headers should be in the top half usually, or at least not at the very bottom
|
||||
info = device.get_info()
|
||||
h = info.get("displayHeight", 2400)
|
||||
if t > h * 0.85:
|
||||
logger.debug(f"📐 [Alignment] Rejecting node at y={t} (too low, likely bottom bar)")
|
||||
continue
|
||||
|
||||
header_y = (t + b) // 2
|
||||
target_y = 250
|
||||
target_y = 250 # Top margin for headers
|
||||
diff = header_y - target_y
|
||||
|
||||
# If target is off-center (> 100px), execute precise correction swipe
|
||||
if abs(diff) > 100:
|
||||
# If target is off-center (> 50px for higher precision), execute precise correction swipe
|
||||
if abs(diff) > 50:
|
||||
info = device.get_info()
|
||||
w, h = info.get("displayWidth", 1080), info.get("displayHeight", 2400)
|
||||
w = info.get("displayWidth", 1080)
|
||||
cx = w // 2
|
||||
|
||||
max_safe_swipe = int(h * 0.4)
|
||||
|
||||
# Calculate movement
|
||||
dist = min(abs(diff), max_safe_swipe)
|
||||
if diff > 0:
|
||||
# Content is too LOW. Move it UP.
|
||||
dist = min(diff, max_safe_swipe)
|
||||
# Content is too LOW. Move it UP (Swipe UP).
|
||||
start_y = int(h * 0.7)
|
||||
end_y = start_y - dist
|
||||
else:
|
||||
# Content is too HIGH. Move it DOWN.
|
||||
dist = min(abs(diff), max_safe_swipe)
|
||||
# Content is too HIGH. Move it DOWN (Swipe DOWN).
|
||||
start_y = int(h * 0.3)
|
||||
end_y = start_y + dist
|
||||
|
||||
# Duration 1.0s = precise mechanical drag with ZERO momentum
|
||||
device.swipe(cx, start_y, cx, end_y, duration=1.0)
|
||||
logger.debug(f"📐 [Alignment] Attempt {attempts}: Snapping {diff}px (Swipe {start_y} -> {end_y})")
|
||||
# Duration 1.5s = ultra-precise mechanical drag with ZERO momentum
|
||||
device.swipe(cx, start_y, cx, end_y, duration=1.5)
|
||||
sleep(1.0)
|
||||
logger.debug(f"📐 [Alignment] Snapping attempt {attempts}: Shifted {diff}px.")
|
||||
|
||||
# Refresh XML for next iteration check
|
||||
continue
|
||||
else:
|
||||
logger.info(f"🎯 [Alignment] Perfect snap achieved after {attempts} attempts.")
|
||||
aligned = True
|
||||
else:
|
||||
break # No header found, cannot align
|
||||
logger.debug(f"📐 [Alignment] No structural markers found on attempt {attempts}.")
|
||||
# If we can't find any markers, maybe we are stuck in a transition.
|
||||
# Micro-wobble to force a layout update.
|
||||
if attempts < 3:
|
||||
info = device.get_info()
|
||||
w, h = info.get("displayWidth", 1080), info.get("displayHeight", 2400)
|
||||
device.swipe(w // 2, h // 2, w // 2, h // 2 - 20, duration=0.2)
|
||||
sleep(0.5)
|
||||
device.swipe(w // 2, h // 2 - 20, w // 2, h // 2, duration=0.2)
|
||||
sleep(1.0)
|
||||
else:
|
||||
break
|
||||
except Exception as e:
|
||||
logger.debug(f"📐 [Alignment] Snapping correction failed: {e}")
|
||||
break
|
||||
|
||||
if aligned and attempts > 1:
|
||||
logger.debug(f"📐 [Alignment] Snapped post cleanly into view after {attempts} attempts.")
|
||||
return True
|
||||
return aligned
|
||||
|
||||
@@ -138,6 +138,7 @@ class QNavGraph:
|
||||
"like": "tap like button",
|
||||
"comment": "tap comment button",
|
||||
"share": "tap share button",
|
||||
"follow": "tap follow button",
|
||||
}
|
||||
for keyword, required_action in action_checks.items():
|
||||
if keyword in goal.lower() and required_action not in available:
|
||||
@@ -209,7 +210,7 @@ class QNavGraph:
|
||||
# Grid & Profile
|
||||
"tap_explore_grid_item": "first image in explore grid",
|
||||
"tap_story_tray_item": "profile picture avatar story ring",
|
||||
"tap_follow_button": "tap follow button on profile",
|
||||
"tap_follow_button": "tap 'Follow' button on profile",
|
||||
"tap_grid_first_post": "first image post in profile grid",
|
||||
"tap_back": "tap back button icon arrow",
|
||||
"tap_message_icon": "tap direct message icon inbox",
|
||||
|
||||
@@ -125,10 +125,10 @@ class QdrantBase:
|
||||
if key:
|
||||
headers["Authorization"] = f"Bearer {key}"
|
||||
# OpenAI/OpenRouter use 'input' instead of 'prompt'
|
||||
payload = {"model": model, "input": str(text)[:8000]}
|
||||
payload = {"model": model, "input": str(text)[:2000]}
|
||||
else:
|
||||
# Local Ollama
|
||||
payload = {"model": model, "prompt": str(text)[:8000]}
|
||||
payload = {"model": model, "prompt": str(text)[:2000]}
|
||||
|
||||
# Log to prevent user from thinking the bot is hung during model swap in VRAM
|
||||
if not getattr(self, "_has_logged_embedding", False):
|
||||
@@ -155,8 +155,8 @@ class QdrantBase:
|
||||
return data["data"][0]["embedding"]
|
||||
return None
|
||||
except Exception as e:
|
||||
logger.debug(f"Failed to generate embedding via {url}: {e}")
|
||||
return None
|
||||
logger.error(f"Failed to generate embedding via {url}: {e}")
|
||||
raise
|
||||
|
||||
def generate_uuid(self, seed_string: str) -> str:
|
||||
"""
|
||||
@@ -361,7 +361,7 @@ class UIMemoryDB(QdrantBase):
|
||||
sig = re.sub(r"\s+", " ", sig).strip()
|
||||
|
||||
# 3. Strict truncation for nomic-embed-text context window
|
||||
return sig[:4000]
|
||||
return sig[:2000]
|
||||
|
||||
def _deterministic_id(self, intent: str) -> str:
|
||||
"""
|
||||
@@ -429,8 +429,9 @@ class UIMemoryDB(QdrantBase):
|
||||
if exact_points:
|
||||
eval_result = _evaluate_payload(exact_points[0].payload, score=1.0, point_id=point_id)
|
||||
if eval_result:
|
||||
logger.debug(
|
||||
f"Resolved intent '{intent}' from Qdrant Memory via EXACT ID MATCH! (Confidence: {eval_result['effective_confidence']:.2f})"
|
||||
logger.info(
|
||||
f"🧠 [Memory] Applying learned pattern for '{intent}' (EXACT MATCH, Confidence: {eval_result['effective_confidence']:.2f})",
|
||||
extra={"color": "\x1b[36m"} # Cyan color
|
||||
)
|
||||
return eval_result["solution"]
|
||||
# If exact match failed evaluation (e.g. decayed), we shouldn't fall back to vector search because it's the exact intent!
|
||||
@@ -459,8 +460,9 @@ class UIMemoryDB(QdrantBase):
|
||||
if results and results[0].score >= similarity_threshold:
|
||||
eval_result = _evaluate_payload(results[0].payload, score=results[0].score, point_id=results[0].id)
|
||||
if eval_result:
|
||||
logger.debug(
|
||||
f"Resolved intent '{intent}' from Qdrant Memory via vector search! (Score: {results[0].score:.3f}, Confidence: {eval_result['effective_confidence']:.2f})"
|
||||
logger.info(
|
||||
f"🧠 [Memory] Applying learned pattern for '{intent}' (VECTOR MATCH, Score: {results[0].score:.3f}, Confidence: {eval_result['effective_confidence']:.2f})",
|
||||
extra={"color": "\x1b[36m"} # Cyan color
|
||||
)
|
||||
return eval_result["solution"]
|
||||
return None
|
||||
@@ -511,7 +513,10 @@ class UIMemoryDB(QdrantBase):
|
||||
],
|
||||
wait=True,
|
||||
)
|
||||
logger.info(f"Learned pattern for '{intent}' and saved to Qdrant Memory (ID: {point_id[:8]}...).")
|
||||
logger.info(
|
||||
f"📥 [Memory] Learned new pattern for '{intent}' and saved to Qdrant (ID: {point_id[:8]}...)",
|
||||
extra={"color": "\x1b[35m"} # Magenta color
|
||||
)
|
||||
except Exception as e:
|
||||
logger.debug(f"Qdrant storage error: {e}")
|
||||
|
||||
@@ -573,7 +578,12 @@ class UIMemoryDB(QdrantBase):
|
||||
payload={"confidence": new_confidence},
|
||||
points=[point_id],
|
||||
)
|
||||
logger.debug(f"Confidence for '{intent}' adjusted to {new_confidence:.2f} (delta: {delta:+.2f}).")
|
||||
color = "\x1b[32m" if delta > 0 else "\x1b[31m" # Green for positive, Red for negative
|
||||
symbol = "📈 [Memory] Positive Reinforcement:" if delta > 0 else "📉 [Memory] Negative Reinforcement:"
|
||||
logger.info(
|
||||
f"{symbol} Confidence for '{intent}' adjusted to {new_confidence:.2f} (delta: {delta:+.2f})",
|
||||
extra={"color": color}
|
||||
)
|
||||
except Exception as e:
|
||||
logger.debug(f"Confidence adjustment error: {e}")
|
||||
|
||||
|
||||
@@ -369,8 +369,8 @@ class SituationalAwarenessEngine:
|
||||
args = Config().args
|
||||
except Exception:
|
||||
pass
|
||||
model = getattr(args, "ai_telepathic_model", "qwen3.5:latest")
|
||||
url = getattr(args, "ai_telepathic_url", "http://localhost:11434/api/generate")
|
||||
model = getattr(args, "ai_model", "qwen3.5:latest")
|
||||
url = getattr(args, "ai_model_url", "http://localhost:11434/api/generate")
|
||||
|
||||
res = query_telepathic_llm(
|
||||
model=model,
|
||||
@@ -459,8 +459,8 @@ class SituationalAwarenessEngine:
|
||||
args = Config().args
|
||||
except Exception:
|
||||
pass
|
||||
model = getattr(args, "ai_telepathic_model", "qwen3.5:latest")
|
||||
url = getattr(args, "ai_telepathic_url", "http://localhost:11434/api/generate")
|
||||
model = getattr(args, "ai_model", "qwen3.5:latest")
|
||||
url = getattr(args, "ai_model_url", "http://localhost:11434/api/generate")
|
||||
|
||||
res = query_telepathic_llm(
|
||||
model=model, url=url, system_prompt="Strict JSON classifier.", user_prompt=prompt, use_local_edge=True
|
||||
|
||||
@@ -64,12 +64,6 @@ class TelepathicEngine:
|
||||
"""
|
||||
logger.debug(f"🧠 [SpatialEngine] Resolving intent: '{intent_description}'")
|
||||
|
||||
# 1.25 Structural Fast-Paths (Deterministically bypass VLM for fixed UI elements)
|
||||
nodes_dicts = self._extract_semantic_nodes(xml_string)
|
||||
fast_node = self._structural_fast_path(intent_description, nodes_dicts, kwargs.get("skip_positions"), xml_string)
|
||||
if fast_node:
|
||||
return fast_node
|
||||
|
||||
# 1. Parse into Spatial Topology
|
||||
root = self._parser.parse(xml_string)
|
||||
if not root:
|
||||
@@ -134,96 +128,6 @@ class TelepathicEngine:
|
||||
nodes = self._parser.get_clickable_nodes(root)
|
||||
return [self._translate_node(n) for n in nodes]
|
||||
|
||||
def _structural_fast_path(self, intent_description: str, nodes: list, skip_positions: set = None, xml_string: str = "") -> Optional[dict]:
|
||||
if skip_positions is None:
|
||||
skip_positions = set()
|
||||
|
||||
intent_lower = intent_description.lower()
|
||||
if "first image in explore grid" in intent_lower:
|
||||
grid_items = [
|
||||
n
|
||||
for n in nodes
|
||||
if n.get("y", 9999) < 2000
|
||||
and (
|
||||
"grid card layout container" in (n.get("semantic_string", "") or "").lower()
|
||||
or "image button" in (n.get("semantic_string", "") or "").lower()
|
||||
)
|
||||
and (n.get("x", -1), n.get("y", -1)) not in skip_positions
|
||||
]
|
||||
if grid_items:
|
||||
# Sort by y (row) then by x (col)
|
||||
grid_items.sort(key=lambda n: (n.get("y", 9999), n.get("x", 9999)))
|
||||
return grid_items[0]
|
||||
|
||||
# --- DM Engine Structural Fast Paths ---
|
||||
if "find the message input text field" in intent_lower:
|
||||
for n in nodes:
|
||||
if "row_thread_composer_edittext" in n.get("id", "") or "row_thread_composer_edittext" in n.get("resource_id", ""):
|
||||
return n
|
||||
|
||||
if "find the send message button" in intent_lower:
|
||||
for n in nodes:
|
||||
if "row_thread_composer_button_send" in n.get("id", "") or "row_thread_composer_button_send" in n.get("resource_id", ""):
|
||||
return n
|
||||
|
||||
if "find unread message threads" in intent_lower:
|
||||
# We must be extremely strict here: It's only unread if it has the "unread" text or indicator dot
|
||||
unread_candidates = []
|
||||
|
||||
# 1. Find all explicit unread dots in the UI
|
||||
dot_nodes = [
|
||||
d for d in nodes
|
||||
if "thread_indicator_status_dot" in (d.get("id", "") or d.get("resource_id", ""))
|
||||
]
|
||||
|
||||
import re
|
||||
|
||||
for n in nodes:
|
||||
is_unread = False
|
||||
res_id = n.get("id", "") or n.get("resource_id", "")
|
||||
|
||||
if "row_inbox_container" in res_id and (n.get("x", -1), n.get("y", -1)) not in skip_positions:
|
||||
content_desc = (n.get("description", "") or "").lower()
|
||||
semantic = (n.get("semantic_string", "") or "").lower()
|
||||
|
||||
# 1. Check for explicit 'unread' in description
|
||||
if "unread" in content_desc or "unread" in semantic:
|
||||
is_unread = True
|
||||
|
||||
# 2. Check if an unread dot falls inside this container's bounds
|
||||
if not is_unread and dot_nodes:
|
||||
bounds_str = n.get("bounds", "")
|
||||
m = re.match(r"\[\d+,(\d+)\]\[\d+,(\d+)\]", bounds_str)
|
||||
if m:
|
||||
y1, y2 = int(m.group(1)), int(m.group(2))
|
||||
for dot in dot_nodes:
|
||||
dot_y = dot.get("y", -1)
|
||||
if y1 <= dot_y <= y2:
|
||||
is_unread = True
|
||||
break
|
||||
|
||||
if is_unread and n.get("y", 0) > 200:
|
||||
unread_candidates.append(n)
|
||||
|
||||
if unread_candidates:
|
||||
unread_candidates.sort(key=lambda n: n.get("y", 9999))
|
||||
return unread_candidates[0]
|
||||
|
||||
if "find the last received message text" in intent_lower:
|
||||
msg_candidates = []
|
||||
for n in nodes:
|
||||
res_id = n.get("id", "") or n.get("resource_id", "")
|
||||
# The actual message text bubble
|
||||
if "direct_text_message_text_view" in res_id or "message_content" in res_id:
|
||||
msg_candidates.append(n)
|
||||
|
||||
if msg_candidates:
|
||||
# Sort by y descending (bottom-most message is the last one)
|
||||
msg_candidates.sort(key=lambda n: n.get("y", 0), reverse=True)
|
||||
return msg_candidates[0]
|
||||
|
||||
return None
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
# Action Memory Delegation
|
||||
# ──────────────────────────────────────────────
|
||||
@@ -297,35 +201,28 @@ class TelepathicEngine:
|
||||
y = node.get("y", 0)
|
||||
semantic = (node.get("semantic_string", "") or "").lower()
|
||||
|
||||
# 1. Navigation Tab Guard (Must be at the bottom)
|
||||
nav_intents = [
|
||||
"tap direct message icon inbox",
|
||||
"tap inbox",
|
||||
"tap heart icon notifications",
|
||||
"tap home tab",
|
||||
"tap explore tab",
|
||||
"tap reels tab",
|
||||
"tap profile tab",
|
||||
"tap messages tab",
|
||||
]
|
||||
is_nav_intent = any(n in intent for n in nav_intents)
|
||||
if is_nav_intent:
|
||||
if y < screen_height * 0.85:
|
||||
return False
|
||||
return True
|
||||
|
||||
# 2. Block non-nav intents from clicking in the nav zone
|
||||
if y >= screen_height * 0.85:
|
||||
# Not a nav intent, but trying to click the nav bar
|
||||
return False
|
||||
|
||||
# 3. Post Username Guard
|
||||
# 1. Post Username Guard
|
||||
if "post username" in intent:
|
||||
if "story" in semantic and y < screen_height * 0.2:
|
||||
if "story" in semantic:
|
||||
# E.g. "Your Story" circle at the top
|
||||
return False
|
||||
# Prevent tapping a search list item when looking for a post username
|
||||
if "row search user container" in semantic.replace("_", " "):
|
||||
return False
|
||||
return True
|
||||
|
||||
# 3.5 Media Content Guard
|
||||
if "post media content" in intent:
|
||||
# Prevent tapping a search keyword instead of a media post
|
||||
if "row search keyword title" in semantic.replace("_", " "):
|
||||
return False
|
||||
|
||||
# 3.6 Post Author Username Header Guard
|
||||
if "post author username header" in intent:
|
||||
# Prevent tapping the follow button when looking for the username
|
||||
if "follow button" in semantic.replace("_", " "):
|
||||
return False
|
||||
|
||||
# 4. Profile Picture/Story Ring Guard
|
||||
if "story ring" in intent or "avatar" in intent:
|
||||
current_user = self._get_current_username()
|
||||
|
||||
@@ -65,8 +65,15 @@ def _run_zero_latency_unfollow_loop(
|
||||
try:
|
||||
xml_dump = device.dump_hierarchy()
|
||||
|
||||
# Smart Unfollow Phase 1: Find user rows instead of just clicking "Following"
|
||||
nodes = telepathic._extract_semantic_nodes(xml_dump, "find user profile rows in list", threshold=0.7)
|
||||
# Autonomously identify user rows via Semantic Extraction
|
||||
telepathic = cognitive_stack.get("telepathic")
|
||||
nodes = []
|
||||
if telepathic:
|
||||
nodes = telepathic._extract_semantic_nodes(
|
||||
xml_dump, "List item containing a user profile image, username, and following/following button"
|
||||
)
|
||||
else:
|
||||
logger.warning("No telepathic engine found, skipping semantic extraction.")
|
||||
|
||||
action_taken = False
|
||||
for node in nodes:
|
||||
|
||||
@@ -102,7 +102,6 @@ def is_ad(xml_hierarchy: str, cognitive_stack: dict = None) -> bool:
|
||||
If a cognitive_stack is provided, it uses the Telepathic Engine for
|
||||
semantic classification (Zero-Latency vector lookup).
|
||||
"""
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
if cognitive_stack:
|
||||
@@ -123,7 +122,9 @@ def is_ad(xml_hierarchy: str, cognitive_stack: dict = None) -> bool:
|
||||
"com.instagram.android:id/ad_not_interested_button",
|
||||
]
|
||||
|
||||
AD_MARKERS = [r"\b(sponsored|ad|advertisement)\b", r"\b(gesponsert|anzeige|werbung)\b"]
|
||||
# Standalone label patterns: match only when the text/desc IS the ad marker,
|
||||
# not when "ad" appears inside longer phrases like "Create messaging ad"
|
||||
AD_EXACT_LABELS = {"ad", "sponsored", "advertisement", "gesponsert", "anzeige", "werbung"}
|
||||
|
||||
try:
|
||||
root = ET.fromstring(xml_hierarchy)
|
||||
@@ -137,11 +138,13 @@ def is_ad(xml_hierarchy: str, cognitive_stack: dict = None) -> bool:
|
||||
if any(marker_id in res_id for marker_id in AD_RESOURCE_IDS):
|
||||
return True
|
||||
|
||||
# Content check (Legacy)
|
||||
searchable = f"{content_desc} {text}".lower()
|
||||
for pattern in AD_MARKERS:
|
||||
if re.search(pattern, searchable):
|
||||
return True
|
||||
# Exact label match: only trigger when the entire text/desc
|
||||
# IS an ad marker (e.g. text="Ad", content-desc="Sponsored")
|
||||
# This prevents false positives from "Create messaging ad"
|
||||
if text.strip().lower() in AD_EXACT_LABELS:
|
||||
return True
|
||||
if content_desc.strip().lower() in AD_EXACT_LABELS:
|
||||
return True
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
@@ -9,11 +9,14 @@ from datetime import datetime
|
||||
# Add root project path so we can import internal modules safely
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from GramAddict.core.llm_provider import query_telepathic_llm
|
||||
from GramAddict.core.llm_provider import query_llm, query_telepathic_llm
|
||||
|
||||
BENCHMARKS_FILE = os.path.join(os.path.dirname(__file__), "data/llm_benchmarks.json")
|
||||
SCENARIOS_FILE = os.path.join(os.path.dirname(__file__), "data/benchmark_scenarios.json")
|
||||
|
||||
# Minimum iterations for statistical significance
|
||||
MIN_ITERATIONS = 5
|
||||
|
||||
|
||||
def load_json(path):
|
||||
if os.path.exists(path):
|
||||
@@ -31,35 +34,37 @@ def save_json(path, data):
|
||||
|
||||
|
||||
def normalize_scores(db):
|
||||
"""Normalize relative performance by AVERAGE score per scenario, not raw totals."""
|
||||
if not db.get("models"):
|
||||
return db
|
||||
|
||||
# 1. Find the highest raw score across all models
|
||||
max_raw = 0
|
||||
max_avg = 0
|
||||
leader_model = None
|
||||
|
||||
for name, data in db["models"].items():
|
||||
if data.get("is_unsuitable"):
|
||||
continue
|
||||
|
||||
raw = data.get("raw_score", 0)
|
||||
if raw > max_raw:
|
||||
max_raw = raw
|
||||
scenario_count = data.get("scenario_count", 1)
|
||||
avg = data.get("raw_score", 0) / max(scenario_count, 1)
|
||||
data["avg_score_per_scenario"] = round(avg, 1)
|
||||
|
||||
if avg > max_avg:
|
||||
max_avg = avg
|
||||
leader_model = name
|
||||
elif raw == max_raw and max_raw > 0:
|
||||
# Tie-breaker: Latency
|
||||
elif avg == max_avg and max_avg > 0:
|
||||
current_lat = data.get("latency_ms", 99999)
|
||||
leader_lat = db["models"][leader_model].get("latency_ms", 99999)
|
||||
if current_lat < leader_lat:
|
||||
leader_model = name
|
||||
|
||||
if max_raw == 0:
|
||||
if max_avg == 0:
|
||||
return db
|
||||
|
||||
# 2. Update relative performance
|
||||
for name, data in db["models"].items():
|
||||
raw = data.get("raw_score", 0)
|
||||
data["relative_performance_pct"] = round((raw / max_raw) * 100, 1)
|
||||
scenario_count = data.get("scenario_count", 1)
|
||||
avg = data.get("raw_score", 0) / max(scenario_count, 1)
|
||||
data["relative_performance_pct"] = round((avg / max_avg) * 100, 1)
|
||||
data["is_leader"] = name == leader_model
|
||||
|
||||
return db
|
||||
@@ -75,21 +80,15 @@ def get_installed_ollama_models():
|
||||
models = []
|
||||
for line in output.split("\n")[1:]:
|
||||
if line.strip():
|
||||
# Format: NAME, ID, SIZE, MODIFIED
|
||||
parts = line.split()
|
||||
if len(parts) >= 3:
|
||||
name = parts[0]
|
||||
size = parts[2]
|
||||
|
||||
# 1. Skip if size is '-' (remote/cloud model)
|
||||
if size == "-":
|
||||
continue
|
||||
|
||||
# 2. Skip ':cloud' tagged models explicitly
|
||||
if ":cloud" in name:
|
||||
continue
|
||||
|
||||
# 3. Filter out purely embedding models
|
||||
if any(k in name.lower() for k in ["embed", "minilm", "rerank"]):
|
||||
continue
|
||||
|
||||
@@ -100,7 +99,131 @@ def get_installed_ollama_models():
|
||||
return []
|
||||
|
||||
|
||||
def benchmark_model(model_name: str, url: str, force: bool = False, iterations: int = 3):
|
||||
def _run_telepathic_scenario(scenario, model_name, url, iterations):
|
||||
"""Run a telepathic (JSON element selection) scenario."""
|
||||
system_prompt = (
|
||||
"You identify which UI element to tap based ONLY on a JSON array of parsed Android elements. "
|
||||
'Output ONLY valid JSON: {"index": number, "reason": "brief reason"}'
|
||||
)
|
||||
|
||||
user_prompt = (
|
||||
f"Which element should I tap to: {scenario['task']}\n\n"
|
||||
f"Elements:\n{json.dumps(scenario['nodes'], indent=1)}\n\n"
|
||||
"Rules:\n"
|
||||
"- Pick the SMALLEST, most specific button or icon\n"
|
||||
"- NEVER pick large containers\n"
|
||||
'Return: {"index": number, "reason": "..."}'
|
||||
)
|
||||
|
||||
latencies = []
|
||||
scores = []
|
||||
successes = 0
|
||||
|
||||
for _ in range(iterations):
|
||||
start_time = time.time()
|
||||
try:
|
||||
resp_str = query_telepathic_llm(model_name, url, system_prompt, user_prompt)
|
||||
latency = int((time.time() - start_time) * 1000)
|
||||
latencies.append(latency)
|
||||
except Exception as e:
|
||||
print(f" ❌ API Request failed: {e}")
|
||||
scores.append(0)
|
||||
continue
|
||||
|
||||
raw_points = 0
|
||||
try:
|
||||
clean = resp_str.strip()
|
||||
if clean.startswith("```json"):
|
||||
clean = clean[7:]
|
||||
if clean.endswith("```"):
|
||||
clean = clean[:-3]
|
||||
data = json.loads(clean)
|
||||
|
||||
if "index" in data and "reason" in data:
|
||||
raw_points += 40
|
||||
if data["index"] == scenario["target_index"]:
|
||||
raw_points += 60
|
||||
successes += 1
|
||||
else:
|
||||
print(f" ❌ Wrong index ({data.get('index')}). Target was {scenario['target_index']}.")
|
||||
else:
|
||||
print(" ❌ JSON missing fields.")
|
||||
except Exception:
|
||||
print(" ❌ JSON Parsing failed.")
|
||||
|
||||
scores.append(raw_points)
|
||||
|
||||
return scores, latencies, successes
|
||||
|
||||
|
||||
def _run_brain_scenario(scenario, model_name, url, iterations):
|
||||
"""Run a brain action extraction scenario (format_json=False)."""
|
||||
system_prompt = (
|
||||
f"You are an autonomous Instagram agent. Your goal is: '{scenario['task']}'.\n"
|
||||
f"You are currently on screen: {scenario['screen_type']}.\n"
|
||||
f"Available actions: {scenario['available_actions']}\n"
|
||||
"INSTRUCTIONS: Reply with ONLY the action string. Nothing else."
|
||||
)
|
||||
|
||||
user_prompt = "Choose the next best action."
|
||||
|
||||
latencies = []
|
||||
scores = []
|
||||
successes = 0
|
||||
|
||||
for _ in range(iterations):
|
||||
start_time = time.time()
|
||||
try:
|
||||
# CRITICAL: Use format_json=False — this is the Brain code path
|
||||
ans = query_llm(
|
||||
url=url,
|
||||
model=model_name,
|
||||
prompt=user_prompt,
|
||||
system=system_prompt,
|
||||
format_json=False,
|
||||
timeout=30,
|
||||
temperature=0.0,
|
||||
max_tokens=50,
|
||||
)
|
||||
latency = int((time.time() - start_time) * 1000)
|
||||
latencies.append(latency)
|
||||
except Exception as e:
|
||||
print(f" ❌ API Request failed: {e}")
|
||||
scores.append(0)
|
||||
continue
|
||||
|
||||
raw_points = 0
|
||||
if ans and "response" in ans:
|
||||
response = ans["response"].strip().lower()
|
||||
|
||||
# Points for structural adherence (returned a clean string)
|
||||
if response and response in [a.lower() for a in scenario["available_actions"]]:
|
||||
raw_points += 40
|
||||
|
||||
# Points for correctness
|
||||
if scenario.get("accept_any_valid"):
|
||||
# Any valid action from the list is acceptable
|
||||
raw_points += 60
|
||||
successes += 1
|
||||
elif response == scenario["target_action"].lower():
|
||||
raw_points += 60
|
||||
successes += 1
|
||||
else:
|
||||
print(f" ⚠️ Valid but suboptimal: '{response}' (target: '{scenario['target_action']}')")
|
||||
raw_points += 20 # Partial credit for valid but wrong action
|
||||
else:
|
||||
print(f" ❌ Invalid response: '{response}' not in available actions")
|
||||
else:
|
||||
print(" ❌ Empty or null response from LLM")
|
||||
|
||||
scores.append(raw_points)
|
||||
|
||||
return scores, latencies, successes
|
||||
|
||||
|
||||
def benchmark_model(model_name: str, url: str, force: bool = False, iterations: int = MIN_ITERATIONS):
|
||||
iterations = max(iterations, MIN_ITERATIONS) # Enforce minimum
|
||||
|
||||
db = load_json(BENCHMARKS_FILE) or {"models": {}}
|
||||
scenarios_data = load_json(SCENARIOS_FILE)
|
||||
if not scenarios_data:
|
||||
@@ -113,95 +236,46 @@ def benchmark_model(model_name: str, url: str, force: bool = False, iterations:
|
||||
print(f"Typical execution skip for {model_name} (Rel: {pct}%). Use --force.")
|
||||
return
|
||||
|
||||
print(f"\n🚀 [Competitive Benchmarking] Model: {model_name}")
|
||||
print(f"\n🚀 [Competitive Benchmarking] Model: {model_name} ({iterations} iterations)")
|
||||
|
||||
total_raw = 0
|
||||
total_latency = 0
|
||||
results_detail = {}
|
||||
passed_all = True
|
||||
|
||||
system_prompt = (
|
||||
"You identify which UI element to tap based ONLY on a JSON array of parsed Android elements. "
|
||||
'Output ONLY valid JSON: {"index": number, "reason": "brief reason"}'
|
||||
)
|
||||
|
||||
scenarios = scenarios_data["scenarios"]
|
||||
for scenario in scenarios:
|
||||
print(f"--- Running: {scenario['name']} ---")
|
||||
scenario_type = scenario.get("type", "telepathic")
|
||||
print(f"--- [{scenario_type.upper()}] {scenario['name']} ---")
|
||||
|
||||
user_prompt = (
|
||||
f"Which element should I tap to: {scenario['task']}\n\n"
|
||||
f"Elements:\n{json.dumps(scenario['nodes'], indent=1)}\n\n"
|
||||
"Rules:\n"
|
||||
"- Pick the SMALLEST, most specific button or icon\n"
|
||||
"- NEVER pick large containers\n"
|
||||
"Return: {\"index\": number, \"reason\": \"...\"}"
|
||||
)
|
||||
|
||||
scenario_latencies = []
|
||||
scenario_scores = []
|
||||
successes = 0
|
||||
|
||||
for _ in range(iterations):
|
||||
start_time = time.time()
|
||||
try:
|
||||
resp_str = query_telepathic_llm(model_name, url, system_prompt, user_prompt)
|
||||
latency = int((time.time() - start_time) * 1000)
|
||||
scenario_latencies.append(latency)
|
||||
except Exception as e:
|
||||
print(f" ❌ API Request failed for scenario {scenario['id']}: {e}")
|
||||
passed_all = False
|
||||
continue
|
||||
|
||||
raw_points = 0
|
||||
try:
|
||||
clean = resp_str.strip()
|
||||
if clean.startswith("```json"):
|
||||
clean = clean[7:]
|
||||
if clean.endswith("```"):
|
||||
clean = clean[:-3]
|
||||
data = json.loads(clean)
|
||||
|
||||
# Points for structural adherence
|
||||
if "index" in data and "reason" in data:
|
||||
raw_points += 40
|
||||
|
||||
# Points for correctness
|
||||
if data["index"] == scenario["target_index"]:
|
||||
raw_points += 60
|
||||
successes += 1
|
||||
else:
|
||||
print(f" ❌ Wrong index ({data.get('index')}). Target was {scenario['target_index']}.")
|
||||
else:
|
||||
print(" ❌ JSON missing fields.")
|
||||
except Exception:
|
||||
print(" ❌ JSON Parsing failed.")
|
||||
|
||||
scenario_scores.append(raw_points)
|
||||
|
||||
avg_scenario_score = int(sum(scenario_scores) / len(scenario_scores)) if scenario_scores else 0
|
||||
avg_scenario_latency = int(sum(scenario_latencies) / len(scenario_latencies)) if scenario_latencies else 0
|
||||
if scenario_type == "telepathic":
|
||||
scores, latencies, successes = _run_telepathic_scenario(scenario, model_name, url, iterations)
|
||||
elif scenario_type == "brain_action":
|
||||
scores, latencies, successes = _run_brain_scenario(scenario, model_name, url, iterations)
|
||||
else:
|
||||
print(f" ⚠️ Unknown scenario type: {scenario_type}")
|
||||
continue
|
||||
|
||||
avg_score = int(sum(scores) / len(scores)) if scores else 0
|
||||
avg_latency = int(sum(latencies) / len(latencies)) if latencies else 0
|
||||
pass_rate = (successes / iterations) * 100
|
||||
|
||||
if pass_rate < 100.0:
|
||||
passed_all = False
|
||||
|
||||
print(
|
||||
f" Result: {pass_rate:.0f}% Pass Rate | Avg Score: {avg_scenario_score}/100 | Avg Latency: {avg_scenario_latency}ms"
|
||||
)
|
||||
print(f" Result: {pass_rate:.0f}% Pass | Avg Score: {avg_score}/100 | Avg Latency: {avg_latency}ms")
|
||||
|
||||
# Consistent format: always an object
|
||||
results_detail[scenario["id"]] = {
|
||||
"avg_score": avg_scenario_score,
|
||||
"avg_score": avg_score,
|
||||
"pass_rate": pass_rate,
|
||||
"latency": avg_scenario_latency,
|
||||
"latency": avg_latency,
|
||||
}
|
||||
total_raw += avg_scenario_score
|
||||
total_latency += avg_scenario_latency
|
||||
total_raw += avg_score
|
||||
total_latency += avg_latency
|
||||
|
||||
avg_latency = total_latency // len(scenarios) if scenarios else 0
|
||||
print(
|
||||
f"\n📊 {model_name} Result: {'PASS' if passed_all else 'FAIL'} | Avg Score: {total_raw} | Latency: {avg_latency}ms"
|
||||
)
|
||||
print(f"\n📊 {model_name}: {'PASS' if passed_all else 'FAIL'} | Total: {total_raw} | Latency: {avg_latency}ms")
|
||||
|
||||
if model_name not in db["models"]:
|
||||
db["models"][model_name] = {}
|
||||
@@ -209,16 +283,17 @@ def benchmark_model(model_name: str, url: str, force: bool = False, iterations:
|
||||
db["models"][model_name].update(
|
||||
{
|
||||
"raw_score": total_raw,
|
||||
"scenario_count": len(scenarios),
|
||||
"telepathic_score": int((total_raw / (len(scenarios) * 100)) * 100) if scenarios else 0,
|
||||
"latency_ms": avg_latency,
|
||||
"last_tested": datetime.utcnow().isoformat() + "Z",
|
||||
"details": results_detail,
|
||||
"passed_all": passed_all,
|
||||
"is_unsuitable": not passed_all,
|
||||
"iterations": iterations,
|
||||
}
|
||||
)
|
||||
|
||||
# Recalculate relative scores across all models
|
||||
db = normalize_scores(db)
|
||||
save_json(BENCHMARKS_FILE, db)
|
||||
|
||||
@@ -233,7 +308,7 @@ if __name__ == "__main__":
|
||||
parser.add_argument("--force", action="store_true", help="Force re-testing")
|
||||
parser.add_argument("--all-ollama", action="store_true", help="Automatically find and test all local Ollama models")
|
||||
parser.add_argument(
|
||||
"--iterations", type=int, default=3, help="Number of iterations per scenario to measure reliability"
|
||||
"--iterations", type=int, default=MIN_ITERATIONS, help=f"Iterations per scenario (min: {MIN_ITERATIONS})"
|
||||
)
|
||||
|
||||
args, unknown = parser.parse_known_args()
|
||||
|
||||
@@ -89,6 +89,11 @@ telegram-reports: false # for using telegram-reports you have also to configure
|
||||
interactions-count: 30-40
|
||||
likes-count: 1-2
|
||||
likes-percentage: 100
|
||||
|
||||
plugins:
|
||||
dm_reply:
|
||||
enabled: false # Generates AI replies to unread DMs
|
||||
|
||||
stories-count: 1-2
|
||||
stories-percentage: 30-40
|
||||
carousel-count: 2-3
|
||||
|
||||
@@ -20,8 +20,11 @@ else
|
||||
filename=$(basename "$file")
|
||||
# Heuristic: Try to find a matching unit test
|
||||
test_file="tests/unit/test_${filename}"
|
||||
core_test_file="tests/core/test_${filename}"
|
||||
if [ -f "$test_file" ]; then
|
||||
TEST_TARGETS="$TEST_TARGETS $test_file"
|
||||
elif [ -f "$core_test_file" ]; then
|
||||
TEST_TARGETS="$TEST_TARGETS $core_test_file"
|
||||
else
|
||||
# If no direct unit test, fallback to running all unit tests to be safe
|
||||
echo "⚠️ No direct unit test found for $file, falling back to all unit tests."
|
||||
@@ -41,7 +44,7 @@ if [ -z "$TEST_TARGETS" ]; then
|
||||
fi
|
||||
|
||||
echo "🧪 Running tests on: $TEST_TARGETS"
|
||||
venv/bin/pytest $TEST_TARGETS --cov=GramAddict --cov-report=xml -q
|
||||
PYTHONPATH=. venv/bin/pytest $TEST_TARGETS --cov=GramAddict --cov-report=xml -q
|
||||
|
||||
echo ""
|
||||
echo "========================================"
|
||||
|
||||
@@ -18,8 +18,8 @@ logger = logging.getLogger("TestingToolkit")
|
||||
def _save_dump(device, fixture_dir, filename, description):
|
||||
logger.info(f"⏳ Waiting for UI to settle for [{description}]...")
|
||||
time.sleep(3.5) # ensure animations finish
|
||||
xml_data = device.dump_hierarchy()
|
||||
|
||||
xml_data = device.dump_hierarchy()
|
||||
if not xml_data or len(xml_data) < 100:
|
||||
logger.warning(f"⚠️ Received empty or exceptionally small XML dump for {filename}. Is the app open?")
|
||||
|
||||
@@ -28,6 +28,23 @@ def _save_dump(device, fixture_dir, filename, description):
|
||||
f.write(xml_data)
|
||||
logger.info(f"✅ Saved REAL DUMP to {filename} ({len(xml_data)} bytes)")
|
||||
|
||||
# Capture screenshot
|
||||
try:
|
||||
import base64
|
||||
|
||||
screenshot_b64 = device.get_screenshot_b64()
|
||||
if screenshot_b64:
|
||||
screenshot_data = base64.b64decode(screenshot_b64)
|
||||
screenshot_filename = filename.replace(".xml", ".jpg")
|
||||
screenshot_path = os.path.join(fixture_dir, screenshot_filename)
|
||||
with open(screenshot_path, "wb") as f:
|
||||
f.write(screenshot_data)
|
||||
logger.info(f"✅ Saved REAL SCREENSHOT to {screenshot_filename}")
|
||||
else:
|
||||
logger.warning(f"⚠️ Failed to capture screenshot for {filename}")
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to capture screenshot: {e}")
|
||||
|
||||
|
||||
def run_interactive_guide(device, fixture_dir):
|
||||
print("\n" + "=" * 60)
|
||||
@@ -79,6 +96,13 @@ def main():
|
||||
|
||||
device_id = args.device
|
||||
|
||||
# Auto-detect config if not provided
|
||||
if not args.config:
|
||||
if os.path.exists("test_config.yml"):
|
||||
args.config = "test_config.yml"
|
||||
elif os.path.exists("config.yml"):
|
||||
args.config = "config.yml"
|
||||
|
||||
# Try to extract device from config if provided
|
||||
if args.config:
|
||||
try:
|
||||
|
||||
107
test_config.yml
@@ -1,107 +0,0 @@
|
||||
# ════════════════════════════════════════════════════════════════════════════
|
||||
# 🤖 ANTIGRAVITY ELITE CONFIGURATION (Plugin-Based Architecture)
|
||||
# ════════════════════════════════════════════════════════════════════════════
|
||||
# Dieses Brain ist modular aufgebaut. Jedes Verhalten ist ein autonomes Plugin.
|
||||
# Einstellungen können global oder spezifisch für jedes Plugin definiert werden.
|
||||
# Design-Prinzip: Zero Trust & Fail Fast.
|
||||
|
||||
identity:
|
||||
username: "marisaundmarc"
|
||||
persona: "Travel blogger, landscape photographer, and outdoors enthusiast"
|
||||
vibe: "friendly, authentic, helpful, and appreciative of good art"
|
||||
|
||||
mission:
|
||||
strategy: "aggressive_growth"
|
||||
selectivity_threshold: "high"
|
||||
target_audience: "travel, landscape, nature, mountain photography, wanderlust"
|
||||
blacklist_topics: "onlyfans, nsfw, sale, discount, promo, 18+, giveaway, crypto"
|
||||
|
||||
# ── Core Action Jobs (Wann soll der Bot wo aktiv werden?) ──
|
||||
actions:
|
||||
feed: "5-10" # Anzahl der Posts im Home-Feed pro Session
|
||||
explore: "5-10" # Anzahl der Posts im Explore-Grid
|
||||
# reels: "5-10" # In Entwicklung
|
||||
# stories: "3-5" # In Entwicklung
|
||||
|
||||
# ── Plugin Configuration (Das Herzstück der Verhaltenssteuerung) ──
|
||||
plugins:
|
||||
# 🛡️ Guards & Safety (Filtern, bevor Interaktion passiert)
|
||||
ad_guard:
|
||||
enabled: true
|
||||
|
||||
close_friends_guard:
|
||||
enabled: true # Postings von 'Engen Freunden' ignorieren
|
||||
|
||||
obstacle_guard:
|
||||
enabled: true # Popups, Update-Dialoge etc. wegräumen
|
||||
|
||||
anomaly_handler:
|
||||
enabled: true # Erkennt Blockierungen oder Captchas sofort (Fail Fast)
|
||||
|
||||
# 🧠 Perception & Evaluation (Vorverarbeitung)
|
||||
post_data_extraction:
|
||||
enabled: true # Extrahiert Text, Hashtags und Metadata
|
||||
|
||||
resonance_evaluator:
|
||||
visual_vibe_check_percentage: 100
|
||||
selectivity_threshold: "high"
|
||||
|
||||
# ⚡ Interactions (Die eigentlichen Aktionen)
|
||||
likes:
|
||||
percentage: 100 # Wahrscheinlichkeit pro Post
|
||||
count: "2-3" # Falls im Grid, wie viele?
|
||||
|
||||
comment:
|
||||
percentage: 40
|
||||
dry_run: true # Generiert KI-Kommentare ohne zu posten (Review-Mode)
|
||||
|
||||
follow:
|
||||
percentage: 100
|
||||
|
||||
repost:
|
||||
percentage: 20 # Teilen in die eigene Story
|
||||
|
||||
story_view:
|
||||
percentage: 80
|
||||
count: "1-3" # Wie viele Stories pro User schauen?
|
||||
|
||||
profile_visit:
|
||||
percentage: 100 # Wahrscheinlichkeit, vom Feed ins Profil zu gehen
|
||||
learn_own_profile: true
|
||||
|
||||
grid_like:
|
||||
percentage: 60 # Liked Posts aus dem Profil-Grid des Users
|
||||
count: "1-3"
|
||||
|
||||
# 🎢 Special Behaviors
|
||||
carousel_browsing:
|
||||
percentage: 100 # Erkennt Carousels und swiped durch
|
||||
count: "2-4" # Wie viele Slides pro Post?
|
||||
|
||||
rabbit_hole:
|
||||
percentage: 30 # Geht tiefer in verwandte Profile (Inception-Mode)
|
||||
|
||||
darwin_dwell:
|
||||
percentage: 50 # Simuliert unregelmäßige Lesezeiten (Biometrie)
|
||||
|
||||
# ── Limits & Budget ──
|
||||
limits:
|
||||
daily_budget_hours: 2.5
|
||||
max_comments_per_day: 40
|
||||
total_likes_limit: 300
|
||||
total_follows_limit: 50
|
||||
speed_multiplier: 1.0
|
||||
|
||||
# ── Infrastructure & System ──
|
||||
device: 192.168.1.206:36369
|
||||
app-id: com.instagram.android
|
||||
debug: true
|
||||
blank_start: true
|
||||
|
||||
# ── AI Model Endpoints (Ollama / OpenRouter) ──
|
||||
ai-model: qwen3.5:latest
|
||||
ai-model-url: http://localhost:11434/api/generate
|
||||
ai-telepathic-model: llava:latest
|
||||
ai-telepathic-url: http://localhost:11434/api/generate
|
||||
ai-embedding-model: nomic-embed-text
|
||||
ai-embedding-url: http://localhost:11434/api/embeddings
|
||||
621
test_errors.txt
Normal file
@@ -0,0 +1,621 @@
|
||||
============================= test session starts ==============================
|
||||
platform darwin -- Python 3.11.9, pytest-8.3.5, pluggy-1.5.0 -- /Users/marcmintel/.pyenv/versions/3.11.9/bin/python3
|
||||
cachedir: .pytest_cache
|
||||
hypothesis profile 'default'
|
||||
metadata: {'Python': '3.11.9', 'Platform': 'macOS-26.3.1-arm64-arm-64bit', 'Packages': {'pytest': '8.3.5', 'pluggy': '1.5.0'}, 'Plugins': {'anyio': '4.8.0', 'snapshot': '0.9.0', 'xdist': '3.7.0', 'instafail': '0.5.0', 'allure-pytest': '2.15.0', 'hypothesis': '6.140.2', 'html': '4.1.1', 'json-report': '1.5.0', 'timeout': '2.4.0', 'metadata': '3.1.1', 'md': '0.2.0', 'Faker': '37.8.0', 'clarity': '1.0.1', 'datadir': '1.8.0', 'cov': '6.2.1', 'mock': '3.14.1', 'pytest_httpserver': '1.1.3', 'sugar': '1.1.1', 'benchmark': '5.1.0', 'rerunfailures': '16.0.1'}}
|
||||
benchmark: 5.1.0 (defaults: timer=time.perf_counter disable_gc=False min_rounds=5 min_time=0.000005 max_time=1.0 calibration_precision=10 warmup=False warmup_iterations=100000)
|
||||
rootdir: /Volumes/Alpha SSD/Coding/bot
|
||||
configfile: pyproject.toml
|
||||
plugins: anyio-4.8.0, snapshot-0.9.0, xdist-3.7.0, instafail-0.5.0, allure-pytest-2.15.0, hypothesis-6.140.2, html-4.1.1, json-report-1.5.0, timeout-2.4.0, metadata-3.1.1, md-0.2.0, Faker-37.8.0, clarity-1.0.1, datadir-1.8.0, cov-6.2.1, mock-3.14.1, pytest_httpserver-1.1.3, sugar-1.1.1, benchmark-5.1.0, rerunfailures-16.0.1
|
||||
collecting ... collected 186 items
|
||||
|
||||
tests/anomalies/test_cognitive_edge_cases.py::TestCognitiveEdgeCases::test_resonance_edge_cases PASSED [ 0%]
|
||||
tests/anomalies/test_cognitive_edge_cases.py::TestCognitiveEdgeCases::test_darwin_edge_cases PASSED [ 1%]
|
||||
tests/anomalies/test_cognitive_edge_cases.py::TestCognitiveEdgeCases::test_growth_brain_edge_cases PASSED [ 1%]
|
||||
tests/anomalies/test_hardware_anomalies_gauss.py::test_gaussian_distribution PASSED [ 2%]
|
||||
tests/anomalies/test_telepathic_guards.py::TestTelepathicGuards::test_strict_story_ring_guard FAILED [ 2%]
|
||||
tests/anomalies/test_telepathic_guards.py::TestTelepathicGuards::test_strict_button_guard FAILED [ 3%]
|
||||
tests/anomalies/test_telepathic_guards.py::TestTelepathicGuards::test_like_semantic_verification PASSED [ 3%]
|
||||
tests/anomalies/test_trap_radome.py::test_zero_point_trap PASSED [ 4%]
|
||||
tests/anomalies/test_trap_radome.py::test_micro_pixel_trap PASSED [ 4%]
|
||||
tests/anomalies/test_trap_radome.py::test_safe_normal_button PASSED [ 5%]
|
||||
tests/anomalies/test_trap_radome.py::test_transparent_interceptor_trap PASSED [ 5%]
|
||||
tests/anomalies/test_trap_radome.py::test_accessibility_trap PASSED [ 6%]
|
||||
tests/e2e/test_e2e_animation_timing.py::test_animation_timing_mocks_purged SKIPPED [ 6%]
|
||||
tests/e2e/test_e2e_dm_engine.py::test_e2e_dm_full_flow_success_real SKIPPED [ 7%]
|
||||
tests/e2e/test_e2e_dm_engine.py::test_e2e_dm_no_messages_real SKIPPED [ 8%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_normal_instagram ERROR [ 8%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_foreign_app_google ERROR [ 9%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_notification_shade ERROR [ 9%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_system_permission_dialog ERROR [ 10%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_instagram_survey_modal ERROR [ 10%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_unknown_modal_interstitial ERROR [ 11%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_action_blocked ERROR [ 11%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_empty_dump ERROR [ 12%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_none_dump ERROR [ 12%]
|
||||
tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_passive_scaffold_as_normal ERROR [ 13%]
|
||||
tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_home_feed_as_normal ERROR [ 13%]
|
||||
tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_explore_grid_as_normal ERROR [ 14%]
|
||||
tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_other_profile_as_normal ERROR [ 15%]
|
||||
tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_post_detail_as_normal ERROR [ 15%]
|
||||
tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_profile_tagged_tab_as_normal ERROR [ 16%]
|
||||
tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_survey_modal_as_obstacle ERROR [ 16%]
|
||||
tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_mystery_interstitial_as_obstacle ERROR [ 17%]
|
||||
tests/e2e/test_engine_perception.py::test_perception_mock_theater_purged SKIPPED [ 17%]
|
||||
tests/e2e/test_goap_loop_prevention.py::test_goap_planner_avoids_infinite_loop_on_masked_edge ERROR [ 18%]
|
||||
tests/e2e/test_goap_loop_prevention.py::test_screen_topology_find_route_avoids_blocked_edges ERROR [ 18%]
|
||||
tests/e2e/test_goap_loop_prevention.py::test_telepathic_engine_finds_following_node_on_profile ERROR [ 19%]
|
||||
tests/e2e/test_goap_loop_prevention.py::test_following_vs_followers_are_both_candidates ERROR [ 19%]
|
||||
tests/e2e/test_goap_loop_prevention.py::test_vlm_prompt_humanizes_content_desc ERROR [ 20%]
|
||||
tests/e2e/test_goap_loop_prevention.py::test_live_vlm_selects_following_not_followers ERROR [ 20%]
|
||||
tests/e2e/test_reel_interactions.py::test_reel_like_button_not_caption ERROR [ 21%]
|
||||
tests/e2e/test_reel_interactions.py::test_reel_follow_button_returns_none_when_absent ERROR [ 22%]
|
||||
tests/e2e/test_reel_interactions.py::test_reel_post_author_selects_username ERROR [ 22%]
|
||||
tests/e2e/test_reel_interactions.py::test_reel_dedup_preserves_like_button ERROR [ 23%]
|
||||
tests/e2e/test_reel_interactions.py::test_reel_caption_with_like_word_is_not_like_button ERROR [ 23%]
|
||||
tests/e2e/test_reel_navigation_guards.py::test_intent_resolver_profile_tab_rejects_author_profile ERROR [ 24%]
|
||||
tests/e2e/test_reel_navigation_guards.py::test_intent_resolver_profile_tab_selects_real_tab ERROR [ 24%]
|
||||
tests/e2e/test_sim_full_lifecycle.py::test_full_lifecycle_sim_purged SKIPPED [ 25%]
|
||||
tests/e2e/test_visual_intent_resolver.py::test_visual_discovery_creates_annotated_screenshot ERROR [ 25%]
|
||||
tests/e2e/test_visual_intent_resolver.py::test_visual_discovery_finds_following_by_seeing ERROR [ 26%]
|
||||
tests/e2e/test_visual_intent_resolver.py::test_resolve_uses_visual_discovery_when_device_available ERROR [ 26%]
|
||||
tests/integration/test_ad_detection.py::test_real_sponsored_reel_flexcode_is_detected PASSED [ 27%]
|
||||
tests/integration/test_ad_detection.py::test_normal_post_not_ad PASSED [ 27%]
|
||||
tests/integration/test_ad_detection.py::test_peugeot_carousel_ad_is_detected PASSED [ 28%]
|
||||
tests/integration/test_core_nav_dm_regression.py::test_core_nav_rejects_generic_action_bar_right PASSED [ 29%]
|
||||
tests/integration/test_false_positive.py::test_real_normal_post_is_not_ad PASSED [ 29%]
|
||||
tests/integration/test_telepathic_hardening.py::test_keyword_nav_threshold FAILED [ 30%]
|
||||
tests/integration/test_telepathic_hardening.py::test_direct_tab_fast_path FAILED [ 30%]
|
||||
tests/integration/test_telepathic_keyword.py::test_keyword_fast_path_no_feed_pollution FAILED [ 31%]
|
||||
tests/repro_reports/test_repro_api_mismatch.py::TestAPIMismatch::test_repro_extract_semantic_nodes_type_error PASSED [ 31%]
|
||||
tests/repro_reports/test_repro_position_rejection.py::TestPositionRejection::test_repro_following_button_rejection_fix FAILED [ 32%]
|
||||
tests/repro_reports/test_repro_reels_tab_hallucination.py::TestReproReelsTabHallucination::test_reels_tab_selection FAILED [ 32%]
|
||||
tests/tdd/test_bezier_gesture.py::TestScrollCurve::test_returns_correct_number_of_points PASSED [ 33%]
|
||||
tests/tdd/test_bezier_gesture.py::TestScrollCurve::test_start_and_end_are_near_requested_positions PASSED [ 33%]
|
||||
tests/tdd/test_bezier_gesture.py::TestScrollCurve::test_path_is_non_linear PASSED [ 34%]
|
||||
tests/tdd/test_bezier_gesture.py::TestScrollCurve::test_right_hander_arcs_right PASSED [ 34%]
|
||||
tests/tdd/test_bezier_gesture.py::TestScrollCurve::test_left_hander_arcs_left PASSED [ 35%]
|
||||
tests/tdd/test_bezier_gesture.py::TestScrollCurve::test_pressure_has_gaussian_peak PASSED [ 36%]
|
||||
tests/tdd/test_bezier_gesture.py::TestScrollCurve::test_pressure_within_valid_range PASSED [ 36%]
|
||||
tests/tdd/test_bezier_gesture.py::TestScrollCurve::test_all_points_have_three_components PASSED [ 37%]
|
||||
tests/tdd/test_bezier_gesture.py::TestTapCurve::test_returns_three_points PASSED [ 37%]
|
||||
tests/tdd/test_bezier_gesture.py::TestTapCurve::test_micro_drift_is_small PASSED [ 38%]
|
||||
tests/tdd/test_bezier_gesture.py::TestTapCurve::test_pressure_sequence_is_down_peak_up PASSED [ 38%]
|
||||
tests/tdd/test_bezier_gesture.py::TestHorizontalSwipeCurve::test_returns_reasonable_point_count PASSED [ 39%]
|
||||
tests/tdd/test_bezier_gesture.py::TestHorizontalSwipeCurve::test_horizontal_distance_is_correct_direction PASSED [ 39%]
|
||||
tests/tdd/test_bezier_gesture.py::TestHorizontalSwipeCurve::test_vertical_arc_exists PASSED [ 40%]
|
||||
tests/tdd/test_bezier_gesture.py::TestSigmoidTiming::test_total_duration_matches PASSED [ 40%]
|
||||
tests/tdd/test_bezier_gesture.py::TestSigmoidTiming::test_edges_are_slower_than_middle PASSED [ 41%]
|
||||
tests/tdd/test_bezier_gesture.py::TestSigmoidTiming::test_single_point_returns_single_interval PASSED [ 41%]
|
||||
tests/tdd/test_bezier_gesture.py::TestSigmoidTiming::test_no_negative_intervals PASSED [ 42%]
|
||||
tests/tdd/test_physics_body.py::TestHandedness::test_right_hander_anchor_is_right PASSED [ 43%]
|
||||
tests/tdd/test_physics_body.py::TestHandedness::test_left_hander_anchor_is_left PASSED [ 43%]
|
||||
tests/tdd/test_physics_body.py::TestHandedness::test_right_hander_scroll_starts_right PASSED [ 44%]
|
||||
tests/tdd/test_physics_body.py::TestHandedness::test_left_hander_scroll_starts_left PASSED [ 44%]
|
||||
tests/tdd/test_physics_body.py::TestThumbArcBias::test_right_hander_arcs_right PASSED [ 45%]
|
||||
tests/tdd/test_physics_body.py::TestThumbArcBias::test_left_hander_arcs_left PASSED [ 45%]
|
||||
tests/tdd/test_physics_body.py::TestSessionDrift::test_drift_is_zero_initially PASSED [ 46%]
|
||||
tests/tdd/test_physics_body.py::TestSessionDrift::test_drift_accumulates_over_many_gestures PASSED [ 46%]
|
||||
tests/tdd/test_physics_body.py::TestSessionDrift::test_drift_is_bounded PASSED [ 47%]
|
||||
tests/tdd/test_physics_body.py::TestStartPositions::test_positions_stay_within_screen_bounds PASSED [ 47%]
|
||||
tests/tdd/test_physics_body.py::TestStartPositions::test_positions_are_not_identical PASSED [ 48%]
|
||||
tests/tdd/test_physics_body.py::TestStartPositions::test_gesture_count_increments PASSED [ 48%]
|
||||
tests/tdd/test_physics_body.py::TestFatigue::test_fatigue_starts_at_zero PASSED [ 49%]
|
||||
tests/tdd/test_physics_body.py::TestFatigue::test_rapid_gestures_increase_fatigue PASSED [ 50%]
|
||||
tests/tdd/test_physics_body.py::TestFatigue::test_idle_period_reduces_fatigue PASSED [ 50%]
|
||||
tests/tdd/test_physics_body.py::TestFatigue::test_fatigue_is_clamped_0_to_1 PASSED [ 51%]
|
||||
tests/tdd/test_physics_body.py::TestTapPosition::test_tap_position_near_target PASSED [ 51%]
|
||||
tests/tdd/test_physics_body.py::TestTapPosition::test_tap_stays_on_screen PASSED [ 52%]
|
||||
tests/tdd/test_physics_body.py::TestPressureAndTouchMajor::test_pressure_baseline_in_range PASSED [ 52%]
|
||||
tests/tdd/test_physics_body.py::TestPressureAndTouchMajor::test_fatigue_increases_pressure PASSED [ 53%]
|
||||
tests/tdd/test_physics_body.py::TestPressureAndTouchMajor::test_touch_major_in_range PASSED [ 53%]
|
||||
tests/tdd/test_physics_body.py::TestPressureAndTouchMajor::test_fatigue_increases_touch_major PASSED [ 54%]
|
||||
tests/tdd/test_physics_body.py::TestSingleton::test_singleton_returns_same_instance PASSED [ 54%]
|
||||
tests/tdd/test_physics_body.py::TestSingleton::test_reset_clears_singleton PASSED [ 55%]
|
||||
tests/tdd/test_semantic_heuristic_match.py::test_semantic_heuristic_match_blank_start PASSED [ 55%]
|
||||
tests/unit/perception/test_intent_resolver.py::test_intent_resolver_finds_bottom_tab FAILED [ 56%]
|
||||
tests/unit/perception/test_intent_resolver.py::test_intent_resolver_finds_button_by_text PASSED [ 56%]
|
||||
tests/unit/perception/test_intent_resolver.py::test_intent_resolver_returns_none_if_no_match PASSED [ 57%]
|
||||
tests/unit/perception/test_spatial_parser.py::TestSpatialParser::test_parses_xml_into_spatial_nodes PASSED [ 58%]
|
||||
tests/unit/perception/test_spatial_parser.py::TestSpatialParser::test_extracts_all_clickable_nodes PASSED [ 58%]
|
||||
tests/unit/perception/test_spatial_parser.py::TestSpatialParser::test_spatial_containment PASSED [ 59%]
|
||||
tests/unit/perception/test_spatial_parser.py::TestSpatialParser::test_spatial_intersection PASSED [ 59%]
|
||||
tests/unit/test_config_plugins.py::test_config_plugin_section PASSED [ 60%]
|
||||
tests/unit/test_config_plugins.py::test_config_plugin_fallback PASSED [ 60%]
|
||||
tests/unit/test_config_plugins.py::test_config_plugin_not_found PASSED [ 61%]
|
||||
tests/unit/test_darwin_engine_comments.py::test_has_comments_true_reel PASSED [ 61%]
|
||||
tests/unit/test_darwin_engine_comments.py::test_has_comments_true_organic PASSED [ 62%]
|
||||
tests/unit/test_darwin_engine_comments.py::test_has_comments_zero_reel PASSED [ 62%]
|
||||
tests/unit/test_darwin_engine_comments.py::test_has_comments_regex_cases PASSED [ 63%]
|
||||
tests/unit/test_dopamine_engine.py::test_dopamine_engine_wants_to_change_feed PASSED [ 63%]
|
||||
tests/unit/test_dopamine_engine.py::test_dopamine_engine_reset_session_clears_boredom PASSED [ 64%]
|
||||
tests/unit/test_dopamine_engine.py::test_dopamine_engine_wants_to_doomscroll PASSED [ 65%]
|
||||
tests/unit/test_dopamine_loop.py::test_feed_switch_resets_boredom PASSED [ 65%]
|
||||
tests/unit/test_dopamine_loop.py::test_session_limit_terminates_session PASSED [ 66%]
|
||||
tests/unit/test_feed_loop_continuation.py::TestFeedLoopContinuation::test_stories_complete_returns_feed_exhausted PASSED [ 66%]
|
||||
tests/unit/test_feed_loop_continuation.py::TestFeedLoopContinuation::test_main_loop_handles_feed_exhausted PASSED [ 67%]
|
||||
tests/unit/test_goap_graph_routing.py::TestGoapGraphRouting::test_planner_routes_to_profile_first_for_following_list PASSED [ 67%]
|
||||
tests/unit/test_goap_graph_routing.py::TestGoapGraphRouting::test_planner_returns_final_action_on_intermediate_screen PASSED [ 68%]
|
||||
tests/unit/test_goap_graph_routing.py::TestGoapGraphRouting::test_planner_detects_goal_already_achieved PASSED [ 68%]
|
||||
tests/unit/test_goap_graph_routing.py::TestGoapGraphRouting::test_planner_routes_explore_to_following_list PASSED [ 69%]
|
||||
tests/unit/test_grid_retry_diversity.py::TestGridRetryDiversity::test_first_call_returns_topmost_leftmost FAILED [ 69%]
|
||||
tests/unit/test_grid_retry_diversity.py::TestGridRetryDiversity::test_retry_skips_failed_position FAILED [ 70%]
|
||||
tests/unit/test_grid_retry_diversity.py::TestGridRetryDiversity::test_skip_multiple_positions FAILED [ 70%]
|
||||
tests/unit/test_grid_retry_diversity.py::TestGridRetryDiversity::test_all_positions_skipped_returns_none FAILED [ 71%]
|
||||
tests/unit/test_is_ad_substring.py::test_is_ad_false_positive_abroad PASSED [ 72%]
|
||||
tests/unit/test_is_ad_substring.py::test_is_ad_true_positive PASSED [ 72%]
|
||||
tests/unit/test_is_ad_substring.py::test_is_ad_true_positive_ad_word PASSED [ 73%]
|
||||
tests/unit/test_nav_intent_classification.py::TestNavIntentClassification::test_dm_intent_is_classified_as_nav_intent PASSED [ 73%]
|
||||
tests/unit/test_nav_intent_classification.py::TestNavIntentClassification::test_inbox_intent_is_classified_as_nav_intent PASSED [ 74%]
|
||||
tests/unit/test_nav_intent_classification.py::TestNavIntentClassification::test_notification_intent_is_classified_as_nav_intent PASSED [ 74%]
|
||||
tests/unit/test_nav_intent_classification.py::TestNavIntentClassification::test_regular_post_intent_still_blocked_in_nav_zone PASSED [ 75%]
|
||||
tests/unit/test_screen_identity_profile.py::test_screen_identity_own_profile_vs_other_profile PASSED [ 75%]
|
||||
tests/unit/test_screen_identity_profile.py::test_screen_identity_other_profile_vs_own_profile PASSED [ 76%]
|
||||
tests/unit/test_screen_topology.py::TestScreenTopologyRouting::test_route_home_to_following_list PASSED [ 76%]
|
||||
tests/unit/test_screen_topology.py::TestScreenTopologyRouting::test_route_already_there PASSED [ 77%]
|
||||
tests/unit/test_screen_topology.py::TestScreenTopologyRouting::test_route_single_hop PASSED [ 77%]
|
||||
tests/unit/test_screen_topology.py::TestScreenTopologyRouting::test_route_reverse_direction PASSED [ 78%]
|
||||
tests/unit/test_screen_topology.py::TestScreenTopologyRouting::test_no_route_from_unreachable PASSED [ 79%]
|
||||
tests/unit/test_screen_topology.py::TestGoalToTargetScreen::test_following_list_goal PASSED [ 79%]
|
||||
tests/unit/test_screen_topology.py::TestGoalToTargetScreen::test_followers_list_goal PASSED [ 80%]
|
||||
tests/unit/test_screen_topology.py::TestGoalToTargetScreen::test_profile_goal PASSED [ 80%]
|
||||
tests/unit/test_screen_topology.py::TestGoalToTargetScreen::test_home_feed_goal PASSED [ 81%]
|
||||
tests/unit/test_screen_topology.py::TestGoalToTargetScreen::test_explore_goal PASSED [ 81%]
|
||||
tests/unit/test_screen_topology.py::TestGoalToTargetScreen::test_messages_goal PASSED [ 82%]
|
||||
tests/unit/test_screen_topology.py::TestGoalToTargetScreen::test_interaction_goal_returns_none PASSED [ 82%]
|
||||
tests/unit/test_screen_topology.py::TestGoalToTargetScreen::test_unknown_goal_returns_none PASSED [ 83%]
|
||||
tests/unit/test_screen_topology.py::TestGetTransitions::test_home_feed_has_profile_tab PASSED [ 83%]
|
||||
tests/unit/test_screen_topology.py::TestGetTransitions::test_own_profile_has_following_list PASSED [ 84%]
|
||||
tests/unit/test_screen_topology.py::TestGetTransitions::test_unknown_screen_returns_empty PASSED [ 84%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameMap::test_following_list_maps PASSED [ 85%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameMap::test_home_feed_maps PASSED [ 86%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameMap::test_stories_feed_maps_to_home PASSED [ 86%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameMap::test_search_feed_maps_to_explore PASSED [ 87%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameToGoal::test_following_list PASSED [ 87%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameToGoal::test_home_feed PASSED [ 88%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameToGoal::test_explore_feed PASSED [ 88%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameToGoal::test_stories_feed PASSED [ 89%]
|
||||
tests/unit/test_screen_topology.py::TestScreenNameToGoal::test_unknown_target PASSED [ 89%]
|
||||
tests/unit/test_screen_topology.py::TestExpectedScreenForAction::test_tap_profile_tab_from_home PASSED [ 90%]
|
||||
tests/unit/test_screen_topology.py::TestExpectedScreenForAction::test_tap_following_list_from_profile PASSED [ 90%]
|
||||
tests/unit/test_screen_topology.py::TestExpectedScreenForAction::test_press_back_from_follow_list PASSED [ 91%]
|
||||
tests/unit/test_screen_topology.py::TestExpectedScreenForAction::test_unknown_action_returns_none PASSED [ 91%]
|
||||
tests/unit/test_screen_topology.py::TestExpectedScreenForAction::test_action_not_available_on_screen PASSED [ 92%]
|
||||
tests/unit/test_screen_topology.py::TestIsStructuralAction::test_tap_profile_tab_is_structural PASSED [ 93%]
|
||||
tests/unit/test_screen_topology.py::TestIsStructuralAction::test_tap_following_list_is_structural PASSED [ 93%]
|
||||
tests/unit/test_screen_topology.py::TestIsStructuralAction::test_random_action_is_not_structural PASSED [ 94%]
|
||||
tests/unit/test_screen_topology.py::TestIsStructuralAction::test_action_on_wrong_screen_is_not_structural PASSED [ 94%]
|
||||
tests/unit/test_session_limits_evaluation.py::test_global_session_limit_evaluation ERROR [ 95%]
|
||||
tests/unit/test_structural_guard.py::test_structural_guard_rejects_own_story_for_post_username PASSED [ 95%]
|
||||
tests/unit/test_structural_guard.py::test_structural_guard_accepts_actual_post_username PASSED [ 96%]
|
||||
tests/unit/test_structural_guard.py::test_structural_guard_rejects_own_username_story PASSED [ 96%]
|
||||
tests/unit/test_structural_guard.py::test_structural_reels_first_grid_item_y_coords PASSED [ 97%]
|
||||
tests/unit/test_telepathic_container_filtering.py::test_media_intent_rejects_grid_containers PASSED [ 97%]
|
||||
tests/unit/test_verify_success_reels.py::TestVerifySuccessGridReels::test_reel_view_accepted_as_valid_grid_result PASSED [ 98%]
|
||||
tests/unit/test_verify_success_reels.py::TestVerifySuccessGridReels::test_normal_feed_post_still_accepted PASSED [ 98%]
|
||||
tests/unit/test_verify_success_reels.py::TestVerifySuccessGridReels::test_explore_grid_still_visible_is_failure PASSED [ 99%]
|
||||
tests/unit/test_verify_success_reels.py::TestVerifySuccessGridReels::test_profile_grid_reel_accepted PASSED [100%]
|
||||
|
||||
==================================== ERRORS ====================================
|
||||
______ ERROR at setup of TestSAEPerception.test_perceive_normal_instagram ______
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_____ ERROR at setup of TestSAEPerception.test_perceive_foreign_app_google _____
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_____ ERROR at setup of TestSAEPerception.test_perceive_notification_shade _____
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
__ ERROR at setup of TestSAEPerception.test_perceive_system_permission_dialog __
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
___ ERROR at setup of TestSAEPerception.test_perceive_instagram_survey_modal ___
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAEPerception.test_perceive_unknown_modal_interstitial _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_______ ERROR at setup of TestSAEPerception.test_perceive_action_blocked _______
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_________ ERROR at setup of TestSAEPerception.test_perceive_empty_dump _________
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_________ ERROR at setup of TestSAEPerception.test_perceive_none_dump __________
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAEPerception.test_perceive_passive_scaffold_as_normal _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAERealFixturePerception.test_perceive_home_feed_as_normal _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAERealFixturePerception.test_perceive_explore_grid_as_normal _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAERealFixturePerception.test_perceive_other_profile_as_normal _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAERealFixturePerception.test_perceive_post_detail_as_normal _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAERealFixturePerception.test_perceive_profile_tagged_tab_as_normal _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAERealFixturePerception.test_perceive_survey_modal_as_obstacle _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_ ERROR at setup of TestSAERealFixturePerception.test_perceive_mystery_interstitial_as_obstacle _
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
___ ERROR at setup of test_goap_planner_avoids_infinite_loop_on_masked_edge ____
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
____ ERROR at setup of test_screen_topology_find_route_avoids_blocked_edges ____
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
___ ERROR at setup of test_telepathic_engine_finds_following_node_on_profile ___
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
______ ERROR at setup of test_following_vs_followers_are_both_candidates _______
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
___________ ERROR at setup of test_vlm_prompt_humanizes_content_desc ___________
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_______ ERROR at setup of test_live_vlm_selects_following_not_followers ________
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_____________ ERROR at setup of test_reel_like_button_not_caption ______________
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
______ ERROR at setup of test_reel_follow_button_returns_none_when_absent ______
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
___________ ERROR at setup of test_reel_post_author_selects_username ___________
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
___________ ERROR at setup of test_reel_dedup_preserves_like_button ____________
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
____ ERROR at setup of test_reel_caption_with_like_word_is_not_like_button _____
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
__ ERROR at setup of test_intent_resolver_profile_tab_rejects_author_profile ___
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_____ ERROR at setup of test_intent_resolver_profile_tab_selects_real_tab ______
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
_____ ERROR at setup of test_visual_discovery_creates_annotated_screenshot _____
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
______ ERROR at setup of test_visual_discovery_finds_following_by_seeing _______
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
__ ERROR at setup of test_resolve_uses_visual_discovery_when_device_available __
|
||||
/Users/marcmintel/.local/lib/python3.11/site-packages/_pytest/config/__init__.py:1694: in getoption
|
||||
val = getattr(self.option, name)
|
||||
E AttributeError: 'Namespace' object has no attribute '--live'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/e2e/conftest.py:195: in mock_all_delays
|
||||
if request.config.getoption("--live"):
|
||||
E ValueError: no option named '--live'
|
||||
____________ ERROR at setup of test_global_session_limit_evaluation ____________
|
||||
file /Volumes/Alpha SSD/Coding/bot/tests/unit/test_session_limits_evaluation.py, line 1
|
||||
def test_global_session_limit_evaluation(mock_logger):
|
||||
E fixture 'mock_logger' not found
|
||||
> available fixtures: _session_faker, anyio_backend, anyio_backend_name, anyio_backend_options, benchmark, benchmark_weave, cache, capfd, capfdbinary, caplog, capsys, capsysbinary, class_mocker, cov, datadir, doctest_namespace, extra, extras, faker, httpserver, httpserver_ipv4, httpserver_ipv6, httpserver_listen_address, httpserver_ssl_context, include_metadata_in_junit_xml, json_metadata, lazy_datadir, lazy_shared_datadir, make_httpserver, make_httpserver_ipv4, make_httpserver_ipv6, metadata, mocker, module_mocker, monkeypatch, no_cover, original_datadir, package_mocker, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, session_mocker, shared_datadir, snapshot, testrun_uid, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory, worker_id
|
||||
> use 'pytest --fixtures [testpath]' for help on them.
|
||||
|
||||
/Volumes/Alpha SSD/Coding/bot/tests/unit/test_session_limits_evaluation.py:1
|
||||
=================================== FAILURES ===================================
|
||||
______________ TestTelepathicGuards.test_strict_story_ring_guard _______________
|
||||
tests/anomalies/test_telepathic_guards.py:23: in test_strict_story_ring_guard
|
||||
assert self.engine._structural_sanity_check(invalid_story, intent, screen_height) is False
|
||||
E AssertionError: assert True is False
|
||||
E + where True = _structural_sanity_check({'area': 100, 'resource_id': 'row_feed_profile_header', 'y': 800}, 'tap story ring avatar', 2400)
|
||||
E + where _structural_sanity_check = <GramAddict.core.telepathic_engine.TelepathicEngine object at 0x137e50e50>._structural_sanity_check
|
||||
E + where <GramAddict.core.telepathic_engine.TelepathicEngine object at 0x137e50e50> = <tests.anomalies.test_telepathic_guards.TestTelepathicGuards object at 0x137cc5190>.engine
|
||||
________________ TestTelepathicGuards.test_strict_button_guard _________________
|
||||
tests/anomalies/test_telepathic_guards.py:45: in test_strict_button_guard
|
||||
assert self.engine._structural_sanity_check(invalid_prof, intent, screen_height) is False
|
||||
E assert True is False
|
||||
E + where True = _structural_sanity_check({'area': 100, 'resource_id': 'username', 'semantic_string': "Go to cayleighanddavid's profile", 'y': 1000}, 'Heart like button for comment', 2400)
|
||||
E + where _structural_sanity_check = <GramAddict.core.telepathic_engine.TelepathicEngine object at 0x138184dd0>._structural_sanity_check
|
||||
E + where <GramAddict.core.telepathic_engine.TelepathicEngine object at 0x138184dd0> = <tests.anomalies.test_telepathic_guards.TestTelepathicGuards object at 0x137cc58d0>.engine
|
||||
__________________________ test_keyword_nav_threshold __________________________
|
||||
tests/integration/test_telepathic_hardening.py:37: in test_keyword_nav_threshold
|
||||
res = engine._keyword_match_score("tap messages tab", [reels_node])
|
||||
E AttributeError: 'TelepathicEngine' object has no attribute '_keyword_match_score'
|
||||
__________________________ test_direct_tab_fast_path ___________________________
|
||||
tests/integration/test_telepathic_hardening.py:57: in test_direct_tab_fast_path
|
||||
res = engine._core_navigation_fast_path("tap messages tab", [direct_node])
|
||||
E AttributeError: 'TelepathicEngine' object has no attribute '_core_navigation_fast_path'
|
||||
___________________ test_keyword_fast_path_no_feed_pollution ___________________
|
||||
tests/integration/test_telepathic_keyword.py:30: in test_keyword_fast_path_no_feed_pollution
|
||||
result = engine._keyword_match_score("tap home tab", nodes)
|
||||
E AttributeError: 'TelepathicEngine' object has no attribute '_keyword_match_score'
|
||||
_______ TestPositionRejection.test_repro_following_button_rejection_fix ________
|
||||
tests/repro_reports/test_repro_position_rejection.py:34: in test_repro_following_button_rejection_fix
|
||||
self.assertTrue(passed_keyword, "Following button should be allowed for following intent")
|
||||
E AssertionError: False is not true : Following button should be allowed for following intent
|
||||
----------------------------- Captured stdout call -----------------------------
|
||||
|
||||
[DEBUG] Intent: 'tap following list', Passed: False
|
||||
|
||||
[DEBUG] Intent: 'some other intent', Passed: False
|
||||
___________ TestReproReelsTabHallucination.test_reels_tab_selection ____________
|
||||
tests/repro_reports/test_repro_reels_tab_hallucination.py:49: in test_reels_tab_selection
|
||||
self.assertIn("clips tab", result["semantic"].lower(), "Should select the clips_tab")
|
||||
E KeyError: 'semantic'
|
||||
----------------------------- Captured stdout call -----------------------------
|
||||
FIND_BEST_NODE CALLED
|
||||
Target selected: None at (324, 2298)
|
||||
____________________ test_intent_resolver_finds_bottom_tab _____________________
|
||||
tests/unit/perception/test_intent_resolver.py:16: in test_intent_resolver_finds_bottom_tab
|
||||
assert best_match == bottom_tab
|
||||
E AssertionError: assert None == SpatialNode(bounds=(0, 2200, 100, 2300), node_id='', class_name='', text='', content_desc='Explore Tab', resource_id='', clickable=True, scrollable=False, children=[], parent=None)
|
||||
_______ TestGridRetryDiversity.test_first_call_returns_topmost_leftmost ________
|
||||
tests/unit/test_grid_retry_diversity.py:84: in test_first_call_returns_topmost_leftmost
|
||||
result = self.engine._grid_fast_path("first image in explore grid", nodes)
|
||||
E AttributeError: 'TelepathicEngine' object has no attribute '_grid_fast_path'
|
||||
___________ TestGridRetryDiversity.test_retry_skips_failed_position ____________
|
||||
tests/unit/test_grid_retry_diversity.py:92: in test_retry_skips_failed_position
|
||||
result = self.engine._grid_fast_path("first image in explore grid", nodes, skip_positions={(178, 558)})
|
||||
E AttributeError: 'TelepathicEngine' object has no attribute '_grid_fast_path'
|
||||
_____________ TestGridRetryDiversity.test_skip_multiple_positions ______________
|
||||
tests/unit/test_grid_retry_diversity.py:99: in test_skip_multiple_positions
|
||||
result = self.engine._grid_fast_path(
|
||||
E AttributeError: 'TelepathicEngine' object has no attribute '_grid_fast_path'
|
||||
________ TestGridRetryDiversity.test_all_positions_skipped_returns_none ________
|
||||
tests/unit/test_grid_retry_diversity.py:109: in test_all_positions_skipped_returns_none
|
||||
result = self.engine._grid_fast_path("first image in explore grid", nodes, skip_positions=all_positions)
|
||||
E AttributeError: 'TelepathicEngine' object has no attribute '_grid_fast_path'
|
||||
=============================== warnings summary ===============================
|
||||
../../../../Users/marcmintel/.pyenv/versions/3.11.9/lib/python3.11/site-packages/requests/__init__.py:109
|
||||
/Users/marcmintel/.pyenv/versions/3.11.9/lib/python3.11/site-packages/requests/__init__.py:109: RequestsDependencyWarning: urllib3 (2.4.0) or chardet (7.4.3)/charset_normalizer (3.4.2) doesn't match a supported version!
|
||||
warnings.warn(
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
=========================== short test summary info ============================
|
||||
FAILED tests/anomalies/test_telepathic_guards.py::TestTelepathicGuards::test_strict_story_ring_guard
|
||||
FAILED tests/anomalies/test_telepathic_guards.py::TestTelepathicGuards::test_strict_button_guard
|
||||
FAILED tests/integration/test_telepathic_hardening.py::test_keyword_nav_threshold
|
||||
FAILED tests/integration/test_telepathic_hardening.py::test_direct_tab_fast_path
|
||||
FAILED tests/integration/test_telepathic_keyword.py::test_keyword_fast_path_no_feed_pollution
|
||||
FAILED tests/repro_reports/test_repro_position_rejection.py::TestPositionRejection::test_repro_following_button_rejection_fix
|
||||
FAILED tests/repro_reports/test_repro_reels_tab_hallucination.py::TestReproReelsTabHallucination::test_reels_tab_selection
|
||||
FAILED tests/unit/perception/test_intent_resolver.py::test_intent_resolver_finds_bottom_tab
|
||||
FAILED tests/unit/test_grid_retry_diversity.py::TestGridRetryDiversity::test_first_call_returns_topmost_leftmost
|
||||
FAILED tests/unit/test_grid_retry_diversity.py::TestGridRetryDiversity::test_retry_skips_failed_position
|
||||
FAILED tests/unit/test_grid_retry_diversity.py::TestGridRetryDiversity::test_skip_multiple_positions
|
||||
FAILED tests/unit/test_grid_retry_diversity.py::TestGridRetryDiversity::test_all_positions_skipped_returns_none
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_normal_instagram
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_foreign_app_google
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_notification_shade
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_system_permission_dialog
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_instagram_survey_modal
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_unknown_modal_interstitial
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_action_blocked
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_empty_dump
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_none_dump
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAEPerception::test_perceive_passive_scaffold_as_normal
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_home_feed_as_normal
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_explore_grid_as_normal
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_other_profile_as_normal
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_post_detail_as_normal
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_profile_tagged_tab_as_normal
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_survey_modal_as_obstacle
|
||||
ERROR tests/e2e/test_engine_perception.py::TestSAERealFixturePerception::test_perceive_mystery_interstitial_as_obstacle
|
||||
ERROR tests/e2e/test_goap_loop_prevention.py::test_goap_planner_avoids_infinite_loop_on_masked_edge
|
||||
ERROR tests/e2e/test_goap_loop_prevention.py::test_screen_topology_find_route_avoids_blocked_edges
|
||||
ERROR tests/e2e/test_goap_loop_prevention.py::test_telepathic_engine_finds_following_node_on_profile
|
||||
ERROR tests/e2e/test_goap_loop_prevention.py::test_following_vs_followers_are_both_candidates
|
||||
ERROR tests/e2e/test_goap_loop_prevention.py::test_vlm_prompt_humanizes_content_desc
|
||||
ERROR tests/e2e/test_goap_loop_prevention.py::test_live_vlm_selects_following_not_followers
|
||||
ERROR tests/e2e/test_reel_interactions.py::test_reel_like_button_not_caption
|
||||
ERROR tests/e2e/test_reel_interactions.py::test_reel_follow_button_returns_none_when_absent
|
||||
ERROR tests/e2e/test_reel_interactions.py::test_reel_post_author_selects_username
|
||||
ERROR tests/e2e/test_reel_interactions.py::test_reel_dedup_preserves_like_button
|
||||
ERROR tests/e2e/test_reel_interactions.py::test_reel_caption_with_like_word_is_not_like_button
|
||||
ERROR tests/e2e/test_reel_navigation_guards.py::test_intent_resolver_profile_tab_rejects_author_profile
|
||||
ERROR tests/e2e/test_reel_navigation_guards.py::test_intent_resolver_profile_tab_selects_real_tab
|
||||
ERROR tests/e2e/test_visual_intent_resolver.py::test_visual_discovery_creates_annotated_screenshot
|
||||
ERROR tests/e2e/test_visual_intent_resolver.py::test_visual_discovery_finds_following_by_seeing
|
||||
ERROR tests/e2e/test_visual_intent_resolver.py::test_resolve_uses_visual_discovery_when_device_available
|
||||
ERROR tests/unit/test_session_limits_evaluation.py::test_global_session_limit_evaluation
|
||||
======= 12 failed, 135 passed, 5 skipped, 1 warning, 34 errors in 19.92s =======
|
||||
@@ -1,198 +0,0 @@
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
# Force mock qdrant_client before importing any core modules that depend on it
|
||||
from GramAddict.core.bot_flow import _extract_post_content, _run_zero_latency_feed_loop
|
||||
|
||||
|
||||
class TestBotFlowEdgeCases:
|
||||
@patch("GramAddict.core.telepathic_engine.TelepathicEngine.get_instance")
|
||||
def test_extract_post_content_edge_cases(self, mock_get_telepathic):
|
||||
mock_engine = MagicMock()
|
||||
mock_get_telepathic.return_value = mock_engine
|
||||
|
||||
# 1. Empty string / Invalid XML should not crash (mock finds nothing)
|
||||
mock_engine.find_best_node.return_value = None
|
||||
res = _extract_post_content("")
|
||||
assert res.get("username") == ""
|
||||
assert res.get("description") == ""
|
||||
|
||||
# 2. Extract when only username exists
|
||||
# Side effect: first call (author) returns node, second (media) returns None
|
||||
mock_engine.find_best_node.side_effect = [{"original_attribs": {"text": "just_user"}}, None]
|
||||
res = _extract_post_content("<xml/>")
|
||||
assert res.get("username") == "just_user"
|
||||
assert res.get("description") == ""
|
||||
|
||||
# 3. Extract description
|
||||
mock_engine.find_best_node.side_effect = [None, {"original_attribs": {"desc": "🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥"}}]
|
||||
res = _extract_post_content("<xml/>")
|
||||
assert res.get("description") == "🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥"
|
||||
|
||||
# 4. Another valid description tag
|
||||
mock_engine.find_best_node.side_effect = [
|
||||
None,
|
||||
{"original_attribs": {"desc": "some desc with more than 10 chars limits"}},
|
||||
]
|
||||
res = _extract_post_content("<xml/>")
|
||||
assert res.get("description") == "some desc with more than 10 chars limits"
|
||||
|
||||
@patch("GramAddict.core.bot_flow.random.random", return_value=0.5)
|
||||
@patch("GramAddict.core.bot_flow.random.uniform", return_value=1.5)
|
||||
@patch("GramAddict.core.bot_flow.sleep")
|
||||
@patch("GramAddict.core.bot_flow._humanized_scroll")
|
||||
@patch("GramAddict.core.utils.is_ad")
|
||||
@patch("GramAddict.core.bot_flow._align_active_post")
|
||||
@patch("GramAddict.core.telepathic_engine.TelepathicEngine.get_instance")
|
||||
def test_zero_node_recovery(
|
||||
self, mock_get_telepathic, mock_align, mock_ad, mock_scroll, mock_sleep, mock_uniform, mock_random
|
||||
):
|
||||
# Tests the explicit Zero-Node Recovery added previously
|
||||
device = MagicMock()
|
||||
zero_engine = MagicMock()
|
||||
nav_graph = MagicMock()
|
||||
configs = MagicMock()
|
||||
session_state = MagicMock()
|
||||
|
||||
mock_ad.return_value = False
|
||||
mock_align.return_value = False
|
||||
|
||||
cognitive_stack = {
|
||||
"dopamine": MagicMock(),
|
||||
"darwin": MagicMock(),
|
||||
"resonance": MagicMock(),
|
||||
"active_inference": MagicMock(),
|
||||
"growth_brain": MagicMock(),
|
||||
"swarm": MagicMock(),
|
||||
}
|
||||
|
||||
# Dopamine breaks loop after 1st iteration
|
||||
cognitive_stack["dopamine"].is_app_session_over.side_effect = [False, True]
|
||||
cognitive_stack["dopamine"].wants_to_change_feed.return_value = False
|
||||
cognitive_stack["dopamine"].wants_to_doomscroll.return_value = False
|
||||
|
||||
# Fake extreme limits => doesn't break limits
|
||||
session_state.check_limit.return_value = [False] * 10
|
||||
|
||||
# Telepathic Engine returns ZERO nodes on extract
|
||||
mock_engine = MagicMock()
|
||||
mock_engine._extract_semantic_nodes.return_value = []
|
||||
mock_get_telepathic.return_value = mock_engine
|
||||
|
||||
device.dump_hierarchy.return_value = "<xml></xml>"
|
||||
|
||||
# Execute the main loop
|
||||
_run_zero_latency_feed_loop(device, zero_engine, nav_graph, configs, session_state, "HomeFeed", cognitive_stack)
|
||||
|
||||
# It should trigger _humanized_scroll
|
||||
assert mock_scroll.call_count >= 1
|
||||
|
||||
@patch("GramAddict.core.bot_flow.random.random", return_value=0.5)
|
||||
@patch("GramAddict.core.bot_flow.random.uniform", return_value=1.5)
|
||||
@patch("GramAddict.core.bot_flow.sleep")
|
||||
@patch("GramAddict.core.bot_flow._humanized_scroll")
|
||||
@patch("GramAddict.core.bot_flow._extract_post_content")
|
||||
@patch("GramAddict.core.utils.is_ad")
|
||||
@patch("GramAddict.core.bot_flow._align_active_post")
|
||||
@patch("GramAddict.core.telepathic_engine.TelepathicEngine.get_instance")
|
||||
def test_content_extraction_failed_recovery(
|
||||
self,
|
||||
mock_get_telepathic,
|
||||
mock_align,
|
||||
mock_ad,
|
||||
mock_extract,
|
||||
mock_scroll,
|
||||
mock_sleep,
|
||||
mock_uniform,
|
||||
mock_random,
|
||||
):
|
||||
device = MagicMock()
|
||||
zero_engine = MagicMock()
|
||||
nav_graph = MagicMock()
|
||||
configs = MagicMock()
|
||||
session_state = MagicMock()
|
||||
|
||||
mock_ad.return_value = False
|
||||
mock_align.return_value = False
|
||||
|
||||
cognitive_stack = {"dopamine": MagicMock(), "darwin": MagicMock()}
|
||||
# break after 1 loop
|
||||
cognitive_stack["dopamine"].is_app_session_over.side_effect = [False, True]
|
||||
cognitive_stack["dopamine"].wants_to_change_feed.return_value = False
|
||||
cognitive_stack["dopamine"].wants_to_doomscroll.return_value = False
|
||||
session_state.check_limit.return_value = [False] * 10
|
||||
|
||||
# Ensure it HAS feed markers
|
||||
device.dump_hierarchy.return_value = "<xml>row_feed_photo_profile_name</xml>"
|
||||
|
||||
# Ensure interactive_nodes is NOT zero
|
||||
mock_engine = MagicMock()
|
||||
mock_engine._extract_semantic_nodes.return_value = [{"x": 10}]
|
||||
mock_get_telepathic.return_value = mock_engine
|
||||
|
||||
# Make the extraction fail
|
||||
mock_extract.return_value = {"username": "", "description": ""}
|
||||
|
||||
_run_zero_latency_feed_loop(device, zero_engine, nav_graph, configs, session_state, "HomeFeed", cognitive_stack)
|
||||
|
||||
# Should call mock_scroll (Graceful degradation)
|
||||
mock_scroll.assert_called_once()
|
||||
|
||||
@patch("GramAddict.core.bot_flow.sleep")
|
||||
@patch("GramAddict.core.bot_flow._humanized_scroll")
|
||||
@patch("GramAddict.core.utils.is_ad")
|
||||
@patch("GramAddict.core.bot_flow._align_active_post")
|
||||
@patch("GramAddict.core.bot_flow._extract_post_content")
|
||||
@patch("GramAddict.core.telepathic_engine.TelepathicEngine.get_instance")
|
||||
@patch("GramAddict.core.llm_provider.query_llm")
|
||||
def test_llm_timeout_handled_smoothly(
|
||||
self, mock_query_llm, mock_get_telepathic, mock_extract, mock_align, mock_ad, mock_scroll, mock_sleep
|
||||
):
|
||||
"""
|
||||
TDD Test: Verifies that if qwen3.5:latest times out during comment generation
|
||||
(simulated by query_llm returning None after circuit breaker), the bot_flow
|
||||
catches the empty response and continues gracefully without crashing.
|
||||
"""
|
||||
device = MagicMock()
|
||||
zero_engine = MagicMock()
|
||||
nav_graph = MagicMock()
|
||||
configs = MagicMock()
|
||||
session_state = MagicMock()
|
||||
|
||||
mock_ad.return_value = False
|
||||
mock_align.return_value = False
|
||||
|
||||
# Make the LLM generation completely timeout and return None
|
||||
mock_query_llm.return_value = None
|
||||
|
||||
cognitive_stack = {"dopamine": MagicMock(), "darwin": MagicMock(), "resonance": MagicMock()}
|
||||
# break after 1 loop
|
||||
cognitive_stack["dopamine"].is_app_session_over.side_effect = [False, True]
|
||||
cognitive_stack["dopamine"].wants_to_change_feed.return_value = False
|
||||
cognitive_stack["dopamine"].wants_to_doomscroll.return_value = False
|
||||
|
||||
# Emulate that dopamine WANTS to comment
|
||||
cognitive_stack["dopamine"].get_action_desires.return_value = {"comment": True, "like": False}
|
||||
|
||||
# Avoid MagicMock comparison errors in Resonance Engine
|
||||
cognitive_stack["resonance"].calculate_resonance.return_value = 0.8
|
||||
|
||||
session_state.check_limit.return_value = [False] * 10
|
||||
|
||||
device.dump_hierarchy.return_value = "<xml>row_feed_photo_profile_name</xml>"
|
||||
|
||||
mock_engine = MagicMock()
|
||||
mock_engine._extract_semantic_nodes.return_value = [{"x": 10}]
|
||||
mock_get_telepathic.return_value = mock_engine
|
||||
|
||||
# Valid post content so it proceeds to comment generation
|
||||
mock_extract.return_value = {"username": "test_user", "description": "a long enough description"}
|
||||
|
||||
# Run feed loop - MUST NOT CRASH
|
||||
try:
|
||||
_run_zero_latency_feed_loop(
|
||||
device, zero_engine, nav_graph, configs, session_state, "HomeFeed", cognitive_stack
|
||||
)
|
||||
except Exception as e:
|
||||
pytest.fail(f"Feed loop crashed on LLM timeout with {e}")
|
||||
@@ -1,69 +0,0 @@
|
||||
import os
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
# Mock directory setup
|
||||
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
FIXTURE_DIR = os.path.join(ROOT_DIR, "fixtures")
|
||||
|
||||
|
||||
class ConfigMock:
|
||||
def __init__(self):
|
||||
self.args = MagicMock()
|
||||
self.args.app_id = "com.instagram.android"
|
||||
|
||||
|
||||
def test_fsd_handles_persistent_survey_modal():
|
||||
"""
|
||||
Simulates a case where the bot gets stuck on a survey modal.
|
||||
The FSD (Full Self Driving) anomaly handler should trigger,
|
||||
detect that 'Back' didn't work, and engage TelepathicEngine
|
||||
to find and tap the 'Not Now' or 'Dismiss' button.
|
||||
"""
|
||||
from GramAddict.core.bot_flow import _run_zero_latency_feed_loop
|
||||
|
||||
device = MagicMock()
|
||||
device.app_id = "com.instagram.android"
|
||||
device._get_current_app.return_value = "com.instagram.android"
|
||||
configs = ConfigMock()
|
||||
|
||||
# Mock the TelepathicEngine singleton behavior entirely
|
||||
mock_telepathic = MagicMock()
|
||||
mock_telepathic.find_best_node.return_value = {"x": 500, "y": 1400, "semantic": "Not Now"}
|
||||
|
||||
dopamine = MagicMock()
|
||||
dopamine.is_app_session_over.side_effect = [False, False, True] # Run twice, then exit
|
||||
dopamine.wants_to_change_feed.return_value = False
|
||||
dopamine.wants_to_doomscroll.return_value = False
|
||||
|
||||
ai = MagicMock()
|
||||
ai.get_sleep_modifier.return_value = 1.0
|
||||
|
||||
cognitive_stack = {
|
||||
"dopamine": dopamine,
|
||||
"growth_brain": None,
|
||||
"active_inference": ai,
|
||||
}
|
||||
|
||||
# Load the mock survey modal UI
|
||||
xml_path = os.path.join(FIXTURE_DIR, "survey_modal.xml")
|
||||
with open(xml_path, "r") as f:
|
||||
alien_xml = f.read()
|
||||
device.dump_hierarchy.return_value = alien_xml
|
||||
|
||||
with (
|
||||
patch("GramAddict.core.bot_flow.sleep"),
|
||||
patch("GramAddict.core.behaviors.obstacle_guard.sleep"),
|
||||
patch("GramAddict.core.bot_flow._humanized_scroll"),
|
||||
patch("GramAddict.core.behaviors.obstacle_guard.TelepathicEngine.get_instance", return_value=mock_telepathic),
|
||||
patch("GramAddict.core.telepathic_engine.TelepathicEngine.get_instance", return_value=mock_telepathic),
|
||||
):
|
||||
from GramAddict.core.behaviors import PluginRegistry
|
||||
from GramAddict.core.behaviors.obstacle_guard import ObstacleGuardPlugin
|
||||
|
||||
PluginRegistry.get_instance().register(ObstacleGuardPlugin())
|
||||
|
||||
_run_zero_latency_feed_loop(device, None, MagicMock(), configs, MagicMock(), "HomeFeed", cognitive_stack)
|
||||
|
||||
# VERIFICATION:
|
||||
assert mock_telepathic.find_best_node.called
|
||||
assert device.click.called
|
||||
@@ -1,78 +0,0 @@
|
||||
"""
|
||||
TDD Tests for Zero-Hardcode Screen Classification and Situational Awareness
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../")))
|
||||
|
||||
from GramAddict.core.goap import ScreenIdentity, ScreenType
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_screen_memory():
|
||||
with patch("GramAddict.core.qdrant_memory.ScreenMemoryDB") as mock_db:
|
||||
instance = mock_db.return_value
|
||||
instance.is_connected = True
|
||||
yield instance
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_query_llm():
|
||||
with patch("GramAddict.core.llm_provider.query_llm") as mock_llm:
|
||||
yield mock_llm
|
||||
|
||||
|
||||
def test_classify_screen_uses_memory(mock_screen_memory, mock_query_llm):
|
||||
"""
|
||||
Test that _classify_screen FIRST tries to hit the ScreenMemoryDB.
|
||||
"""
|
||||
si = ScreenIdentity("testbot")
|
||||
|
||||
# Mock that memory ALREADY knows this screen
|
||||
mock_screen_memory.get_screen_type.return_value = ScreenType.MODAL.name
|
||||
|
||||
# We pass random strings that would previously fail or hit hardcoded checks
|
||||
res = si._classify_screen(
|
||||
ids=set(),
|
||||
descs=[],
|
||||
texts=["totally ambiguous text"],
|
||||
selected_tab=None,
|
||||
desc_lower="",
|
||||
text_lower="",
|
||||
ids_str="random_id",
|
||||
signature="MOCK_SIGNATURE",
|
||||
)
|
||||
|
||||
assert res == ScreenType.MODAL
|
||||
mock_screen_memory.get_screen_type.assert_called_once_with("MOCK_SIGNATURE", similarity_threshold=0.92)
|
||||
# Should not fall back to LLM if memory hits
|
||||
mock_query_llm.assert_not_called()
|
||||
|
||||
|
||||
def test_classify_screen_uses_llm_fallback_and_learns(mock_screen_memory, mock_query_llm):
|
||||
"""
|
||||
Test that if memory misses, it uses LLM fallback and caches the result.
|
||||
"""
|
||||
si = ScreenIdentity("testbot")
|
||||
mock_screen_memory.get_screen_type.return_value = None
|
||||
mock_query_llm.return_value = {"response": "HOME_FEED"}
|
||||
|
||||
res = si._classify_screen(
|
||||
ids={"random"},
|
||||
descs=[],
|
||||
texts=[],
|
||||
selected_tab=None,
|
||||
desc_lower="",
|
||||
text_lower="",
|
||||
ids_str="random",
|
||||
signature="MOCK_SIGNATURE_2",
|
||||
)
|
||||
|
||||
assert res == ScreenType.HOME_FEED
|
||||
mock_query_llm.assert_called_once()
|
||||
mock_screen_memory.store_screen.assert_called_once_with("MOCK_SIGNATURE_2", "HOME_FEED")
|
||||
@@ -1,190 +0,0 @@
|
||||
import os
|
||||
import time
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.bot_flow import _run_zero_latency_feed_loop, _wait_for_post_loaded
|
||||
from GramAddict.core.perception.feed_analysis import FEED_MARKERS
|
||||
|
||||
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
DUMPS = {
|
||||
"organic": os.path.join(ROOT_DIR, "fixtures", "organic_post.xml"),
|
||||
"explore": os.path.join(ROOT_DIR, "fixtures", "explore_feed_dump.xml"),
|
||||
}
|
||||
FIXTURE_DIR = os.path.join(ROOT_DIR, "fixtures")
|
||||
|
||||
|
||||
def mutate_xml_to_foreign(xml_content: str) -> str:
|
||||
"""Removes meaningful text content to simulate a language failure or empty state."""
|
||||
import re
|
||||
|
||||
# Strip text and content-desc
|
||||
xml = re.sub(r'text="[^"]*"', 'text=""', xml_content)
|
||||
xml = re.sub(r'content-desc="[^"]*"', 'content-desc=""', xml)
|
||||
return xml
|
||||
|
||||
|
||||
def mutate_xml_remove_feed_markers(xml_content: str) -> str:
|
||||
"""Removes all feed markers to simulate a grid view or random popup."""
|
||||
xml = xml_content
|
||||
for marker in FEED_MARKERS:
|
||||
xml = xml.replace(marker, "some_random_id")
|
||||
return xml
|
||||
|
||||
|
||||
class ConfigMock:
|
||||
def __init__(self):
|
||||
self.args = MagicMock()
|
||||
self.args.interact_percentage = 0
|
||||
self.args.comment_percentage = 0
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def test_dumps():
|
||||
dumps = {}
|
||||
with open(DUMPS["organic"], "r") as f:
|
||||
dumps["post"] = f.read()
|
||||
# Fake explore grid that lacks ALL feed markers
|
||||
dumps["grid"] = (
|
||||
'<?xml version="1.0"?><hierarchy><node resource-id="com.instagram.android:id/explore_grid_container" /></hierarchy>'
|
||||
)
|
||||
return dumps
|
||||
|
||||
|
||||
def test_slow_loading_post_recovery(test_dumps):
|
||||
"""
|
||||
Test that _wait_for_post_loaded correctly handles a delay where the
|
||||
first few dumps are grids, and only later it becomes a post.
|
||||
"""
|
||||
device = MagicMock()
|
||||
# Simulate: Grid -> Grid -> Error -> Post
|
||||
device.dump_hierarchy.side_effect = [
|
||||
test_dumps["grid"],
|
||||
test_dumps["grid"],
|
||||
Exception("uiautomator2 temp failure"),
|
||||
test_dumps["post"],
|
||||
]
|
||||
|
||||
# We patch sleep to make the test super fast
|
||||
with patch("GramAddict.core.bot_flow.sleep", return_value=None):
|
||||
time.time()
|
||||
success = _wait_for_post_loaded(device, timeout=5)
|
||||
# Should return true when it hits the 4th element
|
||||
assert success is True
|
||||
assert device.dump_hierarchy.call_count == 4
|
||||
|
||||
|
||||
def test_wait_timeout_aborts_gracefully(test_dumps):
|
||||
"""Test what happens if the network is so slow it times out entirely."""
|
||||
device = MagicMock()
|
||||
# Always return grid
|
||||
device.dump_hierarchy.return_value = test_dumps["grid"]
|
||||
|
||||
# Patch time.time to simulate 6 seconds passing immediately
|
||||
# We add sequence padding because python's logger internally uses time.time()
|
||||
with patch("time.time", side_effect=[0, 1, 6, 6, 6, 6, 6, 6, 6, 6]):
|
||||
with patch("GramAddict.core.bot_flow.sleep", return_value=None):
|
||||
success = _wait_for_post_loaded(device, timeout=5)
|
||||
assert success is False
|
||||
|
||||
|
||||
def test_empty_content_extraction_guard(test_dumps):
|
||||
"""
|
||||
Test that if a post is loaded, but it has strange empty text (foreign language or bug),
|
||||
the bot aborts interaction and scrolls instead of judging empty content.
|
||||
"""
|
||||
device = MagicMock()
|
||||
nav_graph = MagicMock()
|
||||
configs = ConfigMock()
|
||||
|
||||
# We create a fake active inference engine to just break the loop after 1 iteration
|
||||
ai = MagicMock()
|
||||
# Dopamine engine controls loop exit
|
||||
dopamine = MagicMock()
|
||||
dopamine.is_app_session_over.side_effect = [False, True] # Run once, then exit
|
||||
dopamine.wants_to_change_feed.return_value = False
|
||||
dopamine.wants_to_doomscroll.return_value = False
|
||||
|
||||
cognitive_stack = {
|
||||
"dopamine": dopamine,
|
||||
"active_inference": ai,
|
||||
"resonance": None,
|
||||
"growth_brain": None,
|
||||
"swarm": None,
|
||||
"darwin": None,
|
||||
}
|
||||
|
||||
# Mutate the post so it has NO text or description
|
||||
broken_xml = mutate_xml_to_foreign(test_dumps["post"])
|
||||
device.dump_hierarchy.return_value = broken_xml
|
||||
|
||||
from GramAddict.core.situational_awareness import SituationType
|
||||
|
||||
with (
|
||||
patch("GramAddict.core.bot_flow._humanized_scroll") as mock_scroll,
|
||||
patch("GramAddict.core.bot_flow.sleep"),
|
||||
patch(
|
||||
"GramAddict.core.situational_awareness.SituationalAwarenessEngine.perceive",
|
||||
return_value=SituationType.NORMAL,
|
||||
),
|
||||
):
|
||||
result = _run_zero_latency_feed_loop(device, None, nav_graph, configs, MagicMock(), "HomeFeed", cognitive_stack)
|
||||
|
||||
# Ensure scroll was called (the recovery mechanism)
|
||||
assert mock_scroll.called
|
||||
# Check that we never called resonance evaluation because we broke early
|
||||
assert not ai.predict_state.called
|
||||
assert result == "FEED_EXHAUSTED"
|
||||
|
||||
|
||||
def test_missing_feed_markers_guard(test_dumps):
|
||||
"""
|
||||
Test that if the UI is completely foreign (e.g., a system popup),
|
||||
the bot detects missing feed markers and scrolls to recover.
|
||||
"""
|
||||
device = MagicMock()
|
||||
configs = ConfigMock()
|
||||
|
||||
dopamine = MagicMock()
|
||||
dopamine.is_app_session_over.side_effect = [False, True]
|
||||
dopamine.wants_to_change_feed.return_value = False
|
||||
dopamine.wants_to_doomscroll.return_value = False
|
||||
|
||||
cognitive_stack = {"dopamine": dopamine, "growth_brain": None, "active_inference": None}
|
||||
|
||||
# Mutate XML to remove all FEED MARKERS
|
||||
alien_xml = mutate_xml_remove_feed_markers(test_dumps["post"])
|
||||
device.dump_hierarchy.return_value = alien_xml
|
||||
|
||||
with patch("GramAddict.core.bot_flow._humanized_scroll"), patch("GramAddict.core.bot_flow.sleep"):
|
||||
_run_zero_latency_feed_loop(device, None, MagicMock(), configs, MagicMock(), "HomeFeed", cognitive_stack)
|
||||
|
||||
|
||||
@patch("GramAddict.core.device_facade.u2")
|
||||
def test_xpath_watcher_initialization(mock_u2):
|
||||
"""
|
||||
Test fixing the critical watcher API bug.
|
||||
Ensures that device facade uses .watcher("name").when(xpath=...)
|
||||
"""
|
||||
mock_d = MagicMock()
|
||||
mock_u2.connect.return_value = mock_d
|
||||
|
||||
# Setup mock chain: deviceV2.watcher("crash_dialog").when(...)
|
||||
mock_watcher = MagicMock()
|
||||
mock_d.watcher.return_value = mock_watcher
|
||||
mock_when = MagicMock()
|
||||
mock_watcher.when.return_value = mock_when
|
||||
|
||||
# Just init the facade
|
||||
from GramAddict.core.device_facade import create_device
|
||||
|
||||
create_device("fake_serial", "com.fake.app", MagicMock())
|
||||
|
||||
# Verify exact API call structure for XPath
|
||||
mock_d.watcher.assert_any_call("crash_dialog")
|
||||
mock_d.watcher.assert_any_call("system_dialog")
|
||||
|
||||
# We can't perfectly assert the chained arguments natively without a bit of inspection,
|
||||
# but we can verify it didn't crash and called start
|
||||
assert mock_d.watcher.start.called
|
||||
@@ -1,50 +0,0 @@
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.device_facade import DeviceFacade
|
||||
|
||||
|
||||
def test_adb_retry_recovers_from_transient_error():
|
||||
# Attempt simulated disconnect on dump_hierarchy
|
||||
device_id = "test"
|
||||
app_id = "test"
|
||||
|
||||
with patch("uiautomator2.connect") as mock_connect:
|
||||
mock_device = MagicMock()
|
||||
mock_connect.return_value = mock_device
|
||||
|
||||
facade = DeviceFacade(device_id, app_id, None)
|
||||
|
||||
# Make the first 2 calls fail, the 3rd one pass
|
||||
mock_device.dump_hierarchy.side_effect = [
|
||||
Exception("ConnectError uiautomator2"),
|
||||
Exception("RPC Error"),
|
||||
"<hierarchy></hierarchy>",
|
||||
]
|
||||
|
||||
# Patch sleep to speed up test
|
||||
with patch("GramAddict.core.device_facade.sleep"):
|
||||
res = facade.dump_hierarchy()
|
||||
assert res == "<hierarchy></hierarchy>"
|
||||
assert mock_device.dump_hierarchy.call_count == 3
|
||||
|
||||
|
||||
def test_adb_retry_crashes_gracefully_after_all_retries():
|
||||
# Attempt simulated disconnect on dump_hierarchy
|
||||
device_id = "test"
|
||||
app_id = "test"
|
||||
|
||||
with patch("uiautomator2.connect") as mock_connect:
|
||||
mock_device = MagicMock()
|
||||
mock_connect.return_value = mock_device
|
||||
|
||||
facade = DeviceFacade(device_id, app_id, None)
|
||||
|
||||
# Always fail
|
||||
mock_device.dump_hierarchy.side_effect = Exception("Permanent ConnectError")
|
||||
|
||||
with patch("GramAddict.core.device_facade.sleep"):
|
||||
with pytest.raises(Exception, match="Permanent ConnectError"):
|
||||
facade.dump_hierarchy()
|
||||
assert mock_device.dump_hierarchy.call_count == 3
|
||||
@@ -1,96 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
# Add parent dir to path
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
|
||||
class DummyDevice:
|
||||
class DeviceV2:
|
||||
def __init__(self):
|
||||
self.last_click = None
|
||||
|
||||
def click(self, x, y):
|
||||
self.last_click = (x, y)
|
||||
|
||||
def screenshot(self, path=None):
|
||||
return "fake_screenshot"
|
||||
|
||||
def __init__(self):
|
||||
import unittest
|
||||
|
||||
self.deviceV2 = self.DeviceV2()
|
||||
self.app_id = "com.instagram.android"
|
||||
self.args = unittest.mock.MagicMock()
|
||||
self.args.ai_telepathic_model = "qwen2.5:3b"
|
||||
self.args.ai_telepathic_url = "http://localhost:11434/api/generate"
|
||||
|
||||
def _get_current_app(self):
|
||||
return "com.instagram.android"
|
||||
|
||||
def get_info(self):
|
||||
return {"displayHeight": 2400, "displayWidth": 1080}
|
||||
|
||||
def screenshot(self, path=None):
|
||||
return "fake_screenshot"
|
||||
|
||||
|
||||
class TestHumanHesitation(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.telepathic = TelepathicEngine()
|
||||
self.device = DummyDevice()
|
||||
|
||||
def test_discard_dialog_extraction(self):
|
||||
"""
|
||||
Prove that the Telepathic Engine can correctly identify the 'Discard'
|
||||
button inside a synthetic XML dump, ensuring the 'Umentscheidung'
|
||||
abort logic works in the wild.
|
||||
"""
|
||||
# Synthetic Discard Dialog XML
|
||||
synthetic_dump = """<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" bounds="[0,0][1080,2400]" package="com.instagram.android">
|
||||
<node index="1" class="android.widget.TextView" text="Discard Comment?" bounds="[200,1000][800,1100]" />
|
||||
<node index="2" class="android.widget.Button" text="IGNORE" content-desc="IGNORE" bounds="[200,1200][400,1300]" />
|
||||
<node index="3" class="android.widget.Button" text="Verwerfen" content-desc="Discard or Verwerfen popup button" bounds="[600,1200][800,1300]" resource-id="com.instagram.android:id/button_discard" />
|
||||
</node>
|
||||
</hierarchy>
|
||||
"""
|
||||
|
||||
# Act
|
||||
result = self.telepathic.find_best_node(
|
||||
synthetic_dump,
|
||||
"Discard or Verwerfen popup button to cancel comment",
|
||||
device=self.device,
|
||||
min_confidence=0.5,
|
||||
)
|
||||
|
||||
# Assert (Should hit the [600,1200][800,1300] box, which centers to (700, 1250))
|
||||
self.assertIsNotNone(result, "Telepathic engine failed to find 'Verwerfen'.")
|
||||
self.assertEqual(result["x"], 700)
|
||||
self.assertEqual(result["y"], 1250)
|
||||
|
||||
def test_dm_inbox_tab_resolution(self):
|
||||
"""
|
||||
Verify that teleporting specifically to the Inbox tab (DM button)
|
||||
succeeds if 'Message' describes it.
|
||||
"""
|
||||
synthetic_dump = """<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="2" text="" id="direct_tab" package="com.instagram.android" content-desc="Direct messages tab button" bounds="[432,2235][648,2361]" resource-id="com.instagram.android:id/direct_tab">
|
||||
<node content-desc=""/>
|
||||
</node>
|
||||
</hierarchy>"""
|
||||
|
||||
# If ID didn't match perfectly, we fall back to description as programmed.
|
||||
# Direct simulation of UI Automator check isn't in scope for this telepathic test,
|
||||
# but we can ensure Telepathic Engine CAN find it if we rely on it.
|
||||
result = self.telepathic.find_best_node(synthetic_dump, "Direct messages tab button", device=self.device)
|
||||
self.assertIsNotNone(result, "Should find the Message tab")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -1,52 +0,0 @@
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from GramAddict.core.llm_provider import query_llm
|
||||
|
||||
|
||||
def test_query_llm_hallucination_recovery():
|
||||
# Test that when the primary model hallucinates non-JSON, it triggers fallback
|
||||
with patch("requests.post") as mock_post:
|
||||
# 1st call: Primary fails entirely (e.g., Timeout or strange error)
|
||||
mock_response_1 = MagicMock()
|
||||
mock_response_1.status_code = 500
|
||||
mock_response_1.raise_for_status.side_effect = Exception("500 Server Error")
|
||||
|
||||
# 2nd call: Fallback works and returns valid JSON
|
||||
mock_response_2 = MagicMock()
|
||||
mock_response_2.status_code = 200
|
||||
mock_response_2.raise_for_status.return_value = None
|
||||
mock_response_2.json.return_value = {"choices": [{"message": {"content": '{"test": "success"}'}}]}
|
||||
|
||||
mock_post.side_effect = [mock_response_1, mock_response_2]
|
||||
|
||||
# Attempt a query with a primary model
|
||||
res = query_llm(
|
||||
url="http://fake.api/v1/chat/completions",
|
||||
model="primary-model",
|
||||
prompt="Hello",
|
||||
format_json=True,
|
||||
fallback_model="fallback-model",
|
||||
fallback_url="http://fake.api/v1/chat/completions",
|
||||
)
|
||||
|
||||
assert res is not None
|
||||
assert "response" in res
|
||||
assert res["response"] == '{"test": "success"}'
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
|
||||
def test_query_llm_double_hallucination_safe_return():
|
||||
# Test that when both models hallucinate, we return None gracefully
|
||||
with patch("requests.post") as mock_post:
|
||||
# Both models fail
|
||||
mock_response = MagicMock()
|
||||
mock_response.status_code = 500
|
||||
mock_response.raise_for_status.side_effect = Exception("500 Server Error")
|
||||
|
||||
mock_post.side_effect = [mock_response, mock_response]
|
||||
|
||||
res = query_llm(
|
||||
url="http://fake.api/v1/chat/completions", model="primary-model", prompt="Hello", format_json=True
|
||||
)
|
||||
|
||||
assert res is None
|
||||
@@ -1,49 +0,0 @@
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from GramAddict.core.q_nav_graph import QNavGraph
|
||||
|
||||
|
||||
def test_tap_home_tab_recovery_from_homescreen():
|
||||
"""
|
||||
TDD: Reproduce the failure where tap_home_tab fails because the bot is on
|
||||
the Android Homescreen (app.lawnchair), and verify that it recovers
|
||||
via app_start instead of enterring an auto-repair loop.
|
||||
"""
|
||||
# 1. Setup Mock Device
|
||||
mock_device = MagicMock()
|
||||
mock_device.app_id = "com.instagram.android"
|
||||
# Return homescreen package to simulate context loss
|
||||
mock_device._get_current_app.return_value = "app.lawnchair"
|
||||
|
||||
# 2. Mock DeviceV2 responses
|
||||
mock_device.dump_hierarchy.return_value = "<hierarchy />"
|
||||
mock_device.app_start.return_value = True
|
||||
|
||||
# 3. Initialize NavGraph
|
||||
graph = QNavGraph(mock_device)
|
||||
graph.current_state = "ProfileFeed" # Assume stale state
|
||||
|
||||
# 4. Patch TelepathicEngine.get_instance to return a mock engine
|
||||
with (
|
||||
patch("GramAddict.core.telepathic_engine.TelepathicEngine.get_instance") as mock_get_instance,
|
||||
patch("GramAddict.core.goap.PathMemory.learn_path"),
|
||||
patch("GramAddict.core.goap.PathMemory.recall_path", return_value=None),
|
||||
patch("GramAddict.core.qdrant_memory.ScreenMemoryDB._get_embedding", return_value=[0] * 1536),
|
||||
patch(
|
||||
"GramAddict.core.situational_awareness.SituationalAwarenessEngine.ensure_clear_screen", return_value=False
|
||||
),
|
||||
patch("GramAddict.core.q_nav_graph.time.sleep"),
|
||||
):
|
||||
mock_engine = MagicMock()
|
||||
mock_get_instance.return_value = mock_engine
|
||||
|
||||
# Simulate Context Guard hitting: return None forever
|
||||
mock_engine.find_best_node.return_value = None
|
||||
|
||||
# 5. Execute
|
||||
# We expect this to return False gracefully after 3 attempts, without infinitely looping
|
||||
success = graph.navigate_to("ExploreFeed", zero_engine=None)
|
||||
|
||||
# 6. Assertion
|
||||
assert not success, "Navigation should fail gracefully when context cannot be recovered"
|
||||
assert mock_device.app_start.called, "Should have force-started the app when context was lost"
|
||||
@@ -1,123 +0,0 @@
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
# Force mock qdrant_client before importing any core modules that depend on it
|
||||
from GramAddict.core.q_nav_graph import QNavGraph
|
||||
|
||||
|
||||
class TestQNavGraphEdgeCases:
|
||||
@pytest.fixture(autouse=True)
|
||||
def setup_graph(self):
|
||||
self.device = MagicMock()
|
||||
self.device.app_id = "com.instagram.android"
|
||||
self.device.info = {"screenOn": True}
|
||||
self.device.dump_hierarchy.return_value = '<hierarchy><node package="com.instagram.android" /></hierarchy>'
|
||||
self.device._get_current_app = MagicMock(return_value="com.instagram.android")
|
||||
|
||||
# Prevent Dojo engine instantiation during tests
|
||||
with patch("GramAddict.core.compiler_engine.VLMCompilerEngine"):
|
||||
self.graph = QNavGraph(self.device)
|
||||
|
||||
def test_find_path_edge_cases(self):
|
||||
# 1. Start == End
|
||||
assert self.graph._find_path("HomeFeed", "HomeFeed") == []
|
||||
|
||||
# 2. Start not in nodes
|
||||
assert self.graph._find_path("UnknownState", "HomeFeed") is None
|
||||
|
||||
# 3. Unreachable states
|
||||
self.graph.nodes = {
|
||||
"HomeFeed": {"transitions": {"tap_explore": "ExploreFeed"}},
|
||||
"IsolatedFeed": {"transitions": {}},
|
||||
}
|
||||
assert self.graph._find_path("HomeFeed", "IsolatedFeed") is None
|
||||
|
||||
# 4. Infinite loop protection (A -> B -> A)
|
||||
self.graph.nodes = {"A": {"transitions": {"to_b": "B"}}, "B": {"transitions": {"to_a": "A"}}}
|
||||
assert (
|
||||
self.graph._find_path("A", "C") is None
|
||||
) # Should safely return None without exceeding recursion/loop depth
|
||||
|
||||
# 5. Longest path possible before unreachability is confirmed
|
||||
assert self.graph._find_path("B", "D") is None
|
||||
|
||||
# 6. Diamond shape path
|
||||
self.graph.nodes = {
|
||||
"Start": {"transitions": {"top": "Top", "bottom": "Bottom"}},
|
||||
"Top": {"transitions": {"top_to_end": "End"}},
|
||||
"Bottom": {"transitions": {"bottom_to_end": "End"}},
|
||||
"End": {},
|
||||
}
|
||||
# BFS should find shortest path (len 2)
|
||||
assert len(self.graph._find_path("Start", "End")) == 2
|
||||
|
||||
@patch("GramAddict.core.q_nav_graph.time.sleep", return_value=None)
|
||||
@patch("GramAddict.core.q_nav_graph.random_sleep", return_value=None)
|
||||
@patch("GramAddict.core.situational_awareness.random_sleep", return_value=None)
|
||||
@patch("GramAddict.core.telepathic_engine.TelepathicEngine.get_instance")
|
||||
def test_execute_transition_edge_cases(self, mock_get_telepathic, mock_sae_sleep, mock_q_rand_sleep, mock_q_sleep):
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
mock_engine = MagicMock(spec=TelepathicEngine)
|
||||
mock_get_telepathic.return_value = mock_engine
|
||||
|
||||
# Case 1: Telepathic engine finds nothing
|
||||
mock_engine.find_best_node.return_value = None
|
||||
|
||||
# If still in Instagram, it returns False
|
||||
self.device._get_current_app.return_value = "com.instagram.android"
|
||||
assert not self.graph._execute_transition("unknown_action", mock_engine)
|
||||
|
||||
# If app is different, it returns "CONTEXT_LOST"
|
||||
self.device._get_current_app.return_value = "com.android.launcher3"
|
||||
assert self.graph._execute_transition("unknown_action", mock_engine) == "CONTEXT_LOST"
|
||||
|
||||
# Case 2: Best node has skip flag
|
||||
mock_engine.find_best_node.return_value = {"skip": True}
|
||||
assert self.graph._execute_transition("already_done_action", mock_engine)
|
||||
|
||||
# Case 3: Proper interaction, but XML doesn't change (verification fail)
|
||||
mock_engine.find_best_node.return_value = {"x": 10, "y": 10, "score": 0.9}
|
||||
same_xml = '<hierarchy><node package="com.instagram.android" class="same" /></hierarchy>'
|
||||
self.device.dump_hierarchy.side_effect = None
|
||||
self.device.dump_hierarchy.return_value = same_xml
|
||||
assert not self.graph._execute_transition("click_action", mock_engine)
|
||||
assert mock_engine.reject_click.call_count == 3
|
||||
|
||||
# Case 4: Proper interaction, XML changes (verification pass)
|
||||
mock_engine.reset_mock()
|
||||
mock_engine.find_best_node.return_value = {"x": 10, "y": 10, "score": 0.9}
|
||||
before_xml = '<hierarchy><node package="com.instagram.android" class="before" /></hierarchy>'
|
||||
after_xml = '<hierarchy><node package="com.instagram.android" class="after" /></hierarchy>'
|
||||
|
||||
initial_clicks = self.device.click.call_count
|
||||
|
||||
def dynamic_xml(*args, **kwargs):
|
||||
return after_xml if self.device.click.call_count > initial_clicks else before_xml
|
||||
|
||||
self.device.dump_hierarchy.side_effect = dynamic_xml
|
||||
# Explicitly ensure verify_success is truthy
|
||||
mock_engine.verify_success.return_value = True
|
||||
|
||||
assert self.graph._execute_transition("click_action", mock_engine)
|
||||
mock_engine.confirm_click.assert_called_once()
|
||||
|
||||
@patch("GramAddict.core.q_nav_graph.time.sleep", return_value=None)
|
||||
@patch("GramAddict.core.q_nav_graph.random_sleep", return_value=None)
|
||||
@patch("GramAddict.core.situational_awareness.random_sleep", return_value=None)
|
||||
@patch("GramAddict.core.dojo_engine.DojoEngine.get_instance")
|
||||
def test_navigate_to_recovery_edge_cases(self, mock_dojo, mock_sae_sleep, mock_q_rand_sleep, mock_q_sleep):
|
||||
# We test the deepest recovery logic: when everything fails
|
||||
|
||||
zero_engine = MagicMock()
|
||||
|
||||
# Mock transitions completely failing
|
||||
with patch.object(self.graph.goap, "navigate_to_screen", return_value=False):
|
||||
# Recovery attempts maxed out
|
||||
assert not self.graph.navigate_to("ExploreFeed", zero_engine, recovery_attempts=3)
|
||||
|
||||
# Start logic where path is None and direct fallback also fails
|
||||
self.graph.current_state = "IsolatedNode"
|
||||
# It should trigger fallback and then return False because `navigate_to_screen` always returns False
|
||||
assert not self.graph.navigate_to("ExploreFeed", zero_engine, recovery_attempts=0)
|
||||
@@ -1,59 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../")))
|
||||
|
||||
from GramAddict.core.goap import GoalExecutor, ScreenType
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_device():
|
||||
device = MagicMock()
|
||||
# Simulate XML changing but screen type not being the target
|
||||
device.dump_hierarchy.side_effect = ["<xml1/>", "<xml2/>", "<xml2/>"]
|
||||
device.app_id = "com.instagram.android"
|
||||
return device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_telepathic():
|
||||
with patch("GramAddict.core.telepathic_engine.TelepathicEngine.get_instance") as mock:
|
||||
engine = mock.return_value
|
||||
engine.find_best_node.return_value = {"x": 100, "y": 200, "semantic_string": "mock_node"}
|
||||
yield engine
|
||||
|
||||
|
||||
def test_execution_rejects_wrong_screen(mock_device, mock_telepathic):
|
||||
"""
|
||||
TDD Case: If we intend to go to DMs but land on Reels,
|
||||
TelepathicEngine.confirm_click should NOT be called.
|
||||
"""
|
||||
executor = GoalExecutor(mock_device, "testuser")
|
||||
|
||||
# We mock perceive to return ReelsFeed after the click
|
||||
with patch.object(executor, "perceive") as mock_perceive:
|
||||
# Before click
|
||||
mock_perceive.side_effect = [
|
||||
{"screen_type": ScreenType.HOME_FEED}, # Initial
|
||||
{"screen_type": ScreenType.REELS_FEED}, # After click (WRONG!)
|
||||
]
|
||||
|
||||
# Action that intends to go to DM_INBOX
|
||||
action = "tap messages tab"
|
||||
|
||||
# We need to make sure _execute_action knows the goal is "open messages"
|
||||
# Since _execute_action is usually called from achieve(), we mock that flow
|
||||
|
||||
success = executor._execute_action(action, goal="open messages")
|
||||
|
||||
# Success should be False because we didn't reach the goal
|
||||
# (Or True if we only care about XML change, but that's what we're changing)
|
||||
assert success is False
|
||||
|
||||
# CRITICAL: confirm_click should NOT have been called for 'messages tab'
|
||||
# since we are on Reels.
|
||||
mock_telepathic.confirm_click.assert_not_called()
|
||||
mock_telepathic.reject_click.assert_called_once_with(action)
|
||||
@@ -1,68 +0,0 @@
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
|
||||
class TestTelepathicGuards:
|
||||
def setup_method(self):
|
||||
self.engine = TelepathicEngine()
|
||||
|
||||
def test_strict_story_ring_guard(self):
|
||||
"""
|
||||
TDD: Story rings MUST be physically near the top of the screen (y < 30%).
|
||||
Post profile headers that appear further down must be aggressively blocked
|
||||
when the intent is 'tap story ring avatar'.
|
||||
"""
|
||||
intent = "tap story ring avatar"
|
||||
screen_height = 2400
|
||||
|
||||
# Valid Story Ring (Top of screen, but below status bar)
|
||||
valid_story = {"resource_id": "reel_ring", "y": 300, "area": 100}
|
||||
assert self.engine._structural_sanity_check(valid_story, intent, screen_height) is True
|
||||
|
||||
# Invalid Story Ring (Hallucination: Post profile header in the feed)
|
||||
invalid_story = {"resource_id": "row_feed_profile_header", "y": 800, "area": 100}
|
||||
assert self.engine._structural_sanity_check(invalid_story, intent, screen_height) is False
|
||||
|
||||
def test_strict_button_guard(self):
|
||||
"""
|
||||
TDD: When explicitly looking for a 'button', nodes that declare themselves
|
||||
as profiles (e.g. 'go to profile') must be blocked, to prevent accidental
|
||||
profile visits when clicking 'like'.
|
||||
"""
|
||||
intent = "Heart like button for comment"
|
||||
screen_height = 2400
|
||||
|
||||
# Valid Like Button
|
||||
valid_btn = {"resource_id": "like_button", "semantic_string": "Like", "y": 1000, "area": 100}
|
||||
assert self.engine._structural_sanity_check(valid_btn, intent, screen_height) is True
|
||||
|
||||
# Invalid Profile Link masquerading as a match due to string proximity
|
||||
invalid_prof = {
|
||||
"resource_id": "username",
|
||||
"semantic_string": "Go to cayleighanddavid's profile",
|
||||
"y": 1000,
|
||||
"area": 100,
|
||||
}
|
||||
assert self.engine._structural_sanity_check(invalid_prof, intent, screen_height) is False
|
||||
|
||||
# However, if the intent *is* profile, it should pass
|
||||
intent_prof = "go to profile"
|
||||
assert self.engine._structural_sanity_check(invalid_prof, intent_prof, screen_height) is True
|
||||
|
||||
def test_like_semantic_verification(self):
|
||||
"""
|
||||
TDD: Verify that 'unlike' is treated as a successful 'Like' action,
|
||||
because tapping 'Like' changes the state to 'Unlike' in English Instagram.
|
||||
"""
|
||||
# Testing the specific regex logic inside verify_success
|
||||
import re
|
||||
|
||||
xml_dump_success = '<node class="android.widget.ImageView" content-desc="Unlike" />'
|
||||
|
||||
marker_found = re.search(r"\b(liked|unlike|gefällt mir nicht mehr|gefällt mir am)\b", xml_dump_success.lower())
|
||||
assert marker_found is not None
|
||||
|
||||
xml_dump_fail = '<node class="android.widget.ImageView" content-desc="Like" />'
|
||||
marker_found_fail = re.search(
|
||||
r"\b(liked|unlike|gefällt mir nicht mehr|gefällt mir am)\b", xml_dump_fail.lower()
|
||||
)
|
||||
assert marker_found_fail is None
|
||||
@@ -1,67 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../")))
|
||||
|
||||
from GramAddict.core.q_nav_graph import QNavGraph
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
|
||||
class TestTrapEscape(unittest.TestCase):
|
||||
@patch("GramAddict.core.q_nav_graph.time.sleep", return_value=None)
|
||||
@patch("GramAddict.core.q_nav_graph.random_sleep", return_value=None)
|
||||
@patch("GramAddict.core.situational_awareness.SituationalAwarenessEngine.ensure_clear_screen", return_value=False)
|
||||
def test_trap_guard_autonomous_ai_escape(self, mock_sae_clear, mock_q_rand_sleep, mock_q_sleep):
|
||||
print("Starting TDD: Testing autonomous Trap Escape with semantic bypass...")
|
||||
|
||||
# 1. Setup mocks
|
||||
mock_device = MagicMock()
|
||||
mock_device.app_id = "com.instagram.android"
|
||||
mock_device._get_current_app.return_value = "com.instagram.android"
|
||||
|
||||
trap_xml = "<hierarchy><node resource-id='modal_trap' /></hierarchy>"
|
||||
current_xml = [trap_xml]
|
||||
|
||||
# Dynamic dump that changes after click
|
||||
def dynamic_dump():
|
||||
return current_xml[0]
|
||||
|
||||
def dynamic_click(**kwargs):
|
||||
if kwargs.get("obj") and kwargs["obj"].get("semantic") and "done" in kwargs["obj"].get("semantic").lower():
|
||||
current_xml[0] = "<html><node text='Reels'/><node text='Home'/></html>"
|
||||
|
||||
mock_device.dump_hierarchy.side_effect = dynamic_dump
|
||||
mock_device.click.side_effect = dynamic_click
|
||||
|
||||
nav_graph = QNavGraph(device=mock_device)
|
||||
|
||||
engine = TelepathicEngine.get_instance()
|
||||
engine.confirm_click = MagicMock()
|
||||
engine.reject_click = MagicMock()
|
||||
|
||||
original_find_best_node = engine.find_best_node
|
||||
|
||||
def spy_find_best_node(xml_hierarchy, intent_description, **kwargs):
|
||||
if "tap home tab" in intent_description.lower():
|
||||
return None
|
||||
return original_find_best_node(xml_hierarchy, intent_description, **kwargs)
|
||||
|
||||
engine.find_best_node = spy_find_best_node
|
||||
nav_graph.engine = engine # explicitly enforce
|
||||
|
||||
# 2. Execute transition
|
||||
# Mock engine finds nothing, triggering the final fallback escape
|
||||
nav_graph._execute_transition("tap_home_tab", max_retries=1, mock_semantic_engine=engine)
|
||||
|
||||
# 3. Assertions
|
||||
# The new SAE/nav_graph behavior explicitly presses BACK when 'tap_home_tab' fails after all retries
|
||||
self.assertTrue(mock_device.press.called, "Trap guard did not autonomously press BACK to escape the sub-view!")
|
||||
called_key = mock_device.press.call_args_list[0][0][0]
|
||||
self.assertEqual(called_key, "back")
|
||||
print("TDD SUCCESS: Autonomous Backend fallback confirmed.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -1,226 +0,0 @@
|
||||
"""
|
||||
Chaos Engineering: Network & Dependency Failure Tests.
|
||||
|
||||
Verifies that the bot degrades gracefully when external services
|
||||
(Qdrant, Ollama, OpenRouter) are unavailable, slow, or return errors.
|
||||
|
||||
Tesla's FSD doesn't crash if the map server is unreachable — neither should we.
|
||||
"""
|
||||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from tests.chaos import VALID_FEED_XML
|
||||
|
||||
# ──────────────────────────────────────────────────
|
||||
# Qdrant Failure Tests
|
||||
# ──────────────────────────────────────────────────
|
||||
|
||||
|
||||
@pytest.mark.chaos
|
||||
class TestQdrantFailure:
|
||||
"""Bot must survive total Qdrant outage."""
|
||||
|
||||
def test_telepathic_works_without_qdrant(self):
|
||||
"""TelepathicEngine must still resolve nodes via keyword fast-path when Qdrant is down."""
|
||||
with (
|
||||
patch("GramAddict.core.qdrant_memory.QdrantBase.__init__", return_value=None),
|
||||
patch(
|
||||
"GramAddict.core.qdrant_memory.QdrantBase.is_connected",
|
||||
new_callable=lambda: property(lambda self: False),
|
||||
),
|
||||
):
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
TelepathicEngine._instance = None
|
||||
engine = TelepathicEngine.__new__(TelepathicEngine)
|
||||
engine.__init__()
|
||||
engine._memory.ui_memory = MagicMock()
|
||||
engine._memory.ui_memory.is_connected = False
|
||||
engine._memory.ui_memory.query_closest = MagicMock(return_value=None)
|
||||
|
||||
engine.positive_memory = MagicMock()
|
||||
engine.positive_memory.is_connected = False
|
||||
engine.positive_memory.recall = MagicMock(return_value=None)
|
||||
|
||||
nodes = engine._extract_semantic_nodes(VALID_FEED_XML)
|
||||
# Should still find clickable nodes via structural parsing
|
||||
assert len(nodes) > 0
|
||||
TelepathicEngine._instance = None
|
||||
|
||||
def test_sae_recall_returns_none_without_qdrant(self):
|
||||
"""SAE episodic memory must return None (not crash) when Qdrant is down."""
|
||||
with (
|
||||
patch("GramAddict.core.qdrant_memory.QdrantBase.__init__", return_value=None),
|
||||
patch(
|
||||
"GramAddict.core.qdrant_memory.QdrantBase.is_connected",
|
||||
new_callable=lambda: property(lambda self: False),
|
||||
),
|
||||
):
|
||||
from GramAddict.core.situational_awareness import SituationEpisodeDB
|
||||
|
||||
db = SituationEpisodeDB()
|
||||
db._db = MagicMock()
|
||||
db._db.is_connected = False
|
||||
|
||||
result = db.recall("test_situation_signature")
|
||||
assert result is None
|
||||
|
||||
def test_sae_learn_silently_fails_without_qdrant(self):
|
||||
"""SAE learning must silently skip (not crash) when Qdrant is down."""
|
||||
with (
|
||||
patch("GramAddict.core.qdrant_memory.QdrantBase.__init__", return_value=None),
|
||||
patch(
|
||||
"GramAddict.core.qdrant_memory.QdrantBase.is_connected",
|
||||
new_callable=lambda: property(lambda self: False),
|
||||
),
|
||||
):
|
||||
from GramAddict.core.situational_awareness import EscapeAction, SituationEpisodeDB
|
||||
|
||||
db = SituationEpisodeDB()
|
||||
db._db = MagicMock()
|
||||
db._db.is_connected = False
|
||||
|
||||
action = EscapeAction("back", reason="test")
|
||||
# Must not raise
|
||||
db.learn("test_signature", action, True)
|
||||
|
||||
def test_qdrant_timeout_doesnt_hang_extraction(self):
|
||||
"""If Qdrant queries time out, node extraction must still complete."""
|
||||
import time
|
||||
|
||||
with (
|
||||
patch("GramAddict.core.qdrant_memory.QdrantBase.__init__", return_value=None),
|
||||
patch(
|
||||
"GramAddict.core.qdrant_memory.QdrantBase.is_connected",
|
||||
new_callable=lambda: property(lambda self: False),
|
||||
),
|
||||
):
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
TelepathicEngine._instance = None
|
||||
engine = TelepathicEngine.__new__(TelepathicEngine)
|
||||
engine.__init__()
|
||||
engine._memory.ui_memory = MagicMock()
|
||||
engine._memory.ui_memory.is_connected = False
|
||||
engine._memory.ui_memory.query_closest = MagicMock(side_effect=TimeoutError("Qdrant timeout"))
|
||||
engine.positive_memory = MagicMock()
|
||||
engine.positive_memory.is_connected = False
|
||||
engine.positive_memory.recall = MagicMock(side_effect=TimeoutError("Qdrant timeout"))
|
||||
|
||||
start = time.time()
|
||||
nodes = engine._extract_semantic_nodes(VALID_FEED_XML)
|
||||
elapsed = time.time() - start
|
||||
|
||||
assert elapsed < 5.0
|
||||
assert isinstance(nodes, list)
|
||||
TelepathicEngine._instance = None
|
||||
|
||||
|
||||
# ──────────────────────────────────────────────────
|
||||
# LLM (Ollama/OpenRouter) Failure Tests
|
||||
# ──────────────────────────────────────────────────
|
||||
|
||||
|
||||
@pytest.mark.chaos
|
||||
class TestLLMFailure:
|
||||
"""Bot must survive LLM outages."""
|
||||
|
||||
def test_sae_perceive_defaults_to_normal_on_llm_failure(self):
|
||||
"""If LLM classification fails, SAE must default to NORMAL (safe fallback)."""
|
||||
from GramAddict.core.situational_awareness import SituationalAwarenessEngine, SituationType
|
||||
|
||||
SituationalAwarenessEngine.reset()
|
||||
|
||||
device = MagicMock()
|
||||
device.app_id = "com.instagram.android"
|
||||
device.deviceV2 = MagicMock()
|
||||
device.deviceV2.info = {"screenOn": True}
|
||||
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
sae.episodes = MagicMock()
|
||||
sae.episodes.recall = MagicMock(return_value=None)
|
||||
|
||||
with patch("GramAddict.core.qdrant_memory.ScreenMemoryDB") as MockScreenDB:
|
||||
mock_screen_db = MagicMock()
|
||||
mock_screen_db.get_screen_type = MagicMock(return_value=None)
|
||||
MockScreenDB.return_value = mock_screen_db
|
||||
|
||||
with patch("GramAddict.core.llm_provider.query_telepathic_llm", side_effect=ConnectionError("Ollama down")):
|
||||
result = sae.perceive(VALID_FEED_XML)
|
||||
# Must default to NORMAL, not crash
|
||||
assert result == SituationType.NORMAL
|
||||
|
||||
SituationalAwarenessEngine.reset()
|
||||
|
||||
def test_sae_escape_planning_defaults_to_back_on_llm_failure(self):
|
||||
"""If LLM escape planning fails, SAE must default to BACK press."""
|
||||
from GramAddict.core.situational_awareness import SituationalAwarenessEngine, SituationType
|
||||
|
||||
SituationalAwarenessEngine.reset()
|
||||
|
||||
device = MagicMock()
|
||||
device.app_id = "com.instagram.android"
|
||||
device.deviceV2 = MagicMock()
|
||||
device.deviceV2.info = {"screenOn": True}
|
||||
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
|
||||
with patch("GramAddict.core.llm_provider.query_llm", side_effect=ConnectionError("LLM down")):
|
||||
action = sae._plan_escape_via_llm(VALID_FEED_XML, "compressed_sig", SituationType.OBSTACLE_MODAL)
|
||||
assert action.action_type == "back"
|
||||
assert "failed" in action.reason.lower() or "default" in action.reason.lower()
|
||||
|
||||
SituationalAwarenessEngine.reset()
|
||||
|
||||
|
||||
# ──────────────────────────────────────────────────
|
||||
# Active Inference Resilience
|
||||
# ──────────────────────────────────────────────────
|
||||
|
||||
|
||||
@pytest.mark.chaos
|
||||
class TestActiveInferenceChaos:
|
||||
"""Active Inference engine must survive edge cases."""
|
||||
|
||||
def test_evaluate_with_empty_history(self):
|
||||
"""Evaluating without any predictions must return True (no-op)."""
|
||||
from GramAddict.core.active_inference import ActiveInferenceEngine
|
||||
|
||||
ai = ActiveInferenceEngine("test_user")
|
||||
assert ai.evaluate_prediction("<hierarchy/>") is True
|
||||
|
||||
def test_extreme_free_energy_doesnt_overflow(self):
|
||||
"""Repeated errors must not cause float overflow."""
|
||||
from GramAddict.core.active_inference import ActiveInferenceEngine
|
||||
|
||||
ai = ActiveInferenceEngine("test_user")
|
||||
|
||||
for _ in range(1000):
|
||||
ai.predict_state(["nonexistent_element"])
|
||||
ai.evaluate_prediction("<hierarchy><node text='wrong'/></hierarchy>")
|
||||
|
||||
assert ai.free_energy < float("inf")
|
||||
assert ai.free_energy >= 0
|
||||
|
||||
def test_surprise_with_identical_prediction_is_zero(self):
|
||||
"""Perfect prediction (predicted == observed) must produce near-zero surprise."""
|
||||
from GramAddict.core.active_inference import ActiveInferenceEngine
|
||||
|
||||
ai = ActiveInferenceEngine("test_user")
|
||||
ai.free_energy = 0.0
|
||||
|
||||
result = ai.calculate_surprise(1.0, 1.0)
|
||||
assert result < 0.1 # Near-zero free energy
|
||||
|
||||
def test_sleep_modifier_bounds(self):
|
||||
"""Sleep modifier must always be between 1.0 and 5.0."""
|
||||
from GramAddict.core.active_inference import ActiveInferenceEngine
|
||||
|
||||
ai = ActiveInferenceEngine("test_user")
|
||||
|
||||
for policy in ["STABLE", "CAUTIOUS", "DORMANT"]:
|
||||
ai.policy = policy
|
||||
mod = ai.get_sleep_modifier()
|
||||
assert 1.0 <= mod <= 5.0
|
||||
@@ -1,245 +0,0 @@
|
||||
"""
|
||||
Chaos Engineering: XML Corruption Resilience Tests for TelepathicEngine + SAE.
|
||||
|
||||
Verifies that NEITHER engine crashes on any form of corrupted, truncated,
|
||||
adversarial, or garbage XML input. They must degrade gracefully (return None
|
||||
or empty lists) without raising unhandled exceptions.
|
||||
|
||||
These tests are the "crash barrier" of autonomous navigation — ensuring that
|
||||
no matter what Android dumps to us, the bot survives and recovers.
|
||||
"""
|
||||
|
||||
import time
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from tests.chaos import generate_corrupted_xml
|
||||
|
||||
# ──────────────────────────────────────────────────
|
||||
# Telepathic Engine Chaos Tests
|
||||
# ──────────────────────────────────────────────────
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def telepathic_engine():
|
||||
"""Creates a real TelepathicEngine instance with mocked Qdrant."""
|
||||
with (
|
||||
patch("GramAddict.core.qdrant_memory.QdrantBase.__init__", return_value=None),
|
||||
patch(
|
||||
"GramAddict.core.qdrant_memory.QdrantBase.is_connected", new_callable=lambda: property(lambda self: False)
|
||||
),
|
||||
):
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
TelepathicEngine._instance = None
|
||||
engine = TelepathicEngine.__new__(TelepathicEngine)
|
||||
engine.__init__()
|
||||
|
||||
# We need to mock the Qdrant connection in the ActionMemory submodule
|
||||
engine._memory.ui_memory = MagicMock()
|
||||
engine._memory.ui_memory.is_connected = False
|
||||
engine._memory.ui_memory.query_closest = MagicMock(return_value=None)
|
||||
|
||||
# We mock positive memory for chaos tests
|
||||
engine.positive_memory = MagicMock()
|
||||
engine.positive_memory.is_connected = False
|
||||
engine.positive_memory.recall = MagicMock(return_value=None)
|
||||
yield engine
|
||||
TelepathicEngine._instance = None
|
||||
|
||||
|
||||
ALL_CORRUPTION_TYPES = [
|
||||
"EMPTY_STRING",
|
||||
"NONE_VALUE",
|
||||
"TRUNCATED_MID_TAG",
|
||||
"UNICODE_INJECTION",
|
||||
"MASSIVE_DOM_10K_NODES",
|
||||
"ZERO_SIZE_BOUNDS",
|
||||
"NEGATIVE_COORDINATES",
|
||||
"MISSING_CLOSING_TAGS",
|
||||
"RECURSIVE_NESTING_500_DEEP",
|
||||
"NULL_BYTES",
|
||||
"MALFORMED_BOUNDS",
|
||||
"ONLY_WHITESPACE",
|
||||
"HTML_NOT_XML",
|
||||
"BINARY_GARBAGE",
|
||||
"EXTREMELY_LONG_TEXT",
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.chaos
|
||||
class TestTelepathicEngineChaos:
|
||||
"""Telepathic Engine must NEVER crash on corrupted XML."""
|
||||
|
||||
@pytest.mark.parametrize("corruption_type", ALL_CORRUPTION_TYPES)
|
||||
def test_extract_semantic_nodes_survives(self, telepathic_engine, corruption_type):
|
||||
"""Engine's XML parser must return empty list on any corruption."""
|
||||
xml = generate_corrupted_xml(corruption_type)
|
||||
|
||||
# Must NOT raise. May return empty list.
|
||||
if xml is None:
|
||||
# None input — directly test defense
|
||||
result = telepathic_engine._extract_semantic_nodes("")
|
||||
else:
|
||||
result = telepathic_engine._extract_semantic_nodes(xml)
|
||||
|
||||
assert isinstance(result, list)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"corruption_type",
|
||||
[
|
||||
"EMPTY_STRING",
|
||||
"NONE_VALUE",
|
||||
"TRUNCATED_MID_TAG",
|
||||
"MISSING_CLOSING_TAGS",
|
||||
"ONLY_WHITESPACE",
|
||||
"HTML_NOT_XML",
|
||||
"BINARY_GARBAGE",
|
||||
],
|
||||
)
|
||||
def test_find_best_node_survives_garbage(self, telepathic_engine, corruption_type):
|
||||
"""find_best_node must return None on garbage XML, never crash."""
|
||||
xml = generate_corrupted_xml(corruption_type)
|
||||
if xml is None:
|
||||
xml = ""
|
||||
|
||||
result = telepathic_engine._find_best_node_inner(xml, "tap like button", min_confidence=0.82)
|
||||
# Must be None or a dict, never an exception
|
||||
assert result is None or isinstance(result, dict)
|
||||
|
||||
def test_unicode_injection_doesnt_corrupt_semantics(self, telepathic_engine):
|
||||
"""Zalgo text in nodes shouldn't crash semantic extraction."""
|
||||
xml = generate_corrupted_xml("UNICODE_INJECTION")
|
||||
nodes = telepathic_engine._extract_semantic_nodes(xml)
|
||||
# Should extract SOME nodes (the XML structure is valid)
|
||||
assert isinstance(nodes, list)
|
||||
# If nodes found, they should have valid coordinates
|
||||
for node in nodes:
|
||||
assert isinstance(node.get("x", 0), int)
|
||||
assert isinstance(node.get("y", 0), int)
|
||||
|
||||
def test_massive_dom_doesnt_hang(self, telepathic_engine):
|
||||
"""10K nodes must be parsed within 5 seconds — no infinite loops."""
|
||||
xml = generate_corrupted_xml("MASSIVE_DOM_10K_NODES")
|
||||
start = time.time()
|
||||
nodes = telepathic_engine._extract_semantic_nodes(xml)
|
||||
elapsed = time.time() - start
|
||||
|
||||
assert elapsed < 5.0, f"Parsing 10K nodes took {elapsed:.2f}s (limit: 5s)"
|
||||
assert isinstance(nodes, list)
|
||||
|
||||
def test_deep_nesting_doesnt_stackoverflow(self, telepathic_engine):
|
||||
"""500 levels of nesting must not cause stack overflow."""
|
||||
xml = generate_corrupted_xml("RECURSIVE_NESTING_500_DEEP")
|
||||
# This would crash Python's default recursion limit (1000) if
|
||||
# we used recursive parsing. ElementTree uses iterative parsing,
|
||||
# so it should survive.
|
||||
nodes = telepathic_engine._extract_semantic_nodes(xml)
|
||||
assert isinstance(nodes, list)
|
||||
|
||||
def test_null_bytes_stripped(self, telepathic_engine):
|
||||
"""Null bytes in text content must not cause parsing failures."""
|
||||
xml = generate_corrupted_xml("NULL_BYTES")
|
||||
nodes = telepathic_engine._extract_semantic_nodes(xml)
|
||||
assert isinstance(nodes, list)
|
||||
# Verify no null bytes leaked into node semantics
|
||||
for node in nodes:
|
||||
assert "\x00" not in node.get("semantic_string", "")
|
||||
|
||||
|
||||
# ──────────────────────────────────────────────────
|
||||
# SAE (Situational Awareness Engine) Chaos Tests
|
||||
# ──────────────────────────────────────────────────
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sae_engine():
|
||||
"""Creates a SAE instance with mocked device."""
|
||||
from GramAddict.core.situational_awareness import SituationalAwarenessEngine
|
||||
|
||||
SituationalAwarenessEngine.reset()
|
||||
|
||||
device = MagicMock()
|
||||
device.app_id = "com.instagram.android"
|
||||
device.deviceV2 = MagicMock()
|
||||
device.deviceV2.info = {"screenOn": True}
|
||||
|
||||
engine = SituationalAwarenessEngine(device)
|
||||
|
||||
# Mock the episode DB to avoid Qdrant dependency
|
||||
engine.episodes = MagicMock()
|
||||
engine.episodes.recall = MagicMock(return_value=None)
|
||||
engine.episodes.learn = MagicMock()
|
||||
|
||||
yield engine
|
||||
SituationalAwarenessEngine.reset()
|
||||
|
||||
|
||||
@pytest.mark.chaos
|
||||
class TestSAEChaos:
|
||||
"""SAE perception must be bulletproof against XML corruption."""
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"corruption_type",
|
||||
[
|
||||
"EMPTY_STRING",
|
||||
"TRUNCATED_MID_TAG",
|
||||
"MISSING_CLOSING_TAGS",
|
||||
"ONLY_WHITESPACE",
|
||||
"HTML_NOT_XML",
|
||||
"BINARY_GARBAGE",
|
||||
],
|
||||
)
|
||||
def test_compress_xml_survives_garbage(self, sae_engine, corruption_type):
|
||||
"""XML compression must never crash, even on garbage."""
|
||||
xml = generate_corrupted_xml(corruption_type)
|
||||
if xml is None:
|
||||
xml = ""
|
||||
|
||||
result = sae_engine._compress_xml(xml)
|
||||
assert isinstance(result, str)
|
||||
assert len(result) > 0 # Should always return something
|
||||
|
||||
def test_compress_empty_returns_marker(self, sae_engine):
|
||||
"""Empty/None input must return 'EMPTY_SCREEN' sentinel."""
|
||||
assert sae_engine._compress_xml("") == "EMPTY_SCREEN"
|
||||
assert sae_engine._compress_xml(None) == "EMPTY_SCREEN"
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"corruption_type",
|
||||
[
|
||||
"EMPTY_STRING",
|
||||
"TRUNCATED_MID_TAG",
|
||||
"BINARY_GARBAGE",
|
||||
"ONLY_WHITESPACE",
|
||||
],
|
||||
)
|
||||
def test_perceive_survives_garbage(self, sae_engine, corruption_type):
|
||||
"""perceive() must return a valid SituationType on any input."""
|
||||
from GramAddict.core.situational_awareness import SituationType
|
||||
|
||||
xml = generate_corrupted_xml(corruption_type)
|
||||
if xml is None:
|
||||
xml = ""
|
||||
|
||||
result = sae_engine.perceive(xml)
|
||||
assert isinstance(result, SituationType)
|
||||
|
||||
def test_compute_situation_hash_is_deterministic(self, sae_engine):
|
||||
"""Same XML must always produce the same hash."""
|
||||
xml = generate_corrupted_xml("UNICODE_INJECTION")
|
||||
compressed = sae_engine._compress_xml(xml)
|
||||
hash1 = sae_engine._compute_situation_hash(compressed)
|
||||
hash2 = sae_engine._compute_situation_hash(compressed)
|
||||
assert hash1 == hash2
|
||||
|
||||
def test_massive_dom_compression_is_bounded(self, sae_engine):
|
||||
"""10K nodes must be compressed to < 3000 chars (the cap)."""
|
||||
xml = generate_corrupted_xml("MASSIVE_DOM_10K_NODES")
|
||||
start = time.time()
|
||||
result = sae_engine._compress_xml(xml)
|
||||
elapsed = time.time() - start
|
||||
|
||||
assert len(result) <= 3000, f"Compressed output is {len(result)} chars (limit: 3000)"
|
||||
assert elapsed < 5.0, f"Compression took {elapsed:.2f}s"
|
||||
@@ -1,180 +1,102 @@
|
||||
import logging
|
||||
import os
|
||||
from unittest.mock import MagicMock, create_autospec
|
||||
"""
|
||||
Root Test Configuration — Global Guards Against Environmental Pollution
|
||||
=======================================================================
|
||||
|
||||
This conftest protects ALL tests from the #1 cause of mass failure:
|
||||
Config() constructor calling argparse.parse_known_args() which reads
|
||||
sys.argv (pytest's arguments) and crashes with SystemExit: 2.
|
||||
|
||||
Every test directory inherits these fixtures automatically.
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.device_facade import DeviceFacade
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
|
||||
def pytest_addoption(parser):
|
||||
parser.addoption(
|
||||
"--live",
|
||||
action="store_true",
|
||||
default=False,
|
||||
help="run tests against a live ADB device (disable DeviceFacade mocks)",
|
||||
)
|
||||
|
||||
|
||||
MagicMock.app_id = "com.instagram.android"
|
||||
MagicMock._get_current_app = MagicMock(return_value="com.instagram.android")
|
||||
|
||||
|
||||
class MockArgs:
|
||||
def __init__(self, **kwargs):
|
||||
for k, v in kwargs.items():
|
||||
setattr(self, k, v)
|
||||
|
||||
|
||||
class MockConfigs:
|
||||
def __init__(self, args):
|
||||
self.args = args
|
||||
|
||||
|
||||
def create_mock_device():
|
||||
mock = create_autospec(DeviceFacade, instance=True)
|
||||
mock.app_id = "com.instagram.android"
|
||||
mock.device_id = "test_device"
|
||||
|
||||
mock.info = {"displayWidth": 1080, "displayHeight": 2400}
|
||||
mock.get_info.return_value = {"displayWidth": 1080, "displayHeight": 2400}
|
||||
mock.cm_to_pixels.side_effect = lambda cm: int(cm * 10)
|
||||
mock.shell.return_value = "" # Ensure SendEventInjector detection gets a string
|
||||
import uuid
|
||||
|
||||
mock.dump_hierarchy.side_effect = (
|
||||
lambda: f'<hierarchy><node resource-id="com.instagram.android:id/row_feed_photo_profile_name" bounds="[0,200][1080,260]" text="testuser" /><node resource-id="com.instagram.android:id/row_comment_imageview" bounds="[10,10][20,20]" content-desc="Story" text="following" /><node resource-id="com.instagram.android:id/button_like" bounds="[50,50][60,60]" /><node resource-id="com.instagram.android:id/reel_viewer" /><node sid="{uuid.uuid4()}" /></hierarchy>'
|
||||
)
|
||||
|
||||
return mock
|
||||
|
||||
|
||||
def create_mock_telepathic_engine():
|
||||
mock = create_autospec(TelepathicEngine, instance=True)
|
||||
mock.find_best_node.return_value = {"x": 500, "y": 500, "confidence": 0.9}
|
||||
mock.evaluate_profile_vibe.return_value = {
|
||||
"quality_score": 8,
|
||||
"matches_niche": True,
|
||||
"reason": "Mocked positive vibe",
|
||||
}
|
||||
mock.evaluate_grid_visuals.return_value = {
|
||||
"x": 500,
|
||||
"y": 500,
|
||||
"score": 0.99,
|
||||
"semantic": "Mocked matching grid cell",
|
||||
"source": "vlm_grid",
|
||||
}
|
||||
mock.find_best_node.return_value = {"x": 500, "y": 500, "semantic_string": "dummy node"}
|
||||
return mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_logger():
|
||||
return logging.getLogger("test")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device(request):
|
||||
if request.config.getoption("--live"):
|
||||
import os
|
||||
|
||||
import yaml
|
||||
|
||||
from GramAddict.core.device_facade import create_device
|
||||
|
||||
device_id = "emulator-5554"
|
||||
app_id = "com.instagram.android"
|
||||
|
||||
config_path = "test_config.yml"
|
||||
if os.path.exists(config_path):
|
||||
try:
|
||||
with open(config_path, "r", encoding="utf-8") as f:
|
||||
config = yaml.safe_load(f)
|
||||
if config:
|
||||
device_id = config.get("device", device_id)
|
||||
app_id = config.get("app-id", app_id)
|
||||
except Exception as e:
|
||||
print(f"⚠️ Warning: Could not load {config_path}: {e}")
|
||||
|
||||
print(f"🚀 Connecting to live device: {device_id} (App: {app_id})")
|
||||
return create_device(device_id, app_id)
|
||||
return create_mock_device()
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def reset_singletons():
|
||||
"""Ensure all core engine singletons are fresh for each test."""
|
||||
from GramAddict.core.behaviors import PluginRegistry
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
from GramAddict.core.physics.biomechanics import PhysicsBody
|
||||
from GramAddict.core.physics.sendevent_injector import SendEventInjector
|
||||
from GramAddict.core.qdrant_memory import QdrantBase
|
||||
from GramAddict.core.situational_awareness import SituationalAwarenessEngine
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
def _isolate_config_from_argparse(monkeypatch):
|
||||
"""Prevent Config() from reading sys.argv during tests.
|
||||
|
||||
TelepathicEngine.reset()
|
||||
GoalExecutor.reset()
|
||||
SituationalAwarenessEngine.reset()
|
||||
PluginRegistry.reset()
|
||||
PhysicsBody.reset()
|
||||
SendEventInjector.reset()
|
||||
Root cause: Config.__init__ calls self.parse_args() which calls
|
||||
self.parser.parse_known_args(). In pytest, sys.argv contains
|
||||
pytest flags like '--ignore=...' which argparse interprets as
|
||||
Config arguments, causing SystemExit: 2.
|
||||
|
||||
QdrantBase._connection_failed_logged = False
|
||||
|
||||
from GramAddict.core.dojo_engine import DojoEngine
|
||||
|
||||
if hasattr(DojoEngine, "reset"):
|
||||
DojoEngine.reset()
|
||||
else:
|
||||
DojoEngine._instance = None
|
||||
|
||||
# Aggressively wipe on-disk session files to prevent state leakage in tests
|
||||
for f in [
|
||||
"telepathic_memory.json",
|
||||
"telepathic_blacklist.json",
|
||||
"growth_brain_memory.json",
|
||||
"gramaddict_nav_map.json",
|
||||
"l2_channels_cache.json",
|
||||
]:
|
||||
if os.path.exists(f):
|
||||
try:
|
||||
os.remove(f)
|
||||
except Exception:
|
||||
pass
|
||||
yield
|
||||
|
||||
# Post-test cleanup
|
||||
PhysicsBody.reset()
|
||||
SendEventInjector.reset()
|
||||
Fix: Temporarily set sys.argv to a minimal list so argparse
|
||||
doesn't choke on pytest's arguments.
|
||||
"""
|
||||
monkeypatch.setattr(sys, "argv", ["test_runner"])
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def telepathic_mock(monkeypatch, request):
|
||||
if request.config.getoption("--live") or "e2e" in str(request.node.fspath):
|
||||
# TelepathicEngine is a singleton, allow it to run natively in e2e or live mode
|
||||
return None
|
||||
import GramAddict.core.telepathic_engine
|
||||
|
||||
engine = create_mock_telepathic_engine()
|
||||
monkeypatch.setattr(GramAddict.core.telepathic_engine.TelepathicEngine, "get_instance", lambda: engine)
|
||||
return engine
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Pytest Markers Registration
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_cognitive_stack():
|
||||
stack = {
|
||||
"dopamine": MagicMock(),
|
||||
"darwin": MagicMock(),
|
||||
"resonance": MagicMock(),
|
||||
"active_inference": MagicMock(),
|
||||
"growth_brain": MagicMock(),
|
||||
"swarm": MagicMock(),
|
||||
"radome": MagicMock(),
|
||||
"nav_graph": MagicMock(),
|
||||
"zero_engine": MagicMock(),
|
||||
"crm": MagicMock(),
|
||||
"telepathic": create_mock_telepathic_engine(),
|
||||
}
|
||||
stack["radome"].sanitize_xml.side_effect = lambda x: x
|
||||
return stack
|
||||
def pytest_configure(config):
|
||||
config.addinivalue_line("markers", "live_llm: requires a running local LLM (Ollama)")
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# PERMANENT MOCK BAN — Zero-Tolerance Enforcement
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
_BANNED_PATTERNS = (
|
||||
"from unittest.mock",
|
||||
"from unittest import mock",
|
||||
"import unittest.mock",
|
||||
"from mock import",
|
||||
"import mock",
|
||||
"MagicMock(",
|
||||
"MagicMock)",
|
||||
"@patch(",
|
||||
"@patch\n",
|
||||
"patch.object(",
|
||||
)
|
||||
|
||||
|
||||
def pytest_collect_file(parent, file_path):
|
||||
"""Scan every collected .py test file for banned mock imports.
|
||||
|
||||
This runs at COLLECTION TIME — before any test executes.
|
||||
If a banned pattern is found, the file is still collected but
|
||||
every test inside it will be marked as an error via
|
||||
pytest_collection_modifyitems below.
|
||||
"""
|
||||
if file_path.suffix == ".py" and file_path.name.startswith("test_"):
|
||||
try:
|
||||
content = file_path.read_text(encoding="utf-8")
|
||||
for pattern in _BANNED_PATTERNS:
|
||||
if pattern in content:
|
||||
# Store the violation on the config for later reporting
|
||||
if not hasattr(parent.config, "_mock_violations"):
|
||||
parent.config._mock_violations = {}
|
||||
parent.config._mock_violations[str(file_path)] = pattern
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
return None # Let pytest's default collector handle the file
|
||||
|
||||
|
||||
def pytest_collection_modifyitems(config, items):
|
||||
"""Fail every test from a file that contains banned mock patterns."""
|
||||
violations = getattr(config, "_mock_violations", {})
|
||||
if not violations:
|
||||
return
|
||||
|
||||
for item in items:
|
||||
test_file = str(item.fspath)
|
||||
if test_file in violations:
|
||||
pattern = violations[test_file]
|
||||
item.add_marker(
|
||||
pytest.mark.xfail(
|
||||
reason=(
|
||||
f"🚨 MOCK BAN VIOLATION: File contains '{pattern}'. "
|
||||
f"unittest.mock is permanently banned. "
|
||||
f"Use monkeypatch + real fixtures instead."
|
||||
),
|
||||
strict=True,
|
||||
raises=Exception,
|
||||
)
|
||||
)
|
||||
|
||||
57
tests/core/test_config.py
Normal file
@@ -0,0 +1,57 @@
|
||||
import io
|
||||
|
||||
from GramAddict.core.config import Config
|
||||
|
||||
|
||||
def test_config_help_format_no_crash():
|
||||
"""
|
||||
Test that calling print_help() on the config parser does not crash.
|
||||
This prevents bugs where a '%' symbol in help strings causes argparse
|
||||
to fail with "ValueError: unsupported format character".
|
||||
"""
|
||||
config = Config()
|
||||
|
||||
# We redirect stdout/stderr so we don't spam the console, but what matters
|
||||
# is that print_help() executes without throwing a ValueError.
|
||||
from contextlib import redirect_stdout
|
||||
|
||||
f = io.StringIO()
|
||||
with redirect_stdout(f):
|
||||
config.parser.print_help()
|
||||
|
||||
output = f.getvalue()
|
||||
assert len(output) > 0, "print_help() should output help text."
|
||||
assert "Wipe all learned navigation" in output, "Expected blank-start help string in output."
|
||||
|
||||
|
||||
def test_parse_args_no_exit_when_config_loaded(monkeypatch):
|
||||
"""
|
||||
Test that if no CLI arguments are provided (sys.argv == ['run.py']),
|
||||
but a config file is loaded, parse_args() should NOT print help and exit.
|
||||
"""
|
||||
import sys
|
||||
|
||||
# Simulate running without arguments
|
||||
monkeypatch.setattr(sys, "argv", ["run.py"])
|
||||
|
||||
config = Config()
|
||||
|
||||
# Simulate that we successfully loaded a config dictionary (e.g. from config.yml)
|
||||
config.config = {"some_setting": "value"}
|
||||
|
||||
help_called = []
|
||||
def mock_print_help(*args, **kwargs):
|
||||
help_called.append(True)
|
||||
|
||||
monkeypatch.setattr(config.parser, "print_help", mock_print_help)
|
||||
|
||||
# If parse_args() calls exit(0), it will raise SystemExit
|
||||
try:
|
||||
config.parse_args()
|
||||
# If we get here, no exit() was called.
|
||||
# Also, print_help should not have been called.
|
||||
assert not help_called, "print_help should not have been called"
|
||||
except SystemExit:
|
||||
import pytest
|
||||
|
||||
pytest.fail("parse_args() should not exit when a config is loaded.")
|
||||
55
tests/core/test_embeddings_truncation.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import pytest
|
||||
import requests
|
||||
|
||||
from GramAddict.core.qdrant_memory import QdrantBase
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_embedding_context_length_limit():
|
||||
"""
|
||||
TDD Proof: Ensure _get_embedding truncates input sufficiently to avoid
|
||||
'input length exceeds the context length' (500) from Ollama.
|
||||
"""
|
||||
|
||||
class DummyMemory(QdrantBase):
|
||||
def __init__(self):
|
||||
# Bypass init connection checks for this test
|
||||
self._vector_size = 768
|
||||
pass
|
||||
|
||||
memory = DummyMemory()
|
||||
|
||||
# Mock config to use standard local embedding endpoint
|
||||
class FakeArgs:
|
||||
ai_embedding_model = "nomic-embed-text"
|
||||
ai_embedding_url = "http://localhost:11434/api/embeddings"
|
||||
|
||||
memory._cached_args = FakeArgs()
|
||||
|
||||
# Generate an extremely long string (e.g. 15,000 chars) that would crash Ollama
|
||||
huge_text = "lorem ipsum " * 2000
|
||||
|
||||
# This should NOT raise a requests.exceptions.HTTPError (500)
|
||||
try:
|
||||
vector = memory._get_embedding(huge_text)
|
||||
assert vector is not None, "Vector should not be None for successful API calls"
|
||||
assert len(vector) > 0, "Vector should have dimensions"
|
||||
except requests.exceptions.HTTPError as e:
|
||||
pytest.fail(f"Embedding API crashed with HTTP error (likely context limit): {e}")
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_structural_signature_truncation():
|
||||
"""
|
||||
Ensure UIMemoryDB correctly truncates structural signatures to 2000 chars.
|
||||
"""
|
||||
from GramAddict.core.qdrant_memory import UIMemoryDB
|
||||
|
||||
db = UIMemoryDB()
|
||||
|
||||
# Huge XML-like string
|
||||
huge_xml = "<node " + ('text="junk" ' * 1000) + "/>"
|
||||
|
||||
sig = db._create_structural_signature(huge_xml)
|
||||
assert len(sig) <= 2000, f"Signature length {len(sig)} exceeds 2000"
|
||||
assert "text=" not in sig, "Structural signature should have removed 'text' attributes"
|
||||
@@ -15,10 +15,18 @@ import signal
|
||||
import time
|
||||
|
||||
import pytest
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from GramAddict.core import utils
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# CLI Options
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
def pytest_addoption(parser):
|
||||
parser.addoption("--live", action="store_true", default=False, help="Run live tests")
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Constants
|
||||
# ═══════════════════════════════════════════════════════
|
||||
@@ -127,17 +135,15 @@ def iteration_guard():
|
||||
|
||||
|
||||
@pytest.fixture(scope="function", autouse=True)
|
||||
def isolated_screen_memory():
|
||||
def isolated_screen_memory(monkeypatch):
|
||||
"""Ensures we use a separate Qdrant collection for E2E tests and clean it.
|
||||
This replaces the old Qdrant mock so tests use the REAL database."""
|
||||
from GramAddict.core.qdrant_memory import ScreenMemoryDB
|
||||
|
||||
original_init = ScreenMemoryDB.__init__
|
||||
|
||||
def test_init(self, *args, **kwargs):
|
||||
super(ScreenMemoryDB, self).__init__(collection_name="test_e2e_screens")
|
||||
|
||||
ScreenMemoryDB.__init__ = test_init
|
||||
monkeypatch.setattr(ScreenMemoryDB, "__init__", test_init)
|
||||
|
||||
db = ScreenMemoryDB()
|
||||
if db.is_connected:
|
||||
@@ -145,9 +151,6 @@ def isolated_screen_memory():
|
||||
|
||||
yield db
|
||||
|
||||
# Restore original
|
||||
ScreenMemoryDB.__init__ = original_init
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Device Dump Injectors
|
||||
@@ -155,17 +158,146 @@ def isolated_screen_memory():
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def e2e_device_dump_injector(request):
|
||||
"""Provides a factory to mock device.dump_hierarchy using real XML files."""
|
||||
if request.config.getoption("--live"):
|
||||
return lambda *args, **kwargs: None
|
||||
def make_real_device_with_xml(monkeypatch):
|
||||
"""Provides a factory to create a REAL DeviceFacade but mocked uiautomator2."""
|
||||
|
||||
def _inject_dump(device_mock, xml_filename):
|
||||
real_xml = load_fixture_xml(xml_filename)
|
||||
device_mock.dump_hierarchy.return_value = real_xml
|
||||
return real_xml
|
||||
def _create(xml_content):
|
||||
import GramAddict.core.device_facade as device_facade
|
||||
from GramAddict.core.device_facade import DeviceFacade
|
||||
|
||||
return _inject_dump
|
||||
class MockU2Watcher:
|
||||
def when(self, xpath=None, **kwargs):
|
||||
return self
|
||||
|
||||
def click(self):
|
||||
return self
|
||||
|
||||
def start(self):
|
||||
pass
|
||||
|
||||
class MockU2Device:
|
||||
def __init__(self, xml):
|
||||
self.xml = xml
|
||||
self.info = {"sdkInt": 30, "displaySizeDpX": 400, "displayWidth": 1080, "screenOn": True}
|
||||
self.settings = {}
|
||||
|
||||
def dump_hierarchy(self, compressed=False):
|
||||
if isinstance(self.xml, list):
|
||||
res = self.xml.pop(0) if self.xml else ""
|
||||
return res
|
||||
return self.xml
|
||||
|
||||
def screenshot(self):
|
||||
from PIL import Image
|
||||
|
||||
return Image.new("RGB", (1080, 1920), color="black")
|
||||
|
||||
def app_current(self):
|
||||
return {"package": "com.instagram.android"}
|
||||
|
||||
def shell(self, cmd):
|
||||
pass
|
||||
|
||||
def press(self, key):
|
||||
pass
|
||||
|
||||
def swipe(self, sx, sy, ex, ey, **kwargs):
|
||||
pass
|
||||
|
||||
def click(self, x, y):
|
||||
pass
|
||||
|
||||
def watcher(self, name):
|
||||
return MockU2Watcher()
|
||||
|
||||
def app_start(self, package_name, use_monkey=False):
|
||||
pass
|
||||
|
||||
def mock_connect(*args, **kwargs):
|
||||
return MockU2Device(xml_content)
|
||||
|
||||
monkeypatch.setattr(device_facade.u2, "connect", mock_connect)
|
||||
|
||||
# Now we instantiate the REAL DeviceFacade!
|
||||
device = DeviceFacade("test_device", "com.instagram.android", None)
|
||||
return device
|
||||
|
||||
return _create
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def make_real_device_with_image(monkeypatch):
|
||||
"""Provides a factory to create a REAL DeviceFacade but mocked uiautomator2 returning a real image."""
|
||||
|
||||
def _create(img_path, xml_content=None):
|
||||
from PIL import Image
|
||||
|
||||
import GramAddict.core.device_facade as device_facade
|
||||
from GramAddict.core.device_facade import DeviceFacade
|
||||
|
||||
if isinstance(img_path, str):
|
||||
img = Image.open(img_path)
|
||||
else:
|
||||
img = img_path
|
||||
|
||||
class MockU2Watcher:
|
||||
def when(self, xpath=None, **kwargs):
|
||||
return self
|
||||
|
||||
def click(self):
|
||||
return self
|
||||
|
||||
def start(self):
|
||||
pass
|
||||
|
||||
class MockU2Device:
|
||||
def __init__(self, img, xml):
|
||||
self.img = img
|
||||
self.xml = xml
|
||||
self.info = {"sdkInt": 30, "displaySizeDpX": 400, "displayWidth": 1080, "screenOn": True}
|
||||
self.settings = {}
|
||||
|
||||
def dump_hierarchy(self, compressed=False):
|
||||
if self.xml:
|
||||
if isinstance(self.xml, list):
|
||||
res = self.xml.pop(0) if self.xml else ""
|
||||
return res
|
||||
return self.xml
|
||||
return ""
|
||||
|
||||
def screenshot(self):
|
||||
return self.img
|
||||
|
||||
def app_current(self):
|
||||
return {"package": "com.instagram.android"}
|
||||
|
||||
def shell(self, cmd):
|
||||
pass
|
||||
|
||||
def press(self, key):
|
||||
pass
|
||||
|
||||
def swipe(self, sx, sy, ex, ey, **kwargs):
|
||||
pass
|
||||
|
||||
def click(self, x, y):
|
||||
pass
|
||||
|
||||
def watcher(self, name):
|
||||
return MockU2Watcher()
|
||||
|
||||
def app_start(self, package_name, use_monkey=False):
|
||||
pass
|
||||
|
||||
def mock_connect(*args, **kwargs):
|
||||
return MockU2Device(img, xml_content)
|
||||
|
||||
monkeypatch.setattr(device_facade.u2, "connect", mock_connect)
|
||||
|
||||
device = DeviceFacade("test_device", "com.instagram.android", None)
|
||||
return device
|
||||
|
||||
return _create
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
@@ -216,30 +348,6 @@ def mock_all_delays(monkeypatch, request):
|
||||
_patch_module_delays(monkeypatch, "GramAddict.core.device_facade", money_sleep, random_sleep)
|
||||
_patch_module_delays(monkeypatch, "GramAddict.core.darwin_engine", money_sleep, random_sleep)
|
||||
|
||||
# Standardize DarwinEngine to prevent mockup math errors on session end
|
||||
try:
|
||||
from GramAddict.core.darwin_engine import DarwinEngine
|
||||
|
||||
monkeypatch.setattr(DarwinEngine, "evaluate_session_end", lambda *args, **kwargs: None)
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Identity & Account Guard
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def mock_identity_guard(monkeypatch):
|
||||
import GramAddict.core.bot_flow
|
||||
|
||||
monkeypatch.setattr(
|
||||
GramAddict.core.bot_flow,
|
||||
"verify_and_switch_account",
|
||||
lambda *args, **kwargs: True,
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# E2E Configs — Standardized Test Configuration
|
||||
@@ -283,13 +391,13 @@ def e2e_configs():
|
||||
visual_vibe_check_percentage=0,
|
||||
)
|
||||
|
||||
from GramAddict.core.config import Config
|
||||
|
||||
configs = MagicMock()
|
||||
configs.args = args
|
||||
configs.username = "testuser"
|
||||
|
||||
def get_plugin_config_mock(plugin_name):
|
||||
mapping = {
|
||||
config = Config(first_run=True)
|
||||
config.args = args
|
||||
config.username = "testuser"
|
||||
config.config = {
|
||||
"plugins": {
|
||||
"likes": {"count": args.likes_count, "percentage": args.likes_percentage},
|
||||
"comment": {
|
||||
"percentage": args.comment_percentage,
|
||||
@@ -306,10 +414,8 @@ def e2e_configs():
|
||||
"count": getattr(args, "carousel_count", "1"),
|
||||
},
|
||||
}
|
||||
return mapping.get(plugin_name, {})
|
||||
|
||||
configs.get_plugin_config.side_effect = get_plugin_config_mock
|
||||
return configs
|
||||
}
|
||||
return config
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
54
tests/e2e/dump_legend.py
Normal file
@@ -0,0 +1,54 @@
|
||||
from PIL import Image
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
|
||||
def inspect_nodes(base_name):
|
||||
print(f"\n--- INSPECT FOR {base_name} ---")
|
||||
xml_path = f"tests/fixtures/{base_name}.xml"
|
||||
jpg_path = f"tests/fixtures/{base_name}.jpg"
|
||||
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
# We want to use the EXACT intent resolver logic
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Let's mock the device using DeviceFacade
|
||||
from GramAddict.core.device_facade import DeviceFacade
|
||||
|
||||
class MockU2Device:
|
||||
def __init__(self, img_path):
|
||||
self.img = Image.open(img_path)
|
||||
self.info = {"sdkInt": 30, "displaySizeDpX": 400, "displayWidth": 1080, "screenOn": True}
|
||||
|
||||
def screenshot(self):
|
||||
return self.img
|
||||
|
||||
device = object.__new__(DeviceFacade)
|
||||
device.device_id = "test_device"
|
||||
device.app_id = "com.instagram.android"
|
||||
device.args = None
|
||||
device.deviceV2 = MockU2Device(jpg_path)
|
||||
b64, box_map = resolver._annotate_screenshot_with_candidates(device, candidates)
|
||||
|
||||
for idx in sorted(box_map.keys()):
|
||||
node = box_map[idx]
|
||||
label_parts = []
|
||||
if node.content_desc:
|
||||
label_parts.append(f"desc='{node.content_desc[:50]}'")
|
||||
if node.text and node.text != node.content_desc:
|
||||
label_parts.append(f"text='{node.text[:50]}'")
|
||||
if node.resource_id:
|
||||
label_parts.append(f"id='{node.resource_id.split('/')[-1]}'")
|
||||
if not label_parts:
|
||||
label_parts.append("(no visible text)")
|
||||
print(f" [{idx}] {', '.join(label_parts)}")
|
||||
|
||||
|
||||
inspect_nodes("comment_sheet")
|
||||
67
tests/e2e/test_brain_live.py
Normal file
@@ -0,0 +1,67 @@
|
||||
import logging
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.navigation.brain import ask_brain_for_action
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# ── Stochastic LLM Tests ──
|
||||
# LLMs are non-deterministic. A single run proves nothing.
|
||||
# We run N times and assert that at least X/N responses are valid.
|
||||
# This catches SYSTEMATIC failures (empty responses, thinking leaks)
|
||||
# while tolerating genuine LLM variance.
|
||||
|
||||
STOCHASTIC_RUNS = 5
|
||||
MIN_VALID_RATIO = 0.6 # At least 60% must return valid actions
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_brain_recommends_valid_action_when_trapped():
|
||||
"""
|
||||
Test that the real, live LLM Brain returns valid actions at a statistically
|
||||
significant rate. Accounts for reasoning models that sometimes return
|
||||
response='' (which our pipeline correctly treats as None).
|
||||
"""
|
||||
goal = "open following list"
|
||||
screen = "OWN_PROFILE"
|
||||
available_actions = [
|
||||
"tap share button",
|
||||
"press back",
|
||||
"tap reels tab",
|
||||
"tap messages tab",
|
||||
"scroll down",
|
||||
"scroll up",
|
||||
]
|
||||
explored_nav_actions = {"tap following list"}
|
||||
|
||||
valid_results = []
|
||||
none_results = []
|
||||
|
||||
for i in range(STOCHASTIC_RUNS):
|
||||
brain_action = ask_brain_for_action(
|
||||
goal=goal,
|
||||
screen_type=screen,
|
||||
available_actions=available_actions,
|
||||
explored_actions=explored_nav_actions,
|
||||
)
|
||||
|
||||
if brain_action is not None and brain_action in available_actions:
|
||||
valid_results.append(brain_action)
|
||||
else:
|
||||
none_results.append(brain_action)
|
||||
|
||||
logger.info(f"[Run {i+1}/{STOCHASTIC_RUNS}] Brain returned: '{brain_action}'")
|
||||
|
||||
min_required = int(STOCHASTIC_RUNS * MIN_VALID_RATIO)
|
||||
assert len(valid_results) >= min_required, (
|
||||
f"Brain returned valid actions in only {len(valid_results)}/{STOCHASTIC_RUNS} runs "
|
||||
f"(minimum required: {min_required}). "
|
||||
f"None results: {none_results}. Valid results: {valid_results}"
|
||||
)
|
||||
|
||||
# Bonus: verify no result was from an action we already explored
|
||||
for action in valid_results:
|
||||
assert action not in explored_nav_actions, (
|
||||
f"Brain returned explored/failed action '{action}' — masking is broken!"
|
||||
)
|
||||
@@ -1,102 +0,0 @@
|
||||
from unittest.mock import patch
|
||||
|
||||
from GramAddict.core.physics.timing import align_active_post, wait_for_post_loaded, wait_for_story_loaded
|
||||
from tests.e2e.test_e2e_behaviors import BehaviorSimulator
|
||||
|
||||
|
||||
def test_wait_for_post_detects_feed():
|
||||
sim = BehaviorSimulator()
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
with patch("GramAddict.core.physics.timing.sleep", autospec=True):
|
||||
assert wait_for_post_loaded(sim, timeout=1) is True
|
||||
|
||||
|
||||
def test_wait_for_post_timeout_and_adaptive_snap():
|
||||
sim = BehaviorSimulator()
|
||||
# Empty XML will cause timeout
|
||||
sim.mock_xml = "<hierarchy></hierarchy>"
|
||||
|
||||
with patch("GramAddict.core.physics.timing.sleep", autospec=True):
|
||||
assert wait_for_post_loaded(sim, timeout=1) is False
|
||||
|
||||
swipes = [a for a in sim.actions_taken if a[0] == "swipe"]
|
||||
assert len(swipes) > 0
|
||||
|
||||
|
||||
def test_wait_for_story_detects_viewer():
|
||||
sim = BehaviorSimulator()
|
||||
sim.mock_xml = '<node class="hierarchy"><node resource-id="com.instagram.android:id/reel_viewer_root" /></node>'
|
||||
|
||||
with patch("GramAddict.core.physics.timing.sleep", autospec=True):
|
||||
assert wait_for_story_loaded(sim, timeout=1) is True
|
||||
|
||||
|
||||
def test_wait_for_story_timeout():
|
||||
sim = BehaviorSimulator()
|
||||
sim.mock_xml = "<hierarchy></hierarchy>"
|
||||
|
||||
with patch("GramAddict.core.physics.timing.sleep", autospec=True):
|
||||
assert wait_for_story_loaded(sim, timeout=1) is False
|
||||
|
||||
|
||||
def test_align_active_post_centers_content():
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
# We load real organic post
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
# We simulate the header being at bounds [0, 800][1080, 950] instead of [0, 200][1080, 350]
|
||||
# This will make the diff > 100
|
||||
# The node in organic_post.xml is:
|
||||
# resource-id="com.instagram.android:id/row_feed_profile_header" bounds="[0,665][1080,802]"
|
||||
# center Y = 733. Target is 250. Diff = 483.
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
def mock_swipe(sx, sy, ex, ey, duration=None):
|
||||
sim.actions_taken.append(("swipe", sx, sy, ex, ey))
|
||||
# Simulate that the swipe successfully aligned it
|
||||
# Move both the header and the name node
|
||||
sim.mock_xml = sim.mock_xml.replace('bounds="[0,665][1080,802]"', 'bounds="[0,200][1080,337]"')
|
||||
sim.mock_xml = sim.mock_xml.replace('bounds="[128,665][768,731]"', 'bounds="[128,200][768,266]"')
|
||||
|
||||
sim.swipe = mock_swipe
|
||||
|
||||
with patch("GramAddict.core.physics.timing.sleep", autospec=True):
|
||||
try:
|
||||
aligned = align_active_post(sim)
|
||||
except Exception as e:
|
||||
print(f"Exception: {e}")
|
||||
raise
|
||||
|
||||
assert aligned is True
|
||||
|
||||
|
||||
def test_align_active_post_already_centered():
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
# Move the header to target Y = 250 -> bounds [0,180][1080,320]
|
||||
xml_str = f.read()
|
||||
xml_str = xml_str.replace('bounds="[0,665][1080,802]"', 'bounds="[0,180][1080,320]"')
|
||||
xml_str = xml_str.replace('bounds="[128,665][768,731]"', 'bounds="[128,180][768,246]"')
|
||||
sim.mock_xml = xml_str
|
||||
|
||||
with patch("GramAddict.core.physics.timing.sleep", autospec=True):
|
||||
aligned = align_active_post(sim)
|
||||
|
||||
# It considers it already aligned
|
||||
assert aligned is True
|
||||
|
||||
swipes = [a for a in sim.actions_taken if a[0] == "swipe"]
|
||||
assert len(swipes) == 0
|
||||
|
||||
|
||||
def test_align_post_with_no_header():
|
||||
sim = BehaviorSimulator()
|
||||
sim.mock_xml = "<hierarchy></hierarchy>"
|
||||
|
||||
with patch("GramAddict.core.physics.timing.sleep", autospec=True):
|
||||
aligned = align_active_post(sim)
|
||||
|
||||
assert aligned is False
|
||||
@@ -1,693 +0,0 @@
|
||||
import urllib.request
|
||||
from unittest.mock import MagicMock, create_autospec, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.behaviors import BehaviorContext
|
||||
from GramAddict.core.behaviors.carousel_browsing import CarouselBrowsingPlugin
|
||||
from GramAddict.core.behaviors.comment import CommentPlugin
|
||||
from GramAddict.core.behaviors.follow import FollowPlugin
|
||||
from GramAddict.core.behaviors.grid_like import GridLikePlugin
|
||||
from GramAddict.core.behaviors.like import LikePlugin
|
||||
from GramAddict.core.behaviors.profile_guard import ProfileGuardPlugin
|
||||
from GramAddict.core.behaviors.story_view import StoryViewPlugin
|
||||
from GramAddict.core.q_nav_graph import QNavGraph
|
||||
from GramAddict.core.session_state import SessionState
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
from tests.e2e.test_sim_full_lifecycle import AndroidEnvironmentSimulator
|
||||
|
||||
# ==============================================================================
|
||||
# Stateful Simulator for Behaviors
|
||||
# ==============================================================================
|
||||
|
||||
|
||||
class BehaviorSimulator(AndroidEnvironmentSimulator):
|
||||
def __init__(self, start_state="user_profile"):
|
||||
super().__init__()
|
||||
self.state_stack = [start_state]
|
||||
self.state_files.update(
|
||||
{
|
||||
"private_profile": "tests/fixtures/user_profile_dump.xml", # We will mock the content dynamically if needed, or use a real private profile xml
|
||||
}
|
||||
)
|
||||
self.actions_taken = []
|
||||
|
||||
def human_click(self, x, y):
|
||||
super().human_click(x, y)
|
||||
self.actions_taken.append(("click", x, y))
|
||||
|
||||
def swipe(self, sx, sy, ex, ey, duration=None):
|
||||
super().swipe(sx, sy, ex, ey, duration)
|
||||
self.actions_taken.append(("swipe", sx, sy, ex, ey))
|
||||
# If we are using a mock_xml, simulate state changes based on coordinates
|
||||
if hasattr(self, "mock_xml") and self.mock_xml:
|
||||
# Simulate Follow button
|
||||
if 100 <= sx <= 400 and 800 <= sy <= 950:
|
||||
self.mock_xml = self.mock_xml.replace('text="Follow"', 'text="Following"')
|
||||
# Simulate Like button
|
||||
elif 50 <= sx <= 150 and 1500 <= sy <= 1600:
|
||||
self.mock_xml = self.mock_xml.replace('content-desc="Like"', 'content-desc="Liked"')
|
||||
|
||||
def dump_hierarchy(self):
|
||||
# Allow dynamic override of the XML for guard tests
|
||||
if hasattr(self, "mock_xml") and self.mock_xml:
|
||||
return self.mock_xml
|
||||
return super().dump_hierarchy()
|
||||
|
||||
|
||||
# ==============================================================================
|
||||
# Fixtures
|
||||
# ==============================================================================
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def setup_qdrant_isolation():
|
||||
"""Prefix all Qdrant collections with test_behaviors_ so we don't pollute live data."""
|
||||
from GramAddict.core.qdrant_memory import QdrantBase
|
||||
|
||||
original_init = QdrantBase.__init__
|
||||
|
||||
def mocked_init(self, collection_name, *args, **kwargs):
|
||||
test_collection = f"test_behaviors_{collection_name}"
|
||||
original_init(self, test_collection, *args, **kwargs)
|
||||
|
||||
with patch.object(QdrantBase, "__init__", new=mocked_init):
|
||||
from qdrant_client import QdrantClient
|
||||
|
||||
try:
|
||||
client = QdrantClient(url="http://localhost:6344", timeout=5.0)
|
||||
collections = client.get_collections().collections
|
||||
for c in collections:
|
||||
if c.name.startswith("test_behaviors_"):
|
||||
client.delete_collection(c.name)
|
||||
except Exception:
|
||||
pass
|
||||
yield
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def real_telepathic_engine(monkeypatch):
|
||||
"""Ensure we use the real LLM."""
|
||||
try:
|
||||
urllib.request.urlopen("http://localhost:11434/", timeout=2)
|
||||
except Exception:
|
||||
pytest.skip("Ollama is not running. Live E2E sim requires LLM backend.")
|
||||
|
||||
engine = TelepathicEngine()
|
||||
monkeypatch.setattr(TelepathicEngine, "get_instance", lambda: engine)
|
||||
return engine
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def base_ctx(real_telepathic_engine):
|
||||
configs = MagicMock()
|
||||
configs.args.follow_percentage = "100"
|
||||
configs.args.likes_percentage = "100"
|
||||
configs.args.ignore_close_friends = True
|
||||
configs.args.scrape_profiles = False
|
||||
|
||||
session_state = MagicMock(spec=SessionState)
|
||||
session_state.my_username = "testbot"
|
||||
session_state.check_limit.return_value = False
|
||||
|
||||
return configs, session_state
|
||||
|
||||
|
||||
# ==============================================================================
|
||||
# E2E Tests for Plugins using REAL LLM & REAL Qdrant
|
||||
# ==============================================================================
|
||||
|
||||
|
||||
def test_e2e_profile_guard_blocks_private(base_ctx):
|
||||
"""
|
||||
Testet, ob das echte LLM ein privates Profil in der XML erkennt
|
||||
und das ProfileGuardPlugin die Ausführung blockiert.
|
||||
"""
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
# We load a real profile XML and inject the private account text
|
||||
with open("tests/fixtures/user_profile_dump.xml", "r") as f:
|
||||
real_xml = f.read()
|
||||
|
||||
# Inject private account text near the bio
|
||||
sim.mock_xml = real_xml.replace(
|
||||
'<node index="1" text="Felix Schreiner / Content Creator"',
|
||||
'<node text="This account is private" resource-id="com.instagram.android:id/row_profile_header_empty_profile_notice_title" bounds="[100,500][980,600]" /><node index="1" text="Felix Schreiner / Content Creator"',
|
||||
)
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={"nav_graph": MagicMock()},
|
||||
context_xml=sim.dump_hierarchy(),
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
)
|
||||
|
||||
plugin = ProfileGuardPlugin()
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.should_skip is True
|
||||
assert result.metadata["reason"] == "private"
|
||||
|
||||
|
||||
def test_e2e_follow_plugin_execution(base_ctx):
|
||||
"""
|
||||
Testet den FollowPlugin, indem das echte LLM (TelepathicEngine)
|
||||
den "Follow" Button in der XML findet und klickt.
|
||||
"""
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
# Load real profile XML
|
||||
with open("tests/fixtures/user_profile_dump.xml", "r") as f:
|
||||
real_xml = f.read()
|
||||
|
||||
# Ensure it has a Follow button (replace Following with Follow if needed)
|
||||
real_xml = real_xml.replace('text="Following"', 'text="Follow"').replace(
|
||||
'content-desc="Following"', 'content-desc="Follow"'
|
||||
)
|
||||
sim.mock_xml = real_xml
|
||||
|
||||
# Override human_click to modify state dynamically
|
||||
def dynamic_click(x, y):
|
||||
sim.actions_taken.append(("click", x, y))
|
||||
# Simulate Follow button
|
||||
if 32 <= x <= 326 and 950 <= y <= 1034:
|
||||
sim.mock_xml = sim.mock_xml.replace(
|
||||
'text="Follow"',
|
||||
'text="Following" padding="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"',
|
||||
).replace(
|
||||
'content-desc="Follow Felix Schreiner / Content Creator"',
|
||||
'content-desc="Following" padding="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"',
|
||||
)
|
||||
|
||||
sim.human_click = dynamic_click
|
||||
|
||||
nav_graph = QNavGraph(sim)
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={"nav_graph": nav_graph},
|
||||
context_xml=sim.dump_hierarchy(),
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
)
|
||||
|
||||
plugin = FollowPlugin()
|
||||
|
||||
# We patch sleep so the test runs fast
|
||||
with patch("GramAddict.core.behaviors.follow.sleep", autospec=True):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
assert result.metadata["followed"] == "target_user"
|
||||
assert len(sim.actions_taken) > 0
|
||||
|
||||
# Verify the LLM clicked within the bounds of the Follow button [32,950][326,1034]
|
||||
action, cx, cy = sim.actions_taken[-1]
|
||||
assert action == "click"
|
||||
assert 32 <= cx <= 326
|
||||
assert 950 <= cy <= 1034
|
||||
|
||||
|
||||
def test_e2e_grid_like_plugin_execution(base_ctx):
|
||||
"""
|
||||
Testet das GridLikePlugin. Das LLM muss einen Post aus dem Grid öffnen,
|
||||
liken und danach prüfen, ob der Like erfolgreich war.
|
||||
"""
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
# Load real organic post XML
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
# Override human_click to modify state dynamically
|
||||
def dynamic_click(x, y):
|
||||
sim.actions_taken.append(("click", x, y))
|
||||
sim.mock_xml = sim.mock_xml.replace(
|
||||
'content-desc="Like"',
|
||||
'content-desc="Liked" padding="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"',
|
||||
)
|
||||
|
||||
sim.human_click = dynamic_click
|
||||
|
||||
nav_graph = QNavGraph(sim)
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={"nav_graph": nav_graph},
|
||||
context_xml=sim.dump_hierarchy(),
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
)
|
||||
|
||||
plugin = GridLikePlugin()
|
||||
|
||||
# We need to patch the open_first_post logic to simulate that it succeeds,
|
||||
# as our XML already represents the opened post.
|
||||
with patch("GramAddict.core.behaviors.grid_like.sleep", autospec=True):
|
||||
original_do = nav_graph.do
|
||||
|
||||
def side_effect_do(action, *args, **kwargs):
|
||||
if "grid" in action.lower():
|
||||
return True
|
||||
return original_do(action, *args, **kwargs)
|
||||
|
||||
with patch.object(nav_graph, "do", autospec=True, side_effect=side_effect_do):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
assert result.metadata["posts_liked"] == 1
|
||||
|
||||
assert len(sim.actions_taken) > 0
|
||||
|
||||
# Check if the click coordinates match the Like button [32,339][95,460]
|
||||
action, cx, cy = sim.actions_taken[-1]
|
||||
assert action == "click"
|
||||
assert 32 <= cx <= 95
|
||||
assert 339 <= cy <= 460
|
||||
|
||||
|
||||
def test_e2e_carousel_plugin_execution(base_ctx):
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
# Needs to see carousel ring indicator to proceed
|
||||
# organic_post.xml already contains carousel_media_group
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={},
|
||||
context_xml=sim.dump_hierarchy(),
|
||||
sleep_mod=0.0,
|
||||
username="fiona.dawson",
|
||||
)
|
||||
|
||||
plugin = CarouselBrowsingPlugin()
|
||||
|
||||
def mock_swipe(device, start_x, end_x, y, duration_ms):
|
||||
sim.actions_taken.append(("swipe", start_x, y, end_x, y))
|
||||
|
||||
with (
|
||||
patch("GramAddict.core.behaviors.carousel_browsing.sleep", autospec=True),
|
||||
patch(
|
||||
"GramAddict.core.behaviors.carousel_browsing.humanized_horizontal_swipe",
|
||||
autospec=True,
|
||||
side_effect=mock_swipe,
|
||||
),
|
||||
):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
|
||||
swipes = [a for a in sim.actions_taken if a[0] == "swipe"]
|
||||
assert len(swipes) > 0
|
||||
|
||||
|
||||
def test_e2e_like_plugin_execution(base_ctx):
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
# Same injection as GridLikePlugin to pass ActionMemory
|
||||
def dynamic_click(x, y):
|
||||
sim.actions_taken.append(("click", x, y))
|
||||
sim.mock_xml = sim.mock_xml.replace(
|
||||
'content-desc="Like"',
|
||||
'content-desc="Liked" padding="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"',
|
||||
)
|
||||
|
||||
sim.human_click = dynamic_click
|
||||
|
||||
nav_graph = QNavGraph(sim)
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={"nav_graph": nav_graph},
|
||||
context_xml=sim.dump_hierarchy(),
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
)
|
||||
|
||||
plugin = LikePlugin()
|
||||
|
||||
with patch("GramAddict.core.behaviors.like.random.random", autospec=True, return_value=0.0):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
|
||||
# Check if the click coordinates match the Like button [32,339][95,460]
|
||||
clicks = [a for a in sim.actions_taken if a[0] == "click"]
|
||||
action, cx, cy = clicks[-1]
|
||||
assert 32 <= cx <= 95
|
||||
assert 339 <= cy <= 460
|
||||
|
||||
|
||||
def test_e2e_story_view_plugin_execution(base_ctx):
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
with open("tests/fixtures/user_profile_dump.xml", "r") as f:
|
||||
sim.mock_xml = f.read().replace(
|
||||
'content-desc="felixschreiner_\'s story, 0 of 0, Seen."',
|
||||
'content-desc="story ring avatar" reel_ring="true"',
|
||||
)
|
||||
|
||||
def dynamic_click(x, y):
|
||||
sim.actions_taken.append(("click", x, y))
|
||||
sim.mock_xml = sim.mock_xml.replace(
|
||||
'content-desc="story ring avatar"',
|
||||
'content-desc="story ring avatar clicked" padding="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"',
|
||||
)
|
||||
|
||||
sim.human_click = dynamic_click
|
||||
|
||||
nav_graph = QNavGraph(sim)
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={"nav_graph": nav_graph},
|
||||
context_xml=sim.dump_hierarchy(),
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
)
|
||||
|
||||
plugin = StoryViewPlugin()
|
||||
|
||||
with (
|
||||
patch("GramAddict.core.behaviors.story_view.sleep", autospec=True),
|
||||
patch("GramAddict.core.behaviors.story_view.wait_for_story_loaded", autospec=True, return_value=True),
|
||||
):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
assert result.metadata["stories_viewed"] >= 1
|
||||
|
||||
|
||||
def test_e2e_comment_plugin_execution(base_ctx):
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
nav_graph = QNavGraph(sim)
|
||||
|
||||
mock_writer = MagicMock()
|
||||
mock_writer.generate_comment.return_value = "Great post!"
|
||||
|
||||
def dynamic_click(x, y):
|
||||
sim.actions_taken.append(("click", x, y))
|
||||
# If trying to open comments, change UI state to comment screen
|
||||
if "Comment" in sim.mock_xml:
|
||||
sim.mock_xml = sim.mock_xml.replace(
|
||||
'content-desc="Comment"',
|
||||
'content-desc="Comments Screen" padding="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"',
|
||||
)
|
||||
# If trying to post comment, change UI state to comment posted
|
||||
elif "Comments Screen" in sim.mock_xml:
|
||||
sim.mock_xml = sim.mock_xml.replace(
|
||||
'content-desc="Comments Screen"',
|
||||
'content-desc="Comment Posted" padding="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"',
|
||||
)
|
||||
|
||||
sim.human_click = dynamic_click
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={"nav_graph": nav_graph, "writer": mock_writer},
|
||||
context_xml=sim.dump_hierarchy(),
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
post_data={"caption": "Test"},
|
||||
)
|
||||
|
||||
plugin = CommentPlugin()
|
||||
|
||||
with patch("GramAddict.core.behaviors.comment.random.random", autospec=True, return_value=0.0):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
assert result.metadata["text"] == "Great post!"
|
||||
|
||||
|
||||
# ==============================================================================
|
||||
# E2E Tests for ObstacleGuard — Real SAE integration
|
||||
# ==============================================================================
|
||||
|
||||
|
||||
def test_e2e_obstacle_guard_unlearn_on_fatal(base_ctx):
|
||||
"""
|
||||
Reproduces the production crash: obstacle_guard calls sae.unlearn_current_state()
|
||||
without the required xml_dump argument.
|
||||
|
||||
This test uses the REAL SituationalAwarenessEngine (not MagicMock) so that
|
||||
a signature mismatch causes an immediate TypeError — exactly as in production.
|
||||
"""
|
||||
from GramAddict.core.behaviors.obstacle_guard import ObstacleGuardPlugin
|
||||
from GramAddict.core.situational_awareness import SituationalAwarenessEngine, SituationType
|
||||
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
# Load the survey modal XML — this is a real OBSTACLE_MODAL
|
||||
with open("tests/fixtures/survey_modal.xml", "r") as f:
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
session_state.job_target = "Feed"
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={},
|
||||
context_xml=sim.mock_xml,
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
)
|
||||
ctx.shared_state["consecutive_marker_misses"] = 2 # Trigger the fatal path
|
||||
|
||||
plugin = ObstacleGuardPlugin()
|
||||
|
||||
# We use the REAL SAE instance, but mock perceive to return OBSTACLE_MODAL
|
||||
# and mock the ScreenMemoryDB to avoid Qdrant dependency.
|
||||
# The key: unlearn_current_state is NOT mocked — it must accept xml_dump.
|
||||
real_sae = create_autospec(SituationalAwarenessEngine, instance=True)
|
||||
real_sae.perceive.return_value = SituationType.OBSTACLE_MODAL
|
||||
|
||||
with (
|
||||
patch(
|
||||
"GramAddict.core.behaviors.obstacle_guard.SituationalAwarenessEngine.get_instance",
|
||||
autospec=True,
|
||||
return_value=real_sae,
|
||||
),
|
||||
patch("GramAddict.core.behaviors.obstacle_guard.dump_ui_state", autospec=True),
|
||||
patch("GramAddict.core.behaviors.obstacle_guard.sleep", autospec=True),
|
||||
):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
assert result.metadata.get("return_code") == "CONTEXT_LOST"
|
||||
# The critical assertion: unlearn_current_state MUST be called with xml_dump
|
||||
real_sae.unlearn_current_state.assert_called_once()
|
||||
call_args = real_sae.unlearn_current_state.call_args
|
||||
assert (
|
||||
call_args[0][0] == sim.mock_xml
|
||||
), "unlearn_current_state must receive the XML dump as first positional argument"
|
||||
|
||||
|
||||
def test_e2e_obstacle_guard_dismiss_modal(base_ctx):
|
||||
"""
|
||||
Tests that the ObstacleGuard correctly dismisses a survey modal
|
||||
and resets the marker miss counter.
|
||||
"""
|
||||
from GramAddict.core.behaviors.obstacle_guard import ObstacleGuardPlugin
|
||||
from GramAddict.core.situational_awareness import SituationType
|
||||
|
||||
configs, session_state = base_ctx
|
||||
sim = BehaviorSimulator()
|
||||
|
||||
# Start with survey modal, after back press return to feed
|
||||
with open("tests/fixtures/survey_modal.xml", "r") as f:
|
||||
survey_xml = f.read()
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
feed_xml = f.read()
|
||||
|
||||
sim.mock_xml = survey_xml
|
||||
|
||||
# After back press, switch to feed XML
|
||||
original_press = sim.press
|
||||
|
||||
def mock_press(key):
|
||||
if key == "back":
|
||||
sim.mock_xml = feed_xml
|
||||
original_press(key)
|
||||
|
||||
sim.press = mock_press
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={},
|
||||
context_xml=sim.mock_xml,
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
)
|
||||
ctx.shared_state["consecutive_marker_misses"] = 0
|
||||
|
||||
plugin = ObstacleGuardPlugin()
|
||||
|
||||
with (
|
||||
patch(
|
||||
"GramAddict.core.behaviors.obstacle_guard.SituationalAwarenessEngine.get_instance",
|
||||
autospec=True,
|
||||
) as mock_sae,
|
||||
patch("GramAddict.core.behaviors.obstacle_guard.sleep", autospec=True),
|
||||
):
|
||||
mock_instance = MagicMock()
|
||||
mock_instance.perceive.return_value = SituationType.OBSTACLE_MODAL
|
||||
mock_sae.return_value = mock_instance
|
||||
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
# After recovery, consecutive_marker_misses should reset (feed has markers)
|
||||
assert ctx.shared_state["consecutive_marker_misses"] == 0
|
||||
|
||||
|
||||
# ==============================================================================
|
||||
# E2E Tests for ResonanceEvaluator — Real TelepathicEngine integration
|
||||
# ==============================================================================
|
||||
|
||||
|
||||
def test_e2e_resonance_evaluator_visual_vibe_check(base_ctx):
|
||||
"""
|
||||
Reproduces the production crash: resonance_evaluator calls
|
||||
tele.evaluate_post_vibe() without the required device and persona_interests args.
|
||||
|
||||
Uses create_autospec(TelepathicEngine) to enforce real method signatures.
|
||||
"""
|
||||
from GramAddict.core.behaviors.resonance_evaluator import ResonanceEvaluatorPlugin
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
configs, session_state = base_ctx
|
||||
configs.args.visual_vibe_check_percentage = 100
|
||||
configs.args.interact_percentage = 100
|
||||
configs.args.persona_interests = ["travel", "photography"]
|
||||
|
||||
sim = BehaviorSimulator()
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
# Create an autospec'd TelepathicEngine — enforces real signatures
|
||||
mock_tele = create_autospec(TelepathicEngine, instance=True)
|
||||
mock_tele.evaluate_post_vibe.return_value = {
|
||||
"quality_score": 8,
|
||||
"matches_niche": True,
|
||||
}
|
||||
|
||||
mock_resonance = MagicMock()
|
||||
mock_resonance.calculate_resonance.return_value = 0.6
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={
|
||||
"telepathic": mock_tele,
|
||||
"resonance": mock_resonance,
|
||||
"dopamine": MagicMock(),
|
||||
},
|
||||
context_xml=sim.mock_xml,
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
post_data={"caption": "Beautiful sunset"},
|
||||
)
|
||||
|
||||
plugin = ResonanceEvaluatorPlugin()
|
||||
|
||||
with patch("GramAddict.core.behaviors.resonance_evaluator.random.random", autospec=True, return_value=0.0):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
assert result.should_skip is False
|
||||
|
||||
# The critical assertion: evaluate_post_vibe MUST be called with device + persona_interests
|
||||
mock_tele.evaluate_post_vibe.assert_called_once_with(sim, ["travel", "photography"])
|
||||
|
||||
# Verify the vibe score was integrated into the resonance score
|
||||
res_score = ctx.shared_state["res_score"]
|
||||
assert res_score > 0.5, f"Expected resonance score > 0.5 with high vibe, got {res_score}"
|
||||
|
||||
|
||||
def test_e2e_resonance_evaluator_no_persona_interests(base_ctx):
|
||||
"""
|
||||
Ensures ResonanceEvaluator gracefully handles missing persona_interests
|
||||
by defaulting to an empty list.
|
||||
"""
|
||||
from GramAddict.core.behaviors.resonance_evaluator import ResonanceEvaluatorPlugin
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
configs, session_state = base_ctx
|
||||
configs.args.visual_vibe_check_percentage = 100
|
||||
configs.args.interact_percentage = 100
|
||||
# Explicitly remove persona_interests to test the getattr default
|
||||
del configs.args.persona_interests
|
||||
|
||||
sim = BehaviorSimulator()
|
||||
with open("tests/fixtures/organic_post.xml", "r") as f:
|
||||
sim.mock_xml = f.read()
|
||||
|
||||
mock_tele = create_autospec(TelepathicEngine, instance=True)
|
||||
mock_tele.evaluate_post_vibe.return_value = {
|
||||
"quality_score": 5,
|
||||
"matches_niche": False,
|
||||
}
|
||||
|
||||
mock_resonance = MagicMock()
|
||||
mock_resonance.calculate_resonance.return_value = 0.5
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=sim,
|
||||
configs=configs,
|
||||
session_state=session_state,
|
||||
cognitive_stack={
|
||||
"telepathic": mock_tele,
|
||||
"resonance": mock_resonance,
|
||||
"dopamine": MagicMock(),
|
||||
},
|
||||
context_xml=sim.mock_xml,
|
||||
sleep_mod=0.0,
|
||||
username="target_user",
|
||||
post_data={"caption": "Test"},
|
||||
)
|
||||
|
||||
plugin = ResonanceEvaluatorPlugin()
|
||||
|
||||
with patch("GramAddict.core.behaviors.resonance_evaluator.random.random", autospec=True, return_value=0.0):
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is True
|
||||
# Verify that evaluate_post_vibe was called with empty list as default
|
||||
mock_tele.evaluate_post_vibe.assert_called_once_with(sim, [])
|
||||
@@ -1,114 +1,355 @@
|
||||
from unittest.mock import MagicMock, patch
|
||||
"""
|
||||
🔴 RED Phase — DM Engine Integrity Tests
|
||||
==========================================
|
||||
|
||||
import pytest
|
||||
These tests expose 4 critical production bugs discovered in run 0f1475ff:
|
||||
1. DM Engine ignores `dm_reply.enabled: false` — fires DMs anyway
|
||||
2. DM Engine logs "Successfully sent" without verifying actual send
|
||||
3. DM Engine generates replies with "No previous context" → garbage output
|
||||
4. DM Engine lacks max-iteration guard → sent 8 DMs in 2 minutes
|
||||
|
||||
from GramAddict.core.dm_engine import _run_zero_latency_dm_loop
|
||||
from GramAddict.core.session_state import SessionState
|
||||
Each test MUST fail before any production code is touched (TDD RED).
|
||||
"""
|
||||
|
||||
import types
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Helpers — Minimal realistic mocks (no lying)
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_device():
|
||||
device = MagicMock()
|
||||
# Initial inbox state
|
||||
device.dump_hierarchy.return_value = "<xml><node text='Inbox'/></xml>"
|
||||
return device
|
||||
def _make_dm_inbox_xml():
|
||||
"""Real-world DM inbox XML with unread thread markers."""
|
||||
return """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<hierarchy>
|
||||
<node resource-id="com.instagram.android:id/direct_inbox_action_bar" />
|
||||
<node resource-id="com.instagram.android:id/inbox_refreshable_thread_list_recyclerview">
|
||||
<node text="johndoe" content-desc="Unread. johndoe" />
|
||||
<node text="janedoe" content-desc="janedoe" />
|
||||
</node>
|
||||
</hierarchy>"""
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_cognitive_stack():
|
||||
telepathic = MagicMock()
|
||||
dopamine = MagicMock()
|
||||
dopamine.is_app_session_over.return_value = False
|
||||
dopamine.wants_to_change_feed.side_effect = [False, True]
|
||||
dopamine.boredom = 0
|
||||
|
||||
dm_memory = MagicMock()
|
||||
|
||||
resonance = MagicMock()
|
||||
resonance.persona_prompt = "You are a friendly bot."
|
||||
resonance.args.ai_model = "test-model"
|
||||
|
||||
return {"telepathic": telepathic, "dopamine": dopamine, "dm_memory": dm_memory, "resonance": resonance}
|
||||
def _make_dm_thread_xml(last_message="Hey what's up?"):
|
||||
"""Real-world DM thread XML with message content."""
|
||||
return f"""<?xml version="1.0" encoding="UTF-8"?>
|
||||
<hierarchy>
|
||||
<node resource-id="com.instagram.android:id/direct_thread_header">
|
||||
<node text="johndoe" />
|
||||
</node>
|
||||
<node resource-id="com.instagram.android:id/row_thread_composer_edittext"
|
||||
text="Message…" />
|
||||
<node text="{last_message}"
|
||||
resource-id="com.instagram.android:id/message_text" />
|
||||
<node resource-id="com.instagram.android:id/row_thread_composer_send_button"
|
||||
content-desc="Send" />
|
||||
</hierarchy>"""
|
||||
|
||||
|
||||
def test_e2e_dm_full_flow_success(mock_device, mock_cognitive_stack):
|
||||
"""
|
||||
E2E scenario:
|
||||
1. Found 1 unread message.
|
||||
2. Opened chat.
|
||||
3. Read context.
|
||||
4. Generated response.
|
||||
5. Sent message.
|
||||
6. Guarded back-navigation (keyboard closed + activity exit).
|
||||
"""
|
||||
telepathic = mock_cognitive_stack["telepathic"]
|
||||
def _make_dm_thread_xml_no_context():
|
||||
"""DM thread XML with a story reply — NO extractable text message."""
|
||||
return """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<hierarchy>
|
||||
<node resource-id="com.instagram.android:id/direct_thread_header">
|
||||
<node text="story_user" />
|
||||
</node>
|
||||
<node resource-id="com.instagram.android:id/row_thread_composer_edittext"
|
||||
text="Message…" />
|
||||
<node resource-id="com.instagram.android:id/story_reply_media_container"
|
||||
content-desc="Replied to their story" />
|
||||
<node resource-id="com.instagram.android:id/row_thread_composer_send_button"
|
||||
content-desc="Send" />
|
||||
</hierarchy>"""
|
||||
|
||||
hierarchy_items = [
|
||||
"<xml>Inbox with unread</xml>", # Loop 1 start
|
||||
"<xml>Thread view</xml>", # Context read
|
||||
"<xml>Thread view</xml>", # Input field find
|
||||
"<xml>Thread view</xml>", # Send button find
|
||||
"<xml><node resource-id='com.instagram.android:id/direct_thread_header'/></xml>", # Navigation check AFTER back
|
||||
"<xml>Inbox View</xml>", # Loop 2 start (exit)
|
||||
"<xml>Inbox View</xml>", # Buffer
|
||||
]
|
||||
hierarchy_iterator = iter(hierarchy_items)
|
||||
mock_device.dump_hierarchy.side_effect = lambda: next(hierarchy_iterator)
|
||||
|
||||
# Semantic node responses
|
||||
telepathic._extract_semantic_nodes.side_effect = [
|
||||
[{"x": 100, "y": 100, "text": "New Message"}], # unread_threads
|
||||
[{"text": "Hello there!"}], # msg_nodes (context)
|
||||
[{"x": 200, "y": 200}], # input_nodes
|
||||
[{"x": 300, "y": 300}], # send_nodes
|
||||
[], # Loop 2: no unread
|
||||
[], # Buffer
|
||||
]
|
||||
def _make_configs(dm_reply_enabled=False):
|
||||
"""Create a realistic Config mock using the real Config class."""
|
||||
from GramAddict.core.config import Config
|
||||
|
||||
mock_cognitive_stack["dopamine"].boredom = 0
|
||||
mock_cognitive_stack["dopamine"].wants_to_change_feed.side_effect = [False, True, True]
|
||||
configs = Config(first_run=True)
|
||||
configs.args = types.SimpleNamespace(
|
||||
disable_ai_messaging=False,
|
||||
ai_condenser_model="qwen3.5:latest",
|
||||
ai_condenser_url="http://localhost:11434/api/generate",
|
||||
)
|
||||
configs.config = {"plugins": {"dm_reply": {"enabled": dm_reply_enabled}}}
|
||||
return configs
|
||||
|
||||
session_state = MagicMock(spec=SessionState)
|
||||
session_state.check_limit.return_value = False
|
||||
session_state.totalMessages = 0
|
||||
|
||||
mock_configs = MagicMock()
|
||||
mock_configs.args.disable_ai_messaging = False
|
||||
mock_configs.args.ai_condenser_model = "test-model"
|
||||
mock_configs.args.ai_condenser_url = "http://localhost:11434/api/generate"
|
||||
def _make_session_state(configs):
|
||||
from GramAddict.core.session_state import SessionState
|
||||
|
||||
with (
|
||||
patch("GramAddict.core.llm_provider.query_llm", return_value={"response": "Hi! How can I help?"}),
|
||||
patch("GramAddict.core.bot_flow._humanized_click"),
|
||||
patch("GramAddict.core.bot_flow.sleep"),
|
||||
patch("GramAddict.core.stealth_typing.ghost_type"),
|
||||
):
|
||||
result = _run_zero_latency_dm_loop(
|
||||
mock_device, MagicMock(), MagicMock(), mock_configs, session_state, "target", mock_cognitive_stack
|
||||
session = SessionState(configs)
|
||||
session.set_limits_session()
|
||||
return session
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Test 1: DM Engine MUST respect dm_reply.enabled config
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestDMConfigGating:
|
||||
"""Verifies that dm_reply.enabled=false prevents ALL DM interactions."""
|
||||
|
||||
def test_dm_engine_blocks_when_dm_reply_disabled(self, make_real_device_with_xml):
|
||||
"""BUG: dm_engine.py:96 checks 'disable_ai_messaging' (doesn't exist)
|
||||
instead of dm_reply.enabled from config. This means DMs fire even when
|
||||
config says enabled: false.
|
||||
|
||||
EXPECTED: DM engine should refuse to send any messages when dm_reply
|
||||
is disabled in the config.
|
||||
"""
|
||||
from GramAddict.core.dm_engine import _run_zero_latency_dm_loop
|
||||
from GramAddict.core.dopamine_engine import DopamineEngine
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
device = make_real_device_with_xml(_make_dm_inbox_xml())
|
||||
|
||||
# Real Config
|
||||
configs = _make_configs(dm_reply_enabled=False)
|
||||
|
||||
session_state = _make_session_state(configs)
|
||||
|
||||
dopamine = DopamineEngine()
|
||||
dopamine.boredom = 0.0
|
||||
telepathic = TelepathicEngine.get_instance()
|
||||
|
||||
cognitive_stack = {"telepathic": telepathic, "dopamine": dopamine, "dm_memory": None}
|
||||
|
||||
# No patches, 100% real engine
|
||||
_run_zero_latency_dm_loop(
|
||||
device,
|
||||
make_real_device_with_xml(_make_dm_inbox_xml()),
|
||||
None,
|
||||
configs,
|
||||
session_state,
|
||||
"MessageInbox",
|
||||
cognitive_stack,
|
||||
)
|
||||
|
||||
assert result == "BOREDOM_CHANGE_FEED"
|
||||
# Ensure navigation at least attempted to exit
|
||||
assert mock_device.press.call_count >= 2
|
||||
mock_device.press.assert_called_with("back")
|
||||
# No messages should be counted
|
||||
assert (
|
||||
getattr(session_state, "totalMessages", 0) == 0
|
||||
), f"DM Engine sent {getattr(session_state, 'totalMessages', 0)} messages with dm_reply DISABLED!"
|
||||
|
||||
|
||||
def test_e2e_dm_no_messages(mock_device, mock_cognitive_stack):
|
||||
"""
|
||||
E2E scenario: No messages found, exit immediately.
|
||||
"""
|
||||
telepathic = mock_cognitive_stack["telepathic"]
|
||||
mock_cognitive_stack["dopamine"].wants_to_change_feed.return_value = True
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Test 2: DM Engine MUST verify send actually happened
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
telepathic._extract_semantic_nodes.return_value = [] # No unreads
|
||||
|
||||
session_state = MagicMock(spec=SessionState)
|
||||
session_state.check_limit.return_value = False
|
||||
class TestDMSendVerification:
|
||||
"""Verifies that 'Successfully sent' is only logged when the message was actually sent."""
|
||||
|
||||
result = _run_zero_latency_dm_loop(
|
||||
mock_device, MagicMock(), MagicMock(), MagicMock(), session_state, "target", mock_cognitive_stack
|
||||
)
|
||||
def test_dm_engine_rejects_click_on_wrong_element(self, make_real_device_with_xml):
|
||||
"""BUG: dm_engine.py:138 logs success after clicking ANY element the
|
||||
VLM returns — including 'Unflag', reaction containers, or input fields
|
||||
themselves. There is ZERO structural verification.
|
||||
|
||||
assert result == "BOREDOM_CHANGE_FEED"
|
||||
# Should only press back once to exit Inbox
|
||||
assert mock_device.press.call_count == 1
|
||||
EXPECTED: DM engine must verify the clicked element is actually
|
||||
a "Send" button (desc='Send' or id contains 'send_button').
|
||||
"""
|
||||
from GramAddict.core.dm_engine import _run_zero_latency_dm_loop
|
||||
from GramAddict.core.dopamine_engine import DopamineEngine
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
# XML where the send button is missing, but a reaction container is present.
|
||||
# This tests if the real VLM hallucinates the reaction container, the structural guard catches it.
|
||||
# If the real VLM correctly returns None, the structural guard also handles it.
|
||||
thread_xml_no_send = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<hierarchy>
|
||||
<node resource-id="com.instagram.android:id/direct_thread_header">
|
||||
<node text="johndoe" bounds="[0,0][100,50]" />
|
||||
</node>
|
||||
<node resource-id="com.instagram.android:id/row_thread_composer_edittext"
|
||||
text="Message…" bounds="[0,900][500,1000]" />
|
||||
<node text="Hey what's up?"
|
||||
resource-id="com.instagram.android:id/message_text" bounds="[0,600][500,700]" />
|
||||
<node resource-id="com.instagram.android:id/message_reactions_pill_container"
|
||||
bounds="[500,600][600,700]" />
|
||||
</hierarchy>"""
|
||||
|
||||
inbox_xml = _make_dm_inbox_xml()
|
||||
device = make_real_device_with_xml(
|
||||
[
|
||||
inbox_xml, # 1. inbox: find unread
|
||||
thread_xml_no_send, # 2. thread: read messages
|
||||
thread_xml_no_send, # 3. after typing: re-dump for send button
|
||||
thread_xml_no_send, # 4. check_xml after pressing back
|
||||
inbox_xml, # 5. inbox again on re-loop
|
||||
inbox_xml,
|
||||
inbox_xml,
|
||||
inbox_xml,
|
||||
]
|
||||
)
|
||||
|
||||
# Real Config
|
||||
configs = _make_configs(dm_reply_enabled=True)
|
||||
|
||||
session_state = _make_session_state(configs)
|
||||
|
||||
dopamine = DopamineEngine()
|
||||
dopamine.boredom = 0.0
|
||||
|
||||
telepathic = TelepathicEngine.get_instance()
|
||||
|
||||
cognitive_stack = {"telepathic": telepathic, "dopamine": dopamine, "dm_memory": None}
|
||||
|
||||
_run_zero_latency_dm_loop(
|
||||
device,
|
||||
make_real_device_with_xml(_make_dm_inbox_xml()),
|
||||
None,
|
||||
configs,
|
||||
session_state,
|
||||
"MessageInbox",
|
||||
cognitive_stack,
|
||||
)
|
||||
|
||||
# Should NOT count as a successful message
|
||||
assert session_state.totalMessages == 0, (
|
||||
f"DM Engine counted {session_state.totalMessages} messages after clicking "
|
||||
f"a wrong element instead of the Send button!"
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Test 3: DM Engine MUST NOT reply to context-less threads
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestDMContextRequirement:
|
||||
"""Verifies that the DM engine refuses to generate replies without context."""
|
||||
|
||||
def test_dm_engine_skips_thread_with_no_extractable_message(self, make_real_device_with_xml):
|
||||
"""BUG: dm_engine.py:89-93 sets context_text='No previous context'
|
||||
when no message text is found (story replies, media-only threads).
|
||||
Then proceeds to call the LLM with that string, producing garbage
|
||||
like 'the to the'.
|
||||
|
||||
Evidence from logs:
|
||||
7 out of 8 threads had 'Last received message context: No previous context'
|
||||
All 7 were blindly replied to anyway.
|
||||
|
||||
EXPECTED: When context_text is 'No previous context' or empty,
|
||||
the DM engine must SKIP the thread entirely (press back, continue).
|
||||
"""
|
||||
from GramAddict.core.dm_engine import _run_zero_latency_dm_loop
|
||||
|
||||
inbox_xml = _make_dm_inbox_xml()
|
||||
device = make_real_device_with_xml(
|
||||
[
|
||||
inbox_xml, # 1. inbox: find unread
|
||||
_make_dm_thread_xml_no_context(), # 2. thread: read messages (no text)
|
||||
inbox_xml, # 3. inbox again (check is_inbox)
|
||||
inbox_xml,
|
||||
]
|
||||
)
|
||||
|
||||
from GramAddict.core.dopamine_engine import DopamineEngine
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
configs = _make_configs(dm_reply_enabled=True)
|
||||
|
||||
session_state = _make_session_state(configs)
|
||||
|
||||
dopamine = DopamineEngine()
|
||||
dopamine.boredom = 0.0
|
||||
|
||||
telepathic = TelepathicEngine.get_instance()
|
||||
|
||||
cognitive_stack = {"telepathic": telepathic, "dopamine": dopamine, "dm_memory": None}
|
||||
|
||||
_run_zero_latency_dm_loop(
|
||||
device,
|
||||
make_real_device_with_xml(_make_dm_inbox_xml()),
|
||||
None,
|
||||
configs,
|
||||
session_state,
|
||||
"MessageInbox",
|
||||
cognitive_stack,
|
||||
)
|
||||
|
||||
assert (
|
||||
session_state.totalMessages == 0
|
||||
), f"DM Engine replied to {session_state.totalMessages} threads with NO message context!"
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Test 4: DM Engine MUST have max-iteration guard
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestDMIterationLimit:
|
||||
"""Verifies the DM engine doesn't spam infinite replies."""
|
||||
|
||||
def test_dm_engine_caps_replies_per_session(self, make_real_device_with_xml):
|
||||
"""BUG: dm_engine.py:34 while loop only exits on session timeout or
|
||||
boredom. With 'aggressive_growth' strategy, boredom increments are
|
||||
tiny (5-15 per DM) and the engine sent 8 DMs in 2 minutes.
|
||||
|
||||
EXPECTED: DM engine must have an explicit max_replies_per_inbox
|
||||
cap (e.g., 3) to prevent spam behavior. After reaching the cap,
|
||||
it should return 'BOREDOM_CHANGE_FEED'.
|
||||
"""
|
||||
from GramAddict.core.dm_engine import _run_zero_latency_dm_loop
|
||||
|
||||
device = make_real_device_with_xml(_make_dm_inbox_xml())
|
||||
|
||||
from GramAddict.core.dopamine_engine import DopamineEngine
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
configs = _make_configs(dm_reply_enabled=True)
|
||||
|
||||
session_state = _make_session_state(configs)
|
||||
|
||||
dopamine = DopamineEngine()
|
||||
dopamine.boredom = 0.0
|
||||
|
||||
telepathic = TelepathicEngine.get_instance()
|
||||
cognitive_stack = {"telepathic": telepathic, "dopamine": dopamine, "dm_memory": None}
|
||||
|
||||
# Override session_state methods that are used in loop directly instead of MagicMock
|
||||
configs.args.current_success_limit = 8
|
||||
configs.args.current_pm_limit = 8
|
||||
|
||||
session_state.totalMessages = 0
|
||||
|
||||
# Force the session to never hit limits (simulating the real scenario)
|
||||
_run_zero_latency_dm_loop(
|
||||
device,
|
||||
make_real_device_with_xml(_make_dm_inbox_xml()),
|
||||
None,
|
||||
configs,
|
||||
session_state,
|
||||
"MessageInbox",
|
||||
cognitive_stack,
|
||||
)
|
||||
|
||||
# The engine should have self-limited to at most 5 replies
|
||||
assert session_state.totalMessages <= 5, (
|
||||
f"DM Engine sent {session_state.totalMessages} messages in one inbox visit. "
|
||||
f"Expected hard cap of <= 5 to prevent spam."
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# Test 5: DM Engine config gating uses the REAL production path
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestDMConfigGatingProduction:
|
||||
"""Verifies the REAL dm_engine._run_zero_latency_dm_loop config check,
|
||||
not a local re-implementation of bot_flow.py logic."""
|
||||
|
||||
def test_dm_engine_config_gating_reads_real_plugin_config(self):
|
||||
"""The dm_engine kill-switch at line 46-50 reads configs.get_plugin_config('dm_reply').
|
||||
We verify this path with the real Config class — NOT a local dict simulation."""
|
||||
configs_disabled = _make_configs(dm_reply_enabled=False)
|
||||
configs_enabled = _make_configs(dm_reply_enabled=True)
|
||||
|
||||
dm_config_off = configs_disabled.get_plugin_config("dm_reply")
|
||||
dm_config_on = configs_enabled.get_plugin_config("dm_reply")
|
||||
|
||||
assert dm_config_off.get("enabled", False) is False, "Config should report dm_reply as disabled"
|
||||
assert dm_config_on.get("enabled", False) is True, "Config should report dm_reply as enabled"
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
"""
|
||||
Real LLM + Qdrant Integration Test
|
||||
Tests the extreme learning behavior of the autonomous engine by hitting
|
||||
the real local Ollama instance and storing/retrieving from local Qdrant.
|
||||
|
||||
Requirements:
|
||||
- Ollama must be running on localhost:11434
|
||||
- llama3.2-vision must be available locally
|
||||
- Qdrant must be running locally
|
||||
"""
|
||||
|
||||
import time
|
||||
import uuid
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.device_facade import DeviceFacade
|
||||
from GramAddict.core.situational_awareness import SituationalAwarenessEngine, SituationType
|
||||
|
||||
|
||||
def make_mock_device(app_id="com.instagram.android"):
|
||||
device = MagicMock(spec=DeviceFacade)
|
||||
device.app_id = app_id
|
||||
device.deviceV2 = MagicMock()
|
||||
device.dump_hierarchy = MagicMock()
|
||||
device.click = MagicMock()
|
||||
device.press = MagicMock()
|
||||
device.app_start = MagicMock()
|
||||
device._trace_counter = 0
|
||||
device._trace_dir = "/tmp/test_traces"
|
||||
return device
|
||||
|
||||
|
||||
# ─────────────────────────────────────────────────────
|
||||
# Tests
|
||||
# ─────────────────────────────────────────────────────
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_real_llm_learning_and_unlearning(isolated_screen_memory):
|
||||
"""
|
||||
Testet das echte Lernverhalten:
|
||||
1. Pass: Unbekanntes XML -> LLM wird angefragt -> Speichert in Qdrant
|
||||
2. Pass: Gleiches XML -> LLM wird NICHT angefragt -> Holt aus Qdrant
|
||||
3. Pass (Unlearn): Wir löschen den State (Simulation Fehler) -> Gleiches XML -> LLM wird wieder angefragt
|
||||
"""
|
||||
|
||||
# Check if Qdrant is connected. If not, we skip the test gracefully.
|
||||
if not isolated_screen_memory.is_connected:
|
||||
pytest.skip("Qdrant is not running locally. Skipping live integration test.")
|
||||
|
||||
# Generate completely unique XML so it's guaranteed NOT in any cache
|
||||
random_id = f"com.instagram.android:id/chaos_{uuid.uuid4().hex[:8]}"
|
||||
random_text = f"REAL_LLM_TEST_{uuid.uuid4().hex[:8]}"
|
||||
|
||||
# A simple modal to trigger perception
|
||||
chaos_xml = f"""<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" clickable="false" bounds="[0,0][1080,2400]">
|
||||
<node text="" resource-id="{random_id}" class="android.widget.FrameLayout" package="com.instagram.android" clickable="false" bounds="[0,500][1080,2200]">
|
||||
<node text="{random_text}" resource-id="" class="android.widget.TextView" package="com.instagram.android" clickable="false" bounds="[100,600][980,700]" />
|
||||
<node text="Dismiss" resource-id="" class="android.widget.Button" package="com.instagram.android" clickable="true" bounds="[100,2000][540,2100]" />
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>"""
|
||||
|
||||
device = make_mock_device()
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
|
||||
# We patch the underlying LLM call just to spy on it (wraps the original function)
|
||||
from GramAddict.core.llm_provider import query_telepathic_llm
|
||||
|
||||
with patch(
|
||||
"GramAddict.core.llm_provider.query_telepathic_llm", autospec=True, wraps=query_telepathic_llm
|
||||
) as spy_llm:
|
||||
# ---------------------------------------------------------
|
||||
# PASS 1: The Initial Encounter (Learn)
|
||||
# ---------------------------------------------------------
|
||||
print(f"\n--- PASS 1: Querying real LLM for '{random_text}' ---")
|
||||
start_time = time.time()
|
||||
|
||||
# This will block and hit the real local Ollama
|
||||
result_pass1 = sae.perceive(chaos_xml)
|
||||
|
||||
duration = time.time() - start_time
|
||||
print(f"Pass 1 completed in {duration:.2f}s. Result: {result_pass1}")
|
||||
|
||||
# Assertions
|
||||
assert spy_llm.call_count == 1, "LLM was not called on unknown XML!"
|
||||
assert result_pass1 in [
|
||||
SituationType.OBSTACLE_MODAL,
|
||||
SituationType.NORMAL,
|
||||
SituationType.OBSTACLE_FOREIGN_APP,
|
||||
], "Invalid LLM perception result"
|
||||
|
||||
spy_llm.reset_mock()
|
||||
|
||||
# Give Qdrant a split second to index the new point
|
||||
time.sleep(0.5)
|
||||
|
||||
# ---------------------------------------------------------
|
||||
# PASS 2: The Recall (Cache Hit)
|
||||
# ---------------------------------------------------------
|
||||
print("\\n--- PASS 2: Recalling from Qdrant ---")
|
||||
start_time = time.time()
|
||||
|
||||
result_pass2 = sae.perceive(chaos_xml)
|
||||
|
||||
duration = time.time() - start_time
|
||||
print(f"Pass 2 completed in {duration:.2f}s. Result: {result_pass2}")
|
||||
|
||||
# Assertions
|
||||
assert spy_llm.call_count == 0, "LLM was called again despite being in Qdrant!"
|
||||
assert result_pass2 == result_pass1, "Qdrant cache returned a different result than the initial LLM call!"
|
||||
assert duration < 1.0, f"Qdrant retrieval took too long ({duration:.2f}s). Should be sub-second."
|
||||
|
||||
# ---------------------------------------------------------
|
||||
# PASS 3: The Unlearn (Mistake Recovery)
|
||||
# ---------------------------------------------------------
|
||||
print("\\n--- PASS 3: Unlearning and verifying re-query ---")
|
||||
|
||||
# We simulate that the bot decided this classification was wrong and unlearns it
|
||||
sae.unlearn_current_state(chaos_xml)
|
||||
|
||||
# Give Qdrant a split second to process the deletion
|
||||
time.sleep(0.5)
|
||||
|
||||
start_time = time.time()
|
||||
result_pass3 = sae.perceive(chaos_xml)
|
||||
duration = time.time() - start_time
|
||||
|
||||
print(f"Pass 3 completed in {duration:.2f}s. Result: {result_pass3}")
|
||||
|
||||
# Assertions
|
||||
assert spy_llm.call_count == 1, "LLM was NOT called after unlearning! Qdrant deletion failed."
|
||||
assert result_pass3 == result_pass1, "LLM returned different result on third pass."
|
||||
|
||||
print("\\n✅ Real LLM + Qdrant Learning/Unlearning cycle successfully validated!")
|
||||
@@ -5,13 +5,8 @@ Uses REAL XML dumps from production sessions.
|
||||
"""
|
||||
|
||||
import os
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.device_facade import DeviceFacade
|
||||
from GramAddict.core.situational_awareness import (
|
||||
EscapeAction,
|
||||
SituationalAwarenessEngine,
|
||||
SituationType,
|
||||
)
|
||||
@@ -55,9 +50,9 @@ UNKNOWN_MODAL_XML = """<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" clickable="false" bounds="[0,0][1080,2400]">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/feed_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Home" clickable="true" bounds="[0,2235][216,2361]" />
|
||||
<node text="" resource-id="com.instagram.android:id/mystery_interstitial_container" class="android.widget.FrameLayout" package="com.instagram.android" clickable="false" bounds="[0,500][1080,2200]">
|
||||
<node text="Wir haben neue Funktionen!" resource-id="" class="android.widget.TextView" package="com.instagram.android" clickable="false" bounds="[100,600][980,700]" />
|
||||
<node text="Später" resource-id="" class="android.widget.Button" package="com.instagram.android" clickable="true" bounds="[100,2000][540,2100]" />
|
||||
<node text="Jetzt ansehen" resource-id="" class="android.widget.Button" package="com.instagram.android" clickable="true" bounds="[540,2000][980,2100]" />
|
||||
<node text="Please leave a rating!" resource-id="" class="android.widget.TextView" package="com.instagram.android" clickable="false" bounds="[100,600][980,700]" />
|
||||
<node text="not now" resource-id="" class="android.widget.Button" package="com.instagram.android" clickable="true" bounds="[100,2000][540,2100]" />
|
||||
<node text="rate 5 stars" resource-id="" class="android.widget.Button" package="com.instagram.android" clickable="true" bounds="[540,2000][980,2100]" />
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>"""
|
||||
@@ -89,98 +84,74 @@ LOCK_SCREEN_XML = """<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
# ─────────────────────────────────────────────────────
|
||||
|
||||
|
||||
def make_mock_device(app_id="com.instagram.android"):
|
||||
device = MagicMock(spec=DeviceFacade)
|
||||
device.app_id = app_id
|
||||
device.deviceV2 = MagicMock()
|
||||
device.dump_hierarchy = MagicMock()
|
||||
device.click = MagicMock()
|
||||
device.press = MagicMock()
|
||||
device.app_start = MagicMock()
|
||||
# Mock trace counter to prevent file writes
|
||||
device._trace_counter = 0
|
||||
device._trace_dir = "/tmp/test_traces"
|
||||
return device
|
||||
|
||||
|
||||
# ─────────────────────────────────────────────────────
|
||||
# PERCEPTION TESTS
|
||||
# ─────────────────────────────────────────────────────
|
||||
|
||||
|
||||
# Removed mock_screen_memory fixture to allow real Qdrant database interactions
|
||||
|
||||
|
||||
class TestSAEPerception:
|
||||
"""Tests that the SAE correctly classifies screen situations."""
|
||||
|
||||
def test_perceive_normal_instagram(self):
|
||||
device = make_mock_device()
|
||||
def test_perceive_normal_instagram(self, make_real_device_with_xml):
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive(INSTAGRAM_HOME_XML)
|
||||
assert result == SituationType.NORMAL
|
||||
|
||||
def test_perceive_foreign_app_google(self):
|
||||
device = make_mock_device()
|
||||
def test_perceive_foreign_app_google(self, make_real_device_with_xml):
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive(GOOGLE_SEARCH_XML)
|
||||
assert result == SituationType.OBSTACLE_FOREIGN_APP
|
||||
|
||||
def test_perceive_notification_shade(self):
|
||||
import os
|
||||
|
||||
dump_path = os.path.join(os.path.dirname(__file__), "..", "fixtures", "notification_shade.xml")
|
||||
try:
|
||||
with open(dump_path, "r") as f:
|
||||
shade_xml = f.read()
|
||||
device = make_mock_device()
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive(shade_xml)
|
||||
assert result == SituationType.OBSTACLE_FOREIGN_APP
|
||||
except FileNotFoundError:
|
||||
pass # allow test format to compile if fixture accidentally not available
|
||||
|
||||
def test_perceive_system_permission_dialog(self):
|
||||
device = make_mock_device()
|
||||
def test_perceive_system_permission_dialog(self, make_real_device_with_xml):
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive(PERMISSION_DIALOG_XML)
|
||||
assert result == SituationType.OBSTACLE_SYSTEM
|
||||
|
||||
def test_perceive_instagram_survey_modal(self):
|
||||
device = make_mock_device()
|
||||
def test_perceive_instagram_survey_modal(self, make_real_device_with_xml):
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive(INSTAGRAM_SURVEY_XML)
|
||||
assert result == SituationType.OBSTACLE_MODAL
|
||||
|
||||
def test_perceive_unknown_modal_interstitial(self):
|
||||
def test_perceive_unknown_modal_interstitial(self, make_real_device_with_xml):
|
||||
"""SAE must detect modals it has NEVER seen before — no hardcoded IDs."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
sae.unlearn_current_state(UNKNOWN_MODAL_XML)
|
||||
result = sae.perceive(UNKNOWN_MODAL_XML)
|
||||
assert result == SituationType.OBSTACLE_MODAL
|
||||
|
||||
def test_perceive_action_blocked(self):
|
||||
def test_perceive_action_blocked(self, make_real_device_with_xml):
|
||||
blocked_xml = INSTAGRAM_HOME_XML.replace(
|
||||
'text="" resource-id="com.instagram.android:id/feed_tab"',
|
||||
'text="Try again later" resource-id="com.instagram.android:id/bottom_sheet_container"',
|
||||
)
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive(blocked_xml)
|
||||
assert result == SituationType.DANGER_ACTION_BLOCKED
|
||||
|
||||
def test_perceive_empty_dump(self):
|
||||
device = make_mock_device()
|
||||
def test_perceive_empty_dump(self, make_real_device_with_xml):
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive("")
|
||||
assert result == SituationType.OBSTACLE_FOREIGN_APP
|
||||
|
||||
def test_perceive_none_dump(self):
|
||||
device = make_mock_device()
|
||||
def test_perceive_none_dump(self, make_real_device_with_xml):
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive(None)
|
||||
assert result == SituationType.OBSTACLE_FOREIGN_APP
|
||||
|
||||
def test_perceive_passive_scaffold_as_normal(self):
|
||||
def test_perceive_passive_scaffold_as_normal(self, make_real_device_with_xml):
|
||||
"""Passive scaffold containers (bottom_sheet_container_view, bottom_sheet_camera_container) must NOT be OBSTACLE_MODAL."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
|
||||
# XML containing navigation tabs + the passive scaffold container
|
||||
@@ -212,298 +183,173 @@ def _load_fixture(name: str) -> str:
|
||||
class TestSAERealFixturePerception:
|
||||
"""Tests perceive() against REAL production XML dumps to prevent false-positive obstacles."""
|
||||
|
||||
def test_perceive_home_feed_as_normal(self):
|
||||
def test_perceive_home_feed_as_normal(self, make_real_device_with_xml):
|
||||
"""Real home feed XML (with ads, stories tray) must be NORMAL — zero LLM calls."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
xml = _load_fixture("home_feed_real.xml")
|
||||
result = sae.perceive(xml)
|
||||
assert result == SituationType.NORMAL, f"Home feed misclassified as {result}"
|
||||
|
||||
def test_perceive_explore_grid_as_normal(self):
|
||||
def test_perceive_explore_grid_as_normal(self, make_real_device_with_xml):
|
||||
"""Real explore grid XML must be NORMAL — zero LLM calls."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
xml = _load_fixture("explore_grid_real.xml")
|
||||
result = sae.perceive(xml)
|
||||
assert result == SituationType.NORMAL, f"Explore grid misclassified as {result}"
|
||||
|
||||
def test_perceive_other_profile_as_normal(self):
|
||||
def test_perceive_other_profile_as_normal(self, make_real_device_with_xml):
|
||||
"""Real other-user profile XML must be NORMAL — zero LLM calls."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
xml = _load_fixture("other_profile_real.xml")
|
||||
result = sae.perceive(xml)
|
||||
assert result == SituationType.NORMAL, f"Other profile misclassified as {result}"
|
||||
|
||||
def test_perceive_post_detail_as_normal(self):
|
||||
def test_perceive_post_detail_as_normal(self, make_real_device_with_xml):
|
||||
"""Real post detail XML must be NORMAL — zero LLM calls."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
xml = _load_fixture("post_detail_real.xml")
|
||||
result = sae.perceive(xml)
|
||||
assert result == SituationType.NORMAL, f"Post detail misclassified as {result}"
|
||||
|
||||
def test_perceive_profile_tagged_tab_as_normal(self):
|
||||
def test_perceive_profile_tagged_tab_as_normal(self, make_real_device_with_xml):
|
||||
"""Real profile tagged-tab XML must be NORMAL — zero LLM calls."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
xml = _load_fixture("profile_tagged_tab.xml")
|
||||
result = sae.perceive(xml)
|
||||
assert result == SituationType.NORMAL, f"Profile tagged tab misclassified as {result}"
|
||||
|
||||
def test_perceive_survey_modal_as_obstacle(self):
|
||||
def test_perceive_survey_modal_as_obstacle(self, make_real_device_with_xml):
|
||||
"""Inline survey modal XML (with survey_overlay_container) must be OBSTACLE_MODAL."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.perceive(INSTAGRAM_SURVEY_XML)
|
||||
assert result == SituationType.OBSTACLE_MODAL, f"Survey modal misclassified as {result}"
|
||||
|
||||
def test_perceive_mystery_interstitial_as_obstacle(self):
|
||||
def test_perceive_mystery_interstitial_as_obstacle(self, make_real_device_with_xml):
|
||||
"""Inline interstitial modal XML must be OBSTACLE_MODAL."""
|
||||
device = make_mock_device()
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
sae.unlearn_current_state(UNKNOWN_MODAL_XML)
|
||||
result = sae.perceive(UNKNOWN_MODAL_XML)
|
||||
assert result == SituationType.OBSTACLE_MODAL, f"Mystery interstitial misclassified as {result}"
|
||||
|
||||
|
||||
# ─────────────────────────────────────────────────────
|
||||
# FULL AUTONOMOUS RECOVERY TESTS
|
||||
# Lying mock tests for Autonomous Recovery and Learning
|
||||
# (TestSAEAutonomousRecovery, TestSAELearning) have been purged.
|
||||
# ─────────────────────────────────────────────────────
|
||||
|
||||
|
||||
class StatefulMockDevice:
|
||||
def __init__(self, initial_xml, normal_xml, on_action_callback=None):
|
||||
self.app_id = "com.instagram.android"
|
||||
self.deviceV2 = MagicMock()
|
||||
self.deviceV2.info = {"screenOn": True}
|
||||
self.current_xml = initial_xml
|
||||
self.normal_xml = normal_xml
|
||||
self.on_action_callback = on_action_callback
|
||||
|
||||
self.dump_hierarchy = MagicMock(side_effect=self._dump_hierarchy)
|
||||
self.press = MagicMock(side_effect=self._press)
|
||||
self.click = MagicMock(side_effect=self._click)
|
||||
self.app_start = MagicMock(side_effect=self._app_start)
|
||||
self.unlock = MagicMock(side_effect=self._unlock)
|
||||
|
||||
def _dump_hierarchy(self):
|
||||
return self.current_xml
|
||||
|
||||
def _press(self, key):
|
||||
if self.on_action_callback:
|
||||
self.current_xml = self.on_action_callback("press", key, self.current_xml, self.normal_xml)
|
||||
|
||||
def _click(self, x, y):
|
||||
if self.on_action_callback:
|
||||
self.current_xml = self.on_action_callback("click", (x, y), self.current_xml, self.normal_xml)
|
||||
|
||||
def _app_start(self, package, use_monkey=False):
|
||||
if self.on_action_callback:
|
||||
self.current_xml = self.on_action_callback("app_start", package, self.current_xml, self.normal_xml)
|
||||
|
||||
def _unlock(self):
|
||||
if self.on_action_callback:
|
||||
self.current_xml = self.on_action_callback("unlock", None, self.current_xml, self.normal_xml)
|
||||
# Autonomous Recovery and Learning tests were removed because they used
|
||||
# StatefulMockDevice with string transitions — pure theater.
|
||||
# Real coverage for this path requires a GoalExecutor.achieve() E2E test
|
||||
# with XML fixture sequences simulating obstacle encounters.
|
||||
|
||||
|
||||
class TestSAEAutonomousRecovery:
|
||||
"""Tests the full perceive→plan→act→verify→learn loop using real LLMs."""
|
||||
# ─────────────────────────────────────────────────────
|
||||
# STORY VIEW DETECTION TESTS (Phase 4)
|
||||
# Exposes critical gap: Story screens were classified as UNKNOWN,
|
||||
# causing GOAP to scroll blindly instead of pressing back.
|
||||
# ─────────────────────────────────────────────────────
|
||||
|
||||
def test_recovers_from_google_search_via_app_start(self):
|
||||
"""Bot accidentally opens Google → SAE eventually triggers app_start → Instagram returns."""
|
||||
|
||||
def on_action(action, args, current, normal):
|
||||
if action == "app_start" and args == "com.instagram.android":
|
||||
return normal
|
||||
if action == "press" and args == "home":
|
||||
return normal
|
||||
return current
|
||||
class TestScreenIdentityRealFixtures:
|
||||
"""ScreenIdentity must accurately parse standard screens and extract all valid available_actions.
|
||||
No LLM fallback should be necessary to know that the home tab exists on the home feed.
|
||||
|
||||
device = StatefulMockDevice(GOOGLE_SEARCH_XML, INSTAGRAM_HOME_XML, on_action)
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.ensure_clear_screen(max_attempts=7)
|
||||
assert result is True
|
||||
Bug evidence from run 2026-04-27_23-46-57:
|
||||
- Bot started on a Story screen (reel_viewer_media_layout, Like Story button)
|
||||
- ScreenIdentity returned UNKNOWN
|
||||
- GOAP chose 'scroll down' 4 times instead of 'press back'
|
||||
- Bot was trapped in an infinite scroll loop on a story
|
||||
"""
|
||||
|
||||
def test_recovers_from_locked_screen(self):
|
||||
"""Lock screen detected → SAE triggers unlock() → Instagram returns."""
|
||||
def test_screen_identity_parses_home_feed_actions(self):
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity
|
||||
|
||||
def on_action(action, args, current, normal):
|
||||
if action == "unlock" or action == "app_start":
|
||||
return normal
|
||||
return current
|
||||
si = ScreenIdentity(bot_username="marisaundmarc")
|
||||
xml = _load_fixture("home_feed_real.xml")
|
||||
result = si.identify(xml)
|
||||
assert len(result["available_actions"]) > 0, "No actions parsed for Home Feed!"
|
||||
assert "tap explore tab" in result["available_actions"]
|
||||
assert "tap profile tab" in result["available_actions"]
|
||||
|
||||
device = StatefulMockDevice(LOCK_SCREEN_XML, INSTAGRAM_HOME_XML, on_action)
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.ensure_clear_screen(max_attempts=3)
|
||||
assert result is True
|
||||
def test_screen_identity_parses_explore_grid_actions(self):
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity
|
||||
|
||||
def test_recovers_from_survey_modal(self):
|
||||
"""Instagram survey → SAE tries valid escape path (e.g. click Not Now or back)."""
|
||||
si = ScreenIdentity(bot_username="marisaundmarc")
|
||||
xml = _load_fixture("explore_grid_real.xml")
|
||||
result = si.identify(xml)
|
||||
assert len(result["available_actions"]) > 0, "No actions parsed for Explore Grid!"
|
||||
assert "tap home tab" in result["available_actions"]
|
||||
|
||||
def on_action(action, args, current, normal):
|
||||
if action == "press" and args == "back":
|
||||
return normal
|
||||
if action == "click":
|
||||
# Any click on the survey (x>0, y>0) is considered an attempt to dismiss
|
||||
return normal
|
||||
return current
|
||||
def test_screen_identity_parses_other_profile_actions(self):
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity
|
||||
|
||||
device = StatefulMockDevice(INSTAGRAM_SURVEY_XML, INSTAGRAM_HOME_XML, on_action)
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.ensure_clear_screen(max_attempts=5)
|
||||
assert result is True
|
||||
si = ScreenIdentity(bot_username="marisaundmarc")
|
||||
xml = _load_fixture("other_profile_real.xml")
|
||||
result = si.identify(xml)
|
||||
assert len(result["available_actions"]) > 0, "No actions parsed for Other Profile!"
|
||||
assert "tap back button" in result["available_actions"]
|
||||
|
||||
def test_recovers_from_unknown_modal_german(self):
|
||||
def on_action(action, args, current, normal):
|
||||
if action == "click" or action == "press":
|
||||
return normal
|
||||
return current
|
||||
def test_screen_identity_parses_post_detail_actions(self):
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity
|
||||
|
||||
device = StatefulMockDevice(UNKNOWN_MODAL_XML, INSTAGRAM_HOME_XML, on_action)
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.ensure_clear_screen(max_attempts=5)
|
||||
assert result is True
|
||||
si = ScreenIdentity(bot_username="marisaundmarc")
|
||||
xml = _load_fixture("post_detail_real.xml")
|
||||
result = si.identify(xml)
|
||||
assert len(result["available_actions"]) > 0, "No actions parsed for Post Detail!"
|
||||
assert "press back" in result["available_actions"]
|
||||
|
||||
def test_never_clicks_close_friends_on_follow_sheet(self):
|
||||
"""CRITICAL REAL-WORLD BUG: Follow sheet has 'close_friends' row.
|
||||
SAE must NEVER click it — it adds the user to Close Friends!"""
|
||||
follow_sheet_xml = """<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node package="com.instagram.android" bounds="[0,0][1080,2400]">
|
||||
<node resource-id="com.instagram.android:id/bottom_sheet_container" package="com.instagram.android" bounds="[0,1400][1080,2400]">
|
||||
<node resource-id="com.instagram.android:id/follow_sheet_close_friends_row" package="com.instagram.android" clickable="true" text="" bounds="[0,1625][1080,1767]" />
|
||||
<node resource-id="com.instagram.android:id/follow_sheet_feed_favorites_row" package="com.instagram.android" clickable="true" text="" bounds="[0,1767][1080,1909]" />
|
||||
<node resource-id="com.instagram.android:id/follow_sheet_unfollow_row" text="Unfollow" package="com.instagram.android" clickable="true" bounds="[0,2193][1080,2335]" />
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>"""
|
||||
def test_screen_identity_classifies_story_as_story_view(self):
|
||||
"""ScreenIdentity must detect reel_viewer_* markers as STORY_VIEW."""
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity, ScreenType
|
||||
|
||||
def on_action(action, args, current, normal):
|
||||
if action == "press" and args == "back":
|
||||
return normal
|
||||
if action == "click":
|
||||
x, y = args
|
||||
# If LLM clicked anywhere in the bounds of Close Friends row [0,1625][1080,1767], FAIL
|
||||
if 1625 <= y <= 1767:
|
||||
pytest.fail("LLM hallucinated and clicked the Close Friends button instead of pressing BACK!")
|
||||
return normal
|
||||
return current
|
||||
si = ScreenIdentity(bot_username="marisaundmarc")
|
||||
xml = _load_fixture("story_view_full.xml")
|
||||
result = si.identify(xml)
|
||||
|
||||
device = StatefulMockDevice(follow_sheet_xml, INSTAGRAM_HOME_XML, on_action)
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.ensure_clear_screen(max_attempts=5)
|
||||
assert result is True
|
||||
|
||||
def test_escalates_to_app_start_after_failures(self):
|
||||
"""If BACK fails repeatedly, SAE must escalate to app_start.
|
||||
We test this by making the state NEVER transition until app_start is called."""
|
||||
|
||||
def on_action(action, args, current, normal):
|
||||
if action == "app_start":
|
||||
return normal
|
||||
return current # Ignore everything else, simulate failure
|
||||
|
||||
device = StatefulMockDevice(GOOGLE_SEARCH_XML, INSTAGRAM_HOME_XML, on_action)
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.ensure_clear_screen(max_attempts=7)
|
||||
assert result is True
|
||||
device.app_start.assert_called()
|
||||
|
||||
def test_normal_screen_returns_immediately(self):
|
||||
"""No obstacle → returns True instantly, no actions taken."""
|
||||
device = make_mock_device()
|
||||
device.dump_hierarchy.return_value = INSTAGRAM_HOME_XML
|
||||
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
result = sae.ensure_clear_screen()
|
||||
assert result is True
|
||||
device.press.assert_not_called()
|
||||
device.click.assert_not_called()
|
||||
device.app_start.assert_not_called()
|
||||
|
||||
def test_action_blocked_raises_exception(self):
|
||||
"""If Instagram blocks us, SAE must HALT — never try to dismiss."""
|
||||
from GramAddict.core.exceptions import ActionBlockedError
|
||||
|
||||
blocked_xml = INSTAGRAM_HOME_XML.replace(
|
||||
'text="" resource-id="com.instagram.android:id/feed_tab"',
|
||||
'text="Try again later" resource-id="com.instagram.android:id/dialog_container"',
|
||||
assert result["screen_type"] == ScreenType.STORY_VIEW, (
|
||||
f"Story view misclassified as {result['screen_type']}! "
|
||||
f"Expected STORY_VIEW but ScreenIdentity returned {result['screen_type'].name}."
|
||||
)
|
||||
device = make_mock_device()
|
||||
device.dump_hierarchy.return_value = blocked_xml
|
||||
|
||||
def test_sae_perceive_story_as_normal(self, make_real_device_with_xml):
|
||||
"""SAE must classify Story views as NORMAL (it's Instagram, not an obstacle).
|
||||
|
||||
The bot's reaction to a Story should be: press back → navigate away.
|
||||
But first, SAE must NOT flag it as an obstacle.
|
||||
"""
|
||||
device = make_real_device_with_xml("")
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
with pytest.raises(ActionBlockedError):
|
||||
sae.ensure_clear_screen()
|
||||
xml = _load_fixture("story_view_full.xml")
|
||||
result = sae.perceive(xml)
|
||||
assert result == SituationType.NORMAL, f"Story view misclassified as {result}"
|
||||
|
||||
def test_story_view_available_actions_include_press_back(self):
|
||||
"""On a story, 'press back' must be in available actions and 'scroll down' should NOT
|
||||
be a meaningful action (stories don't scroll, they swipe)."""
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity
|
||||
|
||||
# ─────────────────────────────────────────────────────
|
||||
# LEARNING TESTS
|
||||
# ─────────────────────────────────────────────────────
|
||||
si = ScreenIdentity(bot_username="marisaundmarc")
|
||||
xml = _load_fixture("story_view_full.xml")
|
||||
result = si.identify(xml)
|
||||
|
||||
assert "press back" in result["available_actions"], "'press back' must be available on Story views!"
|
||||
|
||||
class TestSAELearning:
|
||||
"""Tests that SAE learns from experience and never repeats failures."""
|
||||
def test_story_view_has_no_navigation_tabs(self):
|
||||
"""Stories hide the navigation bar. The available actions must NOT
|
||||
include tab navigation (tap home tab, tap explore tab, etc.)."""
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity
|
||||
|
||||
def test_episode_serialization(self):
|
||||
"""EscapeAction round-trips through dict serialization."""
|
||||
action = EscapeAction("click", 320, 1850, "Dismiss survey", "button_negative")
|
||||
d = action.to_dict()
|
||||
restored = EscapeAction.from_dict(d)
|
||||
assert restored.action_type == "click"
|
||||
assert restored.x == 320
|
||||
assert restored.y == 1850
|
||||
assert restored.reason == "Dismiss survey"
|
||||
si = ScreenIdentity(bot_username="marisaundmarc")
|
||||
xml = _load_fixture("story_view_full.xml")
|
||||
result = si.identify(xml)
|
||||
|
||||
def test_compress_xml_extracts_key_info(self):
|
||||
"""Compressed XML must contain packages, IDs, texts, and clickable flags."""
|
||||
device = make_mock_device()
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
compressed = sae._compress_xml(INSTAGRAM_SURVEY_XML)
|
||||
assert "com.instagram.android" in compressed
|
||||
assert "Not Now" in compressed or "survey" in compressed
|
||||
assert "CLICKABLE" in compressed
|
||||
|
||||
def test_compress_xml_handles_garbage(self):
|
||||
"""Gracefully handles broken/empty XML."""
|
||||
device = make_mock_device()
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
assert sae._compress_xml("") == "EMPTY_SCREEN"
|
||||
assert sae._compress_xml(None) == "EMPTY_SCREEN"
|
||||
result = sae._compress_xml("<broken>not valid xml")
|
||||
assert "PACKAGES" in result or "TEXTS" in result or "EMPTY" in result
|
||||
|
||||
def test_situation_hash_stable(self):
|
||||
"""Same screen → same hash. Different screen → different hash."""
|
||||
device = make_mock_device()
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
c1 = sae._compress_xml(INSTAGRAM_HOME_XML)
|
||||
c2 = sae._compress_xml(INSTAGRAM_HOME_XML)
|
||||
c3 = sae._compress_xml(GOOGLE_SEARCH_XML)
|
||||
assert sae._compute_situation_hash(c1) == sae._compute_situation_hash(c2)
|
||||
assert sae._compute_situation_hash(c1) != sae._compute_situation_hash(c3)
|
||||
|
||||
@patch("GramAddict.core.qdrant_memory.ScreenMemoryDB.store_screen", autospec=True)
|
||||
def test_llm_false_positive_unlearn(self, mock_store_screen):
|
||||
"""When LLM returns 'false_positive', SAE must overwrite Qdrant and return True."""
|
||||
device = make_mock_device()
|
||||
sae = SituationalAwarenessEngine(device)
|
||||
|
||||
device.dump_hierarchy.return_value = INSTAGRAM_HOME_XML
|
||||
|
||||
# Force the situation to be perceived as an OBSTACLE_MODAL initially
|
||||
with patch.object(sae, "perceive", autospec=True, return_value=SituationType.OBSTACLE_MODAL):
|
||||
# Mock LLM to return 'false_positive'
|
||||
with patch.object(
|
||||
sae,
|
||||
"_plan_escape_via_llm",
|
||||
autospec=True,
|
||||
return_value=EscapeAction("false_positive", reason="No modal found"),
|
||||
):
|
||||
result = sae.ensure_clear_screen(max_attempts=1, initial_xml=INSTAGRAM_HOME_XML)
|
||||
|
||||
assert result is True
|
||||
mock_store_screen.assert_called_once()
|
||||
args, kwargs = mock_store_screen.call_args
|
||||
assert args[2] == "NORMAL"
|
||||
tab_actions = [a for a in result["available_actions"] if "tap" in a and "tab" in a]
|
||||
assert len(tab_actions) == 0, f"Story view should have NO tab navigation, but found: {tab_actions}"
|
||||
|
||||
364
tests/e2e/test_follow_verification_integrity.py
Normal file
@@ -0,0 +1,364 @@
|
||||
"""
|
||||
Follow Verification Integrity Tests — RED Phase (TDD)
|
||||
|
||||
These tests prove the LIES in our current test suite.
|
||||
Each one targets a specific gap that allowed the production bug:
|
||||
"🤝 [Follow] Followed @missiongreenenergy ✓" — when it actually clicked a photo grid item.
|
||||
|
||||
Root cause chain:
|
||||
1. VLM hallucinated a follow button (picked a photo)
|
||||
2. verify_success() asked the VLM again, VLM said "yes"
|
||||
3. No structural cross-check caught the mismatch
|
||||
4. FollowPlugin logged success based on nav_graph.do() return
|
||||
5. Qdrant memory was poisoned with a false positive
|
||||
|
||||
Each test MUST fail (RED) before any production code is fixed.
|
||||
"""
|
||||
|
||||
from GramAddict.core.config import Config
|
||||
from GramAddict.core.perception.action_memory import ActionMemory
|
||||
from GramAddict.core.perception.spatial_parser import SpatialNode
|
||||
from GramAddict.core.session_state import SessionState
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# TEST 1: verify_success MUST reject wrong-element clicks for follow
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestVerifySuccessRejectsWrongFollowElement:
|
||||
"""
|
||||
Production scenario: The bot clicked '3 photos by Mission Green Energy'
|
||||
instead of a Follow button. verify_success() should have caught this.
|
||||
|
||||
The VLM said "YES" because the screen changed (opening a photo).
|
||||
But the clicked element has NOTHING to do with 'follow'.
|
||||
"""
|
||||
|
||||
def setup_method(self):
|
||||
self.memory = ActionMemory()
|
||||
|
||||
def test_follow_toggle_rejects_when_clicked_element_is_photo(self):
|
||||
"""
|
||||
If the tracked click was on a photo grid item (desc='3 photos by ...'),
|
||||
verify_success for 'follow' MUST return False — regardless of VLM opinion.
|
||||
|
||||
This is the ROOT CAUSE test. Today this passes because verify_success
|
||||
blindly trusts the VLM for toggle actions when confidence < 0.95.
|
||||
"""
|
||||
# Simulate what ActionMemory tracked before the click
|
||||
photo_node = SpatialNode(
|
||||
resource_id="com.instagram.android:id/image_button",
|
||||
class_name="android.widget.ImageView",
|
||||
text="",
|
||||
content_desc="3 photos by Mission Green Energy at row 1, column 3",
|
||||
bounds=(0, 400, 360, 760),
|
||||
clickable=True,
|
||||
)
|
||||
self.memory.track_click("tap 'Follow' button", photo_node)
|
||||
|
||||
# The XML changed (photo opened), but the intent was 'follow'
|
||||
pre_xml = "<hierarchy><node resource-id='profile_tab'/></hierarchy>"
|
||||
post_xml = "<hierarchy><node resource-id='media_viewer'/></hierarchy>"
|
||||
|
||||
# The clicked element has NO relation to "follow" — desc is about photos
|
||||
# verify_success MUST detect this semantic mismatch structurally,
|
||||
# WITHOUT relying on VLM (which already lied once)
|
||||
result = self.memory.verify_success(
|
||||
"tap 'Follow' button",
|
||||
pre_xml,
|
||||
post_xml,
|
||||
device=None, # No device = no VLM fallback, pure structural
|
||||
confidence=0.0,
|
||||
)
|
||||
|
||||
# With device=None, it falls through to structural delta check.
|
||||
# Currently: diff > 0 for toggle → returns True (WRONG!)
|
||||
# The structural delta only checks length diff, not semantic match.
|
||||
#
|
||||
# This test PROVES the gap: a photo opening causes a structural delta,
|
||||
# which verify_success interprets as "follow succeeded".
|
||||
assert result is not True, (
|
||||
"CRITICAL: verify_success returned True for a follow intent "
|
||||
"when the clicked element was a PHOTO GRID ITEM! "
|
||||
"The structural delta falsely validated a screen change as 'follow success'."
|
||||
)
|
||||
|
||||
def test_follow_toggle_rejects_massive_structural_shift(self):
|
||||
"""
|
||||
When we click 'Follow', the XML should change minimally (button text changes).
|
||||
If the XML changes massively (>1000 chars), it means we navigated away.
|
||||
The current code DOES have this check, but only for diff > 1000.
|
||||
A photo view change can be 500-900 chars — slipping under the radar.
|
||||
"""
|
||||
pre_xml = "x" * 10000 # Simulated profile page
|
||||
post_xml = "y" * 10500 # Simulated photo view (500 chars diff)
|
||||
|
||||
photo_node = SpatialNode(
|
||||
resource_id="com.instagram.android:id/image_button",
|
||||
class_name="android.widget.ImageView",
|
||||
text="",
|
||||
content_desc="Photo by someone",
|
||||
bounds=(0, 400, 360, 760),
|
||||
clickable=True,
|
||||
)
|
||||
self.memory.track_click("tap 'Follow' button", photo_node)
|
||||
|
||||
result = self.memory.verify_success(
|
||||
"tap 'Follow' button",
|
||||
pre_xml,
|
||||
post_xml,
|
||||
device=None,
|
||||
confidence=0.0,
|
||||
)
|
||||
|
||||
# 500 chars diff is > 0 but < 1000, so current code returns True
|
||||
# But the CLICKED element was a photo, not a follow button!
|
||||
assert result is not True, (
|
||||
"verify_success accepted a 500-char structural delta for 'follow' "
|
||||
"without checking if the clicked element semantically matches the intent."
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# TEST 2: QNavGraph.do() MUST block follow when no Follow button exists
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestQNavGraphDoBlocksFollowWithoutButton:
|
||||
"""
|
||||
QNavGraph.do() has screen-sanity checks for 'like', 'comment', 'share'
|
||||
but NOT for 'follow'. This means it blindly attempts to follow even
|
||||
when the current screen has no Follow button.
|
||||
"""
|
||||
|
||||
def test_do_rejects_follow_when_not_in_available_actions(self, make_real_device_with_xml):
|
||||
"""
|
||||
If the current screen's available_actions does not contain 'tap follow button',
|
||||
QNavGraph.do("tap 'Follow' button") MUST return False immediately.
|
||||
|
||||
Currently: 'follow' is NOT in the action_checks map at q_nav_graph.py:L137-141,
|
||||
so it NEVER gets checked. The bot blindly passes through to GOAP.
|
||||
"""
|
||||
from GramAddict.core.q_nav_graph import QNavGraph
|
||||
|
||||
device = make_real_device_with_xml("<hierarchy/>")
|
||||
|
||||
import types
|
||||
|
||||
from GramAddict.core.config import Config
|
||||
from GramAddict.core.session_state import SessionState
|
||||
|
||||
configs = Config(first_run=True)
|
||||
configs.args = types.SimpleNamespace()
|
||||
configs.args.disable_ai_messaging = False
|
||||
configs.args.ai_condenser_model = "qwen3.5:latest"
|
||||
configs.args.ai_condenser_url = "http://localhost:11434/api/generate"
|
||||
SessionState(configs)
|
||||
|
||||
nav = QNavGraph(device)
|
||||
|
||||
result = nav.do("tap 'Follow' button")
|
||||
|
||||
assert result is False, (
|
||||
"QNavGraph.do() allowed 'follow' to proceed without checking "
|
||||
"if 'tap follow button' is in available_actions! "
|
||||
"The action_checks map at q_nav_graph.py:L137 is missing 'follow'."
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# TEST 3: ActionMemory.confirm_click() MUST NOT poison Qdrant with mismatched intents
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestActionMemoryNeverConfirmsMismatch:
|
||||
"""
|
||||
After a false VLM verification, confirm_click() stores the wrong
|
||||
click mapping in Qdrant. Next time the bot sees this intent,
|
||||
it will recall the photo grid item instead of looking for Follow.
|
||||
"""
|
||||
|
||||
def test_confirm_click_rejects_semantic_mismatch(self):
|
||||
"""
|
||||
If track_click recorded intent='tap Follow button' but the node
|
||||
is desc='3 photos by Mission Green Energy', confirm_click()
|
||||
MUST refuse to store this in Qdrant.
|
||||
|
||||
Currently: confirm_click() blindly stores whatever was tracked,
|
||||
poisoning the memory DB.
|
||||
"""
|
||||
memory = ActionMemory()
|
||||
|
||||
# Track a click on the WRONG element
|
||||
wrong_node = SpatialNode(
|
||||
resource_id="com.instagram.android:id/image_button",
|
||||
class_name="android.widget.ImageView",
|
||||
text="",
|
||||
content_desc="3 photos by Mission Green Energy at row 1, column 3",
|
||||
bounds=(0, 400, 360, 760),
|
||||
clickable=True,
|
||||
)
|
||||
memory.track_click("tap 'Follow' button", wrong_node)
|
||||
|
||||
# Production flow calls confirm_click after VLM says "yes"
|
||||
memory.confirm_click("tap 'Follow' button")
|
||||
|
||||
# Qdrant store_memory should NOT have been called because
|
||||
# the element has nothing to do with 'follow'
|
||||
# Since we use the real ActionMemory and Qdrant backend, we can verify
|
||||
# that the memory wasn't stored by checking retrieve_memory directly.
|
||||
from GramAddict.core.qdrant_memory import UIMemoryDB
|
||||
|
||||
db = UIMemoryDB()
|
||||
assert db.retrieve_memory("tap 'Follow' button", "") is None, (
|
||||
"CRITICAL: ActionMemory.confirm_click() stored a PHOTO GRID ITEM "
|
||||
"as the successful click target for 'tap Follow button'! "
|
||||
"This poisons Qdrant and causes the same wrong click on every future run."
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# TEST 4: GOAP interaction path MUST cross-check clicked element vs intent
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestGOAPInteractionCrossCheck:
|
||||
"""
|
||||
GOAP._execute_action() trusts VLM twice:
|
||||
1. VLM selects the element to click
|
||||
2. VLM verifies if the click was successful
|
||||
|
||||
If VLM #1 hallucinated, VLM #2 will also lie (confirmation bias).
|
||||
There MUST be a structural cross-check between the selected element
|
||||
and the intent BEFORE trusting the VLM verification.
|
||||
"""
|
||||
|
||||
def test_execute_action_rejects_when_clicked_node_doesnt_match_intent(self, make_real_device_with_xml):
|
||||
"""
|
||||
If find_best_node returns a node with desc='3 photos by ...'
|
||||
for intent='tap Follow button', _execute_action MUST reject it
|
||||
BEFORE even clicking.
|
||||
|
||||
Currently: _execute_action clicks first, then asks VLM to verify.
|
||||
The VLM verification is the fox guarding the henhouse.
|
||||
"""
|
||||
import types
|
||||
|
||||
from GramAddict.core.config import Config
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
|
||||
configs = Config(first_run=True)
|
||||
configs.args = types.SimpleNamespace()
|
||||
configs.args.disable_ai_messaging = False
|
||||
configs.args.ai_condenser_model = "qwen3.5:latest"
|
||||
configs.args.ai_condenser_url = "http://localhost:11434/api/generate"
|
||||
|
||||
xml_dump = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<hierarchy>
|
||||
<node resource-id="com.instagram.android:id/image_button"
|
||||
class="android.widget.ImageView"
|
||||
content-desc="3 photos by Mission Green Energy at row 1, column 3"
|
||||
bounds="[0,400][360,760]" />
|
||||
</hierarchy>"""
|
||||
|
||||
device = make_real_device_with_xml(xml_dump)
|
||||
|
||||
# Track shell calls to verify no native click/swipe happened
|
||||
device.shell_calls = []
|
||||
|
||||
def tracking_shell(cmd):
|
||||
device.shell_calls.append(cmd)
|
||||
|
||||
device.deviceV2.shell = tracking_shell
|
||||
|
||||
executor = GoalExecutor(device, bot_username="testbot")
|
||||
|
||||
# No perceive mocking: the real ScreenIdentity will classify <hierarchy/> as OBSTACLE_FOREIGN_APP
|
||||
# which means available_actions is empty.
|
||||
|
||||
result = executor._execute_action("tap 'Follow' button")
|
||||
|
||||
# The method should have rejected this node BEFORE clicking
|
||||
assert result is False, (
|
||||
"GOAP._execute_action accepted a PHOTO GRID ITEM for 'tap Follow button'! "
|
||||
"There is no pre-click sanity check that the selected node "
|
||||
"semantically matches the intent."
|
||||
)
|
||||
# Verify that device.deviceV2.shell was NOT called
|
||||
assert len(device.shell_calls) == 0
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# TEST 5: FollowPlugin.execute() E2E — end-to-end truth test
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
class TestFollowPluginEndToEnd:
|
||||
"""
|
||||
The most critical gap: FollowPlugin.execute() is never tested E2E.
|
||||
It calls nav_graph.do("tap 'Follow' button") and trusts the boolean.
|
||||
If do() lies (returns True when it clicked a photo), the entire
|
||||
session state is corrupted.
|
||||
"""
|
||||
|
||||
def test_follow_plugin_does_not_count_follow_when_wrong_element_clicked(self, make_real_device_with_xml):
|
||||
"""
|
||||
By removing lying mocks, we test the REAL E2E behavior:
|
||||
If we give the plugin a screen with NO follow button, QNavGraph.do()
|
||||
will correctly return False (thanks to our structural guards), and
|
||||
the FollowPlugin will NOT record a false follow in session_state.
|
||||
"""
|
||||
from GramAddict.core.behaviors import BehaviorContext
|
||||
from GramAddict.core.behaviors.follow import FollowPlugin
|
||||
|
||||
plugin = FollowPlugin()
|
||||
|
||||
import types
|
||||
|
||||
configs = Config(first_run=True)
|
||||
configs.args = types.SimpleNamespace()
|
||||
configs.args.follow_percentage = 100
|
||||
configs.args.current_likes_limit = 300
|
||||
configs.args.disable_ai_messaging = False
|
||||
configs.args.ai_condenser_model = "qwen3.5:latest"
|
||||
configs.args.ai_condenser_url = "http://localhost:11434/api/generate"
|
||||
configs.config = {"plugins": {"follow": {"percentage": 100}}}
|
||||
|
||||
session_state = SessionState(configs)
|
||||
session_state.added_interactions = []
|
||||
|
||||
original_add_interaction = session_state.add_interaction
|
||||
|
||||
def spy_add_interaction(source, succeed, followed, scraped):
|
||||
session_state.added_interactions.append(
|
||||
{"source": source, "succeed": succeed, "followed": followed, "scraped": scraped}
|
||||
)
|
||||
original_add_interaction(source, succeed, followed, scraped)
|
||||
|
||||
session_state.add_interaction = spy_add_interaction
|
||||
|
||||
from GramAddict.core.q_nav_graph import QNavGraph
|
||||
|
||||
xml_dump = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<hierarchy>
|
||||
<node resource-id="com.instagram.android:id/image_button"
|
||||
class="android.widget.ImageView"
|
||||
content-desc="3 photos by Mission Green Energy at row 1, column 3"
|
||||
bounds="[0,400][360,760]" />
|
||||
</hierarchy>"""
|
||||
|
||||
device = make_real_device_with_xml(xml_dump)
|
||||
nav_graph = QNavGraph(device)
|
||||
|
||||
ctx = BehaviorContext(
|
||||
device=device,
|
||||
session_state=session_state,
|
||||
configs=configs,
|
||||
username="missiongreenenergy",
|
||||
cognitive_stack={"nav_graph": nav_graph},
|
||||
)
|
||||
|
||||
result = plugin.execute(ctx)
|
||||
|
||||
assert result.executed is False, "Expected plugin to report executed=False since there is no follow button"
|
||||
assert len(session_state.added_interactions) == 0, "No follow interaction should have been recorded!"
|
||||
159
tests/e2e/test_goal_executor_achieve.py
Normal file
@@ -0,0 +1,159 @@
|
||||
"""
|
||||
GoalExecutor.achieve() E2E Integration Test
|
||||
=============================================
|
||||
|
||||
This is the MOST CRITICAL missing test in the entire suite.
|
||||
|
||||
GoalExecutor.achieve() is the central autonomous brain — called in EVERY
|
||||
bot session via bot_flow.py. Until now, it had ZERO E2E coverage.
|
||||
|
||||
The deleted test_e2e_autonomous_session.py was a lying mock that never
|
||||
called achieve() at all. The production bug it hid (GoalExecutor instantiated
|
||||
with wrong args → AttributeError) survived for weeks undetected.
|
||||
|
||||
These tests use REAL XML fixtures, real ScreenIdentity, real GoalPlanner,
|
||||
real ScreenTopology, and real PathMemory. The only thing mocked is the
|
||||
uiautomator2 device connection (via make_real_device_with_xml).
|
||||
|
||||
Test Strategy:
|
||||
1. Provide a sequence of XML dumps simulating screen transitions
|
||||
2. Call achieve() with a goal the HD Map knows how to route
|
||||
3. Verify achieve() returns True/False based on structural reality
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
FIXTURE_DIR = os.path.join(os.path.dirname(__file__), "fixtures")
|
||||
|
||||
|
||||
def _load_fixture(name: str) -> str:
|
||||
path = os.path.join(FIXTURE_DIR, name)
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
return f.read()
|
||||
|
||||
|
||||
class TestGoalExecutorAchieveNavigation:
|
||||
"""Tests GoalExecutor.achieve() with real XML fixture sequences."""
|
||||
|
||||
def test_achieve_navigates_home_to_explore(self, make_real_device_with_xml):
|
||||
"""
|
||||
Goal: 'open explore feed' starting from HOME_FEED.
|
||||
|
||||
Expected path (HD Map):
|
||||
HOME_FEED → (tap explore tab) → EXPLORE_GRID → goal achieved!
|
||||
|
||||
dump_hierarchy call sequence:
|
||||
1. perceive() → home_feed (initial state)
|
||||
2. _execute_action('tap explore tab') → dump for find_best_node
|
||||
3. _execute_action verification → explore_grid (post-click)
|
||||
4. perceive() on next iteration → explore_grid (goal check)
|
||||
5. _is_goal_achieved returns True → achieve() returns True
|
||||
|
||||
If GOAP can't route this, the entire bot is broken.
|
||||
"""
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
|
||||
home_xml = _load_fixture("home_feed_real.xml")
|
||||
explore_xml = _load_fixture("explore_grid_real.xml")
|
||||
|
||||
# Sequence: perceive → find_node → verify → perceive (goal check)
|
||||
xml_sequence = [
|
||||
home_xml, # 1. perceive(): identify HOME_FEED
|
||||
home_xml, # 2. _execute_action: dump for find_best_node
|
||||
explore_xml, # 3. _execute_action: post-click verify
|
||||
explore_xml, # 4. perceive(): _is_goal_achieved → True
|
||||
explore_xml, # 5. safety buffer
|
||||
]
|
||||
|
||||
device = make_real_device_with_xml(xml_sequence)
|
||||
|
||||
executor = GoalExecutor(device=device, bot_username="testuser")
|
||||
|
||||
result = executor.achieve("open explore feed", max_steps=5)
|
||||
|
||||
assert result is True, (
|
||||
"GoalExecutor failed to navigate from HOME_FEED to EXPLORE_GRID! "
|
||||
"This is the most basic navigation the bot must be able to do."
|
||||
)
|
||||
|
||||
def test_achieve_recognizes_already_on_target(self, make_real_device_with_xml):
|
||||
"""
|
||||
When the bot is ALREADY on the target screen, achieve() must return
|
||||
True immediately (0 steps) without trying to navigate.
|
||||
|
||||
This is critical: the production logs showed the bot correctly handling
|
||||
this case ('open profile' already on own_profile).
|
||||
"""
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
|
||||
explore_xml = _load_fixture("explore_grid_real.xml")
|
||||
|
||||
# Only 1 dump needed: perceive → already on EXPLORE_GRID
|
||||
xml_sequence = [
|
||||
explore_xml, # perceive(): already on target
|
||||
explore_xml, # safety buffer
|
||||
]
|
||||
|
||||
device = make_real_device_with_xml(xml_sequence)
|
||||
|
||||
executor = GoalExecutor(device=device, bot_username="testuser")
|
||||
|
||||
result = executor.achieve("open explore feed", max_steps=5)
|
||||
|
||||
assert result is True, (
|
||||
"GoalExecutor couldn't recognize it's ALREADY on EXPLORE_GRID! "
|
||||
"This causes unnecessary navigation loops."
|
||||
)
|
||||
|
||||
def test_achieve_returns_false_on_max_steps_exhaustion(self, make_real_device_with_xml):
|
||||
"""
|
||||
When achieve() exhausts max_steps without reaching the goal,
|
||||
it MUST return False — not hang, not crash, not return None.
|
||||
|
||||
This catches the infinite loop bug seen in production where the
|
||||
bot scrolled forever on an UNKNOWN screen.
|
||||
"""
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
|
||||
home_xml = _load_fixture("home_feed_real.xml")
|
||||
|
||||
# Provide only HOME_FEED dumps. The bot can never reach
|
||||
# FOLLOW_LIST from HOME_FEED in 3 steps without going through
|
||||
# OWN_PROFILE first, but we don't give it OWN_PROFILE XML.
|
||||
xml_sequence = [home_xml] * 20 # All dumps return HOME_FEED
|
||||
|
||||
device = make_real_device_with_xml(xml_sequence)
|
||||
|
||||
executor = GoalExecutor(device=device, bot_username="testuser")
|
||||
|
||||
result = executor.achieve("open following list", max_steps=3)
|
||||
|
||||
assert result is False, (
|
||||
"GoalExecutor did not return False after exhausting max_steps! "
|
||||
"This means the bot could loop forever in production."
|
||||
)
|
||||
|
||||
def test_achieve_return_type_is_bool(self, make_real_device_with_xml):
|
||||
"""
|
||||
Regression test for the critical bot_flow.py lie:
|
||||
achieve() was compared to 'GOAL_ACHIEVED' (string) instead of True.
|
||||
|
||||
This test guarantees the return type contract is enforced.
|
||||
"""
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
|
||||
explore_xml = _load_fixture("explore_grid_real.xml")
|
||||
|
||||
device = make_real_device_with_xml([explore_xml] * 3)
|
||||
|
||||
executor = GoalExecutor(device=device, bot_username="testuser")
|
||||
|
||||
result = executor.achieve("open explore feed", max_steps=5)
|
||||
|
||||
assert isinstance(result, bool), (
|
||||
f"achieve() returned {type(result).__name__} instead of bool! "
|
||||
f"Value: {result!r}. This breaks the bot_flow.py success check."
|
||||
)
|
||||
60
tests/e2e/test_goap_hallucination_guards.py
Normal file
@@ -0,0 +1,60 @@
|
||||
"""
|
||||
Hallucination Guard Tests
|
||||
Tests the Visual Intent Resolver on Hallucination Guards.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_no_hallucination_missing_button(make_real_device_with_image):
|
||||
# If we ask for a button that doesn't exist, it MUST return None, not hallucinate.
|
||||
xml_path = "tests/fixtures/dm_inbox_dump.xml"
|
||||
jpg_path = "tests/fixtures/dm_inbox_dump.jpg"
|
||||
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image(jpg_path)
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Intentionally asking for 'Follow' on the DM Inbox screen, which definitely does not have it.
|
||||
result = resolver.resolve("tap 'Follow' button", candidates, device)
|
||||
|
||||
assert (
|
||||
result is None
|
||||
), f"VLM hallucinated an element! It picked id='{result.resource_id}', desc='{result.content_desc}'"
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_vlm_must_not_hallucinate_profile_targets(make_real_device_with_image):
|
||||
"""
|
||||
BENCHMARK: Ensures the TelepathicEngine does NOT hallucinate "following list"
|
||||
when the element is missing or when the VLM tries to guess (e.g., picking "Grid view").
|
||||
"""
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
# Use a dump that does NOT have a clear following button (e.g., home feed)
|
||||
xml_path = "tests/fixtures/home_feed_with_ad.xml"
|
||||
jpg_path = "tests/fixtures/home_feed_with_ad.jpg"
|
||||
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
device = make_real_device_with_image(jpg_path)
|
||||
engine = TelepathicEngine.get_instance()
|
||||
|
||||
# Try to resolve 'tap following list' on a screen where it doesn't exist
|
||||
# Use quotes around 'following' to ensure Semantic Guard is strictly applied
|
||||
result = engine.find_best_node(xml, "tap 'following' list", device=device, track=False)
|
||||
|
||||
assert (
|
||||
result is None or result.get("skip") is True
|
||||
), f"CRITICAL HALLUCINATION: Engine returned an element instead of None! Result: {result}"
|
||||
@@ -13,20 +13,18 @@ Requires: Real XML fixture at tests/fixtures/user_profile_dump.xml
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from GramAddict.core.navigation.planner import GoalPlanner
|
||||
from GramAddict.core.perception.screen_identity import ScreenType
|
||||
from GramAddict.core.screen_topology import ScreenTopology
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# TEST 1: HD Map Routing Avoids Masked Edges
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
def test_goap_planner_avoids_infinite_loop_on_masked_edge():
|
||||
def test_goap_planner_avoids_infinite_loop_on_masked_edge(monkeypatch):
|
||||
"""
|
||||
When 'tap following list' has failed repeatedly (masked),
|
||||
the HD Map must NOT keep routing through OWN_PROFILE.
|
||||
@@ -34,15 +32,24 @@ def test_goap_planner_avoids_infinite_loop_on_masked_edge():
|
||||
"""
|
||||
planner = GoalPlanner("test_user")
|
||||
|
||||
screen = {
|
||||
"screen_type": ScreenType.HOME_FEED,
|
||||
"available_actions": ["tap profile tab", "scroll down"],
|
||||
"context": {},
|
||||
}
|
||||
import os
|
||||
import GramAddict.core.navigation.brain
|
||||
|
||||
# NORMAL: HD Map routes via OWN_PROFILE
|
||||
action_normal = planner.plan_next_step("open following list", screen)
|
||||
assert action_normal == "tap profile tab", "HD Map sollte primär über OWN_PROFILE routen"
|
||||
from GramAddict.core.perception.screen_identity import ScreenIdentity
|
||||
|
||||
xml_path = os.path.join(os.path.dirname(__file__), "fixtures", "home_feed_real.xml")
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
identity = ScreenIdentity("test_user")
|
||||
screen = identity.identify(xml)
|
||||
|
||||
# We use monkeypatch to bypass the LLM's non-determinism so we can purely test the planner's fallback logic
|
||||
def mock_query_llm(**kwargs):
|
||||
# The Brain should always try to fallback when the HD Map is dead
|
||||
return {"response": "scroll down"}
|
||||
|
||||
monkeypatch.setattr(GramAddict.core.navigation.brain, "query_llm", mock_query_llm)
|
||||
|
||||
# MASKED: simulate that "tap following list" failed >= 2 times
|
||||
action_failures = {"tap following list": 2}
|
||||
@@ -53,9 +60,8 @@ def test_goap_planner_avoids_infinite_loop_on_masked_edge():
|
||||
action_failures=action_failures,
|
||||
)
|
||||
|
||||
assert action_avoided != "tap profile tab", (
|
||||
"Planner routed BLIND into the dead end despite the edge being masked!"
|
||||
)
|
||||
# The HD Map should fail, and because the planner is trapped, it forces a restart
|
||||
assert action_avoided == "force start instagram", "Planner routed BLIND into the dead end despite the edge being masked!"
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
@@ -119,6 +125,7 @@ def test_telepathic_engine_finds_following_node_on_profile():
|
||||
for i, n in enumerate(candidates)
|
||||
if "following_stacked" in (n.resource_id or "")
|
||||
or "following" in (n.content_desc or "").lower()
|
||||
or "following" in (n.text or "").lower()
|
||||
]
|
||||
|
||||
assert len(following_nodes) > 0, (
|
||||
@@ -127,14 +134,17 @@ def test_telepathic_engine_finds_following_node_on_profile():
|
||||
)
|
||||
|
||||
idx, correct_node = following_nodes[0]
|
||||
assert "991" in (correct_node.content_desc or "") or "following" in (correct_node.content_desc or "").lower(), (
|
||||
f"Found node does not look like the following counter: {correct_node}"
|
||||
)
|
||||
assert (
|
||||
"991" in (correct_node.content_desc or "")
|
||||
or "following" in (correct_node.content_desc or "").lower()
|
||||
or "following" in (correct_node.text or "").lower()
|
||||
), f"Found node does not look like the following counter: {correct_node}"
|
||||
|
||||
# Verify it's NOT the followers node (the common VLM confusion)
|
||||
assert "followers" not in (correct_node.content_desc or "").lower(), (
|
||||
f"Got the FOLLOWERS node instead of FOLLOWING! desc={correct_node.content_desc}"
|
||||
)
|
||||
assert (
|
||||
"followers" not in (correct_node.content_desc or "").lower()
|
||||
and "followers" not in (correct_node.text or "").lower()
|
||||
), f"Got the FOLLOWERS node instead of FOLLOWING! desc={correct_node.content_desc}"
|
||||
|
||||
|
||||
def test_following_vs_followers_are_both_candidates():
|
||||
@@ -148,13 +158,17 @@ def test_following_vs_followers_are_both_candidates():
|
||||
candidates = engine._parser.get_clickable_nodes(root)
|
||||
|
||||
followers_found = any(
|
||||
"followers" in (n.content_desc or "").lower()
|
||||
for n in candidates
|
||||
"followers" in (n.content_desc or "").lower() or "followers" in (n.text or "").lower() for n in candidates
|
||||
)
|
||||
following_found = any(
|
||||
n for n in candidates
|
||||
n
|
||||
for n in candidates
|
||||
if "following_stacked" in (n.resource_id or "")
|
||||
or ("following" in (n.content_desc or "").lower() and "followers" not in (n.content_desc or "").lower())
|
||||
or (
|
||||
("following" in (n.content_desc or "").lower() or "following" in (n.text or "").lower())
|
||||
and "followers" not in (n.content_desc or "").lower()
|
||||
and "followers" not in (n.text or "").lower()
|
||||
)
|
||||
)
|
||||
|
||||
assert followers_found, "Followers counter not in candidates"
|
||||
@@ -200,9 +214,7 @@ def test_vlm_prompt_humanizes_content_desc():
|
||||
text = node.text or ""
|
||||
desc = _humanize_desc(node.content_desc or "")
|
||||
res_id = node.resource_id or ""
|
||||
node_context.append(
|
||||
f"[{i}] text='{text}', desc='{desc}', id='{res_id}', bounds=[{node.y1},{node.y2}]"
|
||||
)
|
||||
node_context.append(f"[{i}] text='{text}', desc='{desc}', id='{res_id}', bounds=[{node.y1},{node.y2}]")
|
||||
|
||||
context_str = "\n".join(node_context)
|
||||
|
||||
@@ -211,13 +223,13 @@ def test_vlm_prompt_humanizes_content_desc():
|
||||
assert "following" in context_str.lower(), "VLM context is missing following node"
|
||||
|
||||
# The humanized desc should contain spaces between number and word
|
||||
assert "991 following" in context_str or "991following" not in context_str, (
|
||||
"content-desc was NOT humanized — VLM will confuse followers/following"
|
||||
)
|
||||
assert (
|
||||
"991 following" in context_str or "991following" not in context_str
|
||||
), "content-desc was NOT humanized — VLM will confuse followers/following"
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_live_vlm_selects_following_not_followers():
|
||||
def test_live_vlm_selects_following_not_followers(make_real_device_with_image):
|
||||
"""
|
||||
LIVE LLM TEST: Calls the real local Ollama to prove the VLM
|
||||
correctly picks the 'following' node (not 'followers') when asked
|
||||
@@ -228,80 +240,42 @@ def test_live_vlm_selects_following_not_followers():
|
||||
|
||||
Requires: Ollama running locally with qwen3.5:latest or llava:latest
|
||||
"""
|
||||
import json
|
||||
import re
|
||||
from GramAddict.core.llm_provider import query_telepathic_llm
|
||||
from GramAddict.core.config import Config
|
||||
|
||||
xml = _load_profile_xml()
|
||||
|
||||
# We need a dummy image for _build_spatial_map.
|
||||
# The image is only used for drawing the boxes, so a dummy is fine.
|
||||
from PIL import Image
|
||||
|
||||
dummy_img = Image.new("RGB", (1080, 2400))
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
|
||||
resolver = IntentResolver()
|
||||
|
||||
# This perfectly mimics production: XML -> Parser -> Deduplication
|
||||
engine = TelepathicEngine()
|
||||
root = engine._parser.parse(xml)
|
||||
candidates = engine._parser.get_clickable_nodes(root)
|
||||
|
||||
# Filter like production IntentResolver
|
||||
filtered = [n for n in candidates if n.area < 500000]
|
||||
device = make_real_device_with_image(dummy_img)
|
||||
|
||||
def _humanize_desc(raw: str) -> str:
|
||||
if not raw:
|
||||
return ""
|
||||
# "991following" → "991 following", "140Kfollowers" → "140K followers"
|
||||
# Matches digit (with optional K/M/B suffix) directly followed by a lowercase word
|
||||
return re.sub(r"(\d[KMBkmb]?)([a-z])", r"\1 \2", raw)
|
||||
intent = "tap 'following' list"
|
||||
|
||||
# Build node context exactly like production code
|
||||
node_context = []
|
||||
for i, node in enumerate(filtered):
|
||||
text = node.text or ""
|
||||
desc = _humanize_desc(node.content_desc or "")
|
||||
res_id = node.resource_id or ""
|
||||
node_context.append(f"[{i}] text='{text}', desc='{desc}', id='{res_id}', bounds=[{node.y1},{node.y2}]")
|
||||
# We test the ACTUAL intent resolution pipeline, no prompt engineering lies.
|
||||
# We do NOT catch exceptions to skip. If Ollama is down, the test FAILS.
|
||||
selected_node = resolver.resolve(intent, candidates, device)
|
||||
|
||||
intent = "tap following list"
|
||||
prompt = (
|
||||
f"You are a Spatial UI Intent Resolver.\n"
|
||||
f"Goal: Find the single best UI element to interact with to satisfy the intent: '{intent}'.\n"
|
||||
f"CRITICAL RULES:\n"
|
||||
f"- If the intent is about opening the 'post author', STRICTLY require 'row_feed_photo_profile' in the ID. Do not select comment authors.\n"
|
||||
f"- If the intent is about opening a user profile generally, prioritize nodes containing 'profile_name' or 'profile_image' in their ID, NOT generic action bars or tabs.\n"
|
||||
f"- Ignore bottom navigation tabs (home, search, profile) UNLESS the intent explicitly asks to navigate to a primary feed.\n"
|
||||
f"- CRITICAL: 'followers' and 'following' are DIFFERENT concepts. 'followers' = people who follow you. 'following' = people you follow. Read the desc and id fields CAREFULLY to select the correct one.\n"
|
||||
f"Candidates:\n" + "\n".join(node_context) + "\n\n"
|
||||
"Reply ONLY with a valid JSON object strictly matching this schema:\n"
|
||||
'{"selected_index": <integer or null>}\n'
|
||||
"If none of the candidates match the intent, return null."
|
||||
)
|
||||
|
||||
cfg = Config()
|
||||
model = getattr(cfg.args, "ai_telepathic_model", "qwen3.5:latest")
|
||||
url = getattr(cfg.args, "ai_telepathic_url", "http://localhost:11434/api/generate")
|
||||
|
||||
try:
|
||||
res = query_telepathic_llm(
|
||||
model=model,
|
||||
url=url,
|
||||
system_prompt="Strict JSON intent resolver.",
|
||||
user_prompt=prompt,
|
||||
use_local_edge=True,
|
||||
)
|
||||
except Exception as e:
|
||||
pytest.skip(f"Ollama not available: {e}")
|
||||
|
||||
data = json.loads(res)
|
||||
idx = data.get("selected_index")
|
||||
|
||||
assert idx is not None, f"VLM returned null — couldn't find ANY following node. Response: {res}"
|
||||
assert 0 <= idx < len(filtered), f"VLM returned out-of-bounds index {idx}"
|
||||
|
||||
selected_node = filtered[idx]
|
||||
assert selected_node is not None, "VLM returned null — couldn't find ANY following node."
|
||||
selected_desc = (selected_node.content_desc or "").lower()
|
||||
selected_text = (selected_node.text or "").lower()
|
||||
selected_id = (selected_node.resource_id or "").lower()
|
||||
|
||||
# THE CRITICAL ASSERTION: Must be "following", NOT "followers"
|
||||
assert "following" in selected_id or "following" in selected_desc, (
|
||||
f"VLM selected wrong node! Got: desc='{selected_node.content_desc}', id='{selected_node.resource_id}'. "
|
||||
f"Expected a node with 'following' in desc or id."
|
||||
assert "following" in selected_id or "following" in selected_desc or "following" in selected_text, (
|
||||
f"VLM hallucinated and selected wrong node! Got: desc='{selected_node.content_desc}', text='{selected_node.text}', id='{selected_node.resource_id}'. "
|
||||
f"This proves the local VLM failed the negative constraint."
|
||||
)
|
||||
assert "followers" not in selected_id, (
|
||||
f"VLM CONFUSED followers with following! Selected: id='{selected_node.resource_id}'"
|
||||
)
|
||||
|
||||
assert (
|
||||
"followers" not in selected_id
|
||||
), f"VLM CONFUSED followers with following! Selected: id='{selected_node.resource_id}'"
|
||||
|
||||
55
tests/e2e/test_nav_engagement.py
Normal file
@@ -0,0 +1,55 @@
|
||||
"""
|
||||
Engagement Navigation Tests
|
||||
Tests the Visual Intent Resolver on Engagement workflows like saving posts and commenting.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
|
||||
def run_workflow_test(fixture_base_name, intent, expected_desc_or_id, make_real_device_with_image):
|
||||
xml_path = f"tests/fixtures/{fixture_base_name}.xml"
|
||||
jpg_path = f"tests/fixtures/{fixture_base_name}.jpg"
|
||||
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image(jpg_path)
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Execute real LLM call, NO MOCKING
|
||||
result = resolver.resolve(intent, candidates, device)
|
||||
|
||||
assert result is not None, f"VLM returned None for '{intent}'"
|
||||
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
text = (result.text or "").lower()
|
||||
|
||||
matched = False
|
||||
for expected in expected_desc_or_id.split("|"):
|
||||
expected = expected.strip().lower()
|
||||
if expected in rid or expected in desc or expected in text:
|
||||
matched = True
|
||||
break
|
||||
|
||||
assert matched, (
|
||||
f"VLM picked wrong element! Expected one of '{expected_desc_or_id}', "
|
||||
f"but got id='{rid}', desc='{desc}', text='{text}'"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_carousel_save(make_real_device_with_image):
|
||||
run_workflow_test("carousel_post_dump", "tap 'Add to Saved' button", "saved", make_real_device_with_image)
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_comment_sheet_input(make_real_device_with_image):
|
||||
run_workflow_test("comment_sheet", "write a comment", "comment", make_real_device_with_image)
|
||||
107
tests/e2e/test_nav_home_feed.py
Normal file
@@ -0,0 +1,107 @@
|
||||
"""
|
||||
E2E Test: Home Feed Navigation
|
||||
Validates that the IntentResolver and TelepathicEngine can correctly navigate
|
||||
the home feed using a REAL XML dump, without relying on legacy mocks.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
|
||||
def _load_home_feed_xml():
|
||||
with open("tests/fixtures/home_feed_with_ad.xml", "r", encoding="utf-8") as f:
|
||||
return f.read()
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_home_feed_like_button_extraction(make_real_device_with_image):
|
||||
"""
|
||||
Tests if the VLM can find the like button on a real home feed dump.
|
||||
"""
|
||||
xml = _load_home_feed_xml()
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image("tests/fixtures/home_feed_with_ad.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
result = resolver.resolve("tap like button", candidates, device)
|
||||
|
||||
assert result is not None, "Visual discovery returned None for 'tap like button' on Home Feed"
|
||||
|
||||
def _node_has_marker(node, marker: str) -> bool:
|
||||
rid = (node.resource_id or "").lower()
|
||||
desc = (node.content_desc or "").lower()
|
||||
if marker in rid or marker in desc:
|
||||
return True
|
||||
for child in node.children:
|
||||
if _node_has_marker(child, marker):
|
||||
return True
|
||||
return False
|
||||
|
||||
assert _node_has_marker(result, "like_button") or _node_has_marker(result, "like"), (
|
||||
f"VLM picked WRONG element for 'tap like button'!\n"
|
||||
f" Selected: id='{result.resource_id}', desc='{result.content_desc}', "
|
||||
f"text='{result.text}'"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_home_feed_post_author_extraction(make_real_device_with_image):
|
||||
"""
|
||||
Tests if the VLM can identify the post author's header/username.
|
||||
"""
|
||||
xml = _load_home_feed_xml()
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image("tests/fixtures/home_feed_with_ad.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
result = resolver.resolve("tap 'Profile picture' of the author", candidates, device)
|
||||
|
||||
assert result is not None, "Visual discovery returned None for 'tap Profile picture of the author'"
|
||||
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
text = (result.text or "").lower()
|
||||
|
||||
is_author = "row_feed_photo_profile_name" in rid or "millionlords" in desc or "millionlords" in text
|
||||
assert is_author, f"VLM picked wrong element! Selected id='{rid}', desc='{desc}', text='{text}'"
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_home_feed_comment_button_extraction(make_real_device_with_image):
|
||||
"""
|
||||
Tests if the VLM can find the comment button to open the comment sheet.
|
||||
"""
|
||||
xml = _load_home_feed_xml()
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image("tests/fixtures/home_feed_with_ad.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
result = resolver.resolve("tap 'comment' button", candidates, device)
|
||||
|
||||
assert result is not None, "Visual discovery returned None for 'tap comment button'"
|
||||
|
||||
def _node_has_marker(node, marker: str) -> bool:
|
||||
rid = (node.resource_id or "").lower()
|
||||
desc = (node.content_desc or "").lower()
|
||||
if marker in rid or marker in desc:
|
||||
return True
|
||||
for child in node.children:
|
||||
if _node_has_marker(child, marker):
|
||||
return True
|
||||
return False
|
||||
|
||||
assert _node_has_marker(result, "comment"), (
|
||||
f"VLM picked WRONG element for 'tap comment button'!\n"
|
||||
f" Selected: id='{result.resource_id}', desc='{result.content_desc}'"
|
||||
)
|
||||
57
tests/e2e/test_nav_messaging.py
Normal file
@@ -0,0 +1,57 @@
|
||||
"""
|
||||
Messaging Navigation Tests
|
||||
Tests the Visual Intent Resolver on DM Inbox and DM Thread workflows.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
|
||||
def run_workflow_test(fixture_base_name, intent, expected_desc_or_id, make_real_device_with_image):
|
||||
xml_path = f"tests/fixtures/{fixture_base_name}.xml"
|
||||
jpg_path = f"tests/fixtures/{fixture_base_name}.jpg"
|
||||
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image(jpg_path)
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Execute real LLM call, NO MOCKING
|
||||
result = resolver.resolve(intent, candidates, device)
|
||||
|
||||
assert result is not None, f"VLM returned None for '{intent}'"
|
||||
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
text = (result.text or "").lower()
|
||||
|
||||
matched = False
|
||||
for expected in expected_desc_or_id.split("|"):
|
||||
expected = expected.strip().lower()
|
||||
if expected in rid or expected in desc or expected in text:
|
||||
matched = True
|
||||
break
|
||||
|
||||
assert matched, (
|
||||
f"VLM picked wrong element! Expected one of '{expected_desc_or_id}', "
|
||||
f"but got id='{rid}', desc='{desc}', text='{text}'"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_dm_inbox_new_message(make_real_device_with_image):
|
||||
run_workflow_test(
|
||||
"dm_inbox_dump", "tap 'New Message' icon at top", "new message|options_text_view", make_real_device_with_image
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_dm_thread_input(make_real_device_with_image):
|
||||
run_workflow_test("dm_thread_dump", "tap message input", "message", make_real_device_with_image)
|
||||
50
tests/e2e/test_nav_profile.py
Normal file
@@ -0,0 +1,50 @@
|
||||
"""
|
||||
Profile Navigation Tests
|
||||
Tests the Visual Intent Resolver on Profile workflows.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
|
||||
def run_workflow_test(fixture_base_name, intent, expected_desc_or_id, make_real_device_with_image):
|
||||
xml_path = f"tests/fixtures/{fixture_base_name}.xml"
|
||||
jpg_path = f"tests/fixtures/{fixture_base_name}.jpg"
|
||||
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image(jpg_path)
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Execute real LLM call, NO MOCKING
|
||||
result = resolver.resolve(intent, candidates, device)
|
||||
|
||||
assert result is not None, f"VLM returned None for '{intent}'"
|
||||
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
text = (result.text or "").lower()
|
||||
|
||||
matched = False
|
||||
for expected in expected_desc_or_id.split("|"):
|
||||
expected = expected.strip().lower()
|
||||
if expected in rid or expected in desc or expected in text:
|
||||
matched = True
|
||||
break
|
||||
|
||||
assert matched, (
|
||||
f"VLM picked wrong element! Expected one of '{expected_desc_or_id}', "
|
||||
f"but got id='{rid}', desc='{desc}', text='{text}'"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_profile_followers(make_real_device_with_image):
|
||||
run_workflow_test("user_profile_dump", "tap 'followers' count", "followers", make_real_device_with_image)
|
||||
220
tests/e2e/test_nav_reels.py
Normal file
@@ -0,0 +1,220 @@
|
||||
"""
|
||||
Reel Interaction Tests — The Tests That Must Match Reality
|
||||
|
||||
These tests reproduce the EXACT failures from production (2026-04-27 15:55):
|
||||
1. VLM selected POST CAPTION for "tap like button" (caption contained word "like")
|
||||
2. VLM selected COMMENT INPUT for "tap follow button" (follow button doesn't exist on Reels)
|
||||
3. ActionMemory falsely confirmed success for both
|
||||
|
||||
These tests use the REAL reels_feed_dump.xml fixture and call the REAL VLM.
|
||||
If the VLM makes wrong decisions, these tests MUST fail RED.
|
||||
No mocks. No fakes. No synthetic screenshots. Pure production truth.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
|
||||
def _load_reel_xml():
|
||||
with open("tests/fixtures/reels_feed_dump.xml", "r", encoding="utf-8") as f:
|
||||
return f.read()
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# TEST 1: "tap like button" must select the HEART, not the caption
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_reel_like_button_not_caption(make_real_device_with_image):
|
||||
"""
|
||||
PRODUCTION BUG: VLM selected the caption ('would you like to try this...')
|
||||
instead of the heart icon for 'tap like button'.
|
||||
|
||||
The word "like" in the caption is a TRAP. The VLM must visually
|
||||
identify the heart ♡ icon on the right side, not grep for "like" in text.
|
||||
|
||||
This test MUST be RED until the VLM correctly identifies UI buttons.
|
||||
"""
|
||||
xml = _load_reel_xml()
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image("tests/fixtures/reels_feed_dump.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
result = resolver.resolve("tap like button", candidates, device)
|
||||
|
||||
assert result is not None, "Visual discovery returned None for 'tap like button' on Reel"
|
||||
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
|
||||
# Must be the actual like_button, NOT the caption
|
||||
assert "like_button" in rid or (desc == "like"), (
|
||||
f"VLM picked WRONG element for 'tap like button'!\n"
|
||||
f" Selected: id='{result.resource_id}', desc='{result.content_desc}', "
|
||||
f"text='{result.text}'\n"
|
||||
f" Expected: id containing 'like_button' or desc='Like'"
|
||||
)
|
||||
|
||||
# Must NOT be the caption that contains the word "like" in its text
|
||||
assert "masterclass" not in desc and "would you" not in desc, (
|
||||
f"VLM selected the CAPTION instead of the like button!\n" f" Selected desc: '{result.content_desc}'"
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# TEST 2: "tap follow button" must return None when no Follow button exists
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_reel_follow_button_returns_none_when_absent(make_real_device_with_image):
|
||||
"""
|
||||
PRODUCTION BUG: VLM selected the comment input field ('Add comment…')
|
||||
for 'tap follow button' because there IS no follow button on Reels.
|
||||
|
||||
The correct behavior is to return None — "I can't find a follow button
|
||||
on this screen". The bot should then navigate to the profile first.
|
||||
|
||||
This test MUST be RED until the VLM correctly returns null/None.
|
||||
"""
|
||||
xml = _load_reel_xml()
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image("tests/fixtures/reels_feed_dump.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
result = resolver.resolve("tap follow button", candidates, device)
|
||||
|
||||
if result is not None:
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
text = (result.text or "").lower()
|
||||
|
||||
# If it returns something, it MUST be an actual follow button
|
||||
assert "follow" in rid or "follow" in text or "follow" in desc, (
|
||||
f"VLM hallucinated a follow button that doesn't exist on Reels!\n"
|
||||
f" Selected: id='{result.resource_id}', desc='{result.content_desc}', "
|
||||
f"text='{result.text}'\n"
|
||||
f" Expected: None (no follow button on Reel screen) or an element "
|
||||
f"with 'follow' in its id/text"
|
||||
)
|
||||
|
||||
# Must NEVER select the comment composer
|
||||
assert "comment" not in rid, (
|
||||
f"VLM selected comment field for 'tap follow button'!\n" f" Selected: id='{result.resource_id}'"
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# TEST 3: "post author username" must select the actual username
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_reel_post_author_selects_username(make_real_device_with_image):
|
||||
"""
|
||||
PRODUCTION BUG: VLM selected the action_bar container for 'post author header'.
|
||||
|
||||
On a Reel, the author username is in the bottom-left area
|
||||
(clips_author_username / clips_author_info_component).
|
||||
The VLM must visually identify the username text, not the top action bar.
|
||||
"""
|
||||
xml = _load_reel_xml()
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image("tests/fixtures/reels_feed_dump.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
result = resolver.resolve("tap 'Profile picture' of the author", candidates, device)
|
||||
|
||||
assert result is not None, "Visual discovery returned None for author profile picture on Reel"
|
||||
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
text = (result.text or "").lower()
|
||||
|
||||
# Must be the author info component or username, NOT the top action bar
|
||||
is_author = "author" in rid or "cappadocia.cowboy" in desc or "cappadocia.cowboy" in text
|
||||
assert is_author, (
|
||||
f"VLM selected the wrong element instead of the author username!\n"
|
||||
f"Selected id='{rid}', desc='{desc}', text='{text}'"
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# TEST 4: Dedup preserves the like button as a distinct box
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
|
||||
def test_reel_dedup_preserves_like_button(make_real_device_with_image):
|
||||
"""
|
||||
The spatial dedup must NOT suppress the like_button.
|
||||
If the like_button is inside a parent container and gets deduped,
|
||||
the VLM will never see it as an option.
|
||||
"""
|
||||
xml = _load_reel_xml()
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image("tests/fixtures/reels_feed_dump.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
_, box_map = resolver._annotate_screenshot_with_candidates(device, candidates)
|
||||
|
||||
# Find the like_button in the box_map
|
||||
like_boxes = [(idx, node) for idx, node in box_map.items() if "like_button" in (node.resource_id or "").lower()]
|
||||
|
||||
assert len(like_boxes) >= 1, "Like button was SUPPRESSED by dedup! Available boxes:\n" + "\n".join(
|
||||
f" [{idx}] id='{n.resource_id}', desc='{n.content_desc}'" for idx, n in sorted(box_map.items())
|
||||
)
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# TEST 5: Caption with "like" word must NOT be confused with like button
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
|
||||
def test_reel_caption_with_like_word_is_not_like_button(make_real_device_with_image):
|
||||
"""
|
||||
The reel fixture has a caption: 'would you like to try this line?'
|
||||
This text contains the word "like" but is NOT a like button.
|
||||
|
||||
This test verifies that the dedup/annotation correctly creates
|
||||
SEPARATE boxes for the caption and the like button.
|
||||
"""
|
||||
xml = _load_reel_xml()
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image("tests/fixtures/reels_feed_dump.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
_, box_map = resolver._annotate_screenshot_with_candidates(device, candidates)
|
||||
|
||||
caption_boxes = [
|
||||
(idx, node)
|
||||
for idx, node in box_map.items()
|
||||
if "would you" in (node.content_desc or "").lower() or "masterclass" in (node.content_desc or "").lower()
|
||||
]
|
||||
|
||||
like_button_boxes = [
|
||||
(idx, node) for idx, node in box_map.items() if "like_button" in (node.resource_id or "").lower()
|
||||
]
|
||||
|
||||
# Both must exist as SEPARATE boxes
|
||||
if caption_boxes and like_button_boxes:
|
||||
caption_idx = caption_boxes[0][0]
|
||||
like_idx = like_button_boxes[0][0]
|
||||
assert caption_idx != like_idx, "Caption and like button have the same box number!"
|
||||
80
tests/e2e/test_nav_search_explore.py
Normal file
@@ -0,0 +1,80 @@
|
||||
"""
|
||||
Search and Explore Navigation Tests
|
||||
Tests the Visual Intent Resolver on Search and Explore feed workflows.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.perception.intent_resolver import IntentResolver
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
|
||||
def run_workflow_test(fixture_base_name, intent, expected_desc_or_id, make_real_device_with_image):
|
||||
xml_path = f"tests/fixtures/{fixture_base_name}.xml"
|
||||
jpg_path = f"tests/fixtures/{fixture_base_name}.jpg"
|
||||
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image(jpg_path)
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Execute real LLM call, NO MOCKING
|
||||
result = resolver.resolve(intent, candidates, device)
|
||||
|
||||
assert result is not None, f"VLM returned None for '{intent}'"
|
||||
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
text = (result.text or "").lower()
|
||||
|
||||
matched = False
|
||||
for expected in expected_desc_or_id.split("|"):
|
||||
expected = expected.strip().lower()
|
||||
if expected in rid or expected in desc or expected in text:
|
||||
matched = True
|
||||
break
|
||||
|
||||
assert matched, (
|
||||
f"VLM picked wrong element! Expected one of '{expected_desc_or_id}', "
|
||||
f"but got id='{rid}', desc='{desc}', text='{text}'"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_search_input(make_real_device_with_image):
|
||||
run_workflow_test(
|
||||
"search_feed_dump", "tap the search input field at the top of the screen", "search", make_real_device_with_image
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_explore_feed_first_post(make_real_device_with_image):
|
||||
# It might pick an image ID or content-desc. Just checking it's not None.
|
||||
xml_path = "tests/fixtures/explore_feed_dump.xml"
|
||||
jpg_path = "tests/fixtures/explore_feed_dump.jpg"
|
||||
|
||||
with open(xml_path, "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = make_real_device_with_image(jpg_path)
|
||||
resolver = IntentResolver()
|
||||
|
||||
result = resolver.resolve("tap first post", candidates, device)
|
||||
assert result is not None, "VLM returned None for 'tap first post'"
|
||||
|
||||
# Strictly verify that it picked an image button or post, NOT the search bar
|
||||
rid = (result.resource_id or "").lower()
|
||||
desc = (result.content_desc or "").lower()
|
||||
|
||||
# A valid grid post has an image_button resource ID or "photo" / "Reel" in description
|
||||
is_valid_post = "image_button" in rid or "photo" in desc or "reel" in desc
|
||||
assert is_valid_post, f"VLM picked the wrong element! Selected id='{rid}', desc='{desc}'"
|
||||
@@ -1,226 +0,0 @@
|
||||
import xml.etree.ElementTree as ET
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from GramAddict.core.device_facade import DeviceFacade
|
||||
from GramAddict.core.goap import GoalExecutor
|
||||
from GramAddict.core.qdrant_memory import QdrantBase
|
||||
from GramAddict.core.telepathic_engine import TelepathicEngine
|
||||
|
||||
|
||||
class AndroidEnvironmentSimulator(DeviceFacade):
|
||||
def __init__(self, device_id="sim", app_id="com.instagram.android", args=None):
|
||||
self.device_id = device_id
|
||||
self.app_id = app_id
|
||||
self.args = args
|
||||
self.deviceV2 = MagicMock()
|
||||
self.deviceV2.info = {"displayWidth": 1080, "displayHeight": 2400, "screenOn": True}
|
||||
|
||||
self.state_stack = ["home_feed"]
|
||||
self.state_files = {
|
||||
"home_feed": "tests/fixtures/home_feed_with_ad.xml",
|
||||
"explore_grid": "tests/fixtures/explore_feed_dump.xml",
|
||||
"post_detail": "tests/fixtures/organic_post.xml",
|
||||
"user_profile": "tests/fixtures/user_profile_dump.xml",
|
||||
}
|
||||
|
||||
def _current_state(self):
|
||||
return self.state_stack[-1]
|
||||
|
||||
def dump_hierarchy(self):
|
||||
current = self._current_state()
|
||||
filepath = self.state_files[current]
|
||||
with open(filepath, "r", encoding="utf-8") as f:
|
||||
data = f.read()
|
||||
print(f"📱 [Simulator] dump_hierarchy returning state: {current} (length: {len(data)})")
|
||||
return data
|
||||
|
||||
def _parse_bounds(self, bounds_str):
|
||||
import re
|
||||
|
||||
match = re.match(r"\[(\d+),(\d+)\]\[(\d+),(\d+)\]", bounds_str)
|
||||
if match:
|
||||
return [int(x) for x in match.groups()]
|
||||
return None
|
||||
|
||||
def human_click(self, x, y):
|
||||
# Simulate click translation to next state
|
||||
xml_data = self.dump_hierarchy()
|
||||
root = ET.fromstring(xml_data)
|
||||
|
||||
clicked_nodes = []
|
||||
for node in root.iter("node"):
|
||||
bounds_str = node.attrib.get("bounds", "")
|
||||
bounds = self._parse_bounds(bounds_str)
|
||||
if bounds:
|
||||
x1, y1, x2, y2 = bounds
|
||||
if x1 <= x <= x2 and y1 <= y <= y2:
|
||||
area = (x2 - x1) * (y2 - y1)
|
||||
clicked_nodes.append((area, node))
|
||||
|
||||
if not clicked_nodes:
|
||||
return
|
||||
|
||||
clicked_nodes.sort(key=lambda item: item[0])
|
||||
|
||||
for _, target in clicked_nodes:
|
||||
content_desc = target.attrib.get("content-desc", "") or ""
|
||||
res_id = target.attrib.get("resource-id", "") or ""
|
||||
target.attrib.get("text", "") or ""
|
||||
|
||||
current = self._current_state()
|
||||
if current == "home_feed":
|
||||
if "Search and explore" in content_desc or "search_tab" in res_id:
|
||||
print(f"📱 [Simulator] Clicked ({x}, {y}) on {res_id}. Transition: home_feed -> explore_grid")
|
||||
self.state_stack.append("explore_grid")
|
||||
return
|
||||
elif current == "explore_grid":
|
||||
# In explore, anything the VLM clicks that has an image or button is likely a post
|
||||
if "image_button" in res_id or "container" in res_id or target.attrib.get("clickable") == "true":
|
||||
print(f"📱 [Simulator] Clicked ({x}, {y}) on {res_id}. Transition: explore_grid -> post_detail")
|
||||
self.state_stack.append("post_detail")
|
||||
return
|
||||
elif current == "post_detail":
|
||||
# Allow clicking either the post author or the comment author (both go to user_profile)
|
||||
if 100 < x < 800 and 300 < y < 900:
|
||||
print(f"📱 [Simulator] Clicked ({x}, {y}) on {res_id}. Transition: post_detail -> user_profile")
|
||||
self.state_stack.append("user_profile")
|
||||
return
|
||||
|
||||
# If we get here, no transition happened
|
||||
for _, target in clicked_nodes:
|
||||
print(
|
||||
f"📱 [Simulator] Click ({x}, {y}) fell through on: {target.attrib.get('resource-id')} / text={target.attrib.get('text')}"
|
||||
)
|
||||
if not clicked_nodes:
|
||||
print(f"📱 [Simulator] Click ({x}, {y}) fell outside ALL elements!")
|
||||
|
||||
def click(self, x=None, y=None, obj=None):
|
||||
if x is not None and y is not None:
|
||||
self.human_click(x, y)
|
||||
elif obj and isinstance(obj, dict) and "x" in obj:
|
||||
self.human_click(obj["x"], obj["y"])
|
||||
|
||||
def press(self, key):
|
||||
if key == "back":
|
||||
if len(self.state_stack) > 1:
|
||||
old_state = self.state_stack.pop()
|
||||
print(f"📱 [Simulator] Back pressed. State Transition: {old_state} -> {self._current_state()}")
|
||||
else:
|
||||
print("📱 [Simulator] Back pressed at root state.")
|
||||
|
||||
def _get_current_app(self):
|
||||
return self.app_id
|
||||
|
||||
def get_info(self):
|
||||
return self.deviceV2.info
|
||||
|
||||
def wake_up(self):
|
||||
pass
|
||||
|
||||
def unlock(self):
|
||||
pass
|
||||
|
||||
def shell(self, cmd):
|
||||
return ""
|
||||
|
||||
def swipe(self, sx, sy, ex, ey, duration=None):
|
||||
print(f"📱 [Simulator] Swiped ({sx}, {sy}) -> ({ex}, {ey})")
|
||||
|
||||
def human_swipe(self, sx, sy, ex, ey, duration=None):
|
||||
print(f"📱 [Simulator] Swiped ({sx}, {sy}) -> ({ex}, {ey})")
|
||||
|
||||
@property
|
||||
def info(self):
|
||||
return self.deviceV2.info
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def e2e_qdrant_mock(request, monkeypatch):
|
||||
"""Override the global e2e_qdrant_mock fixture to allow REAL Qdrant in this module."""
|
||||
yield None
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def setup_qdrant_isolation():
|
||||
"""Prefix all Qdrant collections with test_sim_ so we don't pollute live data."""
|
||||
original_init = QdrantBase.__init__
|
||||
|
||||
def mocked_init(self, collection_name, *args, **kwargs):
|
||||
test_collection = f"test_sim_{collection_name}"
|
||||
original_init(self, test_collection, *args, **kwargs)
|
||||
|
||||
with patch.object(QdrantBase, "__init__", new=mocked_init):
|
||||
# We aggressively wipe ALL test collections before running the test!
|
||||
from qdrant_client import QdrantClient
|
||||
|
||||
try:
|
||||
client = QdrantClient(url="http://localhost:6344", timeout=5.0)
|
||||
collections = client.get_collections().collections
|
||||
for c in collections:
|
||||
if c.name.startswith("test_sim_"):
|
||||
client.delete_collection(c.name)
|
||||
except Exception:
|
||||
pass
|
||||
yield
|
||||
|
||||
|
||||
def test_full_autonomous_sim_loop(monkeypatch):
|
||||
"""
|
||||
This test runs the real GoalExecutor with the real TelepathicEngine (VLM)
|
||||
and real Qdrant (sandboxed via prefix) against a simulated Android environment.
|
||||
"""
|
||||
import urllib.request
|
||||
|
||||
try:
|
||||
urllib.request.urlopen("http://localhost:11434/", timeout=2)
|
||||
except Exception:
|
||||
pytest.skip("Ollama is not running. Live E2E sim requires LLM backend.")
|
||||
|
||||
# 1. Create Simulator
|
||||
sim_device = AndroidEnvironmentSimulator()
|
||||
|
||||
# 2. Patch TelepathicEngine to NOT be mocked by conftest
|
||||
engine = TelepathicEngine()
|
||||
monkeypatch.setattr(TelepathicEngine, "get_instance", lambda: engine)
|
||||
|
||||
# 3. Create context and GoalExecutor
|
||||
from GramAddict.core.config import Config
|
||||
|
||||
if not hasattr(Config(), "args"):
|
||||
Config().args = MagicMock()
|
||||
Config().args.use_nav_memory = True
|
||||
Config().args.use_semantic_memory = True
|
||||
|
||||
executor = GoalExecutor(sim_device, bot_username="testbot")
|
||||
|
||||
# 4. Start an autonomous loop: We want to reach an organic post from the home feed
|
||||
assert sim_device._current_state() == "home_feed"
|
||||
|
||||
success = executor.achieve("open post", max_steps=10)
|
||||
assert success is True
|
||||
|
||||
# The VLM should have figured out:
|
||||
# 1. Tap explore tab -> switches to "explore_grid"
|
||||
# 2. Tap grid item -> switches to "post_detail"
|
||||
assert sim_device._current_state() == "post_detail"
|
||||
|
||||
# 5. Let's do another intent: view the user profile
|
||||
success = executor.achieve("open post author profile", max_steps=5)
|
||||
assert success is True
|
||||
assert sim_device._current_state() == "user_profile"
|
||||
|
||||
# 6. Now go back to the post
|
||||
success = executor.achieve("open post", max_steps=5)
|
||||
assert success is True
|
||||
assert sim_device._current_state() == "post_detail"
|
||||
|
||||
# 7. Check Qdrant Memory is actually populated
|
||||
# We should have stored the state transitions in the goap_paths collection
|
||||
from GramAddict.core.goap import PathMemory
|
||||
|
||||
nav_db = PathMemory("testbot")
|
||||
# verify at least some nodes exist
|
||||
count = nav_db._db.client.count(nav_db._db.collection_name).count
|
||||
assert count > 0, "Qdrant memory should have learned the paths!"
|
||||
@@ -15,9 +15,7 @@ No regex. No string matching. No content-desc parsing. Pure vision.
|
||||
"""
|
||||
|
||||
import base64
|
||||
import json
|
||||
from io import BytesIO
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -30,60 +28,12 @@ def _load_profile_xml():
|
||||
return f.read()
|
||||
|
||||
|
||||
def _make_mock_device_with_screenshot(width=1080, height=2400):
|
||||
"""Creates a mock device that returns a high-fidelity PIL Image as screenshot.
|
||||
|
||||
The text must be LARGE and CLEARLY READABLE by the VLM — small default
|
||||
Pillow fonts are invisible on a 1080x2400 canvas.
|
||||
"""
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
# Instagram-like dark profile background
|
||||
img = Image.new("RGB", (width, height), color=(18, 18, 18))
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
# Try to use a system font at realistic size; fall back to default scaled
|
||||
try:
|
||||
font_large = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", 48)
|
||||
font_label = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", 32)
|
||||
font_name = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", 40)
|
||||
except (OSError, IOError):
|
||||
font_large = ImageFont.load_default()
|
||||
font_label = font_large
|
||||
font_name = font_large
|
||||
|
||||
# Profile header area (white text on dark bg, like real Instagram)
|
||||
# Username
|
||||
draw.text((30, 60), "felixschreiner_", fill=(255, 255, 255), font=font_name)
|
||||
|
||||
# Posts counter: bounds [38,397][515,540]
|
||||
draw.rectangle([38, 397, 515, 540], fill=(30, 30, 30))
|
||||
draw.text((180, 410), "1,099", fill=(255, 255, 255), font=font_large)
|
||||
draw.text((200, 470), "posts", fill=(180, 180, 180), font=font_label)
|
||||
|
||||
# Followers counter: bounds [515,397][785,540]
|
||||
draw.rectangle([515, 397, 785, 540], fill=(30, 30, 30))
|
||||
draw.text((570, 410), "140K", fill=(255, 255, 255), font=font_large)
|
||||
draw.text((560, 470), "followers", fill=(180, 180, 180), font=font_label)
|
||||
|
||||
# Following counter: bounds [785,397][1038,540]
|
||||
draw.rectangle([785, 397, 1038, 540], fill=(30, 30, 30))
|
||||
draw.text((860, 410), "991", fill=(255, 255, 255), font=font_large)
|
||||
draw.text((840, 470), "following", fill=(180, 180, 180), font=font_label)
|
||||
|
||||
device = MagicMock()
|
||||
device.deviceV2 = MagicMock()
|
||||
device.deviceV2.screenshot.return_value = img
|
||||
device.deviceV2.info = {"displayWidth": width, "displayHeight": height}
|
||||
return device
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
# TEST 1: Visual Discovery produces an annotated image
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
def test_visual_discovery_creates_annotated_screenshot():
|
||||
def test_visual_discovery_creates_annotated_screenshot(make_real_device_with_image):
|
||||
"""
|
||||
The IntentResolver's visual discovery mode must:
|
||||
1. Take a screenshot from the device
|
||||
@@ -98,12 +48,10 @@ def test_visual_discovery_creates_annotated_screenshot():
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = _make_mock_device_with_screenshot()
|
||||
device = make_real_device_with_image("tests/fixtures/user_profile_dump.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
annotated_b64, box_map = resolver._annotate_screenshot_with_candidates(
|
||||
device, candidates
|
||||
)
|
||||
annotated_b64, box_map = resolver._annotate_screenshot_with_candidates(device, candidates)
|
||||
|
||||
# Must produce a non-empty base64 image
|
||||
assert annotated_b64 is not None
|
||||
@@ -114,20 +62,23 @@ def test_visual_discovery_creates_annotated_screenshot():
|
||||
from PIL import Image
|
||||
|
||||
img = Image.open(BytesIO(img_bytes))
|
||||
assert img.size == (1080, 2400)
|
||||
assert img.size == (1080, 2424)
|
||||
|
||||
# box_map must contain at least the followers and following nodes
|
||||
assert len(box_map) > 0, "No boxes were drawn on the screenshot"
|
||||
|
||||
# Verify both counter areas got boxes
|
||||
following_boxes = [
|
||||
idx for idx, node in box_map.items()
|
||||
if "following" in (node.content_desc or "").lower()
|
||||
idx
|
||||
for idx, node in box_map.items()
|
||||
if ("following" in (node.content_desc or "").lower() or "following" in (node.text or "").lower())
|
||||
and "followers" not in (node.content_desc or "").lower()
|
||||
and "followers" not in (node.text or "").lower()
|
||||
]
|
||||
followers_boxes = [
|
||||
idx for idx, node in box_map.items()
|
||||
if "followers" in (node.content_desc or "").lower()
|
||||
idx
|
||||
for idx, node in box_map.items()
|
||||
if "followers" in (node.content_desc or "").lower() or "followers" in (node.text or "").lower()
|
||||
]
|
||||
assert len(following_boxes) >= 1, "No box drawn around 'following' counter"
|
||||
assert len(followers_boxes) >= 1, "No box drawn around 'followers' counter"
|
||||
@@ -140,7 +91,7 @@ def test_visual_discovery_creates_annotated_screenshot():
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_visual_discovery_finds_following_by_seeing():
|
||||
def test_visual_discovery_finds_following_by_seeing(make_real_device_with_image):
|
||||
"""
|
||||
LIVE VLM TEST: The bot SEES a screenshot with numbered boxes
|
||||
and visually identifies which box is the "following" counter.
|
||||
@@ -153,12 +104,12 @@ def test_visual_discovery_finds_following_by_seeing():
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
device = _make_mock_device_with_screenshot()
|
||||
device = make_real_device_with_image("tests/fixtures/user_profile_dump.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Visual Discovery: Let the VLM SEE the screen
|
||||
result = resolver._visual_discovery(
|
||||
"tap following list",
|
||||
result = resolver.resolve(
|
||||
"tap 'following' list",
|
||||
candidates,
|
||||
device,
|
||||
)
|
||||
@@ -169,14 +120,12 @@ def test_visual_discovery_finds_following_by_seeing():
|
||||
selected_id = (result.resource_id or "").lower()
|
||||
selected_desc = (result.content_desc or "").lower()
|
||||
|
||||
assert "following" in selected_id or "following" in selected_desc, (
|
||||
f"Visual discovery picked wrong node! "
|
||||
f"Got: id='{result.resource_id}', desc='{result.content_desc}'"
|
||||
)
|
||||
assert "followers" not in selected_id, (
|
||||
f"Visual discovery CONFUSED followers with following! "
|
||||
f"Selected: id='{result.resource_id}'"
|
||||
)
|
||||
assert (
|
||||
"following" in selected_id or "following" in selected_desc
|
||||
), f"Visual discovery picked wrong node! Got: id='{result.resource_id}', desc='{result.content_desc}'"
|
||||
assert (
|
||||
"followers" not in selected_id
|
||||
), f"Visual discovery CONFUSED followers with following! Selected: id='{result.resource_id}'"
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════
|
||||
@@ -184,20 +133,69 @@ def test_visual_discovery_finds_following_by_seeing():
|
||||
# ═══════════════════════════════════════════════════════
|
||||
|
||||
|
||||
def test_resolve_uses_visual_discovery_when_device_available():
|
||||
@pytest.mark.live_llm
|
||||
def test_resolve_uses_text_vlm_fallback_when_no_device(make_real_device_with_xml):
|
||||
"""
|
||||
When a device is available (i.e., we can take screenshots),
|
||||
the resolver must use visual discovery as the PRIMARY path,
|
||||
not the text-based XML description approach.
|
||||
When called WITHOUT a device (device=None), resolve() must fall back
|
||||
to the text-based VLM resolution instead of visual discovery.
|
||||
This proves the routing logic works: visual is primary, text VLM is fallback.
|
||||
"""
|
||||
from GramAddict.core.perception.spatial_parser import SpatialNode
|
||||
|
||||
The text-based path is a fallback for when no device is available.
|
||||
"""
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Verify the method exists and is callable
|
||||
assert hasattr(resolver, "_visual_discovery"), (
|
||||
"IntentResolver is missing _visual_discovery method!"
|
||||
)
|
||||
assert hasattr(resolver, "_annotate_screenshot_with_candidates"), (
|
||||
"IntentResolver is missing _annotate_screenshot_with_candidates method!"
|
||||
# A single candidate with a clear profile_tab match
|
||||
candidates = [
|
||||
SpatialNode(
|
||||
resource_id="com.instagram.android:id/profile_tab",
|
||||
class_name="android.widget.FrameLayout",
|
||||
text="",
|
||||
content_desc="Profile",
|
||||
bounds=(800, 2200, 1000, 2400),
|
||||
clickable=True,
|
||||
)
|
||||
]
|
||||
|
||||
# Without device, resolve must still work via text VLM fallback
|
||||
result = resolver.resolve("tap profile tab", candidates, screen_height=2400)
|
||||
assert result is not None, "Text VLM fallback failed to find profile_tab without a device"
|
||||
assert result.resource_id == "com.instagram.android:id/profile_tab"
|
||||
|
||||
|
||||
@pytest.mark.live_llm
|
||||
def test_visual_discovery_finds_profile_tab_by_seeing(make_real_device_with_image):
|
||||
"""
|
||||
LIVE VLM TEST: The bot SEES a screenshot with numbered boxes
|
||||
and visually identifies which box is the 'profile tab'.
|
||||
This proves the prompt correctly guides the VLM to pick bottom navigation tabs
|
||||
without hardcoding resource IDs.
|
||||
"""
|
||||
from GramAddict.core.perception.spatial_parser import SpatialParser
|
||||
|
||||
with open("tests/fixtures/home_feed_with_ad.xml", "r", encoding="utf-8") as f:
|
||||
xml = f.read()
|
||||
|
||||
parser = SpatialParser()
|
||||
root = parser.parse(xml)
|
||||
candidates = parser.get_clickable_nodes(root)
|
||||
|
||||
# Use a real image so the VLM can actually see the UI
|
||||
device = make_real_device_with_image("tests/fixtures/home_feed_with_ad.jpg")
|
||||
resolver = IntentResolver()
|
||||
|
||||
# Visual Discovery: Let the VLM SEE the screen
|
||||
result = resolver.resolve(
|
||||
"tap profile tab",
|
||||
candidates,
|
||||
device,
|
||||
)
|
||||
|
||||
assert result is not None, "Visual discovery returned None — VLM couldn't find 'profile tab' on screen"
|
||||
|
||||
# Check that it actually selected the correct tab
|
||||
selected_id = (result.resource_id or "").lower()
|
||||
|
||||
# On the home_feed_with_ad_dump, the profile tab should be selected
|
||||
assert (
|
||||
"profile_tab" in selected_id
|
||||
), f"Visual discovery picked wrong node! Got: id='{result.resource_id}', desc='{result.content_desc}'"
|
||||
|
||||
BIN
tests/fixtures/carousel_post_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 298 KiB |
193
tests/fixtures/carousel_post_dump.xml
vendored
Normal file
@@ -0,0 +1,193 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:18" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:18" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_parent" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_listview_parent_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/refreshable_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="false" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/list" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,457]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_profile_header" class="android.view.ViewGroup" package="com.instagram.android" content-desc="silent_moodart posted a carousel in Forest 24 hours ago" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,457]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][128,457]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[29,339][128,438]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_feed_photo_profile_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture of silent_moodart" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[39,349][118,428]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="silent_moodart " resource-id="com.instagram.android:id/row_feed_photo_profile_name" class="android.widget.Button" package="com.instagram.android" content-desc="silent_moodart " checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,320][965,386]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,386][965,457]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="AI info" resource-id="com.instagram.android:id/secondary_label" class="android.widget.Button" package="com.instagram.android" content-desc="AI info" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,386][965,453]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More actions for this post" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,325][1080,452]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text=" Storm Chant · The Day I Stopped Explaining" resource-id="com.instagram.android:id/secondary_label" class="android.widget.Button" package="com.instagram.android" content-desc=" Storm Chant · The Day I Stopped Explaining" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,395][965,457]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/carousel_media_group" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_carousel_media_actions" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/carousel_viewpager" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/zoomable_view_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_photo_tags" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_feed_photo_media_tag_hints" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/carousel_video_media_group" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Photo 1 of 4 by ꧁ Trix ꧂, Liked by kingiberico and others, 142 comments" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/carousel_video_media_actions" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="9" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/carousel_video_image" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,457][1080,1897]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/hint_icon_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[503,1158][577,1195]" drawing-order="14" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/indicator_container" class="android.widget.Button" package="com.instagram.android" content-desc="Turn sound on" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[934,1788][1080,1897]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/indicator" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[971,1788][1043,1860]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/slideout_iconview_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[989,1806][1025,1842]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1897][1080,2273]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_view_group_buttons" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1897][1080,2070]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,1949][106,2070]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_button_like" class="android.widget.Button" package="com.instagram.android" content-desc="Like" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,1949][95,2070]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[106,1949][212,2070]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_button_comment" class="android.widget.Button" package="com.instagram.android" content-desc="Comment" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[138,1949][201,2070]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="142" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[212,1949][271,2070]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/reposts_ufi_icon" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[271,1949][432,2070]" drawing-order="5" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[271,1949][388,2070]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[303,1949][377,2070]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="22" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[388,1949][432,2070]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[448,1949][538,2070]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_button_share" class="android.widget.Button" package="com.instagram.android" content-desc="Send post" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[464,1949][527,2070]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[449,1897][630,1976]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="6" text="" resource-id="com.instagram.android:id/row_feed_button_save" class="android.widget.Button" package="com.instagram.android" content-desc="Add to Saved" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[959,1949][1075,2059]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2070][1080,2130]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="User avatars" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,2070][92,2130]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Liked by kingiberico and others" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[108,2078][668,2122]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="kingiberico" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[259,2078][452,2122]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="silent_moodart Between the Quiet...… more" resource-id="" class="com.instagram.ui.widget.textview.IgTextLayoutView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,2141][1080,2190]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="silent_moodart" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,2141][291,2185]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Between the Quiet..." checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[300,2141][647,2185]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Between the Quiet..." checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[300,2141][647,2185]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="more" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[680,2141][765,2185]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="24 hours ago" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="24 hours ago" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2201][1080,2242]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2273][1080,2361]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_profile_header" class="android.view.ViewGroup" package="com.instagram.android" content-desc="silent_moodart posted a carousel in Fantasy Forest 4 days ago" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2273][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2273][128,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[29,2292][128,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_feed_photo_profile_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture of silent_moodart" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[39,2302][118,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="silent_moodart " resource-id="com.instagram.android:id/row_feed_photo_profile_name" class="android.widget.Button" package="com.instagram.android" content-desc="silent_moodart " checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,2273][965,2339]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,2339][965,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="AI info" resource-id="com.instagram.android:id/secondary_label" class="android.widget.Button" package="com.instagram.android" content-desc="AI info" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,2339][965,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More actions for this post" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,2278][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text=" Vowless · They Want Me Down" resource-id="com.instagram.android:id/secondary_label" class="android.widget.Button" package="com.instagram.android" content-desc=" Vowless · They Want Me Down" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,2351][965,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_new_title_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][779,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_button_back" class="android.widget.ImageView" package="com.instagram.android" content-desc="Back" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][147,320]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,215][365,278]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_title_and_icons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,215][365,278]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Posts" resource-id="com.instagram.android:id/action_bar_title" class="android.widget.TextView" package="com.instagram.android" content-desc="Posts" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[189,215][333,278]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_button" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[832,191][1059,301]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Follow" resource-id="com.instagram.android:id/action_bar_overflow_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[832,191][1028,280]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/comment_sheet.jpg
vendored
Normal file
|
After Width: | Height: | Size: 152 KiB |
538
tests/fixtures/comment_sheet.xml
vendored
Normal file
@@ -0,0 +1,538 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/parentPanel" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/inputArea" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2298]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2298]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2298]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/keyboard_holder" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2277]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/keyboard_header_view_holder" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,1592]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.view.ViewGroup" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1466][1075,1592]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_header_access_points_menu" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Funktionsmenü öffnen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1466][115,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[15,1484][104,1573]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[22,1491][96,1565]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[115,1466][965,1592]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[115,1466][965,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.view.ViewGroup" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[115,1466][965,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Diese App unterstützt hier keine Bilder" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[140,1466][300,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,1487][292,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,1487][292,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,1497][251,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Diese App unterstützt hier keine Bilder" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[300,1466][460,1592]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[308,1487][452,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[308,1487][452,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[348,1497][411,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Schreibtools" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[460,1466][620,1592]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[468,1487][612,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[468,1487][612,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[508,1497][571,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Zwischenablage" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[620,1466][780,1592]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[628,1487][772,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[628,1487][772,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[668,1497][731,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Einstellungen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[780,1466][940,1592]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[788,1487][932,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[788,1487][932,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[828,1497][891,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_header_power_key" class="android.speech.SpeechRecognizer.VoiceDictationButton" package="com.google.android.inputmethod.latin" content-desc="Spracheingabe verwenden" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1466][1075,1592]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/host" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1466][1075,1592]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1466][1075,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1466][1075,1592]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,1484][1064,1573]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,1484][1064,1573]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,1484][1064,1573]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1592][1080,2277]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1592][1080,2277]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1592][1080,2277]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/input_area" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1613][1075,2110]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1613][1075,1778]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/D01" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Q" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[5,1613][112,1778]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="Q" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[12,1613][105,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="1" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[88,1613][105,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/D02" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="W" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[112,1613][219,1778]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="W" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[119,1613][212,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="2" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[190,1613][212,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/D03" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="E" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[219,1613][326,1778]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="E" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[226,1613][319,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="3" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[297,1613][319,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/D04" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="R" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[326,1613][433,1778]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="R" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[333,1613][426,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="4" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[403,1613][426,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.google.android.inputmethod.latin:id/D05" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="T" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[433,1613][540,1778]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="T" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[440,1613][533,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="5" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[511,1613][533,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.google.android.inputmethod.latin:id/D06" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Z" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[540,1613][647,1778]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="Z" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[547,1613][640,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="6" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[618,1613][640,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.google.android.inputmethod.latin:id/D07" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="U" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[647,1613][754,1778]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="U" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[654,1613][747,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="7" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[726,1613][747,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="7" text="" resource-id="com.google.android.inputmethod.latin:id/D08" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="I" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[754,1613][861,1778]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="I" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[761,1613][854,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="8" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[833,1613][854,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="8" text="" resource-id="com.google.android.inputmethod.latin:id/D09" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="O" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[861,1613][968,1778]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="O" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[868,1613][961,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="9" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[939,1613][961,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="9" text="" resource-id="com.google.android.inputmethod.latin:id/D10" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="P" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[968,1613][1075,1778]" drawing-order="11" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="P" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,1613][1068,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="0" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1044,1613][1068,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1778][1075,1944]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/C01" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="A" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[5,1778][165,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1778][165,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/host" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[59,1778][165,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="A" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[66,1778][158,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/C02" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="S" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[165,1778][272,1944]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="S" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,1778][265,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/C03" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="D" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[272,1778][379,1944]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="D" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[279,1778][372,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/C04" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="F" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[379,1778][486,1944]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="F" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[386,1778][479,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.google.android.inputmethod.latin:id/C05" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="G" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[486,1778][593,1944]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="G" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1778][586,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.google.android.inputmethod.latin:id/C06" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="H" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[593,1778][700,1944]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="H" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[600,1778][693,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.google.android.inputmethod.latin:id/C07" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="J" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[700,1778][807,1944]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="J" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[707,1778][800,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="7" text="" resource-id="com.google.android.inputmethod.latin:id/C08" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="K" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[807,1778][914,1944]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="K" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[814,1778][907,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="8" text="" resource-id="com.google.android.inputmethod.latin:id/C09" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="L" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[914,1778][1075,1944]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[914,1778][1075,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/host" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[914,1778][1021,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="L" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,1778][1014,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1944][1075,2110]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_shift" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Shift enabled" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[5,1944][165,2110]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[48,1974][122,2048]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/B01" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Y" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[165,1944][272,2110]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="Y" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,1944][265,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/B02" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="X" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[272,1944][379,2110]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="X" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[279,1944][372,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/B03" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="C" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[379,1944][486,2110]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="C" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[386,1944][479,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.google.android.inputmethod.latin:id/B04" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="V" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[486,1944][593,2110]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="V" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1944][586,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.google.android.inputmethod.latin:id/B05" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="B" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[593,1944][700,2110]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="B" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[600,1944][693,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.google.android.inputmethod.latin:id/B06" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="N" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[700,1944][807,2110]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="N" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[707,1944][800,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="7" text="" resource-id="com.google.android.inputmethod.latin:id/B07" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="M" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[807,1944][914,2110]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="M" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[814,1944][907,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="8" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_del" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Löschen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[914,1944][1075,2110]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[950,1969][1039,2053]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,2110][1075,2277]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_switch_to_symbol" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Symboltastatur" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,2110][165,2277]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="?123" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[36,2144][133,2212]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/A02" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="," checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[165,2110][272,2277]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="," checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[213,2146][224,2230]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_switch_to_next_language" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Emoji-Button" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[272,2110][379,2277]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[294,2146][357,2209]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_space" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Leerzeichen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[379,2110][807,2277]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[386,2110][800,2246]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="DE • EN" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[386,2110][800,2246]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.google.android.inputmethod.latin:id/A08" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="." checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[807,2110][914,2277]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[856,2146][865,2230]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_ime_action" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Senden" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[914,2110][1075,2277]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,2110][1068,2246]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[956,2139][1035,2218]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[990,2173][1001,2184]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2277][1080,2298]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2298]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,1469]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2298][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_navigation_bar_view" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2298][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_inflater" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2298][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_horizontal" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,2298][1010,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_buttons" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[91,2298][989,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_ends_group" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[91,2298][989,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.RelativeLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[91,2298][274,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_back" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="Back" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[91,2298][274,2424]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.RelativeLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[806,2298][989,2424]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_ime_switcher" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="Switch input method" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[806,2298][989,2424]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="android:id/input_method_nav_center_group" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[445,2298][634,2424]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:15" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:15" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, three bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/bottom_sheet_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/background_dimmer" class="android.widget.Button" package="com.instagram.android" content-desc="@2131955250" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/layout_container_bottom_sheet" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/bottom_sheet_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/bottom_sheet_drag_handle_frame" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,210]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/bottom_sheet_drag_handle_prism" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[498,173][582,210]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/nav_buttons_and_title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,210][1080,313]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="Comments" resource-id="com.instagram.android:id/title_text_view" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[262,210][818,313]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/bottom_sheet_container_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,313][1080,2361]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,313][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/list_view_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,313][1080,1252]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/main_list_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,313][1080,1252]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/recycler_view_container_id" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="false" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,313][1080,1252]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/sticky_header_list" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,313][1080,1252]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,313][1080,314]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,314][1080,416]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,314][264,416]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="For you" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[64,346][178,384]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,416][1080,701]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,416][1080,701]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Go to neuralmaster's profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,447][137,542]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,416][933,701]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="neuralmaster " resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="neuralmaster " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,437][933,620]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="neuralmaster" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,437][375,478]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Reply" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="Reply" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,620][300,701]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Tap to like comment" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[933,416][1080,574]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Like" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,416][1080,532]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,701][1080,902]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,701][1080,902]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Go to marcusboell's profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,732][137,827]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,701][933,902]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="marcusboell " resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="marcusboell " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,722][933,821]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="marcusboell" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,722][358,763]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Reply" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="Reply" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,821][300,902]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="1 likes. Double tap to like comment and press and hold to see all likes" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[933,701][1080,859]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Like" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,701][1080,817]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="1" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1000,817][1013,855]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,902][1080,1103]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,902][1080,1103]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Go to maria.goliney's profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,933][137,1028]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,902][933,1103]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="maria.goliney " resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="maria.goliney " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,923][933,1022]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="maria.goliney" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,923][376,964]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Reply" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="Reply" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,1022][300,1103]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Tap to like comment" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[933,902][1080,1060]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Like" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,902][1080,1018]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="5" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1103][1080,1252]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1103][1080,1252]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Go to tasrg6's profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1134][137,1229]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,1103][933,1252]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="tasrg6 " resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="tasrg6 " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,1124][933,1223]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="tasrg6" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,1124][271,1165]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Reply" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="Reply" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,1223][300,1252]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Tap to like comment" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[933,1103][1080,1252]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Like" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,1103][1080,1219]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1252][1080,1253]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/above_composer_views" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1253][1080,1359]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1253][1080,1254]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1254][1080,1359]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[36,1265][130,1359]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/item_emoji" class="android.widget.Button" package="com.instagram.android" content-desc="❤️" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[36,1265][130,1359]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[166,1265][260,1359]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/item_emoji" class="android.widget.Button" package="com.instagram.android" content-desc=".." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[166,1265][260,1359]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/item_emoji_overlay" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[166,1265][260,1359]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[297,1265][391,1359]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/item_emoji" class="android.widget.Button" package="com.instagram.android" content-desc=".." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[297,1265][391,1359]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[427,1265][521,1359]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/item_emoji" class="android.widget.Button" package="com.instagram.android" content-desc=".." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[427,1265][521,1359]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/item_emoji_overlay" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[427,1265][521,1359]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[558,1265][652,1359]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/item_emoji" class="android.widget.Button" package="com.instagram.android" content-desc=".." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[558,1265][652,1359]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[688,1265][782,1359]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/item_emoji" class="android.widget.Button" package="com.instagram.android" content-desc=".." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[688,1265][782,1359]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[819,1265][913,1359]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/item_emoji" class="android.widget.Button" package="com.instagram.android" content-desc=".." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[819,1265][913,1359]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="7" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[949,1265][1043,1359]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/item_emoji" class="android.widget.Button" package="com.instagram.android" content-desc=".." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[949,1265][1043,1359]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/comment_composer_parent_updated" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1362][1080,1466]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/comment_composer_left_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,1370][127,1465]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/comment_composer_text_parent" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,1362][1043,1457]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/edittext_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,1362][938,1457]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Add a comment for brilla_veronika_" resource-id="com.instagram.android:id/layout_comment_thread_edittext_multiline" class="android.widget.AutoCompleteTextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[148,1362][938,1457]" drawing-order="2" hint="Add a comment for brilla_veronika_" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/comment_composer_animated_image_picker_button" class="android.widget.Button" package="com.instagram.android" content-desc="Gif" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[938,1378][1043,1441]" drawing-order="9" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/comments_composer_bottom_padding" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1465][1080,1466]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/sticky_header_list" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/refreshable_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/list" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,203]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reels_tray_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,203]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="reels tray container" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,203]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][294,203]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][294,182]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Your story" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[72,173][223,182]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[294,173][588,203]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[294,173][588,182]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="julia_alekseeva1107" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[305,173][577,182]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[588,173][882,203]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[588,173][882,182]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="mariischen" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[655,173][816,182]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[882,173][1080,203]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[882,173][1080,182]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="brilla_veronika_" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[916,173][1080,182]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,203][1080,340]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_profile_header" class="android.view.ViewGroup" package="com.instagram.android" content-desc="brilla_veronika_ posted a carousel in Krabi 33 minutes ago" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,203][1080,340]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,203][128,340]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[29,222][128,321]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_feed_photo_profile_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture of brilla_veronika_" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[39,232][118,311]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="brilla_veronika_" resource-id="com.instagram.android:id/row_feed_photo_profile_name" class="android.widget.Button" package="com.instagram.android" content-desc="brilla_veronika_" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,203][965,269]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,269][965,340]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="Krabi" resource-id="com.instagram.android:id/secondary_label" class="android.widget.Button" package="com.instagram.android" content-desc="Krabi" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,269][965,334]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More actions for this post" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,208][1080,335]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text=" Bread Beatz · Government Hooker (Slowed) " resource-id="com.instagram.android:id/secondary_label" class="android.widget.Button" package="com.instagram.android" content-desc=" Bread Beatz · Government Hooker (Slowed) " checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,277][965,340]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/carousel_media_group" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_carousel_media_actions" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/carousel_viewpager" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/zoomable_view_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_photo_tags" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_feed_photo_media_tag_hints" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/carousel_video_media_group" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Photo 1 of 2 by Santa Veronika, Liked by virgeliscigaras and others, 5 comments" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/carousel_video_media_actions" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="9" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/carousel_video_image" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,340][1080,1780]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/hint_icon_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[503,1041][577,1078]" drawing-order="14" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_LinearLayout" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="6" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/dm_inbox_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 186 KiB |
397
tests/fixtures/dm_inbox_dump.xml
vendored
Normal file
@@ -0,0 +1,397 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:16" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:16" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/direct_inbox_action_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_start_action_buttons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[21,173][187,320]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Select multiple messages" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[21,173][104,320]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_title_subtitle_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[229,212][851,281]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_title_notifications_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[278,212][801,281]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="marisaundmarc" resource-id="com.instagram.android:id/igds_action_bar_title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[278,212][801,281]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/action_bar_end_action_buttons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[893,173][1059,320]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Create messaging ad" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[893,173][976,320]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="New Message" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[976,173][1059,320]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/list_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/refreshable_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/inbox_refreshable_thread_list_recyclerview" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,493]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/search_row" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,357][1038,472]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/search_bar_glyph" class="android.widget.ImageView" package="com.instagram.android" content-desc="Search" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[84,357][126,472]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/animated_hints_text_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[168,357][1038,472]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Search or ask Meta AI" resource-id="com.instagram.android:id/search_edit_text" class="android.widget.EditText" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="false" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[168,357][1038,472]" drawing-order="1" hint="Search or ask Meta AI" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[168,357][1038,472]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,493][1080,903]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/cf_hub_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,493][1080,903]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_root_view" class="android.widget.Button" package="com.instagram.android" content-desc="Add note" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,509][289,887]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_avatar_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,509][289,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,509][289,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,514][289,675]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,514][289,675]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_root_view" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,535][289,675]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_card_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[53,546][268,654]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_bubble_text_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[53,546][268,654]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Can't decide..." resource-id="com.instagram.android:id/pog_bubble_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[53,567][268,633]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[66,614][255,803]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[66,614][255,803]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[66,614][255,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_front_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[66,614][255,803]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/pog_subtext_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,819][289,887]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Your note" resource-id="com.instagram.android:id/pog_name" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,819][289,857]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Location off" resource-id="com.instagram.android:id/location_text" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[60,857][261,887]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/pog_root_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="Stacie | Travel & Life shared a note that says 3 DAYS LEFT!" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,509][546,887]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_avatar_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,509][546,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,509][546,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,514][546,675]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,514][546,675]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_root_view" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,535][546,675]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_card_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[310,546][525,654]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_bubble_text_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[310,546][525,654]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="3 DAYS LEFT!" resource-id="com.instagram.android:id/pog_bubble_text" class="android.widget.TextView" package="com.instagram.android" content-desc="3 DAYS LEFT!" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[310,567][525,633]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[323,614][512,803]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[323,614][512,803]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[323,614][512,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_front_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[323,614][512,803]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_back_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[323,614][391,682]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/pog_subtext_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,819][546,857]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Stacie | Travel & Life" resource-id="com.instagram.android:id/pog_name" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,819][546,857]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/pog_root_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="..יְהוּדָה shared a note that says When am I gonna find my people" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[546,509][803,887]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_avatar_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[546,509][803,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[546,509][803,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[546,509][803,691]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[546,509][803,691]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_root_view" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[546,520][803,691]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_card_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[567,531][782,671]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_bubble_text_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[567,531][782,671]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="When am I gonna find my people" resource-id="com.instagram.android:id/pog_bubble_text" class="android.widget.TextView" package="com.instagram.android" content-desc="When am I gonna find my people" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[567,552][782,650]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[580,614][769,803]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[580,614][769,803]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[580,614][769,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_front_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[580,614][769,803]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_back_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[580,614][648,682]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/pog_subtext_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[546,819][803,862]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="..יְהוּדָה" resource-id="com.instagram.android:id/pog_name" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[546,819][803,862]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/pog_root_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="Irwan Budiman shared a note that says Doms .." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[803,509][1060,887]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_avatar_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[803,509][1060,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[803,509][1060,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[803,516][1034,674]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[803,516][1034,674]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_root_view" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[803,537][1034,674]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_card_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[824,548][1013,653]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_bubble_text_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[824,548][1013,653]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Doms .." resource-id="com.instagram.android:id/pog_bubble_text" class="android.widget.TextView" package="com.instagram.android" content-desc="Doms .." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[824,578][1013,622]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[837,614][1026,803]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[837,614][1026,803]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[837,614][1026,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_front_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[837,614][1026,803]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_back_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[837,614][905,682]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/pog_subtext_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[803,819][1060,857]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Irwan Budiman" resource-id="com.instagram.android:id/pog_name" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[803,819][1060,857]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/pog_root_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="Romy Storm " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1060,509][1080,887]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_avatar_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1060,509][1080,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1060,509][1080,803]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1060,513][1080,676]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1060,513][1080,676]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_root_view" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1060,534][1080,676]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/pog_subtext_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1060,819][1080,857]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Romy Storm" resource-id="com.instagram.android:id/pog_name" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1060,819][1080,857]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,903][1080,1058]" drawing-order="4" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/global_filter_pill" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,942][190,1019]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Primary" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[212,942][406,1019]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="cRequests 1" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="cRequests 1" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[428,942][714,1019]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="General" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[736,942][929,1019]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/row_inbox_container" class="android.widget.Button" package="com.instagram.android" content-desc="Mariischen, Active now" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1058][1080,1257]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1076][200,1239]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Open story of mariischen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1076][200,1239]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1076][200,1239]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[50,1089][187,1226]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1110][884,1204]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Mariischen" resource-id="com.instagram.android:id/row_inbox_username" class="android.widget.TextView" package="com.instagram.android" content-desc="Mariischen" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1110][425,1157]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Active now" resource-id="com.instagram.android:id/row_inbox_digest" class="android.widget.TextView" package="com.instagram.android" content-desc="Active now" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1157][431,1204]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,1076][1080,1239]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1076][1064,1239]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/options_text_view" class="android.widget.TextView" package="com.instagram.android" content-desc="Open camera to send a photo or video message" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1110][1064,1205]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/row_inbox_container" class="android.widget.Button" package="com.instagram.android" content-desc="Liza, Active 45m ago" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1257][1080,1456]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1275][200,1438]" drawing-order="3" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1275][200,1438]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[50,1288][187,1425]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1309][884,1403]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Liza" resource-id="com.instagram.android:id/row_inbox_username" class="android.widget.TextView" package="com.instagram.android" content-desc="Liza" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1309][308,1356]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Active 45m ago" resource-id="com.instagram.android:id/row_inbox_digest" class="android.widget.TextView" package="com.instagram.android" content-desc="Active 45m ago" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1356][507,1403]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,1275][1080,1438]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1275][1064,1438]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/options_text_view" class="android.widget.TextView" package="com.instagram.android" content-desc="Open camera to send a photo or video message" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1309][1064,1404]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.instagram.android:id/row_inbox_container" class="android.widget.Button" package="com.instagram.android" content-desc="irwansbudiman, Lovely galleries Marisa and Marc ·, 3w" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1456][1080,1655]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1474][200,1637]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Open story of irwansbudiman" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1474][200,1637]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1474][200,1637]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[50,1487][187,1624]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1508][884,1602]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="irwansbudiman" resource-id="com.instagram.android:id/row_inbox_username" class="android.widget.TextView" package="com.instagram.android" content-desc="irwansbudiman" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1508][496,1555]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Lovely galleries Marisa and Marc ·" resource-id="com.instagram.android:id/row_inbox_digest" class="android.widget.TextView" package="com.instagram.android" content-desc="Lovely galleries Marisa and Marc ·" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1555][815,1602]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="2" text="3w" resource-id="com.instagram.android:id/row_inbox_timestamp" class="android.widget.TextView" package="com.instagram.android" content-desc="3w" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[815,1555][878,1602]" drawing-order="8" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,1474][1080,1637]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1474][1064,1637]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/options_text_view" class="android.widget.TextView" package="com.instagram.android" content-desc="Open camera to send a photo or video message" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1508][1064,1603]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.instagram.android:id/row_inbox_container" class="android.widget.Button" package="com.instagram.android" content-desc="debbisluys, unread, Shared a link ·, 8w" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1655][1080,1854]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1673][200,1836]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Open story of debbisluys" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1673][200,1836]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1673][200,1836]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[50,1686][187,1823]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1706][842,1802]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="debbisluys" resource-id="com.instagram.android:id/row_inbox_username" class="android.widget.TextView" package="com.instagram.android" content-desc="debbisluys" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1706][429,1754]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Shared a link ·" resource-id="com.instagram.android:id/row_inbox_digest" class="android.widget.TextView" package="com.instagram.android" content-desc="Shared a link ·" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,1754][482,1802]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="2" text="8w" resource-id="com.instagram.android:id/row_inbox_timestamp" class="android.widget.TextView" package="com.instagram.android" content-desc="8w" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[482,1755][545,1802]" drawing-order="8" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/thread_indicator_status_dot" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[879,1733][921,1775]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,1673][1080,1836]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1673][1064,1836]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/options_text_view" class="android.widget.TextView" package="com.instagram.android" content-desc="Open camera to send a photo or video message" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1707][1064,1802]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="7" text="" resource-id="com.instagram.android:id/row_inbox_container" class="android.widget.Button" package="com.instagram.android" content-desc="Weihnachtsideen, unread, 4+ new messages ·, 9w" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1854][1080,2048]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1872][195,2030]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="User present" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,1872][195,2030]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1877][158,1993]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[74,1909][190,2025]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[232,1903][842,1999]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Weihnachtsideen" resource-id="com.instagram.android:id/row_inbox_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[232,1903][542,1951]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="4+ new messages ·" resource-id="com.instagram.android:id/row_inbox_digest" class="android.widget.TextView" package="com.instagram.android" content-desc="4+ new messages ·" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[232,1951][561,1999]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="2" text="9w" resource-id="com.instagram.android:id/row_inbox_timestamp" class="android.widget.TextView" package="com.instagram.android" content-desc="9w" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[561,1952][624,1999]" drawing-order="8" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/thread_indicator_status_dot" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[879,1930][921,1972]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,1872][1080,2030]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1872][1064,2030]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/options_text_view" class="android.widget.TextView" package="com.instagram.android" content-desc="Open camera to send Weihnachtsideen a photo or video message" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,1903][1064,1998]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="8" text="" resource-id="com.instagram.android:id/row_inbox_container" class="android.widget.Button" package="com.instagram.android" content-desc="alice.shaktisoul, Hiiiii! I'm having my masterclass tommorow and… ·, 20w" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,2048][1080,2235]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,2066][200,2229]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Open story of alice.shaktisoul" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,2066][200,2229]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[37,2066][200,2229]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[50,2079][187,2216]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,2100][884,2194]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="alice.shaktisoul" resource-id="com.instagram.android:id/row_inbox_username" class="android.widget.TextView" package="com.instagram.android" content-desc="alice.shaktisoul" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,2100][500,2147]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Hiiiii! I'm having my masterclass tommorow and… ·" resource-id="com.instagram.android:id/row_inbox_digest" class="android.widget.TextView" package="com.instagram.android" content-desc="Hiiiii! I'm having my masterclass tommorow and… ·" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[237,2147][798,2194]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="2" text="20w" resource-id="com.instagram.android:id/row_inbox_timestamp" class="android.widget.TextView" package="com.instagram.android" content-desc="20w" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,2147][884,2194]" drawing-order="8" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,2066][1080,2229]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,2066][1064,2229]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/options_text_view" class="android.widget.TextView" package="com.instagram.android" content-desc="Open camera to send a photo or video message" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[937,2100][1064,2195]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/tab_bar_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2234][1080,2235]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/tab_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2235][1080,2361]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/feed_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Home" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,2235][216,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[76,2266][139,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Reels" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[216,2235][432,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[292,2266][355,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/direct_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Message" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="true" visible-to-user="true" bounds="[432,2235][648,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[508,2266][571,2329]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="2" resource-id="com.instagram.android:id/notification" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[558,2304][584,2330]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/search_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Search and explore" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[648,2235][864,2361]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,2266][787,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/profile_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/wrapper" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/led_badge" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[991,2311][1017,2337]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/dm_thread_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 172 KiB |
224
tests/fixtures/dm_thread_dump.xml
vendored
Normal file
BIN
tests/fixtures/explore_feed_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 242 KiB |
179
tests/fixtures/explore_feed_dump.xml
vendored
Normal file
@@ -0,0 +1,179 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:17" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:17" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][186,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][476,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][244,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[244,3][302,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[302,3][360,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[360,3][418,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[418,3][476,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[418,3][476,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_recyclerview_parent_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/refreshable_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/grid_card_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="6 photos by ꧁ Trix ꧂ at row 1, column 1" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,321][356,797]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,321][356,796]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/grid_card_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="9 photos by Daniel at row 1, column 2" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[362,321][718,797]" drawing-order="2" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[362,321][718,796]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,321][1080,797]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.TextureView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,321][1080,797]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/media_note_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,323][1080,797]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[766,597][1080,755]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="furstset liked this reel" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[766,639][903,755]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[766,639][903,755]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="fern.arun liked this reel" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[929,597][1066,734]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[929,597][1066,734]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/play_count_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,714][1080,797]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/play_count_logo" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[745,740][777,772]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="336K" resource-id="com.instagram.android:id/preview_clip_play_count" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[788,735][866,776]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,803][356,1279]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.TextureView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,803][356,1279]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/play_count_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1196][356,1279]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/play_count_logo" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[21,1222][53,1254]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="48,1K" resource-id="com.instagram.android:id/preview_clip_play_count" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[64,1217][143,1258]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/grid_card_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="10 photos by fernlichtsicht at row 2, column 2" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[362,803][718,1279]" drawing-order="5" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[362,803][718,1278]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.instagram.android:id/grid_card_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="4 photos by Zac Clough at row 2, column 3" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[724,803][1080,1279]" drawing-order="6" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[724,803][1080,1278]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1285][1080,1495]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_load_more_button" class="android.widget.ViewAnimator" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1285][1080,1495]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[477,1327][603,1453]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/explore_action_bar" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/explore_action_bar_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,173][1048,265]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_search_hints_text_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,173][943,265]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Search" resource-id="com.instagram.android:id/action_bar_search_edit_text" class="android.widget.EditText" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[32,173][943,265]" drawing-order="1" hint="Search" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,173][943,265]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/explore_action_bar_right_button_stub" class="android.widget.ImageView" package="com.instagram.android" content-desc="More" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[985,188][1048,251]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/tab_bar_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2234][1080,2235]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/tab_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2235][1080,2361]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/feed_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Home" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,2235][216,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[76,2266][139,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Reels" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[216,2235][432,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[292,2266][355,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/direct_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Message" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[432,2235][648,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[508,2266][571,2329]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="2" resource-id="com.instagram.android:id/notification" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[558,2304][584,2330]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/search_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Search and explore" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="true" visible-to-user="true" bounds="[648,2235][864,2361]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[724,2266][787,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/profile_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/wrapper" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/led_badge" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[991,2311][1017,2337]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/followers_list_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 196 KiB |
275
tests/fixtures/followers_list_dump.xml
vendored
Normal file
@@ -0,0 +1,275 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:17" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:17" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][186,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][476,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][244,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[244,3][302,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[302,3][360,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[360,3][418,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[418,3][476,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[418,3][476,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_parent" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/main_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/unified_follow_list_tab_layout" class="android.widget.HorizontalScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,446]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,446]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][218,446]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="4 Mutual" resource-id="com.instagram.android:id/title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,320][186,446]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[218,320][541,446]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="19,1K Followers" resource-id="com.instagram.android:id/title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[250,320][509,446]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[541,320][837,446]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="731 Following" resource-id="com.instagram.android:id/title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[573,320][805,446]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[837,320][1080,446]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Suggested" resource-id="com.instagram.android:id/title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[869,320][1060,446]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/unified_follow_list_view_pager_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/unified_follow_list_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_listview_parent_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/list" class="android.widget.ListView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/gap_binder_group" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,467]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="We limit the number of followers shown for certain Meta Verified and Business accounts." resource-id="com.instagram.android:id/row_text_textview" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,467][1080,589]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,589][1080,778]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,589][1080,778]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,597][215,770]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,597][215,770]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,610][202,757]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,631][744,736]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,631][455,678]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="lee13.studio" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,631][455,678]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="LEE13| Художник" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,678][540,725]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow LEE13| Художник" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,641][1038,725]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,778][1080,967]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,778][1080,967]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,786][215,959]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,786][215,959]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,799][202,946]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,820][744,925]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,820][611,867]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="world.nature.and.me" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,820][611,867]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="world.nature.and.me" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,867][600,914]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow world.nature.and.me" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,830][1038,914]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="5" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,967][1080,1156]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,967][1080,1156]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,975][215,1148]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,988][202,1135]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1009][744,1114]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1009][712,1056]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="soul_symbolsastrologytarot" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1009][712,1056]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Karen Sullivan" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1056][487,1103]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow Karen Sullivan" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,1019][1038,1103]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="6" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1156][1080,1345]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1156][1080,1345]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1164][215,1337]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1164][215,1337]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1177][202,1324]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1198][744,1303]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1198][581,1245]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="brianwagner757" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1198][581,1245]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Brian Wagner, Artist" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1245][590,1292]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow Brian Wagner, Artist" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,1208][1038,1292]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="7" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1345][1080,1534]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1345][1080,1534]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1353][215,1526]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1366][202,1513]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1387][744,1492]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1387][467,1434]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="mosslitmuse" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1387][467,1434]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="HilLesha Anderson" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1434][571,1481]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow HilLesha Anderson" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,1397][1038,1481]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="8" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1534][1080,1723]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1534][1080,1723]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1542][215,1715]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1542][215,1715]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1555][202,1702]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1576][744,1681]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1576][625,1623]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="driven.by.light.nature" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1576][625,1623]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Johannes | Driven by Light" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1623][702,1670]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow Johannes | Driven by Light" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,1586][1038,1670]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="9" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1723][1080,1912]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1723][1080,1912]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1731][215,1904]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1744][202,1891]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1765][744,1870]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1765][473,1812]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="blurple_rulez" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1765][473,1812]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Mel" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1812][310,1859]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow Mel" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,1775][1038,1859]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="10" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1912][1080,2101]" drawing-order="11" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1912][1080,2101]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1920][215,2093]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1933][202,2080]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1954][744,2059]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1954][438,2001]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="shutter84_" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1954][438,2001]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="JH" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2001][295,2048]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow JH" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,1964][1038,2048]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="11" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2101][1080,2290]" drawing-order="12" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2101][1080,2290]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2109][215,2282]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2109][215,2282]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,2122][202,2269]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,2143][744,2248]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2143][489,2190]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="time_thisisme" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2143][489,2190]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="TIME_this is me." resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2190][524,2237]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow TIME_this is me." checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,2153][1038,2237]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="12" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2290][1080,2361]" drawing-order="13" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2290][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2298][215,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2298][215,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,2311][202,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,2332][744,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2332][458,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="szylkavisual" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2332][458,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="Follow" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow Kate .." checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[744,2342][1038,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,449]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_new_title_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1006,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_button_back" class="android.widget.ImageView" package="com.instagram.android" content-desc="Back" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][147,320]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,215][667,278]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_title_and_icons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,215][667,278]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="silent_moodart" resource-id="com.instagram.android:id/action_bar_title" class="android.widget.TextView" package="com.instagram.android" content-desc="silent_moodart" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[189,215][577,278]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_little_icon_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[577,225][635,267]" drawing-order="4" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/action_bar_title_verified_badge" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[593,225][635,267]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/home_feed_with_ad.jpg
vendored
Normal file
|
After Width: | Height: | Size: 223 KiB |
203
tests/fixtures/home_feed_with_ad.xml
vendored
Normal file
@@ -0,0 +1,203 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:18" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:18" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/sticky_header_list" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/refreshable_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/list" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,304]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="2" text="alpinesoul Spring looks a little different when you live… more" resource-id="" class="com.instagram.ui.widget.textview.IgTextLayoutView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,173][1080,221]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="alpinesoul" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,172][204,216]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Spring looks a little different when you live" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[213,172][929,216]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Spring looks a little different when you live" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[213,172][929,216]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="more" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[962,172][1047,216]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="3 days ago" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="3 days ago" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,232][1080,273]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,304][1080,441]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_profile_header" class="android.view.ViewGroup" package="com.instagram.android" content-desc="millionlords posted a carousel 50 seconds ago" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,304][1080,441]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,304][128,441]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_photo_profile_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture of millionlords" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[39,333][118,412]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="millionlords" resource-id="com.instagram.android:id/row_feed_photo_profile_name" class="android.widget.Button" package="com.instagram.android" content-desc="millionlords" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,304][768,370]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="Ad" resource-id="com.instagram.android:id/secondary_label" class="android.widget.Button" package="com.instagram.android" content-desc="Ad" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[128,370][768,441]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="Follow" resource-id="com.instagram.android:id/inline_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow Million Lords" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[768,330][965,414]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More actions for this post" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,309][1080,436]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/carousel_media_group" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_carousel_media_actions" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/carousel_viewpager" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/zoomable_view_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_photo_tags" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_feed_photo_media_tag_hints" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/carousel_video_media_group" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Video 1 of 2 by Million Lords, 1 comment" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.TextureView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/carousel_video_media_actions" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,441][1080,1791]" drawing-order="10" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/hint_icon_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[503,1097][577,1134]" drawing-order="15" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/larger_cta_top_buffer" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1723][1080,1791]" drawing-order="9" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/indicator_container" class="android.widget.Button" package="com.instagram.android" content-desc="Turn sound on" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[934,1682][1080,1791]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/indicator" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[971,1682][1043,1754]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/slideout_iconview_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[989,1700][1025,1736]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/cta_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1791][1080,1907]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Play game" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="Play game" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1791][1080,1907]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1906][1080,1907]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1907][1080,2235]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_view_group_buttons" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1907][1080,2080]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,1959][106,2080]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_button_like" class="android.widget.Button" package="com.instagram.android" content-desc="Like" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,1959][95,2080]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[106,1959][212,2080]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_button_comment" class="android.widget.Button" package="com.instagram.android" content-desc="Comment" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[138,1959][201,2080]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="1" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[212,1959][227,2080]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[243,1959][333,2080]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_feed_button_share" class="android.widget.Button" package="com.instagram.android" content-desc="Send post" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[259,1959][322,2080]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[470,1907][609,1986]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="com.instagram.android:id/row_feed_button_save" class="android.widget.Button" package="com.instagram.android" content-desc="Add to Saved" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[958,1959][1074,2075]" drawing-order="6" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/larger_cta_bottom_buffer" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1907][1080,1934]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2080][1080,2123]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="View likes" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,2080][1048,2123]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="millionlords Conquer or be conquered! ⚔️.." resource-id="" class="com.instagram.ui.widget.textview.IgTextLayoutView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,2134][1080,2194]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="millionlords" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,2134][228,2178]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="View all comments" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="View all comments" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2205][1080,2235]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_LinearLayout" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="6" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/tab_bar_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2234][1080,2235]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/tab_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2235][1080,2361]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/feed_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Home" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="true" visible-to-user="true" bounds="[0,2235][216,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[76,2266][139,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Reels" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[216,2235][432,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[292,2266][355,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/direct_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Message" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[432,2235][648,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[508,2266][571,2329]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="2" resource-id="com.instagram.android:id/notification" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[558,2304][584,2330]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/search_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Search and explore" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[648,2235][864,2361]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,2266][787,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/profile_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/wrapper" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/led_badge" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[991,2311][1017,2337]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/modal_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/notifications_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 198 KiB |
220
tests/fixtures/notifications_dump.xml
vendored
Normal file
@@ -0,0 +1,220 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:17" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:17" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][186,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][476,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][244,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[244,3][302,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[302,3][360,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[360,3][418,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[418,3][476,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[418,3][476,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/activity_feed_root" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/activity_feed_appbar_layout" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,461]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/activity_feed_pills_toolbar_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,461]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/activity_feed_pills_filter_container" class="android.widget.HorizontalScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,461]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/igds_segmented_pills_linear_layout" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,461]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[21,320][140,461]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/igds_pill_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[37,346][124,435]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="All" resource-id="com.instagram.android:id/igds_pill_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[58,367][103,414]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[140,320][520,461]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/igds_pill_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[156,346][504,435]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="People you follow" resource-id="com.instagram.android:id/igds_pill_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[177,367][483,414]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[520,320][784,461]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/igds_pill_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[536,346][768,435]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Comments" resource-id="com.instagram.android:id/igds_pill_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[557,367][747,414]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[784,320][1074,461]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/igds_pill_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[800,346][1058,435]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Professional" resource-id="com.instagram.android:id/igds_pill_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[821,367][1037,414]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1074,320][1080,461]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/newsfeed_you" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,461][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,461][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,461][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,461][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="activity_feed_box" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,461][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="activity_feed_list" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,461][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="Highlights" resource-id="activity_feed_header_row" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,503][247,553]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="activity_feed_newsfeed_story_row" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,574][1080,763]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[85,627][211,753]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[43,585][169,711]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="flos8893, hannafischer4178 and others liked your post. 4h" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,623][901,715]" drawing-order="2" hint="" display-id="0" />
|
||||
<node NAF="true" index="3" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[923,595][1049,742]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="activity_feed_newsfeed_story_row" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,763][1080,952]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="igds_profile_picture" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[40,771][213,944]" drawing-order="0" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[53,784][200,931]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="irwansbudiman liked your post. 17h" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,836][832,880]" drawing-order="1" hint="" display-id="0" />
|
||||
<node NAF="true" index="2" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[923,784][1049,931]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="Today" resource-id="activity_feed_header_row" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,994][164,1044]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="activity_feed_newsfeed_story_row" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1065][1080,1254]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="igds_profile_picture" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[40,1073][213,1246]" drawing-order="0" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[53,1086][200,1233]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Your post has 4 reactions on Facebook. 4h" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1114][901,1206]" drawing-order="1" hint="" display-id="0" />
|
||||
<node NAF="true" index="2" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[923,1086][1049,1233]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="activity_feed_newsfeed_story_row" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1254][1080,1443]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="igds_profile_picture" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[40,1262][213,1435]" drawing-order="0" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[53,1275][200,1422]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Your scheduled post will be posted at 11:30 AM on Apr 28, 2026. 6h" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1303][901,1395]" drawing-order="1" hint="" display-id="0" />
|
||||
<node NAF="true" index="2" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[923,1275][1049,1422]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="Yesterday" resource-id="activity_feed_header_row" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1485][242,1535]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="7" text="" resource-id="activity_feed_newsfeed_story_row" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1556][1080,1745]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="igds_profile_picture" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[40,1564][213,1737]" drawing-order="0" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[53,1577][200,1724]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Your post was shared to Threads. Open the Threads app to see it. 17h" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1605][901,1697]" drawing-order="1" hint="" display-id="0" />
|
||||
<node NAF="true" index="2" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[923,1577][1049,1724]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="8" text="" resource-id="activity_feed_newsfeed_story_row" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1745][1080,1934]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="igds_profile_picture" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[40,1753][213,1926]" drawing-order="0" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[53,1766][200,1913]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="You're all caught up" resource-id="ig_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1796][575,1840]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="See new activity for marcmintel" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1840][785,1884]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="9" text="Last 7 days" resource-id="activity_feed_header_row" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1976][267,2026]" drawing-order="9" hint="" display-id="0" />
|
||||
<node index="10" text="" resource-id="activity_feed_newsfeed_story_row" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,2047][1080,2236]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[85,2100][211,2226]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[43,2058][169,2184]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="mervenin__gozunden, sandramalard and others liked your post. 2d" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,2096][901,2188]" drawing-order="2" hint="" display-id="0" />
|
||||
<node NAF="true" index="3" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[923,2068][1049,2215]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="11" text="" resource-id="activity_feed_newsfeed_story_row" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,2236][1080,2424]" drawing-order="11" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[85,2289][211,2415]" drawing-order="0" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[43,2247][169,2373]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="mervenin__gozunden, soldisalda and others liked your post. 2d" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,2285][901,2377]" drawing-order="2" hint="" display-id="0" />
|
||||
<node NAF="true" index="3" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[923,2257][1049,2404]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="0.0" resource-id="" class="android.widget.ProgressBar" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[488,461][593,566]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2288][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2288][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Push notifications are currently off. Turn on" resource-id="com.instagram.android:id/upsell_title" class="android.widget.TextView" package="com.instagram.android" content-desc="Push notifications are currently off. Turn on" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[200,2304][880,2345]" drawing-order="1" hint="" display-id="0" />
|
||||
<node NAF="true" index="1" text="" resource-id="com.instagram.android:id/upsell_close" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1022,2309][1054,2341]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/action_bar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="15" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_new_title_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1006,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_button_back" class="android.widget.ImageView" package="com.instagram.android" content-desc="Back" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][147,320]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,215][552,278]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_title_and_icons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,215][552,278]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Notifications" resource-id="com.instagram.android:id/action_bar_title" class="android.widget.TextView" package="com.instagram.android" content-desc="Notifications" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[189,215][520,278]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/reels_feed_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 305 KiB |
271
tests/fixtures/reels_feed_dump.xml
vendored
Normal file
@@ -0,0 +1,271 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:16" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:16" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/root_clips_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_linear_layout_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/gesture_manager" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_viewer_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_swipe_refresh_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_viewer_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_media_component" class="android.view.ViewGroup" package="com.instagram.android" content-desc="Reel by cappadocia.cowboy. Double tap to play or pause." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_single_media_component" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_viewer_video_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_video_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Reel by cappadocia.cowboy. Double tap to play or pause." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.SurfaceView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_item_overlay_component" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="11" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="7" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="8" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="9" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_media_info_component" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1910][943,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1910][943,2198]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1910][943,2198]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1910][943,2198]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1910][943,2051]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_author_info_component" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1910][549,2051]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1936][157,2051]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_author_profile_pic" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture of cappadocia.cowboy" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[52,1946][147,2041]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[157,1970][549,2018]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="cappadocia.cowboy" resource-id="com.instagram.android:id/clips_author_username" class="android.widget.Button" package="com.instagram.android" content-desc="cappadocia.cowboy" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[157,1970][549,2018]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[549,1937][779,2050]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Follow" resource-id="com.instagram.android:id/inline_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow Cappadocia Cowboy" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[565,1958][742,2034]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_caption_component" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2051][943,2125]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2051][943,2125]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2062][943,2125]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="There are places that speak for themselves … like …" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2062][943,2125]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2125][943,2198]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2125][943,2198]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2146][145,2193]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Followed by unmonde2reves and 2 others" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="Followed by unmonde2reves and 2 others" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[145,2148][943,2191]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_ufi_component" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[943,1149][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[943,1149][1059,2193]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[943,1149][1059,2193]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/like_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Like" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[943,1149][1059,1265]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="View likes" resource-id="com.instagram.android:id/like_count" class="android.widget.Button" package="com.instagram.android" content-desc="View likes" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[943,1265][1059,1327]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/comment_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Comment" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[943,1327][1059,1443]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="Comment number is57. View comments" resource-id="com.instagram.android:id/comment_count" class="android.widget.Button" package="com.instagram.android" content-desc="Comment number is57. View comments" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[943,1443][1059,1505]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Repost" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[943,1505][1059,1621]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="5" text="Reposted 208 times" resource-id="com.instagram.android:id/repost_count" class="android.widget.Button" package="com.instagram.android" content-desc="Reposted 208 times" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[943,1621][1059,1683]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="6" text="" resource-id="com.instagram.android:id/direct_share_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Share" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[943,1683][1059,1799]" drawing-order="7" hint="" display-id="0" />
|
||||
<node index="7" text="" resource-id="com.instagram.android:id/save_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Save" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[943,1820][1059,1936]" drawing-order="8" hint="" display-id="0" />
|
||||
<node index="8" text="Save number is838" resource-id="com.instagram.android:id/save_count" class="android.widget.Button" package="com.instagram.android" content-desc="Save number is838" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[943,1936][1059,1998]" drawing-order="9" hint="" display-id="0" />
|
||||
<node index="9" text="" resource-id="com.instagram.android:id/clips_ufi_more_button_component" class="android.widget.ImageView" package="com.instagram.android" content-desc="More" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[943,1977][1059,2093]" drawing-order="10" hint="" display-id="0" />
|
||||
<node index="10" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[962,2114][1041,2193]" drawing-order="11" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/media_album_art_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Audio" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[962,2114][1041,2193]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/clips_bottom_legibility_gradient_component" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1555][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1555][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/clips_viewer_action_bar" class="android.widget.RelativeLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/clips_action_bar_start_action_buttons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][125,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Create a reel" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,196][125,320]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_viewer_action_bar_title_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[222,173][858,320]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_tab_layout" class="android.widget.HorizontalScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[268,213][858,302]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[268,213][858,302]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="Reels" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="true" visible-to-user="true" bounds="[268,213][491,302]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[273,213][491,302]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="Reels" resource-id="android:id/text1" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[273,213][438,302]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="android:id/icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[438,226][470,289]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="Friends" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[491,213][858,302]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[496,213][858,302]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="Friends" resource-id="android:id/text1" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[496,213][713,302]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="android:id/icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[713,226][852,289]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/clips_action_bar_end_action_buttons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[934,173][1059,320]" drawing-order="4" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[934,196][1059,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,227][1028,289]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/tab_bar_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2234][1080,2235]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/tab_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2235][1080,2361]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/feed_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Home" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,2235][216,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[76,2266][139,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Reels" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="true" visible-to-user="true" bounds="[216,2235][432,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[292,2266][355,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/direct_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Message" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[432,2235][648,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[508,2266][571,2329]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="2" resource-id="com.instagram.android:id/notification" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[558,2304][584,2330]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/search_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Search and explore" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[648,2235][864,2361]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,2266][787,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/profile_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/wrapper" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/led_badge" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[991,2311][1017,2337]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/scraping_profile_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 271 KiB |
381
tests/fixtures/scraping_profile_dump.xml
vendored
Normal file
@@ -0,0 +1,381 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:16" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:16" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="4" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/user_detail_fragment" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/coordinator_root_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2235]" drawing-order="7" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/tab_appbar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,1632]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,1632]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_fixed_list" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,1505]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_profile_header" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,918]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_avatar_container_top_left_stub" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,320][273,619]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,320][273,619]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_view" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,320][273,460]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_root_view" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,320][273,460]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_note_bubble_card_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[63,331][252,439]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/pog_bubble_text_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[63,331][252,439]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Obsessed with..." resource-id="com.instagram.android:id/pog_bubble_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[63,352][252,418]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,388][273,619]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_profile_header_imageview_frame_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[61,407][255,601]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_profile_header_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Your profile. Seen story" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[61,407][255,601]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_empty_badge" class="android.widget.ImageView" package="com.instagram.android" content-desc="Add to story" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[197,543][255,601]" drawing-order="9" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="Marisa & Marc" resource-id="com.instagram.android:id/profile_header_full_name_above_vanity" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,387][565,431]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/profile_header_metrics_full_width" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,431][1038,574]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_post_count_front_familiar" class="" package="com.instagram.android" content-desc="121posts" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,431][509,574]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="121" resource-id="com.instagram.android:id/profile_header_familiar_post_count_value" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,452][374,506]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="posts" resource-id="com.instagram.android:id/profile_header_familiar_post_count_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,506][411,553]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/profile_header_followers_stacked_familiar" class="" package="com.instagram.android" content-desc="2.614followers" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[509,431][782,574]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="2.614" resource-id="com.instagram.android:id/profile_header_familiar_followers_value" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[525,452][629,506]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="followers" resource-id="com.instagram.android:id/profile_header_familiar_followers_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[525,506][683,553]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/profile_header_following_stacked_familiar" class="" package="com.instagram.android" content-desc="2.286following" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,431][1038,574]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="2.286" resource-id="com.instagram.android:id/profile_header_familiar_following_value" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,452][910,506]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="following" resource-id="com.instagram.android:id/profile_header_familiar_following_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,506][955,553]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/profile_user_info_compose_view" class="com.facebook.compose.view.MetaComposeView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,619][1038,750]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,619][1038,750]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,619][1038,750]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text=".. Digitale Nomaden & Remote Work .. Vlogs, Roller-Touren & unser Alltag unterwegs ✍️ Geschichten & Gedanken auf www.marisas.world" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,619][1038,750]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.instagram.android:id/profile_links_view" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,750][821,801]" drawing-order="20" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/button_1" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,750][821,801]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,754][84,796]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="youtube.com/@marisaundmarc and 1 more" resource-id="com.instagram.android:id/text_view" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[95,750][821,801]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.instagram.android:id/banner_row" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,822][1038,886]" drawing-order="22" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,822][1038,886]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,822][380,886]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/igds_prism_chip_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[63,838][95,870]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="marisaundmarc" resource-id="com.instagram.android:id/igds_prism_chip_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[111,833][348,875]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[401,822][566,886]" drawing-order="2" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/igds_prism_chip_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[422,838][454,870]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Add" resource-id="com.instagram.android:id/igds_prism_chip_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[470,833][534,875]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,918][1080,1089]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/bloks_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,918][1080,1089]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,918][1080,1089]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,918][1080,1089]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,918][1048,1065]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Professional dashboard" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Professional dashboard entry point" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[69,946][450,995]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[69,1000][101,1032]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="703 views in the last 30 days." resource-id="" class="android.view.View" package="com.instagram.android" content-desc="703 views in the last 30 days." checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[112,995][515,1037]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1089][1080,1173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_actions_top_row" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1089][1080,1173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,1089][532,1173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/button_container" class="android.widget.Button" package="com.instagram.android" content-desc="Edit profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,1089][532,1173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Edit profile" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[187,1107][377,1154]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[548,1089][1048,1173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/button_container" class="android.widget.Button" package="com.instagram.android" content-desc="Share profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[548,1089][1048,1173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Share profile" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[686,1107][909,1154]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/highlights_tray" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1205][1080,1479]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/highlights_reel_tray_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1205][1080,1479]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1205][249,1479]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/create_highlight_button_view" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="Create highlight" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1205][249,1479]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/button_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1205][249,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/button_background_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[29,1221][225,1417]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/inner_button_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[103,1295][150,1342]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="New" resource-id="com.instagram.android:id/label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1422][249,1463]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1205][493,1479]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1205][493,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="marisaundmarc's story, 1 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1205][493,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1205][493,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[273,1221][469,1417]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="marisaundmarc's highlight story at column 1" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,1237][452,1400]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1422][493,1463]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="..Phuket 2025" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[256,1422][486,1463]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1205][737,1479]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1205][737,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="marisaundmarc's story, 2 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1205][737,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1205][737,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[517,1221][713,1417]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="marisaundmarc's highlight story at column 2" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[533,1237][696,1400]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1422][737,1463]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="..Ha Long" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[533,1422][697,1463]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1205][981,1479]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1205][981,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="marisaundmarc's story, 3 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1205][981,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1205][981,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[761,1221][957,1417]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="marisaundmarc's highlight story at column 3" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[777,1237][940,1400]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1422][981,1463]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="..Bali" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[812,1422][906,1463]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1205][1080,1479]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1205][1080,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="marisaundmarc's story, 4 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1205][1080,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1205][1080,1422]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1005,1221][1080,1417]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="marisaundmarc's highlight story at column 4" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1021,1237][1080,1400]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1422][1080,1463]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="..Krabi" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1045,1422][1080,1463]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/profile_tabs_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1505][1080,1632]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_layout" class="android.widget.HorizontalScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1505][1080,1631]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1505][1080,1631]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[0,1505][270,1631]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[0,1505][270,1631]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Grid view" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[0,1505][270,1631]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[270,1505][540,1631]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[270,1505][540,1631]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Reels" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[270,1505][540,1631]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[540,1505][810,1631]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[540,1505][810,1631]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Reposted" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[540,1505][810,1631]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[810,1505][1080,1631]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[810,1505][1080,1631]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/wrapper" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[810,1505][1080,1631]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[914,1537][977,1600]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Photos of you" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[914,1537][977,1600]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/profile_tabs_bottom_divider" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1631][1080,1632]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/swipe_refresh_animated_progressbar_container_background" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,321]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/swipe_refresh_animated_progressbar_container" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[448,320][632,504]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1632][1080,2235]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="com.instagram.android:id/profile_viewpager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1632][1080,2235]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/list" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1632][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/gap_binder_group" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1632][1080,1638]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/media_set_row_content_identifier" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1638][1080,2119]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1638][356,2113]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1638][356,2113]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="Photo by Marisa & Marc at Row 1, Column 1" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1638][356,2113]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,1638][718,2113]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,1638][718,2113]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="Photo by Marisa & Marc at Row 1, Column 2" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[362,1638][718,2113]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,1638][1080,2113]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,1638][1080,2113]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="Photo by Marisa & Marc at Row 1, Column 3" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[724,1638][1080,2113]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/media_set_row_content_identifier" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2119][1080,2235]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2119][356,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2119][356,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="6 photos by Marisa & Marc at row 2, column 1" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,2119][356,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,2119][718,2235]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,2119][718,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="10 photos by Marisa & Marc at row 2, column 2" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[362,2119][718,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,2119][1080,2235]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,2119][1080,2235]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="10 photos by Marisa & Marc at row 2, column 3" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[724,2119][1080,2235]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/profile_action_bar" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_layout" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1059,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/left_action_bar_buttons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][127,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Create New" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][127,320]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_username_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[169,173][805,320]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[296,173][804,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="marisaundmarc" resource-id="com.instagram.android:id/action_bar_title" class="android.widget.TextView" package="com.instagram.android" content-desc="marisaundmarc" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[296,173][719,320]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_username_buttons_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[719,173][804,320]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_title_chevron" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[735,230][767,262]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_title_red_dot" class="android.widget.ImageView" package="com.instagram.android" content-desc="Unread notifications" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[783,236][804,257]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/right_action_bar_buttons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[805,173][1059,320]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="View profile on Threads" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[805,173][932,320]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[932,173][1059,320]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/tab_bar_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2234][1080,2235]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/tab_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2235][1080,2361]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/feed_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Home" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,2235][216,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[76,2266][139,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/clips_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Reels" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[216,2235][432,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[292,2266][355,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/direct_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Message" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[432,2235][648,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[508,2266][571,2329]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="2" resource-id="com.instagram.android:id/notification" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[558,2304][584,2330]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/search_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Search and explore" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[648,2235][864,2361]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,2266][787,2329]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/profile_tab" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="true" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/wrapper" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[864,2235][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/tab_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[933,2259][1012,2338]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/search_feed_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 137 KiB |
472
tests/fixtures/search_feed_dump.xml
vendored
Normal file
@@ -0,0 +1,472 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/parentPanel" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/inputArea" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2298]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2298]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2298]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/keyboard_holder" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2277]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/keyboard_header_view_holder" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,1592]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.view.ViewGroup" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1466][1075,1592]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_header_access_points_menu" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Funktionsmenü öffnen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1466][115,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[15,1484][104,1573]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[22,1491][96,1565]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[115,1466][965,1592]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[115,1466][965,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.view.ViewGroup" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[115,1466][965,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Diese App unterstützt hier keine Bilder" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[140,1466][300,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,1487][292,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,1487][292,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,1497][251,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Diese App unterstützt hier keine Bilder" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[300,1466][460,1592]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[308,1487][452,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[308,1487][452,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[348,1497][411,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Schreibtools" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[460,1466][620,1592]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[468,1487][612,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[468,1487][612,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[508,1497][571,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Zwischenablage" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[620,1466][780,1592]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[628,1487][772,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[628,1487][772,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[668,1497][731,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Einstellungen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[780,1466][940,1592]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[788,1487][932,1571]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[788,1487][932,1571]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[828,1497][891,1560]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_header_power_key" class="android.speech.SpeechRecognizer.VoiceDictationButton" package="com.google.android.inputmethod.latin" content-desc="Spracheingabe verwenden" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1466][1075,1592]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/host" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1466][1075,1592]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1466][1075,1592]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1466][1075,1592]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,1484][1064,1573]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.view.View" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,1484][1064,1573]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,1484][1064,1573]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1592][1080,2277]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1592][1080,2277]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1592][1080,2277]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/input_area" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1613][1075,2110]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1613][1075,1778]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/D01" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="q" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[5,1613][112,1778]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="q" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[12,1613][105,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="1" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[88,1613][105,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/D02" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="w" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[112,1613][219,1778]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="w" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[119,1613][212,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="2" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[190,1613][212,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/D03" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="e" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[219,1613][326,1778]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="e" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[226,1613][319,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="3" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[297,1613][319,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/D04" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="r" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[326,1613][433,1778]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="r" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[333,1613][426,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="4" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[403,1613][426,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.google.android.inputmethod.latin:id/D05" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="t" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[433,1613][540,1778]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="t" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[440,1613][533,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="5" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[511,1613][533,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.google.android.inputmethod.latin:id/D06" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="z" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[540,1613][647,1778]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="z" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[547,1613][640,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="6" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[618,1613][640,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.google.android.inputmethod.latin:id/D07" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="u" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[647,1613][754,1778]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="u" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[654,1613][747,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="7" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[726,1613][747,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="7" text="" resource-id="com.google.android.inputmethod.latin:id/D08" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="i" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[754,1613][861,1778]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="i" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[761,1613][854,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="8" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[833,1613][854,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="8" text="" resource-id="com.google.android.inputmethod.latin:id/D09" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="o" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[861,1613][968,1778]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="o" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[868,1613][961,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="9" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[939,1613][961,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="9" text="" resource-id="com.google.android.inputmethod.latin:id/D10" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="p" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[968,1613][1075,1778]" drawing-order="11" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="p" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,1613][1068,1747]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="0" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1044,1613][1068,1656]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1778][1075,1944]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/C01" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="a" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[5,1778][165,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1778][165,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/host" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[59,1778][165,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="a" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[66,1778][158,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/C02" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="s" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[165,1778][272,1944]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="s" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,1778][265,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/C03" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="d" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[272,1778][379,1944]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="d" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[279,1778][372,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/C04" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="f" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[379,1778][486,1944]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="f" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[386,1778][479,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.google.android.inputmethod.latin:id/C05" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="g" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[486,1778][593,1944]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="g" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1778][586,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.google.android.inputmethod.latin:id/C06" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="h" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[593,1778][700,1944]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="h" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[600,1778][693,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.google.android.inputmethod.latin:id/C07" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="j" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[700,1778][807,1944]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="j" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[707,1778][800,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="7" text="" resource-id="com.google.android.inputmethod.latin:id/C08" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="k" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[807,1778][914,1944]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="k" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[814,1778][907,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="8" text="" resource-id="com.google.android.inputmethod.latin:id/C09" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="l" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[914,1778][1075,1944]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[914,1778][1075,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/host" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[914,1778][1021,1944]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="l" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,1778][1014,1913]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1944][1075,2110]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_shift" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Shift" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[5,1944][165,2110]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[48,1974][122,2048]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/B01" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="y" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[165,1944][272,2110]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="y" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[172,1944][265,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/B02" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="x" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[272,1944][379,2110]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="x" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[279,1944][372,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/B03" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="c" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[379,1944][486,2110]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="c" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[386,1944][479,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.google.android.inputmethod.latin:id/B04" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="v" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[486,1944][593,2110]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="v" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1944][586,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.google.android.inputmethod.latin:id/B05" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="b" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[593,1944][700,2110]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="b" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[600,1944][693,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.google.android.inputmethod.latin:id/B06" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="n" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[700,1944][807,2110]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="n" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[707,1944][800,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="7" text="" resource-id="com.google.android.inputmethod.latin:id/B07" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="m" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[807,1944][914,2110]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="m" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[814,1944][907,2079]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="8" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_del" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Löschen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[914,1944][1075,2110]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[950,1969][1039,2053]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,2110][1075,2277]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_switch_to_symbol" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Symboltastatur" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,2110][165,2277]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="?123" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[36,2144][133,2212]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/A02" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="," checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[165,2110][272,2277]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="," checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[213,2146][224,2230]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_switch_to_next_language" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Emoji-Button" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[272,2110][379,2277]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[294,2146][357,2209]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_space" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Leerzeichen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[379,2110][807,2277]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[386,2110][800,2246]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="DE • EN" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[386,2110][800,2246]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.google.android.inputmethod.latin:id/A08" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="." checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[807,2110][914,2277]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.TextView" package="com.google.android.inputmethod.latin" content-desc="." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[856,2146][865,2230]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.google.android.inputmethod.latin:id/key_pos_ime_action" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="Suchen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[914,2110][1075,2277]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[921,2110][1068,2246]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[956,2139][1035,2218]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[990,2173][1001,2184]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.google.android.inputmethod.latin:id/0_resource_name_obfuscated" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2277][1080,2298]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,2298]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1466][1080,1469]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2298][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_navigation_bar_view" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2298][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_inflater" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2298][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_horizontal" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,2298][1010,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_buttons" class="android.widget.FrameLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[91,2298][989,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_ends_group" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[91,2298][989,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.RelativeLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[91,2298][274,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_back" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="Back" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[91,2298][274,2424]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.RelativeLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[806,2298][989,2424]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/input_method_nav_ime_switcher" class="android.widget.ImageView" package="com.google.android.inputmethod.latin" content-desc="Switch input method" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[806,2298][989,2424]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="android:id/input_method_nav_center_group" class="android.widget.LinearLayout" package="com.google.android.inputmethod.latin" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[445,2298][634,2424]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:16" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:16" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="3" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/search_section_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,404]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Recent" resource-id="com.instagram.android:id/title_text_view" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,320][883,404]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/see_all_action_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="See all" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[883,320][1080,404]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="See all" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[925,346][1038,393]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_search_user_container" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,404][1080,593]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,404][1080,593]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_with_ring" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,404][242,593]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_in_ring" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[52,425][199,572]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,451][943,545]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,451][396,498]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="lokmatas" resource-id="com.instagram.android:id/row_search_user_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,451][396,498]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,498][408,545]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Lokmatas" resource-id="com.instagram.android:id/row_search_user_fullname" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,498][408,545]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/dismiss_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Dismiss" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[964,461][1038,535]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/row_search_user_container" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,593][1080,782]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,593][1080,782]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_with_ring" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,593][242,782]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_in_ring" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[52,614][199,761]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,619][943,756]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,619][369,666]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="cgnmgj" resource-id="com.instagram.android:id/row_search_user_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,619][369,666]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,666][357,713]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Милан" resource-id="com.instagram.android:id/row_search_user_fullname" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,666][357,713]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/search_social_context_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,713][394,756]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Following" resource-id="com.instagram.android:id/row_search_user_secondary_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,713][394,756]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/dismiss_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Dismiss" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[964,650][1038,724]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/row_search_user_container" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,782][1080,971]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,782][1080,971]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_with_ring" class="android.widget.Button" package="com.instagram.android" content-desc="Open story" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,782][242,971]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,792][210,960]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_search_avatar_in_ring" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[52,803][199,950]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,808][943,945]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,808][428,855]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="mariischen" resource-id="com.instagram.android:id/row_search_user_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,808][428,855]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,855][430,902]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Mariischen" resource-id="com.instagram.android:id/row_search_user_fullname" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,855][430,902]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/search_social_context_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,902][394,945]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Following" resource-id="com.instagram.android:id/row_search_user_secondary_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,902][394,945]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/dismiss_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Dismiss" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[964,839][1038,913]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/row_search_user_container" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,971][1080,1160]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,971][1080,1160]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_with_ring" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,971][242,1160]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_in_ring" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[52,992][199,1139]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,997][943,1134]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,997][399,1044]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="liza_.1518" resource-id="com.instagram.android:id/row_search_user_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,997][399,1044]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1044][313,1091]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Liza" resource-id="com.instagram.android:id/row_search_user_fullname" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1044][313,1091]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/search_social_context_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1091][394,1134]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Following" resource-id="com.instagram.android:id/row_search_user_secondary_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1091][394,1134]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/dismiss_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Dismiss" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[964,1028][1038,1102]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="5" text="" resource-id="com.instagram.android:id/row_search_user_container" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1160][1080,1349]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1160][1080,1349]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_with_ring" class="android.widget.Button" package="com.instagram.android" content-desc="Open story" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1160][242,1349]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1170][210,1338]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_search_avatar_in_ring" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[52,1181][199,1328]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1186][943,1323]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1186][529,1233]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="me.and.eloise" resource-id="com.instagram.android:id/row_search_user_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1186][529,1233]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1233][486,1280]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Danny Joseph" resource-id="com.instagram.android:id/row_search_user_fullname" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1233][486,1280]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/search_social_context_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1280][444,1323]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="1 new post" resource-id="com.instagram.android:id/row_search_user_secondary_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1280][444,1323]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/dismiss_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Dismiss" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[964,1217][1038,1291]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.instagram.android:id/row_search_user_container" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1349][1080,1538]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1349][1080,1538]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_with_ring" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1349][242,1538]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_search_avatar_in_ring" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[52,1370][199,1517]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1420][943,1467]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1420][512,1467]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="la_nomade_bar_" resource-id="com.instagram.android:id/row_search_user_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[242,1420][512,1467]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/dismiss_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Dismiss" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[964,1406][1038,1480]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/action_bar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="15" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_new_title_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][147,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_button_back" class="android.widget.ImageView" package="com.instagram.android" content-desc="Back" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][147,320]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_textview_custom_title_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,173][1059,320]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_search_hints_text_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,202][1027,294]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/action_bar_search_edit_text" class="android.widget.EditText" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[147,202][1027,294]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Search" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,202][1027,294]" drawing-order="2" hint="Search" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/stories_feed_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 165 KiB |
165
tests/fixtures/stories_feed_dump.xml
vendored
Normal file
@@ -0,0 +1,165 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:15" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:15" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, three bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_root" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/view_pager" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_content_layout" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,223]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_view_group" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_item_toolbar_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2311]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2111][1080,2143]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2111][1080,2143]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_item_toolbar_footer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2143][1080,2311]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2143][1080,2311]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/viewer_reel_item_toolbar_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2143][1080,2311]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/message_composer_container" class="android.widget.Button" package="com.instagram.android" content-desc="Send message or reaction" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[21,2164][723,2290]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="Send message" resource-id="com.instagram.android:id/composer_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[21,2164][356,2290]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/toolbar_buttons_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[744,2164][1059,2290]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/toolbar_like_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[744,2174][849,2279]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/toolbar_like_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Like Story" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[744,2174][849,2279]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node NAF="true" index="1" text="" resource-id="com.instagram.android:id/reel_viewer_comments_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[849,2174][954,2279]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/toolbar_reshare_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Send story" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[954,2174][1059,2279]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_media_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_sticker_overlay_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_avatar_accessibility_sticker_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_media_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_image_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/reel_viewer_top_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,486]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/reel_viewer_header_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,408]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_progress_bar" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,244][1080,248]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_header" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,248][1080,408]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_picture_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,272][116,408]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_profile_picture" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,272][116,356]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,272][116,356]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_front_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,272][116,356]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_text_container" class="android.widget.Button" package="com.instagram.android" content-desc="mariischen's story, 20 hours ago" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[116,292][975,388]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[116,292][436,336]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="mariischen" resource-id="com.instagram.android:id/reel_viewer_title" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[116,292][354,336]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="20h" resource-id="com.instagram.android:id/reel_viewer_timestamp" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[354,292][436,336]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/reel_header_extras_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,248][1080,374]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/header_menu_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More actions" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[975,248][1080,374]" drawing-order="11" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/reel_viewer_bottom_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1880][1080,2143]" drawing-order="11" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_volume_indicator_litho" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,215]" drawing-order="8" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
149
tests/fixtures/story_view_full.xml
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_parent" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_root" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/view_pager" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_content_layout" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,223]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_view_group" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_item_toolbar_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2311]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2111][1080,2143]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2111][1080,2143]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_item_toolbar_footer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2143][1080,2311]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2143][1080,2311]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/viewer_reel_item_toolbar_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2143][1080,2311]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/message_composer_container" class="android.widget.Button" package="com.instagram.android" content-desc="Send message or reaction" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[21,2164][723,2290]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="Send message" resource-id="com.instagram.android:id/composer_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[21,2164][356,2290]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/toolbar_buttons_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[744,2164][1059,2290]" drawing-order="6" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/viewer_toolbar_browse_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[744,2174][849,2279]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/toolbar_like_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[849,2174][954,2279]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/toolbar_like_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Like Story" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[849,2174][954,2279]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/toolbar_reshare_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Send story" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[954,2174][1059,2279]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_media_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_sticker_overlay_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_avatar_accessibility_sticker_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_media_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.TextureView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,2143]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/reel_viewer_top_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,486]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/reel_viewer_header_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,223][1080,411]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_progress_bar" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,244][1080,248]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_header" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,248][1080,411]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_picture_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,272][116,408]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_profile_picture" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,272][116,356]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,272][116,356]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_viewer_front_avatar" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,272][116,356]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_text_container" class="android.widget.Button" package="com.instagram.android" content-desc="Highlight title Events, story 2 of 25, 29 May 2025" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[116,269][746,411]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[116,269][522,313]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Events" resource-id="com.instagram.android:id/reel_viewer_title" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[116,269][282,313]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="29 May 2025" resource-id="com.instagram.android:id/reel_viewer_timestamp" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[282,269][522,313]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_viewer_attribution_frame_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[116,313][439,411]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,313][439,359]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_app_attribution_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[148,324][180,356]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Watch full reel" resource-id="com.instagram.android:id/reel_app_attribution_action_text" class="android.widget.TextView" package="com.instagram.android" content-desc="Watch full reel" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[196,321][407,359]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/reel_header_extras_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[746,248][1080,374]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="Follow" resource-id="com.instagram.android:id/reel_header_unconnected_follow_button_stub" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow Mission Green Energy" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[778,269][975,353]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/header_menu_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More actions" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[954,248][1080,374]" drawing-order="11" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/reel_viewer_bottom_shadow" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1880][1080,2143]" drawing-order="11" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/reel_volume_indicator_litho" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,215]" drawing-order="8" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][434,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][434,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="23:46" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="23:46" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][202,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[202,3][434,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[202,3][434,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[202,3][260,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[260,3][318,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[318,3][376,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[376,3][434,173]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, three bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 48 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/unfollow_list_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 183 KiB |
313
tests/fixtures/unfollow_list_dump.xml
vendored
Normal file
@@ -0,0 +1,313 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:16" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:16" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][188,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][478,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[188,3][246,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[246,3][304,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[304,3][362,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,3][420,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[420,3][478,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipe_navigation_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/layout_container_center_right_coordinator_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_right" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/activity_and_camera_shared_views_main_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/layout_container_main_panel" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/swipeable_tab_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/swipeable_nav_view_pager_inner_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="4" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_swipeable" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/main_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/unified_follow_list_tab_layout" class="android.widget.HorizontalScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,446]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,446]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][331,446]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="2.614 Followers" resource-id="com.instagram.android:id/title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[32,320][299,446]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[331,320][668,446]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="2.286 Following" resource-id="com.instagram.android:id/title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[363,320][636,446]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[668,320][1006,446]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="0 Subscriptions" resource-id="com.instagram.android:id/title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[700,320][974,446]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1006,320][1080,446]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Flagged" resource-id="com.instagram.android:id/title" class="android.widget.Button" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1038,320][1080,446]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/unified_follow_list_view_pager_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/unified_follow_list_view_pager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_listview_parent_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/list" class="android.widget.ListView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,602]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,602]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Search" resource-id="com.instagram.android:id/row_search_edit_text" class="android.widget.EditText" package="com.instagram.android" content-desc="#ffa2aab4" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[42,478][1038,570]" drawing-order="1" hint="Search" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,602][1080,825]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,602][1080,825]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/contacts_button" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,613][1080,802]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.Button" package="com.instagram.android" content-desc="Connect contacts, Find people you know" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,613][1080,802]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/find_people_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,634][189,781]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.RelativeLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[189,660][740,754]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="Connect contacts" resource-id="com.instagram.android:id/find_people_title" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[221,660][525,707]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Find people you know" resource-id="com.instagram.android:id/find_people_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[221,707][594,754]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Connect" resource-id="com.instagram.android:id/find_people_action_button" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[740,665][974,749]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/find_people_dismiss_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="Dismiss" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1006,691][1038,723]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_find_people_buttons_bottom_divider" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,813][1080,814]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,825][1080,993]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="Sorted by Default" resource-id="com.instagram.android:id/sorting_entry_row_option" class="android.widget.TextView" package="com.instagram.android" content-desc="Sorted by Default Header" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,891][383,948]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/sorting_entry_row_icon" class="android.widget.Button" package="com.instagram.android" content-desc="Sort by" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[985,893][1038,946]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="4" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,993][1080,1182]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,993][1080,1182]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1001][215,1174]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1001][215,1174]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1014][202,1161]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1014][671,1160]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1014][537,1061]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="me.and.eloise" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1014][537,1061]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Danny Joseph" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1061][491,1108]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1108][639,1149]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="1 new post" resource-id="com.instagram.android:id/unseen_posts_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1108][405,1149]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/unseen_posts_blue_dot" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[416,1123][432,1139]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="Following" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Following Danny Joseph" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[671,1045][965,1129]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1024][1080,1151]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="5" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1182][1080,1371]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1182][1080,1371]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1190][215,1363]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1190][215,1363]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1203][202,1350]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1203][671,1349]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1203][449,1250]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="anna.kbaee" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1203][449,1250]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Anna:)" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1250][358,1297]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1297][639,1338]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="6 new posts" resource-id="com.instagram.android:id/unseen_posts_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1297][426,1338]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/unseen_posts_blue_dot" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[437,1312][453,1328]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="Following" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Following Anna:)" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[671,1234][965,1318]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1213][1080,1340]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="6" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1371][1080,1560]" drawing-order="7" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1371][1080,1560]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1379][215,1552]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1392][202,1539]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1392][671,1538]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1392][478,1439]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="anna.kbae" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1392][478,1439]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Anna" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1439][336,1486]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1486][639,1527]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="1 new post" resource-id="com.instagram.android:id/unseen_posts_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1486][405,1527]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/unseen_posts_blue_dot" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[416,1501][432,1517]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="Following" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Following Anna" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[671,1423][965,1507]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1402][1080,1529]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="7" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1560][1080,1749]" drawing-order="8" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1560][1080,1749]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1568][215,1741]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1568][215,1741]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1581][202,1728]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1581][671,1727]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1581][451,1628]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="lili_fursova_" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1581][451,1628]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Lili Fursova - Живу Настоящую Жизнь" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1628][639,1675]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1675][639,1716]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="2 new posts" resource-id="com.instagram.android:id/unseen_posts_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1675][426,1716]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/unseen_posts_blue_dot" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[437,1690][453,1706]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="Following" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Following Lili Fursova - Живу Настоящую Жизнь" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[671,1612][965,1696]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1591][1080,1718]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="8" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1749][1080,1938]" drawing-order="9" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1749][1080,1938]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1757][215,1930]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1757][215,1930]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1770][202,1917]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1768][671,1918]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1768][470,1815]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="0.weronika.0" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1768][470,1815]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="................" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1815][437,1866]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1866][639,1907]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="1 new post" resource-id="com.instagram.android:id/unseen_posts_text" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1866][405,1907]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/unseen_posts_blue_dot" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[416,1881][432,1897]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="Following" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Following ................" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[671,1801][965,1885]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1780][1080,1907]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="9" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1938][1080,2127]" drawing-order="10" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1938][1080,2127]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1946][215,2119]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.view.View" package="com.instagram.android" content-desc="@2131975127" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,1946][215,2119]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,1959][202,2106]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,1980][671,2085]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1980][438,2027]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="mariischen" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,1980][438,2027]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Mariischen" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2027][435,2074]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Following" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Following Mariischen" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[671,1990][965,2074]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,1969][1080,2096]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="10" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2127][1080,2316]" drawing-order="11" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2127][1080,2316]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2135][215,2308]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,2148][202,2295]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,2169][671,2274]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2169][619,2216]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="heike_babyfotografin" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2169][619,2216]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="Erstbelichtung Babyfotografie" resource-id="com.instagram.android:id/follow_list_subtitle" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2216][639,2263]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="Following" resource-id="com.instagram.android:id/follow_list_row_large_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Following Erstbelichtung Babyfotografie" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[671,2179][965,2263]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,2158][1080,2285]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="11" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2316][1080,2361]" drawing-order="12" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,2316][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,2324][215,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_user_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="Profile picture" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[55,2337][202,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/follow_list_content_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[215,2358][671,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/follow_list_user_info_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2358][405,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="liza_.1518" resource-id="com.instagram.android:id/follow_list_username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[247,2358][405,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/media_option_button" class="android.widget.ImageView" package="com.instagram.android" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[965,2347][1080,2361]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,446][1080,449]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/action_bar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="15" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_wrapper" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_new_title_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][879,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_button_back" class="android.widget.ImageView" package="com.instagram.android" content-desc="Back" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][147,320]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,215][617,278]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_title_and_icons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[147,215][617,278]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="marisaundmarc" resource-id="com.instagram.android:id/action_bar_title" class="android.widget.TextView" package="com.instagram.android" content-desc="marisaundmarc" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[189,215][585,278]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="Friending center" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[932,173][1059,320]" drawing-order="4" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/bottom_sheet_camera_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/overlay_layout_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||
BIN
tests/fixtures/user_profile_dump.jpg
vendored
Normal file
|
After Width: | Height: | Size: 307 KiB |
311
tests/fixtures/user_profile_dump.xml
vendored
Normal file
@@ -0,0 +1,311 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<hierarchy rotation="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.compose.ui.viewinterop.ViewFactoryHolder" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[70,0][1010,173]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][485,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="17:17" resource-id="com.android.systemui:id/clock" class="android.widget.TextView" package="com.android.systemui" content-desc="17:17" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[81,59][186,117]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][476,173]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][476,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[186,3][244,173]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[244,3][302,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Gotify notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[302,3][360,173]" drawing-order="3" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="WhatsApp notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[360,3][418,173]" drawing-order="4" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Android System notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[418,3][476,173]" drawing-order="6" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui" content-desc="Amazon Photos notification: " checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[418,3][476,173]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.android.systemui:id/cutout_space_view" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[485,3][595,173]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[595,3][999,173]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,3][999,173]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,59][999,117]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][918,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="Telekom.de, two bars." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[790,59][851,117]" drawing-order="17" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,59][843,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,72][843,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[851,59][910,117]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,59][902,117]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/wifi_signal" class="android.widget.ImageView" package="com.android.systemui" content-desc="Wi-Fi signal full." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[859,72][902,104]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="androidx.compose.ui.platform.ComposeView" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.android.systemui:id/battery" class="android.view.View" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][988,105]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.android.systemui" content-desc="Battery 71 per cent." checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[918,71][981,105]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_root" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_parent" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][1080,2424]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/layout_container_main" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_action_bar" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1080,320]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_layout" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][1059,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/left_action_bar_buttons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][127,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Back" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,173][127,320]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_username_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[169,173][932,320]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[169,173][640,320]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="silent_moodart" resource-id="com.instagram.android:id/action_bar_title" class="android.widget.TextView" package="com.instagram.android" content-desc="silent_moodart" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[169,173][582,320]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/action_bar_username_buttons_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[582,173][640,320]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/action_bar_title_verified_badge" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[598,225][640,267]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/right_action_bar_buttons" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[932,173][1059,320]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.instagram.android" content-desc="Options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[932,173][1059,320]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/coordinator_root_layout" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,2361]" drawing-order="7" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/tab_appbar" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,1458]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,1458]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_fixed_list" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,1331]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_profile_header" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,915]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_avatar_container_top_left_stub" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,324][273,555]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,324][273,555]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/reel_ring" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,324][273,555]" drawing-order="8" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/row_profile_header_imageview_frame_layout" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[61,343][255,537]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/row_profile_header_imageview" class="android.widget.ImageView" package="com.instagram.android" content-desc="silent_moodart's unseen story" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[61,343][255,537]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="꧁ Trix ꧂" resource-id="com.instagram.android:id/profile_header_full_name_above_vanity" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,341][512,416]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/profile_header_metrics_full_width" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,416][1038,559]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_post_count_front_familiar" class="" package="com.instagram.android" content-desc="78posts" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,416][509,559]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="78" resource-id="com.instagram.android:id/profile_header_familiar_post_count_value" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,437][363,491]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="posts" resource-id="com.instagram.android:id/profile_header_familiar_post_count_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[315,491][411,538]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/profile_header_followers_stacked_familiar" class="" package="com.instagram.android" content-desc="19,1Kfollowers" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[509,416][782,559]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="19,1K" resource-id="com.instagram.android:id/profile_header_familiar_followers_value" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[525,437][621,491]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="followers" resource-id="com.instagram.android:id/profile_header_familiar_followers_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[525,491][683,538]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/profile_header_following_stacked_familiar" class="" package="com.instagram.android" content-desc="731following" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[782,416][1038,559]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="731" resource-id="com.instagram.android:id/profile_header_familiar_following_value" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,437][863,491]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="following" resource-id="com.instagram.android:id/profile_header_familiar_following_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[798,491][955,538]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/profile_user_info_compose_view" class="com.facebook.compose.view.MetaComposeView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,559][1038,690]" drawing-order="18" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,559][1038,690]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,559][1038,690]" drawing-order="0" hint="" display-id="0">
|
||||
<node index="0" text="When Fantasy meets reality. Moody visual storytelling © silent_moodart." resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,559][1038,690]" drawing-order="0" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="6" text="" resource-id="com.instagram.android:id/banner_row" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,711][1038,775]" drawing-order="22" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,711][1038,775]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,711][374,775]" drawing-order="1" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/igds_prism_chip_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[63,727][95,759]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="silent_moodart" resource-id="com.instagram.android:id/igds_prism_chip_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[111,722][342,764]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[395,711][872,775]" drawing-order="2" hint="" display-id="0">
|
||||
<node NAF="true" index="0" text="" resource-id="com.instagram.android:id/igds_prism_chip_icon" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[416,727][448,759]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Momma Don't Play Nice" resource-id="com.instagram.android:id/igds_prism_chip_label" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[464,722][822,764]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="2" text=" Redemption Man" resource-id="com.instagram.android:id/igds_prism_chip_sublabel" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[822,724][851,766]" drawing-order="3" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="7" text="" resource-id="com.instagram.android:id/profile_header_follow_context" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,786][1038,883]" drawing-order="24" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_follow_context_facepile" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[42,796][246,880]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="Followed by ivandominguezdrones, piri_foellmi and 2 others" resource-id="com.instagram.android:id/profile_header_follow_context_text" class="android.widget.TextView" package="com.instagram.android" content-desc="Followed by ivandominguezdrones, piri_foellmi and 2 others" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[267,793][1038,883]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,915][1080,999]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_actions_top_row" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,915][1080,999]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_header_user_action_follow_button" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[32,915][482,999]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Follow" resource-id="com.instagram.android:id/profile_header_follow_button" class="android.widget.TextView" package="com.instagram.android" content-desc="Follow ꧁ Trix ꧂" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[32,915][482,999]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[498,915][948,999]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/button_container" class="android.widget.Button" package="com.instagram.android" content-desc="Message" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[498,915][948,999]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="Message" resource-id="" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[644,933][802,980]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/row_profile_header_button_chaining" class="android.widget.Button" package="com.instagram.android" content-desc="@2131979608" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[964,915][1048,999]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/chaining_button_image" class="android.widget.ImageView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[964,915][1048,999]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/highlights_tray" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1031][1080,1305]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/highlights_reel_tray_recycler_view" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1031][1080,1305]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1031][249,1305]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1031][249,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="silent_moodart's story, 0 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1031][249,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1031][249,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[29,1047][225,1243]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="silent_moodart's highlight story at column 0" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[45,1063][208,1226]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[5,1248][249,1289]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Avril .." resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[69,1248][185,1289]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1031][493,1305]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1031][493,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="silent_moodart's story, 1 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1031][493,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1031][493,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[273,1047][469,1243]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="silent_moodart's highlight story at column 1" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[289,1063][452,1226]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[249,1248][493,1289]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="......" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[311,1248][431,1289]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1031][737,1305]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1031][737,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="silent_moodart's story, 2 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1031][737,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1031][737,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[517,1047][713,1243]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="silent_moodart's highlight story at column 2" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[533,1063][696,1226]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[493,1248][737,1289]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="Moments ✨️" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[522,1248][709,1289]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1031][981,1305]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1031][981,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="silent_moodart's story, 3 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1031][981,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1031][981,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[761,1047][957,1243]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="silent_moodart's highlight story at column 3" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[777,1063][940,1226]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[737,1248][981,1289]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="coffee storys" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[761,1248][957,1289]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="4" text="" resource-id="com.instagram.android:id/outer_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1031][1080,1305]" drawing-order="5" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_view" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1031][1080,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.Button" package="com.instagram.android" content-desc="silent_moodart's story, 4 of 0, Seen." checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1031][1080,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/avatar_container" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1031][1080,1248]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/seen_state" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1005,1047][1080,1243]" drawing-order="11" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/avatar_image_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="silent_moodart's highlight story at column 4" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1021,1063][1080,1226]" drawing-order="7" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/title_container" class="android.view.ViewGroup" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[981,1248][1080,1289]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="sky Storys" resource-id="com.instagram.android:id/username" class="android.widget.TextView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[1026,1248][1080,1289]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/profile_tabs_container" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1331][1080,1458]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_layout" class="android.widget.HorizontalScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1331][1080,1457]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1331][1080,1457]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[0,1331][270,1457]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[0,1331][270,1457]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Grid view" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="true" visible-to-user="true" bounds="[0,1331][270,1457]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[270,1331][540,1457]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[270,1331][540,1457]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Reels" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[270,1331][540,1457]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[540,1331][810,1457]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[540,1331][810,1457]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Reposted" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[540,1331][810,1457]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="3" text="" resource-id="" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[810,1331][1080,1457]" drawing-order="4" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[810,1331][1080,1457]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/profile_tab_icon_view" class="android.widget.ImageView" package="com.instagram.android" content-desc="Photos of you" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[810,1331][1080,1457]" drawing-order="2" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/profile_tabs_bottom_divider" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1457][1080,1458]" drawing-order="5" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/swipe_refresh_animated_progressbar_container_background" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,320][1080,321]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="3" text="" resource-id="com.instagram.android:id/swipe_refresh_animated_progressbar_container" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[448,320][632,504]" drawing-order="2" hint="" display-id="0" />
|
||||
<node index="4" text="" resource-id="" class="android.widget.ScrollView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1458][1080,2361]" drawing-order="5" hint="" display-id="0" />
|
||||
<node index="5" text="" resource-id="com.instagram.android:id/profile_viewpager" class="androidx.viewpager.widget.ViewPager" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1458][1080,2361]" drawing-order="6" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="android:id/list" class="androidx.recyclerview.widget.RecyclerView" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1458][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/gap_binder_group" class="android.view.View" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1458][1080,1464]" drawing-order="1" hint="" display-id="0" />
|
||||
<node index="1" text="" resource-id="com.instagram.android:id/media_set_row_content_identifier" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1464][1080,1945]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1464][356,1939]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1464][356,1939]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="4 photos by ꧁ Trix ꧂ at row 1, column 1" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1464][356,1939]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,1464][718,1939]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,1464][718,1939]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="3 photos by ꧁ Trix ꧂ at row 1, column 2" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[362,1464][718,1939]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,1464][1080,1939]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,1464][1080,1939]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="3 photos by ꧁ Trix ꧂ at row 1, column 3" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[724,1464][1080,1939]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="com.instagram.android:id/media_set_row_content_identifier" class="android.widget.LinearLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1945][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1945][356,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,1945][356,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="4 photos by ꧁ Trix ꧂ at row 2, column 1" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[0,1945][356,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,1945][718,2361]" drawing-order="2" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[362,1945][718,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="4 photos by ꧁ Trix ꧂ at row 2, column 2" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[362,1945][718,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
<node index="2" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,1945][1080,2361]" drawing-order="3" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.instagram.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[724,1945][1080,2361]" drawing-order="1" hint="" display-id="0">
|
||||
<node index="0" text="" resource-id="com.instagram.android:id/image_button" class="android.widget.Button" package="com.instagram.android" content-desc="5 photos by ꧁ Trix ꧂ at row 2, column 3" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[724,1945][1080,2361]" drawing-order="1" hint="" display-id="0" />
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</hierarchy>
|
||||