Skip to content

Commit

Permalink
Fix photos permission issue on Android 12 and below
Browse files Browse the repository at this point in the history
  • Loading branch information
cohenadair committed Mar 31, 2023
1 parent 1ff9271 commit 3777ec2
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 18 deletions.
9 changes: 8 additions & 1 deletion mobile/lib/pages/image_picker_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import 'package:flutter/material.dart';
import 'package:mapbox_gl/mapbox_gl.dart' as maps;
import 'package:image_picker/image_picker.dart';
import 'package:mobile/time_manager.dart';
import 'package:mobile/wrappers/device_info_wrapper.dart';
import 'package:mobile/wrappers/exif_wrapper.dart';
import 'package:mobile/wrappers/io_wrapper.dart';
import 'package:photo_manager/photo_manager.dart';
import 'package:quiver/strings.dart';
import 'package:timezone/timezone.dart';
Expand Down Expand Up @@ -188,10 +190,14 @@ class ImagePickerPageState extends State<ImagePickerPage> {

late Future<bool> _isPermissionGrantedFuture;

DeviceInfoWrapper get _deviceInfoWrapper => DeviceInfoWrapper.of(context);

FilePickerWrapper get _filePicker => FilePickerWrapper.of(context);

ImagePickerWrapper get _imagePicker => ImagePickerWrapper.of(context);

IoWrapper get _ioWrapper => IoWrapper.of(context);

PermissionHandlerWrapper get _permissionHandlerWrapper =>
PermissionHandlerWrapper.of(context);

Expand All @@ -202,7 +208,8 @@ class ImagePickerPageState extends State<ImagePickerPage> {
@override
void initState() {
super.initState();
_isPermissionGrantedFuture = _permissionHandlerWrapper.requestPhotos();
_isPermissionGrantedFuture =
_permissionHandlerWrapper.requestPhotos(_deviceInfoWrapper, _ioWrapper);
}

@override
Expand Down
17 changes: 15 additions & 2 deletions mobile/lib/wrappers/permission_handler_wrapper.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import 'package:flutter/material.dart';
import 'package:mobile/wrappers/device_info_wrapper.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';

import '../app_manager.dart';
import 'io_wrapper.dart';

class PermissionHandlerWrapper {
static PermissionHandlerWrapper of(BuildContext context) =>
Expand All @@ -19,8 +21,19 @@ class PermissionHandlerWrapper {
Future<bool> get isLocationAlwaysGranted async =>
Permission.locationAlways.isGranted;

Future<bool> requestPhotos() async =>
(await Permission.photos.request()).isGranted;
Future<bool> requestPhotos(
DeviceInfoWrapper deviceInfo, IoWrapper ioWrapper) async {
// TODO: Necessary until
// https://github.com/Baseflow/flutter-permission-handler/issues/944 is
// fixed. Permission.storage.request() always returns denied on Android 12
// and below.
if (ioWrapper.isAndroid &&
(await deviceInfo.androidInfo).version.sdkInt <= 32) {
return (await Permission.storage.request()).isGranted;
} else {
return (await Permission.photos.request()).isGranted;
}
}

Future<bool> openSettings() => openAppSettings();
}
22 changes: 14 additions & 8 deletions mobile/test/mocks/mocks.mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1336,9 +1336,8 @@ class _FakeRequestType_116 extends _i1.SmartFake implements _i68.RequestType {
);
}

class _FakeFilterOptionGroup_117 extends _i1.SmartFake
implements _i68.FilterOptionGroup {
_FakeFilterOptionGroup_117(
class _FakePMFilter_117 extends _i1.SmartFake implements _i68.PMFilter {
_FakePMFilter_117(
Object parent,
Invocation parentInvocation,
) : super(
Expand Down Expand Up @@ -12839,10 +12838,17 @@ class MockPermissionHandlerWrapper extends _i1.Mock
returnValue: _i2.Future<bool>.value(false),
) as _i2.Future<bool>);
@override
_i2.Future<bool> requestPhotos() => (super.noSuchMethod(
_i2.Future<bool> requestPhotos(
_i29.DeviceInfoWrapper? deviceInfo,
_i38.IoWrapper? ioWrapper,
) =>
(super.noSuchMethod(
Invocation.method(
#requestPhotos,
[],
[
deviceInfo,
ioWrapper,
],
),
returnValue: _i2.Future<bool>.value(false),
) as _i2.Future<bool>);
Expand Down Expand Up @@ -13180,13 +13186,13 @@ class MockAssetPathEntity extends _i1.Mock implements _i68.AssetPathEntity {
returnValue: false,
) as bool);
@override
_i68.FilterOptionGroup get filterOption => (super.noSuchMethod(
_i68.PMFilter get filterOption => (super.noSuchMethod(
Invocation.getter(#filterOption),
returnValue: _FakeFilterOptionGroup_117(
returnValue: _FakePMFilter_117(
this,
Invocation.getter(#filterOption),
),
) as _i68.FilterOptionGroup);
) as _i68.PMFilter);
@override
_i2.Future<int> get assetCountAsync => (super.noSuchMethod(
Invocation.getter(#assetCountAsync),
Expand Down
2 changes: 1 addition & 1 deletion mobile/test/pages/add_catch_journey_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ void main() {
page: anyNamed("page"),
size: anyNamed("size"),
)).thenAnswer((_) => Future.value(mockAssets));
when(appManager.permissionHandlerWrapper.requestPhotos())
when(appManager.permissionHandlerWrapper.requestPhotos(any, any))
.thenAnswer((_) => Future.value(true));
when(appManager.photoManagerWrapper.getAllAssetPathEntity(any))
.thenAnswer((_) => Future.value(allAlbum));
Expand Down
6 changes: 3 additions & 3 deletions mobile/test/pages/image_picker_page_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void main() {
.thenAnswer((_) => Future.value(null));
when(appManager.photoManagerWrapper.getAllAssetPathEntity(any))
.thenAnswer((_) => Future.value(allAlbum));
when(appManager.permissionHandlerWrapper.requestPhotos())
when(appManager.permissionHandlerWrapper.requestPhotos(any, any))
.thenAnswer((_) => Future.value(true));

var exif = MockExif();
Expand Down Expand Up @@ -549,7 +549,7 @@ void main() {

testWidgets("Placeholder grid shown when waiting for permission future",
(tester) async {
when(appManager.permissionHandlerWrapper.requestPhotos())
when(appManager.permissionHandlerWrapper.requestPhotos(any, any))
.thenAnswer((_) => Future.value(false));

await tester.pumpWidget(Testable(
Expand Down Expand Up @@ -605,7 +605,7 @@ void main() {
});

testWidgets("No permission placeholder shown", (tester) async {
when(appManager.permissionHandlerWrapper.requestPhotos())
when(appManager.permissionHandlerWrapper.requestPhotos(any, any))
.thenAnswer((_) => Future.value(false));

await tester.pumpWidget(Testable(
Expand Down
2 changes: 1 addition & 1 deletion mobile/test/widget/fishing_spot_details_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void main() {
when(appManager.fishingSpotManager.entity(any)).thenReturn(null);
when(appManager.fishingSpotManager.entityExists(any)).thenReturn(false);

when(appManager.permissionHandlerWrapper.requestPhotos())
when(appManager.permissionHandlerWrapper.requestPhotos(any, any))
.thenAnswer((_) => Future.value(false));

when(appManager.userPreferenceManager.catchFieldIds).thenReturn([]);
Expand Down
2 changes: 1 addition & 1 deletion mobile/test/widget/image_input_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ void main() {
.thenAnswer((_) => Future.value(null));
when(appManager.photoManagerWrapper.getAllAssetPathEntity(any))
.thenAnswer((_) => Future.value(allAlbum));
when(appManager.permissionHandlerWrapper.requestPhotos())
when(appManager.permissionHandlerWrapper.requestPhotos(any, any))
.thenAnswer((_) => Future.value(true));

var exif = MockExif();
Expand Down
2 changes: 1 addition & 1 deletion mobile/test/widget/image_picker_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ void main() {
setUp(() {
appManager = StubbedAppManager();

when(appManager.permissionHandlerWrapper.requestPhotos())
when(appManager.permissionHandlerWrapper.requestPhotos(any, any))
.thenAnswer((_) => Future.value(true));

when(appManager.photoManagerWrapper.getAllAssetPathEntity(any))
Expand Down

0 comments on commit 3777ec2

Please sign in to comment.