From e498ad522a0e76bac684903e9f730f4e5c4777e0 Mon Sep 17 00:00:00 2001 From: David Ormsbee Date: Tue, 10 Sep 2013 15:12:56 -0400 Subject: [PATCH 1/3] Add hasCamera() method to flash camera detection --- lms/static/js/verify_student/CameraCapture.as | 5 +++++ .../js/verify_student/CameraCapture.swf | Bin 2438 -> 2448 bytes lms/static/js/verify_student/photocapture.js | 4 +++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lms/static/js/verify_student/CameraCapture.as b/lms/static/js/verify_student/CameraCapture.as index a3f68863c6..1d55f80b37 100644 --- a/lms/static/js/verify_student/CameraCapture.as +++ b/lms/static/js/verify_student/CameraCapture.as @@ -58,6 +58,7 @@ package ExternalInterface.addCallback("reset", reset); ExternalInterface.addCallback("imageDataUrl", imageDataUrl); ExternalInterface.addCallback("cameraAuthorized", cameraAuthorized); + ExternalInterface.addCallback("hasCamera", hasCamera); // Notify the container that the SWF is ready to be called. ExternalInterface.call("setSWFIsReady"); @@ -108,6 +109,10 @@ package return permissionGiven; } + public function hasCamera():Boolean { + return (Camera.names.length != 0); + } + public function statusHandler(event:StatusEvent):void { switch (event.code) { diff --git a/lms/static/js/verify_student/CameraCapture.swf b/lms/static/js/verify_student/CameraCapture.swf index 47f87c9493a6f8fd4f9f0f4ea8f81534b40a370a..5ad17e7631252c553b6942b7c8d1b3303ed93e11 100644 GIT binary patch delta 2062 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'; From 5921bca0822b7c640e0435cbf76ce1a15336ff7c Mon Sep 17 00:00:00 2001 From: Frances Botsford Date: Wed, 11 Sep 2013 14:35:55 -0400 Subject: [PATCH 2/3] adding notification to photo page when no flash or webcam is detected --- .../verify_student/photo_verification.html | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lms/templates/verify_student/photo_verification.html b/lms/templates/verify_student/photo_verification.html index 3249e5bcd4..65a5620969 100644 --- a/lms/templates/verify_student/photo_verification.html +++ b/lms/templates/verify_student/photo_verification.html @@ -13,6 +13,36 @@ <%block name="content"> + +%if is_no_webcam: +
+
+ +
+

${_("No Webcam Detected")}

+
+

${_("You don't seem to have a webcam connected. Double-check that your webcam is connected and working to continue registering, or select to {a_start} audit the course for free {a_end} without verifying.").format(a_start='', a_end="")}

+
+
+
+
+%endif + +%if is_no_flash: +
+
+ +
+

${_("No Flash Detected")}

+
+

${_("You don't seem to have Flash installed. {a_start} Get Flash {a_end} to continue your registration.").format(a_start='', a_end="")}

+
+
+
+
+%endif + +
From 7ab5ae925dc64cf7dabad20b635e6db16c0795fa Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Wed, 11 Sep 2013 18:36:35 -0400 Subject: [PATCH 3/3] Add in the ability to detect webcams and flash. Show error messages. --- lms/static/js/verify_student/photocapture.js | 56 ++++++++++++++++--- .../verify_student/photo_verification.html | 8 +-- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/lms/static/js/verify_student/photocapture.js b/lms/static/js/verify_student/photocapture.js index 490bb8a840..3039cb9e0e 100644 --- a/lms/static/js/verify_student/photocapture.js +++ b/lms/static/js/verify_student/photocapture.js @@ -1,5 +1,10 @@ var onVideoFail = function(e) { - console.log('Failed to get camera access!', e); + if(e == 'NO_DEVICES_FOUND') { + $('#no-webcam').show(); + } + else { + console.log('Failed to get camera access!', e); + } }; // Returns true if we are capable of video capture (regardless of whether the @@ -110,6 +115,7 @@ function initSnapshotHandler(names, hasHtml5CameraSupport) { if (hasHtml5CameraSupport) { ctx = canvas[0].getContext('2d'); } + var localMediaStream = null; function snapshot(event) { @@ -188,15 +194,38 @@ function initSnapshotHandler(names, hasHtml5CameraSupport) { } +function browserHasFlash() { + var hasFlash = false; + try { + var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); + if(fo) hasFlash = true; + } catch(e) { + if(navigator.mimeTypes["application/x-shockwave-flash"] != undefined) hasFlash = true; + } + return hasFlash; +} + function objectTagForFlashCamera(name) { - // I manually update this to have ?v={2,3,4, etc} to avoid caching of flash - // objects on local dev. - return ''; + // detect whether or not flash is available + if(browserHasFlash()) { + // I manually update this to have ?v={2,3,4, etc} to avoid caching of flash + // objects on local dev. + return ''; + } + else { + // display a message informing the user to install flash + $('#no-flash').show(); + } +} + +function linkNewWindow(e) { + window.open($(e.target).attr('href')); + e.preventDefault(); } $(document).ready(function() { @@ -229,8 +258,17 @@ $(document).ready(function() { if (!hasHtml5CameraSupport) { $("#face_capture_div").html(objectTagForFlashCamera("face_flash")); $("#photo_id_capture_div").html(objectTagForFlashCamera("photo_id_flash")); + // wait for the flash object to be loaded + // TODO: we need a better solution for this + setTimeout(function() { + if(browserHasFlash() && !$('#face_flash')[0].hasOwnProperty('hasCamera')) { + onVideoFail('NO_DEVICES_FOUND'); + } + }, 1000); } initSnapshotHandler(["photo_id", "face"], hasHtml5CameraSupport); + $('a[rel="external"]').attr('title', gettext('This link will open in a new browser window/tab')).bind('click', linkNewWindow); + }); diff --git a/lms/templates/verify_student/photo_verification.html b/lms/templates/verify_student/photo_verification.html index 65a5620969..bec59216be 100644 --- a/lms/templates/verify_student/photo_verification.html +++ b/lms/templates/verify_student/photo_verification.html @@ -14,8 +14,7 @@ <%block name="content"> -%if is_no_webcam: -
+ -%endif -%if is_no_flash: -
+ -%endif