TF-2877 Create notification data source & repo
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user