You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HMG_Patient_App_New/lib/services/livecare_permission_service...

93 lines
3.1 KiB
Dart

import 'dart:async';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
import 'package:permission_handler/permission_handler.dart';
class LiveCarePermissionService {
LiveCarePermissionService._();
static final LiveCarePermissionService instance = LiveCarePermissionService._();
// Guard to prevent concurrent permission requests
Completer<Map<Permission, PermissionStatus>>? _ongoingRequest;
/// Requests camera, microphone and notification permissions together and
/// returns the final map of permission statuses.
/// This method does NOT show any dialogs — UI decisions must be done by caller.
Future<Map<Permission, PermissionStatus>> requestCameraMicAndNotification(BuildContext context) async {
if (_ongoingRequest != null) {
return _ongoingRequest!.future;
}
_ongoingRequest = Completer<Map<Permission, PermissionStatus>>();
final completer = _ongoingRequest!;
final permissions = <Permission>[
Permission.camera,
Permission.microphone,
Permission.notification,
];
try {
final statuses = await permissions.request();
// Ensure all requested keys exist in the returned map (some platforms may omit)
final result = <Permission, PermissionStatus>{};
for (final p in permissions) {
result[p] = statuses[p] ?? await p.status;
}
if (!completer.isCompleted) completer.complete(result);
return completer.future;
} catch (e) {
if (!completer.isCompleted) completer.complete(<Permission, PermissionStatus>{});
return completer.future;
} finally {
_ongoingRequest = null;
}
}
/// Show an "open settings" dialog (kept as helper for the UI layer).
Future<void> showOpenSettingsDialog(BuildContext context, {required String title, required String message}) async {
return showCommonBottomSheetWithoutHeight(
title: title,
context,
child: Utils.getWarningWidget(
loadingText: message,
isShowActionButtons: true,
onCancelTap: () {
Navigator.of(context).pop();
},
onConfirmTap: () async {
openAppSettings();
Navigator.of(context).pop();
}),
isFullScreen: false,
isCloseButtonVisible: true,
callBackFunc: () {},
);
// return showDialog<void>(
// context: context,
// builder: (c) => ConfirmDialog(
// title: '$title Permission',
// message: message,
// onTap: () {
// openAppSettings();
// Navigator.of(c).pop();
// },
// okTitle: LocaleKeys.ok.tr(context: c),
// ),
// );
}
String friendlyName(Permission permission) {
if (permission == Permission.camera) return 'Camera';
if (permission == Permission.microphone) return 'Microphone';
if (permission == Permission.notification) return 'Notifications';
return permission.toString();
}
}