From e2193631d552bc8ad97cb0ce69413bc85dc6c821 Mon Sep 17 00:00:00 2001 From: riknoll Date: Fri, 4 Dec 2015 11:34:28 -0800 Subject: [PATCH] CB-9189 android: Implementing save/restore API to handle Activity destruction --- README.md | 7 ++++- jsdoc2md/TEMPLATE.md | 7 ++++- src/android/CameraLauncher.java | 56 ++++++++++++++++++++++++++++++++- 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8060af9..700722b 100644 --- a/README.md +++ b/README.md @@ -400,7 +400,12 @@ scenario, the image may not appear when the cordova activity is restored. Android uses intents to launch the camera activity on the device to capture images, and on phones with low memory, the Cordova activity may be killed. In this -scenario, the image may not appear when the Cordova activity is restored. +scenario, the result from the plugin call will be delivered via the resume event. +See [the Android Lifecycle guide](http://cordova.apache.org/docs/en/dev/guide/platforms/android/lifecycle.html) +for more information. The `pendingResult.result` value will contain the value that +would be passed to the callbacks (either the URI/URL or an error message). Check +the `pendingResult.pluginStatus` to determine whether or not the call was +successful. #### Browser Quirks diff --git a/jsdoc2md/TEMPLATE.md b/jsdoc2md/TEMPLATE.md index d068748..39f06ba 100644 --- a/jsdoc2md/TEMPLATE.md +++ b/jsdoc2md/TEMPLATE.md @@ -77,7 +77,12 @@ scenario, the image may not appear when the cordova activity is restored. Android uses intents to launch the camera activity on the device to capture images, and on phones with low memory, the Cordova activity may be killed. In this -scenario, the image may not appear when the Cordova activity is restored. +scenario, the result from the plugin call will be delivered via the resume event. +See [the Android Lifecycle guide](http://cordova.apache.org/docs/en/dev/guide/platforms/android/lifecycle.html) +for more information. The `pendingResult.result` value will contain the value that +would be passed to the callbacks (either the URI/URL or an error message). Check +the `pendingResult.pluginStatus` to determine whether or not the call was +successful. #### Browser Quirks diff --git a/src/android/CameraLauncher.java b/src/android/CameraLauncher.java index d45d43b..ff8599b 100644 --- a/src/android/CameraLauncher.java +++ b/src/android/CameraLauncher.java @@ -503,7 +503,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect } else { writeUncompressedImage(this.imageUri, uri); } - + this.callbackContext.success(uri.toString()); } } else { @@ -1214,4 +1214,58 @@ private String ouputModifiedBitmap(Bitmap bitmap, Uri uri) throws IOException { return (this.targetWidth > 0 && this.targetHeight > 0) || this.correctOrientation || this.allowEdit; } + + /** + * Taking or choosing a picture launches another Activity, so we need to implement the + * save/restore APIs to handle the case where the CordovaActivity is killed by the OS + * before we get the launched Activity's result. + */ + public Bundle onSaveInstanceState() { + Bundle state = new Bundle(); + state.putInt("destType", this.destType); + state.putInt("srcType", this.srcType); + state.putInt("mQuality", this.mQuality); + state.putInt("targetWidth", this.targetWidth); + state.putInt("targetHeight", this.targetHeight); + state.putInt("encodingType", this.encodingType); + state.putInt("mediaType", this.mediaType); + state.putInt("numPics", this.numPics); + state.putBoolean("allowEdit", this.allowEdit); + state.putBoolean("correctOrientation", this.correctOrientation); + state.putBoolean("saveToPhotoAlbum", this.saveToPhotoAlbum); + + if(this.croppedUri != null) { + state.putString("croppedUri", this.croppedUri.toString()); + } + + if(this.imageUri != null) { + state.putString("imageUri", this.imageUri.toString()); + } + + return state; + } + + public void onRestoreStateForActivityResult(Bundle state, CallbackContext callbackContext) { + this.destType = state.getInt("destType"); + this.srcType = state.getInt("srcType"); + this.mQuality = state.getInt("mQuality"); + this.targetWidth = state.getInt("targetWidth"); + this.targetHeight = state.getInt("targetHeight"); + this.encodingType = state.getInt("encodingType"); + this.mediaType = state.getInt("mediaType"); + this.numPics = state.getInt("numPics"); + this.allowEdit = state.getBoolean("allowEdit"); + this.correctOrientation = state.getBoolean("correctOrientation"); + this.saveToPhotoAlbum = state.getBoolean("saveToPhotoAlbum"); + + if(state.containsKey("croppedUri")) { + this.croppedUri = Uri.parse(state.getString("croppedUri")); + } + + if(state.containsKey("imageUri")) { + this.imageUri = Uri.parse(state.getString("imageUri")); + } + + this.callbackContext = callbackContext; + } }