"""Unity App UI's activity quit PianoVision at start on the Frame: Android 12's VibratorManager in onCreate (GitHub #297).""" from __future__ import annotations import struct import zipfile from test_vivox_audio_route import build_dex from frameport.analysis import detect from frameport.apk.dex import Dex from frameport.patches.frame.unity_appui_vibrator import UnityAppUiVibrator, patch_dex from frameport.validate.triage import triage ACT = "Lcom/unity3d/player/appui/AppUIGameActivity;" VM = "Landroid/os/VibratorManager;" # method 0 getSystemService, 1 getDefaultVibrator (referenced only); field 0 m_Vibrator; string 0 / type 0 as below ON_CREATE = [0x001A, 0x0000, # const-string v0, "vibrator_manager" 0x206E, 0x0000, 0x0003, # invoke-virtual {v3, v0}, getSystemService 0x000C, # move-result-object v0 0x001F, 0x0000, # check-cast v0, VibratorManager 0x106E, 0x0001, 0x0000, # invoke-virtual {v0}, getDefaultVibrator 0x000C, # move-result-object v0 0x305B, 0x0000, # iput-object v0, v3, m_Vibrator 0x000E] VIBRATE = [0x3054, 0x0000, 0x000E] # iget-object v0, v3, m_Vibrator; return-void OTHER = [0x0012, 0x000F] def _dex() -> bytes: return build_dex([("Landroid/app/Activity;", "getSystemService", "Ljava/lang/Object;", None), (VM, "getDefaultVibrator", "Landroid/os/Vibrator;", None), (ACT, "onCreate", "V", ON_CREATE), (ACT, "Vibrate", "V", VIBRATE), (ACT, "IsNightModeDefined", "Z", OTHER)], strings_first=("vibrator_manager",), types_first=(VM,), fields=((ACT, "Landroid/os/Vibrator;", "m_Vibrator"),)) def _code(dex: Dex, name: str) -> list[int]: off = dex.code_items(ACT, name)[0] n = struct.unpack_from("