You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.6 KiB
Dart
78 lines
2.6 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:image_picker/image_picker.dart';
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
|
|
import 'package:test_sa/extensions/context_extension.dart';
|
|
import 'package:test_sa/models/device/predict_device_model.dart';
|
|
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
|
|
import 'package:test_sa/views/widgets/equipment/predict_device_list.dart';
|
|
|
|
class CopilotHelper {
|
|
static Future<PredictedAsset?> pickImageFromCamera(BuildContext context, {bool pickMode = false}) async {
|
|
final status = await Permission.camera.status;
|
|
|
|
if (status.isGranted) {
|
|
return openCamera(context, pickMode: pickMode);
|
|
}
|
|
|
|
final permission = await Permission.camera.request();
|
|
|
|
if (permission.isGranted) {
|
|
return openCamera(context, pickMode: pickMode);
|
|
}
|
|
|
|
if (permission.isPermanentlyDenied) {
|
|
await openAppSettings();
|
|
return null;
|
|
}
|
|
|
|
debugPrint('Camera permission denied');
|
|
return null;
|
|
}
|
|
|
|
static Future<PredictedAsset?> openCamera(BuildContext context, {bool pickMode = false}) async {
|
|
final XFile? pickedFile = await ImagePicker().pickImage(
|
|
source: ImageSource.camera,
|
|
imageQuality: 70,
|
|
);
|
|
|
|
if (pickedFile == null) {
|
|
return null;
|
|
}
|
|
|
|
final File imageFile = File(pickedFile.path);
|
|
|
|
return uploadImage(imageFile, context, pickMode: pickMode);
|
|
}
|
|
|
|
static Future<PredictedAsset?> uploadImage(File imageFile, BuildContext context, {bool pickMode = false}) async {
|
|
try {
|
|
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
|
|
AssetProvider assetProvider = Provider.of<AssetProvider>(context, listen: false);
|
|
|
|
PredictDeviceResponse? response = await assetProvider.predictDevice(imageFile);
|
|
Navigator.pop(context);
|
|
if (response != null && response.success == true) {
|
|
final List<PredictedAsset> predictedAssetList = response.predictedAsset ?? [];
|
|
if (predictedAssetList.isNotEmpty) {
|
|
return Navigator.push<PredictedAsset?>(
|
|
context,
|
|
MaterialPageRoute(builder: (context) => PredictDeviceView(predictedAsset: predictedAssetList, pickMode: pickMode)),
|
|
);
|
|
} else {
|
|
context.showInfoDialog("No Predicted asset found");
|
|
}
|
|
} else {
|
|
context.showInfoDialog("Failed to recognize the asset. Please try again.");
|
|
}
|
|
} catch (e) {
|
|
debugPrint('Upload error: $e');
|
|
}
|
|
return null;
|
|
}
|
|
}
|