P0 보충: 되돌리기의 AI 모델 복사 체크는 [저장하고 계속] 때만 설정에 ([취소] 하면 그대로, 건드리지 않으면 자동 유지)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
묶음3
RyuJongJin 2026-10-09 18:27:25 +09:00
parent e4524cdb9a
commit f34cbe5a69
2 changed files with 24 additions and 8 deletions

View File

@ -457,6 +457,7 @@ Future<void> _androidRollback(BuildContext context, AppController c, Updater up,
final free = (await diskSpace(probe))?.$1; final free = (await diskSpace(probe))?.$1;
final setting = c.settings.rollbackKeepModels; final setting = c.settings.rollbackKeepModels;
var keep = modelSize > 0 && (setting == 'on' || (setting == '' && free != null && free >= modelSize * 2)); var keep = modelSize > 0 && (setting == 'on' || (setting == '' && free != null && free >= modelSize * 2));
var keepTouched = false;
// 옮겨 둔 모델을 되살리는 기능은 이 판 다음부터 들어 있다 (설정 되살리기는 v2026.10.08_001 부터) // 옮겨 둔 모델을 되살리는 기능은 이 판 다음부터 들어 있다 (설정 되살리기는 v2026.10.08_001 부터)
final targetRestoresModels = compareVersions(r.version, '2026.10.09_001') > 0; final targetRestoresModels = compareVersions(r.version, '2026.10.09_001') > 0;
final targetRestoresSettings = compareVersions(r.version, '2026.10.08_001') >= 0; final targetRestoresSettings = compareVersions(r.version, '2026.10.08_001') >= 0;
@ -499,10 +500,11 @@ Future<void> _androidRollback(BuildContext context, AppController c, Updater up,
CheckboxListTile( CheckboxListTile(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
value: keep, value: keep,
onChanged: (v) { // 고른 것은 [저장하고 계속] 을 누를 때만 설정에 남긴다 ([취소] 하면 그대로)
setInner(() => keep = v ?? false); onChanged: (v) => setInner(() {
c.updateSettings((x) => x.rollbackKeepModels = keep ? 'on' : 'off'); keep = v ?? false;
}, keepTouched = true;
}),
title: Text(trf('받은 AI 모델 ({0}) 을 Download/JJ_MKVMaker 에 복사해 두었다가 다시 설치한 뒤 되살리기 (잠시 {0} 더 필요)', [size])), title: Text(trf('받은 AI 모델 ({0}) 을 Download/JJ_MKVMaker 에 복사해 두었다가 다시 설치한 뒤 되살리기 (잠시 {0} 더 필요)', [size])),
subtitle: Text([ subtitle: Text([
if (free != null) trf('남은 공간 {0}', [gbText(free)]), if (free != null) trf('남은 공간 {0}', [gbText(free)]),
@ -525,6 +527,9 @@ Future<void> _androidRollback(BuildContext context, AppController c, Updater up,
), ),
); );
if (ok != true || !context.mounted) return; if (ok != true || !context.mounted) return;
// 체크를 바꿨으면 이제 설정에 (자동이던 것은 건드리지 않으면 자동 그대로)
if (keepTouched) await c.updateSettings((x) => x.rollbackKeepModels = keep ? 'on' : 'off');
if (!context.mounted) return;
// 사라지는 것이 있으니 한 번 더 (비밀번호 · 로그인은 늘 사라진다) // 사라지는 것이 있으니 한 번 더 (비밀번호 · 로그인은 늘 사라진다)
final sure = await showDialog<bool>( final sure = await showDialog<bool>(
context: context, context: context,

View File

@ -268,7 +268,7 @@ void main() {
expect(up.calls, ['download 1.0.0', 'uninstall']); expect(up.calls, ['download 1.0.0', 'uninstall']);
}); });
testWidgets('P0 Android: 받은 AI 모델을 복사해 두기 (기본: 남은 공간이 2배 이상이면 켬) · 끄면 "다시 받아야" · 설정에 기억', (tester) async { testWidgets('P0 Android: 받은 AI 모델을 복사해 두기 (기본: 남은 공간이 2배 이상이면 켬) · 끄면 "다시 받아야" · [저장하고 계속] 때만 설정에 기억', (tester) async {
up.installsInPlace = true; up.installsInPlace = true;
up.downloaded = (File(p.join(data.path, 'dl.apk'))..writeAsStringSync('apk')).path; up.downloaded = (File(p.join(data.path, 'dl.apk'))..writeAsStringSync('apk')).path;
File(p.join(data.path, 'ai', 'models', 'esrgan.pth')) File(p.join(data.path, 'ai', 'models', 'esrgan.pth'))
@ -292,13 +292,24 @@ void main() {
await tester.tap(find.byType(Checkbox)); await tester.tap(find.byType(Checkbox));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.textContaining('다시 받아야 합니다 (약 3MB)'), findsOneWidget); expect(find.textContaining('다시 받아야 합니다 (약 3MB)'), findsOneWidget);
expect(c.settings.rollbackKeepModels, 'off'); // 체크를 바꿔도 [취소] 하면 설정은 그대로 (자동)
// 다시 켜고 진행 → 공용 폴더에 모델 사본과 목록 await tester.tap(find.text('취소'));
await tester.pumpAndSettle();
expect(c.settings.rollbackKeepModels, '');
await openPicker(tester);
await tester.tap(find.text('v1.0.0').first);
await tester.pumpAndSettle();
await tester.tap(find.text('이 버전으로 되돌리기'));
await settleIo(tester, until: () => find.text('저장하고 계속').evaluate().isNotEmpty);
// 끄고 다시 켠 뒤 [저장하고 계속] 을 누를 때 설정에 → 공용 폴더에 모델 사본과 목록
await tester.tap(find.byType(Checkbox)); await tester.tap(find.byType(Checkbox));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(c.settings.rollbackKeepModels, 'on'); await tester.tap(find.byType(Checkbox));
await tester.pumpAndSettle();
expect(c.settings.rollbackKeepModels, '');
await tester.tap(find.text('저장하고 계속')); await tester.tap(find.text('저장하고 계속'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(c.settings.rollbackKeepModels, 'on');
await tester.tap(find.text('되돌리기 계속')); await tester.tap(find.text('되돌리기 계속'));
await settleIo(tester, until: () => find.text('저장했습니다').evaluate().isNotEmpty); await settleIo(tester, until: () => find.text('저장했습니다').evaluate().isNotEmpty);
expect(find.text('저장했습니다'), findsOneWidget); expect(find.text('저장했습니다'), findsOneWidget);