diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index e581d4be..be5a0a45 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -688,5 +688,6 @@ "手掌":"palm", "商城":"mall", - "我的":"my" + "我的":"my", + "微信公众号推送":"Wechat public account" } diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 5f2bea9c..14cea3b3 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -687,5 +687,6 @@ "手掌":"手掌", "商城":"mall", - "我的":"my" + "我的":"my", + "微信公众号推送":"微信公众号推送" } diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 374cf216..c664d9e6 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -688,5 +688,6 @@ "虹膜":"虹膜", "手掌":"手掌", "商城":"商城", - "我的":"我的" + "我的":"我的", + "微信公众号推送":"微信公众号推送" } diff --git a/star_lock/lib/app.dart b/star_lock/lib/app.dart index 7f56de7f..28167871 100644 --- a/star_lock/lib/app.dart +++ b/star_lock/lib/app.dart @@ -107,16 +107,6 @@ class _MyAppState extends State with WidgetsBindingObserver, BaseWidget { void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); - - // XSJPushProvider().initJPushService(); - loginInitLocalNotification(); - } - - Future loginInitLocalNotification() async { - bool isLoggedIn = await getLoginStatus(); - if (isLoggedIn) { - XSJPushProvider().initLocalNotification(false); - } } @override diff --git a/star_lock/lib/login/login/starLock_login_logic.dart b/star_lock/lib/login/login/starLock_login_logic.dart index 8d421a2a..2b932cb5 100644 --- a/star_lock/lib/login/login/starLock_login_logic.dart +++ b/star_lock/lib/login/login/starLock_login_logic.dart @@ -18,16 +18,17 @@ class StarLockLoginLogic extends BaseGetXController { void login() async { var entity = await ApiRepository.to.login( - loginType:"1", - password:state.pwd.value, - countryCode:state.countryCode.value, - username:state.emailOrPhone.value); + loginType: "1", + password: state.pwd.value, + countryCode: state.countryCode.value, + username: state.emailOrPhone.value); if (entity.errorCode!.codeIsSuccessful) { Storage.saveLoginData(entity.data); eventBus.fire(MineInfoChangeRefreshUI()); // Get.back(); // Get.toNamed(Routers.starLockMain); XSJPushProvider().initJPushService(); + XSJPushProvider().initLocalNotification(false); Get.offNamedUntil(Routers.starLockMain, (route) => false); } } diff --git a/star_lock/lib/mine/mineSet/mineSet/mineSet_logic.dart b/star_lock/lib/mine/mineSet/mineSet/mineSet_logic.dart index 00d381f8..586874a2 100644 --- a/star_lock/lib/mine/mineSet/mineSet/mineSet_logic.dart +++ b/star_lock/lib/mine/mineSet/mineSet/mineSet_logic.dart @@ -1,11 +1,15 @@ import 'dart:async'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/mine/mineSet/lockUserManage/expireLockList/expireElectronicKey/expireLockList_entity.dart'; import 'package:star_lock/mine/mineSet/mineSet/mineSet_state.dart'; +import 'package:star_lock/mine/mineSet/mineSet/weChatQRCodeEntity.dart'; +import 'package:star_lock/tools/appFirstEnterHandle.dart'; import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/xs_jPhush.dart'; +import 'package:star_lock/versionUndate/versionUndate_entity.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; import '../../../blue/blue_manage.dart'; @@ -36,6 +40,12 @@ class MineSetLogic extends BaseGetXController { } else { state.isTouchUnlock.value = false; } + //微信公众号推送 + if (entity.data!.mpWechatPushSwitch! == 1) { + state.isWechatPublicAccountPush.value = true; + } else { + state.isWechatPublicAccountPush.value = false; + } } } @@ -49,6 +59,33 @@ class MineSetLogic extends BaseGetXController { } } + //设置微信公众号推送 + Future setMpWechatPushSwitchRequest(BuildContext widgetContext) async { + VersionUndateEntity entity = await ApiRepository.to.setMpWechatPushSwitch( + mpWechatPushSwitch: + state.isWechatPublicAccountPush.value == true ? 1 : 2); + if (entity.errorCode!.codeIsSuccessful) { + showToast("设置成功".tr); + userSettingsInfoRequest(); + } else if (entity.errorCode! == 421) { + //请先扫码绑定微信公众号 + getMpWechatQrCodeRequest(widgetContext); + } + } + + //获取微信公众号二维码 + Future getMpWechatQrCodeRequest(BuildContext widgetContext) async { + GetWechatQrCodeEntity entity = await ApiRepository.to.getMpWechatQrCode(); + if (entity.errorCode!.codeIsSuccessful) { + state.qrCodeUrl.value = entity.data!.qrCodeUrl!; + showQRImageAlert(state.qrCodeUrl.value, widgetContext); + } + } + + void showQRImageAlert(String qrCodeUrl, BuildContext widgetContext) { + AppFirstEnterHandle().showQRImageAlert(widgetContext, qrCodeUrl); + } + //退出登录请求 Future userLogoutRequest() async { var getPushDeviceID = ''; diff --git a/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart b/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart index 04651825..50f8d4aa 100644 --- a/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart +++ b/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart @@ -89,10 +89,21 @@ class _MineSetPageState extends State with WidgetsBindingObserver { leftTitel: TranslationLoader.lanKeys!.pushNotification!.tr, rightTitle: "", isHaveRightWidget: true, + isHaveLine: F.appFlavor == Flavor.sky ? true : false, rightWidget: SizedBox( width: 60.w, height: 50.h, child: Obx(() => _isPushNotificationSwitch()))), + F.appFlavor == Flavor.sky + ? CommonItem( + leftTitel: "微信公众号推送".tr, + rightTitle: "", + isHaveRightWidget: true, + rightWidget: SizedBox( + width: 60.w, + height: 50.h, + child: Obx(() => _isWechatPublicAccountPushSwitch()))) + : Container(), SizedBox(height: 10.h), CommonItem( leftTitel: TranslationLoader.lanKeys!.lockUserManagement!.tr, @@ -273,7 +284,7 @@ class _MineSetPageState extends State with WidgetsBindingObserver { isDelete: true, onClick: () { //退出登录 - ShowTipView().showIosTipWithContentDialog("确定要退出吗?".tr, (){ + ShowTipView().showIosTipWithContentDialog("确定要退出吗?".tr, () { logic.userLogoutRequest(); }); // showLoginOutAlertTipDialog(); @@ -291,7 +302,8 @@ class _MineSetPageState extends State with WidgetsBindingObserver { color: AppColors.darkGrayTextColor, fontSize: 18.sp), ), onPressed: () { - ShowTipView().showIosTipWithContentDialog(TranslationLoader.lanKeys!.deleteAccountTips!.tr, (){ + ShowTipView().showIosTipWithContentDialog( + TranslationLoader.lanKeys!.deleteAccountTips!.tr, () { //安全验证 Get.toNamed(Routers.safeVerifyPage); }); @@ -389,6 +401,21 @@ class _MineSetPageState extends State with WidgetsBindingObserver { ); } +//微信公众号推送开关 + CupertinoSwitch _isWechatPublicAccountPushSwitch() { + return CupertinoSwitch( + activeColor: CupertinoColors.activeBlue, + trackColor: CupertinoColors.systemGrey5, + thumbColor: CupertinoColors.white, + value: state.isWechatPublicAccountPush.value, + onChanged: (value) { + state.isWechatPublicAccountPush.value = + !state.isWechatPublicAccountPush.value; + logic.setMpWechatPushSwitchRequest(context); + }, + ); + } + CupertinoSwitch _isPushNotificationSwitch() { return CupertinoSwitch( activeColor: CupertinoColors.activeBlue, diff --git a/star_lock/lib/mine/mineSet/mineSet/mineSet_state.dart b/star_lock/lib/mine/mineSet/mineSet/mineSet_state.dart index 1caccd3d..b6002a9c 100644 --- a/star_lock/lib/mine/mineSet/mineSet/mineSet_state.dart +++ b/star_lock/lib/mine/mineSet/mineSet/mineSet_state.dart @@ -9,6 +9,8 @@ class MineSetState { var isPrompTone = false.obs; //提示音 var isTouchUnlock = false.obs; //触摸开锁 var isPushNotification = false.obs; //消息推送 + var isWechatPublicAccountPush = false.obs; //微信公众号推送 + var qrCodeUrl = ''.obs; //二维码地址 var lockScreen = 2.obs; //锁屏 var hideExpiredAccessFlag = 2.obs; //隐藏无效开锁 diff --git a/star_lock/lib/mine/mineSet/mineSet/userSettingInfoEntity.dart b/star_lock/lib/mine/mineSet/mineSet/userSettingInfoEntity.dart index e84bd014..5591b7ea 100644 --- a/star_lock/lib/mine/mineSet/mineSet/userSettingInfoEntity.dart +++ b/star_lock/lib/mine/mineSet/mineSet/userSettingInfoEntity.dart @@ -41,6 +41,7 @@ class UserSettingInfoData { int? hasCameraLock; int? hasGoogleHome; int? alertMode; + int? mpWechatPushSwitch; UserSettingInfoData( {this.userSettings, @@ -54,7 +55,8 @@ class UserSettingInfoData { this.hasPaidFeature, this.hasCameraLock, this.hasGoogleHome, - this.alertMode}); + this.alertMode, + this.mpWechatPushSwitch}); UserSettingInfoData.fromJson(Map json) { userSettings = json['userSettings'] != null @@ -71,6 +73,7 @@ class UserSettingInfoData { hasCameraLock = json['hasCameraLock']; hasGoogleHome = json['hasGoogleHome']; alertMode = json['alertMode']; + mpWechatPushSwitch = json['mpWechatPushSwitch']; } Map toJson() { @@ -89,6 +92,7 @@ class UserSettingInfoData { data['hasCameraLock'] = hasCameraLock; data['hasGoogleHome'] = hasGoogleHome; data['alertMode'] = alertMode; + data['mpWechatPushSwitch'] = mpWechatPushSwitch; return data; } } diff --git a/star_lock/lib/mine/mineSet/mineSet/weChatQRCodeEntity.dart b/star_lock/lib/mine/mineSet/mineSet/weChatQRCodeEntity.dart new file mode 100644 index 00000000..df8c021d --- /dev/null +++ b/star_lock/lib/mine/mineSet/mineSet/weChatQRCodeEntity.dart @@ -0,0 +1,43 @@ +class GetWechatQrCodeEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + GetWechatQrCodeEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + GetWechatQrCodeEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + String? qrCodeUrl; + + Data({this.qrCodeUrl}); + + Data.fromJson(Map json) { + qrCodeUrl = json['qrCodeUrl']; + } + + Map toJson() { + final Map data = {}; + data['qrCodeUrl'] = qrCodeUrl; + return data; + } +} diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index 8f9cd047..18b00715 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -45,7 +45,8 @@ abstract class Api { final String passwordKeyGetURL = '/keyboardPwd/get'; //获取密码 final String passwordKeyAddURL = '/keyboardPwd/add'; //自定义密码 - final String passwordKeyCheckKeyboardpwdNameURL = '/keyboardPwd/checkKeyboardpwdName'; //自定义密码校验密码跟名字是否重复 + final String passwordKeyCheckKeyboardpwdNameURL = + '/keyboardPwd/checkKeyboardpwdName'; //自定义密码校验密码跟名字是否重复 final String updatePasswordKeyURL = '/keyboardPwd/update'; //修改密码详情 final String clearOperationRecordURL = '/lockRecords/clear'; //清空操作记录 final String addlockGroupURL = '/keyGroup/add'; //创建锁分组 @@ -175,7 +176,8 @@ abstract class Api { '/safeAnswer/getOwnQuestionList'; //获取已设置的安全信息 final String updateSafeAnswerURL = '/safeAnswer/update'; //修改安全信息 final String setSafeAnswerURL = '/safeAnswer/set'; //设置安全信息 - final String getUpTokenURL = '/file/getUploadParams'; //上传头像 先获取upToken 再调用updateUserInfo + final String getUpTokenURL = + '/file/getUploadParams'; //上传头像 先获取upToken 再调用updateUserInfo final String unbindPhoneTokenURL = '/user/unbindPhoneToken'; //获取解绑手机号Token final String unbindEmailTokenURL = '/user/unbindEmailToken'; //获取解绑邮箱Token final String pushBindAppIdURL = '/user/bindAppId'; //推送绑定APP设备 @@ -193,4 +195,7 @@ abstract class Api { final String getLockNoticeSettingURL = '/lockSetting/getLockNoticeSetting'; //获取锁消息设置 + final String setWechatPushSwitchURL = + '/user/setMpWechatPushSwitch'; //设置微信公众号推送 + final String getMpWechatQrCodeURL = '/user/getMpWechatQrCode'; //获取微信公众号二维码 } diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index b4e0d1e2..83989ffb 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -453,10 +453,7 @@ class ApiProvider extends BaseProvider { // 自定义密码校验名字密码是否重复 Future checkKeyboardpwdName( - String lockId, - String keyboardPwdName, - String keyboardPwd - ) => + String lockId, String keyboardPwdName, String keyboardPwd) => post( passwordKeyCheckKeyboardpwdNameURL.toUrl, jsonEncode({ @@ -1556,14 +1553,16 @@ class ApiProvider extends BaseProvider { })); //更新个人信息-昵称 - Future updateUserNameInfo(String nickname) => - post(updateUserInfoURL.toUrl, jsonEncode({ + Future updateUserNameInfo(String nickname) => post( + updateUserInfoURL.toUrl, + jsonEncode({ 'nickname': nickname, })); //更新个人信息-头像 - Future updateUserHeadUrlInfo(String headUrl) => - post(updateUserInfoURL.toUrl, jsonEncode({ + Future updateUserHeadUrlInfo(String headUrl) => post( + updateUserInfoURL.toUrl, + jsonEncode({ 'headUrl': headUrl, })); @@ -1626,10 +1625,10 @@ class ApiProvider extends BaseProvider { // 获取上传文件的upToken 再调用updateUserInfo Future getUpHeadToken( - String userId, - String filename, - int size, - ) => + String userId, + String filename, + int size, + ) => post( getUpTokenURL.toUrl, jsonEncode({ @@ -1641,7 +1640,9 @@ class ApiProvider extends BaseProvider { // 文件上传 Future uploadFile(String url, dynamic boay) => post(url, boay, - isUnUploadFile: false, contentType: 'multipart/form-data', isUserBaseUrl: false); + isUnUploadFile: false, + contentType: 'multipart/form-data', + isUserBaseUrl: false); //获取解绑手机号Token Future unbindPhoneToken(String verificationCode) => post( @@ -1779,6 +1780,17 @@ class ApiProvider extends BaseProvider { jsonEncode({ 'lockId': lockId, })); + + // 设置微信公众号推送 + Future setMpWechatPushSwitch(int mpWechatPushSwitch) => post( + setWechatPushSwitchURL.toUrl, + jsonEncode({ + 'mpWechatPushSwitch': mpWechatPushSwitch, + })); + + // 获取微信公众号二维码 + Future getMpWechatQrCode() => + post(getMpWechatQrCodeURL.toUrl, jsonEncode({})); } extension ExtensionString on String { diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 479de7f5..06478fc1 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -21,6 +21,7 @@ import 'package:star_lock/mine/mineSet/lockUserManage/expireLockList/expireElect import 'package:star_lock/mine/mineSet/lockUserManage/expireLockList/expireFingerprint/expireFingerprint_entity.dart'; import 'package:star_lock/mine/mineSet/lockUserManage/lockUserManageList/keyListByUserEntity.dart'; import 'package:star_lock/mine/mineSet/mineSet/userSettingInfoEntity.dart'; +import 'package:star_lock/mine/mineSet/mineSet/weChatQRCodeEntity.dart'; import '../common/safetyVerification/entity/CheckSafetyVerificationEntity.dart'; import '../common/safetyVerification/entity/SafetyVerificationEntity.dart'; import '../login/login/entity/LoginEntity.dart'; @@ -101,12 +102,10 @@ class ApiRepository { //登录 Future login( - { - required String loginType, - required String password, - required String countryCode, - required String username - }) async { + {required String loginType, + required String password, + required String countryCode, + required String username}) async { final res = await apiProvider.login(loginType, password, countryCode, username); return LoginEntity.fromJson(res.body); @@ -274,7 +273,8 @@ class ApiRepository { } // 更新锁用户NO - Future updateLockUserNo({required String keyId, required String lockUserNo}) async { + Future updateLockUserNo( + {required String keyId, required String lockUserNo}) async { final res = await apiProvider.updateLockUserNo(keyId, lockUserNo); return LockNetTokenEntity.fromJson(res.body); } @@ -401,8 +401,7 @@ class ApiRepository { } // 删除锁 - Future deletOwnerLockData( - {required int lockId}) async { + Future deletOwnerLockData({required int lockId}) async { final res = await apiProvider.deletLockInfo(lockId); return LockListInfoEntity.fromJson(res.body); } @@ -456,13 +455,11 @@ class ApiRepository { //自定义密码校验密码名称或密码是否已存在 Future checkKeyboardpwdName( - { - required String lockId, - required String keyboardPwdName, - required String keyboardPwd - }) async { - final res = await apiProvider.checkKeyboardpwdName(lockId, keyboardPwdName, - keyboardPwd); + {required String lockId, + required String keyboardPwdName, + required String keyboardPwd}) async { + final res = await apiProvider.checkKeyboardpwdName( + lockId, keyboardPwdName, keyboardPwd); return PasswordKeyEntity.fromJson(res.body); } @@ -1601,8 +1598,7 @@ class ApiRepository { } //更新个人信息-昵称 - Future updateUserNameInfo( - { + Future updateUserNameInfo({ required String nickname, }) async { final res = await apiProvider.updateUserNameInfo(nickname); @@ -1611,9 +1607,7 @@ class ApiRepository { //更新个人信息-头像 Future updateUserHeadUrlInfo( - { - required String headUrl - }) async { + {required String headUrl}) async { final res = await apiProvider.updateUserHeadUrlInfo(headUrl); return PasswordKeyListEntity.fromJson(res.body); } @@ -1673,8 +1667,7 @@ class ApiRepository { required String filename, required int size, }) async { - final res = - await apiProvider.getUpHeadToken(userId, filename, size); + final res = await apiProvider.getUpHeadToken(userId, filename, size); return MinePersonGetUploadFileInfoEntity.fromJson(res.body); } @@ -1813,4 +1806,17 @@ class ApiRepository { final res = await apiProvider.getLockNoticeSetting(lockId); return VersionUndateEntity.fromJson(res.body); } + + // 设置微信公众号推送 + Future setMpWechatPushSwitch( + {required int mpWechatPushSwitch}) async { + final res = await apiProvider.setMpWechatPushSwitch(mpWechatPushSwitch); + return VersionUndateEntity.fromJson(res.body); + } + + // 获取微信公众号二维码 + Future getMpWechatQrCode() async { + final res = await apiProvider.getMpWechatQrCode(); + return GetWechatQrCodeEntity.fromJson(res.body); + } } diff --git a/star_lock/lib/tools/appFirstEnterHandle.dart b/star_lock/lib/tools/appFirstEnterHandle.dart index 57ac9153..fce022fe 100644 --- a/star_lock/lib/tools/appFirstEnterHandle.dart +++ b/star_lock/lib/tools/appFirstEnterHandle.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; @@ -179,6 +180,39 @@ class AppFirstEnterHandle { ); } + //微信公众号二维码弹窗 + void showQRImageAlert(BuildContext widgetContext, String qrCodeUrl) { + showCupertinoDialog( + context: widgetContext, + builder: (context) { + return PopScope( + canPop: false, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.network( + qrCodeUrl, + width: 1.sw - 40.w, + height: 1.sw - 40.w, + ), + SizedBox( + height: 20.h, + ), + //点击屏幕任意位置关闭弹窗 + GestureDetector( + onTap: () { + Navigator.of(context).pop(); + }, + child: Image.asset('images/icon_massSend_delete.png'), + ), + ], + ))); + }, + ); + } + // _launchURL(String url) async { // if (await canLaunchUrl(Uri.parse(url))) { // await launchUrl(Uri.parse(url)); diff --git a/star_lock/lib/tools/xs_jPhush.dart b/star_lock/lib/tools/xs_jPhush.dart index a5bb0df3..63fcc4cd 100644 --- a/star_lock/lib/tools/xs_jPhush.dart +++ b/star_lock/lib/tools/xs_jPhush.dart @@ -65,9 +65,11 @@ class XSJPushProvider { FlutterLocalNotificationsPlugin(); const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('app_icon'); - const InitializationSettings initializationSettings = - InitializationSettings(android: initializationSettingsAndroid); - await flutterLocalNotificationsPlugin.initialize(initializationSettings); + if (Platform.isAndroid) { + const InitializationSettings initializationSettings = + InitializationSettings(android: initializationSettingsAndroid); + await flutterLocalNotificationsPlugin.initialize(initializationSettings); + } if (isCancelLocalPush) { await flutterLocalNotificationsPlugin.cancelAll();