From 112d73f19436b424f5645cd7a3bf2d8d8f22cf0b Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Fri, 22 Jun 2018 16:14:16 -0700 Subject: [PATCH 1/9] Using thenAnswer instead of thenReturn in test --- packages/phone_log/test/phone_log_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/phone_log/test/phone_log_test.dart b/packages/phone_log/test/phone_log_test.dart index 60fc5cd..7375813 100644 --- a/packages/phone_log/test/phone_log_test.dart +++ b/packages/phone_log/test/phone_log_test.dart @@ -24,7 +24,7 @@ void main() { }); when(mockChannelForGetLogs.invokeMethod('getPhoneLogs', any)) - .thenReturn(new Future(() => [ + .thenReturn((_) => new Future(() => [ { 'formattedNumber': '123 123 1234', 'number': '1231231234', From 082ad42abc3364ddbde188da11c88aa2cddae3ba Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Fri, 22 Jun 2018 16:16:46 -0700 Subject: [PATCH 2/9] Using thenAnswer instead of thenReturn in test --- packages/phone_log/test/phone_log_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/phone_log/test/phone_log_test.dart b/packages/phone_log/test/phone_log_test.dart index 7375813..e693fef 100644 --- a/packages/phone_log/test/phone_log_test.dart +++ b/packages/phone_log/test/phone_log_test.dart @@ -24,7 +24,7 @@ void main() { }); when(mockChannelForGetLogs.invokeMethod('getPhoneLogs', any)) - .thenReturn((_) => new Future(() => [ + .thenAnswer((_) => new Future(() => [ { 'formattedNumber': '123 123 1234', 'number': '1231231234', From 56a446946dfd99d0a5562d5a5c79fc16a32ce0f1 Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Fri, 10 Aug 2018 17:12:45 -0700 Subject: [PATCH 3/9] Add isNeverAskChecked method to the phone log plugin --- .../phonelog/PhoneLogPlugin.java | 13 +++++++++++++ packages/phone_log/example/lib/main.dart | 19 +++++++++++++++---- .../phone_log/ios/Classes/PhoneLogPlugin.m | 3 ++- packages/phone_log/lib/phone_log.dart | 8 ++++++++ packages/phone_log/test/phone_log_test.dart | 9 +++++++++ 5 files changed, 47 insertions(+), 5 deletions(-) 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..5072cff 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 @@ -61,6 +61,10 @@ public void onMethodCall(MethodCall call, Result result) { String duration = call.argument("duration"); fetchCallRecords(startDate, duration); break; + case "isNeverAskChecked": + pendingResult.success(checkIfNeverAsk()); + pendingResult = null; + break; default: result.notImplemented(); } @@ -78,6 +82,15 @@ private boolean checkPermission() { == registrar.activity().checkSelfPermission(Manifest.permission.READ_CALL_LOG); } + private boolean checkIfNeverAsk(){ + boolean showRationale = registrar.activity().shouldShowRequestPermissionRationale(Manifest.permission.READ_CALL_LOG); + if (!showRationale) { + // User checed "never ask again" box. + return true; + } + return false; + } + @Override public boolean onRequestPermissionsResult(int requestCode, String[] strings, diff --git a/packages/phone_log/example/lib/main.dart b/packages/phone_log/example/lib/main.dart index f80cb37..27d656a 100644 --- a/packages/phone_log/example/lib/main.dart +++ b/packages/phone_log/example/lib/main.dart @@ -26,14 +26,19 @@ 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 { + void checkPermission() async { bool res = await phoneLog.checkPermission(); - print("permission is " + res.toString()); + print("permission is: " + res.toString()); + } + + void isNeverAskBoxChecked() async { + bool res = await phoneLog.isNeverAskChecked(); + print("never ask is checked: " + res.toString()); } @override @@ -50,6 +55,12 @@ class _MyAppState extends State { onPressed: requestPermission, child: new Text("Request permission")), ), + new Padding( + padding: const EdgeInsets.all(8.0), + child: new RaisedButton( + onPressed: isNeverAskBoxChecked, + child: new Text("Check box status")), + ), new Padding( padding: const EdgeInsets.all(8.0), child: new RaisedButton( diff --git a/packages/phone_log/ios/Classes/PhoneLogPlugin.m b/packages/phone_log/ios/Classes/PhoneLogPlugin.m index 16fd6df..7b4fd12 100644 --- a/packages/phone_log/ios/Classes/PhoneLogPlugin.m +++ b/packages/phone_log/ios/Classes/PhoneLogPlugin.m @@ -12,7 +12,8 @@ + (void)registerWithRegistrar:(NSObject*)registrar { - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([@"checkPermission" isEqualToString:call.method] || [@"requestPermission" isEqualToString:call.method] || - [@"getPhoneLogs" isEqualToString:call.method]) { + [@"getPhoneLogs" isEqualToString:call.method] || + [@"isNeverAskChecked" isEqualToString:call.method]) { result(nil); } else { result(FlutterMethodNotImplemented); diff --git a/packages/phone_log/lib/phone_log.dart b/packages/phone_log/lib/phone_log.dart index f678709..8ed5f92 100644 --- a/packages/phone_log/lib/phone_log.dart +++ b/packages/phone_log/lib/phone_log.dart @@ -30,6 +30,13 @@ class PhoneLog { return isGranted; } + /// Check if the "never ask" box is checked or not. + Future isNeverAskChecked() async { + final bool isChecked = + await _channel.invokeMethod("isNeverAskChecked", null); + return isChecked; + } + ///Fetches phone logs /// ///The unit of [startDate] is the Milliseconds of date. @@ -52,6 +59,7 @@ class CallRecord { this.callType, this.dateYear, this.dateMonth, + this.dateDay, this.dateHour, this.dateMinute, this.dateSecond, diff --git a/packages/phone_log/test/phone_log_test.dart b/packages/phone_log/test/phone_log_test.dart index e693fef..7a36a0e 100644 --- a/packages/phone_log/test/phone_log_test.dart +++ b/packages/phone_log/test/phone_log_test.dart @@ -80,6 +80,15 @@ void main() { expect(invokedMethod, 'requestPermission'); expect(arguments, null); }); + + test('is "never ask" box checked', () async { + var phoneLog = new PhoneLog.private(mockChannel); + + await phoneLog.isNeverAskChecked(); + + expect(invokedMethod, 'isNeverAskChecked'); + expect(arguments, null); + }); }); } From 4b7564c8e2df53d0314224c64aff78befe9152f1 Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Fri, 10 Aug 2018 17:19:51 -0700 Subject: [PATCH 4/9] fix typo --- .../main/java/com/jiajiabingcheng/phonelog/PhoneLogPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5072cff..02c6eb0 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 @@ -85,7 +85,7 @@ private boolean checkPermission() { private boolean checkIfNeverAsk(){ boolean showRationale = registrar.activity().shouldShowRequestPermissionRationale(Manifest.permission.READ_CALL_LOG); if (!showRationale) { - // User checed "never ask again" box. + // User checked "never ask again" box. return true; } return false; From 43b25b3e688620042a0fa5a76ce727e6bd5338e5 Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Wed, 15 Aug 2018 13:40:57 -0700 Subject: [PATCH 5/9] Change the return type of checkPermission method --- packages/phone_log/example/lib/main.dart | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/packages/phone_log/example/lib/main.dart b/packages/phone_log/example/lib/main.dart index 27d656a..0ee8802 100644 --- a/packages/phone_log/example/lib/main.dart +++ b/packages/phone_log/example/lib/main.dart @@ -32,14 +32,10 @@ class _MyAppState extends State { } void checkPermission() async { - bool res = await phoneLog.checkPermission(); + PermissionStatus res = await phoneLog.checkPermission(); print("permission is: " + res.toString()); } - void isNeverAskBoxChecked() async { - bool res = await phoneLog.isNeverAskChecked(); - print("never ask is checked: " + res.toString()); - } @override Widget build(BuildContext context) { @@ -55,12 +51,6 @@ class _MyAppState extends State { onPressed: requestPermission, child: new Text("Request permission")), ), - new Padding( - padding: const EdgeInsets.all(8.0), - child: new RaisedButton( - onPressed: isNeverAskBoxChecked, - child: new Text("Check box status")), - ), new Padding( padding: const EdgeInsets.all(8.0), child: new RaisedButton( From ce7e145d0e12027c11ff1f80e50a7371ea064e6e Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Wed, 15 Aug 2018 13:41:17 -0700 Subject: [PATCH 6/9] Change the return type of checkPermission method --- .../phonelog/PhoneLogPlugin.java | 22 ++++++------------- .../phone_log/ios/Classes/PhoneLogPlugin.m | 3 +-- packages/phone_log/lib/phone_log.dart | 21 +++++++++--------- packages/phone_log/test/phone_log_test.dart | 9 -------- 4 files changed, 19 insertions(+), 36 deletions(-) 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 02c6eb0..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 @@ -61,10 +61,6 @@ public void onMethodCall(MethodCall call, Result result) { String duration = call.argument("duration"); fetchCallRecords(startDate, duration); break; - case "isNeverAskChecked": - pendingResult.success(checkIfNeverAsk()); - pendingResult = null; - break; default: result.notImplemented(); } @@ -76,19 +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); - } - - private boolean checkIfNeverAsk(){ - boolean showRationale = registrar.activity().shouldShowRequestPermissionRationale(Manifest.permission.READ_CALL_LOG); - if (!showRationale) { - // User checked "never ask again" box. - return true; - } - return false; + 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/ios/Classes/PhoneLogPlugin.m b/packages/phone_log/ios/Classes/PhoneLogPlugin.m index 7b4fd12..16fd6df 100644 --- a/packages/phone_log/ios/Classes/PhoneLogPlugin.m +++ b/packages/phone_log/ios/Classes/PhoneLogPlugin.m @@ -12,8 +12,7 @@ + (void)registerWithRegistrar:(NSObject*)registrar { - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([@"checkPermission" isEqualToString:call.method] || [@"requestPermission" isEqualToString:call.method] || - [@"getPhoneLogs" isEqualToString:call.method] || - [@"isNeverAskChecked" isEqualToString:call.method]) { + [@"getPhoneLogs" isEqualToString:call.method]) { result(nil); } else { result(FlutterMethodNotImplemented); diff --git a/packages/phone_log/lib/phone_log.dart b/packages/phone_log/lib/phone_log.dart index 8ed5f92..e6409ca 100644 --- a/packages/phone_log/lib/phone_log.dart +++ b/packages/phone_log/lib/phone_log.dart @@ -18,9 +18,9 @@ class PhoneLog { 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; + Future checkPermission() async { + final String status = await _channel.invokeMethod("checkPermission", null); + return permissionMap[status]; } /// Request a [permission] and return a [Future] with the result @@ -30,13 +30,6 @@ class PhoneLog { return isGranted; } - /// Check if the "never ask" box is checked or not. - Future isNeverAskChecked() async { - final bool isChecked = - await _channel.invokeMethod("isNeverAskChecked", null); - return isChecked; - } - ///Fetches phone logs /// ///The unit of [startDate] is the Milliseconds of date. @@ -51,6 +44,14 @@ class PhoneLog { } } +enum PermissionStatus {granted, denied, deniedAndCannotRequest} + +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({ diff --git a/packages/phone_log/test/phone_log_test.dart b/packages/phone_log/test/phone_log_test.dart index 7a36a0e..e693fef 100644 --- a/packages/phone_log/test/phone_log_test.dart +++ b/packages/phone_log/test/phone_log_test.dart @@ -80,15 +80,6 @@ void main() { expect(invokedMethod, 'requestPermission'); expect(arguments, null); }); - - test('is "never ask" box checked', () async { - var phoneLog = new PhoneLog.private(mockChannel); - - await phoneLog.isNeverAskChecked(); - - expect(invokedMethod, 'isNeverAskChecked'); - expect(arguments, null); - }); }); } From 9b5a92682db0625bfeaf956bdc91065a8b40a185 Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Wed, 15 Aug 2018 17:02:00 -0700 Subject: [PATCH 7/9] Updated the version number and added test for checkPermission method --- packages/phone_log/CHANGELOG.md | 3 +++ packages/phone_log/lib/phone_log.dart | 14 +++++++--- packages/phone_log/test/phone_log_test.dart | 30 +++++++++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) 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/lib/phone_log.dart b/packages/phone_log/lib/phone_log.dart index e6409ca..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 + /// 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,8 +52,6 @@ class PhoneLog { } } -enum PermissionStatus {granted, denied, deniedAndCannotRequest} - var permissionMap = { 'granted': PermissionStatus.granted, 'denied': PermissionStatus.denied, diff --git a/packages/phone_log/test/phone_log_test.dart b/packages/phone_log/test/phone_log_test.dart index e693fef..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) { @@ -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 { From 9f6d039db3ac53f0af0af961995cadb00764739c Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Wed, 15 Aug 2018 20:51:53 -0700 Subject: [PATCH 8/9] Updated the version in yaml file --- packages/phone_log/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From a3b820aea8e931b2744883b81de9672d2d420301 Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Tue, 1 Oct 2019 17:26:08 -0700 Subject: [PATCH 9/9] cast the type of the result --- packages/phone_log/lib/phone_log.dart | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/phone_log/lib/phone_log.dart b/packages/phone_log/lib/phone_log.dart index d0d0246..48ab16e 100644 --- a/packages/phone_log/lib/phone_log.dart +++ b/packages/phone_log/lib/phone_log.dart @@ -10,7 +10,7 @@ import 'package:flutter/services.dart'; /// 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} +enum PermissionStatus { granted, denied, deniedAndCannotRequest } /// Provide methods to access and fetch the phone log. class PhoneLog { @@ -23,7 +23,7 @@ class PhoneLog { factory PhoneLog() => _instance; @visibleForTesting - PhoneLog.private(MethodChannel platformChannel):_channel = platformChannel; + PhoneLog.private(MethodChannel platformChannel) : _channel = platformChannel; /// Check a [permission] and return a [Future] of the [PermissionStatus]. Future checkPermission() async { @@ -34,7 +34,7 @@ class PhoneLog { /// Request a [permission] and return a [Future] of bool. Future requestPermission() async { final bool isGranted = - await _channel.invokeMethod("requestPermission", null); + await _channel.invokeMethod("requestPermission", null); return isGranted; } @@ -44,15 +44,18 @@ class PhoneLog { ///The unit of [duration] is second. Future> getPhoneLogs( {Int64 startDate, Int64 duration}) async { - var _startDate = startDate?.toString(); - var _duration = duration?.toString(); - Iterable records = await _channel.invokeMethod( - 'getPhoneLogs', {"startDate": _startDate, "duration": _duration}); - return records?.map((m) => new CallRecord.fromMap(m)); + final String _startDate = startDate?.toString(); + final String _duration = duration?.toString(); + + final Iterable records = (await _channel.invokeMethod('getPhoneLogs', + {"startDate": _startDate, "duration": _duration})) + .cast(); + return records + ?.map((m) => new CallRecord.fromMap(m.cast())); } } -var permissionMap = { +Map permissionMap = { 'granted': PermissionStatus.granted, 'denied': PermissionStatus.denied, 'deniedAndCannotRequest': PermissionStatus.deniedAndCannotRequest @@ -76,7 +79,7 @@ class CallRecord { String formattedNumber, number, callType; int dateYear, dateMonth, dateDay, dateHour, dateMinute, dateSecond, duration; - CallRecord.fromMap(Map m) { + CallRecord.fromMap(Map m) { formattedNumber = m['formattedNumber']; number = m['number']; callType = m['callType']; @@ -88,4 +91,4 @@ class CallRecord { dateSecond = m['dateSecond']; duration = m['duration']; } -} +} \ No newline at end of file