import 'dart:convert'; import 'dart:io'; import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart'; import 'package:classify_photo/classify_photo.dart'; import 'package:clean/base/base_controller.dart'; import 'package:clean/data/consts/constants.dart'; import 'package:clean/data/repositories/event_repository.dart'; import 'package:clean/data/repositories/user_repository.dart'; import 'package:clean/module/image_picker/image_picker_util.dart'; import 'package:clean/module/locations_photo/locations_photo_view.dart'; import 'package:clean/module/people_photo/people_photo_view.dart'; import 'package:clean/module/screenshots_blurry/screenshots_view.dart'; import 'package:clean/module/similar_photo/similar_photo_view.dart'; import 'package:clean/router/app_pages.dart'; import 'package:clean/utils/toast_util.dart'; import 'package:flutter/Material.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:wechat_assets_picker/wechat_assets_picker.dart'; import '../../data/api/response/user_info_response.dart'; import '../../data/consts/event_report_id.dart'; import '../../data/repositories/config_repository.dart'; import '../../handler/event_handler.dart'; import '../../handler/photo_scan_handler.dart'; import '../../widget/multi_segment_circle_indicator.dart'; class HomeController extends BaseController { Rx totalSpace = 0.0.obs; Rx usedSpace = 0.0.obs; Rx photoSpace = 0.0.obs; Rx freeSpace = 0.0.obs; Rx totalSpaceStr = "".obs; Rx usedSpaceStr = "".obs; Rx photoSpaceStr = "".obs; Rx freeSpaceStr = "".obs; // 计算已用存储百分比 double get usedSpacePercentage => (usedSpace.value / totalSpace.value) * 100; // 计算照片占用存储百分比 double get photoSpacePercentage => (photoSpace.value / totalSpace.value) * 100; // 计算可用存储百分比 double get freeSpacePercentage => (freeSpace.value / totalSpace.value) * 100; RxList similarImages = List.generate(4, (index) => 'iconHomeNoPhoto').obs; RxInt imageCount = 0.obs; // 相似图片 RxList similarPhotos = PhotoScanHandler.similarPhotos; // 人物图片 RxList peoplePhotos = PhotoScanHandler.peoplePhotos; // 地点图片 Rx locationPhoto = PhotoScanHandler.locationPhoto; // 截图照片 Rx screenshotPhoto = PhotoScanHandler.screenshotPhoto; // 模糊照片 Rx blurryPhoto = PhotoScanHandler.blurryPhoto; // 是否扫描完成 RxBool isSimilarScanned = PhotoScanHandler.isSimilarScanned; // 是否扫描完成 RxBool isPeopleScanned = PhotoScanHandler.isPeopleScanned; // 是否扫描完成 RxBool isScreenShotScanned = PhotoScanHandler.isScreenShotScanned; // 是否扫描完成 RxBool isBlurryScanned = PhotoScanHandler.isBlurryScanned; // 存储是否扫描完成 RxBool isStorageScanned = false.obs; UserInfoResponse? get userInfo => userRepository.userInfo.value; List get pieDataList => [ PieData("PhotoSpace", photoSpacePercentage, Colors.blue), PieData("OtherUsed", usedSpacePercentage - photoSpacePercentage, Colors.red), PieData("totalSpace", totalSpace.value, Colors.grey.withOpacity(0.1)), ]; @override Future onInit() async { // TODO: implement onInit super.onInit(); if (Platform.isAndroid) { // 延迟3秒 Future.delayed(const Duration(seconds: 3), () { isStorageScanned.value = true; totalSpace.value = 200.0; usedSpace.value = 50.0; photoSpace.value = 30.0; freeSpace.value = 150.0; }); } configRepository.refreshConfig(); await userRepository.getUserInfo(); if (userRepository.userInfo.value != null) { Airbridge.setUserID(userRepository.userInfo.value!.ssid); // 接收归因结果 Airbridge.setOnAttributionReceived((result) { print(result); Map attr = {}; attr["attributedChannel"] = "Appstore"; Airbridge.fetchDeviceUUID(onSuccess: (uuid) { eventRepository.attrPush(uuid, "airbridge", jsonEncode(result)); }); }); } EventHandler.pushInstall(); if (!isFirstIntoApp() && !userRepository.isVip()) { Get.toNamed(RoutePath.discount); } setFirstIntoApp(false); var status = await Permission.photos.status; if (status.isGranted) { getStorageInfo(); } else if (status.isPermanentlyDenied) { ToastUtil.show("Please enable the album permission"); openAppSettings(); } else { ToastUtil.show("Please enable the album permission"); } } @override void onReady() { super.onReady(); // EventHandler.report(EventId.event_03000); } Future getStorageInfo() async { final classifyPhoto = ClassifyPhoto(); try { final storageInfo = await classifyPhoto.getStorageInfo(); // 转换为 GB final totalSpaceGB = storageInfo['totalSpace']! / (1000 * 1000 * 1000); final freeSpaceGB = storageInfo['freeSpace']! / (1024 * 1024 * 1024); final usedSpaceGB = storageInfo['usedSpace']! / (1024 * 1024 * 1024); final photoSpaceGB = storageInfo['photoSpace']! / (1024 * 1024 * 1024); totalSpaceStr.value = ImagePickerUtil.formatFileSize( storageInfo['totalSpace']!, decimals: 1); freeSpaceStr.value = ImagePickerUtil.formatFileSize( storageInfo['freeSpace']!, decimals: 1); usedSpaceStr.value = ImagePickerUtil.formatFileSize( storageInfo['usedSpace']!, decimals: 1); photoSpaceStr.value = ImagePickerUtil.formatFileSize( storageInfo['photoSpace']!, decimals: 1); totalSpace.value = totalSpaceGB.round().toDouble(); freeSpace.value = freeSpaceGB; usedSpace.value = usedSpaceGB; photoSpace.value = photoSpaceGB; print('总容量: $totalSpaceStr'); print('可用空间: $freeSpaceStr'); print('已用空间: $usedSpaceStr'); print('照片占用: $photoSpaceStr'); isStorageScanned.value = true; } catch (e) { print('获取存储信息失败: $e'); } } // Future handleScreenPhotos() async { // final photoClassify = ClassifyPhoto(); // try { // print('开始获取截图照片'); // final photos = await photoClassify.getScreenshots(); // print('获取截图照片完成: ${photos?.length ?? 0} 组照片'); // isScreenShotScanned.value = true; // if (photos != null) { // await ImagePickerUtil.updatePhotos(photos); // if (ImagePickerUtil.screenshotPhotos.isNotEmpty) { // var asset = ImagePickerUtil.screenshotPhotos.first; // screenshotPhoto.value = asset; // } // } // } catch (e, stackTrace) { // print('获取照片失败: $e'); // print('Stack trace: $stackTrace'); // } // } // // Future handleBlurryPhotos() async { // final photoClassify = ClassifyPhoto(); // try { // print('开始获取模糊照片'); // final photos = await photoClassify.getBlurryPhotos(); // print('获取模糊照片完成: ${photos?.length ?? 0} 组照片'); // isBlurryScanned.value = true; // if (photos != null) { // await ImagePickerUtil.updatePhotos(photos); // if (ImagePickerUtil.blurryPhotos.isNotEmpty) { // var asset = ImagePickerUtil.blurryPhotos.first; // blurryPhoto.value = asset; // } // } // } catch (e, stackTrace) { // print('获取照片失败: $e'); // print('Stack trace: $stackTrace'); // } // } // // Future handlePeoplePhotos() async { // final photoClassify = ClassifyPhoto(); // try { // print('开始获取人物照片'); // final photos = await photoClassify.getPeoplePhotos(); // print('获取人物照片完成: ${photos?.length ?? 0} 组照片'); // isPeopleScanned.value = true; // if (photos != null) { // await ImagePickerUtil.updatePhotos(photos); // // // 处理人物照片 // peoplePhotos.clear(); // if (ImagePickerUtil.peoplePhotos.isNotEmpty) { // for (var personPhotos in ImagePickerUtil.peoplePhotos) { // peoplePhotos.add(personPhotos); // if (peoplePhotos.length == 2) { // break; // } // } // } // } // } catch (e, stackTrace) { // print('获取照片失败: $e'); // print('Stack trace: $stackTrace'); // } // } // // Future handleSimilarPhotos() async { // final photoClassify = ClassifyPhoto(); // try { // print('开始获取相似照片'); // final photos = await photoClassify.getSimilarPhotos(); // print('获取相似照片完成: ${photos?.length ?? 0} 组照片'); // isSimilarScanned.value = true; // if (photos != null) { // await ImagePickerUtil.updatePhotos(photos); // // similarPhotos.clear(); // if (ImagePickerUtil.similarPhotos.isNotEmpty) { // for (var group in ImagePickerUtil.similarPhotos) { // for (var asset in group) { // similarPhotos.add(asset); // if (similarPhotos.length == 4) { // break; // } // } // } // } // } // } catch (e, stackTrace) { // print('获取照片失败: $e'); // print('Stack trace: $stackTrace'); // } // } // Future handlePhotos() async { // final photoClassify = ClassifyPhoto(); // try { // print('开始获取照片'); // final photos = await photoClassify.getPhoto(); // print('获取照片完成: ${photos?.length ?? 0} 组照片'); // // // 已完成扫描 // // isScanned.value = true; // // if (photos != null) { // await ImagePickerUtil.updatePhotos(photos); // // similarPhotos.clear(); // if (ImagePickerUtil.similarPhotos.isNotEmpty) { // for (var group in ImagePickerUtil.similarPhotos) { // for (var asset in group) { // similarPhotos.add(asset); // if (similarPhotos.length == 4) { // break; // } // } // } // } // // // 处理地点照片 // locationPhoto.value = null; // if (ImagePickerUtil.locationPhotos.isNotEmpty) { // // 获取第一个地点的第一张照片 // final firstLocationPhotos = // ImagePickerUtil.locationPhotos.values.first; // if (firstLocationPhotos.isNotEmpty) { // var asset = firstLocationPhotos.first; // locationPhoto.value = asset; // } // } // // // 处理人物照片 // peoplePhotos.clear(); // if (ImagePickerUtil.peoplePhotos.isNotEmpty) { // for (var personPhotos in ImagePickerUtil.peoplePhotos) { // peoplePhotos.add(personPhotos); // if (peoplePhotos.length == 2) { // break; // } // } // } // // if (ImagePickerUtil.screenshotPhotos.isNotEmpty) { // var asset = ImagePickerUtil.screenshotPhotos.first; // screenshotPhoto.value = asset; // } // // if (ImagePickerUtil.blurryPhotos.isNotEmpty) { // var asset = ImagePickerUtil.blurryPhotos.first; // blurryPhoto.value = asset; // } // } // } catch (e, stackTrace) { // print('获取照片失败: $e'); // print('Stack trace: $stackTrace'); // } // } void _navigateAndStartPage(Function pageStartFunction) { // if (isFirstClickHomeClean()) { // setFirstClickHomeClean(false); // Get.toNamed(RoutePath.discount)?.then((value) { // pageStartFunction(); // }); // } else { pageStartFunction(); // } } similarCleanClick() { print('similarCleanClick'); EventHandler.report(EventId.event_03001); _navigateAndStartPage(SimilarPhotoPage.start); } peopleCleanClick() { print('peopleCleanClick'); EventHandler.report(EventId.event_03002); _navigateAndStartPage(PeoplePhotoPage.start); } locationCleanClick() { print('locationCleanClick'); EventHandler.report(EventId.event_03003); _navigateAndStartPage(LocationsPhotoPage.start); } screenshotCleanClick() { print('screenshotCleanClick'); EventHandler.report(EventId.event_03004); _navigateAndStartPage(() => ScreenshotsPage.start("Screenshots")); } blurryCleanClick() { print('blurCleanClick'); EventHandler.report(EventId.event_03005); _navigateAndStartPage(() => ScreenshotsPage.start("Blurry")); } titleVipClick() { EventHandler.report(EventId.event_02000); Get.toNamed(RoutePath.store); } }