This repository has been archived on 2026-06-02. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
bvandeusen 4da36aa31d Initial commit: Fabled Android app
Flutter Android client for FabledAssistant with:
- Session-cookie auth via persistent cookie jar (Dio + cookie_jar)
- OAuth/SSO login via in-app WebView (flutter_inappwebview)
- Notes: list, detail (markdown render), create/edit
- Tasks: list with status tabs, create/edit with priority
- Chat: SSE streaming bubbles, conversation management
- Quick Capture FAB for rapid note/task creation
- Settings screen (change server URL, logout)
- Android home screen widget → opens chat
- Riverpod state management, go_router navigation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 21:28:53 -05:00

56 lines
1.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'app.dart';
import 'providers/settings_provider.dart';
const _widgetChannel = MethodChannel('com.fabledapp.fabled_app/widget');
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = await SharedPreferences.getInstance();
final appDir = await getApplicationDocumentsDirectory();
runApp(
ProviderScope(
overrides: [
sharedPreferencesProvider.overrideWithValue(prefs),
cookiesPathProvider.overrideWithValue(appDir.path),
],
child: const _WidgetIntentListener(child: FabledApp()),
),
);
}
// Listens for MethodChannel calls from the native Android widget.
class _WidgetIntentListener extends StatefulWidget {
final Widget child;
const _WidgetIntentListener({required this.child});
@override
State<_WidgetIntentListener> createState() => _WidgetIntentListenerState();
}
class _WidgetIntentListenerState extends State<_WidgetIntentListener> {
@override
void initState() {
super.initState();
_widgetChannel.setMethodCallHandler((call) async {
if (call.method == 'openChat') {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (context.mounted) {
Navigator.of(context, rootNavigator: true)
.pushNamedAndRemoveUntil('/chat', (_) => false);
}
});
}
});
}
@override
Widget build(BuildContext context) => widget.child;
}