contant_right_page.dart 9.55 KB
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);
    //   });
    // }
  }



  _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 InkWell(
                  onTap: () {
                    if (c.phones.first.value != null &&
                        c.phones.first.value != '') {
                      DialogUtil.goPhone(c.phones.first.value);
                    }
                  },
                  child: 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)))
                            ],
                          ),
                        )
                      ]));
            });
  }
}