79 lines
3.5 KiB
Dart
79 lines
3.5 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import '../app/app_controller.dart';
|
|
import '../l10n/tr.dart';
|
|
|
|
/// 39 · 116: 지금 권한 안내 창을 띄울 차례인지. 같은 안내를 거듭 띄우지 않되,
|
|
/// 권한이 있으면 표시를 지워 두어 권한이 없어진 뒤 (사용자가 끔 · 재설치) 다음에 켤 때 한 번 더 띄운다.
|
|
Future<bool> allFilesGuideDue(AppController c, {required bool hasAccess}) async {
|
|
if (hasAccess) {
|
|
if (c.settings.general.allFilesHintShown) await c.updateSettings((s) => s.general.allFilesHintShown = false);
|
|
return false;
|
|
}
|
|
if (c.settings.general.allFilesHintShown) return false;
|
|
await c.updateSettings((s) => s.general.allFilesHintShown = true);
|
|
return true;
|
|
}
|
|
|
|
/// 116: 처음 켤 때 "모든 파일에 대한 접근" 안내 (분석 오류보다 먼저). [허용] 은 Android 설정 화면을 연다.
|
|
/// 허용하고 돌아오면 앱이 실패한 분석을 저절로 다시 한다.
|
|
/// 199: 기기에 따라 (노트 10+ · 삼성 Android 12) 이 앱 화면이 아니라 전체 앱 목록이 열린다 - 예외도 나지 않아 미리 알 수 없다.
|
|
/// 그래서 돌아왔을 때 [hasAccess] 가 아직 없으면 "목록에서 JJ_MKVMaker 를 찾아 켜세요" 와 [다시 열기] 를 보인다
|
|
Future<void> showAllFilesGuide(BuildContext context, Future<void> Function() request, {Future<bool> Function()? hasAccess}) async {
|
|
final ok = await showDialog<bool>(
|
|
context: context,
|
|
builder: (ctx) => AlertDialog(
|
|
scrollable: true,
|
|
title: Text(tr('파일 접근 권한')),
|
|
content: SizedBox(
|
|
width: 480,
|
|
child: Text('${tr('동영상을 고르고 MKV 를 만들려면 "모든 파일에 대한 접근" 권한이 필요합니다.')}\n\n'
|
|
'${tr('[허용] 을 누르면 Android 설정이 열립니다. JJ_MKVMaker 를 허용하고 돌아오면, 읽지 못했던 동영상을 저절로 다시 분석합니다.')}\n\n'
|
|
'${tr('기기에 따라 앱 목록이 열리면, 목록에서 JJ_MKVMaker 를 찾아 켜세요.')}'),
|
|
),
|
|
actions: [
|
|
TextButton(onPressed: () => Navigator.pop(ctx, false), child: Text(tr('나중에'))),
|
|
FilledButton(onPressed: () => Navigator.pop(ctx, true), child: Text(tr('허용'))),
|
|
],
|
|
),
|
|
);
|
|
if (ok != true) return;
|
|
for (var i = 0; i < 3; i++) {
|
|
final back = _resumed();
|
|
await request();
|
|
if (hasAccess == null) return;
|
|
await back;
|
|
if (await hasAccess() || !context.mounted) return;
|
|
// 199: 돌아왔는데 아직 꺼져 있음 - 앱 목록이 열렸거나 켜지 않고 돌아옴
|
|
final again = await showDialog<bool>(
|
|
context: context,
|
|
builder: (ctx) => AlertDialog(
|
|
scrollable: true,
|
|
title: Text(tr('아직 허용되지 않았습니다')),
|
|
content: SizedBox(
|
|
width: 480,
|
|
child: Text(tr('앱 목록이 열렸다면, 목록에서 JJ_MKVMaker 를 찾아 눌러 "모든 파일에 대한 접근" 을 켜고 돌아오세요.')),
|
|
),
|
|
actions: [
|
|
TextButton(onPressed: () => Navigator.pop(ctx, false), child: Text(tr('나중에'))),
|
|
FilledButton(onPressed: () => Navigator.pop(ctx, true), child: Text(tr('다시 열기'))),
|
|
],
|
|
),
|
|
);
|
|
if (again != true) return;
|
|
}
|
|
}
|
|
|
|
/// 다른 화면 (Android 설정) 에서 이 앱으로 돌아올 때까지
|
|
Future<void> _resumed() {
|
|
final done = Completer<void>();
|
|
late final AppLifecycleListener l;
|
|
l = AppLifecycleListener(onResume: () {
|
|
l.dispose();
|
|
if (!done.isCompleted) done.complete();
|
|
});
|
|
return done.future;
|
|
}
|