|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
|
|
import 'package:one_key/constant/state.dart';
|
|
|
|
|
|
|
|
import 'package:one_key/res/colors.dart';
|
|
|
|
import 'package:one_key/utils/dialog_util.dart';
|
|
|
|
import 'package:one_key/utils/misc.dart';
|
|
|
|
import 'package:one_key/widgets/MyDivider.dart';
|
|
|
|
|
|
|
|
import 'package:one_key/widgets/page_exception.dart';
|
|
|
|
import 'package:one_key/widgets/v_empty_view.dart';
|
|
|
|
import 'package:contacts_service/contacts_service.dart';
|
|
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
|
|
|
|
class ContantRightPage extends StatefulWidget {
|
|
|
|
ContantRightPage({Key key}) : super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
_ContantRightPageState createState() => _ContantRightPageState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _ContantRightPageState extends State<ContantRightPage> {
|
|
|
|
PageState _pageState = PageState.Loading;
|
|
|
|
List<Contact> _contacts;
|
|
|
|
bool isNeed = false;
|
|
|
|
bool goSetting = false;
|
|
|
|
bool userNo = false;
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
_openAddressBook();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Future<void> _askPermissions() async {
|
|
|
|
// PermissionStatus permissionStatus = await _getContactPermission();
|
|
|
|
// if (permissionStatus != PermissionStatus.granted) {
|
|
|
|
// _handleInvalidPermissions(permissionStatus);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
_openAddressBook() async {
|
|
|
|
if (!(await checkContactPermission())) {
|
|
|
|
PermissionStatus permissionStatus = await contactPermissionStatus();
|
|
|
|
if (permissionStatus == PermissionStatus.permanentlyDenied) {
|
|
|
|
//用户选择不在弹出权限提示框
|
|
|
|
print('never');
|
|
|
|
userNo = true;
|
|
|
|
setState(() {
|
|
|
|
_pageState = PageState.NoPermission;
|
|
|
|
});
|
|
|
|
// DialogUtil.openAlertDialog(
|
|
|
|
// context, '未获得通讯录权限', "请在手机的权限管理里,将通讯录权限开启", '去设置', 340.0,
|
|
|
|
// onTap: () {
|
|
|
|
// goSetting = true;
|
|
|
|
// openSetting();
|
|
|
|
// Navigator.pop(context, '');
|
|
|
|
// });
|
|
|
|
} else {
|
|
|
|
// 申请权限
|
|
|
|
bool canContacts = await requestContactPermission();
|
|
|
|
if (canContacts) {
|
|
|
|
refreshContacts();
|
|
|
|
} else {
|
|
|
|
setState(() {
|
|
|
|
_pageState = PageState.NoPermission;
|
|
|
|
});
|
|
|
|
//拒绝通讯录权限 , 苹果拒绝权限后,不再提示权限框,进入此处
|
|
|
|
// DialogUtil.openAlertDialog(
|
|
|
|
// context, '未获得通讯录权限', "请在手机的权限管理里,将通讯录权限开启。", '去设置', 340.0,
|
|
|
|
// onTap: () {
|
|
|
|
// goSetting = true;
|
|
|
|
// openSetting();
|
|
|
|
// Navigator.pop(context, '');
|
|
|
|
// });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
refreshContacts();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Future<PermissionStatus> _getContactPermission() async {
|
|
|
|
// PermissionStatus permission = await PermissionHandler()
|
|
|
|
// .checkPermissionStatus(PermissionGroup.contacts);
|
|
|
|
// if (permission != PermissionStatus.granted &&
|
|
|
|
// permission != PermissionStatus.disabled) {
|
|
|
|
// Map<PermissionGroup, PermissionStatus> permissionStatus =
|
|
|
|
// await PermissionHandler()
|
|
|
|
// .requestPermissions([PermissionGroup.contacts]);
|
|
|
|
// return permissionStatus[PermissionGroup.contacts] ??
|
|
|
|
// PermissionStatus.unknown;
|
|
|
|
// } else {
|
|
|
|
// return permission;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// void _handleInvalidPermissions(PermissionStatus permissionStatus) {
|
|
|
|
// if (permissionStatus == PermissionStatus.denied) {
|
|
|
|
// throw PlatformException(
|
|
|
|
// code: "PERMISSION_DENIED",
|
|
|
|
// message: "Access to location data denied",
|
|
|
|
// details: null);
|
|
|
|
// } else if (permissionStatus == PermissionStatus.disabled) {
|
|
|
|
// throw PlatformException(
|
|
|
|
// code: "PERMISSION_DISABLED",
|
|
|
|
// message: "Location data is not available on device",
|
|
|
|
// details: null);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
Future<void> refreshContacts() async {
|
|
|
|
// Load without thumbnails initially.
|
|
|
|
var contacts = (await ContactsService.getContacts(
|
|
|
|
withThumbnails: false, iOSLocalizedLabels: false))
|
|
|
|
.toList();
|
|
|
|
// var contacts = (await ContactsService.getContactsForPhone("8554964652"))
|
|
|
|
// .toList();
|
|
|
|
setState(() {
|
|
|
|
_contacts = contacts;
|
|
|
|
if (_contacts.length > 0) {
|
|
|
|
_pageState = PageState.Success;
|
|
|
|
} else {
|
|
|
|
_pageState = PageState.Empty;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Lazy load thumbnails after rendering initial contacts.
|
|
|
|
for (final contact in contacts) {
|
|
|
|
ContactsService.getAvatar(contact).then((avatar) {
|
|
|
|
if (avatar == null) return; // Don't redraw if no change.
|
|
|
|
setState(() => contact.avatar = avatar);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void updateContact() async {
|
|
|
|
Contact ninja = _contacts
|
|
|
|
.toList()
|
|
|
|
.firstWhere((contact) => contact.familyName.startsWith("Ninja"));
|
|
|
|
ninja.avatar = null;
|
|
|
|
await ContactsService.updateContact(ninja);
|
|
|
|
|
|
|
|
refreshContacts();
|
|
|
|
}
|
|
|
|
|
|
|
|
_openContactForm() async {
|
|
|
|
try {
|
|
|
|
var contact =
|
|
|
|
await ContactsService.openContactForm(iOSLocalizedLabels: false);
|
|
|
|
refreshContacts();
|
|
|
|
} on FormOperationException catch (e) {
|
|
|
|
switch (e.errorCode) {
|
|
|
|
case FormOperationErrorCode.FORM_OPERATION_CANCELED:
|
|
|
|
case FormOperationErrorCode.FORM_COULD_NOT_BE_OPEN:
|
|
|
|
case FormOperationErrorCode.FORM_OPERATION_UNKNOWN_ERROR:
|
|
|
|
default:
|
|
|
|
print(e.errorCode);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// /// app生命周期
|
|
|
|
// @override
|
|
|
|
// void didChangeAppLifecycleState(AppLifecycleState state) async {
|
|
|
|
// switch (state) {
|
|
|
|
// case AppLifecycleState.resumed: // 应用程序可见,前台
|
|
|
|
// if (!Platform.isAndroid) {
|
|
|
|
// if (isNeed) {
|
|
|
|
// isNeed = false;
|
|
|
|
// if (goSetting) {
|
|
|
|
// _getContactPemisoin();
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// } else {
|
|
|
|
// if (goSetting) {
|
|
|
|
// _getContactPemisoin();
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// break;
|
|
|
|
// case AppLifecycleState.paused:
|
|
|
|
// print('paused');
|
|
|
|
// // if (!Platform.isAndroid) {
|
|
|
|
// // if (!(await checkLocationPermission())) {
|
|
|
|
// // //没有定位权限
|
|
|
|
// isNeed = true;
|
|
|
|
// // } else {
|
|
|
|
// // isNeed = false;
|
|
|
|
// // }
|
|
|
|
// // }
|
|
|
|
|
|
|
|
// break;
|
|
|
|
// default:
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
/// 程序进入前台刷新位置权限(来回切换位置权限,及时刷新页面)
|
|
|
|
_getContactPemisoin() async {
|
|
|
|
if (await checkContactPermission()) {
|
|
|
|
userNo = false;
|
|
|
|
}
|
|
|
|
if (!userNo) {
|
|
|
|
goSetting = false;
|
|
|
|
_openAddressBook();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return _pageState != PageState.Success
|
|
|
|
? ExceptionPage(
|
|
|
|
pageState: _pageState,
|
|
|
|
callback: () async {
|
|
|
|
if (await checkContactPermission()) {
|
|
|
|
_openAddressBook();
|
|
|
|
} else {
|
|
|
|
goSetting = true;
|
|
|
|
openSetting();
|
|
|
|
}
|
|
|
|
;
|
|
|
|
},
|
|
|
|
emptyMsg: "暂时没有联系人哦",
|
|
|
|
emptyImg: "empty_search",
|
|
|
|
showMsg: "加载中,请稍后...",
|
|
|
|
)
|
|
|
|
: ListView.builder(
|
|
|
|
itemCount: _contacts?.length ?? 0,
|
|
|
|
itemBuilder: (BuildContext context, int index) {
|
|
|
|
Contact c = _contacts?.elementAt(index);
|
|
|
|
return Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
index == 0
|
|
|
|
? MyDivider(
|
|
|
|
double.infinity,
|
|
|
|
ScreenUtil().setWidth(20),
|
|
|
|
color: MyColours.color_f5f5f5,
|
|
|
|
)
|
|
|
|
: Container(),
|
|
|
|
Container(
|
|
|
|
width: double.infinity,
|
|
|
|
padding: EdgeInsets.symmetric(
|
|
|
|
horizontal: ScreenUtil().setWidth(40),
|
|
|
|
vertical: ScreenUtil().setWidth(30)),
|
|
|
|
height: ScreenUtil().setWidth(74 * 2),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
border: Border(
|
|
|
|
top: index == 0
|
|
|
|
? BorderSide(
|
|
|
|
width: ScreenUtil().setWidth(2),
|
|
|
|
color: MyColours.color_E0E0E0)
|
|
|
|
: BorderSide(
|
|
|
|
width: 0, color: Colors.transparent),
|
|
|
|
bottom: BorderSide(
|
|
|
|
width: ScreenUtil().setWidth(2),
|
|
|
|
color: MyColours.color_E0E0E0))),
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Text(c.displayName,
|
|
|
|
style: TextStyle(
|
|
|
|
color: MyColours.color_333333,
|
|
|
|
fontSize: ScreenUtil().setSp(32))),
|
|
|
|
VEmptyView(10),
|
|
|
|
Text(c.phones.first.value,
|
|
|
|
style: TextStyle(
|
|
|
|
color: MyColours.color_999999,
|
|
|
|
fontSize: ScreenUtil().setSp(30)))
|
|
|
|
],
|
|
|
|
),
|
|
|
|
)
|
|
|
|
]);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|