Skip to content

Commit 7496fc5

Browse files
author
Dick Smith
committed
Snapshot-friendly
Changes to allow this plugin to be used with android webpack/snapshot. Java package/namespace usage evaluated at build time will cause snapshot to fail so must be placed in a function that will not execute until runtime. Some additional changes to satisfy TS compilation.
1 parent b5c41c2 commit 7496fc5

File tree

4 files changed

+64
-44
lines changed

4 files changed

+64
-44
lines changed

src/camera-plus.android.ts

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,35 @@ const ALIGN_PARENT_RIGHT = 11;
3636
const CENTER_HORIZONTAL = 14;
3737
const DIRECTORY_PICTURES = "DIRECTORY_PICTURES";
3838
const DIRECTORY_MOVIES = "DIRECTORY_MOVIES";
39-
const CAMERA = (android as any).Manifest.permission.CAMERA;
40-
const RECORD_AUDIO = (android as any).Manifest.permission.RECORD_AUDIO;
4139
const FOCUS_MODE_AUTO = "auto";
4240
const FOCUS_MODE_EDOF = "edof";
4341
const FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
4442
const FOCUS_MODE_CONTINUOUS_VIDEO = "continuous-video";
45-
const READ_EXTERNAL_STORAGE = (android as any).Manifest.permission
46-
.READ_EXTERNAL_STORAGE;
47-
const WRITE_EXTERNAL_STORAGE = (android as any).Manifest.permission
48-
.WRITE_EXTERNAL_STORAGE;
4943
const FLASH_MODE_ON = "on";
5044
const FLASH_MODE_OFF = "off";
5145
const CAMERA_FACING_FRONT = 1; // front camera
5246
const CAMERA_FACING_BACK = 0; // rear camera
5347
const RESULT_CODE_PICKER_IMAGES = 415161;
5448
const RESULT_OK = -1;
5549

