Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ HyperRefine 基于个人 Android 模块开发脚手架 MiuixGuiTemplate 创建

通知功能独立实现,未引入参考模块的代码、资源或原生库;参考项目的来源与许可证已登记到应用内参考项目分组。

状态栏的 Wi-Fi 活动指示器隐藏与移动网络类型隐藏同样独立实现,参考来源统一登记在应用内致谢页;功能范围、验证和暂未启用的双卡双行源码见 [状态栏功能说明](docs/STATUSBAR_PORT.md)。
状态栏的 Wi-Fi 活动指示器隐藏、移动网络类型隐藏与双排堆叠信号同样独立实现,参考来源统一登记在应用内致谢页;功能范围与验证见 [状态栏功能说明](docs/STATUSBAR_PORT.md)。

<br>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ class NetworkIconsActivity : BaseSubPageActivity() {
val specs = statusBarSpecs(featureSpecs())
StatusBarSections(listOf(
HookSection(R.string.sb_network_section, specs = specs.take(1)),
HookSection(R.string.sb_mobile_type_section, specs = specs.drop(1)),
HookSection(R.string.sb_mobile_type_section, specs = specs.slice(1..1)),
HookSection(R.string.sb_mobile_dual_section, specs = specs.drop(2)),
), contentPadding)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,23 @@ internal fun statusBarFeatureSpecs(): List<OptionSpec> {
key = key, type = OptionType.SWITCH, titleRes = title,
defaultBoolean = false, targetPackages = listOf(Keys.TARGET), showStatus = true,
)
fun slider(key: String, title: Int, value: Float, min: Float, max: Float, step: Float = 0.5f) = OptionSpec(
key = key, type = OptionType.SLIDER, titleRes = title, defaultFloat = value,
sliderMin = min, sliderMax = max, sliderStep = step, sliderDecimals = 1,
sliderUnitRes = if (key == Keys.DUAL_SCALE) R.string.sb_unit_scale else R.string.sb_unit_dp,
targetPackages = listOf(Keys.TARGET), dependsOn = Keys.DUAL_ROWS,
)
return listOf(
OptionSpec(key = KEY_STATUS_BAR, type = OptionType.ARROW, titleRes = R.string.sb_title),
toggle(Keys.WIFI_ACTIVITY, R.string.sb_wifi_hide_activity),
toggle(Keys.HIDE_TYPE, R.string.sb_mobile_hide_type),
OptionSpec(key = Keys.DUAL_ROWS, type = OptionType.SWITCH, titleRes = R.string.sb_dual_rows,
summaryRes = R.string.sb_dual_rows_summary, defaultBoolean = false,
targetPackages = listOf(Keys.TARGET), showStatus = true),
slider(Keys.DUAL_SCALE, R.string.sb_icon_scale, 1f, 0.6f, 1.6f, 0.1f),
slider(Keys.DUAL_LEFT_GAP, R.string.sb_left_gap, 0f, 0f, 8f),
slider(Keys.DUAL_RIGHT_GAP, R.string.sb_right_gap, 0f, 0f, 8f),
slider(Keys.DUAL_OFFSET, R.string.sb_vertical_offset, 0f, -4f, 4f),
)
}

Expand Down
9 changes: 9 additions & 0 deletions app/src/main/res/values-en/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -499,4 +499,13 @@
<string name="sb_wifi_hide_activity">Hide Wi-Fi activity indicators</string>
<string name="sb_mobile_type_section">Mobile network type</string>
<string name="sb_mobile_hide_type">Hide network type completely</string>
<string name="sb_mobile_dual_section">Stacked signals</string>
<string name="sb_dual_rows">Show two rows of stacked signals</string>
<string name="sb_dual_rows_summary">When enabled, mobile signal indicators use a stacked layout. Adjust the scale and position offsets as needed. Restart SystemUI after making changes.</string>
<string name="sb_icon_scale">Icon scale</string>
<string name="sb_left_gap">Left spacing</string>
<string name="sb_right_gap">Right spacing</string>
<string name="sb_vertical_offset">Vertical offset</string>
<string name="sb_unit_dp">dp</string>
<string name="sb_unit_scale">×</string>
</resources>
9 changes: 9 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -499,4 +499,13 @@
<string name="sb_wifi_hide_activity">隐藏 Wi-Fi 网络活动指示器</string>
<string name="sb_mobile_type_section">移动网络类型</string>
<string name="sb_mobile_hide_type">完全隐藏网络类型</string>
<string name="sb_mobile_dual_section">堆叠信号</string>
<string name="sb_dual_rows">显示双排堆叠信号</string>
<string name="sb_dual_rows_summary">开启后移动信号将更改为堆叠显示,请自行调整缩放和位置偏移量;修改完成后需要重启系统界面。</string>
<string name="sb_icon_scale">图标缩放</string>
<string name="sb_left_gap">左侧间距</string>
<string name="sb_right_gap">右侧间距</string>
<string name="sb_vertical_offset">垂直偏移</string>
<string name="sb_unit_dp">dp</string>
<string name="sb_unit_scale">×</string>
</resources>
2 changes: 1 addition & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

