### 改动
可以通过点击右上角弹出的成就横幅跳转至成就设置,并自动打开成就列表并筛选对应成就
## Summary by Sourcery
为成就通知横幅添加导航功能,可跳转到对应的设置部分和成就列表条目。
New Features:
- 允许点击成就的提示(growl)横幅,以打开成就设置页面,并聚焦到相关成就。
- 使成就列表对话框在打开时或加载完成后,可以直接滚动到指定成就。
Enhancements:
- 跟踪提示(growl)通知,将其与特定成就关联起来,并绑定点击处理程序,同时不影响现有按钮的行为。
- 引入一个 `RootView` 代码隐藏文件,用于初始化根视图组件。
<details>
<summary>Original summary in English</summary>
## Summary by Sourcery
Add navigation from achievement notification banners to the
corresponding settings section and achievement list entry.
New Features:
- Allow clicking achievement growl banners to open the achievement
settings page focused on the relevant achievement.
- Enable the achievement list dialog to scroll directly to a specific
achievement when opened or once loaded.
Enhancements:
- Track growl notifications to associate them with specific achievements
and wire up click handlers without interfering with existing buttons.
- Introduce a RootView code-behind file to initialize the root view
component.
</details>
### 改动
1. 增加了“任务日志输出停滞时发送通知“功能,具体表现为:当任务日志在设定时间内没有发生更新时,进行日志输出和外部通知推送
2. 修改了选项“任务超时时间(分钟)”的最小值为1
3. 删除了旧有的通知方式
### 关联issue
#13271
## Summary by Sourcery
为停滞的任务日志输出添加可配置的检测与通知功能,并将其接入现有的运行状态与任务队列流程中。
新功能:
- 引入“停滞超时时间”设置:当任务日志输出在配置的时间段内没有更新时,触发警告和外部通知。
- 添加用户可配置开关:在任务发生停滞时,可选择在现有超时通知的基础上同时发送外部通知。
增强内容:
- 从任务队列中跟踪日志输出活动,以重置停滞检测计时器,避免误报的停滞告警。
- 将新的停滞超时和通知偏好持久化到配置中,并在游戏内及外部通知设置的 UI 中对其进行暴露。
- 调整超时通知处理逻辑,在记录日志和发送通知之前,先遵从对应的外部通知设置。
<details>
<summary>Original summary in English</summary>
## Summary by Sourcery
Add configurable detection and notification for stalled task log output
and wire it into the existing running state and task queue flow.
New Features:
- Introduce a stall timeout setting that triggers warnings and external
notifications when task log output has no updates for a configured
period.
- Add a user-configurable switch to send external notifications on task
stalls alongside existing timeout notifications.
Enhancements:
- Track log output activity from the task queue to reset stall detection
timers and avoid false-positive stall alerts.
- Persist the new stall timeout and notification preferences in
configuration and expose them in the game and external notification
settings UI.
- Adjust timeout notification handling to respect the corresponding
external notification setting before logging and sending notifications.
</details>
* perf: FFT/sparse fast path for masked TM_CCOEFF_NORMED
* perf: optimize masked ccoeff matching
* perf: tune masked ccoeff dispatcher and remove fixed overhead
- sync_cache_revision: atomic acquire/release double-check avoids
taking the mutex on every preproc_and_match call. No-mask hot path
no longer pays for the singleton at all (init hoisted into the
FFT/sparse branch).
- should_fallback_to_opencv: pick whichever path is empirically
faster instead of only catching dense-mask small-result cases:
* result < 1000 && K < 2000: keep sparse (OpenCV setup dominates)
* result < 12000 && K >= 500: fallback (covers GameStart 200x120/
58x58 and 138x130/105x105 dead zones)
* K*result < 25M: fallback (covers SmileyOnWork 880x80/20x21 and
similar long-thin / small-template FFT-loses cases)
Windows MSVC x64 (min-of-2, n=803/1402):
coverage: regressions 198 -> 50, mean 10.5ms -> 7.4ms (1.40x)
perf: regressions 86 -> 3, mean 854us -> 296us (2.90x)
Android arm64-v8a NEON (single run, n=803/1402):
coverage: regressions 0, mean 125ms -> 80ms (1.72x)
perf: regressions 1 (1.20x edge), mean 6.4ms -> 2.8ms (10.95x)
* perf(masked-matcher): merge 3-channel I² into a single FFT in σ_I² compute
σ_I²(x,y) = Σ_c [(M ⋆ I_c²) - (M ⋆ I_c)² / N]
= Σ_c (M ⋆ I_c²) - (1/N) Σ_c (M ⋆ I_c)²
↑ this term is linear in I_c², so by convolution linearity
Σ_c (M ⋆ I_c²) = M ⋆ Σ_c I_c².
Precompute I_sq_sum = Σ_c I_c² in spatial domain and do a single
FFT + single IFFT instead of three. The second term Σ_c (M ⋆ I_c)²
still requires per-channel computation (squaring is non-linear).
Net: -2 FFTs and -2 IFFTs per match() call (15 → 11 transforms).
Validated min-of-3 runs on the 10 largest FFT-path cases per platform:
windows: 8/10 cases -22%, 2 cases (66x41 templ) unchanged
android: 8/10 cases -22%, 2 cases (66x41 templ) unchanged
The two unchanged cases have very small templates where FFT is not
the bottleneck (cvtColor / convertTo / split dominate). Correctness
preserved across 1800 iterations × 10 cases on both platforms.
* fix: 测试代码忘记删除了
* fix: make TemplResource::m_revision atomic
* chore: 调一下匹配参数
* feat: 在日志中标记匹配路径(优化实现 vs cv::matchTemplate)
* feat: add android controller support
* feat: add android compile options and add core static options
* fix: add __ANDROID__ macro for Android platform
* fix: move switch break into macro conditional block
* ci: add Android CMake presets (arm64, x64)
* fix: add missing Android TouchMode handling
* fix: remove unnecessary pre-check in android
* fix: restore unnecessary modifications
* fix: unified use __ANDROID__
* refactor: use interpolate_swipe_with_pause in AndroidController
* feat: add Android crash logcat output and native backtrace
* feat: only copy once from external lib screencap
* feat: add Android JNI AttachThread/DetachThread to working_proc
* fix: break control in switch
* fix: update click interval & swipe interval
* ci: restore Android build job with MaaFramework download
* fix: remove thread attach
* ci: temporarily remove MaaAndroidNativeControlUnit.so
* feat(android-ctrl): SWIPE_WITH_PAUSE 由 InstanceOption DeploymentWithPause 控制
* feat: SWIPE_WITH_PAUSE 默认启用
* feat: add android compile options and add core static options
* feat: use maafw controll unit
* fix: minor adjustments
* refactor: adapt maafw android lib
* fix: remove screencap when connect
* chore: change maafw lib use
* feat: adapt maafw control unit click & click_key
* fix: address critical issues in Android native controller
- Restore InstanceOptionKey::ClientType case in set_instance_option,
which was accidentally removed and broke client type setting on all platforms
- Enable libMaaAndroidNativeControlUnit.so copy step in CI (was commented out),
so Android artifacts actually include the required control unit library
- Fail connect() early when screen_resolution is missing or invalid in config,
preventing silent {0,0} resolution that would break swipe and screencap
- Check touch_down() return value in swipe() and abort on failure
* fix: correct bounds_check off-by-one and extract KEYCODE_ESCAPE constant
- bounds_check used <= which allowed coordinates equal to screen width/height
(off-screen); use < to match the valid range [0, dimension-1]
- Extract magic number 111 into KEYCODE_ESCAPE constexpr in press_esc()
* fix: avoid heap allocation in noexcept terminate/signal handlers
format_signal_reason was returning std::string and using std::format in
its default branch. Called from noexcept custom_terminate_handler before
the outer try block, any allocation failure would throw std::bad_alloc,
triggering recursive std::terminate and aborting crash reporting.
- Change return type to const char* noexcept, returning string literals
- Replace std::format("Signal {}", sig) with "Unknown Signal" (only the
four registered signals are ever passed, so this branch is unreachable)
- Change signal_info in custom_terminate_handler from std::string to
const char*, eliminating all allocations on the pre-try path
* fix: suppress unused-variable warning for signal_reason on non-Android
https://github.com/user-attachments/assets/3a0722fb-b4c0-4864-9141-7d0200c117b8
## Summary by Sourcery
优化仓库和运营商卡片列表的展示方式,支持基于行的虚拟化以及共享的卡片宽度约束,从而实现更快的初始加载和更一致的布局。
新功能:
- 为虚拟化卡片列表添加共享卡片宽度行为,根据可用空间和列数保持一致的卡片宽度。
增强内容:
- 将仓库和运营商集合重构为基于行的可观察集合,并计算列数,以更好地支持虚拟化网格布局。
- 连接集合变更处理程序,以在仓库和运营商数据更新时保持行展示和列数的同步。
<details>
<summary>Original summary in English</summary>
## Summary by Sourcery
Optimize depot and operator card list presentation to support row-based
virtualization and shared card width constraints for faster initial
loading and more consistent layouts.
New Features:
- Add a shared card width behavior for virtualized card lists to
maintain consistent widths based on available space and column count.
Enhancements:
- Refactor depot and operator collections into row-based observable
collections with computed column counts to better support virtualized
grid layouts.
- Wire collection change handlers to keep row presentations and column
counts in sync when depot and operator data updates.
</details>