feat(android): Add screenshot processing for Android assistant
This commit is contained in:
@@ -45,9 +45,24 @@ class MainActivity : FlutterActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun handleIntent(intent: android.content.Intent) {
|
private fun handleIntent(intent: android.content.Intent) {
|
||||||
|
android.util.Log.d("MainActivity", "handleIntent called")
|
||||||
|
android.util.Log.d("MainActivity", "Intent extras: ${intent.extras?.keySet()}")
|
||||||
|
|
||||||
val screenContext = intent.getStringExtra("screen_context")
|
val screenContext = intent.getStringExtra("screen_context")
|
||||||
|
val screenshotPath = intent.getStringExtra("screenshot_path")
|
||||||
|
|
||||||
|
android.util.Log.d("MainActivity", "screenContext: $screenContext")
|
||||||
|
android.util.Log.d("MainActivity", "screenshotPath: $screenshotPath")
|
||||||
|
android.util.Log.d("MainActivity", "methodChannel: $methodChannel")
|
||||||
|
|
||||||
if (screenContext != null) {
|
if (screenContext != null) {
|
||||||
|
android.util.Log.d("MainActivity", "Invoking analyzeScreen")
|
||||||
methodChannel?.invokeMethod("analyzeScreen", screenContext)
|
methodChannel?.invokeMethod("analyzeScreen", screenContext)
|
||||||
|
} else if (screenshotPath != null) {
|
||||||
|
android.util.Log.d("MainActivity", "Invoking analyzeScreenshot with path: $screenshotPath")
|
||||||
|
methodChannel?.invokeMethod("analyzeScreenshot", screenshotPath)
|
||||||
|
} else {
|
||||||
|
android.util.Log.d("MainActivity", "No screen context or screenshot path found")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
|
import 'dart:io';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
|
import '../../features/chat/providers/chat_providers.dart';
|
||||||
|
import '../../features/chat/services/file_attachment_service.dart';
|
||||||
|
import '../services/navigation_service.dart';
|
||||||
|
import '../../shared/services/tasks/task_queue.dart';
|
||||||
|
import '../providers/app_providers.dart';
|
||||||
|
import '../../features/auth/providers/unified_auth_providers.dart';
|
||||||
|
import 'debug_logger.dart';
|
||||||
|
|
||||||
final androidAssistantProvider = Provider(
|
final androidAssistantProvider = Provider(
|
||||||
(ref) => AndroidAssistantHandler(ref),
|
(ref) => AndroidAssistantHandler(ref),
|
||||||
@@ -30,6 +39,67 @@ class AndroidAssistantHandler {
|
|||||||
if (call.method == 'analyzeScreen') {
|
if (call.method == 'analyzeScreen') {
|
||||||
final String context = call.arguments as String;
|
final String context = call.arguments as String;
|
||||||
_ref.read(screenContextProvider.notifier).setContext(context);
|
_ref.read(screenContextProvider.notifier).setContext(context);
|
||||||
|
} else if (call.method == 'analyzeScreenshot') {
|
||||||
|
final String screenshotPath = call.arguments as String;
|
||||||
|
await _processScreenshot(screenshotPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _processScreenshot(String screenshotPath) async {
|
||||||
|
try {
|
||||||
|
DebugLogger.log('Processing screenshot: $screenshotPath', scope: 'assistant');
|
||||||
|
|
||||||
|
// Wait for app to be ready (authenticated and model available)
|
||||||
|
final navState = _ref.read(authNavigationStateProvider);
|
||||||
|
final model = _ref.read(selectedModelProvider);
|
||||||
|
|
||||||
|
if (navState != AuthNavigationState.authenticated || model == null) {
|
||||||
|
DebugLogger.log('App not ready for screenshot processing', scope: 'assistant');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Navigate to chat if not already there
|
||||||
|
final isOnChatRoute = NavigationService.currentRoute == Routes.chat;
|
||||||
|
if (!isOnChatRoute) {
|
||||||
|
// Navigation will happen via auth state
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start a fresh chat context
|
||||||
|
startNewChat(_ref);
|
||||||
|
|
||||||
|
// Add screenshot as attachment
|
||||||
|
final file = File(screenshotPath);
|
||||||
|
if (!await file.exists()) {
|
||||||
|
DebugLogger.log('Screenshot file not found: $screenshotPath', scope: 'assistant');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final svc = _ref.read(fileAttachmentServiceProvider);
|
||||||
|
if (svc != null) {
|
||||||
|
final attachment = LocalAttachment(
|
||||||
|
file: file,
|
||||||
|
displayName: path.basename(screenshotPath),
|
||||||
|
);
|
||||||
|
|
||||||
|
_ref.read(attachedFilesProvider.notifier).addFiles([attachment]);
|
||||||
|
|
||||||
|
// Enqueue upload via task queue
|
||||||
|
final activeConv = _ref.read(activeConversationProvider);
|
||||||
|
try {
|
||||||
|
await _ref.read(taskQueueProvider.notifier).enqueueUploadMedia(
|
||||||
|
conversationId: activeConv?.id,
|
||||||
|
filePath: attachment.file.path,
|
||||||
|
fileName: attachment.displayName,
|
||||||
|
fileSize: await attachment.file.length(),
|
||||||
|
);
|
||||||
|
DebugLogger.log('Screenshot uploaded successfully', scope: 'assistant');
|
||||||
|
} catch (e) {
|
||||||
|
DebugLogger.log('Failed to upload screenshot: $e', scope: 'assistant');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
DebugLogger.log('Failed to process screenshot: $e', scope: 'assistant');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user