Files
dailyou/lib/core/providers/model_download_provider.dart
T
stefwill 68780ff436 fix: replace download flow with manual transfer instructions; rename app package
The Gemma model requires Kaggle login/licence so direct HTTP download is
not possible. Replaces the download screen with adb transfer instructions,
a Scan button that checks the file on disk, and a Continue without AI bypass.

Also renames the Android package from com.example.dailyou to
net.stefwill.dailyou (build.gradle.kts, MainActivity.kt path + declaration)
and adds *.bin to .gitignore to keep model files out of the repo.
2026-04-26 15:14:17 +10:00

54 lines
1.8 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../llm/model_download_service.dart';
import 'settings_provider.dart';
// ── Is the model file present on disk? ───────────────────────────────────────
final modelPresentProvider = FutureProvider<bool>((ref) {
return ModelDownloadService().isModelPresent();
});
// ── Has the user chosen to skip the model requirement? ───────────────────────
class _SkipNotifier extends Notifier<bool> {
@override
bool build() => false;
void skip() => state = true;
}
final modelSkippedProvider =
NotifierProvider<_SkipNotifier, bool>(_SkipNotifier.new);
// ── Scan notifier — checks for the model on demand ──────────────────────────
class ModelScanNotifier extends Notifier<AsyncValue<bool>> {
@override
AsyncValue<bool> build() => const AsyncData(false);
Future<void> scan() async {
state = const AsyncLoading();
final next = await AsyncValue.guard(
() => ModelDownloadService().isModelPresent(),
);
if (!ref.mounted) return;
next.whenData((present) async {
if (present) {
await ref.read(settingsNotifierProvider.notifier).markModelDownloaded();
ref.invalidate(modelPresentProvider);
} else {
state = AsyncError(
Exception('Model file not found at expected path'),
StackTrace.current,
);
}
});
if (next is AsyncError) state = next;
}
void skipToApp() => ref.read(modelSkippedProvider.notifier).skip();
}
final modelScanProvider =
NotifierProvider.autoDispose<ModelScanNotifier, AsyncValue<bool>>(
ModelScanNotifier.new);