privacy_controller.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import 'package:clean/base/base_controller.dart';
  2. import 'package:clean/model/asset_info.dart';
  3. import 'package:clean/utils/expand.dart';
  4. import 'package:clean/utils/file_utils.dart';
  5. import 'package:clean/utils/image_util.dart';
  6. import 'package:flutter/cupertino.dart';
  7. import 'package:flutter_screenutil/flutter_screenutil.dart';
  8. import 'package:get/get.dart';
  9. import 'package:permission_handler/permission_handler.dart';
  10. import 'package:wechat_assets_picker/wechat_assets_picker.dart';
  11. import 'package:wechat_camera_picker/wechat_camera_picker.dart';
  12. import '../../utils/toast_util.dart';
  13. import '../image_picker/image_picker_assets.dart';
  14. import 'package:intl/intl.dart';
  15. import 'dart:typed_data';
  16. import 'dart:io';
  17. class PrivacyController extends BaseController {
  18. late var passwordStr = "".obs;
  19. late var isUnlock = false.obs;
  20. late List<AssetEntity>? imageList;
  21. // 存储所有图片,按月份分组
  22. final assetsByMonth = <String, List<AssetInfo>>{}.obs;
  23. // 获取月份数量
  24. int get monthCount => assetsByMonth.length;
  25. // 获取总图片数量
  26. int get totalAssetCount =>
  27. assetsByMonth.values.fold(0, (sum, list) => sum + list.length);
  28. @override
  29. void onInit() {
  30. // TODO: implement onInit
  31. super.onInit();
  32. loadAssets();
  33. }
  34. // 加载并分组图片
  35. Future<void> loadAssets() async {
  36. final imageList = await FileUtils.getAllAssets();
  37. if (imageList.isEmpty) return;
  38. // 清空现有数据
  39. assetsByMonth.clear();
  40. // 按月份分组
  41. for (var asset in imageList) {
  42. final monthKey = ImageUtil.getMonthKey(asset.createDateTime);
  43. if (!assetsByMonth.containsKey(monthKey)) {
  44. assetsByMonth[monthKey] = [];
  45. }
  46. assetsByMonth[monthKey]!.add(asset);
  47. }
  48. // 对每个月份内的图片按时间排序(新的在前)
  49. assetsByMonth.forEach((key, list) {
  50. list.sort((a, b) => b.createDateTime.compareTo(a.createDateTime));
  51. });
  52. // 打印分组结果
  53. assetsByMonth.forEach((key, assets) {
  54. print('${ImageUtil.formatMonthKey(key)}: ${assets.length} photos');
  55. });
  56. }
  57. // 处理输入密码逻辑
  58. void inputPassword(String num) {
  59. passwordStr.value = passwordStr.value + num;
  60. if (passwordStr.value.length == 4) {
  61. if (passwordStr.value != "1234") {
  62. ToastUtil.show("Input Error");
  63. Future.delayed(const Duration(milliseconds: 100), () {
  64. passwordStr.value = "";
  65. });
  66. } else {
  67. isUnlock.value = true;
  68. }
  69. }
  70. }
  71. // 上传按钮点击
  72. void uploadBtnClick() {
  73. showCupertinoModalPopup(
  74. context: Get.context!,
  75. builder: (context) {
  76. return CupertinoActionSheet(
  77. actions: <Widget>[
  78. //操作按钮集合
  79. CupertinoActionSheetAction(
  80. onPressed: () {
  81. Navigator.pop(context);
  82. openGallery();
  83. },
  84. child: Text(
  85. 'Upload from Gallery',
  86. style: TextStyle(
  87. color: "#007AFF".color,
  88. fontWeight: FontWeight.w500,
  89. fontSize: 16.sp,
  90. ),
  91. ),
  92. ),
  93. CupertinoActionSheetAction(
  94. onPressed: () {
  95. Navigator.pop(context);
  96. openCamera();
  97. },
  98. child: Text(
  99. 'Take and Upload',
  100. style: TextStyle(
  101. color: "#007AFF".color,
  102. fontWeight: FontWeight.w500,
  103. fontSize: 16.sp,
  104. ),
  105. ),
  106. ),
  107. ],
  108. cancelButton: CupertinoActionSheetAction(
  109. //取消按钮
  110. onPressed: () {
  111. Navigator.pop(context);
  112. },
  113. child: Text(
  114. 'Cancel',
  115. style: TextStyle(
  116. color: "#007AFF".color,
  117. fontWeight: FontWeight.w500,
  118. fontSize: 16.sp,
  119. ),
  120. ),
  121. ),
  122. );
  123. },
  124. );
  125. }
  126. // 保存并刷新图片列表
  127. Future<void> saveAndRefreshAssets(List<AssetEntity> assets) async {
  128. for (var asset in assets) {
  129. await FileUtils.saveAsset(asset);
  130. }
  131. // 重新加载图片列表
  132. loadAssets();
  133. }
  134. // 开启图库
  135. Future<void> openGallery() async {
  136. var status = await Permission.photos.status;
  137. if (status == PermissionStatus.granted) {
  138. List<AssetEntity>? pickList = await ImagePickAssets.pick();
  139. if (pickList != null && pickList.isNotEmpty) {
  140. await saveAndRefreshAssets(pickList);
  141. }
  142. } else {
  143. ToastUtil.show("请先开启权限");
  144. }
  145. }
  146. // 开启相机
  147. Future<void> openCamera() async {
  148. final entity = await CameraPicker.pickFromCamera(
  149. Get.context!,
  150. pickerConfig: const CameraPickerConfig(),
  151. );
  152. if (entity != null) {
  153. await saveAndRefreshAssets([entity]);
  154. }
  155. }
  156. }