### 新增

- **状态栏 · 网络图标**(目标 `com.android.systemui`):新增「系统界面 → 状态栏」页,提供「隐藏 Wi-Fi 活动指示器」「完全隐藏网络类型」两项开关,默认关闭;双卡双行实现暂以注释源码保留,等待后续修复。
- **状态栏 · 网络图标**(目标 `com.android.systemui`):新增「系统界面 → 状态栏」页,提供「隐藏 Wi-Fi 活动指示器」「完全隐藏网络类型」与「显示双排堆叠信号」开关,默认关闭。双卡固定为上排 SIM 1、下排 SIM 2,使用普通宽度四格图形;移除加粗样式,统一图形比例并在绘制前完成更新,避免过渡中切回原生形状。下拉面板和返回桌面时的双排过渡已通过真机验证。
- **负一屏 · 过渡动画优化**(目标 `com.miui.personalassistant` / system_server):新增「负一屏」功能页。**过渡闪黑修复**消除打开 / 返回快速切换时的纯色闪黑;**上滑合并强制反向**修正返回动画被系统合并时先反向播一半的问题;**放行远程动画权限**(系统服务侧,需重启设备)让负一屏的远程过渡动画完整生效。思路参考 HyperAssistant(非开源,独立实现)。
- **负一屏 · 打开应用动画与过渡遮罩重绘**(目标 `com.miui.personalassistant`):**应用打开动画**让负一屏点开的应用从图标位置缩放展开(options 逐级剥离重试,失败回退框架动画);**过渡遮罩重绘**修复过渡中遮罩显示异常内容。
- **负一屏 · 返回缩回动画**(目标 `com.miui.personalassistant`):关闭应用回到负一屏时,部件快照从全屏缩回原位,接近末尾渐隐;需先开启「应用打开动画」。
Expand Down
2 changes: 1 addition & 1 deletion docs/CUSTOMIZE.md
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ HookOptionsPage(

通知功能的参考来源已登记到 `LicensePage.kt` 的参考项目分组,注明 GPL-3.0、仅思路参考、未复用代码或资源。新增七项配置和进程范围见 [通知功能说明](NOTIFICATION_PORT.md)。

状态栏功能的参考来源也在该分组登记;仅借鉴思路,未引入参考模块或小米 SystemUI 的代码、图片及原生库。两项开关的配置、目标进程和注释中的双卡双行实现见 [状态栏功能说明](STATUSBAR_PORT.md)。
状态栏功能的参考来源也在该分组登记;仅借鉴思路,未引入参考模块或小米 SystemUI 的代码、图片及原生库。各项开关的配置、目标进程和双排堆叠信号实现见 [状态栏功能说明](STATUSBAR_PORT.md)。

本模板的定位是**个人 Android 模块项目的脚手架模板**。具体参考与致谢清单统一维护在应用内「第三方许可证与致谢」页面(`LicensePage.kt` → `licenses_section_refs` 分组),衍生项目**可增不可删**。

Expand Down
19 changes: 12 additions & 7 deletions docs/STATUSBAR_PORT.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,35 @@
# 状态栏功能说明

入口:**功能 → 系统界面 → 状态栏**。当前仅开放以下两项开关,默认关闭,目标均为 `com.android.systemui`;修改后重新加载系统界面进程生效。
入口:**功能 → 系统界面 → 状态栏**。以下开关默认关闭,目标均为 `com.android.systemui`;修改后重新加载系统界面进程生效。

| 选项 | 配置键 | 效果 |
|---|---|---|
| 隐藏 Wi-Fi 网络活动指示器 | `statusbar_wifi_hide_activity` | 隐藏 Wi-Fi 的收发活动图标,保留信号与连接显示 |
| 完全隐藏网络类型 | `statusbar_mobile_hide_type` | 隐藏移动网络类型图片、独立文字和特殊 5G 标识,保留原生信号布局 |
| 显示双排堆叠信号 | `statusbar_mobile_dual_rows` | 将两个蜂窝信号合并为上下各四格,上排 SIM 1、下排 SIM 2 |

## 实现与验证

Wi-Fi Hook 在原生绑定与活动更新之后将对应活动视图隐藏,避免后续收发更新再次显示。移动网络类型 Hook 在原生蜂窝模型创建后,将四个类型显示 Flow 替换为宿主自身的只读 false Flow;兼容宿主经过优化的一参数构造与普通二参数构造。

配置通过项目既有 `OptionSpec`、偏好与 Hook 状态机制接入;状态栏子页面继承 `BaseSubPageActivity`,登记到父页搜索,并使用 `NetworkIconsActivity`。没有新增权限、作用域或原生依赖。

接口静态核对基于提供的 HyperOS `OS4.0.22.0.XPNCNXM` ROM,SystemUI `17.03.260226.r`;其他 ROM 的私有接口兼容性尚未验证。用户已确认本次精简测试 APK 的两个开关均生效、双 SIM 保持原生布局,从状态栏页下拉通知中心/控制中心时背景显示正常。单元测试覆盖配置键、反射成员解析和两种只读 Flow 构造签名;没有新增临时诊断日志。
接口静态核对基于提供的 HyperOS `OS4.0.22.0.XPNCNXM` ROM,SystemUI `17.03.260226.r`;其他 ROM 的私有接口兼容性尚未验证。用户先前已确认两个隐藏功能生效、关闭双排时保持原生布局,从状态栏页下拉通知中心/控制中心时背景显示正常。本轮恢复双排后,用户确认下拉通知中心、控制中心和返回桌面时双排无跳变,最终文案与三个功能均无异常。单元测试覆盖配置键、反射成员解析、只读 Flow 构造、图形比例、模型回退和绘制前事件处理;没有新增临时诊断日志。

## 暂不启用双卡双行
## 双排堆叠信号

`hook/.../systemui/statusbar/` 中的 `DualSimSignalHook.kt`、`DualSimRuntimeSupport.kt`、`DualSimArtworkPolicy.kt`、`StackedSignalDrawable.kt`、`StatusBarPolicy.kt`、`StatusBarViews.kt` 及对应双排测试以逐行注释保留,供后续修复参考。相关偏好键和宿主 Pair 解析辅助也已注释。
此前注释保留的双排实现和对应测试现已恢复。双排使用审阅通过的普通宽度、紧凑圆角图形;移除加粗样式和整个样式下拉框,旧 `statusbar_mobile_dual_style` 偏好不再读取。缩放、左右间距和垂直偏移继续提供,仅依赖双排开关;左右间距为原生间距的增量。

这些文件不生成运行时类;当前没有双排 Hook 注册、配置入口或搜索项,不读取该功能的旧偏好。系统继续使用原生 SIM 信号布局。以后恢复时须重新接入配置与注册,验证各卡信号强度、单双卡切换、数据卡切换、锁屏及主题/明暗表现;不能只取消某个文件的注释就视为可用。
图形在固定 16×20 的逻辑坐标中定义,随宿主 bounds 等比缩放,不再依赖原生主题图片的固有尺寸。主题、明暗和信号变化更新同一 Drawable;原生收集器返回前立即刷新,并在绘制前清理尚未合并的更新。临时隐藏、圆点及透明度动画不当作 SIM 消失,不因这些展示状态恢复原生单排图形。用户缩放与偏移在 Drawable 内完成,不覆盖 ImageView 的缩放或父容器的平移动画。

此前电脑端导出的 PNG/SVG 不是运行时依赖,未进入仓库或 APK。当前构建没有图标解包、图片落盘或系统资源替换。
仅对同一宿主中两张可见蜂窝 SIM 合并;单卡、无可识别强度、卫星或仅 VoWiFi 时恢复原生显示。灰格与亮格保留宿主着色和透明度。双排的模型订阅继续使用原生 JavaAdapter,不新增轮询。开关及四个布局偏好沿用旧键,保留已有配置;关闭双排并重新加载系统界面可恢复原生布局。

用户已在 `1.13.0-dualsim.1`(versionCode 30)确认下拉 Control center / notification shade、返回桌面时双排无跳变,并在 `1.13.0-dualsim.2-ui`(versionCode 31)确认最终文案和三个功能正常。两包全部 DEX 和原生库逐字节一致;后一包仅修改文案资源和测试版本号。单双卡/数据卡切换、卫星、仅 VoWiFi、锁屏及主题/明暗切换尚未收到本轮逐项真机记录,不能用已有反馈代替这些覆盖。已合并的两个隐藏 Hook 保持原样。

电脑端素材包已删除加粗 PNG/SVG 与包含加粗示例的旧预览,保留 50 张普通 PNG 和 2 张普通 SVG;这 52 个文件的内容与此前审阅版本一致。它们不是运行时依赖,未进入仓库或 APK。当前构建没有图标解包、图片落盘或系统资源替换。

## 参考与安全边界

功能思路参考 Pengeek(米客)`OS4-26.10.13-test`,来源与许可在应用内「关于 → 第三方许可证与致谢」统一登记。实现独立编写,未复用参考模块或小米专有代码/资源;逆向材料仅保留在本地忽略的 `reverse_report/`。项目继续以 AGPL-3.0 分发。

新增 Hook 仅修改 SystemUI 进程中的视图可见性与显示 Flow,不请求 Root、不执行 shell、不挂载或重新挂载分区、不操作块设备/AVB,也不向受保护系统分区写文件。安装 APK、项目既有偏好及系统/框架日志仍可能保存普通应用数据,因此此说明不承诺整个模块或临时 Root 环境的所有组件均无写入。
新增 Hook 仅修改 SystemUI 进程中的视图、显示 Flow 与内存 Drawable,不请求 Root、不执行 shell、不挂载或重新挂载分区、不操作块设备/AVB,也不向受保护系统分区写文件。安装 APK、项目既有偏好及系统/框架日志仍可能保存普通应用数据,因此此说明不承诺整个模块或临时 Root 环境的所有组件均无写入。
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import cn.ianzb.hyperrefine.hook.systemui.radius.CcRadiusKeys
import cn.ianzb.hyperrefine.hook.systemui.wallpaper.WallpaperDarkDimHook
import cn.ianzb.hyperrefine.hook.systemui.wallpaper.WallpaperDimKeys
import cn.ianzb.hyperrefine.hook.systemui.statusbar.HideWifiActivityHook
import cn.ianzb.hyperrefine.hook.systemui.statusbar.DualSimSignalHook
import cn.ianzb.hyperrefine.hook.systemui.statusbar.MobileIndicatorVisibilityHook
import cn.ianzb.hyperrefine.hook.systemui.statusbar.StatusBarKeys

Expand All @@ -28,6 +29,7 @@ class SystemUiLoad : BaseLoad() {
override fun onPackageLoaded(target: PackageTarget) {
initHook(HideWifiActivityHook(), HookPrefs.getBoolean(StatusBarKeys.WIFI_ACTIVITY))
initHook(MobileIndicatorVisibilityHook(), HookPrefs.getBoolean(StatusBarKeys.HIDE_TYPE))
initHook(DualSimSignalHook(), HookPrefs.getBoolean(StatusBarKeys.DUAL_ROWS))
initHook(CcVolumePercentHook(), HookPrefs.getBoolean(CcVolumePercentHook.KEY, false))
initHook(CcBrightnessPercentHook(), HookPrefs.getBoolean(CcBrightnessPercentHook.KEY, false))
initHook(SideVolumePercentHook(), HookPrefs.getBoolean(SideVolumePercentHook.KEY, false))
Expand Down
Loading
Loading