TF-2877 Create notification data source & repo
This commit is contained in:
@@ -1,11 +1,17 @@
|
|||||||
package com.linagora.android.tmail
|
package com.linagora.android.tmail
|
||||||
|
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.PersistableBundle
|
import android.os.PersistableBundle
|
||||||
import io.flutter.embedding.android.FlutterFragmentActivity
|
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||||
import io.flutter.embedding.engine.FlutterEngine
|
import io.flutter.embedding.engine.FlutterEngine
|
||||||
import io.flutter.plugins.GeneratedPluginRegistrant
|
import io.flutter.plugins.GeneratedPluginRegistrant
|
||||||
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
|
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
import android.os.Build
|
||||||
|
import android.text.TextUtils
|
||||||
|
import androidx.core.app.NotificationManagerCompat
|
||||||
|
import io.flutter.plugin.common.MethodChannel
|
||||||
|
|
||||||
class MainActivity: FlutterFragmentActivity() {
|
class MainActivity: FlutterFragmentActivity() {
|
||||||
|
|
||||||
@@ -20,5 +26,7 @@ class MainActivity: FlutterFragmentActivity() {
|
|||||||
|
|
||||||
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
||||||
GeneratedPluginRegistrant.registerWith(flutterEngine)
|
GeneratedPluginRegistrant.registerWith(flutterEngine)
|
||||||
|
|
||||||
|
NotificationGroup().register(flutterEngine, applicationContext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package com.linagora.android.tmail
|
||||||
|
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Build
|
||||||
|
import android.text.TextUtils
|
||||||
|
import androidx.core.app.NotificationManagerCompat
|
||||||
|
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||||
|
import io.flutter.embedding.engine.FlutterEngine
|
||||||
|
import io.flutter.plugin.common.MethodChannel
|
||||||
|
|
||||||
|
class NotificationGroup {
|
||||||
|
private val channel = "com.linagora.android.teammail.notification.group.permission"
|
||||||
|
|
||||||
|
fun register(flutterEngine: FlutterEngine, applicationContext: Context) {
|
||||||
|
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channel).setMethodCallHandler { call, result ->
|
||||||
|
try {
|
||||||
|
if (call.method == "getNotificationGroupPermission") {
|
||||||
|
val groupId = call.arguments
|
||||||
|
if (groupId is String) {
|
||||||
|
val isEnabled = getNotificationChannelGroupStatus(applicationContext, groupId)
|
||||||
|
result.success(isEnabled)
|
||||||
|
} else {
|
||||||
|
result.error("Unavailable", "No such group", "")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result.notImplemented()
|
||||||
|
}
|
||||||
|
} catch (exception: Throwable) {
|
||||||
|
result.error("UnknownError", exception.message, "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getNotificationChannelGroupStatus(context: Context, groupId: String?): Boolean {
|
||||||
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
|
if (!TextUtils.isEmpty(groupId)) {
|
||||||
|
val manager = context.getSystemService(FlutterFragmentActivity.NOTIFICATION_SERVICE) as NotificationManager
|
||||||
|
val group = manager.getNotificationChannelGroup(groupId)
|
||||||
|
return !group.isBlocked
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
NotificationManagerCompat.from(context).areNotificationsEnabled()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -71,7 +71,7 @@ post_install do |installer|
|
|||||||
'PERMISSION_LOCATION=0',
|
'PERMISSION_LOCATION=0',
|
||||||
|
|
||||||
## dart: PermissionGroup.notification
|
## dart: PermissionGroup.notification
|
||||||
'PERMISSION_NOTIFICATIONS=0',
|
'PERMISSION_NOTIFICATIONS=1',
|
||||||
|
|
||||||
## dart: PermissionGroup.mediaLibrary
|
## dart: PermissionGroup.mediaLibrary
|
||||||
'PERMISSION_MEDIA_LIBRARY=0',
|
'PERMISSION_MEDIA_LIBRARY=0',
|
||||||
|
|||||||
+7
-1
@@ -1,4 +1,6 @@
|
|||||||
PODS:
|
PODS:
|
||||||
|
- app_settings (5.1.1):
|
||||||
|
- Flutter
|
||||||
- AppAuth (1.7.4):
|
- AppAuth (1.7.4):
|
||||||
- AppAuth/Core (= 1.7.4)
|
- AppAuth/Core (= 1.7.4)
|
||||||
- AppAuth/ExternalUserAgent (= 1.7.4)
|
- AppAuth/ExternalUserAgent (= 1.7.4)
|
||||||
@@ -185,6 +187,7 @@ PODS:
|
|||||||
- Flutter
|
- Flutter
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
|
- app_settings (from `.symlinks/plugins/app_settings/ios`)
|
||||||
- better_open_file (from `.symlinks/plugins/better_open_file/ios`)
|
- better_open_file (from `.symlinks/plugins/better_open_file/ios`)
|
||||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
||||||
- contacts_service (from `.symlinks/plugins/contacts_service/ios`)
|
- contacts_service (from `.symlinks/plugins/contacts_service/ios`)
|
||||||
@@ -237,6 +240,8 @@ SPEC REPOS:
|
|||||||
- SwiftyGif
|
- SwiftyGif
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
|
app_settings:
|
||||||
|
:path: ".symlinks/plugins/app_settings/ios"
|
||||||
better_open_file:
|
better_open_file:
|
||||||
:path: ".symlinks/plugins/better_open_file/ios"
|
:path: ".symlinks/plugins/better_open_file/ios"
|
||||||
connectivity_plus:
|
connectivity_plus:
|
||||||
@@ -295,6 +300,7 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/workmanager/ios"
|
:path: ".symlinks/plugins/workmanager/ios"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
|
app_settings: 017320c6a680cdc94c799949d95b84cb69389ebc
|
||||||
AppAuth: 182c5b88630569df5acb672720534756c29b3358
|
AppAuth: 182c5b88630569df5acb672720534756c29b3358
|
||||||
better_open_file: 03cf320415d4d3f46b6e00adc4a567d76c1a399d
|
better_open_file: 03cf320415d4d3f46b6e00adc4a567d76c1a399d
|
||||||
connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e
|
connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e
|
||||||
@@ -343,6 +349,6 @@ SPEC CHECKSUMS:
|
|||||||
url_launcher_ios: 68d46cc9766d0c41dbdc884310529557e3cd7a86
|
url_launcher_ios: 68d46cc9766d0c41dbdc884310529557e3cd7a86
|
||||||
workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6
|
workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6
|
||||||
|
|
||||||
PODFILE CHECKSUM: 91d9116a6c482e0d0b230a68097981fae7e4d07a
|
PODFILE CHECKSUM: ded4724b53568389542fa0f7d7a64c05ffc03971
|
||||||
|
|
||||||
COCOAPODS: 1.14.3
|
COCOAPODS: 1.14.3
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||||
|
|
||||||
|
abstract class NotificationDataSource {
|
||||||
|
Future<bool> getNotificationSetting(UserName userName);
|
||||||
|
|
||||||
|
Future<void> toggleNotificationSetting();
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import 'package:app_settings/app_settings.dart';
|
||||||
|
import 'package:core/utils/platform_info.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/data/datasource/notification_datasource.dart';
|
||||||
|
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
|
||||||
|
import 'package:tmail_ui_user/main/permissions/notification_permission_service.dart';
|
||||||
|
|
||||||
|
class NotificationDataSourceImpl implements NotificationDataSource {
|
||||||
|
final NotificationPermissionService _permissionService;
|
||||||
|
final ExceptionThrower _exceptionThrower;
|
||||||
|
|
||||||
|
NotificationDataSourceImpl(
|
||||||
|
this._permissionService,
|
||||||
|
this._exceptionThrower);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> getNotificationSetting(UserName userName) {
|
||||||
|
return Future.sync(() async {
|
||||||
|
if (PlatformInfo.isIOS) {
|
||||||
|
return await _checkIosNotificationPermissionEnabled();
|
||||||
|
} else {
|
||||||
|
return await _checkAndroidNotificationPermissionEnabled(userName);
|
||||||
|
}
|
||||||
|
}).catchError(_exceptionThrower.throwException);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> toggleNotificationSetting() async {
|
||||||
|
return Future.sync(() async {
|
||||||
|
return await AppSettings.openAppSettings(type: AppSettingsType.notification);
|
||||||
|
}).catchError(_exceptionThrower.throwException);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> _checkIosNotificationPermissionEnabled() {
|
||||||
|
return _permissionService.isGranted(Permission.notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> _checkAndroidNotificationPermissionEnabled(UserName userName) {
|
||||||
|
return _permissionService.checkNotificationPermissionEnabled(userName.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/data/datasource/notification_datasource.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/notification_repository.dart';
|
||||||
|
|
||||||
|
class NotificationRepositoryImpl implements NotificationRepository {
|
||||||
|
final NotificationDataSource _notificationDataSource;
|
||||||
|
|
||||||
|
NotificationRepositoryImpl(this._notificationDataSource);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> getNotificationSetting(UserName userName) {
|
||||||
|
return _notificationDataSource.getNotificationSetting(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> toggleNotificationSetting() {
|
||||||
|
return _notificationDataSource.toggleNotificationSetting();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||||
|
|
||||||
|
abstract class NotificationRepository {
|
||||||
|
Future<bool> getNotificationSetting(UserName userName);
|
||||||
|
|
||||||
|
Future<void> toggleNotificationSetting();
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/isolate/background_isolate_binary_messenger/background_isolate_binary_messenger_mobile.dart';
|
||||||
|
import 'package:tmail_ui_user/main/permissions/permission_service.dart';
|
||||||
|
|
||||||
|
class NotificationPermissionService extends PermissionService {
|
||||||
|
|
||||||
|
Future<bool> checkGroupPermissionByGroupId(String groupId) async {
|
||||||
|
if (groupId.isEmpty) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const methodChannel = MethodChannel('com.linagora.android.teammail.notification.group.permission');
|
||||||
|
const methodName = 'getNotificationGroupPermission';
|
||||||
|
final invokeResult = await methodChannel.invokeMethod<bool>(
|
||||||
|
methodName,
|
||||||
|
groupId);
|
||||||
|
return invokeResult ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> checkNotificationPermissionEnabled(String groupId) async {
|
||||||
|
final permissionGranted = await isGranted(Permission.notification);
|
||||||
|
if (!permissionGranted) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await checkGroupPermissionByGroupId(groupId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
|
||||||
|
class PermissionService {
|
||||||
|
Future<bool> isGranted(Permission permission) async {
|
||||||
|
final current = await permission.status;
|
||||||
|
switch (current) {
|
||||||
|
case PermissionStatus.granted:
|
||||||
|
return true;
|
||||||
|
case PermissionStatus.denied:
|
||||||
|
final requestResult = await permission.request();
|
||||||
|
final permissionGranted = requestResult == PermissionStatus.granted;
|
||||||
|
return permissionGranted;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,6 +25,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.13.0"
|
version: "5.13.0"
|
||||||
|
app_settings:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: app_settings
|
||||||
|
sha256: "09bc7fe0313a507087bec1a3baf555f0576e816a760cbb31813a88890a09d9e5"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "5.1.1"
|
||||||
archive:
|
archive:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -244,6 +244,8 @@ dependencies:
|
|||||||
|
|
||||||
file_picker: 5.3.1
|
file_picker: 5.3.1
|
||||||
|
|
||||||
|
app_settings: 5.1.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|||||||
+101
@@ -0,0 +1,101 @@
|
|||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||||
|
import 'package:mockito/annotations.dart';
|
||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/notification_datasource_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
|
||||||
|
import 'package:tmail_ui_user/main/permissions/notification_permission_service.dart';
|
||||||
|
|
||||||
|
import 'notification_datasource_impl_test.mocks.dart';
|
||||||
|
|
||||||
|
@GenerateNiceMocks([
|
||||||
|
MockSpec<NotificationPermissionService>(),
|
||||||
|
MockSpec<ExceptionThrower>()])
|
||||||
|
void main() {
|
||||||
|
TestWidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
final permissionService = MockNotificationPermissionService();
|
||||||
|
final exceptionThrower = MockExceptionThrower();
|
||||||
|
final notificationDatasourceImpl = NotificationDataSourceImpl(
|
||||||
|
permissionService,
|
||||||
|
exceptionThrower);
|
||||||
|
|
||||||
|
final userName = UserName('value');
|
||||||
|
|
||||||
|
void setMockNotificationPermission({
|
||||||
|
VoidCallback? openAppSettingsCallback,
|
||||||
|
}) {
|
||||||
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||||
|
.setMockMethodCallHandler(
|
||||||
|
const MethodChannel('com.spencerccf.app_settings/methods'),
|
||||||
|
(message) async {
|
||||||
|
if (message.method == 'openSettings') {
|
||||||
|
openAppSettingsCallback?.call();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
group('notification datasource test:', () {
|
||||||
|
group('getAppNotificationSetting test:', () {
|
||||||
|
test(
|
||||||
|
'should return true '
|
||||||
|
'when user grants notification permission',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
debugDefaultTargetPlatformOverride = TargetPlatform.android;
|
||||||
|
when(permissionService.checkNotificationPermissionEnabled(any)).thenAnswer((_) async => true);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await notificationDatasourceImpl.getNotificationSetting(userName);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
verify(permissionService.checkNotificationPermissionEnabled(userName.value));
|
||||||
|
expect(result, true);
|
||||||
|
debugDefaultTargetPlatformOverride = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return false '
|
||||||
|
'when user denies notification permission',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
debugDefaultTargetPlatformOverride = TargetPlatform.android;
|
||||||
|
when(permissionService.checkNotificationPermissionEnabled(any)).thenAnswer((_) async => false);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await notificationDatasourceImpl.getNotificationSetting(userName);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
verify(permissionService.checkNotificationPermissionEnabled(userName.value));
|
||||||
|
expect(result, false);
|
||||||
|
debugDefaultTargetPlatformOverride = null;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
group('toggleAppNotificationSetting test:', () {
|
||||||
|
test(
|
||||||
|
'should call openAppSettings '
|
||||||
|
'when user toggles notification setting on',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
debugDefaultTargetPlatformOverride = TargetPlatform.android;
|
||||||
|
bool openAppSettingsCalled = false;
|
||||||
|
setMockNotificationPermission(openAppSettingsCallback: () {
|
||||||
|
openAppSettingsCalled = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// act
|
||||||
|
await notificationDatasourceImpl.toggleNotificationSetting();
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(openAppSettingsCalled, true);
|
||||||
|
debugDefaultTargetPlatformOverride = null;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||||
|
import 'package:mockito/annotations.dart';
|
||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/data/datasource/notification_datasource.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/data/repository/notification_repository_impl.dart';
|
||||||
|
|
||||||
|
import 'notification_repository_impl_test.mocks.dart';
|
||||||
|
|
||||||
|
@GenerateNiceMocks([MockSpec<NotificationDataSource>()])
|
||||||
|
void main() {
|
||||||
|
final notificationDataSource = MockNotificationDataSource();
|
||||||
|
final notificationRepositoryImpl = NotificationRepositoryImpl(notificationDataSource);
|
||||||
|
|
||||||
|
final userName = UserName('value');
|
||||||
|
|
||||||
|
group('notification repository impl test:', () {
|
||||||
|
test(
|
||||||
|
'should call getNotificationSetting '
|
||||||
|
'when getNotificationSetting in datasource is called',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
when(notificationDataSource.getNotificationSetting(any))
|
||||||
|
.thenAnswer((_) async => true);
|
||||||
|
|
||||||
|
// act
|
||||||
|
notificationRepositoryImpl.getNotificationSetting(userName);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
verify(notificationDataSource.getNotificationSetting(userName)).called(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should call toggleNotificationSetting '
|
||||||
|
'when toggleNotificationSetting in datasource is called',
|
||||||
|
() {
|
||||||
|
// arrange
|
||||||
|
when(notificationDataSource.toggleNotificationSetting())
|
||||||
|
.thenAnswer((_) async => true);
|
||||||
|
|
||||||
|
// act
|
||||||
|
notificationRepositoryImpl.toggleNotificationSetting();
|
||||||
|
|
||||||
|
// assert
|
||||||
|
verify(notificationDataSource.toggleNotificationSetting()).called(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/isolate/background_isolate_binary_messenger/background_isolate_binary_messenger_mobile.dart';
|
||||||
|
import 'package:tmail_ui_user/main/permissions/notification_permission_service.dart';
|
||||||
|
|
||||||
|
class TestNotificationPermissionService extends NotificationPermissionService {
|
||||||
|
bool callCheckGroupPermission = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> checkGroupPermissionByGroupId(String groupId) {
|
||||||
|
callCheckGroupPermission = true;
|
||||||
|
return super.checkGroupPermissionByGroupId(groupId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
TestWidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
final notificationPermissionService = TestNotificationPermissionService();
|
||||||
|
|
||||||
|
void setMockNotificationPermission({
|
||||||
|
required PermissionStatus currentStatus,
|
||||||
|
PermissionStatus? requestedStatus,
|
||||||
|
}) {
|
||||||
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||||
|
.setMockMethodCallHandler(
|
||||||
|
const MethodChannel('flutter.baseflow.com/permissions/methods'),
|
||||||
|
(message) async {
|
||||||
|
if (message.method == 'checkPermissionStatus') {
|
||||||
|
return currentStatus.index;
|
||||||
|
} else if (message.method == 'requestPermissions') {
|
||||||
|
assert(
|
||||||
|
requestedStatus != null,
|
||||||
|
'mock requested status must not be null '
|
||||||
|
'when requesting permission');
|
||||||
|
|
||||||
|
return {Permission.notification.value: requestedStatus!.index};
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void setMockNotificationGroupStatus({
|
||||||
|
required bool groupIsBlocked,
|
||||||
|
}) {
|
||||||
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||||
|
.setMockMethodCallHandler(
|
||||||
|
const MethodChannel('com.linagora.android.teammail.notification.group.permission'),
|
||||||
|
(message) async {
|
||||||
|
if (message.method == 'getNotificationGroupPermission') {
|
||||||
|
return groupIsBlocked;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
group('notification permission service test', () {
|
||||||
|
test(
|
||||||
|
'should return false '
|
||||||
|
'when checkGroupPermission is called '
|
||||||
|
'and group id is empty',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
setMockNotificationGroupStatus(groupIsBlocked: true);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await notificationPermissionService.checkGroupPermissionByGroupId('');
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(notificationPermissionService.callCheckGroupPermission, true);
|
||||||
|
expect(result, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return the status of notification group '
|
||||||
|
'when checkGroupPermission is called '
|
||||||
|
'and group id is not empty',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
setMockNotificationGroupStatus(groupIsBlocked: true);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await notificationPermissionService.checkGroupPermissionByGroupId('test');
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(notificationPermissionService.callCheckGroupPermission, true);
|
||||||
|
expect(result, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return false '
|
||||||
|
'when checkNotificationPermissionEnabled is called '
|
||||||
|
'and permission is not granted',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
setMockNotificationPermission(currentStatus: PermissionStatus.permanentlyDenied);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await notificationPermissionService.checkNotificationPermissionEnabled('');
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(result, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return the status of notification group '
|
||||||
|
'when checkNotificationPermissionEnabled is called '
|
||||||
|
'and permission is not granted',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
setMockNotificationPermission(currentStatus: PermissionStatus.granted);
|
||||||
|
setMockNotificationGroupStatus(groupIsBlocked: true);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await notificationPermissionService.checkGroupPermissionByGroupId('test');
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(result, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
import 'package:tmail_ui_user/main/permissions/permission_service.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
TestWidgetsFlutterBinding.ensureInitialized();
|
||||||
|
final permissionService = PermissionService();
|
||||||
|
|
||||||
|
void setMockNotificationPermission({
|
||||||
|
required PermissionStatus currentStatus,
|
||||||
|
PermissionStatus? requestedStatus,
|
||||||
|
}) {
|
||||||
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||||
|
.setMockMethodCallHandler(
|
||||||
|
const MethodChannel('flutter.baseflow.com/permissions/methods'),
|
||||||
|
(message) async {
|
||||||
|
if (message.method == 'checkPermissionStatus') {
|
||||||
|
return currentStatus.index;
|
||||||
|
} else if (message.method == 'requestPermissions') {
|
||||||
|
assert(
|
||||||
|
requestedStatus != null,
|
||||||
|
'mock requested status must not be null '
|
||||||
|
'when requesting permission');
|
||||||
|
|
||||||
|
return {Permission.notification.value: requestedStatus!.index};
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
group('permission service test:', () {
|
||||||
|
group('isGranted test:', () {
|
||||||
|
test(
|
||||||
|
'should return true '
|
||||||
|
'when permission is granted before',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
setMockNotificationPermission(currentStatus: PermissionStatus.granted);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await permissionService.isGranted(Permission.notification);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(result, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return true '
|
||||||
|
'when permission is not granted before '
|
||||||
|
'and granted when request',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
setMockNotificationPermission(
|
||||||
|
currentStatus: PermissionStatus.denied,
|
||||||
|
requestedStatus: PermissionStatus.granted);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await permissionService.isGranted(Permission.notification);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(result, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'should return false '
|
||||||
|
'when permission is not granted before '
|
||||||
|
'and denied when request',
|
||||||
|
() async {
|
||||||
|
// arrange
|
||||||
|
setMockNotificationPermission(
|
||||||
|
currentStatus: PermissionStatus.denied,
|
||||||
|
requestedStatus: PermissionStatus.denied);
|
||||||
|
|
||||||
|
// act
|
||||||
|
final result = await permissionService.isGranted(Permission.notification);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
expect(result, false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user