diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3add551..9620d25 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -42,6 +42,8 @@ + + diff --git a/lib/ui/exclude/exclude_contacts_page.dart b/lib/ui/exclude/exclude_contacts_page.dart index ddd053a..f72f850 100644 --- a/lib/ui/exclude/exclude_contacts_page.dart +++ b/lib/ui/exclude/exclude_contacts_page.dart @@ -1,4 +1,11 @@ +import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_contacts/flutter_contacts.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:get/get_utils/get_utils.dart'; import 'package:project_telephony/ui/widget/scaffold_theme_widget.dart'; class ExcludeContactsPage extends StatefulWidget { @@ -9,13 +16,87 @@ class ExcludeContactsPage extends StatefulWidget { } class _ExcludeContactsPageState extends State { + late List contacts; + List numbers = []; + List status = []; + var flag = true; + + @override + void initState() { + super.initState(); + _incrementCounter(); + } + + Future _incrementCounter() async { + contacts = await FlutterContacts.getContacts(); + for (var element in contacts) { + final full = await FlutterContacts.getContact(element.id); + numbers.add(full!.phones.first.number); + status.add(false); + } + setState(() {}); + } + @override Widget build(BuildContext context) { + var profileBuilder = FutureBuilder( + future: _incrementCounter(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.waiting && flag) { + flag = false; + return Container(); + } else { + return ListView.builder( + itemCount: contacts.length, + itemBuilder: (context, i) => ListTile( + title: Text( + contacts[i].displayName, + style: TextStyle( + fontSize: 32.sp, + fontWeight: FontWeight.w600, + ), + ), + subtitle: Text( + numbers[i], + style: TextStyle( + fontSize: 28.sp, + fontWeight: FontWeight.w300, + ), + ), + trailing: Checkbox( + value: status[i], + // 改变后的事件 + onChanged: (value) { + setState(() { + status[i] = !status[i]; + }); + }, + // 选中后的颜色 + activeColor: Colors.blue, + // 选中后对号的颜色 + checkColor: Colors.white, + ), + ).paddingOnly(left: 20.w), + ); + } + }, + ); + return ScaffoldThemeWidget( title: "从通讯录添加", bottom: "添加", - onTap: () { }, - child: Container(), + onTap: () { + if(status.contains(true)){ + // BotToast.showText(text: "有"); + + Get.back(); + }else{ + BotToast.showText(text: "还未选中手机号"); + } + }, + isOpacity: status.contains(true), + isBorder: true, + child: profileBuilder, ); } } diff --git a/lib/ui/exclude/exclude_single_page.dart b/lib/ui/exclude/exclude_single_page.dart new file mode 100644 index 0000000..f47907b --- /dev/null +++ b/lib/ui/exclude/exclude_single_page.dart @@ -0,0 +1,68 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:project_telephony/ui/widget/scaffold_theme_widget.dart'; +import 'package:velocity_x/velocity_x.dart'; + +class ExcludeSinglePage extends StatefulWidget { + const ExcludeSinglePage({Key? key}) : super(key: key); + + @override + _ExcludeSinglePageState createState() => _ExcludeSinglePageState(); +} + +class _ExcludeSinglePageState extends State { + @override + Widget build(BuildContext context) { + return ScaffoldThemeWidget( + title: '添加单个或批量号码', + bottom: "添加", + onTap: () {}, + child: Container( + padding: EdgeInsets.only(top: 25.h, left: 50.w, right: 50.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + addNumber("号码", "请输入号码"), + 15.heightBox, + addNumber("名称", "请输入名称"), + 15.heightBox, + RichText( + text: const TextSpan( + children: [ + TextSpan(text: "使用说明:"), + TextSpan(text: "如输入000*,可屏蔽所有000开头的号码") + ], + ), + ), + ], + ), + ), + ); + } + + addNumber(String title, content) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: const TextStyle( + fontSize: 18, + color: Colors.black38, + fontWeight: FontWeight.w600, + ), + ), + 15.heightBox, + TextField( + decoration: InputDecoration( + hintText: content, + border: const OutlineInputBorder( + ), + ), + ), + ], + ); + } +} diff --git a/lib/ui/home/set/specify_phone_page.dart b/lib/ui/home/set/specify_phone_page.dart index 6e12ca6..da382d9 100644 --- a/lib/ui/home/set/specify_phone_page.dart +++ b/lib/ui/home/set/specify_phone_page.dart @@ -3,8 +3,9 @@ import 'package:flustars/flustars.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:project_telephony/ui/exclude/exclude_contacts_page.dart'; +import 'package:project_telephony/ui/exclude/exclude_single_page.dart'; +import 'package:project_telephony/ui/home/home_page.dart'; import 'package:project_telephony/ui/home/set/phone_num_list/call_records_list.dart'; - import 'package:project_telephony/utils/headers.dart'; import 'package:project_telephony/ui/widget/plone_bottom.dart'; @@ -30,56 +31,64 @@ class _SpecifyPhonePageState extends State { super.dispose(); } - @override Widget build(BuildContext context) { - return ScaffoldThemeWidget(title: "发送号码设置", bottom: '添加', onTap: () { - showModalBottomSheet( - builder: (BuildContext context) { - return Container( - width: double.infinity, - height: 750.w, - padding: EdgeInsets.symmetric(horizontal: 32.w), - child: Column( - children: [ - 48.hb, - Text( - "添加号码", - style: TextStyle( - fontSize: 34.w, - fontWeight: FontWeight.bold), - ), - Expanded( - child: ListView( - children: [ - _getAddPhone("通话记录添加", "通过本机通话记录添加号码", () { - Get.to(() => const CallRecordsList()); - }), - _getAddPhone("通迅录添加", "通过本机通讯录添加号码", () { - Get.to(() => (const ExcludeContactsPage())); - }), - _getAddPhone( - "添加单个或批量号码", "通过输入号码段添加批量号码", () {}), - ], - )), - PloneBottom( - onTap: () { - Navigator.pop(context); - }, - hPadding: 32, - border: true, - textColor: const Color(0xFF1890FF), - color2: const Color(0xFFF9F9F9), - color1: const Color(0xFFF9F9F9), - text: "取消", - ), - 32.hb - ], - ), - ); - }, - context: context); - }, + return ScaffoldThemeWidget( + title: "发送号码设置", + bottom: '添加', + onTap: () { + showModalBottomSheet( + builder: (BuildContext context) { + return Container( + width: double.infinity, + height: 750.w, + padding: EdgeInsets.symmetric(horizontal: 32.w), + child: Column( + children: [ + 48.hb, + Text( + "添加号码", + style: TextStyle( + fontSize: 34.w, fontWeight: FontWeight.bold), + ), + Expanded( + child: ListView( + children: [ + _getAddPhone("通话记录添加", "通过本机通话记录添加号码", () { + Get.to(() => ScaffoldThemeWidget( + bottom: '添加', + title: '从通话记录添加', + isBorder: true, + isOpacity: false, + onTap: () {}, + child: const CallRecordsList())); + }), + _getAddPhone("通迅录添加", "通过本机通讯录添加号码", () { + Get.to(() => (const ExcludeContactsPage())); + }), + _getAddPhone("添加单个或批量号码", "通过输入号码段添加批量号码", () { + Get.to(() => (const ExcludeSinglePage())); + }), + ], + )), + PloneBottom( + onTap: () { + Navigator.pop(context); + }, + hPadding: 32, + border: true, + textColor: const Color(0xFF1890FF), + color2: const Color(0xFFF9F9F9), + color1: const Color(0xFFF9F9F9), + text: "取消", + ), + 32.hb + ], + ), + ); + }, + context: context); + }, child: EasyRefresh( firstRefresh: true, controller: _refreshController, @@ -93,9 +102,9 @@ class _SpecifyPhonePageState extends State { child: ListView( children: [ _getNullList(), - ], - )),); + )), + ); // PloneBottom( // onTap: () { // showModalBottomSheet( diff --git a/lib/ui/user/privacy_rights_page.dart b/lib/ui/user/privacy_rights_page.dart index 461f9b8..3bdec92 100644 --- a/lib/ui/user/privacy_rights_page.dart +++ b/lib/ui/user/privacy_rights_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -8,8 +7,6 @@ import 'package:project_telephony/ui/widget/plone_back_button.dart'; import 'package:project_telephony/utils/headers.dart'; import 'package:url_launcher/url_launcher.dart'; - - class PrivacyRightsPage extends StatefulWidget { final String name; @@ -30,6 +27,7 @@ final Uri _url = Uri.parse('https://www.dxbs.vip//explain.html'); bool sms = false; bool plone = false; bool callLog = false; +bool contacts = false; @override class _PrivacyRightsPageState extends State { @@ -45,6 +43,7 @@ class _PrivacyRightsPageState extends State { sms = await Permission.sms.request().isGranted; plone = await Permission.phone.request().isGranted; callLog = await Permission.callLog.request().isGranted; + contacts = await Permission.contacts.request().isGranted; setState(() {}); } @@ -69,6 +68,7 @@ class _PrivacyRightsPageState extends State { _getRights("获取设备来电状态", "用于获取来电状态", plone), _getRights("获取设备短信权限", "用于发送短信", sms), _getRights("获取设备通话记录", "用于获取来电", callLog), + _getRights("获取设备通讯录", "用于插入排除手机号", contacts), ], ), bottomNavigationBar: GestureDetector( @@ -121,6 +121,7 @@ class _PrivacyRightsPageState extends State { onTap: () async { if (!state) { openAppSettings(); + setState(() {}); } // if(!(sms && plone)){ // // print(sms); diff --git a/lib/ui/widget/scaffold_theme_widget.dart b/lib/ui/widget/scaffold_theme_widget.dart index ace58e1..a6a8e7d 100644 --- a/lib/ui/widget/scaffold_theme_widget.dart +++ b/lib/ui/widget/scaffold_theme_widget.dart @@ -23,20 +23,22 @@ class ScaffoldThemeWidget extends StatefulWidget { final bool isBorder; final bool isOpacity; final VoidCallback onTap; - const ScaffoldThemeWidget( - {Key? key, required this.title, required this.child, required this.bottom, this.isBorder = false, this.isOpacity = true,required this.onTap - }) - : super(key: key); + + const ScaffoldThemeWidget({ + Key? key, + required this.title, + required this.child, + required this.bottom, + this.isBorder = false, + this.isOpacity = true, + required this.onTap, + }) : super(key: key); @override _ScaffoldThemeWidgetState createState() => _ScaffoldThemeWidgetState(); } class _ScaffoldThemeWidgetState extends State { - @override - void initState() { - super.initState(); - } // final userProvider = Provider.of(Get.context!, listen: false); @override @@ -59,7 +61,7 @@ class _ScaffoldThemeWidgetState extends State { body: widget.child, bottomNavigationBar: PloneBottom( onTap: widget.onTap, - border:widget.isBorder, + border: widget.isBorder, opacity: widget.isOpacity ? 1 : 0.4, text: widget.bottom, ).paddingOnly(bottom: 30.w), diff --git a/pubspec.lock b/pubspec.lock index 35ae3bc..55ec041 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -360,6 +360,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + flutter_contacts: + dependency: "direct main" + description: + name: flutter_contacts + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.5" flutter_easyrefresh: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index a050301..16d4c30 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -93,6 +93,8 @@ dependencies: url_launcher: ^6.1.5 #tabBar样式切换 tab_indicator_styler: ^2.0.0 +#手机通讯录 + flutter_contacts: ^1.1.5 # # jdk # jverify: ^2.2.5