Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion client/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ if (flutterVersionName == null) {
android {
namespace "com.appveyor.flet"
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
ndkVersion "25.1.8937393"

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
Expand Down
7 changes: 7 additions & 0 deletions client/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,13 @@ packages:
relative: true
source: path
version: "0.23.0"
flet_permission_handler:
dependency: "direct main"
description:
path: "../packages/flet_permission_handler"
relative: true
source: path
version: "0.23.0"
flet_rive:
dependency: "direct main"
description:
Expand Down
41 changes: 35 additions & 6 deletions packages/flet_permission_handler/lib/src/permission_handler.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:flet/flet.dart';
import 'package:flutter/widgets.dart';
import 'package:permission_handler/permission_handler.dart';

import 'utils/permission_handler.dart';

class PermissionHandlerControl extends StatefulWidget {
Expand Down Expand Up @@ -43,20 +45,47 @@ class _PermissionHandlerControlState extends State<PermissionHandlerControl>
Widget build(BuildContext context) {
debugPrint(
"PermissionHandler build: ${widget.control.id} (${widget.control.hashCode})");

() async {
widget.backend.subscribeMethods(widget.control.id,
(methodName, args) async {
switch (methodName) {
case "checkPermission":
return await checkPermission(args['permissionOf']!);
case "requestPermission":
return await requestPermission(args['permissionOf']!);
case "check_permission":
bool? isGranted = await parsePermission(args['of'])?.isGranted;
bool? isDenied = await parsePermission(args['of'])?.isDenied;
bool? isPermanentlyDenied =
await parsePermission(args['of'])?.isPermanentlyDenied;
bool? isLimited = await parsePermission(args['of'])?.isLimited;
bool? isProvisional =
await parsePermission(args['of'])?.isProvisional;
bool? isRestricted =
await parsePermission(args['of'])?.isRestricted;

if (isGranted == true) {
return "granted";
} else if (isDenied == true) {
return "denied";
} else if (isPermanentlyDenied == true) {
return "permanentlyDenied";
} else if (isLimited == true) {
return "limited";
} else if (isProvisional == true) {
return "provisional";
} else if (isRestricted == true) {
return "restricted";
}
return null;
case "request_permission":
Future<PermissionStatus> permissionStatus =
parsePermission(args['of'])!.request();
return permissionStatus.then((value) async {
return value.name;
});
}
return null;
});
}();

return const SizedBox.shrink();
}
}
}
123 changes: 10 additions & 113 deletions packages/flet_permission_handler/lib/src/utils/permission_handler.dart
Original file line number Diff line number Diff line change
@@ -1,117 +1,14 @@
import "dart:async";
import "dart:convert";

import "package:collection/collection.dart";
import "package:permission_handler/permission_handler.dart";

Permission? parsePermissionInstance(String permissionOf) {
switch (permissionOf) {
case "accessMediaLocation":
return Permission.accessMediaLocation;
case "accessNotificationPolicy":
return Permission.accessNotificationPolicy;
case "activityRecognition":
return Permission.activityRecognition;
case "appTrackingTransparency":
return Permission.appTrackingTransparency;
case "assistant":
return Permission.assistant;
case "audio":
return Permission.audio;
case "backgroundRefresh":
return Permission.backgroundRefresh;
case "bluetooth":
return Permission.bluetooth;
case "bluetoothAdvertise":
return Permission.bluetoothAdvertise;
case "bluetoothConnect":
return Permission.bluetoothConnect;
case "bluetoothScan":
return Permission.bluetoothScan;
case "calendarFullAccess":
return Permission.calendarFullAccess;
case "calendarWriteOnly":
return Permission.calendarWriteOnly;
case "camera":
return Permission.camera;
case "contacts":
return Permission.contacts;
case "criticalAlerts":
return Permission.criticalAlerts;
case "ignoreBatteryOptimizations":
return Permission.ignoreBatteryOptimizations;
case "location":
return Permission.location;
case "locationAlways":
return Permission.locationAlways;
case "locationWhenInUse":
return Permission.locationWhenInUse;
case "manageExternalStorage":
return Permission.manageExternalStorage;
case "mediaLibrary":
return Permission.mediaLibrary;
case "microphone":
return Permission.microphone;
case "nearbyWifiDevices":
return Permission.nearbyWifiDevices;
case "notification":
return Permission.notification;
case "phone":
return Permission.phone;
case "photos":
return Permission.photos;
case "photosAddOnly":
return Permission.photosAddOnly;
case "reminders":
return Permission.reminders;
case "requestInstallPackages":
return Permission.requestInstallPackages;
case "scheduleExactAlarm":
return Permission.scheduleExactAlarm;
case "sensors":
return Permission.sensors;
case "sensorsAlways":
return Permission.sensorsAlways;
case "sms":
return Permission.sms;
case "speech":
return Permission.speech;
case "storage":
return Permission.storage;
case "systemAlertWindow":
return Permission.systemAlertWindow;
case "unknown":
return Permission.unknown;
case "videos":
return Permission.videos;
default:
return null;
Permission? parsePermission(String? permission,
[Permission? defaultPermission]) {
if (permission == null) {
return defaultPermission;
}
return Permission.values.firstWhereOrNull(
(Permission p) =>
p.toString().toLowerCase() == permission.toLowerCase(),
) ??
defaultPermission;
}

Future<String?> checkPermission(String permissionOf) async {
bool isGranted = await parsePermissionInstance(permissionOf)!.isGranted;
bool isDenied = await parsePermissionInstance(permissionOf)!.isDenied;
bool isPermanentlyDenied =
await parsePermissionInstance(permissionOf)!.isPermanentlyDenied;
bool isLimited = await parsePermissionInstance(permissionOf)!.isLimited;
bool isProvisional =
await parsePermissionInstance(permissionOf)!.isProvisional;
bool isRestricted = await parsePermissionInstance(permissionOf)!.isRestricted;

return json.encode({
"is_granted": isGranted,
"is_denied": isDenied,
"is_permanently_denied": isPermanentlyDenied,
"is_limited": isLimited,
"is_provisional": isProvisional,
"is_restricted": isRestricted
});
}

Future<String?> requestPermission(String permissionOf) async {
Future<PermissionStatus> permissionStatus =
parsePermissionInstance(permissionOf)!.request();
return permissionStatus.then((value) async {
return await checkPermission(permissionOf);
});
}
6 changes: 5 additions & 1 deletion sdk/python/packages/flet-core/src/flet_core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,11 @@
PaintSweepGradient,
StrokeJoin,
)
from flet_core.permission_handler import PermissionHandler
from flet_core.permission_handler import (
PermissionHandler,
PermissionType,
PermissionStatus,
)
from flet_core.popup_menu_button import (
PopupMenuButton,
PopupMenuItem,
Expand Down
Loading