50+
// Snapshot-friendly functions
51+
const CAMERA = () => (android as any).Manifest.permission.CAMERA;
52+
const RECORD_AUDIO = () => (android as any).Manifest.permission.RECORD_AUDIO;
53+
const READ_EXTERNAL_STORAGE = () =>
54+
(android as any).Manifest.permission.READ_EXTERNAL_STORAGE;
55+
const WRITE_EXTERNAL_STORAGE = () =>
56+
(android as any).Manifest.permission.WRITE_EXTERNAL_STORAGE;
57+
5658
export class CameraPlus extends CameraPlusBase {
57-
@GetSetProperty() public camera: android.hardware.Camera;
59+
// @GetSetProperty() public camera: android.hardware.Camera;
60+
// Snapshot-friendly, since the decorator will include the snapshot-unknown object "android"
61+
private _camera: android.hardware.Camera;
62+
public get camera(): android.hardware.Camera {
63+
return this._camera;
64+
}
65+
public set camera(camera: android.hardware.Camera) {
66+
this._camera = camera;
67+
}
5868
@GetSetProperty() public cameraId;
5969
@GetSetProperty() public autoFocus: boolean = true;
6070
@GetSetProperty() public flashOnIcon: string = "ic_flash_on_white";
@@ -138,7 +148,7 @@ export class CameraPlus extends CameraPlusBase {
138148
// nativeView = new android.widget.RelativeLayout(this._context);
139149
this._nativeView = new android.widget.RelativeLayout(this._context);
140150

141-
permissions.requestPermission(CAMERA).then(
151+
permissions.requestPermission(CAMERA()).then(
142152
() => {
143153
// create the TextureView that will render the camera preview
144154
this._textureView = new android.view.TextureView(this._context);
@@ -157,7 +167,7 @@ export class CameraPlus extends CameraPlusBase {
157167

158168
// setup SurfaceTextureListener
159169
this._textureView.setSurfaceTextureListener(
160-
new android.view.TextureView.SurfaceTextureListener({
170+
new android.view.TextureView.SurfaceTextureListener(<any>{
161171
get owner() {
162172
return that.get();
163173
},
@@ -185,7 +195,7 @@ export class CameraPlus extends CameraPlusBase {
185195
this._initDefaultButtons();
186196
} else {
187197
permissions
188-
.requestPermission(CAMERA)
198+
.requestPermission(CAMERA())
189199
.then(() => {
190200
this._initCamera(this.cameraId);
191201
this._initDefaultButtons();
@@ -452,7 +462,6 @@ export class CameraPlus extends CameraPlusBase {
452462
CLog("Exception preparing MediaRecorder", e);
453463
this._releaseMediaRecorder();
454464
this.isRecording = false;
455-
return false;
456465
}
457466
}
458467

@@ -648,7 +657,10 @@ export class CameraPlus extends CameraPlusBase {
648657
createThePickerIntent();
649658
} else {
650659
permissions
651-
.requestPermissions([READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE])
660+
.requestPermissions([
661+
READ_EXTERNAL_STORAGE(),
662+
WRITE_EXTERNAL_STORAGE()
663+
])
652664
.then(() => {
653665
createThePickerIntent();
654666
});
@@ -702,7 +714,7 @@ export class CameraPlus extends CameraPlusBase {
702714
public requestCameraPermissions(explanation: string = ""): Promise<boolean> {
703715
return new Promise((resolve, reject) => {
704716
permissions
705-
.requestPermission(CAMERA, explanation)
717+
.requestPermission(CAMERA(), explanation)
706718
.then(() => {
707719
resolve(true);
708720
})
@@ -721,7 +733,7 @@ export class CameraPlus extends CameraPlusBase {
721733
* Returns true if the CAMERA permission has been granted.
722734
*/
723735
public hasCameraPermission(): boolean {
724-
return permissions.hasPermission(CAMERA);
736+
return permissions.hasPermission(CAMERA());
725737
}
726738

727739
/**
@@ -731,7 +743,7 @@ export class CameraPlus extends CameraPlusBase {
731743
public requestAudioPermissions(explanation: string = ""): Promise<boolean> {
732744
return new Promise((resolve, reject) => {
733745
permissions
734-
.requestPermission(RECORD_AUDIO, explanation)
746+
.requestPermission(RECORD_AUDIO(), explanation)
735747
.then(() => {
736748
resolve(true);
737749
})
@@ -750,7 +762,7 @@ export class CameraPlus extends CameraPlusBase {
750762
* Returns true if the RECORD_AUDIO permission has been granted.
751763
*/
752764
public hasAudioPermission(): boolean {
753-
return permissions.hasPermission(RECORD_AUDIO);
765+
return permissions.hasPermission(RECORD_AUDIO());
754766
}
755767

756768
/**
@@ -761,7 +773,7 @@ export class CameraPlus extends CameraPlusBase {
761773
return new Promise((resolve, reject) => {
762774
permissions
763775
.requestPermissions(
764-
[WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE],
776+
[WRITE_EXTERNAL_STORAGE(), READ_EXTERNAL_STORAGE()],
765777
explanation
766778
)
767779
.then(() => {
@@ -782,8 +794,8 @@ export class CameraPlus extends CameraPlusBase {
782794
* Returns true if the WRITE_EXTERNAL_STORAGE && READ_EXTERNAL_STORAGE permissions have been granted.
783795
*/
784796
public hasStoragePermissions(): boolean {
785-
const writePerm = permissions.hasPermission(WRITE_EXTERNAL_STORAGE);
786-
const readPerm = permissions.hasPermission(READ_EXTERNAL_STORAGE);
797+
const writePerm = permissions.hasPermission(WRITE_EXTERNAL_STORAGE());
798+
const readPerm = permissions.hasPermission(READ_EXTERNAL_STORAGE());
787799
if (writePerm === true && readPerm === true) {
788800
return true;
789801
} else {
@@ -796,7 +808,10 @@ export class CameraPlus extends CameraPlusBase {
796808
): Promise<boolean> {
797809
return new Promise(async (resolve, reject) => {
798810
permissions
799-
.requestPermissions([WRITE_EXTERNAL_STORAGE, RECORD_AUDIO], explanation)
811+
.requestPermissions(
812+
[WRITE_EXTERNAL_STORAGE(), RECORD_AUDIO()],
813+
explanation
814+
)
800815
.then(() => {
801816
resolve(true);
802817
})
@@ -812,8 +827,8 @@ export class CameraPlus extends CameraPlusBase {
812827
}
813828

814829
public hasVideoRecordingPermissions() {
815-
const writePerm = permissions.hasPermission(WRITE_EXTERNAL_STORAGE);
816-
const audio = permissions.hasPermission(RECORD_AUDIO);
830+
const writePerm = permissions.hasPermission(WRITE_EXTERNAL_STORAGE());
831+
const audio = permissions.hasPermission(RECORD_AUDIO());
817832
if (writePerm === true && audio === true) {
818833
return true;
819834
} else {

src/camera-plus.common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export abstract class CameraPlusBase extends ContentView
2525
public set debug(value: boolean) {
2626
CameraUtil.debug = value;
2727
}
28-
public events: ICameraPlusEvents;
28+
public events: any /*ICameraPlusEvents*/;
2929

3030
/**
3131
* Video Support (off by default)

src/selected-asset.ts

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ interface ArrayBufferStatic extends ArrayBufferConstructor {
1515
from(buffer: java.nio.ByteBuffer): ArrayBuffer;
1616
}
1717

18-
const MediaStore = android.provider.MediaStore;
19-
const DocumentsContract = (android.provider as any).DocumentsContract;
20-
const BitmapFactory = android.graphics.BitmapFactory;
21-
const StaticArrayBuffer = ArrayBuffer as ArrayBufferStatic;
18+
// Snapshot-friendly functions
19+
const MediaStore = () => android.provider.MediaStore;
20+
const DocumentsContract = () => (android.provider as any).DocumentsContract;
21+
const BitmapFactory = () => android.graphics.BitmapFactory;
2222

2323
export class SelectedAsset extends ImageAsset {
2424
private _uri: android.net.Uri;
@@ -56,7 +56,7 @@ export class SelectedAsset extends ImageAsset {
5656
try {
5757
if (!this._data) {
5858
const bb = this.getByteBuffer(this._uri);
59-
this._data = StaticArrayBuffer.from(bb);
59+
this._data = (ArrayBuffer as ArrayBufferStatic).from(bb);
6060
}
6161
resolve(this._data);
6262
} catch (ex) {
@@ -98,11 +98,11 @@ export class SelectedAsset extends ImageAsset {
9898

9999
if (
100100
isKitKat &&
101-
DocumentsContract.isDocumentUri(application.android.context, uri)
101+
DocumentsContract().isDocumentUri(application.android.context, uri)
102102
) {
103103
// externalStorageProvider
104104
if (SelectedAsset.isExternalStorageDocument(uri)) {
105-
const docId = DocumentsContract.getDocumentId(uri);
105+
const docId = DocumentsContract().getDocumentId(uri);
106106
const id = docId.split(":")[1];
107107
const type = docId.split(":")[0];
108108

@@ -115,7 +115,7 @@ export class SelectedAsset extends ImageAsset {
115115
// tODO handle non-primary volumes
116116
} else if (SelectedAsset.isDownloadsDocument(uri)) {
117117
// downloadsProvider
118-
const id = DocumentsContract.getDocumentId(uri);
118+
const id = DocumentsContract().getDocumentId(uri);
119119
const contentUri = android.content.ContentUris.withAppendedId(
120120
android.net.Uri.parse("content://downloads/public_downloads"),
121121
long(id)
@@ -124,18 +124,18 @@ export class SelectedAsset extends ImageAsset {
124124
return SelectedAsset.getDataColumn(contentUri, null, null);
125125
} else if (SelectedAsset.isMediaDocument(uri)) {
126126
// mediaProvider
127-
const docId = DocumentsContract.getDocumentId(uri);
127+
const docId = DocumentsContract().getDocumentId(uri);
128128
const split = docId.split(":");
129129
const type = split[0];
130130
const id = split[1];
131131

132132
let contentUri: android.net.Uri = null;
133133
if ("image" === type) {
134-
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
134+
contentUri = MediaStore().Images.Media.EXTERNAL_CONTENT_URI;
135135
} else if ("video" === type) {
136-
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
136+
contentUri = MediaStore().Video.Media.EXTERNAL_CONTENT_URI;
137137
} else if ("audio" === type) {
138-
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
138+
contentUri = MediaStore().Audio.Media.EXTERNAL_CONTENT_URI;
139139
}
140140

141141
const selection = "_id=?";
@@ -162,7 +162,7 @@ export class SelectedAsset extends ImageAsset {
162162

163163
private static getDataColumn(uri: android.net.Uri, selection, selectionArgs) {
164164
let cursor = null;
165-
const columns = [MediaStore.MediaColumns.DATA];
165+
const columns = [MediaStore().MediaColumns.DATA];
166166

167167
let filePath;
168168

@@ -236,9 +236,13 @@ export class SelectedAsset extends ImageAsset {
236236
uri: android.net.Uri,
237237
options?: { maxWidth: number; maxHeight: number }
238238
): number {
239-
const boundsOptions = new BitmapFactory.Options();
239+
const boundsOptions = new android.graphics.BitmapFactory.Options();
240240
boundsOptions.inJustDecodeBounds = true;
241-
BitmapFactory.decodeStream(this.openInputStream(uri), null, boundsOptions);
241+
BitmapFactory().decodeStream(
242+
this.openInputStream(uri),
243+
null,
244+
boundsOptions
245+
);
242246

243247
// find the correct scale value. It should be the power of 2.
244248
let outWidth = boundsOptions.outWidth;
@@ -279,9 +283,9 @@ export class SelectedAsset extends ImageAsset {
279283
uri: android.net.Uri,
280284
options?: { maxWidth: number; maxHeight: number }
281285
): ImageSource {
282-
const downsampleOptions = new BitmapFactory.Options();
286+
const downsampleOptions = new android.graphics.BitmapFactory.Options();
283287
downsampleOptions.inSampleSize = this.getSampleSize(uri, options);
284-
const bitmap = BitmapFactory.decodeStream(
288+
const bitmap = BitmapFactory().decodeStream(
285289
this.openInputStream(uri),
286290
null,
287291
downsampleOptions
@@ -300,9 +304,9 @@ export class SelectedAsset extends ImageAsset {
300304
uri: android.net.Uri,
301305
options?: { maxWidth: number; maxHeight: number }
302306
): ImageAsset {
303-
const downsampleOptions = new BitmapFactory.Options();
307+
const downsampleOptions = new android.graphics.BitmapFactory.Options();
304308
downsampleOptions.inSampleSize = this.getSampleSize(uri, options);
305-
const bitmap = BitmapFactory.decodeStream(
309+
const bitmap = BitmapFactory().decodeStream(
306310
this.openInputStream(uri),
307311
null,
308312
downsampleOptions

src/tsconfig.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@
2020
"noImplicitAny": false,
2121
"noImplicitReturns": true,
2222
"noImplicitUseStrict": false,
23-
"noFallthroughCasesInSwitch": true
23+
"noFallthroughCasesInSwitch": true,
24+
"skipLibCheck": true
2425
},
2526
"exclude": [
2627
"node_modules",
2728
"./async-await"
2829
],
2930
"compileOnSave": false
30-
}
31+
}

0 commit comments

Comments
 (0)