diff --git a/packages/phone_log/CHANGELOG.md b/packages/phone_log/CHANGELOG.md index 2bb0f3c..9ba905d 100644 --- a/packages/phone_log/CHANGELOG.md +++ b/packages/phone_log/CHANGELOG.md @@ -1,3 +1,6 @@ +## [0.0.3] - August 15th, 2018. +Update 'checkPermission' method. + ## [0.0.2] - June 11th, 2018. Update README and several fixes. diff --git a/packages/phone_log/android/src/main/java/com/jiajiabingcheng/phonelog/PhoneLogPlugin.java b/packages/phone_log/android/src/main/java/com/jiajiabingcheng/phonelog/PhoneLogPlugin.java index 0b8eccc..cea08a3 100644 --- a/packages/phone_log/android/src/main/java/com/jiajiabingcheng/phonelog/PhoneLogPlugin.java +++ b/packages/phone_log/android/src/main/java/com/jiajiabingcheng/phonelog/PhoneLogPlugin.java @@ -72,10 +72,15 @@ private void requestPermission() { registrar.activity().requestPermissions(perm, 0); } - private boolean checkPermission() { + private String checkPermission() { Log.i("PhoneLogPlugin", "Checking permission : " + Manifest.permission.READ_CALL_LOG); - return PackageManager.PERMISSION_GRANTED + boolean isGranted = PackageManager.PERMISSION_GRANTED == registrar.activity().checkSelfPermission(Manifest.permission.READ_CALL_LOG); + if (isGranted){ + return "granted"; + } else if (registrar.activity().shouldShowRequestPermissionRationale(Manifest.permission.READ_CALL_LOG)){ + return "denied"; + } return "deniedAndCannotRequest"; } @Override diff --git a/packages/phone_log/example/lib/main.dart b/packages/phone_log/example/lib/main.dart index f80cb37..0ee8802 100644 --- a/packages/phone_log/example/lib/main.dart +++ b/packages/phone_log/example/lib/main.dart @@ -26,16 +26,17 @@ class _MyAppState extends State { } - requestPermission() async { + void requestPermission() async { bool res = await phoneLog.requestPermission(); - print("permission request result is " + res.toString()); + print("permission request result is: " + res.toString()); } - checkPermission() async { - bool res = await phoneLog.checkPermission(); - print("permission is " + res.toString()); + void checkPermission() async { + PermissionStatus res = await phoneLog.checkPermission(); + print("permission is: " + res.toString()); } + @override Widget build(BuildContext context) { var children = [ diff --git a/packages/phone_log/lib/phone_log.dart b/packages/phone_log/lib/phone_log.dart index f678709..d0d0246 100644 --- a/packages/phone_log/lib/phone_log.dart +++ b/packages/phone_log/lib/phone_log.dart @@ -4,6 +4,14 @@ import 'package:fixnum/fixnum.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; +/// [PermissionStatus.granted] means that the permission is already granted. +/// [PermissionStatus.denied] means that the permission is not granted yet. +/// [PermissionStatus.deniedAndCannotRequest] means that the permission +/// request is denied previously and user has checked 'never ask again' check +/// box. In this case calling [requestPermission] method, the request +/// permission dialog would not pop up. +enum PermissionStatus {granted, denied, deniedAndCannotRequest} + /// Provide methods to access and fetch the phone log. class PhoneLog { final MethodChannel _channel; @@ -17,13 +25,13 @@ class PhoneLog { @visibleForTesting PhoneLog.private(MethodChannel platformChannel):_channel = platformChannel; - /// Check a [permission] and return a [Future] with the result - Future checkPermission() async { - final bool isGranted = await _channel.invokeMethod("checkPermission", null); - return isGranted; + /// Check a [permission] and return a [Future] of the [PermissionStatus]. + Future checkPermission() async { + final String status = await _channel.invokeMethod("checkPermission", null); + return permissionMap[status]; } - /// Request a [permission] and return a [Future] with the result + /// Request a [permission] and return a [Future] of bool. Future requestPermission() async { final bool isGranted = await _channel.invokeMethod("requestPermission", null); @@ -44,6 +52,12 @@ class PhoneLog { } } +var permissionMap = { + 'granted': PermissionStatus.granted, + 'denied': PermissionStatus.denied, + 'deniedAndCannotRequest': PermissionStatus.deniedAndCannotRequest +}; + /// The class that carries all the data for one call history entry. class CallRecord { CallRecord({ @@ -52,6 +66,7 @@ class CallRecord { this.callType, this.dateYear, this.dateMonth, + this.dateDay, this.dateHour, this.dateMinute, this.dateSecond, diff --git a/packages/phone_log/pubspec.yaml b/packages/phone_log/pubspec.yaml index e8fe5e3..099c723 100644 --- a/packages/phone_log/pubspec.yaml +++ b/packages/phone_log/pubspec.yaml @@ -1,6 +1,6 @@ name: phone_log description: A new flutter plugin project. -version: 0.0.2 +version: 0.0.3 author: Jiaming Cheng homepage: https://github.com/jiajiabingcheng/phone_log diff --git a/packages/phone_log/test/phone_log_test.dart b/packages/phone_log/test/phone_log_test.dart index 60fc5cd..7564adf 100644 --- a/packages/phone_log/test/phone_log_test.dart +++ b/packages/phone_log/test/phone_log_test.dart @@ -12,10 +12,16 @@ void main() { dynamic arguments; MockPlatformChannel mockChannel; MockPlatformChannel mockChannelForGetLogs; + MockPlatformChannel mockChannelForGranted; + MockPlatformChannel mockChannelForDenied; + MockPlatformChannel mockChannelForDeniedCannotRequest; setUp(() { mockChannel = new MockPlatformChannel(); mockChannelForGetLogs = new MockPlatformChannel(); + mockChannelForGranted = new MockPlatformChannel(); + mockChannelForDenied = new MockPlatformChannel(); + mockChannelForDeniedCannotRequest = new MockPlatformChannel(); when(mockChannel.invokeMethod(typed(any), any)) .thenAnswer((Invocation invocation) { @@ -24,7 +30,7 @@ void main() { }); when(mockChannelForGetLogs.invokeMethod('getPhoneLogs', any)) - .thenReturn(new Future(() => [ + .thenAnswer((_) => new Future(() => [ { 'formattedNumber': '123 123 1234', 'number': '1231231234', @@ -38,6 +44,15 @@ void main() { 'duration': 123 } ])); + + when(mockChannelForGranted.invokeMethod('checkPermission', any)) + .thenAnswer((_) => new Future(() => 'granted')); + + when(mockChannelForDenied.invokeMethod('checkPermission', any)) + .thenAnswer((_) => new Future(() => 'denied')); + + when(mockChannelForDeniedCannotRequest.invokeMethod('checkPermission', any)) + .thenAnswer((_) => new Future(() => 'deniedAndCannotRequest')); }); group('Phone log plugin', () { @@ -70,6 +85,21 @@ void main() { expect(invokedMethod, 'checkPermission'); expect(arguments, null); + + var phoneLogGranted = new PhoneLog.private(mockChannelForGranted); + var permissionGranted = await phoneLogGranted.checkPermission(); + + expect(permissionGranted, PermissionStatus.granted); + + var phoneLogDenied = new PhoneLog.private(mockChannelForDenied); + var permissionDenied = await phoneLogDenied.checkPermission(); + + expect(permissionDenied, PermissionStatus.denied); + + var phoneLogCannotRequest = new PhoneLog.private(mockChannelForDeniedCannotRequest); + var permissionCannotRequest = await phoneLogCannotRequest.checkPermission(); + + expect(permissionCannotRequest, PermissionStatus.deniedAndCannotRequest); }); test('request permission', () async {