Patch Camera Using Volume Buttons to Take a Picture

From WebOS Internals
Jump to: navigation, search
<<- Return to webOS Patches


Note: If you are only looking for a hardware-based button to take a picture, the space bar will do that for you already.

Preamble

You will need write permissions to the filesystem on your Pre to apply this patch.

To get write persmissions execute:

rootfs_open -w

To remount the filesystem as read-only:

mount -o remount,ro /

Procedure

The patch is performed on /usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js. Please back up this file before proceeding.

--- a/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
+++ b/usr/palm/applications/com.palm.app.camera/app/controllers/capture-assistant.js
@@ -134,6 +134,7 @@
 				this._handleCaptureToggle();
 			}.bind(this));
 		}
+		this.volumeKeySubscription = null;
 		
 		
 		
@@ -136,7 +137,6 @@
 		}
 		
 		
-		
 		this.onKeyPressHandler = this.onKeyPress.bindAsEventListener(this);
 		Mojo.listen(this.controller.sceneElement, Mojo.Event.keydown, this.onKeyPressHandler);
 		Mojo.listen(this.controller.sceneElement, Mojo.Event.keyup, this.onKeyPressHandler);
@@ -164,7 +164,16 @@
 			AppAssistant.photoRollVideoLoader = AppAssistant.libraries["metascene.videos"];
 
 		}
-		
+		// listen to volume key events
+		this.volumeKeySubscription = new Mojo.Service.Request(
+			'palm://com.palm.keys/audio', 
+			{
+				method: 'status',
+				parameters: {'subscribe': true},
+				onFailure: function() { Mojo.Log.error("Could not subscribe to volume key events"); },
+				onSuccess: this.handleVolumeKeys.bind(this), 
+			});
+			
 		llog("CaptureAssistant::setup() finished");
 	}catch(e){llog("setup threw: "+Object.toJSON(e));}},
 	
@@ -332,6 +341,11 @@
 		}
 		
 		this.cameraControl.closeCamera();
+		
+		// clean up listener for volume keys
+		if(this.volumeKeySubscription) {
+			this.volumeKeySubscription.cancel();
+		}		
 	},
 	
 	handleCommand: function(event){
@@ -382,6 +396,14 @@
 			this.cameraControl.stillCapture();
 		}
 	},
+	
+	// capture on release of volume keys
+	handleVolumeKeys: function(payload) {
+		// capture when either volume up or down buttons are released
+		if(payload.state === 'up' && (payload.key === 'volume_up' || payload.key === 'volume_down')) {
+ 			this.cameraControl.stillCapture();
+ 		}
+	},
   
 	
 	/**

Notes

Volume Control

The keys will still alter the volume of the device. There is a way to lock the buttons so that they don't modify volume when pressed but still report events. Needs futher investigation.

~FXDemolisher