void perform('gamepad.settings',{enabled})}/>>}
{view==='apps'&&<>setQuery(e.target.value)}/>
{listed.map(a=>
{a.metadata.name}{a.metadata.version}
{a.metadata.package}{contextFor(a.context)?.name??a.context} · {bytes(a.size)} · {t(a.stateKnown===false?'安装状态未知':a.installed?(a.running?'容器运行中':'已安装'):'已卸载但保留数据')}
{a.pending&&
{t(a.pending)}
}{a.installed&&!a.metadata.activities.length&&!a.activity&&
{t('未发现启动入口')}
}
{a.installed&&a.stateKnown!==false&&}
)}
{!listed.length&&{loading?t('正在读取'):t('没有匹配的 APK 应用。')}
}>}
- {view==='containers'&&<>{data.containers.map(c=>
{c.name}
{c.baked}{t(c.steam?'Steam 管理':c.managed?'Framely 管理':'已有侧载容器')} · {t(c.running?'运行中':'已停止')}
{data.apps.filter(a=>a.context===c.id&&a.installed).map(a=>a.metadata.name).join(', ')||t('未发现已安装的应用,启动容器不会安装 APK。')}
{!c.steam&&<>>}
)}
>}
+ {view==='containers'&&<>{data.containers.map(c=>
{containerTitle(c)}
{c.baked}{t(c.steam?'Steam 管理':c.managed?'Framely 管理':'已有侧载容器')} · {t(c.running?'运行中':'已停止')}
{!data.apps.some(a=>a.context===c.id&&a.installed)&&
{t('未发现已安装的应用,启动容器不会安装 APK。')}
}
{!c.steam&&<>>}
)}
>}
{view==='cleanup'&&<>{t('数据清理')}
{t('存档、设置与恢复备份默认不选中。未知归属的数据不会自动删除。')}
{cleanup.map(i=>setSelected(s=>checked?[...s,i.id]:s.filter(v=>v!==i.id))}/>{i.name}{t(i.kind==='unknown'?'未知归属的数据':i.kind==='data'?'保留的应用数据':i.kind==='backups'?'恢复备份':(i.kind==='reviews'||i.kind==='uploads')?'过期上传文件':'旧 APK')} · {bytes(i.bytes)}
{i.unknown?
{t('无法确认归属,不提供自动删除。')}:i.sensitive&&
{t('删除后不可恢复')}}
{i.restorable&&})}{!cleanup.length&&{t('没有可清理的数据。')}
}>}
{!!data.warnings.length&&{t('部分容器无法读取')}
{data.warnings.map((w,i)=>{w}
)} }
{details&&!confirm&&!review&&!log&&!job&&dialog(<>- {t('版本')}
- {details.metadata.version} ({details.metadata.versionCode})
- {t('容器')}
- {contextFor(details.context)?.name??details.context}
- {t('空间占用')}
- {bytes(details.size)}
{details.pending&&<>{t(details.pending)}
>}{details.installed&&details.stateKnown!==false&&!details.steam&&<>>}{!details.installed&&details.stateKnown!==false&&!details.steam&&}
{details.installed&&details.stateKnown!==false&&!details.steam&&{t('高级设置')}
void perform('steam.settings',{app:details.id,enabled})}/>{(details.steamLaunch??true)&&!details.steamRegistered&&{t('等待 Steam 注册,Steam 就绪后会自动重试。')}
}{details.steamRegistrationError&&{details.steamRegistrationError}
}{t('默认自动处理窗口显示。此开关不改变应用的二维或 VR 类型。')}
void perform('settings',{app:details.id,showWindow:checked?null:true})}/>{details.showWindow!=null&&void perform('settings',{app:details.id,showWindow:checked})}/>}{t('窗口设置将在下次打开应用时应用;必要时自动重启容器。')}
}>,t('管理应用'))}
- {review&&!job&&dialog(<>{t(updating?'确认更新 APK':'确认安装 APK')}
- {t('版本')}
- {updating&&`${updating.metadata.version} → `}{review.metadata.version} ({review.metadata.versionCode})
- {t('文件大小')}
- {bytes(review.bytes)}
- {t('最低 Android SDK')}
- {review.metadata.minSdk||t('未声明')}
- {t('启动入口')}
- {review.metadata.activities.length||t('未发现启动入口')}
{t('平面模式显示二维窗口;VR 模式隐藏二维窗口,应用本身需要支持 VR。')}
{!updating&&{t('每个新应用使用独立容器,更新保留原容器。')}
}{target&&{t('操作可能需要停止目标容器,影响其中正在运行的应用。')}
}{updating&&{t('同包名更新保留数据;签名不匹配或降级不会自动卸载重装。')}
}{updating&&{t('共享容器的备份需手动恢复;独立侧载容器支持一键恢复。')}
}{error&&{error}
}>,t('安装 APK'))}
+ {review&&!confirm&&!job&&dialog(<>{t(updating?'确认更新 APK':'确认安装 APK')}
- {t('版本')}
- {updating&&`${updating.metadata.version} → `}{review.metadata.version} ({review.metadata.versionCode})
- {t('文件大小')}
- {bytes(review.bytes)}
- {t('最低 Android SDK')}
- {review.metadata.minSdk||t('未声明')}
- {t('启动入口')}
- {review.metadata.activities.length||t('未发现启动入口')}
{t('平面模式显示二维窗口;VR 模式隐藏二维窗口,应用本身需要支持 VR。')}
{!updating&&{t('每个新应用使用独立容器,更新保留原容器。')}
}{installContainer?.running&&!installContainer.steam&&{t('安装前需要关闭容器,以安全备份应用数据。关闭会中断其中正在运行的应用,保留存档和设置。')}
}{updating&&{t('同包名更新保留数据;签名不匹配或降级不会自动卸载重装。')}
}{updating&&{t('共享容器的备份需手动恢复;独立侧载容器支持一键恢复。')}
}{error&&{error}
{installContainer&&!installContainer.steam&&!installContainer.running&&/container|backup|容器|备份/i.test(error)&&
}
}>,t('安装 APK'))}
{confirm&&!job&&dialog(<>{confirm.title}
{confirm.description}
{confirm.app&&{confirm.app.metadata.name}
{confirm.app.metadata.package}
}{confirm.operation==='uninstall'&&setConfirm(c=>c?{...c,purge}:c)}/>}{deletesData&&{t('永久删除的数据无法撤销。')}
}{error&&{error}
}>,confirm.title)}
{job&&dialog(<>{t(job.phase==='preparing'&&job.operation?operationLabels[job.operation]??phases[job.phase]:phases[job.phase]??job.phase)}
{t('操作进行中,请等待实际结果。')}