2013-01-30 22:51:40 +08:00
// Platform: android
2012-04-13 07:37:27 +08:00
2013-04-19 03:28:00 +08:00
// commit d0ffb852378ff018bac2f3b12c38098a19b8ce00
2013-01-30 22:51:40 +08:00
2013-04-19 03:28:00 +08:00
// File generated at :: Thu Apr 18 2013 15:10:54 GMT-0400 (EDT)
2012-04-10 08:11:13 +08:00
2012-02-18 07:28:35 +08:00
/ *
2012-03-25 02:09:57 +08:00
Licensed to the Apache Software Foundation ( ASF ) under one
or more contributor license agreements . See the NOTICE file
distributed with this work for additional information
regarding copyright ownership . The ASF licenses this file
to you under the Apache License , Version 2.0 ( the
"License" ) ; you may not use this file except in compliance
with the License . You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing ,
software distributed under the License is distributed on an
"AS IS" BASIS , WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND , either express or implied . See the License for the
specific language governing permissions and limitations
under the License .
* /
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
; ( function ( ) {
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/scripts/require.js
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var require ,
define ;
( function ( ) {
var modules = { } ;
2012-09-19 01:15:24 +08:00
// Stack of moduleIds currently being built.
var requireStack = [ ] ;
// Map of module ID -> index into requireStack of modules currently being built.
var inProgressModules = { } ;
2012-02-18 07:28:35 +08:00
function build ( module ) {
var factory = module . factory ;
module . exports = { } ;
delete module . factory ;
factory ( require , module . exports , module ) ;
return module . exports ;
}
require = function ( id ) {
if ( ! modules [ id ] ) {
throw "module " + id + " not found" ;
2012-09-19 01:15:24 +08:00
} else if ( id in inProgressModules ) {
var cycle = requireStack . slice ( inProgressModules [ id ] ) . join ( '->' ) + '->' + id ;
throw "Cycle in require graph: " + cycle ;
2012-02-18 07:28:35 +08:00
}
2012-09-19 01:15:24 +08:00
if ( modules [ id ] . factory ) {
try {
inProgressModules [ id ] = requireStack . length ;
requireStack . push ( id ) ;
return build ( modules [ id ] ) ;
} finally {
delete inProgressModules [ id ] ;
requireStack . pop ( ) ;
}
}
return modules [ id ] . exports ;
2012-03-25 02:09:57 +08:00
} ;
2012-02-18 07:28:35 +08:00
define = function ( id , factory ) {
if ( modules [ id ] ) {
throw "module " + id + " already defined" ;
}
modules [ id ] = {
id : id ,
factory : factory
} ;
2012-03-25 02:09:57 +08:00
} ;
2012-02-18 07:28:35 +08:00
define . remove = function ( id ) {
delete modules [ id ] ;
} ;
2013-01-22 05:47:26 +08:00
define . moduleMap = modules ;
2012-02-18 07:28:35 +08:00
} ) ( ) ;
//Export for use in node
if ( typeof module === "object" && typeof require === "function" ) {
module . exports . require = require ;
module . exports . define = define ;
}
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/cordova.js
define ( "cordova" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var channel = require ( 'cordova/channel' ) ;
2012-04-24 02:37:33 +08:00
/ * *
* Listen for DOMContentLoaded and notify our channel subscribers .
* /
document . addEventListener ( 'DOMContentLoaded' , function ( ) {
channel . onDOMContentLoaded . fire ( ) ;
} , false ) ;
2012-06-06 05:26:02 +08:00
if ( document . readyState == 'complete' || document . readyState == 'interactive' ) {
2012-04-24 02:37:33 +08:00
channel . onDOMContentLoaded . fire ( ) ;
}
2012-02-18 07:28:35 +08:00
/ * *
* Intercept calls to addEventListener + removeEventListener and handle deviceready ,
* resume , and pause events .
* /
var m _document _addEventListener = document . addEventListener ;
var m _document _removeEventListener = document . removeEventListener ;
var m _window _addEventListener = window . addEventListener ;
var m _window _removeEventListener = window . removeEventListener ;
/ * *
* Houses custom event handlers to intercept on document + window event listeners .
* /
var documentEventHandlers = { } ,
windowEventHandlers = { } ;
document . addEventListener = function ( evt , handler , capture ) {
var e = evt . toLowerCase ( ) ;
2012-05-11 07:43:08 +08:00
if ( typeof documentEventHandlers [ e ] != 'undefined' ) {
2012-09-19 01:15:24 +08:00
documentEventHandlers [ e ] . subscribe ( handler ) ;
2012-02-18 07:28:35 +08:00
} else {
2012-05-01 04:42:38 +08:00
m _document _addEventListener . call ( document , evt , handler , capture ) ;
2012-02-18 07:28:35 +08:00
}
} ;
window . addEventListener = function ( evt , handler , capture ) {
2012-05-01 04:42:38 +08:00
var e = evt . toLowerCase ( ) ;
if ( typeof windowEventHandlers [ e ] != 'undefined' ) {
windowEventHandlers [ e ] . subscribe ( handler ) ;
} else {
m _window _addEventListener . call ( window , evt , handler , capture ) ;
}
2012-02-18 07:28:35 +08:00
} ;
2012-03-01 23:45:27 +08:00
document . removeEventListener = function ( evt , handler , capture ) {
2012-04-24 02:37:33 +08:00
var e = evt . toLowerCase ( ) ;
2012-09-29 02:36:36 +08:00
// If unsubscribing from an event that is handled by a plugin
2012-05-11 07:43:08 +08:00
if ( typeof documentEventHandlers [ e ] != "undefined" ) {
2012-04-24 02:37:33 +08:00
documentEventHandlers [ e ] . unsubscribe ( handler ) ;
} else {
m _document _removeEventListener . call ( document , evt , handler , capture ) ;
}
2012-02-18 07:28:35 +08:00
} ;
window . removeEventListener = function ( evt , handler , capture ) {
2012-05-01 04:42:38 +08:00
var e = evt . toLowerCase ( ) ;
2012-09-29 02:36:36 +08:00
// If unsubscribing from an event that is handled by a plugin
2012-05-01 04:42:38 +08:00
if ( typeof windowEventHandlers [ e ] != "undefined" ) {
windowEventHandlers [ e ] . unsubscribe ( handler ) ;
} else {
m _window _removeEventListener . call ( window , evt , handler , capture ) ;
}
2012-02-18 07:28:35 +08:00
} ;
function createEvent ( type , data ) {
2012-05-01 04:42:38 +08:00
var event = document . createEvent ( 'Events' ) ;
event . initEvent ( type , false , false ) ;
if ( data ) {
for ( var i in data ) {
if ( data . hasOwnProperty ( i ) ) {
event [ i ] = data [ i ] ;
}
}
2012-02-18 07:28:35 +08:00
}
2012-05-01 04:42:38 +08:00
return event ;
2012-02-18 07:28:35 +08:00
}
2012-05-01 04:42:38 +08:00
if ( typeof window . console === "undefined" ) {
2012-04-24 02:37:33 +08:00
window . console = {
log : function ( ) { }
} ;
2012-04-10 08:11:13 +08:00
}
2012-02-18 07:28:35 +08:00
var cordova = {
2012-03-10 04:32:22 +08:00
define : define ,
require : require ,
2012-02-18 07:28:35 +08:00
/ * *
* Methods to add / remove your own addEventListener hijacking on document + window .
* /
2012-09-19 01:15:24 +08:00
addWindowEventHandler : function ( event ) {
return ( windowEventHandlers [ event ] = channel . create ( event ) ) ;
2012-02-18 07:28:35 +08:00
} ,
2012-09-19 01:15:24 +08:00
addStickyDocumentEventHandler : function ( event ) {
return ( documentEventHandlers [ event ] = channel . createSticky ( event ) ) ;
} ,
addDocumentEventHandler : function ( event ) {
return ( documentEventHandlers [ event ] = channel . create ( event ) ) ;
2012-02-18 07:28:35 +08:00
} ,
removeWindowEventHandler : function ( event ) {
2012-05-01 04:42:38 +08:00
delete windowEventHandlers [ event ] ;
2012-02-18 07:28:35 +08:00
} ,
removeDocumentEventHandler : function ( event ) {
2012-05-01 04:42:38 +08:00
delete documentEventHandlers [ event ] ;
2012-02-18 07:28:35 +08:00
} ,
2012-04-10 08:11:13 +08:00
/ * *
2012-09-29 02:36:36 +08:00
* Retrieve original event handlers that were replaced by Cordova
2012-04-10 08:11:13 +08:00
*
* @ return object
* /
getOriginalHandlers : function ( ) {
return { 'document' : { 'addEventListener' : m _document _addEventListener , 'removeEventListener' : m _document _removeEventListener } ,
'window' : { 'addEventListener' : m _window _addEventListener , 'removeEventListener' : m _window _removeEventListener } } ;
} ,
2012-02-18 07:28:35 +08:00
/ * *
* Method to fire event from native code
2012-10-16 04:52:19 +08:00
* bNoDetach is required for events which cause an exception which needs to be caught in native code
2012-02-18 07:28:35 +08:00
* /
2012-09-12 23:44:53 +08:00
fireDocumentEvent : function ( type , data , bNoDetach ) {
2012-05-01 04:42:38 +08:00
var evt = createEvent ( type , data ) ;
if ( typeof documentEventHandlers [ type ] != 'undefined' ) {
2012-09-12 23:44:53 +08:00
if ( bNoDetach ) {
documentEventHandlers [ type ] . fire ( evt ) ;
}
else {
setTimeout ( function ( ) {
2013-04-19 03:28:00 +08:00
// Fire deviceready on listeners that were registered before cordova.js was loaded.
if ( type == 'deviceready' ) {
document . dispatchEvent ( evt ) ;
}
2012-09-12 23:44:53 +08:00
documentEventHandlers [ type ] . fire ( evt ) ;
} , 0 ) ;
}
2012-05-01 04:42:38 +08:00
} else {
document . dispatchEvent ( evt ) ;
}
2012-02-18 07:28:35 +08:00
} ,
fireWindowEvent : function ( type , data ) {
2012-05-01 04:42:38 +08:00
var evt = createEvent ( type , data ) ;
if ( typeof windowEventHandlers [ type ] != 'undefined' ) {
2012-06-22 02:12:30 +08:00
setTimeout ( function ( ) {
windowEventHandlers [ type ] . fire ( evt ) ;
} , 0 ) ;
2012-05-01 04:42:38 +08:00
} else {
window . dispatchEvent ( evt ) ;
}
2012-02-18 07:28:35 +08:00
} ,
2012-03-06 04:11:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Plugin callback mechanism .
* /
2012-09-29 02:36:36 +08:00
// Randomize the starting callbackId to avoid collisions after refreshing or navigating.
// This way, it's very unlikely that any new callback would get the same callbackId as an old callback.
callbackId : Math . floor ( Math . random ( ) * 2000000000 ) ,
2012-02-18 07:28:35 +08:00
callbacks : { } ,
callbackStatus : {
NO _RESULT : 0 ,
OK : 1 ,
CLASS _NOT _FOUND _EXCEPTION : 2 ,
ILLEGAL _ACCESS _EXCEPTION : 3 ,
INSTANTIATION _EXCEPTION : 4 ,
MALFORMED _URL _EXCEPTION : 5 ,
IO _EXCEPTION : 6 ,
INVALID _ACTION : 7 ,
JSON _EXCEPTION : 8 ,
ERROR : 9
} ,
/ * *
* Called by native code when returning successful result from an action .
* /
callbackSuccess : function ( callbackId , args ) {
2012-09-19 01:15:24 +08:00
try {
2013-03-22 01:35:09 +08:00
cordova . callbackFromNative ( callbackId , true , args . status , [ args . message ] , args . keepCallback ) ;
2012-09-19 01:15:24 +08:00
} catch ( e ) {
console . log ( "Error in error callback: " + callbackId + " = " + e ) ;
2012-02-18 07:28:35 +08:00
}
} ,
/ * *
* Called by native code when returning error result from an action .
* /
callbackError : function ( callbackId , args ) {
2012-09-19 01:15:24 +08:00
// TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
// Derive success from status.
try {
2013-03-22 01:35:09 +08:00
cordova . callbackFromNative ( callbackId , false , args . status , [ args . message ] , args . keepCallback ) ;
2012-09-19 01:15:24 +08:00
} catch ( e ) {
console . log ( "Error in error callback: " + callbackId + " = " + e ) ;
}
} ,
/ * *
* Called by native code when returning the result from an action .
* /
2013-03-22 01:35:09 +08:00
callbackFromNative : function ( callbackId , success , status , args , keepCallback ) {
2012-09-19 01:15:24 +08:00
var callback = cordova . callbacks [ callbackId ] ;
if ( callback ) {
if ( success && status == cordova . callbackStatus . OK ) {
2013-03-22 01:35:09 +08:00
callback . success && callback . success . apply ( null , args ) ;
2012-09-19 01:15:24 +08:00
} else if ( ! success ) {
2013-03-22 01:35:09 +08:00
callback . fail && callback . fail . apply ( null , args ) ;
2012-02-18 07:28:35 +08:00
}
// Clear callback if not expecting any more results
2012-09-19 01:15:24 +08:00
if ( ! keepCallback ) {
2012-02-18 07:28:35 +08:00
delete cordova . callbacks [ callbackId ] ;
}
}
2012-03-06 04:11:24 +08:00
} ,
addConstructor : function ( func ) {
2012-09-19 01:15:24 +08:00
channel . onCordovaReady . subscribe ( function ( ) {
2012-03-06 04:11:24 +08:00
try {
func ( ) ;
} catch ( e ) {
console . log ( "Failed to run constructor: " + e ) ;
}
} ) ;
2012-02-18 07:28:35 +08:00
}
} ;
2012-05-11 07:43:08 +08:00
// Register pause, resume and deviceready channels as events on document.
channel . onPause = cordova . addDocumentEventHandler ( 'pause' ) ;
channel . onResume = cordova . addDocumentEventHandler ( 'resume' ) ;
2012-09-19 01:15:24 +08:00
channel . onDeviceReady = cordova . addStickyDocumentEventHandler ( 'deviceready' ) ;
2012-05-11 07:43:08 +08:00
2012-02-18 07:28:35 +08:00
module . exports = cordova ;
2012-11-27 05:09:52 +08:00
} ) ;
// file: lib/common/argscheck.js
define ( "cordova/argscheck" , function ( require , exports , module ) {
var exec = require ( 'cordova/exec' ) ;
2013-01-19 07:33:38 +08:00
var utils = require ( 'cordova/utils' ) ;
2012-11-27 05:09:52 +08:00
var moduleExports = module . exports ;
var typeMap = {
'A' : 'Array' ,
'D' : 'Date' ,
'N' : 'Number' ,
'S' : 'String' ,
'F' : 'Function' ,
'O' : 'Object'
} ;
function extractParamName ( callee , argIndex ) {
return ( /.*?\((.*?)\)/ ) . exec ( callee ) [ 1 ] . split ( ', ' ) [ argIndex ] ;
}
function checkArgs ( spec , functionName , args , opt _callee ) {
if ( ! moduleExports . enableChecks ) {
return ;
}
var errMsg = null ;
2013-01-19 07:33:38 +08:00
var typeName ;
2012-11-27 05:09:52 +08:00
for ( var i = 0 ; i < spec . length ; ++ i ) {
var c = spec . charAt ( i ) ,
cUpper = c . toUpperCase ( ) ,
arg = args [ i ] ;
// Asterix means allow anything.
if ( c == '*' ) {
continue ;
}
2013-01-19 07:33:38 +08:00
typeName = utils . typeName ( arg ) ;
2012-11-27 05:09:52 +08:00
if ( ( arg === null || arg === undefined ) && c == cUpper ) {
continue ;
}
2013-01-19 07:33:38 +08:00
if ( typeName != typeMap [ cUpper ] ) {
2012-11-27 05:09:52 +08:00
errMsg = 'Expected ' + typeMap [ cUpper ] ;
break ;
}
}
if ( errMsg ) {
2013-01-19 07:33:38 +08:00
errMsg += ', but got ' + typeName + '.' ;
2012-11-27 05:09:52 +08:00
errMsg = 'Wrong type for parameter "' + extractParamName ( opt _callee || args . callee , i ) + '" of ' + functionName + ': ' + errMsg ;
// Don't log when running jake test.
if ( typeof jasmine == 'undefined' ) {
console . error ( errMsg ) ;
}
throw TypeError ( errMsg ) ;
}
}
2013-01-19 07:33:38 +08:00
function getValue ( value , defaultValue ) {
return value === undefined ? defaultValue : value ;
}
2012-11-27 05:09:52 +08:00
moduleExports . checkArgs = checkArgs ;
2013-01-19 07:33:38 +08:00
moduleExports . getValue = getValue ;
2012-11-27 05:09:52 +08:00
moduleExports . enableChecks = true ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/builder.js
define ( "cordova/builder" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-04-24 02:37:33 +08:00
var utils = require ( 'cordova/utils' ) ;
2012-03-25 02:09:57 +08:00
function each ( objects , func , context ) {
for ( var prop in objects ) {
if ( objects . hasOwnProperty ( prop ) ) {
func . apply ( context , [ objects [ prop ] , prop ] ) ;
}
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
}
2012-02-18 07:28:35 +08:00
2012-11-23 22:38:49 +08:00
function clobber ( obj , key , value ) {
2013-02-20 03:53:36 +08:00
exports . replaceHookForTesting ( obj , key ) ;
2012-11-23 22:38:49 +08:00
obj [ key ] = value ;
// Getters can only be overridden by getters.
if ( obj [ key ] !== value ) {
utils . defineGetter ( obj , key , function ( ) {
return value ;
} ) ;
}
}
2012-09-19 01:15:24 +08:00
function assignOrWrapInDeprecateGetter ( obj , key , value , message ) {
if ( message ) {
utils . defineGetter ( obj , key , function ( ) {
2012-11-23 22:38:49 +08:00
console . log ( message ) ;
2013-01-22 05:47:26 +08:00
delete obj [ key ] ;
clobber ( obj , key , value ) ;
2012-09-19 01:15:24 +08:00
return value ;
} ) ;
} else {
2012-11-23 22:38:49 +08:00
clobber ( obj , key , value ) ;
2012-09-19 01:15:24 +08:00
}
}
2012-03-25 02:09:57 +08:00
function include ( parent , objects , clobber , merge ) {
each ( objects , function ( obj , key ) {
try {
var result = obj . path ? require ( obj . path ) : { } ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
if ( clobber ) {
// Clobber if it doesn't exist.
if ( typeof parent [ key ] === 'undefined' ) {
2012-09-19 01:15:24 +08:00
assignOrWrapInDeprecateGetter ( parent , key , result , obj . deprecated ) ;
2012-03-25 02:09:57 +08:00
} else if ( typeof obj . path !== 'undefined' ) {
// If merging, merge properties onto parent, otherwise, clobber.
if ( merge ) {
recursiveMerge ( parent [ key ] , result ) ;
} else {
2012-09-19 01:15:24 +08:00
assignOrWrapInDeprecateGetter ( parent , key , result , obj . deprecated ) ;
2012-03-25 02:09:57 +08:00
}
}
result = parent [ key ] ;
} else {
// Overwrite if not currently defined.
if ( typeof parent [ key ] == 'undefined' ) {
2012-09-19 01:15:24 +08:00
assignOrWrapInDeprecateGetter ( parent , key , result , obj . deprecated ) ;
2012-03-25 02:09:57 +08:00
} else {
// Set result to what already exists, so we can build children into it if they exist.
result = parent [ key ] ;
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
}
if ( obj . children ) {
include ( result , obj . children , clobber , merge ) ;
}
} catch ( e ) {
2012-03-29 04:47:45 +08:00
utils . alert ( 'Exception building cordova JS globals: ' + e + ' for key "' + key + '"' ) ;
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
} ) ;
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Merge properties from one object onto another recursively . Properties from
* the src object will overwrite existing target property .
*
* @ param target Object to merge properties into .
* @ param src Object to merge properties from .
* /
function recursiveMerge ( target , src ) {
for ( var prop in src ) {
if ( src . hasOwnProperty ( prop ) ) {
2013-01-22 05:47:26 +08:00
if ( target . prototype && target . prototype . constructor === target ) {
2012-03-25 02:09:57 +08:00
// If the target object is a constructor override off prototype.
2013-01-22 05:47:26 +08:00
clobber ( target . prototype , prop , src [ prop ] ) ;
2012-03-25 02:09:57 +08:00
} else {
2013-01-22 05:47:26 +08:00
if ( typeof src [ prop ] === 'object' && typeof target [ prop ] === 'object' ) {
recursiveMerge ( target [ prop ] , src [ prop ] ) ;
2012-11-23 22:38:49 +08:00
} else {
clobber ( target , prop , src [ prop ] ) ;
}
2012-02-18 07:28:35 +08:00
}
}
2012-03-25 02:09:57 +08:00
}
}
2012-02-18 07:28:35 +08:00
2013-02-20 03:53:36 +08:00
exports . buildIntoButDoNotClobber = function ( objects , target ) {
include ( target , objects , false , false ) ;
2012-03-25 02:09:57 +08:00
} ;
2013-02-20 03:53:36 +08:00
exports . buildIntoAndClobber = function ( objects , target ) {
include ( target , objects , true , false ) ;
} ;
exports . buildIntoAndMerge = function ( objects , target ) {
include ( target , objects , true , true ) ;
} ;
exports . recursiveMerge = recursiveMerge ;
exports . assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter ;
exports . replaceHookForTesting = function ( ) { } ;
2012-02-18 07:28:35 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/channel.js
define ( "cordova/channel" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-08-25 04:44:18 +08:00
var utils = require ( 'cordova/utils' ) ,
nextGuid = 1 ;
2012-05-01 04:42:38 +08:00
2012-03-25 02:09:57 +08:00
/ * *
2012-04-11 22:44:09 +08:00
* Custom pub - sub "channel" that can have functions subscribed to it
* This object is used to define and control firing of events for
2012-09-19 01:15:24 +08:00
* cordova initialization , as well as for custom events thereafter .
2012-04-11 22:44:09 +08:00
*
* The order of events during page load and Cordova startup is as follows :
*
2012-09-19 01:15:24 +08:00
* onDOMContentLoaded * Internal event that is received when the web page is loaded and parsed .
* onNativeReady * Internal event that indicates the Cordova native side is ready .
* onCordovaReady * Internal event fired when all Cordova JavaScript objects have been created .
* onCordovaInfoReady * Internal event fired when device properties are available .
* onCordovaConnectionReady * Internal event fired when the connection property has been set .
* onDeviceReady * User event fired to indicate that Cordova is ready
* onResume User event fired to indicate a start / resume lifecycle event
* onPause User event fired to indicate a pause lifecycle event
* onDestroy * Internal event fired when app is being destroyed ( User should use window . onunload event , not this one ) .
*
* The events marked with an * are sticky . Once they have fired , they will stay in the fired state .
* All listeners that subscribe after the event is fired will be executed right away .
2012-04-11 22:44:09 +08:00
*
* The only Cordova events that user code should register for are :
* deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript
* pause App has moved to background
* resume App has returned to foreground
*
* Listeners can be registered as :
* document . addEventListener ( "deviceready" , myDeviceReadyListener , false ) ;
* document . addEventListener ( "resume" , myResumeListener , false ) ;
* document . addEventListener ( "pause" , myPauseListener , false ) ;
*
* The DOM lifecycle events should be used for saving and restoring state
* window . onload
* window . onunload
*
* /
/ * *
* Channel
2012-03-25 02:09:57 +08:00
* @ constructor
* @ param type String the channel name
2012-09-19 01:15:24 +08:00
* /
var Channel = function ( type , sticky ) {
2012-05-01 04:42:38 +08:00
this . type = type ;
2012-09-19 01:15:24 +08:00
// Map of guid -> function.
2012-05-01 04:42:38 +08:00
this . handlers = { } ;
2012-09-19 01:15:24 +08:00
// 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.
this . state = sticky ? 1 : 0 ;
// Used in sticky mode to remember args passed to fire().
this . fireArgs = null ;
// Used by onHasSubscribersChange to know if there are any listeners.
2012-05-01 04:42:38 +08:00
this . numHandlers = 0 ;
2012-09-19 01:15:24 +08:00
// Function that is called when the first listener is subscribed, or when
// the last listener is unsubscribed.
this . onHasSubscribersChange = null ;
2012-05-01 04:42:38 +08:00
} ,
2012-03-25 02:09:57 +08:00
channel = {
/ * *
* Calls the provided function only after all of the channels specified
2012-09-19 01:15:24 +08:00
* have been fired . All channels must be sticky channels .
2012-03-25 02:09:57 +08:00
* /
2012-09-19 01:15:24 +08:00
join : function ( h , c ) {
var len = c . length ,
i = len ,
f = function ( ) {
if ( ! ( -- i ) ) h ( ) ;
} ;
2012-03-25 02:09:57 +08:00
for ( var j = 0 ; j < len ; j ++ ) {
2012-10-16 04:52:19 +08:00
if ( c [ j ] . state === 0 ) {
throw Error ( 'Can only use join with sticky channels.' ) ;
2012-09-19 01:15:24 +08:00
}
c [ j ] . subscribe ( f ) ;
2012-03-25 02:09:57 +08:00
}
2012-09-19 01:15:24 +08:00
if ( ! len ) h ( ) ;
2012-03-25 02:09:57 +08:00
} ,
2012-09-19 01:15:24 +08:00
create : function ( type ) {
return channel [ type ] = new Channel ( type , false ) ;
} ,
createSticky : function ( type ) {
return channel [ type ] = new Channel ( type , true ) ;
2012-03-25 02:09:57 +08:00
} ,
/ * *
* cordova Channels that must fire before "deviceready" is fired .
2012-04-24 02:37:33 +08:00
* /
2012-03-25 02:09:57 +08:00
deviceReadyChannelsArray : [ ] ,
deviceReadyChannelsMap : { } ,
2012-04-24 02:37:33 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Indicate that a feature needs to be initialized before it is ready to be used .
* This holds up Cordova ' s "deviceready" event until the feature has been initialized
* and Cordova . initComplete ( feature ) is called .
*
* @ param feature { String } The unique feature name
* /
waitForInitialization : function ( feature ) {
if ( feature ) {
2012-09-19 01:15:24 +08:00
var c = channel [ feature ] || this . createSticky ( feature ) ;
2012-03-25 02:09:57 +08:00
this . deviceReadyChannelsMap [ feature ] = c ;
this . deviceReadyChannelsArray . push ( c ) ;
}
} ,
/ * *
* Indicate that initialization code has completed and the feature is ready to be used .
*
* @ param feature { String } The unique feature name
* /
initializationComplete : function ( feature ) {
var c = this . deviceReadyChannelsMap [ feature ] ;
if ( c ) {
c . fire ( ) ;
2012-02-18 07:28:35 +08:00
}
}
2012-05-01 04:42:38 +08:00
} ;
function forceFunction ( f ) {
2012-09-19 01:15:24 +08:00
if ( typeof f != 'function' ) throw "Function required as first argument!" ;
2012-05-01 04:42:38 +08:00
}
2012-03-25 02:09:57 +08:00
/ * *
2012-04-24 02:37:33 +08:00
* Subscribes the given function to the channel . Any time that
2012-03-25 02:09:57 +08:00
* Channel . fire is called so too will the function .
* Optionally specify an execution context for the function
* and a guid that can be used to stop subscribing to the channel .
* Returns the guid .
* /
2012-09-19 01:15:24 +08:00
Channel . prototype . subscribe = function ( f , c ) {
2012-03-25 02:09:57 +08:00
// need a function to call
2012-05-01 04:42:38 +08:00
forceFunction ( f ) ;
2012-09-19 01:15:24 +08:00
if ( this . state == 2 ) {
f . apply ( c || this , this . fireArgs ) ;
return ;
}
2012-03-25 02:09:57 +08:00
2012-09-19 01:15:24 +08:00
var func = f ,
guid = f . observer _guid ;
2012-05-01 04:42:38 +08:00
if ( typeof c == "object" ) { func = utils . close ( c , f ) ; }
2012-03-25 02:09:57 +08:00
2012-09-19 01:15:24 +08:00
if ( ! guid ) {
2012-08-25 04:44:18 +08:00
// first time any channel has seen this subscriber
2012-09-19 01:15:24 +08:00
guid = '' + nextGuid ++ ;
2012-06-06 05:26:02 +08:00
}
2012-09-19 01:15:24 +08:00
func . observer _guid = guid ;
f . observer _guid = guid ;
2012-08-25 04:44:18 +08:00
// Don't add the same handler more than once.
2012-09-19 01:15:24 +08:00
if ( ! this . handlers [ guid ] ) {
this . handlers [ guid ] = func ;
2012-08-25 04:44:18 +08:00
this . numHandlers ++ ;
2012-09-19 01:15:24 +08:00
if ( this . numHandlers == 1 ) {
this . onHasSubscribersChange && this . onHasSubscribersChange ( ) ;
}
2012-02-18 07:28:35 +08:00
}
2012-03-25 02:09:57 +08:00
} ;
2012-04-24 02:37:33 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* Unsubscribes the function with the given guid from the channel .
* /
2012-09-19 01:15:24 +08:00
Channel . prototype . unsubscribe = function ( f ) {
2012-03-25 02:09:57 +08:00
// need a function to unsubscribe
2012-09-19 01:15:24 +08:00
forceFunction ( f ) ;
2012-03-25 02:09:57 +08:00
2012-09-19 01:15:24 +08:00
var guid = f . observer _guid ,
handler = this . handlers [ guid ] ;
2012-05-11 06:50:02 +08:00
if ( handler ) {
2012-09-19 01:15:24 +08:00
delete this . handlers [ guid ] ;
2012-05-11 06:50:02 +08:00
this . numHandlers -- ;
2012-10-16 04:52:19 +08:00
if ( this . numHandlers === 0 ) {
2012-09-19 01:15:24 +08:00
this . onHasSubscribersChange && this . onHasSubscribersChange ( ) ;
}
2012-05-11 06:50:02 +08:00
}
2012-03-25 02:09:57 +08:00
} ;
2012-04-24 02:37:33 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* Calls all functions subscribed to this channel .
* /
Channel . prototype . fire = function ( e ) {
2012-09-19 01:15:24 +08:00
var fail = false ,
fireArgs = Array . prototype . slice . call ( arguments ) ;
// Apply stickiness.
if ( this . state == 1 ) {
this . state = 2 ;
this . fireArgs = fireArgs ;
}
if ( this . numHandlers ) {
2012-08-25 04:44:18 +08:00
// Copy the values first so that it is safe to modify it from within
// callbacks.
var toCall = [ ] ;
2012-03-25 02:09:57 +08:00
for ( var item in this . handlers ) {
2012-08-25 04:44:18 +08:00
toCall . push ( this . handlers [ item ] ) ;
}
for ( var i = 0 ; i < toCall . length ; ++ i ) {
2012-09-19 01:15:24 +08:00
toCall [ i ] . apply ( this , fireArgs ) ;
}
if ( this . state == 2 && this . numHandlers ) {
this . numHandlers = 0 ;
this . handlers = { } ;
this . onHasSubscribersChange && this . onHasSubscribersChange ( ) ;
2012-03-25 02:09:57 +08:00
}
}
2012-02-18 07:28:35 +08:00
} ;
2012-09-19 01:15:24 +08:00
2012-04-11 22:44:09 +08:00
// defining them here so they are ready super fast!
2012-03-25 02:09:57 +08:00
// DOM event that is received when the web page is loaded and parsed.
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onDOMContentLoaded' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate the Cordova native side is ready.
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onNativeReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate that all Cordova JavaScript objects have been created
// and it's time to run plugin constructors.
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onCordovaReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate that device properties are available
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onCordovaInfoReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate that the connection property has been set.
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onCordovaConnectionReady' ) ;
2012-03-25 02:09:57 +08:00
2013-03-22 01:35:09 +08:00
// Event to indicate that all automatically loaded JS plugins are loaded and ready.
channel . createSticky ( 'onPluginsReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate that Cordova is ready
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onDeviceReady' ) ;
2012-03-25 02:09:57 +08:00
// Event to indicate a resume lifecycle event
channel . create ( 'onResume' ) ;
// Event to indicate a pause lifecycle event
channel . create ( 'onPause' ) ;
// Event to indicate a destroy lifecycle event
2012-09-19 01:15:24 +08:00
channel . createSticky ( 'onDestroy' ) ;
2012-03-25 02:09:57 +08:00
// Channels that must fire before "deviceready" is fired.
channel . waitForInitialization ( 'onCordovaReady' ) ;
channel . waitForInitialization ( 'onCordovaConnectionReady' ) ;
2013-04-19 03:28:00 +08:00
channel . waitForInitialization ( 'onDOMContentLoaded' ) ;
2012-03-25 02:09:57 +08:00
module . exports = channel ;
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2012-10-16 04:52:19 +08:00
// file: lib/common/commandProxy.js
define ( "cordova/commandProxy" , function ( require , exports , module ) {
// internal map of proxy function
var CommandProxyMap = { } ;
module . exports = {
// example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...);
add : function ( id , proxyObj ) {
console . log ( "adding proxy for " + id ) ;
CommandProxyMap [ id ] = proxyObj ;
return proxyObj ;
} ,
// cordova.commandProxy.remove("Accelerometer");
remove : function ( id ) {
var proxy = CommandProxyMap [ id ] ;
delete CommandProxyMap [ id ] ;
CommandProxyMap [ id ] = null ;
return proxy ;
} ,
get : function ( service , action ) {
return ( CommandProxyMap [ service ] ? CommandProxyMap [ service ] [ action ] : null ) ;
}
} ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/android/exec.js
define ( "cordova/exec" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Execute a cordova command . It is up to the native side whether this action
* is synchronous or asynchronous . The native side can return :
* Synchronous : PluginResult object as a JSON string
2012-09-29 02:36:36 +08:00
* Asynchronous : Empty string ""
2012-03-25 02:09:57 +08:00
* If async , the native side will cordova . callbackSuccess or cordova . callbackError ,
* depending upon the result of the action .
*
* @ param { Function } success The success callback
* @ param { Function } fail The fail callback
* @ param { String } service The name of the service to use
* @ param { String } action Action to be run in cordova
* @ param { String [ ] } [ args ] Zero or more arguments to pass to the method
* /
2012-08-22 21:50:40 +08:00
var cordova = require ( 'cordova' ) ,
2012-09-19 01:15:24 +08:00
nativeApiProvider = require ( 'cordova/plugin/android/nativeapiprovider' ) ,
2013-01-22 05:47:26 +08:00
utils = require ( 'cordova/utils' ) ,
2012-08-22 21:50:40 +08:00
jsToNativeModes = {
PROMPT : 0 ,
JS _OBJECT : 1 ,
2012-08-25 04:44:18 +08:00
// This mode is currently for benchmarking purposes only. It must be enabled
// on the native side through the ENABLE_LOCATION_CHANGE_EXEC_MODE
// constant within CordovaWebViewClient.java before it will work.
LOCATION _CHANGE : 2
2012-08-22 21:50:40 +08:00
} ,
nativeToJsModes = {
2012-09-19 01:15:24 +08:00
// Polls for messages using the JS->Native bridge.
2012-08-22 21:50:40 +08:00
POLLING : 0 ,
// For LOAD_URL to be viable, it would need to have a work-around for
// the bug where the soft-keyboard gets dismissed when a message is sent.
2012-10-02 21:40:16 +08:00
LOAD _URL : 1 ,
2012-08-22 21:50:40 +08:00
// For the ONLINE_EVENT to be viable, it would need to intercept all event
// listeners (both through addEventListener and window.ononline) as well
// as set the navigator property itself.
2012-10-02 21:40:16 +08:00
ONLINE _EVENT : 2 ,
2012-08-22 21:50:40 +08:00
// Uses reflection to access private APIs of the WebView that can send JS
// to be executed.
// Requires Android 3.2.4 or above.
2012-10-02 21:40:16 +08:00
PRIVATE _API : 3
2012-09-21 11:39:09 +08:00
} ,
jsToNativeBridgeMode , // Set lazily.
2012-10-02 21:40:16 +08:00
nativeToJsBridgeMode = nativeToJsModes . ONLINE _EVENT ,
pollEnabled = false ,
messagesFromNative = [ ] ;
2012-02-18 07:28:35 +08:00
2012-08-22 21:50:40 +08:00
function androidExec ( success , fail , service , action , args ) {
2012-08-25 04:44:18 +08:00
// Set default bridge modes if they have not already been set.
2012-11-23 22:38:49 +08:00
// By default, we use the failsafe, since addJavascriptInterface breaks too often
2012-08-25 04:44:18 +08:00
if ( jsToNativeBridgeMode === undefined ) {
2012-09-21 11:39:09 +08:00
androidExec . setJsToNativeBridgeMode ( jsToNativeModes . JS _OBJECT ) ;
2012-08-25 04:44:18 +08:00
}
2012-09-21 11:39:09 +08:00
2013-01-19 07:33:38 +08:00
// Process any ArrayBuffers in the args into a string.
for ( var i = 0 ; i < args . length ; i ++ ) {
2013-01-22 05:47:26 +08:00
if ( utils . typeName ( args [ i ] ) == 'ArrayBuffer' ) {
2013-01-19 07:33:38 +08:00
args [ i ] = window . btoa ( String . fromCharCode . apply ( null , new Uint8Array ( args [ i ] ) ) ) ;
}
}
2012-09-19 01:15:24 +08:00
var callbackId = service + cordova . callbackId ++ ,
2013-04-19 03:28:00 +08:00
argsJson = JSON . stringify ( args ) ;
2012-10-26 03:02:26 +08:00
2013-04-19 03:28:00 +08:00
if ( success || fail ) {
cordova . callbacks [ callbackId ] = { success : success , fail : fail } ;
2012-09-19 01:15:24 +08:00
}
2012-02-18 07:28:35 +08:00
2012-09-19 01:15:24 +08:00
if ( jsToNativeBridgeMode == jsToNativeModes . LOCATION _CHANGE ) {
window . location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson ;
} else {
var messages = nativeApiProvider . get ( ) . exec ( service , action , callbackId , argsJson ) ;
2013-04-19 03:28:00 +08:00
// If argsJson was received by Java as null, try again with the PROMPT bridge mode.
// This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666.
if ( jsToNativeBridgeMode == jsToNativeModes . JS _OBJECT && messages === "@Null arguments." ) {
androidExec . setJsToNativeBridgeMode ( jsToNativeModes . PROMPT ) ;
androidExec ( success , fail , service , action , args ) ;
androidExec . setJsToNativeBridgeMode ( jsToNativeModes . JS _OBJECT ) ;
return ;
2012-10-26 03:02:26 +08:00
} else {
2013-04-19 03:28:00 +08:00
androidExec . processMessages ( messages ) ;
2012-10-26 03:02:26 +08:00
}
}
2012-09-01 04:44:53 +08:00
}
2012-08-22 21:50:40 +08:00
2012-09-29 02:36:36 +08:00
function pollOnce ( ) {
var msg = nativeApiProvider . get ( ) . retrieveJsMessages ( ) ;
androidExec . processMessages ( msg ) ;
}
function pollingTimerFunc ( ) {
if ( pollEnabled ) {
2012-10-27 04:09:54 +08:00
pollOnce ( ) ;
setTimeout ( pollingTimerFunc , 50 ) ;
2012-09-29 02:36:36 +08:00
}
}
2012-09-19 01:15:24 +08:00
function hookOnlineApis ( ) {
function proxyEvent ( e ) {
cordova . fireWindowEvent ( e . type ) ;
}
// The network module takes care of firing online and offline events.
// It currently fires them only on document though, so we bridge them
// to window here (while first listening for exec()-releated online/offline
// events).
2012-09-29 02:36:36 +08:00
window . addEventListener ( 'online' , pollOnce , false ) ;
window . addEventListener ( 'offline' , pollOnce , false ) ;
2012-09-19 01:15:24 +08:00
cordova . addWindowEventHandler ( 'online' ) ;
cordova . addWindowEventHandler ( 'offline' ) ;
document . addEventListener ( 'online' , proxyEvent , false ) ;
document . addEventListener ( 'offline' , proxyEvent , false ) ;
2012-08-22 21:50:40 +08:00
}
2012-09-19 01:15:24 +08:00
hookOnlineApis ( ) ;
2012-08-22 21:50:40 +08:00
androidExec . jsToNativeModes = jsToNativeModes ;
androidExec . nativeToJsModes = nativeToJsModes ;
androidExec . setJsToNativeBridgeMode = function ( mode ) {
2012-09-19 01:15:24 +08:00
if ( mode == jsToNativeModes . JS _OBJECT && ! window . _cordovaNative ) {
2013-03-22 01:35:09 +08:00
console . log ( 'Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.' ) ;
2012-08-22 21:50:40 +08:00
mode = jsToNativeModes . PROMPT ;
}
2012-09-19 01:15:24 +08:00
nativeApiProvider . setPreferPrompt ( mode == jsToNativeModes . PROMPT ) ;
2012-08-22 21:50:40 +08:00
jsToNativeBridgeMode = mode ;
} ;
androidExec . setNativeToJsBridgeMode = function ( mode ) {
if ( mode == nativeToJsBridgeMode ) {
return ;
}
if ( nativeToJsBridgeMode == nativeToJsModes . POLLING ) {
2012-09-29 02:36:36 +08:00
pollEnabled = false ;
2012-08-22 21:50:40 +08:00
}
nativeToJsBridgeMode = mode ;
// Tell the native side to switch modes.
2012-09-19 01:15:24 +08:00
nativeApiProvider . get ( ) . setNativeToJsBridgeMode ( mode ) ;
2012-08-22 21:50:40 +08:00
if ( mode == nativeToJsModes . POLLING ) {
2012-09-29 02:36:36 +08:00
pollEnabled = true ;
setTimeout ( pollingTimerFunc , 1 ) ;
2012-09-19 01:15:24 +08:00
}
} ;
// Processes a single message, as encoded by NativeToJsMessageQueue.java.
function processMessage ( message ) {
try {
var firstChar = message . charAt ( 0 ) ;
if ( firstChar == 'J' ) {
eval ( message . slice ( 1 ) ) ;
} else if ( firstChar == 'S' || firstChar == 'F' ) {
var success = firstChar == 'S' ;
var keepCallback = message . charAt ( 1 ) == '1' ;
var spaceIdx = message . indexOf ( ' ' , 2 ) ;
var status = + message . slice ( 2 , spaceIdx ) ;
var nextSpaceIdx = message . indexOf ( ' ' , spaceIdx + 1 ) ;
var callbackId = message . slice ( spaceIdx + 1 , nextSpaceIdx ) ;
var payloadKind = message . charAt ( nextSpaceIdx + 1 ) ;
var payload ;
if ( payloadKind == 's' ) {
payload = message . slice ( nextSpaceIdx + 2 ) ;
} else if ( payloadKind == 't' ) {
payload = true ;
} else if ( payloadKind == 'f' ) {
payload = false ;
2012-10-26 03:02:26 +08:00
} else if ( payloadKind == 'N' ) {
payload = null ;
2012-09-19 01:15:24 +08:00
} else if ( payloadKind == 'n' ) {
payload = + message . slice ( nextSpaceIdx + 2 ) ;
2013-01-19 07:33:38 +08:00
} else if ( payloadKind == 'A' ) {
var data = message . slice ( nextSpaceIdx + 2 ) ;
var bytes = window . atob ( data ) ;
var arraybuffer = new Uint8Array ( bytes . length ) ;
for ( var i = 0 ; i < bytes . length ; i ++ ) {
arraybuffer [ i ] = bytes . charCodeAt ( i ) ;
}
payload = arraybuffer . buffer ;
2013-03-22 01:35:09 +08:00
} else if ( payloadKind == 'S' ) {
payload = window . atob ( message . slice ( nextSpaceIdx + 2 ) ) ;
2012-09-19 01:15:24 +08:00
} else {
payload = JSON . parse ( message . slice ( nextSpaceIdx + 1 ) ) ;
}
2013-03-22 01:35:09 +08:00
cordova . callbackFromNative ( callbackId , success , status , [ payload ] , keepCallback ) ;
2012-09-19 01:15:24 +08:00
} else {
console . log ( "processMessage failed: invalid message:" + message ) ;
}
} catch ( e ) {
console . log ( "processMessage failed: Message: " + message ) ;
console . log ( "processMessage failed: Error: " + e ) ;
console . log ( "processMessage failed: Stack: " + e . stack ) ;
}
}
// This is called from the NativeToJsMessageQueue.java.
androidExec . processMessages = function ( messages ) {
2012-10-27 04:09:54 +08:00
if ( messages ) {
messagesFromNative . push ( messages ) ;
2013-04-19 03:28:00 +08:00
// Check for the reentrant case, and enqueue the message if that's the case.
if ( messagesFromNative . length > 1 ) {
return ;
}
2012-10-27 04:09:54 +08:00
while ( messagesFromNative . length ) {
2013-04-19 03:28:00 +08:00
// Don't unshift until the end so that reentrancy can be detected.
messages = messagesFromNative [ 0 ] ;
2012-10-27 04:09:54 +08:00
// The Java side can send a * message to indicate that it
// still has messages waiting to be retrieved.
2012-10-02 21:40:16 +08:00
if ( messages == '*' ) {
2013-04-19 03:28:00 +08:00
messagesFromNative . shift ( ) ;
2012-10-02 21:40:16 +08:00
window . setTimeout ( pollOnce , 0 ) ;
2013-04-19 03:28:00 +08:00
return ;
2012-10-02 21:40:16 +08:00
}
2012-10-27 04:09:54 +08:00
2012-10-02 21:40:16 +08:00
var spaceIdx = messages . indexOf ( ' ' ) ;
var msgLen = + messages . slice ( 0 , spaceIdx ) ;
var message = messages . substr ( spaceIdx + 1 , msgLen ) ;
messages = messages . slice ( spaceIdx + msgLen + 1 ) ;
2013-04-19 03:28:00 +08:00
processMessage ( message ) ;
2012-10-27 04:09:54 +08:00
if ( messages ) {
2013-04-19 03:28:00 +08:00
messagesFromNative [ 0 ] = messages ;
} else {
messagesFromNative . shift ( ) ;
2012-10-27 04:09:54 +08:00
}
2012-09-19 01:15:24 +08:00
}
2012-08-22 21:50:40 +08:00
}
} ;
module . exports = androidExec ;
2013-01-22 05:47:26 +08:00
} ) ;
// file: lib/common/modulemapper.js
define ( "cordova/modulemapper" , function ( require , exports , module ) {
var builder = require ( 'cordova/builder' ) ,
moduleMap = define . moduleMap ,
symbolList ,
deprecationMap ;
exports . reset = function ( ) {
symbolList = [ ] ;
deprecationMap = { } ;
} ;
function addEntry ( strategy , moduleName , symbolPath , opt _deprecationMessage ) {
if ( ! ( moduleName in moduleMap ) ) {
throw new Error ( 'Module ' + moduleName + ' does not exist.' ) ;
}
symbolList . push ( strategy , moduleName , symbolPath ) ;
if ( opt _deprecationMessage ) {
deprecationMap [ symbolPath ] = opt _deprecationMessage ;
}
}
// Note: Android 2.3 does have Function.bind().
exports . clobbers = function ( moduleName , symbolPath , opt _deprecationMessage ) {
addEntry ( 'c' , moduleName , symbolPath , opt _deprecationMessage ) ;
} ;
exports . merges = function ( moduleName , symbolPath , opt _deprecationMessage ) {
addEntry ( 'm' , moduleName , symbolPath , opt _deprecationMessage ) ;
} ;
exports . defaults = function ( moduleName , symbolPath , opt _deprecationMessage ) {
addEntry ( 'd' , moduleName , symbolPath , opt _deprecationMessage ) ;
} ;
function prepareNamespace ( symbolPath , context ) {
if ( ! symbolPath ) {
return context ;
}
var parts = symbolPath . split ( '.' ) ;
var cur = context ;
for ( var i = 0 , part ; part = parts [ i ] ; ++ i ) {
2013-02-20 03:53:36 +08:00
cur = cur [ part ] = cur [ part ] || { } ;
2013-01-22 05:47:26 +08:00
}
2013-02-20 03:53:36 +08:00
return cur ;
2013-01-22 05:47:26 +08:00
}
exports . mapModules = function ( context ) {
var origSymbols = { } ;
context . CDV _origSymbols = origSymbols ;
for ( var i = 0 , len = symbolList . length ; i < len ; i += 3 ) {
var strategy = symbolList [ i ] ;
var moduleName = symbolList [ i + 1 ] ;
var symbolPath = symbolList [ i + 2 ] ;
var lastDot = symbolPath . lastIndexOf ( '.' ) ;
var namespace = symbolPath . substr ( 0 , lastDot ) ;
var lastName = symbolPath . substr ( lastDot + 1 ) ;
var module = require ( moduleName ) ;
var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null ;
var parentObj = prepareNamespace ( namespace , context ) ;
var target = parentObj [ lastName ] ;
if ( strategy == 'm' && target ) {
builder . recursiveMerge ( target , module ) ;
} else if ( ( strategy == 'd' && ! target ) || ( strategy != 'd' ) ) {
2013-02-20 03:53:36 +08:00
if ( ! ( symbolPath in origSymbols ) ) {
2013-01-22 05:47:26 +08:00
origSymbols [ symbolPath ] = target ;
}
builder . assignOrWrapInDeprecateGetter ( parentObj , lastName , module , deprecationMsg ) ;
}
}
} ;
exports . getOriginalSymbol = function ( context , symbolPath ) {
var origSymbols = context . CDV _origSymbols ;
if ( origSymbols && ( symbolPath in origSymbols ) ) {
return origSymbols [ symbolPath ] ;
}
var parts = symbolPath . split ( '.' ) ;
var obj = context ;
for ( var i = 0 ; i < parts . length ; ++ i ) {
obj = obj && obj [ parts [ i ] ] ;
}
return obj ;
} ;
exports . loadMatchingModules = function ( matchingRegExp ) {
for ( var k in moduleMap ) {
if ( matchingRegExp . exec ( k ) ) {
require ( k ) ;
}
}
} ;
exports . reset ( ) ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/platform.js
define ( "cordova/platform" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
module . exports = {
id : "android" ,
initialize : function ( ) {
var channel = require ( "cordova/channel" ) ,
cordova = require ( 'cordova' ) ,
2013-01-22 05:47:26 +08:00
exec = require ( 'cordova/exec' ) ,
modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . loadMatchingModules ( /cordova.*\/symbols$/ ) ;
2013-02-20 03:53:36 +08:00
modulemapper . clobbers ( 'cordova/plugin/android/app' , 'navigator.app' ) ;
2013-01-22 05:47:26 +08:00
modulemapper . mapModules ( window ) ;
2012-03-25 02:09:57 +08:00
// Inject a listener for the backbutton on the document.
2012-09-19 01:15:24 +08:00
var backButtonChannel = cordova . addDocumentEventHandler ( 'backbutton' ) ;
backButtonChannel . onHasSubscribersChange = function ( ) {
// If we just attached the first handler or detached the last handler,
// let native know we need to override the back button.
exec ( null , null , "App" , "overrideBackbutton" , [ this . numHandlers == 1 ] ) ;
} ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// Add hardware MENU and SEARCH button handlers
cordova . addDocumentEventHandler ( 'menubutton' ) ;
cordova . addDocumentEventHandler ( 'searchbutton' ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// Let native code know we are all done on the JS side.
// Native code will then un-hide the WebView.
channel . join ( function ( ) {
2012-07-13 04:37:08 +08:00
exec ( null , null , "App" , "show" , [ ] ) ;
2012-03-25 02:09:57 +08:00
} , [ channel . onCordovaReady ] ) ;
2012-02-18 07:28:35 +08:00
}
} ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Acceleration.js
define ( "cordova/plugin/Acceleration" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-04-11 22:44:09 +08:00
var Acceleration = function ( x , y , z , timestamp ) {
2012-05-15 04:04:07 +08:00
this . x = x ;
this . y = y ;
this . z = z ;
this . timestamp = timestamp || ( new Date ( ) ) . getTime ( ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = Acceleration ;
2012-05-15 04:04:07 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Camera.js
define ( "cordova/plugin/Camera" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2013-01-19 07:33:38 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
exec = require ( 'cordova/exec' ) ,
2013-02-27 05:49:47 +08:00
Camera = require ( 'cordova/plugin/CameraConstants' ) ,
CameraPopoverHandle = require ( 'cordova/plugin/CameraPopoverHandle' ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
var cameraExport = { } ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// Tack on the Camera Constants to the base camera plugin.
for ( var key in Camera ) {
cameraExport [ key ] = Camera [ key ] ;
}
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Gets a picture from source defined by "options.sourceType" , and returns the
* image as defined by the "options.destinationType" option .
2012-02-18 07:28:35 +08:00
2012-05-25 00:31:11 +08:00
* The defaults are sourceType = CAMERA and destinationType = FILE _URI .
2012-03-25 02:09:57 +08:00
*
* @ param { Function } successCallback
* @ param { Function } errorCallback
* @ param { Object } options
* /
cameraExport . getPicture = function ( successCallback , errorCallback , options ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'fFO' , 'Camera.getPicture' , arguments ) ;
2012-09-29 02:36:36 +08:00
options = options || { } ;
2013-01-19 07:33:38 +08:00
var getValue = argscheck . getValue ;
var quality = getValue ( options . quality , 50 ) ;
var destinationType = getValue ( options . destinationType , Camera . DestinationType . FILE _URI ) ;
var sourceType = getValue ( options . sourceType , Camera . PictureSourceType . CAMERA ) ;
var targetWidth = getValue ( options . targetWidth , - 1 ) ;
var targetHeight = getValue ( options . targetHeight , - 1 ) ;
var encodingType = getValue ( options . encodingType , Camera . EncodingType . JPEG ) ;
var mediaType = getValue ( options . mediaType , Camera . MediaType . PICTURE ) ;
var allowEdit = ! ! options . allowEdit ;
var correctOrientation = ! ! options . correctOrientation ;
var saveToPhotoAlbum = ! ! options . saveToPhotoAlbum ;
var popoverOptions = getValue ( options . popoverOptions , null ) ;
2013-03-22 01:35:09 +08:00
var cameraDirection = getValue ( options . cameraDirection , Camera . Direction . BACK ) ;
2012-03-02 04:57:21 +08:00
2012-07-14 06:46:09 +08:00
var args = [ quality , destinationType , sourceType , targetWidth , targetHeight , encodingType ,
2013-03-22 01:35:09 +08:00
mediaType , allowEdit , correctOrientation , saveToPhotoAlbum , popoverOptions , cameraDirection ] ;
2012-07-14 06:46:09 +08:00
exec ( successCallback , errorCallback , "Camera" , "takePicture" , args ) ;
2013-02-27 05:49:47 +08:00
return new CameraPopoverHandle ( ) ;
2012-04-24 02:37:33 +08:00
} ;
2012-03-02 04:57:21 +08:00
2012-06-09 07:25:09 +08:00
cameraExport . cleanup = function ( successCallback , errorCallback ) {
exec ( successCallback , errorCallback , "Camera" , "cleanup" , [ ] ) ;
2012-06-22 02:12:30 +08:00
} ;
2012-06-09 07:25:09 +08:00
2012-03-02 04:57:21 +08:00
module . exports = cameraExport ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CameraConstants.js
define ( "cordova/plugin/CameraConstants" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
module . exports = {
DestinationType : {
DATA _URL : 0 , // Return base64 encoded string
2013-01-19 07:33:38 +08:00
FILE _URI : 1 , // Return file uri (content://media/external/images/media/2 for Android)
NATIVE _URI : 2 // Return native uri (eg. asset-library://... for iOS)
2012-02-18 07:28:35 +08:00
} ,
EncodingType : {
JPEG : 0 , // Return JPEG encoded image
PNG : 1 // Return PNG encoded image
} ,
MediaType : {
PICTURE : 0 , // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
VIDEO : 1 , // allow selection of video only, ONLY RETURNS URL
ALLMEDIA : 2 // allow selection from all media types
} ,
PictureSourceType : {
PHOTOLIBRARY : 0 , // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
CAMERA : 1 , // Take picture from camera
SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android)
2012-06-06 05:26:02 +08:00
} ,
PopoverArrowDirection : {
ARROW _UP : 1 , // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
ARROW _DOWN : 2 ,
ARROW _LEFT : 4 ,
ARROW _RIGHT : 8 ,
ARROW _ANY : 15
2013-03-22 01:35:09 +08:00
} ,
Direction : {
BACK : 0 ,
FRONT : 1
2012-02-18 07:28:35 +08:00
}
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2013-02-27 05:49:47 +08:00
// file: lib/common/plugin/CameraPopoverHandle.js
define ( "cordova/plugin/CameraPopoverHandle" , function ( require , exports , module ) {
var exec = require ( 'cordova/exec' ) ;
/ * *
* A handle to an image picker popover .
* /
var CameraPopoverHandle = function ( ) {
this . setPosition = function ( popoverOptions ) {
console . log ( 'CameraPopoverHandle.setPosition is only supported on iOS.' ) ;
} ;
} ;
module . exports = CameraPopoverHandle ;
} ) ;
2012-06-06 05:26:02 +08:00
// file: lib/common/plugin/CameraPopoverOptions.js
define ( "cordova/plugin/CameraPopoverOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-06-06 05:26:02 +08:00
var Camera = require ( 'cordova/plugin/CameraConstants' ) ;
/ * *
* Encapsulates options for iOS Popover image picker
* /
var CameraPopoverOptions = function ( x , y , width , height , arrowDir ) {
// information of rectangle that popover should be anchored to
this . x = x || 0 ;
this . y = y || 32 ;
this . width = width || 320 ;
this . height = height || 480 ;
// The direction of the popover arrow
this . arrowDir = arrowDir || Camera . PopoverArrowDirection . ARROW _ANY ;
} ;
module . exports = CameraPopoverOptions ;
2012-09-19 01:15:24 +08:00
2012-06-06 05:26:02 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CaptureAudioOptions.js
define ( "cordova/plugin/CaptureAudioOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* Encapsulates all audio capture operation configuration options .
2012-02-18 07:28:35 +08:00
* /
2012-03-25 02:09:57 +08:00
var CaptureAudioOptions = function ( ) {
2012-04-24 02:37:33 +08:00
// Upper limit of sound clips user can record. Value must be equal or greater than 1.
this . limit = 1 ;
// Maximum duration of a single sound clip in seconds.
this . duration = 0 ;
// The selected audio mode. Must match with one of the elements in supportedAudioModes array.
this . mode = null ;
2012-02-18 07:28:35 +08:00
} ;
2012-03-25 02:09:57 +08:00
module . exports = CaptureAudioOptions ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CaptureError.js
define ( "cordova/plugin/CaptureError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* The CaptureError interface encapsulates all errors in the Capture API .
2012-02-18 07:28:35 +08:00
* /
2012-03-25 02:09:57 +08:00
var CaptureError = function ( c ) {
this . code = c || null ;
2012-02-18 07:28:35 +08:00
} ;
2012-04-24 02:37:33 +08:00
// Camera or microphone failed to capture image or sound.
2012-02-18 07:28:35 +08:00
CaptureError . CAPTURE _INTERNAL _ERR = 0 ;
// Camera application or audio capture application is currently serving other capture request.
CaptureError . CAPTURE _APPLICATION _BUSY = 1 ;
// Invalid use of the API (e.g. limit parameter has value less than one).
CaptureError . CAPTURE _INVALID _ARGUMENT = 2 ;
// User exited camera application or audio capture application before capturing anything.
CaptureError . CAPTURE _NO _MEDIA _FILES = 3 ;
// The requested capture operation is not supported.
CaptureError . CAPTURE _NOT _SUPPORTED = 20 ;
module . exports = CaptureError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CaptureImageOptions.js
define ( "cordova/plugin/CaptureImageOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Encapsulates all image capture operation configuration options .
* /
var CaptureImageOptions = function ( ) {
2012-04-24 02:37:33 +08:00
// Upper limit of images user can take. Value must be equal or greater than 1.
this . limit = 1 ;
// The selected image mode. Must match with one of the elements in supportedImageModes array.
this . mode = null ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = CaptureImageOptions ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CaptureVideoOptions.js
define ( "cordova/plugin/CaptureVideoOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Encapsulates all video capture operation configuration options .
* /
var CaptureVideoOptions = function ( ) {
2012-04-24 02:37:33 +08:00
// Upper limit of videos user can record. Value must be equal or greater than 1.
this . limit = 1 ;
// Maximum duration of a single video clip in seconds.
this . duration = 0 ;
// The selected video mode. Must match with one of the elements in supportedVideoModes array.
this . mode = null ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = CaptureVideoOptions ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CompassError.js
define ( "cordova/plugin/CompassError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-06 04:11:24 +08:00
/ * *
* CompassError .
2012-09-29 02:36:36 +08:00
* An error code assigned by an implementation when an error has occurred
2012-03-06 04:11:24 +08:00
* @ constructor
* /
var CompassError = function ( err ) {
2012-03-10 04:32:22 +08:00
this . code = ( err !== undefined ? err : null ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-03-06 04:11:24 +08:00
CompassError . COMPASS _INTERNAL _ERR = 0 ;
CompassError . COMPASS _NOT _SUPPORTED = 20 ;
module . exports = CompassError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/CompassHeading.js
define ( "cordova/plugin/CompassHeading" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-06 04:11:24 +08:00
var CompassHeading = function ( magneticHeading , trueHeading , headingAccuracy , timestamp ) {
2013-02-20 03:53:36 +08:00
this . magneticHeading = magneticHeading ;
this . trueHeading = trueHeading ;
this . headingAccuracy = headingAccuracy ;
2013-01-19 07:33:38 +08:00
this . timestamp = timestamp || new Date ( ) . getTime ( ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = CompassHeading ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ConfigurationData.js
define ( "cordova/plugin/ConfigurationData" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Encapsulates a set of parameters that the capture device supports .
* /
function ConfigurationData ( ) {
2012-04-24 02:37:33 +08:00
// The ASCII-encoded string in lower case representing the media type.
this . type = null ;
// The height attribute represents height of the image or video in pixels.
// In the case of a sound clip this attribute has value 0.
2012-02-18 07:28:35 +08:00
this . height = 0 ;
2012-04-24 02:37:33 +08:00
// The width attribute represents width of the image or video in pixels.
2012-02-18 07:28:35 +08:00
// In the case of a sound clip this attribute has value 0
this . width = 0 ;
}
module . exports = ConfigurationData ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Connection.js
define ( "cordova/plugin/Connection" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Network status
* /
module . exports = {
2012-04-24 02:37:33 +08:00
UNKNOWN : "unknown" ,
ETHERNET : "ethernet" ,
WIFI : "wifi" ,
CELL _2G : "2g" ,
CELL _3G : "3g" ,
CELL _4G : "4g" ,
2013-02-05 03:12:52 +08:00
CELL : "cellular" ,
2012-04-24 02:37:33 +08:00
NONE : "none"
2012-02-18 07:28:35 +08:00
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Contact.js
define ( "cordova/plugin/Contact" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2013-01-19 07:33:38 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
exec = require ( 'cordova/exec' ) ,
2012-02-18 07:28:35 +08:00
ContactError = require ( 'cordova/plugin/ContactError' ) ,
utils = require ( 'cordova/utils' ) ;
2012-03-25 02:09:57 +08:00
/ * *
* Converts primitives into Complex Object
* Currently only used for Date fields
* /
function convertIn ( contact ) {
var value = contact . birthday ;
try {
contact . birthday = new Date ( parseFloat ( value ) ) ;
} catch ( exception ) {
console . log ( "Cordova Contact convertIn error: exception creating date." ) ;
}
return contact ;
2012-04-24 02:37:33 +08:00
}
2012-03-25 02:09:57 +08:00
/ * *
* Converts Complex objects into primitives
* Only conversion at present is for Dates .
* * /
function convertOut ( contact ) {
var value = contact . birthday ;
2012-04-24 02:37:33 +08:00
if ( value !== null ) {
2012-03-25 02:09:57 +08:00
// try to make it a Date object if it is not already
2012-05-01 04:42:38 +08:00
if ( ! utils . isDate ( value ) ) {
2012-03-25 02:09:57 +08:00
try {
value = new Date ( value ) ;
} catch ( exception ) {
value = null ;
}
}
2012-05-01 04:42:38 +08:00
if ( utils . isDate ( value ) ) {
2012-03-25 02:09:57 +08:00
value = value . valueOf ( ) ; // convert to milliseconds
}
contact . birthday = value ;
}
return contact ;
2012-04-24 02:37:33 +08:00
}
2012-03-25 02:09:57 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Contains information about a single contact .
* @ constructor
* @ param { DOMString } id unique identifier
* @ param { DOMString } displayName
* @ param { ContactName } name
* @ param { DOMString } nickname
* @ param { Array . < ContactField > } phoneNumbers array of phone numbers
* @ param { Array . < ContactField > } emails array of email addresses
* @ param { Array . < ContactAddress > } addresses array of addresses
* @ param { Array . < ContactField > } ims instant messaging user ids
* @ param { Array . < ContactOrganization > } organizations
* @ param { DOMString } birthday contact ' s birthday
* @ param { DOMString } note user notes about contact
* @ param { Array . < ContactField > } photos
* @ param { Array . < ContactField > } categories
* @ param { Array . < ContactField > } urls contact ' s web sites
* /
var Contact = function ( id , displayName , name , nickname , phoneNumbers , emails , addresses ,
ims , organizations , birthday , note , photos , categories , urls ) {
this . id = id || null ;
this . rawId = null ;
this . displayName = displayName || null ;
this . name = name || null ; // ContactName
this . nickname = nickname || null ;
2012-03-25 02:09:57 +08:00
this . phoneNumbers = phoneNumbers || null ; // ContactField[]
this . emails = emails || null ; // ContactField[]
this . addresses = addresses || null ; // ContactAddress[]
this . ims = ims || null ; // ContactField[]
this . organizations = organizations || null ; // ContactOrganization[]
2012-02-18 07:28:35 +08:00
this . birthday = birthday || null ;
this . note = note || null ;
2012-03-25 02:09:57 +08:00
this . photos = photos || null ; // ContactField[]
this . categories = categories || null ; // ContactField[]
this . urls = urls || null ; // ContactField[]
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Removes contact from device storage .
* @ param successCB success callback
* @ param errorCB error callback
* /
Contact . prototype . remove = function ( successCB , errorCB ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'FF' , 'Contact.remove' , arguments ) ;
var fail = errorCB && function ( code ) {
2012-03-25 02:09:57 +08:00
errorCB ( new ContactError ( code ) ) ;
} ;
2012-02-18 07:28:35 +08:00
if ( this . id === null ) {
2012-03-25 02:09:57 +08:00
fail ( ContactError . UNKNOWN _ERROR ) ;
2012-02-18 07:28:35 +08:00
}
else {
2012-03-25 02:09:57 +08:00
exec ( successCB , fail , "Contacts" , "remove" , [ this . id ] ) ;
2012-02-18 07:28:35 +08:00
}
} ;
/ * *
* Creates a deep copy of this Contact .
* With the contact ID set to null .
* @ return copy of this Contact
* /
Contact . prototype . clone = function ( ) {
var clonedContact = utils . clone ( this ) ;
clonedContact . id = null ;
clonedContact . rawId = null ;
2013-01-19 07:33:38 +08:00
function nullIds ( arr ) {
if ( arr ) {
for ( var i = 0 ; i < arr . length ; ++ i ) {
arr [ i ] . id = null ;
}
2012-02-18 07:28:35 +08:00
}
}
2013-01-19 07:33:38 +08:00
// Loop through and clear out any id's in phones, emails, etc.
nullIds ( clonedContact . phoneNumbers ) ;
nullIds ( clonedContact . emails ) ;
nullIds ( clonedContact . addresses ) ;
nullIds ( clonedContact . ims ) ;
nullIds ( clonedContact . organizations ) ;
nullIds ( clonedContact . categories ) ;
nullIds ( clonedContact . photos ) ;
nullIds ( clonedContact . urls ) ;
2012-02-18 07:28:35 +08:00
return clonedContact ;
} ;
/ * *
* Persists contact to device storage .
* @ param successCB success callback
* @ param errorCB error callback
* /
Contact . prototype . save = function ( successCB , errorCB ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'FFO' , 'Contact.save' , arguments ) ;
var fail = errorCB && function ( code ) {
errorCB ( new ContactError ( code ) ) ;
} ;
2012-04-24 02:37:33 +08:00
var success = function ( result ) {
2013-01-19 07:33:38 +08:00
if ( result ) {
if ( successCB ) {
var fullContact = require ( 'cordova/plugin/contacts' ) . create ( result ) ;
successCB ( convertIn ( fullContact ) ) ;
}
}
else {
// no Entry object returned
fail ( ContactError . UNKNOWN _ERROR ) ;
}
} ;
2012-04-24 02:37:33 +08:00
var dupContact = convertOut ( utils . clone ( this ) ) ;
exec ( success , fail , "Contacts" , "save" , [ dupContact ] ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = Contact ;
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactAddress.js
define ( "cordova/plugin/ContactAddress" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Contact address .
* @ constructor
* @ param { DOMString } id unique identifier , should only be set by native code
* @ param formatted // NOTE: not a W3C standard
* @ param streetAddress
* @ param locality
* @ param region
* @ param postalCode
* @ param country
* /
var ContactAddress = function ( pref , type , formatted , streetAddress , locality , region , postalCode , country ) {
this . id = null ;
this . pref = ( typeof pref != 'undefined' ? pref : false ) ;
this . type = type || null ;
this . formatted = formatted || null ;
this . streetAddress = streetAddress || null ;
this . locality = locality || null ;
this . region = region || null ;
this . postalCode = postalCode || null ;
this . country = country || null ;
} ;
module . exports = ContactAddress ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactError.js
define ( "cordova/plugin/ContactError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* ContactError .
2012-09-29 02:36:36 +08:00
* An error code assigned by an implementation when an error has occurred
2012-02-18 07:28:35 +08:00
* @ constructor
* /
var ContactError = function ( err ) {
this . code = ( typeof err != 'undefined' ? err : null ) ;
} ;
/ * *
* Error codes
* /
ContactError . UNKNOWN _ERROR = 0 ;
ContactError . INVALID _ARGUMENT _ERROR = 1 ;
ContactError . TIMEOUT _ERROR = 2 ;
ContactError . PENDING _OPERATION _ERROR = 3 ;
ContactError . IO _ERROR = 4 ;
ContactError . NOT _SUPPORTED _ERROR = 5 ;
ContactError . PERMISSION _DENIED _ERROR = 20 ;
module . exports = ContactError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactField.js
define ( "cordova/plugin/ContactField" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Generic contact field .
* @ constructor
* @ param { DOMString } id unique identifier , should only be set by native code // NOTE: not a W3C standard
* @ param type
* @ param value
* @ param pref
* /
var ContactField = function ( type , value , pref ) {
this . id = null ;
2012-05-01 04:42:38 +08:00
this . type = ( type && type . toString ( ) ) || null ;
this . value = ( value && value . toString ( ) ) || null ;
2012-02-18 07:28:35 +08:00
this . pref = ( typeof pref != 'undefined' ? pref : false ) ;
} ;
module . exports = ContactField ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactFindOptions.js
define ( "cordova/plugin/ContactFindOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* ContactFindOptions .
* @ constructor
* @ param filter used to match contacts against
* @ param multiple boolean used to determine if more than one contact should be returned
* /
var ContactFindOptions = function ( filter , multiple ) {
this . filter = filter || '' ;
this . multiple = ( typeof multiple != 'undefined' ? multiple : false ) ;
} ;
module . exports = ContactFindOptions ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactName.js
define ( "cordova/plugin/ContactName" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Contact name .
* @ constructor
* @ param formatted // NOTE: not part of W3C standard
* @ param familyName
* @ param givenName
* @ param middle
* @ param prefix
* @ param suffix
* /
var ContactName = function ( formatted , familyName , givenName , middle , prefix , suffix ) {
this . formatted = formatted || null ;
this . familyName = familyName || null ;
this . givenName = givenName || null ;
this . middleName = middle || null ;
this . honorificPrefix = prefix || null ;
this . honorificSuffix = suffix || null ;
} ;
module . exports = ContactName ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ContactOrganization.js
define ( "cordova/plugin/ContactOrganization" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Contact organization .
* @ constructor
* @ param { DOMString } id unique identifier , should only be set by native code // NOTE: not a W3C standard
* @ param name
* @ param dept
* @ param title
* @ param startDate
* @ param endDate
* @ param location
* @ param desc
* /
var ContactOrganization = function ( pref , type , name , dept , title ) {
this . id = null ;
this . pref = ( typeof pref != 'undefined' ? pref : false ) ;
this . type = type || null ;
this . name = name || null ;
this . department = dept || null ;
this . title = title || null ;
} ;
module . exports = ContactOrganization ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Coordinates.js
define ( "cordova/plugin/Coordinates" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* This class contains position information .
* @ param { Object } lat
* @ param { Object } lng
* @ param { Object } alt
* @ param { Object } acc
* @ param { Object } head
* @ param { Object } vel
* @ param { Object } altacc
* @ constructor
* /
var Coordinates = function ( lat , lng , alt , acc , head , vel , altacc ) {
/ * *
* The latitude of the position .
* /
this . latitude = lat ;
/ * *
* The longitude of the position ,
* /
this . longitude = lng ;
/ * *
* The accuracy of the position .
* /
this . accuracy = acc ;
/ * *
* The altitude of the position .
* /
2012-05-11 06:50:02 +08:00
this . altitude = ( alt !== undefined ? alt : null ) ;
2012-02-18 07:28:35 +08:00
/ * *
* The direction the device is moving at the position .
* /
2012-05-11 06:50:02 +08:00
this . heading = ( head !== undefined ? head : null ) ;
2012-02-18 07:28:35 +08:00
/ * *
* The velocity with which the device is moving at the position .
* /
2012-05-11 06:50:02 +08:00
this . speed = ( vel !== undefined ? vel : null ) ;
if ( this . speed === 0 || this . speed === null ) {
this . heading = NaN ;
}
2012-02-18 07:28:35 +08:00
/ * *
* The altitude accuracy of the position .
* /
this . altitudeAccuracy = ( altacc !== undefined ) ? altacc : null ;
} ;
module . exports = Coordinates ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/DirectoryEntry.js
define ( "cordova/plugin/DirectoryEntry" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2013-01-19 07:33:38 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
utils = require ( 'cordova/utils' ) ,
2012-02-18 07:28:35 +08:00
exec = require ( 'cordova/exec' ) ,
Entry = require ( 'cordova/plugin/Entry' ) ,
2012-04-24 02:37:33 +08:00
FileError = require ( 'cordova/plugin/FileError' ) ,
2012-02-18 07:28:35 +08:00
DirectoryReader = require ( 'cordova/plugin/DirectoryReader' ) ;
/ * *
* An interface representing a directory on the file system .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* { boolean } isFile always false ( readonly )
* { boolean } isDirectory always true ( readonly )
* { DOMString } name of the directory , excluding the path leading to it ( readonly )
* { DOMString } fullPath the absolute full path to the directory ( readonly )
2012-07-13 04:37:08 +08:00
* TODO : implement this ! ! ! { FileSystem } filesystem on which the directory resides ( readonly )
2012-02-18 07:28:35 +08:00
* /
var DirectoryEntry = function ( name , fullPath ) {
2013-01-19 07:33:38 +08:00
DirectoryEntry . _ _super _ _ . constructor . call ( this , false , true , name , fullPath ) ;
2012-02-18 07:28:35 +08:00
} ;
utils . extend ( DirectoryEntry , Entry ) ;
/ * *
* Creates a new DirectoryReader to read entries from this directory
* /
DirectoryEntry . prototype . createReader = function ( ) {
return new DirectoryReader ( this . fullPath ) ;
} ;
/ * *
* Creates or looks up a directory
*
* @ param { DOMString } path either a relative or absolute path from this directory in which to look up or create a directory
2012-09-29 02:36:36 +08:00
* @ param { Flags } options to create or exclusively create the directory
2012-02-18 07:28:35 +08:00
* @ param { Function } successCallback is called with the new entry
* @ param { Function } errorCallback is called with a FileError
* /
DirectoryEntry . prototype . getDirectory = function ( path , options , successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'sOFF' , 'DirectoryEntry.getDirectory' , arguments ) ;
var win = successCallback && function ( result ) {
2012-02-18 07:28:35 +08:00
var entry = new DirectoryEntry ( result . name , result . fullPath ) ;
successCallback ( entry ) ;
} ;
2013-01-19 07:33:38 +08:00
var fail = errorCallback && function ( code ) {
2012-02-18 07:28:35 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
exec ( win , fail , "File" , "getDirectory" , [ this . fullPath , path , options ] ) ;
} ;
/ * *
* Deletes a directory and all of it ' s contents
*
* @ param { Function } successCallback is called with no parameters
* @ param { Function } errorCallback is called with a FileError
* /
DirectoryEntry . prototype . removeRecursively = function ( successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'FF' , 'DirectoryEntry.removeRecursively' , arguments ) ;
var fail = errorCallback && function ( code ) {
2012-02-29 12:32:30 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
exec ( successCallback , fail , "File" , "removeRecursively" , [ this . fullPath ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Creates or looks up a file
*
* @ param { DOMString } path either a relative or absolute path from this directory in which to look up or create a file
2012-09-29 02:36:36 +08:00
* @ param { Flags } options to create or exclusively create the file
2012-02-18 07:28:35 +08:00
* @ param { Function } successCallback is called with the new entry
* @ param { Function } errorCallback is called with a FileError
* /
DirectoryEntry . prototype . getFile = function ( path , options , successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'sOFF' , 'DirectoryEntry.getFile' , arguments ) ;
var win = successCallback && function ( result ) {
2012-02-18 07:28:35 +08:00
var FileEntry = require ( 'cordova/plugin/FileEntry' ) ;
var entry = new FileEntry ( result . name , result . fullPath ) ;
successCallback ( entry ) ;
} ;
2013-01-19 07:33:38 +08:00
var fail = errorCallback && function ( code ) {
2012-02-18 07:28:35 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
exec ( win , fail , "File" , "getFile" , [ this . fullPath , path , options ] ) ;
} ;
module . exports = DirectoryEntry ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/DirectoryReader.js
define ( "cordova/plugin/DirectoryReader" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-04-24 02:37:33 +08:00
var exec = require ( 'cordova/exec' ) ,
FileError = require ( 'cordova/plugin/FileError' ) ;
2012-02-18 07:28:35 +08:00
/ * *
* An interface that lists the files and directories in a directory .
* /
function DirectoryReader ( path ) {
this . path = path || null ;
}
/ * *
* Returns a list of entries from a directory .
*
* @ param { Function } successCallback is called with a list of entries
* @ param { Function } errorCallback is called with a FileError
* /
DirectoryReader . prototype . readEntries = function ( successCallback , errorCallback ) {
2012-03-01 01:38:35 +08:00
var win = typeof successCallback !== 'function' ? null : function ( result ) {
2012-02-18 07:28:35 +08:00
var retVal = [ ] ;
for ( var i = 0 ; i < result . length ; i ++ ) {
var entry = null ;
if ( result [ i ] . isDirectory ) {
2012-04-24 02:37:33 +08:00
entry = new ( require ( 'cordova/plugin/DirectoryEntry' ) ) ( ) ;
2012-02-18 07:28:35 +08:00
}
else if ( result [ i ] . isFile ) {
2012-04-24 02:37:33 +08:00
entry = new ( require ( 'cordova/plugin/FileEntry' ) ) ( ) ;
2012-02-18 07:28:35 +08:00
}
entry . isDirectory = result [ i ] . isDirectory ;
entry . isFile = result [ i ] . isFile ;
entry . name = result [ i ] . name ;
entry . fullPath = result [ i ] . fullPath ;
retVal . push ( entry ) ;
}
successCallback ( retVal ) ;
} ;
2012-03-01 23:45:27 +08:00
var fail = typeof errorCallback !== 'function' ? null : function ( code ) {
2012-02-29 12:32:30 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
exec ( win , fail , "File" , "readEntries" , [ this . path ] ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = DirectoryReader ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Entry.js
define ( "cordova/plugin/Entry" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2013-01-19 07:33:38 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
exec = require ( 'cordova/exec' ) ,
2012-02-18 07:28:35 +08:00
FileError = require ( 'cordova/plugin/FileError' ) ,
Metadata = require ( 'cordova/plugin/Metadata' ) ;
/ * *
* Represents a file or directory on the local file system .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param isFile
* { boolean } true if Entry is a file ( readonly )
* @ param isDirectory
* { boolean } true if Entry is a directory ( readonly )
* @ param name
* { DOMString } name of the file or directory , excluding the path
* leading to it ( readonly )
* @ param fullPath
* { DOMString } the absolute full path to the file or directory
* ( readonly )
* /
function Entry ( isFile , isDirectory , name , fullPath , fileSystem ) {
2013-01-19 07:33:38 +08:00
this . isFile = ! ! isFile ;
this . isDirectory = ! ! isDirectory ;
2012-02-18 07:28:35 +08:00
this . name = name || '' ;
this . fullPath = fullPath || '' ;
this . filesystem = fileSystem || null ;
}
/ * *
* Look up the metadata of the entry .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param successCallback
* { Function } is called with a Metadata object
* @ param errorCallback
* { Function } is called with a FileError
* /
Entry . prototype . getMetadata = function ( successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'FF' , 'Entry.getMetadata' , arguments ) ;
var success = successCallback && function ( lastModified ) {
var metadata = new Metadata ( lastModified ) ;
successCallback ( metadata ) ;
} ;
var fail = errorCallback && function ( code ) {
errorCallback ( new FileError ( code ) ) ;
} ;
2012-03-01 09:03:37 +08:00
2013-01-19 07:33:38 +08:00
exec ( success , fail , "File" , "getMetadata" , [ this . fullPath ] ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-05-11 06:50:02 +08:00
/ * *
* Set the metadata of the entry .
*
* @ param successCallback
* { Function } is called with a Metadata object
* @ param errorCallback
* { Function } is called with a FileError
* @ param metadataObject
* { Object } keys and values to set
* /
Entry . prototype . setMetadata = function ( successCallback , errorCallback , metadataObject ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'FFO' , 'Entry.setMetadata' , arguments ) ;
exec ( successCallback , errorCallback , "File" , "setMetadata" , [ this . fullPath , metadataObject ] ) ;
2012-05-11 06:50:02 +08:00
} ;
2012-02-18 07:28:35 +08:00
/ * *
* Move a file or directory to a new location .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param parent
* { DirectoryEntry } the directory to which to move this entry
* @ param newName
* { DOMString } new name of the entry , defaults to the current name
* @ param successCallback
* { Function } called with the new DirectoryEntry object
* @ param errorCallback
* { Function } called with a FileError
* /
Entry . prototype . moveTo = function ( parent , newName , successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'oSFF' , 'Entry.moveTo' , arguments ) ;
var fail = errorCallback && function ( code ) {
errorCallback ( new FileError ( code ) ) ;
2012-03-01 01:38:35 +08:00
} ;
2012-02-18 07:28:35 +08:00
// source path
var srcPath = this . fullPath ,
// entry name
name = newName || this . name ,
success = function ( entry ) {
if ( entry ) {
2013-01-19 07:33:38 +08:00
if ( successCallback ) {
2012-03-01 01:38:35 +08:00
// create appropriate Entry object
var result = ( entry . isDirectory ) ? new ( require ( 'cordova/plugin/DirectoryEntry' ) ) ( entry . name , entry . fullPath ) : new ( require ( 'cordova/plugin/FileEntry' ) ) ( entry . name , entry . fullPath ) ;
2013-01-19 07:33:38 +08:00
successCallback ( result ) ;
2012-02-18 07:28:35 +08:00
}
2012-03-01 01:38:35 +08:00
}
2012-02-18 07:28:35 +08:00
else {
// no Entry object returned
2013-01-19 07:33:38 +08:00
fail && fail ( FileError . NOT _FOUND _ERR ) ;
2012-02-18 07:28:35 +08:00
}
} ;
// copy
exec ( success , fail , "File" , "moveTo" , [ srcPath , parent . fullPath , name ] ) ;
} ;
/ * *
* Copy a directory to a different location .
2012-03-01 01:38:35 +08:00
*
* @ param parent
2012-02-18 07:28:35 +08:00
* { DirectoryEntry } the directory to which to copy the entry
2012-03-01 01:38:35 +08:00
* @ param newName
2012-02-18 07:28:35 +08:00
* { DOMString } new name of the entry , defaults to the current name
* @ param successCallback
* { Function } called with the new Entry object
* @ param errorCallback
* { Function } called with a FileError
* /
Entry . prototype . copyTo = function ( parent , newName , successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'oSFF' , 'Entry.copyTo' , arguments ) ;
var fail = errorCallback && function ( code ) {
errorCallback ( new FileError ( code ) ) ;
2012-03-01 01:38:35 +08:00
} ;
2012-02-18 07:28:35 +08:00
// source path
var srcPath = this . fullPath ,
// entry name
name = newName || this . name ,
// success callback
success = function ( entry ) {
if ( entry ) {
2013-01-19 07:33:38 +08:00
if ( successCallback ) {
2012-03-01 01:38:35 +08:00
// create appropriate Entry object
var result = ( entry . isDirectory ) ? new ( require ( 'cordova/plugin/DirectoryEntry' ) ) ( entry . name , entry . fullPath ) : new ( require ( 'cordova/plugin/FileEntry' ) ) ( entry . name , entry . fullPath ) ;
2013-01-19 07:33:38 +08:00
successCallback ( result ) ;
2012-02-18 07:28:35 +08:00
}
}
else {
// no Entry object returned
2013-01-19 07:33:38 +08:00
fail && fail ( FileError . NOT _FOUND _ERR ) ;
2012-02-18 07:28:35 +08:00
}
} ;
// copy
exec ( success , fail , "File" , "copyTo" , [ srcPath , parent . fullPath , name ] ) ;
} ;
/ * *
* Return a URL that can be used to identify this entry .
* /
2012-03-01 23:45:27 +08:00
Entry . prototype . toURL = function ( ) {
2012-02-18 07:28:35 +08:00
// fullPath attribute contains the full URL
return this . fullPath ;
} ;
2012-03-01 23:45:27 +08:00
/ * *
* Returns a URI that can be used to identify this entry .
*
* @ param { DOMString } mimeType for a FileEntry , the mime type to be used to interpret the file , when loaded through this URI .
* @ return uri
* /
Entry . prototype . toURI = function ( mimeType ) {
console . log ( "DEPRECATED: Update your code to use 'toURL'" ) ;
// fullPath attribute contains the full URI
2012-05-25 00:31:11 +08:00
return this . toURL ( ) ;
2012-03-01 23:45:27 +08:00
} ;
2012-02-18 07:28:35 +08:00
/ * *
* Remove a file or directory . It is an error to attempt to delete a
* directory that is not empty . It is an error to attempt to delete a
* root directory of a file system .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param successCallback { Function } called with no parameters
* @ param errorCallback { Function } called with a FileError
* /
Entry . prototype . remove = function ( successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'FF' , 'Entry.remove' , arguments ) ;
var fail = errorCallback && function ( code ) {
2012-03-01 01:38:35 +08:00
errorCallback ( new FileError ( code ) ) ;
2012-02-18 07:28:35 +08:00
} ;
exec ( successCallback , fail , "File" , "remove" , [ this . fullPath ] ) ;
} ;
/ * *
* Look up the parent DirectoryEntry of this entry .
*
* @ param successCallback { Function } called with the parent DirectoryEntry object
* @ param errorCallback { Function } called with a FileError
* /
Entry . prototype . getParent = function ( successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'FF' , 'Entry.getParent' , arguments ) ;
var win = successCallback && function ( result ) {
2012-04-04 01:09:31 +08:00
var DirectoryEntry = require ( 'cordova/plugin/DirectoryEntry' ) ;
var entry = new DirectoryEntry ( result . name , result . fullPath ) ;
successCallback ( entry ) ;
} ;
2013-01-19 07:33:38 +08:00
var fail = errorCallback && function ( code ) {
2012-02-29 12:32:30 +08:00
errorCallback ( new FileError ( code ) ) ;
} ;
2012-04-04 01:09:31 +08:00
exec ( win , fail , "File" , "getParent" , [ this . fullPath ] ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = Entry ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/File.js
define ( "cordova/plugin/File" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Constructor .
* name { DOMString } name of the file , without path information
* fullPath { DOMString } the full path of the file , including the name
* type { DOMString } mime type
* lastModifiedDate { Date } last modified date
* size { Number } size of the file in bytes
* /
var File = function ( name , fullPath , type , lastModifiedDate , size ) {
2012-04-24 02:37:33 +08:00
this . name = name || '' ;
this . fullPath = fullPath || null ;
this . type = type || null ;
this . lastModifiedDate = lastModifiedDate || null ;
this . size = size || 0 ;
2013-01-19 07:33:38 +08:00
// These store the absolute start and end for slicing the file.
this . start = 0 ;
this . end = this . size ;
2012-02-18 07:28:35 +08:00
} ;
2013-01-19 07:33:38 +08:00
/ * *
* Returns a "slice" of the file . Since Cordova Files don ' t contain the actual
* content , this really returns a File with adjusted start and end .
* Slices of slices are supported .
* start { Number } The index at which to start the slice ( inclusive ) .
* end { Number } The index at which to end the slice ( exclusive ) .
* /
File . prototype . slice = function ( start , end ) {
var size = this . end - this . start ;
var newStart = 0 ;
var newEnd = size ;
if ( arguments . length ) {
if ( start < 0 ) {
newStart = Math . max ( size + start , 0 ) ;
} else {
newStart = Math . min ( size , start ) ;
}
}
if ( arguments . length >= 2 ) {
if ( end < 0 ) {
newEnd = Math . max ( size + end , 0 ) ;
} else {
newEnd = Math . min ( end , size ) ;
}
}
var newFile = new File ( this . name , this . fullPath , this . type , this . lastModifiedData , this . size ) ;
newFile . start = this . start + newStart ;
newFile . end = this . start + newEnd ;
return newFile ;
} ;
2012-02-18 07:28:35 +08:00
module . exports = File ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileEntry.js
define ( "cordova/plugin/FileEntry" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ,
Entry = require ( 'cordova/plugin/Entry' ) ,
FileWriter = require ( 'cordova/plugin/FileWriter' ) ,
File = require ( 'cordova/plugin/File' ) ,
FileError = require ( 'cordova/plugin/FileError' ) ;
/ * *
* An interface representing a file on the file system .
2012-03-01 01:38:35 +08:00
*
2012-02-18 07:28:35 +08:00
* { boolean } isFile always true ( readonly )
* { boolean } isDirectory always false ( readonly )
* { DOMString } name of the file , excluding the path leading to it ( readonly )
* { DOMString } fullPath the absolute full path to the file ( readonly )
* { FileSystem } filesystem on which the file resides ( readonly )
* /
var FileEntry = function ( name , fullPath ) {
FileEntry . _ _super _ _ . constructor . apply ( this , [ true , false , name , fullPath ] ) ;
} ;
utils . extend ( FileEntry , Entry ) ;
/ * *
* Creates a new FileWriter associated with the file that this FileEntry represents .
*
* @ param { Function } successCallback is called with the new FileWriter
* @ param { Function } errorCallback is called with a FileError
* /
FileEntry . prototype . createWriter = function ( successCallback , errorCallback ) {
this . file ( function ( filePointer ) {
var writer = new FileWriter ( filePointer ) ;
if ( writer . fileName === null || writer . fileName === "" ) {
2013-01-19 07:33:38 +08:00
errorCallback && errorCallback ( new FileError ( FileError . INVALID _STATE _ERR ) ) ;
2012-02-18 07:28:35 +08:00
} else {
2013-01-19 07:33:38 +08:00
successCallback && successCallback ( writer ) ;
2012-02-18 07:28:35 +08:00
}
} , errorCallback ) ;
} ;
/ * *
* Returns a File that represents the current state of the file that this FileEntry represents .
*
* @ param { Function } successCallback is called with the new File object
* @ param { Function } errorCallback is called with a FileError
* /
FileEntry . prototype . file = function ( successCallback , errorCallback ) {
2013-01-19 07:33:38 +08:00
var win = successCallback && function ( f ) {
2012-02-18 07:28:35 +08:00
var file = new File ( f . name , f . fullPath , f . type , f . lastModifiedDate , f . size ) ;
successCallback ( file ) ;
} ;
2013-01-19 07:33:38 +08:00
var fail = errorCallback && function ( code ) {
2012-03-01 01:38:35 +08:00
errorCallback ( new FileError ( code ) ) ;
2012-02-18 07:28:35 +08:00
} ;
exec ( win , fail , "File" , "getFileMetadata" , [ this . fullPath ] ) ;
} ;
module . exports = FileEntry ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileError.js
define ( "cordova/plugin/FileError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* FileError
* /
function FileError ( error ) {
this . code = error || null ;
}
// File error codes
// Found in DOMException
FileError . NOT _FOUND _ERR = 1 ;
FileError . SECURITY _ERR = 2 ;
FileError . ABORT _ERR = 3 ;
// Added by File API specification
FileError . NOT _READABLE _ERR = 4 ;
FileError . ENCODING _ERR = 5 ;
FileError . NO _MODIFICATION _ALLOWED _ERR = 6 ;
FileError . INVALID _STATE _ERR = 7 ;
FileError . SYNTAX _ERR = 8 ;
FileError . INVALID _MODIFICATION _ERR = 9 ;
FileError . QUOTA _EXCEEDED _ERR = 10 ;
FileError . TYPE _MISMATCH _ERR = 11 ;
FileError . PATH _EXISTS _ERR = 12 ;
module . exports = FileError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileReader.js
define ( "cordova/plugin/FileReader" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var exec = require ( 'cordova/exec' ) ,
2013-01-22 05:47:26 +08:00
modulemapper = require ( 'cordova/modulemapper' ) ,
2013-01-19 07:33:38 +08:00
utils = require ( 'cordova/utils' ) ,
File = require ( 'cordova/plugin/File' ) ,
2012-02-18 07:28:35 +08:00
FileError = require ( 'cordova/plugin/FileError' ) ,
2013-01-19 07:33:38 +08:00
ProgressEvent = require ( 'cordova/plugin/ProgressEvent' ) ,
2013-01-22 05:47:26 +08:00
origFileReader = modulemapper . getOriginalSymbol ( this , 'FileReader' ) ;
2012-02-18 07:28:35 +08:00
/ * *
* This class reads the mobile device file system .
*
* For Android :
* The root directory is the root of the file system .
* To read from the SD card , the file name is "sdcard/my_file.txt"
* @ constructor
* /
var FileReader = function ( ) {
2013-01-19 07:33:38 +08:00
this . _readyState = 0 ;
this . _error = null ;
this . _result = null ;
this . _fileName = '' ;
this . _realReader = origFileReader ? new origFileReader ( ) : { } ;
2012-02-18 07:28:35 +08:00
} ;
// States
FileReader . EMPTY = 0 ;
FileReader . LOADING = 1 ;
FileReader . DONE = 2 ;
2013-01-19 07:33:38 +08:00
utils . defineGetter ( FileReader . prototype , 'readyState' , function ( ) {
return this . _fileName ? this . _readyState : this . _realReader . readyState ;
} ) ;
utils . defineGetter ( FileReader . prototype , 'error' , function ( ) {
return this . _fileName ? this . _error : this . _realReader . error ;
} ) ;
utils . defineGetter ( FileReader . prototype , 'result' , function ( ) {
return this . _fileName ? this . _result : this . _realReader . result ;
} ) ;
function defineEvent ( eventName ) {
utils . defineGetterSetter ( FileReader . prototype , eventName , function ( ) {
return this . _realReader [ eventName ] || null ;
} , function ( value ) {
this . _realReader [ eventName ] = value ;
} ) ;
}
defineEvent ( 'onloadstart' ) ; // When the read starts.
defineEvent ( 'onprogress' ) ; // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
defineEvent ( 'onload' ) ; // When the read has successfully completed.
defineEvent ( 'onerror' ) ; // When the read has failed (see errors).
defineEvent ( 'onloadend' ) ; // When the request has completed (either in success or failure).
defineEvent ( 'onabort' ) ; // When the read has been aborted. For instance, by invoking the abort() method.
function initRead ( reader , file ) {
// Already loading something
if ( reader . readyState == FileReader . LOADING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
reader . _result = null ;
reader . _error = null ;
reader . _readyState = FileReader . LOADING ;
if ( typeof file == 'string' ) {
// Deprecated in Cordova 2.4.
2013-04-19 03:28:00 +08:00
console . warn ( 'Using a string argument with FileReader.readAs functions is deprecated.' ) ;
2013-01-19 07:33:38 +08:00
reader . _fileName = file ;
} else if ( typeof file . fullPath == 'string' ) {
reader . _fileName = file . fullPath ;
} else {
reader . _fileName = '' ;
return true ;
}
reader . onloadstart && reader . onloadstart ( new ProgressEvent ( "loadstart" , { target : reader } ) ) ;
}
2012-02-18 07:28:35 +08:00
/ * *
* Abort reading file .
* /
FileReader . prototype . abort = function ( ) {
2013-01-19 07:33:38 +08:00
if ( origFileReader && ! this . _fileName ) {
return this . _realReader . abort ( ) ;
}
this . _result = null ;
2012-02-18 07:28:35 +08:00
2013-01-19 07:33:38 +08:00
if ( this . _readyState == FileReader . DONE || this . _readyState == FileReader . EMPTY ) {
2012-02-18 07:28:35 +08:00
return ;
}
2013-01-19 07:33:38 +08:00
this . _readyState = FileReader . DONE ;
2012-02-18 07:28:35 +08:00
// If abort callback
if ( typeof this . onabort === 'function' ) {
this . onabort ( new ProgressEvent ( 'abort' , { target : this } ) ) ;
}
// If load end callback
if ( typeof this . onloadend === 'function' ) {
this . onloadend ( new ProgressEvent ( 'loadend' , { target : this } ) ) ;
}
} ;
/ * *
* Read text file .
*
* @ param file { File } File object containing file properties
* @ param encoding [ Optional ] ( see http : //www.iana.org/assignments/character-sets)
* /
FileReader . prototype . readAsText = function ( file , encoding ) {
2013-01-19 07:33:38 +08:00
if ( initRead ( this , file ) ) {
return this . _realReader . readAsText ( file , encoding ) ;
2012-02-18 07:28:35 +08:00
}
// Default encoding is UTF-8
var enc = encoding ? encoding : "UTF-8" ;
var me = this ;
2013-03-22 01:35:09 +08:00
var execArgs = [ this . _fileName , enc , file . start , file . end ] ;
2012-02-18 07:28:35 +08:00
// Read file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
2013-01-19 07:33:38 +08:00
if ( me . _readyState === FileReader . DONE ) {
2012-02-18 07:28:35 +08:00
return ;
}
2012-03-25 02:09:57 +08:00
2012-02-18 07:28:35 +08:00
// Save result
2013-01-19 07:33:38 +08:00
me . _result = r ;
2012-02-18 07:28:35 +08:00
// If onload callback
if ( typeof me . onload === "function" ) {
me . onload ( new ProgressEvent ( "load" , { target : me } ) ) ;
}
// DONE state
2013-01-19 07:33:38 +08:00
me . _readyState = FileReader . DONE ;
2012-02-18 07:28:35 +08:00
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
2013-01-19 07:33:38 +08:00
if ( me . _readyState === FileReader . DONE ) {
2012-02-18 07:28:35 +08:00
return ;
}
// DONE state
2013-01-19 07:33:38 +08:00
me . _readyState = FileReader . DONE ;
2012-02-18 07:28:35 +08:00
// null result
2013-01-19 07:33:38 +08:00
me . _result = null ;
2012-02-18 07:28:35 +08:00
// Save error
2013-01-19 07:33:38 +08:00
me . _error = new FileError ( e ) ;
2012-02-18 07:28:35 +08:00
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
2013-01-19 07:33:38 +08:00
} , "File" , "readAsText" , execArgs ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Read file and return data as a base64 encoded data url .
* A data url is of the form :
* data : [ < mediatype > ] [ ; base64 ] , < data >
*
* @ param file { File } File object containing file properties
* /
FileReader . prototype . readAsDataURL = function ( file ) {
2013-01-19 07:33:38 +08:00
if ( initRead ( this , file ) ) {
return this . _realReader . readAsDataURL ( file ) ;
2012-02-18 07:28:35 +08:00
}
2013-01-19 07:33:38 +08:00
var me = this ;
2013-03-22 01:35:09 +08:00
var execArgs = [ this . _fileName , file . start , file . end ] ;
2012-02-18 07:28:35 +08:00
// Read file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
2013-01-19 07:33:38 +08:00
if ( me . _readyState === FileReader . DONE ) {
2012-02-18 07:28:35 +08:00
return ;
}
// DONE state
2013-01-19 07:33:38 +08:00
me . _readyState = FileReader . DONE ;
2012-02-18 07:28:35 +08:00
// Save result
2013-01-19 07:33:38 +08:00
me . _result = r ;
2012-02-18 07:28:35 +08:00
// If onload callback
if ( typeof me . onload === "function" ) {
me . onload ( new ProgressEvent ( "load" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
2013-01-19 07:33:38 +08:00
if ( me . _readyState === FileReader . DONE ) {
2012-02-18 07:28:35 +08:00
return ;
}
// DONE state
2013-01-19 07:33:38 +08:00
me . _readyState = FileReader . DONE ;
2012-02-18 07:28:35 +08:00
2013-01-19 07:33:38 +08:00
me . _result = null ;
2012-02-18 07:28:35 +08:00
// Save error
2013-01-19 07:33:38 +08:00
me . _error = new FileError ( e ) ;
2012-02-18 07:28:35 +08:00
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
2013-01-19 07:33:38 +08:00
} , "File" , "readAsDataURL" , execArgs ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Read file and return data as a binary data .
*
* @ param file { File } File object containing file properties
* /
FileReader . prototype . readAsBinaryString = function ( file ) {
2013-01-19 07:33:38 +08:00
if ( initRead ( this , file ) ) {
return this . _realReader . readAsBinaryString ( file ) ;
}
2013-03-22 01:35:09 +08:00
var me = this ;
var execArgs = [ this . _fileName , file . start , file . end ] ;
// Read file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
if ( me . _readyState === FileReader . DONE ) {
return ;
}
// DONE state
me . _readyState = FileReader . DONE ;
me . _result = r ;
// If onload callback
if ( typeof me . onload === "function" ) {
me . onload ( new ProgressEvent ( "load" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
if ( me . _readyState === FileReader . DONE ) {
return ;
}
// DONE state
me . _readyState = FileReader . DONE ;
me . _result = null ;
// Save error
me . _error = new FileError ( e ) ;
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} , "File" , "readAsBinaryString" , execArgs ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Read file and return data as a binary data .
*
* @ param file { File } File object containing file properties
* /
FileReader . prototype . readAsArrayBuffer = function ( file ) {
2013-01-19 07:33:38 +08:00
if ( initRead ( this , file ) ) {
return this . _realReader . readAsArrayBuffer ( file ) ;
}
2013-03-22 01:35:09 +08:00
var me = this ;
var execArgs = [ this . _fileName , file . start , file . end ] ;
// Read file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
if ( me . _readyState === FileReader . DONE ) {
return ;
}
// DONE state
me . _readyState = FileReader . DONE ;
me . _result = r ;
// If onload callback
if ( typeof me . onload === "function" ) {
me . onload ( new ProgressEvent ( "load" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
if ( me . _readyState === FileReader . DONE ) {
return ;
}
// DONE state
me . _readyState = FileReader . DONE ;
me . _result = null ;
// Save error
me . _error = new FileError ( e ) ;
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { target : me } ) ) ;
}
// If onloadend callback
if ( typeof me . onloadend === "function" ) {
me . onloadend ( new ProgressEvent ( "loadend" , { target : me } ) ) ;
}
} , "File" , "readAsArrayBuffer" , execArgs ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = FileReader ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileSystem.js
define ( "cordova/plugin/FileSystem" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var DirectoryEntry = require ( 'cordova/plugin/DirectoryEntry' ) ;
/ * *
* An interface representing a file system
*
* @ constructor
* { DOMString } name the unique name of the file system ( readonly )
* { DirectoryEntry } root directory of the file system ( readonly )
* /
var FileSystem = function ( name , root ) {
this . name = name || null ;
if ( root ) {
2012-03-01 01:38:35 +08:00
this . root = new DirectoryEntry ( root . name , root . fullPath ) ;
2012-02-18 07:28:35 +08:00
}
} ;
module . exports = FileSystem ;
2012-07-13 04:37:08 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileTransfer.js
define ( "cordova/plugin/FileTransfer" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2013-01-19 07:33:38 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
exec = require ( 'cordova/exec' ) ,
2012-09-21 11:39:09 +08:00
FileTransferError = require ( 'cordova/plugin/FileTransferError' ) ,
ProgressEvent = require ( 'cordova/plugin/ProgressEvent' ) ;
function newProgressEvent ( result ) {
var pe = new ProgressEvent ( ) ;
pe . lengthComputable = result . lengthComputable ;
pe . loaded = result . loaded ;
pe . total = result . total ;
return pe ;
}
2013-03-22 01:35:09 +08:00
function getBasicAuthHeader ( urlString ) {
var header = null ;
if ( window . btoa ) {
// parse the url using the Location object
var url = document . createElement ( 'a' ) ;
url . href = urlString ;
var credentials = null ;
var protocol = url . protocol + "//" ;
var origin = protocol + url . host ;
// check whether there are the username:password credentials in the url
2013-04-19 03:28:00 +08:00
if ( url . href . indexOf ( origin ) !== 0 ) { // credentials found
2013-03-22 01:35:09 +08:00
var atIndex = url . href . indexOf ( "@" ) ;
credentials = url . href . substring ( protocol . length , atIndex ) ;
}
if ( credentials ) {
var authHeader = "Authorization" ;
var authHeaderValue = "Basic " + window . btoa ( credentials ) ;
header = {
name : authHeader ,
value : authHeaderValue
} ;
}
}
return header ;
}
2012-09-21 11:39:09 +08:00
var idCounter = 0 ;
2012-02-18 07:28:35 +08:00
/ * *
* FileTransfer uploads a file to a remote server .
* @ constructor
* /
2012-09-21 11:39:09 +08:00
var FileTransfer = function ( ) {
this . _id = ++ idCounter ;
this . onprogress = null ; // optional callback
} ;
2012-02-18 07:28:35 +08:00
/ * *
* Given an absolute file path , uploads a file on the device to a remote server
* using a multipart HTTP request .
* @ param filePath { String } Full path of the file on the device
* @ param server { String } URL of the server to receive the file
* @ param successCallback ( Function } Callback to be invoked when upload has completed
* @ param errorCallback { Function } Callback to be invoked upon error
* @ param options { FileUploadOptions } Optional parameters such as file name and mimetype
2012-04-10 08:11:13 +08:00
* @ param trustAllHosts { Boolean } Optional trust all hosts ( e . g . for self - signed certs ) , defaults to false
2012-02-18 07:28:35 +08:00
* /
2012-04-10 08:11:13 +08:00
FileTransfer . prototype . upload = function ( filePath , server , successCallback , errorCallback , options , trustAllHosts ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'ssFFO*' , 'FileTransfer.upload' , arguments ) ;
2012-02-18 07:28:35 +08:00
// check for options
var fileKey = null ;
var fileName = null ;
var mimeType = null ;
var params = null ;
var chunkedMode = true ;
2012-08-22 21:50:40 +08:00
var headers = null ;
2013-04-19 03:28:00 +08:00
var httpMethod = null ;
2013-03-22 01:35:09 +08:00
var basicAuthHeader = getBasicAuthHeader ( server ) ;
if ( basicAuthHeader ) {
2013-04-19 03:28:00 +08:00
options = options || { } ;
options . headers = options . headers || { } ;
2013-03-22 01:35:09 +08:00
options . headers [ basicAuthHeader . name ] = basicAuthHeader . value ;
}
2012-02-18 07:28:35 +08:00
if ( options ) {
fileKey = options . fileKey ;
fileName = options . fileName ;
mimeType = options . mimeType ;
2012-08-22 21:50:40 +08:00
headers = options . headers ;
2013-04-19 03:28:00 +08:00
httpMethod = options . httpMethod || "POST" ;
if ( httpMethod . toUpperCase ( ) == "PUT" ) {
httpMethod = "PUT" ;
} else {
httpMethod = "POST" ;
}
2012-05-01 04:42:38 +08:00
if ( options . chunkedMode !== null || typeof options . chunkedMode != "undefined" ) {
2012-02-18 07:28:35 +08:00
chunkedMode = options . chunkedMode ;
}
if ( options . params ) {
params = options . params ;
}
else {
params = { } ;
}
}
2013-01-19 07:33:38 +08:00
var fail = errorCallback && function ( e ) {
2013-03-22 01:35:09 +08:00
var error = new FileTransferError ( e . code , e . source , e . target , e . http _status , e . body ) ;
2012-06-22 02:12:30 +08:00
errorCallback ( error ) ;
} ;
2012-09-21 11:39:09 +08:00
var self = this ;
var win = function ( result ) {
if ( typeof result . lengthComputable != "undefined" ) {
if ( self . onprogress ) {
2013-01-19 07:33:38 +08:00
self . onprogress ( newProgressEvent ( result ) ) ;
2012-09-21 11:39:09 +08:00
}
} else {
2013-01-19 07:33:38 +08:00
successCallback && successCallback ( result ) ;
2012-09-21 11:39:09 +08:00
}
} ;
2013-04-19 03:28:00 +08:00
exec ( win , fail , 'FileTransfer' , 'upload' , [ filePath , server , fileKey , fileName , mimeType , params , trustAllHosts , chunkedMode , headers , this . _id , httpMethod ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Downloads a file form a given URL and saves it to the specified directory .
* @ param source { String } URL of the server to receive the file
* @ param target { String } Full path of the file on the device
* @ param successCallback ( Function } Callback to be invoked when upload has completed
* @ param errorCallback { Function } Callback to be invoked upon error
2012-09-21 11:39:09 +08:00
* @ param trustAllHosts { Boolean } Optional trust all hosts ( e . g . for self - signed certs ) , defaults to false
2013-03-22 01:35:09 +08:00
* @ param options { FileDownloadOptions } Optional parameters such as headers
2012-02-18 07:28:35 +08:00
* /
2013-03-22 01:35:09 +08:00
FileTransfer . prototype . download = function ( source , target , successCallback , errorCallback , trustAllHosts , options ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'ssFF*' , 'FileTransfer.download' , arguments ) ;
2012-09-21 11:39:09 +08:00
var self = this ;
2013-03-22 01:35:09 +08:00
var basicAuthHeader = getBasicAuthHeader ( source ) ;
if ( basicAuthHeader ) {
2013-04-19 03:28:00 +08:00
options = options || { } ;
options . headers = options . headers || { } ;
2013-03-22 01:35:09 +08:00
options . headers [ basicAuthHeader . name ] = basicAuthHeader . value ;
}
var headers = null ;
if ( options ) {
headers = options . headers || null ;
}
2012-02-18 07:28:35 +08:00
var win = function ( result ) {
2012-09-21 11:39:09 +08:00
if ( typeof result . lengthComputable != "undefined" ) {
if ( self . onprogress ) {
return self . onprogress ( newProgressEvent ( result ) ) ;
}
2013-01-19 07:33:38 +08:00
} else if ( successCallback ) {
2012-09-21 11:39:09 +08:00
var entry = null ;
if ( result . isDirectory ) {
entry = new ( require ( 'cordova/plugin/DirectoryEntry' ) ) ( ) ;
}
else if ( result . isFile ) {
entry = new ( require ( 'cordova/plugin/FileEntry' ) ) ( ) ;
}
entry . isDirectory = result . isDirectory ;
entry . isFile = result . isFile ;
entry . name = result . name ;
entry . fullPath = result . fullPath ;
successCallback ( entry ) ;
2012-02-18 07:28:35 +08:00
}
} ;
2012-06-22 02:12:30 +08:00
2013-01-19 07:33:38 +08:00
var fail = errorCallback && function ( e ) {
2013-03-22 01:35:09 +08:00
var error = new FileTransferError ( e . code , e . source , e . target , e . http _status , e . body ) ;
2012-06-22 02:12:30 +08:00
errorCallback ( error ) ;
} ;
2013-03-22 01:35:09 +08:00
exec ( win , fail , 'FileTransfer' , 'download' , [ source , target , trustAllHosts , this . _id , headers ] ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-09-21 11:39:09 +08:00
/ * *
2013-04-19 03:28:00 +08:00
* Aborts the ongoing file transfer on this object . The original error
* callback for the file transfer will be called if necessary .
2012-09-21 11:39:09 +08:00
* /
2013-04-19 03:28:00 +08:00
FileTransfer . prototype . abort = function ( ) {
exec ( null , null , 'FileTransfer' , 'abort' , [ this . _id ] ) ;
2012-10-16 04:52:19 +08:00
} ;
2012-09-21 11:39:09 +08:00
2012-02-18 07:28:35 +08:00
module . exports = FileTransfer ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileTransferError.js
define ( "cordova/plugin/FileTransferError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* FileTransferError
* @ constructor
* /
2013-02-20 03:53:36 +08:00
var FileTransferError = function ( code , source , target , status , body ) {
2012-02-18 07:28:35 +08:00
this . code = code || null ;
2012-06-22 02:12:30 +08:00
this . source = source || null ;
this . target = target || null ;
this . http _status = status || null ;
2013-02-20 03:53:36 +08:00
this . body = body || null ;
2012-02-18 07:28:35 +08:00
} ;
FileTransferError . FILE _NOT _FOUND _ERR = 1 ;
FileTransferError . INVALID _URL _ERR = 2 ;
FileTransferError . CONNECTION _ERR = 3 ;
2012-09-21 11:39:09 +08:00
FileTransferError . ABORT _ERR = 4 ;
2012-02-18 07:28:35 +08:00
module . exports = FileTransferError ;
2012-06-22 02:12:30 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileUploadOptions.js
define ( "cordova/plugin/FileUploadOptions" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Options to customize the HTTP request used to upload files .
* @ constructor
* @ param fileKey { String } Name of file request parameter .
* @ param fileName { String } Filename to be used by the server . Defaults to image . jpg .
* @ param mimeType { String } Mimetype of the uploaded file . Defaults to image / jpeg .
* @ param params { Object } Object with key : value params to send to the server .
2012-08-22 21:50:40 +08:00
* @ param headers { Object } Keys are header names , values are header values . Multiple
* headers of the same name are not supported .
2012-02-18 07:28:35 +08:00
* /
2013-04-19 03:28:00 +08:00
var FileUploadOptions = function ( fileKey , fileName , mimeType , params , headers , httpMethod ) {
2012-02-18 07:28:35 +08:00
this . fileKey = fileKey || null ;
this . fileName = fileName || null ;
this . mimeType = mimeType || null ;
this . params = params || null ;
2012-08-22 21:50:40 +08:00
this . headers = headers || null ;
2013-04-19 03:28:00 +08:00
this . httpMethod = httpMethod || null ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = FileUploadOptions ;
2012-08-22 21:50:40 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileUploadResult.js
define ( "cordova/plugin/FileUploadResult" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* FileUploadResult
* @ constructor
* /
var FileUploadResult = function ( ) {
this . bytesSent = 0 ;
this . responseCode = null ;
this . response = null ;
} ;
module . exports = FileUploadResult ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/FileWriter.js
define ( "cordova/plugin/FileWriter" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var exec = require ( 'cordova/exec' ) ,
2012-04-24 02:37:33 +08:00
FileError = require ( 'cordova/plugin/FileError' ) ,
2012-02-18 07:28:35 +08:00
ProgressEvent = require ( 'cordova/plugin/ProgressEvent' ) ;
/ * *
* This class writes to the mobile device file system .
*
* For Android :
* The root directory is the root of the file system .
* To write to the SD card , the file name is "sdcard/my_file.txt"
*
* @ constructor
* @ param file { File } File object containing file properties
* @ param append if true write to the end of the file , otherwise overwrite the file
* /
var FileWriter = function ( file ) {
this . fileName = "" ;
this . length = 0 ;
if ( file ) {
this . fileName = file . fullPath || file ;
this . length = file . size || 0 ;
}
// default is to write at the beginning of the file
this . position = 0 ;
this . readyState = 0 ; // EMPTY
this . result = null ;
// Error
this . error = null ;
// Event handlers
this . onwritestart = null ; // When writing starts
this . onprogress = null ; // While writing the file, and reporting partial file data
this . onwrite = null ; // When the write has successfully completed.
this . onwriteend = null ; // When the request has completed (either in success or failure).
this . onabort = null ; // When the write has been aborted. For instance, by invoking the abort() method.
this . onerror = null ; // When the write has failed (see errors).
} ;
// States
FileWriter . INIT = 0 ;
FileWriter . WRITING = 1 ;
FileWriter . DONE = 2 ;
/ * *
* Abort writing file .
* /
FileWriter . prototype . abort = function ( ) {
// check for invalid state
if ( this . readyState === FileWriter . DONE || this . readyState === FileWriter . INIT ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
// set error
this . error = new FileError ( FileError . ABORT _ERR ) ;
this . readyState = FileWriter . DONE ;
// If abort callback
if ( typeof this . onabort === "function" ) {
this . onabort ( new ProgressEvent ( "abort" , { "target" : this } ) ) ;
}
// If write end callback
if ( typeof this . onwriteend === "function" ) {
this . onwriteend ( new ProgressEvent ( "writeend" , { "target" : this } ) ) ;
}
} ;
/ * *
* Writes data to the file
*
* @ param text to be written
* /
FileWriter . prototype . write = function ( text ) {
// Throw an exception if we are already writing a file
if ( this . readyState === FileWriter . WRITING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
// WRITING state
this . readyState = FileWriter . WRITING ;
var me = this ;
// If onwritestart callback
if ( typeof me . onwritestart === "function" ) {
me . onwritestart ( new ProgressEvent ( "writestart" , { "target" : me } ) ) ;
}
// Write file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileWriter . DONE ) {
return ;
}
// position always increases by bytes written because file would be extended
me . position += r ;
// The length of the file is now where we are done writing.
me . length = me . position ;
// DONE state
me . readyState = FileWriter . DONE ;
// If onwrite callback
if ( typeof me . onwrite === "function" ) {
me . onwrite ( new ProgressEvent ( "write" , { "target" : me } ) ) ;
}
// If onwriteend callback
if ( typeof me . onwriteend === "function" ) {
me . onwriteend ( new ProgressEvent ( "writeend" , { "target" : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileWriter . DONE ) {
return ;
}
// DONE state
me . readyState = FileWriter . DONE ;
// Save error
me . error = new FileError ( e ) ;
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { "target" : me } ) ) ;
}
// If onwriteend callback
if ( typeof me . onwriteend === "function" ) {
me . onwriteend ( new ProgressEvent ( "writeend" , { "target" : me } ) ) ;
}
} , "File" , "write" , [ this . fileName , text , this . position ] ) ;
} ;
/ * *
* Moves the file pointer to the location specified .
*
* If the offset is a negative number the position of the file
* pointer is rewound . If the offset is greater than the file
* size the position is set to the end of the file .
*
* @ param offset is the location to move the file pointer to .
* /
FileWriter . prototype . seek = function ( offset ) {
// Throw an exception if we are already writing a file
if ( this . readyState === FileWriter . WRITING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
2012-04-24 02:37:33 +08:00
if ( ! offset && offset !== 0 ) {
2012-02-18 07:28:35 +08:00
return ;
}
// See back from end of file.
if ( offset < 0 ) {
this . position = Math . max ( offset + this . length , 0 ) ;
}
2012-08-25 04:44:18 +08:00
// Offset is bigger than file size so set position
2012-02-18 07:28:35 +08:00
// to the end of the file.
else if ( offset > this . length ) {
this . position = this . length ;
}
// Offset is between 0 and file size so set the position
// to start writing.
else {
this . position = offset ;
}
} ;
/ * *
* Truncates the file to the size specified .
*
* @ param size to chop the file at .
* /
FileWriter . prototype . truncate = function ( size ) {
// Throw an exception if we are already writing a file
if ( this . readyState === FileWriter . WRITING ) {
throw new FileError ( FileError . INVALID _STATE _ERR ) ;
}
// WRITING state
this . readyState = FileWriter . WRITING ;
var me = this ;
// If onwritestart callback
if ( typeof me . onwritestart === "function" ) {
me . onwritestart ( new ProgressEvent ( "writestart" , { "target" : this } ) ) ;
}
// Write file
exec (
// Success callback
function ( r ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileWriter . DONE ) {
return ;
}
// DONE state
me . readyState = FileWriter . DONE ;
// Update the length of the file
me . length = r ;
me . position = Math . min ( me . position , r ) ;
// If onwrite callback
if ( typeof me . onwrite === "function" ) {
me . onwrite ( new ProgressEvent ( "write" , { "target" : me } ) ) ;
}
// If onwriteend callback
if ( typeof me . onwriteend === "function" ) {
me . onwriteend ( new ProgressEvent ( "writeend" , { "target" : me } ) ) ;
}
} ,
// Error callback
function ( e ) {
// If DONE (cancelled), then don't do anything
if ( me . readyState === FileWriter . DONE ) {
return ;
}
// DONE state
me . readyState = FileWriter . DONE ;
// Save error
me . error = new FileError ( e ) ;
// If onerror callback
if ( typeof me . onerror === "function" ) {
me . onerror ( new ProgressEvent ( "error" , { "target" : me } ) ) ;
}
// If onwriteend callback
if ( typeof me . onwriteend === "function" ) {
me . onwriteend ( new ProgressEvent ( "writeend" , { "target" : me } ) ) ;
}
} , "File" , "truncate" , [ this . fileName , size ] ) ;
} ;
module . exports = FileWriter ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Flags.js
define ( "cordova/plugin/Flags" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Supplies arguments to methods that lookup or create files and directories .
2012-04-24 02:37:33 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param create
* { boolean } file or directory if it doesn ' t exist
* @ param exclusive
* { boolean } used with create ; if true the command will fail if
* target path exists
* /
function Flags ( create , exclusive ) {
this . create = create || false ;
this . exclusive = exclusive || false ;
}
module . exports = Flags ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-09-20 02:08:52 +08:00
// file: lib/common/plugin/GlobalizationError.js
define ( "cordova/plugin/GlobalizationError" , function ( require , exports , module ) {
2012-09-21 11:39:09 +08:00
/ * *
* Globalization error object
*
* @ constructor
* @ param code
* @ param message
* /
2012-09-20 02:08:52 +08:00
var GlobalizationError = function ( code , message ) {
this . code = code || null ;
this . message = message || '' ;
} ;
// Globalization error codes
GlobalizationError . UNKNOWN _ERROR = 0 ;
GlobalizationError . FORMATTING _ERROR = 1 ;
GlobalizationError . PARSING _ERROR = 2 ;
GlobalizationError . PATTERN _ERROR = 3 ;
module . exports = GlobalizationError ;
2012-09-21 11:39:09 +08:00
2012-09-20 02:08:52 +08:00
} ) ;
2012-11-23 22:38:49 +08:00
// file: lib/common/plugin/InAppBrowser.js
define ( "cordova/plugin/InAppBrowser" , function ( require , exports , module ) {
var exec = require ( 'cordova/exec' ) ;
2013-01-19 07:33:38 +08:00
var channel = require ( 'cordova/channel' ) ;
2013-04-19 03:28:00 +08:00
var modulemapper = require ( 'cordova/modulemapper' ) ;
2012-12-11 06:26:38 +08:00
2013-01-19 07:33:38 +08:00
function InAppBrowser ( ) {
2012-11-30 21:47:37 +08:00
this . channels = {
2013-01-19 07:33:38 +08:00
'loadstart' : channel . create ( 'loadstart' ) ,
'loadstop' : channel . create ( 'loadstop' ) ,
2013-03-22 01:35:09 +08:00
'loaderror' : channel . create ( 'loaderror' ) ,
2013-01-19 07:33:38 +08:00
'exit' : channel . create ( 'exit' )
2012-11-30 21:47:37 +08:00
} ;
}
2012-11-23 22:38:49 +08:00
2013-01-19 07:33:38 +08:00
InAppBrowser . prototype = {
_eventHandler : function ( event ) {
if ( event . type in this . channels ) {
this . channels [ event . type ] . fire ( event ) ;
}
} ,
close : function ( eventname ) {
exec ( null , null , "InAppBrowser" , "close" , [ ] ) ;
} ,
addEventListener : function ( eventname , f ) {
if ( eventname in this . channels ) {
this . channels [ eventname ] . subscribe ( f ) ;
}
} ,
removeEventListener : function ( eventname , f ) {
if ( eventname in this . channels ) {
this . channels [ eventname ] . unsubscribe ( f ) ;
}
2013-04-19 03:28:00 +08:00
} ,
executeScript : function ( injectDetails , cb ) {
if ( injectDetails . code ) {
exec ( cb , null , "InAppBrowser" , "injectScriptCode" , [ injectDetails . code , ! ! cb ] ) ;
} else if ( injectDetails . file ) {
exec ( cb , null , "InAppBrowser" , "injectScriptFile" , [ injectDetails . file , ! ! cb ] ) ;
} else {
throw new Error ( 'executeScript requires exactly one of code or file to be specified' ) ;
}
} ,
insertCSS : function ( injectDetails , cb ) {
if ( injectDetails . code ) {
exec ( cb , null , "InAppBrowser" , "injectStyleCode" , [ injectDetails . code , ! ! cb ] ) ;
} else if ( injectDetails . file ) {
exec ( cb , null , "InAppBrowser" , "injectStyleFile" , [ injectDetails . file , ! ! cb ] ) ;
} else {
throw new Error ( 'insertCSS requires exactly one of code or file to be specified' ) ;
}
2012-11-23 22:38:49 +08:00
}
2013-01-19 07:33:38 +08:00
} ;
2012-12-11 06:26:38 +08:00
2013-01-19 07:33:38 +08:00
module . exports = function ( strUrl , strWindowName , strWindowFeatures ) {
2012-11-30 21:47:37 +08:00
var iab = new InAppBrowser ( ) ;
var cb = function ( eventname ) {
iab . _eventHandler ( eventname ) ;
2013-01-19 07:33:38 +08:00
} ;
2013-04-19 03:28:00 +08:00
// Don't catch calls that write to existing frames (e.g. named iframes).
if ( window . frames && window . frames [ strWindowName ] ) {
var origOpenFunc = modulemapper . getOriginalSymbol ( window , 'open' ) ;
return origOpenFunc . apply ( window , arguments ) ;
}
2013-03-22 01:35:09 +08:00
exec ( cb , cb , "InAppBrowser" , "open" , [ strUrl , strWindowName , strWindowFeatures ] ) ;
2012-11-30 21:47:37 +08:00
return iab ;
2013-01-19 07:33:38 +08:00
} ;
2012-11-23 22:38:49 +08:00
2012-11-30 21:47:37 +08:00
2012-11-23 22:38:49 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/LocalFileSystem.js
define ( "cordova/plugin/LocalFileSystem" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* Represents a local file system .
* /
var LocalFileSystem = function ( ) {
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
} ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
LocalFileSystem . TEMPORARY = 0 ; //temporary, with no guarantee of persistence
LocalFileSystem . PERSISTENT = 1 ; //persistent
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
module . exports = LocalFileSystem ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-10 04:32:22 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Media.js
define ( "cordova/plugin/Media" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2013-01-19 07:33:38 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
utils = require ( 'cordova/utils' ) ,
2012-02-18 07:28:35 +08:00
exec = require ( 'cordova/exec' ) ;
var mediaObjects = { } ;
/ * *
* This class provides access to the device media , interfaces to both sound and video
*
* @ constructor
* @ param src The file name or url to play
* @ param successCallback The callback to be called when the file is done playing or recording .
* successCallback ( )
* @ param errorCallback The callback to be called if there is an error .
* errorCallback ( int errorCode ) - OPTIONAL
* @ param statusCallback The callback to be called when media status has changed .
* statusCallback ( int statusCode ) - OPTIONAL
* /
var Media = function ( src , successCallback , errorCallback , statusCallback ) {
2013-01-19 07:33:38 +08:00
argscheck . checkArgs ( 'SFFF' , 'Media' , arguments ) ;
2012-02-18 07:28:35 +08:00
this . id = utils . createUUID ( ) ;
mediaObjects [ this . id ] = this ;
this . src = src ;
this . successCallback = successCallback ;
this . errorCallback = errorCallback ;
this . statusCallback = statusCallback ;
this . _duration = - 1 ;
this . _position = - 1 ;
exec ( null , this . errorCallback , "Media" , "create" , [ this . id , this . src ] ) ;
} ;
// Media messages
Media . MEDIA _STATE = 1 ;
Media . MEDIA _DURATION = 2 ;
Media . MEDIA _POSITION = 3 ;
Media . MEDIA _ERROR = 9 ;
// Media states
Media . MEDIA _NONE = 0 ;
Media . MEDIA _STARTING = 1 ;
Media . MEDIA _RUNNING = 2 ;
Media . MEDIA _PAUSED = 3 ;
Media . MEDIA _STOPPED = 4 ;
Media . MEDIA _MSG = [ "None" , "Starting" , "Running" , "Paused" , "Stopped" ] ;
// "static" function to return existing objs.
Media . get = function ( id ) {
return mediaObjects [ id ] ;
} ;
/ * *
* Start or resume playing audio file .
* /
2012-03-25 02:09:57 +08:00
Media . prototype . play = function ( options ) {
2012-03-31 03:29:26 +08:00
exec ( null , null , "Media" , "startPlayingAudio" , [ this . id , this . src , options ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Stop playing audio file .
* /
Media . prototype . stop = function ( ) {
var me = this ;
exec ( function ( ) {
me . _position = 0 ;
} , this . errorCallback , "Media" , "stopPlayingAudio" , [ this . id ] ) ;
} ;
/ * *
* Seek or jump to a new time in the track . .
* /
Media . prototype . seekTo = function ( milliseconds ) {
var me = this ;
exec ( function ( p ) {
me . _position = p ;
} , this . errorCallback , "Media" , "seekToAudio" , [ this . id , milliseconds ] ) ;
} ;
/ * *
* Pause playing audio file .
* /
Media . prototype . pause = function ( ) {
exec ( null , this . errorCallback , "Media" , "pausePlayingAudio" , [ this . id ] ) ;
} ;
/ * *
* Get duration of an audio file .
* The duration is only set for audio that is playing , paused or stopped .
*
* @ return duration or - 1 if not known .
* /
Media . prototype . getDuration = function ( ) {
return this . _duration ;
} ;
/ * *
* Get position of audio .
* /
Media . prototype . getCurrentPosition = function ( success , fail ) {
var me = this ;
exec ( function ( p ) {
me . _position = p ;
success ( p ) ;
} , fail , "Media" , "getCurrentPositionAudio" , [ this . id ] ) ;
} ;
/ * *
* Start recording audio file .
* /
Media . prototype . startRecord = function ( ) {
2012-08-22 21:50:40 +08:00
exec ( null , this . errorCallback , "Media" , "startRecordingAudio" , [ this . id , this . src ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Stop recording audio file .
* /
Media . prototype . stopRecord = function ( ) {
2012-08-22 21:50:40 +08:00
exec ( null , this . errorCallback , "Media" , "stopRecordingAudio" , [ this . id ] ) ;
2012-02-18 07:28:35 +08:00
} ;
/ * *
* Release the resources .
* /
Media . prototype . release = function ( ) {
exec ( null , this . errorCallback , "Media" , "release" , [ this . id ] ) ;
} ;
/ * *
* Adjust the volume .
* /
Media . prototype . setVolume = function ( volume ) {
exec ( null , null , "Media" , "setVolume" , [ this . id , volume ] ) ;
} ;
2012-03-01 23:45:27 +08:00
/ * *
* Audio has status update .
* PRIVATE
*
* @ param id The media object id ( string )
2012-09-12 23:44:53 +08:00
* @ param msgType The 'type' of update this is
* @ param value Use of value is determined by the msgType
2012-03-01 23:45:27 +08:00
* /
2012-09-12 23:44:53 +08:00
Media . onStatus = function ( id , msgType , value ) {
2012-03-01 23:45:27 +08:00
var media = mediaObjects [ id ] ;
2012-09-12 23:44:53 +08:00
if ( media ) {
switch ( msgType ) {
case Media . MEDIA _STATE :
media . statusCallback && media . statusCallback ( value ) ;
if ( value == Media . MEDIA _STOPPED ) {
media . successCallback && media . successCallback ( ) ;
}
break ;
case Media . MEDIA _DURATION :
media . _duration = value ;
break ;
case Media . MEDIA _ERROR :
2012-10-16 04:52:19 +08:00
media . errorCallback && media . errorCallback ( value ) ;
2012-09-12 23:44:53 +08:00
break ;
case Media . MEDIA _POSITION :
media . _position = Number ( value ) ;
break ;
default :
2013-01-19 07:33:38 +08:00
console . error && console . error ( "Unhandled Media.onStatus :: " + msgType ) ;
2012-09-12 23:44:53 +08:00
break ;
2012-03-01 23:45:27 +08:00
}
}
2012-09-12 23:44:53 +08:00
else {
2013-01-19 07:33:38 +08:00
console . error && console . error ( "Received Media.onStatus callback for unknown media :: " + id ) ;
2012-03-01 23:45:27 +08:00
}
2012-09-12 23:44:53 +08:00
2012-03-01 23:45:27 +08:00
} ;
2012-02-18 07:28:35 +08:00
module . exports = Media ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/MediaError.js
define ( "cordova/plugin/MediaError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* This class contains information about any Media errors .
2012-09-12 23:44:53 +08:00
* /
/ *
According to : : http : //dev.w3.org/html5/spec-author-view/video.html#mediaerror
We should never be creating these objects , we should just implement the interface
which has 1 property for an instance , 'code'
instead of doing :
errorCallbackFunction ( new MediaError ( 3 , 'msg' ) ) ;
we should simply use a literal :
errorCallbackFunction ( { 'code' : 3 } ) ;
2012-02-18 07:28:35 +08:00
* /
2012-10-16 04:52:19 +08:00
var _MediaError = window . MediaError ;
if ( ! _MediaError ) {
window . MediaError = _MediaError = function ( code , msg ) {
2012-09-12 23:44:53 +08:00
this . code = ( typeof code != 'undefined' ) ? code : null ;
this . message = msg || "" ; // message is NON-standard! do not use!
} ;
}
2012-10-16 04:52:19 +08:00
_MediaError . MEDIA _ERR _NONE _ACTIVE = _MediaError . MEDIA _ERR _NONE _ACTIVE || 0 ;
_MediaError . MEDIA _ERR _ABORTED = _MediaError . MEDIA _ERR _ABORTED || 1 ;
_MediaError . MEDIA _ERR _NETWORK = _MediaError . MEDIA _ERR _NETWORK || 2 ;
_MediaError . MEDIA _ERR _DECODE = _MediaError . MEDIA _ERR _DECODE || 3 ;
_MediaError . MEDIA _ERR _NONE _SUPPORTED = _MediaError . MEDIA _ERR _NONE _SUPPORTED || 4 ;
// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below.
2012-09-12 23:44:53 +08:00
// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes
2012-10-16 04:52:19 +08:00
_MediaError . MEDIA _ERR _SRC _NOT _SUPPORTED = _MediaError . MEDIA _ERR _SRC _NOT _SUPPORTED || 4 ;
2012-02-18 07:28:35 +08:00
2012-10-16 04:52:19 +08:00
module . exports = _MediaError ;
2012-09-12 23:44:53 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/MediaFile.js
define ( "cordova/plugin/MediaFile" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ,
File = require ( 'cordova/plugin/File' ) ,
CaptureError = require ( 'cordova/plugin/CaptureError' ) ;
/ * *
* Represents a single file .
*
* name { DOMString } name of the file , without path information
* fullPath { DOMString } the full path of the file , including the name
* type { DOMString } mime type
* lastModifiedDate { Date } last modified date
* size { Number } size of the file in bytes
* /
var MediaFile = function ( name , fullPath , type , lastModifiedDate , size ) {
2012-05-01 04:42:38 +08:00
MediaFile . _ _super _ _ . constructor . apply ( this , arguments ) ;
2012-02-18 07:28:35 +08:00
} ;
utils . extend ( MediaFile , File ) ;
/ * *
* Request capture format data for a specific file and type
2012-04-24 02:37:33 +08:00
*
2012-02-18 07:28:35 +08:00
* @ param { Function } successCB
* @ param { Function } errorCB
* /
MediaFile . prototype . getFormatData = function ( successCallback , errorCallback ) {
2012-04-24 02:37:33 +08:00
if ( typeof this . fullPath === "undefined" || this . fullPath === null ) {
errorCallback ( new CaptureError ( CaptureError . CAPTURE _INVALID _ARGUMENT ) ) ;
} else {
2012-05-01 04:42:38 +08:00
exec ( successCallback , errorCallback , "Capture" , "getFormatData" , [ this . fullPath , this . type ] ) ;
2012-04-24 02:37:33 +08:00
}
2012-02-18 07:28:35 +08:00
} ;
module . exports = MediaFile ;
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/MediaFileData.js
define ( "cordova/plugin/MediaFileData" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* MediaFileData encapsulates format information of a media file .
*
* @ param { DOMString } codecs
* @ param { long } bitrate
* @ param { long } height
* @ param { long } width
* @ param { float } duration
* /
var MediaFileData = function ( codecs , bitrate , height , width , duration ) {
2012-04-24 02:37:33 +08:00
this . codecs = codecs || null ;
this . bitrate = bitrate || 0 ;
this . height = height || 0 ;
this . width = width || 0 ;
this . duration = duration || 0 ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = MediaFileData ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Metadata.js
define ( "cordova/plugin/Metadata" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Information about the state of the file or directory
2012-04-24 02:37:33 +08:00
*
2012-02-18 07:28:35 +08:00
* { Date } modificationTime ( readonly )
* /
var Metadata = function ( time ) {
this . modificationTime = ( typeof time != 'undefined' ? new Date ( time ) : null ) ;
} ;
module . exports = Metadata ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/Position.js
define ( "cordova/plugin/Position" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-10 04:32:22 +08:00
var Coordinates = require ( 'cordova/plugin/Coordinates' ) ;
2012-02-18 07:28:35 +08:00
var Position = function ( coords , timestamp ) {
2012-05-11 06:50:02 +08:00
if ( coords ) {
this . coords = new Coordinates ( coords . latitude , coords . longitude , coords . altitude , coords . accuracy , coords . heading , coords . velocity , coords . altitudeAccuracy ) ;
} else {
this . coords = new Coordinates ( ) ;
}
2012-06-06 05:26:02 +08:00
this . timestamp = ( timestamp !== undefined ) ? timestamp : new Date ( ) ;
2012-02-18 07:28:35 +08:00
} ;
module . exports = Position ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/PositionError.js
define ( "cordova/plugin/PositionError" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
* Position error object
*
* @ constructor
* @ param code
* @ param message
* /
var PositionError = function ( code , message ) {
this . code = code || null ;
this . message = message || '' ;
} ;
PositionError . PERMISSION _DENIED = 1 ;
PositionError . POSITION _UNAVAILABLE = 2 ;
PositionError . TIMEOUT = 3 ;
module . exports = PositionError ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/ProgressEvent.js
define ( "cordova/plugin/ProgressEvent" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
// Feature test: See if we can instantiate a native ProgressEvent;
// if so, use that approach,
// otherwise fill-in with our own implementation.
//
// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
var ProgressEvent = ( function ( ) {
/ *
var createEvent = function ( data ) {
var event = document . createEvent ( 'Events' ) ;
event . initEvent ( 'ProgressEvent' , false , false ) ;
if ( data ) {
for ( var i in data ) {
if ( data . hasOwnProperty ( i ) ) {
event [ i ] = data [ i ] ;
}
}
if ( data . target ) {
// TODO: cannot call <some_custom_object>.dispatchEvent
// need to first figure out how to implement EventTarget
}
}
return event ;
} ;
try {
var ev = createEvent ( { type : "abort" , target : document } ) ;
return function ProgressEvent ( type , data ) {
data . type = type ;
return createEvent ( data ) ;
} ;
} catch ( e ) {
* /
return function ProgressEvent ( type , dict ) {
this . type = type ;
this . bubbles = false ;
this . cancelBubble = false ;
this . cancelable = false ;
this . lengthComputable = false ;
this . loaded = dict && dict . loaded ? dict . loaded : 0 ;
this . total = dict && dict . total ? dict . total : 0 ;
this . target = dict && dict . target ? dict . target : null ;
} ;
//}
} ) ( ) ;
module . exports = ProgressEvent ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/accelerometer.js
define ( "cordova/plugin/accelerometer" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* This class provides access to device accelerometer data .
* @ constructor
2012-02-18 07:28:35 +08:00
* /
2012-11-27 05:09:52 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
utils = require ( "cordova/utils" ) ,
2012-05-15 04:04:07 +08:00
exec = require ( "cordova/exec" ) ,
Acceleration = require ( 'cordova/plugin/Acceleration' ) ;
2012-03-01 23:45:27 +08:00
2012-05-19 04:50:45 +08:00
// Is the accel sensor running?
var running = false ;
2012-03-01 23:45:27 +08:00
2012-05-15 04:04:07 +08:00
// Keeps reference to watchAcceleration calls.
2012-03-25 02:09:57 +08:00
var timers = { } ;
2012-02-18 07:28:35 +08:00
2012-05-19 04:50:45 +08:00
// Array of listeners; used to keep track of when we should call start and stop.
var listeners = [ ] ;
2012-05-15 04:04:07 +08:00
// Last returned acceleration object from native
var accel = null ;
2012-05-19 04:50:45 +08:00
// Tells native to start.
function start ( ) {
exec ( function ( a ) {
var tempListeners = listeners . slice ( 0 ) ;
accel = new Acceleration ( a . x , a . y , a . z , a . timestamp ) ;
for ( var i = 0 , l = tempListeners . length ; i < l ; i ++ ) {
tempListeners [ i ] . win ( accel ) ;
}
} , function ( e ) {
var tempListeners = listeners . slice ( 0 ) ;
for ( var i = 0 , l = tempListeners . length ; i < l ; i ++ ) {
tempListeners [ i ] . fail ( e ) ;
}
} , "Accelerometer" , "start" , [ ] ) ;
running = true ;
}
// Tells native to stop.
function stop ( ) {
exec ( null , null , "Accelerometer" , "stop" , [ ] ) ;
running = false ;
}
// Adds a callback pair to the listeners array
function createCallbackPair ( win , fail ) {
return { win : win , fail : fail } ;
}
// Removes a win/fail listener pair from the listeners array
function removeListeners ( l ) {
var idx = listeners . indexOf ( l ) ;
if ( idx > - 1 ) {
listeners . splice ( idx , 1 ) ;
if ( listeners . length === 0 ) {
stop ( ) ;
}
}
}
2012-03-25 02:09:57 +08:00
var accelerometer = {
/ * *
2012-09-29 02:36:36 +08:00
* Asynchronously acquires the current acceleration .
2012-03-25 02:09:57 +08:00
*
* @ param { Function } successCallback The function to call when the acceleration data is available
* @ param { Function } errorCallback The function to call when there is an error getting the acceleration data . ( OPTIONAL )
* @ param { AccelerationOptions } options The options for getting the accelerometer data such as timeout . ( OPTIONAL )
* /
getCurrentAcceleration : function ( successCallback , errorCallback , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'accelerometer.getCurrentAcceleration' , arguments ) ;
2012-02-18 07:28:35 +08:00
2012-05-19 04:50:45 +08:00
var p ;
2012-05-15 04:04:07 +08:00
var win = function ( a ) {
2012-05-19 04:50:45 +08:00
removeListeners ( p ) ;
2012-07-19 07:58:03 +08:00
successCallback ( a ) ;
2012-05-19 04:50:45 +08:00
} ;
var fail = function ( e ) {
removeListeners ( p ) ;
2012-11-27 05:09:52 +08:00
errorCallback && errorCallback ( e ) ;
2012-05-15 04:04:07 +08:00
} ;
2012-02-18 07:28:35 +08:00
2012-05-19 04:50:45 +08:00
p = createCallbackPair ( win , fail ) ;
listeners . push ( p ) ;
if ( ! running ) {
start ( ) ;
}
2012-03-25 02:09:57 +08:00
} ,
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
/ * *
2012-09-29 02:36:36 +08:00
* Asynchronously acquires the acceleration repeatedly at a given interval .
2012-03-25 02:09:57 +08:00
*
* @ param { Function } successCallback The function to call each time the acceleration data is available
* @ param { Function } errorCallback The function to call when there is an error getting the acceleration data . ( OPTIONAL )
* @ param { AccelerationOptions } options The options for getting the accelerometer data such as timeout . ( OPTIONAL )
* @ return String The watch id that must be passed to # clearWatch to stop watching .
* /
watchAcceleration : function ( successCallback , errorCallback , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'accelerometer.watchAcceleration' , arguments ) ;
2012-03-25 02:09:57 +08:00
// Default interval (10 sec)
2012-05-15 04:04:07 +08:00
var frequency = ( options && options . frequency && typeof options . frequency == 'number' ) ? options . frequency : 10000 ;
2012-03-25 02:09:57 +08:00
2012-05-15 04:04:07 +08:00
// Keep reference to watch id, and report accel readings as often as defined in frequency
2012-03-25 02:09:57 +08:00
var id = utils . createUUID ( ) ;
2012-05-15 04:04:07 +08:00
2012-05-19 04:50:45 +08:00
var p = createCallbackPair ( function ( ) { } , function ( e ) {
removeListeners ( p ) ;
2012-11-27 05:09:52 +08:00
errorCallback && errorCallback ( e ) ;
2012-05-19 04:50:45 +08:00
} ) ;
listeners . push ( p ) ;
2012-02-18 07:28:35 +08:00
2012-05-19 04:50:45 +08:00
timers [ id ] = {
timer : window . setInterval ( function ( ) {
if ( accel ) {
successCallback ( accel ) ;
2012-03-25 02:09:57 +08:00
}
2012-05-19 04:50:45 +08:00
} , frequency ) ,
listeners : p
2012-05-15 04:04:07 +08:00
} ;
2012-03-25 02:09:57 +08:00
2012-05-19 04:50:45 +08:00
if ( running ) {
// If we're already running then immediately invoke the success callback
2012-08-25 04:44:18 +08:00
// but only if we have retrieved a value, sample code does not check for null ...
2012-11-27 05:09:52 +08:00
if ( accel ) {
2012-07-19 07:58:03 +08:00
successCallback ( accel ) ;
}
2012-05-19 04:50:45 +08:00
} else {
start ( ) ;
}
2012-03-25 02:09:57 +08:00
return id ;
} ,
/ * *
* Clears the specified accelerometer watch .
*
* @ param { String } id The id of the watch returned from # watchAcceleration .
* /
clearWatch : function ( id ) {
// Stop javascript timer & remove from timer list
2012-05-15 04:04:07 +08:00
if ( id && timers [ id ] ) {
2012-05-19 04:50:45 +08:00
window . clearInterval ( timers [ id ] . timer ) ;
removeListeners ( timers [ id ] . listeners ) ;
2012-03-25 02:09:57 +08:00
delete timers [ id ] ;
}
}
2012-02-18 07:28:35 +08:00
} ;
2012-03-25 02:09:57 +08:00
module . exports = accelerometer ;
2012-05-15 04:04:07 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/accelerometer/symbols.js
define ( "cordova/plugin/accelerometer/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . defaults ( 'cordova/plugin/Acceleration' , 'Acceleration' ) ;
modulemapper . defaults ( 'cordova/plugin/accelerometer' , 'navigator.accelerometer' ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/android/plugin/android/app.js
define ( "cordova/plugin/android/app" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var exec = require ( 'cordova/exec' ) ;
module . exports = {
/ * *
* Clear the resource cache .
* /
clearCache : function ( ) {
exec ( null , null , "App" , "clearCache" , [ ] ) ;
} ,
/ * *
* Load the url into the webview or into new browser instance .
*
* @ param url The URL to load
* @ param props Properties that can be passed in to the activity :
* wait : int => wait msec before loading URL
* loadingDialog : "Title,Message" => display a native loading dialog
* loadUrlTimeoutValue : int => time in msec to wait before triggering a timeout error
* clearHistory : boolean => clear webview history ( default = false )
* openExternal : boolean => open in a new browser ( default = false )
*
* Example :
* navigator . app . loadUrl ( "http://server/myapp/index.html" , { wait : 2000 , loadingDialog : "Wait,Loading App" , loadUrlTimeoutValue : 60000 } ) ;
* /
loadUrl : function ( url , props ) {
exec ( null , null , "App" , "loadUrl" , [ url , props ] ) ;
} ,
/ * *
* Cancel loadUrl that is waiting to be loaded .
* /
cancelLoadUrl : function ( ) {
exec ( null , null , "App" , "cancelLoadUrl" , [ ] ) ;
} ,
/ * *
* Clear web history in this web view .
* Instead of BACK button loading the previous web page , it will exit the app .
* /
clearHistory : function ( ) {
exec ( null , null , "App" , "clearHistory" , [ ] ) ;
} ,
/ * *
* Go to previous page displayed .
* This is the same as pressing the backbutton on Android device .
* /
backHistory : function ( ) {
exec ( null , null , "App" , "backHistory" , [ ] ) ;
} ,
/ * *
* Override the default behavior of the Android back button .
* If overridden , when the back button is pressed , the "backKeyDown" JavaScript event will be fired .
*
* Note : The user should not have to call this method . Instead , when the user
* registers for the "backbutton" event , this is automatically done .
*
2012-04-24 02:37:33 +08:00
* @ param override T = override , F = cancel override
2012-02-18 07:28:35 +08:00
* /
overrideBackbutton : function ( override ) {
exec ( null , null , "App" , "overrideBackbutton" , [ override ] ) ;
} ,
/ * *
* Exit and terminate the application .
* /
exitApp : function ( ) {
return exec ( null , null , "App" , "exitApp" , [ ] ) ;
2012-04-24 02:37:33 +08:00
}
2012-02-18 07:28:35 +08:00
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/plugin/android/device.js
define ( "cordova/plugin/android/device" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var channel = require ( 'cordova/channel' ) ,
2012-03-29 04:47:45 +08:00
utils = require ( 'cordova/utils' ) ,
2012-07-13 04:37:08 +08:00
exec = require ( 'cordova/exec' ) ,
app = require ( 'cordova/plugin/android/app' ) ;
2012-02-18 07:28:35 +08:00
2012-07-13 04:37:08 +08:00
module . exports = {
/ *
* DEPRECATED
* This is only for Android .
*
* You must explicitly override the back button .
* /
overrideBackButton : function ( ) {
console . log ( "Device.overrideBackButton() is deprecated. Use App.overrideBackbutton(true)." ) ;
app . overrideBackbutton ( true ) ;
} ,
2012-02-18 07:28:35 +08:00
2012-07-13 04:37:08 +08:00
/ *
* DEPRECATED
* This is only for Android .
*
2012-09-29 02:36:36 +08:00
* This resets the back button to the default behavior
2012-07-13 04:37:08 +08:00
* /
resetBackButton : function ( ) {
console . log ( "Device.resetBackButton() is deprecated. Use App.overrideBackbutton(false)." ) ;
app . overrideBackbutton ( false ) ;
} ,
2012-02-18 07:28:35 +08:00
2012-07-13 04:37:08 +08:00
/ *
* DEPRECATED
* This is only for Android .
*
* This terminates the activity !
* /
exitApp : function ( ) {
console . log ( "Device.exitApp() is deprecated. Use App.exitApp()." ) ;
app . exitApp ( ) ;
2012-02-18 07:28:35 +08:00
}
} ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-09-19 01:15:24 +08:00
// file: lib/android/plugin/android/nativeapiprovider.js
define ( "cordova/plugin/android/nativeapiprovider" , function ( require , exports , module ) {
var nativeApi = this . _cordovaNative || require ( 'cordova/plugin/android/promptbasednativeapi' ) ;
var currentApi = nativeApi ;
module . exports = {
2012-10-16 04:52:19 +08:00
get : function ( ) { return currentApi ; } ,
2012-09-19 01:15:24 +08:00
setPreferPrompt : function ( value ) {
currentApi = value ? require ( 'cordova/plugin/android/promptbasednativeapi' ) : nativeApi ;
2012-10-26 03:02:26 +08:00
} ,
// Used only by tests.
set : function ( value ) {
currentApi = value ;
2012-09-19 01:15:24 +08:00
}
} ;
} ) ;
2012-03-29 04:47:45 +08:00
// file: lib/android/plugin/android/notification.js
define ( "cordova/plugin/android/notification" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-29 04:47:45 +08:00
var exec = require ( 'cordova/exec' ) ;
/ * *
* Provides Android enhanced notification API .
* /
module . exports = {
activityStart : function ( title , message ) {
// If title and message not specified then mimic Android behavior of
// using default strings.
if ( typeof title === "undefined" && typeof message == "undefined" ) {
title = "Busy" ;
message = 'Please wait...' ;
}
exec ( null , null , 'Notification' , 'activityStart' , [ title , message ] ) ;
} ,
/ * *
* Close an activity dialog
* /
activityStop : function ( ) {
exec ( null , null , 'Notification' , 'activityStop' , [ ] ) ;
} ,
/ * *
* Display a progress dialog with progress bar that goes from 0 to 100.
*
* @ param { String }
* title Title of the progress dialog .
* @ param { String }
* message Message to display in the dialog .
* /
progressStart : function ( title , message ) {
exec ( null , null , 'Notification' , 'progressStart' , [ title , message ] ) ;
} ,
/ * *
* Close the progress dialog .
* /
progressStop : function ( ) {
exec ( null , null , 'Notification' , 'progressStop' , [ ] ) ;
} ,
/ * *
* Set the progress dialog value .
*
* @ param { Number }
* value 0 - 100
* /
progressValue : function ( value ) {
exec ( null , null , 'Notification' , 'progressValue' , [ value ] ) ;
2012-04-24 02:37:33 +08:00
}
2012-03-29 04:47:45 +08:00
} ;
2012-09-19 01:15:24 +08:00
} ) ;
// file: lib/android/plugin/android/promptbasednativeapi.js
define ( "cordova/plugin/android/promptbasednativeapi" , function ( require , exports , module ) {
module . exports = {
exec : function ( service , action , callbackId , argsJson ) {
return prompt ( argsJson , 'gap:' + JSON . stringify ( [ service , action , callbackId ] ) ) ;
} ,
setNativeToJsBridgeMode : function ( value ) {
prompt ( value , 'gap_bridge_mode:' ) ;
} ,
retrieveJsMessages : function ( ) {
return prompt ( '' , 'gap_poll:' ) ;
}
} ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
// file: lib/android/plugin/android/storage.js
define ( "cordova/plugin/android/storage" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
var utils = require ( 'cordova/utils' ) ,
2012-04-24 02:37:33 +08:00
exec = require ( 'cordova/exec' ) ,
2012-03-25 02:09:57 +08:00
channel = require ( 'cordova/channel' ) ;
2012-02-18 07:28:35 +08:00
var queryQueue = { } ;
/ * *
* SQL result set object
* PRIVATE METHOD
* @ constructor
* /
var DroidDB _Rows = function ( ) {
this . resultSet = [ ] ; // results array
this . length = 0 ; // number of rows
} ;
/ * *
* Get item from SQL result set
*
* @ param row The row number to return
* @ return The row object
* /
DroidDB _Rows . prototype . item = function ( row ) {
return this . resultSet [ row ] ;
} ;
/ * *
* SQL result set that is returned to user .
* PRIVATE METHOD
* @ constructor
* /
var DroidDB _Result = function ( ) {
this . rows = new DroidDB _Rows ( ) ;
} ;
/ * *
* Callback from native code when query is complete .
* PRIVATE METHOD
*
* @ param id Query id
* /
function completeQuery ( id , data ) {
var query = queryQueue [ id ] ;
if ( query ) {
try {
delete queryQueue [ id ] ;
// Get transaction
var tx = query . tx ;
// If transaction hasn't failed
// Note: We ignore all query results if previous query
// in the same transaction failed.
if ( tx && tx . queryList [ id ] ) {
// Save query results
var r = new DroidDB _Result ( ) ;
r . rows . resultSet = data ;
r . rows . length = data . length ;
try {
if ( typeof query . successCallback === 'function' ) {
query . successCallback ( query . tx , r ) ;
}
} catch ( ex ) {
console . log ( "executeSql error calling user success callback: " + ex ) ;
}
tx . queryComplete ( id ) ;
}
} catch ( e ) {
console . log ( "executeSql error: " + e ) ;
}
}
}
/ * *
* Callback from native code when query fails
* PRIVATE METHOD
*
* @ param reason Error message
* @ param id Query id
* /
function failQuery ( reason , id ) {
var query = queryQueue [ id ] ;
if ( query ) {
try {
delete queryQueue [ id ] ;
// Get transaction
var tx = query . tx ;
// If transaction hasn't failed
// Note: We ignore all query results if previous query
// in the same transaction failed.
if ( tx && tx . queryList [ id ] ) {
tx . queryList = { } ;
try {
if ( typeof query . errorCallback === 'function' ) {
query . errorCallback ( query . tx , reason ) ;
}
} catch ( ex ) {
console . log ( "executeSql error calling user error callback: " + ex ) ;
}
tx . queryFailed ( id , reason ) ;
}
} catch ( e ) {
console . log ( "executeSql error: " + e ) ;
}
}
}
/ * *
* SQL query object
* PRIVATE METHOD
*
* @ constructor
* @ param tx The transaction object that this query belongs to
* /
var DroidDB _Query = function ( tx ) {
// Set the id of the query
this . id = utils . createUUID ( ) ;
// Add this query to the queue
queryQueue [ this . id ] = this ;
// Init result
this . resultSet = [ ] ;
// Set transaction that this query belongs to
this . tx = tx ;
// Add this query to transaction list
this . tx . queryList [ this . id ] = this ;
// Callbacks
this . successCallback = null ;
this . errorCallback = null ;
} ;
/ * *
* Transaction object
* PRIVATE METHOD
* @ constructor
* /
var DroidDB _Tx = function ( ) {
// Set the id of the transaction
this . id = utils . createUUID ( ) ;
// Callbacks
this . successCallback = null ;
this . errorCallback = null ;
// Query list
this . queryList = { } ;
} ;
/ * *
* Mark query in transaction as complete .
* If all queries are complete , call the user ' s transaction success callback .
*
* @ param id Query id
* /
DroidDB _Tx . prototype . queryComplete = function ( id ) {
delete this . queryList [ id ] ;
// If no more outstanding queries, then fire transaction success
if ( this . successCallback ) {
var count = 0 ;
var i ;
for ( i in this . queryList ) {
if ( this . queryList . hasOwnProperty ( i ) ) {
count ++ ;
}
}
if ( count === 0 ) {
try {
this . successCallback ( ) ;
} catch ( e ) {
console . log ( "Transaction error calling user success callback: " + e ) ;
}
}
}
} ;
/ * *
* Mark query in transaction as failed .
*
* @ param id Query id
* @ param reason Error message
* /
DroidDB _Tx . prototype . queryFailed = function ( id , reason ) {
// The sql queries in this transaction have already been run, since
// we really don't have a real transaction implemented in native code.
// However, the user callbacks for the remaining sql queries in transaction
// will not be called.
this . queryList = { } ;
if ( this . errorCallback ) {
try {
this . errorCallback ( reason ) ;
} catch ( e ) {
console . log ( "Transaction error calling user error callback: " + e ) ;
}
}
} ;
/ * *
* Execute SQL statement
*
* @ param sql SQL statement to execute
* @ param params Statement parameters
* @ param successCallback Success callback
* @ param errorCallback Error callback
* /
DroidDB _Tx . prototype . executeSql = function ( sql , params , successCallback , errorCallback ) {
// Init params array
if ( typeof params === 'undefined' ) {
params = [ ] ;
}
// Create query and add to queue
var query = new DroidDB _Query ( this ) ;
queryQueue [ query . id ] = query ;
// Save callbacks
query . successCallback = successCallback ;
query . errorCallback = errorCallback ;
// Call native code
exec ( null , null , "Storage" , "executeSql" , [ sql , params , query . id ] ) ;
} ;
2012-03-25 02:09:57 +08:00
var DatabaseShell = function ( ) {
} ;
/ * *
* Start a transaction .
* Does not support rollback in event of failure .
*
* @ param process { Function } The transaction function
* @ param successCallback { Function }
* @ param errorCallback { Function }
* /
DatabaseShell . prototype . transaction = function ( process , errorCallback , successCallback ) {
var tx = new DroidDB _Tx ( ) ;
tx . successCallback = successCallback ;
tx . errorCallback = errorCallback ;
try {
process ( tx ) ;
} catch ( e ) {
console . log ( "Transaction error: " + e ) ;
if ( tx . errorCallback ) {
try {
tx . errorCallback ( e ) ;
} catch ( ex ) {
console . log ( "Transaction error calling user error callback: " + e ) ;
}
}
}
} ;
/ * *
* Open database
*
* @ param name Database name
* @ param version Database version
* @ param display _name Database display name
* @ param size Database size in bytes
* @ return Database object
* /
var DroidDB _openDatabase = function ( name , version , display _name , size ) {
exec ( null , null , "Storage" , "openDatabase" , [ name , version , display _name , size ] ) ;
var db = new DatabaseShell ( ) ;
return db ;
} ;
2013-02-20 03:53:36 +08:00
module . exports = {
openDatabase : DroidDB _openDatabase ,
failQuery : failQuery ,
completeQuery : completeQuery
} ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/android/plugin/android/storage/openDatabase.js
define ( "cordova/plugin/android/storage/openDatabase" , function ( require , exports , module ) {
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
var modulemapper = require ( 'cordova/modulemapper' ) ,
storage = require ( 'cordova/plugin/android/storage' ) ;
var originalOpenDatabase = modulemapper . getOriginalSymbol ( window , 'openDatabase' ) ;
module . exports = function ( name , version , desc , size ) {
// First patch WebSQL if necessary
if ( ! originalOpenDatabase ) {
// Not defined, create an openDatabase function for all to use!
return storage . openDatabase . apply ( this , arguments ) ;
2012-03-25 02:09:57 +08:00
}
2013-02-20 03:53:36 +08:00
// Defined, but some Android devices will throw a SECURITY_ERR -
// so we wrap the whole thing in a try-catch and shim in our own
// if the device has Android bug 16175.
try {
return originalOpenDatabase ( name , version , desc , size ) ;
} catch ( ex ) {
if ( ex . code !== 18 ) {
throw ex ;
}
}
return storage . openDatabase ( name , version , desc , size ) ;
2012-03-25 02:09:57 +08:00
} ;
2013-02-20 03:53:36 +08:00
} ) ;
// file: lib/android/plugin/android/storage/symbols.js
define ( "cordova/plugin/android/storage/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/android/storage/openDatabase' , 'openDatabase' ) ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/battery.js
define ( "cordova/plugin/battery" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
/ * *
* This class contains information about the current battery status .
* @ constructor
* /
var cordova = require ( 'cordova' ) ,
exec = require ( 'cordova/exec' ) ;
function handlers ( ) {
2012-04-24 02:37:33 +08:00
return battery . channels . batterystatus . numHandlers +
2012-03-25 02:09:57 +08:00
battery . channels . batterylow . numHandlers +
battery . channels . batterycritical . numHandlers ;
}
var Battery = function ( ) {
this . _level = null ;
this . _isPlugged = null ;
// Create new event handlers on the window (returns a channel instance)
this . channels = {
2012-09-19 01:15:24 +08:00
batterystatus : cordova . addWindowEventHandler ( "batterystatus" ) ,
batterylow : cordova . addWindowEventHandler ( "batterylow" ) ,
batterycritical : cordova . addWindowEventHandler ( "batterycritical" )
2012-03-25 02:09:57 +08:00
} ;
2012-09-19 01:15:24 +08:00
for ( var key in this . channels ) {
this . channels [ key ] . onHasSubscribersChange = Battery . onHasSubscribersChange ;
}
2012-03-25 02:09:57 +08:00
} ;
/ * *
* Event handlers for when callbacks get registered for the battery .
* Keep track of how many handlers we have so we can start and stop the native battery listener
* appropriately ( and hopefully save on battery life ! ) .
* /
2012-09-19 01:15:24 +08:00
Battery . onHasSubscribersChange = function ( ) {
2012-03-25 02:09:57 +08:00
// If we just registered the first handler, make sure native listener is started.
2012-09-19 01:15:24 +08:00
if ( this . numHandlers === 1 && handlers ( ) === 1 ) {
exec ( battery . _status , battery . _error , "Battery" , "start" , [ ] ) ;
} else if ( handlers ( ) === 0 ) {
2012-03-25 02:09:57 +08:00
exec ( null , null , "Battery" , "stop" , [ ] ) ;
}
} ;
/ * *
* Callback for battery status
2012-04-24 02:37:33 +08:00
*
* @ param { Object } info keys : level , isPlugged
2012-03-25 02:09:57 +08:00
* /
Battery . prototype . _status = function ( info ) {
2012-04-24 02:37:33 +08:00
if ( info ) {
var me = battery ;
2012-03-25 02:09:57 +08:00
var level = info . level ;
2012-04-24 02:37:33 +08:00
if ( me . _level !== level || me . _isPlugged !== info . isPlugged ) {
// Fire batterystatus event
cordova . fireWindowEvent ( "batterystatus" , info ) ;
// Fire low battery event
if ( level === 20 || level === 5 ) {
if ( level === 20 ) {
cordova . fireWindowEvent ( "batterylow" , info ) ;
}
else {
cordova . fireWindowEvent ( "batterycritical" , info ) ;
}
}
}
me . _level = level ;
me . _isPlugged = info . isPlugged ;
}
2012-03-25 02:09:57 +08:00
} ;
/ * *
* Error callback for battery start
* /
Battery . prototype . _error = function ( e ) {
console . log ( "Error initializing Battery: " + e ) ;
} ;
var battery = new Battery ( ) ;
module . exports = battery ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/battery/symbols.js
define ( "cordova/plugin/battery/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . defaults ( 'cordova/plugin/battery' , 'navigator.battery' ) ;
} ) ;
// file: lib/common/plugin/camera/symbols.js
define ( "cordova/plugin/camera/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . defaults ( 'cordova/plugin/Camera' , 'navigator.camera' ) ;
modulemapper . defaults ( 'cordova/plugin/CameraConstants' , 'Camera' ) ;
modulemapper . defaults ( 'cordova/plugin/CameraPopoverOptions' , 'CameraPopoverOptions' ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/capture.js
define ( "cordova/plugin/capture" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ,
MediaFile = require ( 'cordova/plugin/MediaFile' ) ;
/ * *
* Launches a capture of different types .
*
2012-04-24 02:37:33 +08:00
* @ param ( DOMString } type
2012-03-25 02:09:57 +08:00
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { CaptureVideoOptions } options
* /
function _capture ( type , successCallback , errorCallback , options ) {
var win = function ( pluginResult ) {
var mediaFiles = [ ] ;
var i ;
for ( i = 0 ; i < pluginResult . length ; i ++ ) {
var mediaFile = new MediaFile ( ) ;
mediaFile . name = pluginResult [ i ] . name ;
mediaFile . fullPath = pluginResult [ i ] . fullPath ;
mediaFile . type = pluginResult [ i ] . type ;
mediaFile . lastModifiedDate = pluginResult [ i ] . lastModifiedDate ;
mediaFile . size = pluginResult [ i ] . size ;
mediaFiles . push ( mediaFile ) ;
}
successCallback ( mediaFiles ) ;
} ;
exec ( win , errorCallback , "Capture" , type , [ options ] ) ;
}
/ * *
* The Capture interface exposes an interface to the camera and microphone of the hosting device .
* /
function Capture ( ) {
2012-04-24 02:37:33 +08:00
this . supportedAudioModes = [ ] ;
this . supportedImageModes = [ ] ;
this . supportedVideoModes = [ ] ;
2012-03-25 02:09:57 +08:00
}
/ * *
* Launch audio recorder application for recording audio clip ( s ) .
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { CaptureAudioOptions } options
* /
Capture . prototype . captureAudio = function ( successCallback , errorCallback , options ) {
_capture ( "captureAudio" , successCallback , errorCallback , options ) ;
} ;
/ * *
* Launch camera application for taking image ( s ) .
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { CaptureImageOptions } options
* /
Capture . prototype . captureImage = function ( successCallback , errorCallback , options ) {
_capture ( "captureImage" , successCallback , errorCallback , options ) ;
} ;
/ * *
* Launch device camera application for recording video ( s ) .
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { CaptureVideoOptions } options
* /
Capture . prototype . captureVideo = function ( successCallback , errorCallback , options ) {
_capture ( "captureVideo" , successCallback , errorCallback , options ) ;
} ;
module . exports = new Capture ( ) ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/capture/symbols.js
define ( "cordova/plugin/capture/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/CaptureError' , 'CaptureError' ) ;
modulemapper . clobbers ( 'cordova/plugin/CaptureAudioOptions' , 'CaptureAudioOptions' ) ;
modulemapper . clobbers ( 'cordova/plugin/CaptureImageOptions' , 'CaptureImageOptions' ) ;
modulemapper . clobbers ( 'cordova/plugin/CaptureVideoOptions' , 'CaptureVideoOptions' ) ;
modulemapper . clobbers ( 'cordova/plugin/ConfigurationData' , 'ConfigurationData' ) ;
modulemapper . clobbers ( 'cordova/plugin/MediaFile' , 'MediaFile' ) ;
modulemapper . clobbers ( 'cordova/plugin/MediaFileData' , 'MediaFileData' ) ;
modulemapper . clobbers ( 'cordova/plugin/capture' , 'navigator.device.capture' ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/compass.js
define ( "cordova/plugin/compass" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-11-27 05:09:52 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
exec = require ( 'cordova/exec' ) ,
2012-03-25 02:09:57 +08:00
utils = require ( 'cordova/utils' ) ,
CompassHeading = require ( 'cordova/plugin/CompassHeading' ) ,
CompassError = require ( 'cordova/plugin/CompassError' ) ,
timers = { } ,
compass = {
/ * *
* Asynchronously acquires the current heading .
* @ param { Function } successCallback The function to call when the heading
* data is available
2012-04-24 02:37:33 +08:00
* @ param { Function } errorCallback The function to call when there is an error
2012-03-25 02:09:57 +08:00
* getting the heading data .
* @ param { CompassOptions } options The options for getting the heading data ( not used ) .
* /
2012-04-10 08:11:13 +08:00
getCurrentHeading : function ( successCallback , errorCallback , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'compass.getCurrentHeading' , arguments ) ;
2012-03-25 02:09:57 +08:00
var win = function ( result ) {
var ch = new CompassHeading ( result . magneticHeading , result . trueHeading , result . headingAccuracy , result . timestamp ) ;
successCallback ( ch ) ;
} ;
2012-11-27 05:09:52 +08:00
var fail = errorCallback && function ( code ) {
2012-03-25 02:09:57 +08:00
var ce = new CompassError ( code ) ;
errorCallback ( ce ) ;
2012-04-24 02:37:33 +08:00
} ;
2012-03-25 02:09:57 +08:00
// Get heading
2012-04-10 08:11:13 +08:00
exec ( win , fail , "Compass" , "getHeading" , [ options ] ) ;
2012-03-25 02:09:57 +08:00
} ,
/ * *
* Asynchronously acquires the heading repeatedly at a given interval .
* @ param { Function } successCallback The function to call each time the heading
* data is available
2012-04-24 02:37:33 +08:00
* @ param { Function } errorCallback The function to call when there is an error
2012-03-25 02:09:57 +08:00
* getting the heading data .
* @ param { HeadingOptions } options The options for getting the heading data
2012-04-10 08:11:13 +08:00
* such as timeout and the frequency of the watch . For iOS , filter parameter
* specifies to watch via a distance filter rather than time .
2012-03-25 02:09:57 +08:00
* /
watchHeading : function ( successCallback , errorCallback , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'compass.watchHeading' , arguments ) ;
2012-03-25 02:09:57 +08:00
// Default interval (100 msec)
var frequency = ( options !== undefined && options . frequency !== undefined ) ? options . frequency : 100 ;
2012-04-10 08:11:13 +08:00
var filter = ( options !== undefined && options . filter !== undefined ) ? options . filter : 0 ;
2012-03-25 02:09:57 +08:00
var id = utils . createUUID ( ) ;
2012-04-24 02:37:33 +08:00
if ( filter > 0 ) {
// is an iOS request for watch by filter, no timer needed
timers [ id ] = "iOS" ;
compass . getCurrentHeading ( successCallback , errorCallback , options ) ;
} else {
// Start watch timer to get headings
timers [ id ] = window . setInterval ( function ( ) {
compass . getCurrentHeading ( successCallback , errorCallback ) ;
} , frequency ) ;
}
2012-03-25 02:09:57 +08:00
return id ;
} ,
/ * *
* Clears the specified heading watch .
* @ param { String } watchId The ID of the watch returned from # watchHeading .
* /
clearWatch : function ( id ) {
// Stop javascript timer & remove from timer list
if ( id && timers [ id ] ) {
2012-04-24 02:37:33 +08:00
if ( timers [ id ] != "iOS" ) {
2012-11-27 05:09:52 +08:00
clearInterval ( timers [ id ] ) ;
} else {
2012-04-24 02:37:33 +08:00
// is iOS watch by filter so call into device to stop
exec ( null , null , "Compass" , "stopHeading" , [ ] ) ;
}
delete timers [ id ] ;
2012-03-25 02:09:57 +08:00
}
}
} ;
module . exports = compass ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/compass/symbols.js
define ( "cordova/plugin/compass/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/CompassHeading' , 'CompassHeading' ) ;
modulemapper . clobbers ( 'cordova/plugin/CompassError' , 'CompassError' ) ;
modulemapper . clobbers ( 'cordova/plugin/compass' , 'navigator.compass' ) ;
} ) ;
2012-05-25 00:31:11 +08:00
// file: lib/common/plugin/console-via-logger.js
define ( "cordova/plugin/console-via-logger" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-05-25 00:31:11 +08:00
//------------------------------------------------------------------------------
var logger = require ( "cordova/plugin/logger" ) ;
var utils = require ( "cordova/utils" ) ;
//------------------------------------------------------------------------------
// object that we're exporting
//------------------------------------------------------------------------------
var console = module . exports ;
//------------------------------------------------------------------------------
// copy of the original console object
//------------------------------------------------------------------------------
var WinConsole = window . console ;
//------------------------------------------------------------------------------
// whether to use the logger
//------------------------------------------------------------------------------
var UseLogger = false ;
//------------------------------------------------------------------------------
// Timers
//------------------------------------------------------------------------------
var Timers = { } ;
//------------------------------------------------------------------------------
// used for unimplemented methods
//------------------------------------------------------------------------------
function noop ( ) { }
//------------------------------------------------------------------------------
// used for unimplemented methods
//------------------------------------------------------------------------------
console . useLogger = function ( value ) {
if ( arguments . length ) UseLogger = ! ! value ;
if ( UseLogger ) {
if ( logger . useConsole ( ) ) {
throw new Error ( "console and logger are too intertwingly" ) ;
}
}
return UseLogger ;
} ;
//------------------------------------------------------------------------------
console . log = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . log . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . error = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . error . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . warn = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . warn . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . info = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . info . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . debug = function ( ) {
if ( logger . useConsole ( ) ) return ;
logger . debug . apply ( logger , [ ] . slice . call ( arguments ) ) ;
} ;
//------------------------------------------------------------------------------
console . assert = function ( expression ) {
if ( expression ) return ;
2013-04-19 03:28:00 +08:00
var message = logger . format . apply ( logger . format , [ ] . slice . call ( arguments , 1 ) ) ;
2012-05-25 00:31:11 +08:00
console . log ( "ASSERT: " + message ) ;
} ;
//------------------------------------------------------------------------------
console . clear = function ( ) { } ;
//------------------------------------------------------------------------------
console . dir = function ( object ) {
console . log ( "%o" , object ) ;
} ;
//------------------------------------------------------------------------------
console . dirxml = function ( node ) {
console . log ( node . innerHTML ) ;
} ;
//------------------------------------------------------------------------------
console . trace = noop ;
//------------------------------------------------------------------------------
console . group = console . log ;
//------------------------------------------------------------------------------
console . groupCollapsed = console . log ;
//------------------------------------------------------------------------------
console . groupEnd = noop ;
//------------------------------------------------------------------------------
console . time = function ( name ) {
Timers [ name ] = new Date ( ) . valueOf ( ) ;
} ;
//------------------------------------------------------------------------------
console . timeEnd = function ( name ) {
var timeStart = Timers [ name ] ;
if ( ! timeStart ) {
console . warn ( "unknown timer: " + name ) ;
return ;
}
var timeElapsed = new Date ( ) . valueOf ( ) - timeStart ;
console . log ( name + ": " + timeElapsed + "ms" ) ;
} ;
//------------------------------------------------------------------------------
console . timeStamp = noop ;
//------------------------------------------------------------------------------
console . profile = noop ;
//------------------------------------------------------------------------------
console . profileEnd = noop ;
//------------------------------------------------------------------------------
console . count = noop ;
//------------------------------------------------------------------------------
console . exception = console . log ;
//------------------------------------------------------------------------------
console . table = function ( data , columns ) {
console . log ( "%o" , data ) ;
} ;
//------------------------------------------------------------------------------
// return a new function that calls both functions passed as args
//------------------------------------------------------------------------------
2012-09-29 02:36:36 +08:00
function wrappedOrigCall ( orgFunc , newFunc ) {
2012-05-25 00:31:11 +08:00
return function ( ) {
var args = [ ] . slice . call ( arguments ) ;
try { orgFunc . apply ( WinConsole , args ) ; } catch ( e ) { }
try { newFunc . apply ( console , args ) ; } catch ( e ) { }
} ;
}
//------------------------------------------------------------------------------
// For every function that exists in the original console object, that
// also exists in the new console object, wrap the new console method
// with one that calls both
//------------------------------------------------------------------------------
for ( var key in console ) {
if ( typeof WinConsole [ key ] == "function" ) {
2012-09-29 02:36:36 +08:00
console [ key ] = wrappedOrigCall ( WinConsole [ key ] , console [ key ] ) ;
2012-05-25 00:31:11 +08:00
}
}
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/contacts.js
define ( "cordova/plugin/contacts" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-11-27 05:09:52 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
exec = require ( 'cordova/exec' ) ,
2012-03-25 02:09:57 +08:00
ContactError = require ( 'cordova/plugin/ContactError' ) ,
2012-05-01 04:42:38 +08:00
utils = require ( 'cordova/utils' ) ,
2012-03-25 02:09:57 +08:00
Contact = require ( 'cordova/plugin/Contact' ) ;
/ * *
* Represents a group of Contacts .
* @ constructor
* /
var contacts = {
/ * *
* Returns an array of Contacts matching the search criteria .
* @ param fields that should be searched
* @ param successCB success callback
* @ param errorCB error callback
* @ param { ContactFindOptions } options that can be applied to contact searching
* @ return array of Contacts matching search criteria
* /
find : function ( fields , successCB , errorCB , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'afFO' , 'contacts.find' , arguments ) ;
if ( ! fields . length ) {
errorCB && errorCB ( new ContactError ( ContactError . INVALID _ARGUMENT _ERROR ) ) ;
2012-03-25 02:09:57 +08:00
} else {
var win = function ( result ) {
var cs = [ ] ;
for ( var i = 0 , l = result . length ; i < l ; i ++ ) {
cs . push ( contacts . create ( result [ i ] ) ) ;
}
successCB ( cs ) ;
} ;
exec ( win , errorCB , "Contacts" , "search" , [ fields , options ] ) ;
}
} ,
/ * *
* This function creates a new contact , but it does not persist the contact
* to device storage . To persist the contact to device storage , invoke
* contact . save ( ) .
2012-08-25 04:44:18 +08:00
* @ param properties an object whose properties will be examined to create a new Contact
2012-03-25 02:09:57 +08:00
* @ returns new Contact object
* /
create : function ( properties ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'O' , 'contacts.create' , arguments ) ;
2012-03-25 02:09:57 +08:00
var contact = new Contact ( ) ;
2012-11-27 05:09:52 +08:00
for ( var i in properties ) {
2012-03-25 02:09:57 +08:00
if ( typeof contact [ i ] !== 'undefined' && properties . hasOwnProperty ( i ) ) {
contact [ i ] = properties [ i ] ;
}
}
return contact ;
}
} ;
module . exports = contacts ;
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/contacts/symbols.js
define ( "cordova/plugin/contacts/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/contacts' , 'navigator.contacts' ) ;
modulemapper . clobbers ( 'cordova/plugin/Contact' , 'Contact' ) ;
modulemapper . clobbers ( 'cordova/plugin/ContactAddress' , 'ContactAddress' ) ;
modulemapper . clobbers ( 'cordova/plugin/ContactError' , 'ContactError' ) ;
modulemapper . clobbers ( 'cordova/plugin/ContactField' , 'ContactField' ) ;
modulemapper . clobbers ( 'cordova/plugin/ContactFindOptions' , 'ContactFindOptions' ) ;
modulemapper . clobbers ( 'cordova/plugin/ContactName' , 'ContactName' ) ;
modulemapper . clobbers ( 'cordova/plugin/ContactOrganization' , 'ContactOrganization' ) ;
} ) ;
2012-07-13 04:37:08 +08:00
// file: lib/common/plugin/device.js
define ( "cordova/plugin/device" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-11-27 05:09:52 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
channel = require ( 'cordova/channel' ) ,
2012-07-13 04:37:08 +08:00
utils = require ( 'cordova/utils' ) ,
exec = require ( 'cordova/exec' ) ;
// Tell cordova channel to wait on the CordovaInfoReady event
channel . waitForInitialization ( 'onCordovaInfoReady' ) ;
/ * *
* This represents the mobile device , and provides properties for inspecting the model , version , UUID of the
* phone , etc .
* @ constructor
* /
function Device ( ) {
this . available = false ;
this . platform = null ;
this . version = null ;
this . name = null ;
this . uuid = null ;
this . cordova = null ;
2012-11-23 22:38:49 +08:00
this . model = null ;
2012-07-13 04:37:08 +08:00
var me = this ;
2012-09-19 01:15:24 +08:00
channel . onCordovaReady . subscribe ( function ( ) {
2012-07-13 04:37:08 +08:00
me . getInfo ( function ( info ) {
me . available = true ;
me . platform = info . platform ;
me . version = info . version ;
me . name = info . name ;
me . uuid = info . uuid ;
me . cordova = info . cordova ;
2012-11-23 22:38:49 +08:00
me . model = info . model ;
2012-07-13 04:37:08 +08:00
channel . onCordovaInfoReady . fire ( ) ;
} , function ( e ) {
me . available = false ;
utils . alert ( "[ERROR] Error initializing Cordova: " + e ) ;
} ) ;
} ) ;
}
/ * *
* Get device info
*
* @ param { Function } successCallback The function to call when the heading data is available
* @ param { Function } errorCallback The function to call when there is an error getting the heading data . ( OPTIONAL )
* /
Device . prototype . getInfo = function ( successCallback , errorCallback ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fF' , 'Device.getInfo' , arguments ) ;
2012-07-13 04:37:08 +08:00
exec ( successCallback , errorCallback , "Device" , "getDeviceInfo" , [ ] ) ;
} ;
module . exports = new Device ( ) ;
2012-08-22 21:50:40 +08:00
} ) ;
2013-02-20 03:53:36 +08:00
// file: lib/android/plugin/device/symbols.js
define ( "cordova/plugin/device/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/device' , 'device' ) ;
modulemapper . merges ( 'cordova/plugin/android/device' , 'device' ) ;
} ) ;
2012-08-22 21:50:40 +08:00
// file: lib/common/plugin/echo.js
define ( "cordova/plugin/echo" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2013-03-22 01:35:09 +08:00
var exec = require ( 'cordova/exec' ) ,
utils = require ( 'cordova/utils' ) ;
2012-08-22 21:50:40 +08:00
/ * *
2012-09-29 02:36:36 +08:00
* Sends the given message through exec ( ) to the Echo plugin , which sends it back to the successCallback .
2012-08-22 21:50:40 +08:00
* @ param successCallback invoked with a FileSystem object
* @ param errorCallback invoked if error occurs retrieving file system
* @ param message The string to be echoed .
* @ param forceAsync Whether to force an async return value ( for testing native - > js bridge ) .
* /
module . exports = function ( successCallback , errorCallback , message , forceAsync ) {
2013-03-22 01:35:09 +08:00
var action = 'echo' ;
var messageIsMultipart = ( utils . typeName ( message ) == "Array" ) ;
var args = messageIsMultipart ? message : [ message ] ;
if ( utils . typeName ( message ) == 'ArrayBuffer' ) {
if ( forceAsync ) {
console . warn ( 'Cannot echo ArrayBuffer with forced async, falling back to sync.' ) ;
}
action += 'ArrayBuffer' ;
} else if ( messageIsMultipart ) {
if ( forceAsync ) {
console . warn ( 'Cannot echo MultiPart Array with forced async, falling back to sync.' ) ;
}
action += 'MultiPart' ;
} else if ( forceAsync ) {
action += 'Async' ;
2013-01-19 07:33:38 +08:00
}
2013-03-22 01:35:09 +08:00
exec ( successCallback , errorCallback , "Echo" , action , args ) ;
2012-08-22 21:50:40 +08:00
} ;
2013-01-22 05:47:26 +08:00
} ) ;
// file: lib/android/plugin/file/symbols.js
define ( "cordova/plugin/file/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ,
symbolshelper = require ( 'cordova/plugin/file/symbolshelper' ) ;
symbolshelper ( modulemapper . clobbers ) ;
} ) ;
// file: lib/common/plugin/file/symbolshelper.js
define ( "cordova/plugin/file/symbolshelper" , function ( require , exports , module ) {
module . exports = function ( exportFunc ) {
exportFunc ( 'cordova/plugin/DirectoryEntry' , 'DirectoryEntry' ) ;
exportFunc ( 'cordova/plugin/DirectoryReader' , 'DirectoryReader' ) ;
exportFunc ( 'cordova/plugin/Entry' , 'Entry' ) ;
exportFunc ( 'cordova/plugin/File' , 'File' ) ;
exportFunc ( 'cordova/plugin/FileEntry' , 'FileEntry' ) ;
exportFunc ( 'cordova/plugin/FileError' , 'FileError' ) ;
exportFunc ( 'cordova/plugin/FileReader' , 'FileReader' ) ;
exportFunc ( 'cordova/plugin/FileSystem' , 'FileSystem' ) ;
exportFunc ( 'cordova/plugin/FileUploadOptions' , 'FileUploadOptions' ) ;
exportFunc ( 'cordova/plugin/FileUploadResult' , 'FileUploadResult' ) ;
exportFunc ( 'cordova/plugin/FileWriter' , 'FileWriter' ) ;
exportFunc ( 'cordova/plugin/Flags' , 'Flags' ) ;
exportFunc ( 'cordova/plugin/LocalFileSystem' , 'LocalFileSystem' ) ;
exportFunc ( 'cordova/plugin/Metadata' , 'Metadata' ) ;
2013-02-20 03:53:36 +08:00
exportFunc ( 'cordova/plugin/ProgressEvent' , 'ProgressEvent' ) ;
2013-01-22 05:47:26 +08:00
exportFunc ( 'cordova/plugin/requestFileSystem' , 'requestFileSystem' ) ;
exportFunc ( 'cordova/plugin/resolveLocalFileSystemURI' , 'resolveLocalFileSystemURI' ) ;
} ;
2012-07-13 04:37:08 +08:00
} ) ;
2013-02-21 05:52:29 +08:00
// file: lib/common/plugin/filetransfer/symbols.js
define ( "cordova/plugin/filetransfer/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/FileTransfer' , 'FileTransfer' ) ;
modulemapper . clobbers ( 'cordova/plugin/FileTransferError' , 'FileTransferError' ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/geolocation.js
define ( "cordova/plugin/geolocation" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-11-27 05:09:52 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
utils = require ( 'cordova/utils' ) ,
2012-03-25 02:09:57 +08:00
exec = require ( 'cordova/exec' ) ,
PositionError = require ( 'cordova/plugin/PositionError' ) ,
Position = require ( 'cordova/plugin/Position' ) ;
var timers = { } ; // list of timers in use
// Returns default params, overrides if provided with values
function parseParameters ( options ) {
var opt = {
2012-05-11 06:50:02 +08:00
maximumAge : 0 ,
2012-03-25 02:09:57 +08:00
enableHighAccuracy : false ,
2012-05-11 06:50:02 +08:00
timeout : Infinity
2012-03-25 02:09:57 +08:00
} ;
if ( options ) {
2012-05-11 06:50:02 +08:00
if ( options . maximumAge !== undefined && ! isNaN ( options . maximumAge ) && options . maximumAge > 0 ) {
2012-03-25 02:09:57 +08:00
opt . maximumAge = options . maximumAge ;
}
if ( options . enableHighAccuracy !== undefined ) {
opt . enableHighAccuracy = options . enableHighAccuracy ;
}
2012-05-11 06:50:02 +08:00
if ( options . timeout !== undefined && ! isNaN ( options . timeout ) ) {
if ( options . timeout < 0 ) {
opt . timeout = 0 ;
} else {
opt . timeout = options . timeout ;
}
2012-03-25 02:09:57 +08:00
}
}
return opt ;
}
2012-05-11 06:50:02 +08:00
// Returns a timeout failure, closed over a specified timeout value and error callback.
function createTimeout ( errorCallback , timeout ) {
var t = setTimeout ( function ( ) {
clearTimeout ( t ) ;
t = null ;
errorCallback ( {
code : PositionError . TIMEOUT ,
message : "Position retrieval timed out."
} ) ;
} , timeout ) ;
return t ;
}
2012-03-25 02:09:57 +08:00
var geolocation = {
2012-05-11 06:50:02 +08:00
lastPosition : null , // reference to last known (cached) position returned
2012-03-25 02:09:57 +08:00
/ * *
2012-09-29 02:36:36 +08:00
* Asynchronously acquires the current position .
2012-03-25 02:09:57 +08:00
*
* @ param { Function } successCallback The function to call when the position data is available
* @ param { Function } errorCallback The function to call when there is an error getting the heading position . ( OPTIONAL )
* @ param { PositionOptions } options The options for getting the position data . ( OPTIONAL )
* /
getCurrentPosition : function ( successCallback , errorCallback , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'geolocation.getCurrentPosition' , arguments ) ;
2012-03-25 02:09:57 +08:00
options = parseParameters ( options ) ;
2012-05-11 06:50:02 +08:00
// Timer var that will fire an error callback if no position is retrieved from native
// before the "timeout" param provided expires
2012-09-19 01:15:24 +08:00
var timeoutTimer = { timer : null } ;
2012-05-11 06:50:02 +08:00
2012-03-25 02:09:57 +08:00
var win = function ( p ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timeoutTimer . timer ) ;
if ( ! ( timeoutTimer . timer ) ) {
2012-05-11 06:50:02 +08:00
// Timeout already happened, or native fired error callback for
// this geo request.
// Don't continue with success callback.
return ;
}
var pos = new Position (
2012-03-25 02:09:57 +08:00
{
latitude : p . latitude ,
longitude : p . longitude ,
altitude : p . altitude ,
accuracy : p . accuracy ,
heading : p . heading ,
velocity : p . velocity ,
altitudeAccuracy : p . altitudeAccuracy
} ,
2012-06-06 05:26:02 +08:00
( p . timestamp === undefined ? new Date ( ) : ( ( p . timestamp instanceof Date ) ? p . timestamp : new Date ( p . timestamp ) ) )
2012-05-11 06:50:02 +08:00
) ;
geolocation . lastPosition = pos ;
successCallback ( pos ) ;
2012-03-25 02:09:57 +08:00
} ;
var fail = function ( e ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timeoutTimer . timer ) ;
timeoutTimer . timer = null ;
2012-05-11 06:50:02 +08:00
var err = new PositionError ( e . code , e . message ) ;
if ( errorCallback ) {
errorCallback ( err ) ;
}
2012-03-25 02:09:57 +08:00
} ;
2012-05-11 06:50:02 +08:00
// Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
// fire the success callback with the cached position.
if ( geolocation . lastPosition && options . maximumAge && ( ( ( new Date ( ) ) . getTime ( ) - geolocation . lastPosition . timestamp . getTime ( ) ) <= options . maximumAge ) ) {
successCallback ( geolocation . lastPosition ) ;
// If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
} else if ( options . timeout === 0 ) {
fail ( {
code : PositionError . TIMEOUT ,
2012-08-25 04:44:18 +08:00
message : "timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter."
2012-05-11 06:50:02 +08:00
} ) ;
// Otherwise we have to call into native to retrieve a position.
} else {
if ( options . timeout !== Infinity ) {
// If the timeout value was not set to Infinity (default), then
// set up a timeout function that will fire the error callback
// if no successful position was retrieved before timeout expired.
2012-09-19 01:15:24 +08:00
timeoutTimer . timer = createTimeout ( fail , options . timeout ) ;
2012-05-11 06:50:02 +08:00
} else {
// This is here so the check in the win function doesn't mess stuff up
// may seem weird but this guarantees timeoutTimer is
// always truthy before we call into native
2012-09-19 01:15:24 +08:00
timeoutTimer . timer = true ;
2012-05-11 06:50:02 +08:00
}
exec ( win , fail , "Geolocation" , "getLocation" , [ options . enableHighAccuracy , options . maximumAge ] ) ;
}
return timeoutTimer ;
2012-03-25 02:09:57 +08:00
} ,
/ * *
* Asynchronously watches the geolocation for changes to geolocation . When a change occurs ,
* the successCallback is called with the new location .
*
* @ param { Function } successCallback The function to call each time the location data is available
* @ param { Function } errorCallback The function to call when there is an error getting the location data . ( OPTIONAL )
* @ param { PositionOptions } options The options for getting the location data such as frequency . ( OPTIONAL )
* @ return String The watch id that must be passed to # clearWatch to stop watching .
* /
watchPosition : function ( successCallback , errorCallback , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'geolocation.getCurrentPosition' , arguments ) ;
2012-03-25 02:09:57 +08:00
options = parseParameters ( options ) ;
var id = utils . createUUID ( ) ;
2012-05-11 06:50:02 +08:00
// Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
timers [ id ] = geolocation . getCurrentPosition ( successCallback , errorCallback , options ) ;
var fail = function ( e ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timers [ id ] . timer ) ;
2012-05-11 06:50:02 +08:00
var err = new PositionError ( e . code , e . message ) ;
if ( errorCallback ) {
errorCallback ( err ) ;
}
} ;
var win = function ( p ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timers [ id ] . timer ) ;
2012-05-11 06:50:02 +08:00
if ( options . timeout !== Infinity ) {
2012-09-19 01:15:24 +08:00
timers [ id ] . timer = createTimeout ( fail , options . timeout ) ;
2012-05-11 06:50:02 +08:00
}
var pos = new Position (
{
latitude : p . latitude ,
longitude : p . longitude ,
altitude : p . altitude ,
accuracy : p . accuracy ,
heading : p . heading ,
velocity : p . velocity ,
altitudeAccuracy : p . altitudeAccuracy
} ,
2012-06-06 05:26:02 +08:00
( p . timestamp === undefined ? new Date ( ) : ( ( p . timestamp instanceof Date ) ? p . timestamp : new Date ( p . timestamp ) ) )
2012-05-11 06:50:02 +08:00
) ;
geolocation . lastPosition = pos ;
successCallback ( pos ) ;
} ;
exec ( win , fail , "Geolocation" , "addWatch" , [ id , options . enableHighAccuracy ] ) ;
2012-03-25 02:09:57 +08:00
return id ;
} ,
/ * *
* Clears the specified heading watch .
*
* @ param { String } id The ID of the watch returned from # watchPosition
* /
clearWatch : function ( id ) {
if ( id && timers [ id ] !== undefined ) {
2012-09-19 01:15:24 +08:00
clearTimeout ( timers [ id ] . timer ) ;
timers [ id ] . timer = false ;
2012-05-11 06:50:02 +08:00
exec ( null , null , "Geolocation" , "clearWatch" , [ id ] ) ;
2012-03-25 02:09:57 +08:00
}
}
} ;
module . exports = geolocation ;
2012-05-11 06:50:02 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/geolocation/symbols.js
define ( "cordova/plugin/geolocation/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . defaults ( 'cordova/plugin/geolocation' , 'navigator.geolocation' ) ;
modulemapper . clobbers ( 'cordova/plugin/PositionError' , 'PositionError' ) ;
modulemapper . clobbers ( 'cordova/plugin/Position' , 'Position' ) ;
modulemapper . clobbers ( 'cordova/plugin/Coordinates' , 'Coordinates' ) ;
} ) ;
2012-09-20 02:08:52 +08:00
// file: lib/common/plugin/globalization.js
define ( "cordova/plugin/globalization" , function ( require , exports , module ) {
2012-09-21 11:39:09 +08:00
2012-11-27 05:09:52 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
exec = require ( 'cordova/exec' ) ,
2012-09-20 02:08:52 +08:00
GlobalizationError = require ( 'cordova/plugin/GlobalizationError' ) ;
var globalization = {
2012-09-29 02:36:36 +08:00
/ * *
* Returns the string identifier for the client ' s current language .
* It returns the language identifier string to the successCB callback with a
* properties object as a parameter . If there is an error getting the language ,
* then the errorCB callback is invoked .
*
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . value { String } : The language identifier
*
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . getPreferredLanguage ( function ( language ) { alert ( 'language:' + language . value + '\n' ) ; } ,
* function ( ) { } ) ;
* /
2012-09-20 02:08:52 +08:00
getPreferredLanguage : function ( successCB , failureCB ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fF' , 'Globalization.getPreferredLanguage' , arguments ) ;
2012-09-20 02:08:52 +08:00
exec ( successCB , failureCB , "Globalization" , "getPreferredLanguage" , [ ] ) ;
} ,
/ * *
* Returns the string identifier for the client ' s current locale setting .
* It returns the locale identifier string to the successCB callback with a
* properties object as a parameter . If there is an error getting the locale ,
* then the errorCB callback is invoked .
*
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . value { String } : The locale identifier
*
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . getLocaleName ( function ( locale ) { alert ( 'locale:' + locale . value + '\n' ) ; } ,
* function ( ) { } ) ;
* /
getLocaleName : function ( successCB , failureCB ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fF' , 'Globalization.getLocaleName' , arguments ) ;
2012-09-20 02:08:52 +08:00
exec ( successCB , failureCB , "Globalization" , "getLocaleName" , [ ] ) ;
} ,
/ * *
* Returns a date formatted as a string according to the client ' s user preferences and
* calendar using the time zone of the client . It returns the formatted date string to the
* successCB callback with a properties object as a parameter . If there is an error
* formatting the date , then the errorCB callback is invoked .
*
* The defaults are : formatLenght = "short" and selector = "date and time"
*
* @ param { Date } date
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* formatLength { String } : 'short' , 'medium' , 'long' , or 'full'
* selector { String } : 'date' , 'time' , or 'date and time'
*
* @ return Object . value { String } : The localized date string
*
* @ error GlobalizationError . FORMATTING _ERROR
*
* Example
* globalization . dateToString ( new Date ( ) ,
* function ( date ) { alert ( 'date:' + date . value + '\n' ) ; } ,
* function ( errorCode ) { alert ( errorCode ) ; } ,
* { formatLength : 'short' } ) ;
* /
dateToString : function ( date , successCB , failureCB , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'dfFO' , 'Globalization.dateToString' , arguments ) ;
var dateValue = date . valueOf ( ) ;
exec ( successCB , failureCB , "Globalization" , "dateToString" , [ { "date" : dateValue , "options" : options } ] ) ;
2012-09-20 02:08:52 +08:00
} ,
/ * *
* Parses a date formatted as a string according to the client ' s user
* preferences and calendar using the time zone of the client and returns
* the corresponding date object . It returns the date to the successCB
* callback with a properties object as a parameter . If there is an error
* parsing the date string , then the errorCB callback is invoked .
*
* The defaults are : formatLength = "short" and selector = "date and time"
*
* @ param { String } dateString
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* formatLength { String } : 'short' , 'medium' , 'long' , or 'full'
* selector { String } : 'date' , 'time' , or 'date and time'
*
* @ return Object . year { Number } : The four digit year
* Object . month { Number } : The month from ( 0 - 11 )
* Object . day { Number } : The day from ( 1 - 31 )
* Object . hour { Number } : The hour from ( 0 - 23 )
* Object . minute { Number } : The minute from ( 0 - 59 )
* Object . second { Number } : The second from ( 0 - 59 )
* Object . millisecond { Number } : The milliseconds ( from 0 - 999 ) ,
* not available on all platforms
*
* @ error GlobalizationError . PARSING _ERROR
*
* Example
* globalization . stringToDate ( '4/11/2011' ,
* function ( date ) { alert ( 'Month:' + date . month + '\n' +
* 'Day:' + date . day + '\n' +
* 'Year:' + date . year + '\n' ) ; } ,
* function ( errorCode ) { alert ( errorCode ) ; } ,
* { selector : 'date' } ) ;
* /
stringToDate : function ( dateString , successCB , failureCB , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'sfFO' , 'Globalization.stringToDate' , arguments ) ;
exec ( successCB , failureCB , "Globalization" , "stringToDate" , [ { "dateString" : dateString , "options" : options } ] ) ;
2012-09-20 02:08:52 +08:00
} ,
/ * *
* Returns a pattern string for formatting and parsing dates according to the client ' s
* user preferences . It returns the pattern to the successCB callback with a
* properties object as a parameter . If there is an error obtaining the pattern ,
* then the errorCB callback is invoked .
*
* The defaults are : formatLength = "short" and selector = "date and time"
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* formatLength { String } : 'short' , 'medium' , 'long' , or 'full'
* selector { String } : 'date' , 'time' , or 'date and time'
*
* @ return Object . pattern { String } : The date and time pattern for formatting and parsing dates .
* The patterns follow Unicode Technical Standard # 35
* http : //unicode.org/reports/tr35/tr35-4.html
* Object . timezone { String } : The abbreviated name of the time zone on the client
* Object . utc _offset { Number } : The current difference in seconds between the client ' s
* time zone and coordinated universal time .
* Object . dst _offset { Number } : The current daylight saving time offset in seconds
* between the client 's non-daylight saving' s time zone
* and the client 's daylight saving' s time zone .
*
* @ error GlobalizationError . PATTERN _ERROR
*
* Example
* globalization . getDatePattern (
* function ( date ) { alert ( 'pattern:' + date . pattern + '\n' ) ; } ,
* function ( ) { } ,
* { formatLength : 'short' } ) ;
* /
getDatePattern : function ( successCB , failureCB , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'Globalization.getDatePattern' , arguments ) ;
2012-09-20 02:08:52 +08:00
exec ( successCB , failureCB , "Globalization" , "getDatePattern" , [ { "options" : options } ] ) ;
} ,
/ * *
* Returns an array of either the names of the months or days of the week
* according to the client ' s user preferences and calendar . It returns the array of names to the
* successCB callback with a properties object as a parameter . If there is an error obtaining the
* names , then the errorCB callback is invoked .
*
* The defaults are : type = "wide" and item = "months"
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* type { String } : 'narrow' or 'wide'
* item { String } : 'months' , or 'days'
*
* @ return Object . value { Array { String } } : The array of names starting from either
* the first month in the year or the
* first day of the week .
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . getDateNames ( function ( names ) {
* for ( var i = 0 ; i < names . value . length ; i ++ ) {
* alert ( 'Month:' + names . value [ i ] + '\n' ) ; } } ,
* function ( ) { } ) ;
* /
getDateNames : function ( successCB , failureCB , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'Globalization.getDateNames' , arguments ) ;
2012-09-20 02:08:52 +08:00
exec ( successCB , failureCB , "Globalization" , "getDateNames" , [ { "options" : options } ] ) ;
} ,
/ * *
* Returns whether daylight savings time is in effect for a given date using the client ' s
* time zone and calendar . It returns whether or not daylight savings time is in effect
* to the successCB callback with a properties object as a parameter . If there is an error
* reading the date , then the errorCB callback is invoked .
*
* @ param { Date } date
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . dst { Boolean } : The value "true" indicates that daylight savings time is
* in effect for the given date and "false" indicate that it is not .
*
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . isDayLightSavingsTime ( new Date ( ) ,
* function ( date ) { alert ( 'dst:' + date . dst + '\n' ) ; }
* function ( ) { } ) ;
* /
isDayLightSavingsTime : function ( date , successCB , failureCB ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'dfF' , 'Globalization.isDayLightSavingsTime' , arguments ) ;
var dateValue = date . valueOf ( ) ;
exec ( successCB , failureCB , "Globalization" , "isDayLightSavingsTime" , [ { "date" : dateValue } ] ) ;
2012-09-20 02:08:52 +08:00
} ,
/ * *
* Returns the first day of the week according to the client ' s user preferences and calendar .
* The days of the week are numbered starting from 1 where 1 is considered to be Sunday .
* It returns the day to the successCB callback with a properties object as a parameter .
* If there is an error obtaining the pattern , then the errorCB callback is invoked .
*
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . value { Number } : The number of the first day of the week .
*
* @ error GlobalizationError . UNKNOWN _ERROR
*
* Example
* globalization . getFirstDayOfWeek ( function ( day )
* { alert ( 'Day:' + day . value + '\n' ) ; } ,
* function ( ) { } ) ;
* /
getFirstDayOfWeek : function ( successCB , failureCB ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fF' , 'Globalization.getFirstDayOfWeek' , arguments ) ;
2012-09-20 02:08:52 +08:00
exec ( successCB , failureCB , "Globalization" , "getFirstDayOfWeek" , [ ] ) ;
} ,
/ * *
* Returns a number formatted as a string according to the client ' s user preferences .
* It returns the formatted number string to the successCB callback with a properties object as a
* parameter . If there is an error formatting the number , then the errorCB callback is invoked .
*
* The defaults are : type = "decimal"
*
* @ param { Number } number
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* type { String } : 'decimal' , "percent" , or 'currency'
*
* @ return Object . value { String } : The formatted number string .
*
* @ error GlobalizationError . FORMATTING _ERROR
*
* Example
* globalization . numberToString ( 3.25 ,
* function ( number ) { alert ( 'number:' + number . value + '\n' ) ; } ,
* function ( ) { } ,
* { type : 'decimal' } ) ;
* /
numberToString : function ( number , successCB , failureCB , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'nfFO' , 'Globalization.numberToString' , arguments ) ;
exec ( successCB , failureCB , "Globalization" , "numberToString" , [ { "number" : number , "options" : options } ] ) ;
2012-09-20 02:08:52 +08:00
} ,
/ * *
* Parses a number formatted as a string according to the client ' s user preferences and
* returns the corresponding number . It returns the number to the successCB callback with a
* properties object as a parameter . If there is an error parsing the number string , then
* the errorCB callback is invoked .
*
* The defaults are : type = "decimal"
*
* @ param { String } numberString
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* type { String } : 'decimal' , "percent" , or 'currency'
*
* @ return Object . value { Number } : The parsed number .
*
* @ error GlobalizationError . PARSING _ERROR
*
* Example
* globalization . stringToNumber ( '1234.56' ,
* function ( number ) { alert ( 'Number:' + number . value + '\n' ) ; } ,
* function ( ) { alert ( 'Error parsing number' ) ; } ) ;
* /
stringToNumber : function ( numberString , successCB , failureCB , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'sfFO' , 'Globalization.stringToNumber' , arguments ) ;
exec ( successCB , failureCB , "Globalization" , "stringToNumber" , [ { "numberString" : numberString , "options" : options } ] ) ;
2012-09-20 02:08:52 +08:00
} ,
/ * *
* Returns a pattern string for formatting and parsing numbers according to the client ' s user
* preferences . It returns the pattern to the successCB callback with a properties object as a
* parameter . If there is an error obtaining the pattern , then the errorCB callback is invoked .
*
* The defaults are : type = "decimal"
*
* @ param { Function } successCB
* @ param { Function } errorCB
* @ param { Object } options { optional }
* type { String } : 'decimal' , "percent" , or 'currency'
*
* @ return Object . pattern { String } : The number pattern for formatting and parsing numbers .
* The patterns follow Unicode Technical Standard # 35.
* http : //unicode.org/reports/tr35/tr35-4.html
* Object . symbol { String } : The symbol to be used when formatting and parsing
* e . g . , percent or currency symbol .
* Object . fraction { Number } : The number of fractional digits to use when parsing and
* formatting numbers .
* Object . rounding { Number } : The rounding increment to use when parsing and formatting .
* Object . positive { String } : The symbol to use for positive numbers when parsing and formatting .
* Object . negative : { String } : The symbol to use for negative numbers when parsing and formatting .
* Object . decimal : { String } : The decimal symbol to use for parsing and formatting .
* Object . grouping : { String } : The grouping symbol to use for parsing and formatting .
*
* @ error GlobalizationError . PATTERN _ERROR
*
* Example
* globalization . getNumberPattern (
* function ( pattern ) { alert ( 'Pattern:' + pattern . pattern + '\n' ) ; } ,
* function ( ) { } ) ;
* /
getNumberPattern : function ( successCB , failureCB , options ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'fFO' , 'Globalization.getNumberPattern' , arguments ) ;
2012-09-20 02:08:52 +08:00
exec ( successCB , failureCB , "Globalization" , "getNumberPattern" , [ { "options" : options } ] ) ;
} ,
/ * *
* Returns a pattern string for formatting and parsing currency values according to the client ' s
* user preferences and ISO 4217 currency code . It returns the pattern to the successCB callback with a
* properties object as a parameter . If there is an error obtaining the pattern , then the errorCB
* callback is invoked .
*
* @ param { String } currencyCode
* @ param { Function } successCB
* @ param { Function } errorCB
*
* @ return Object . pattern { String } : The currency pattern for formatting and parsing currency values .
* The patterns follow Unicode Technical Standard # 35
* http : //unicode.org/reports/tr35/tr35-4.html
* Object . code { String } : The ISO 4217 currency code for the pattern .
* Object . fraction { Number } : The number of fractional digits to use when parsing and
* formatting currency .
* Object . rounding { Number } : The rounding increment to use when parsing and formatting .
* Object . decimal : { String } : The decimal symbol to use for parsing and formatting .
* Object . grouping : { String } : The grouping symbol to use for parsing and formatting .
*
* @ error GlobalizationError . FORMATTING _ERROR
*
* Example
* globalization . getCurrencyPattern ( 'EUR' ,
* function ( currency ) { alert ( 'Pattern:' + currency . pattern + '\n' ) ; }
* function ( ) { } ) ;
* /
getCurrencyPattern : function ( currencyCode , successCB , failureCB ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'sfF' , 'Globalization.getCurrencyPattern' , arguments ) ;
exec ( successCB , failureCB , "Globalization" , "getCurrencyPattern" , [ { "currencyCode" : currencyCode } ] ) ;
2012-09-20 02:08:52 +08:00
}
} ;
module . exports = globalization ;
} ) ;
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/globalization/symbols.js
define ( "cordova/plugin/globalization/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/globalization' , 'navigator.globalization' ) ;
modulemapper . clobbers ( 'cordova/plugin/GlobalizationError' , 'GlobalizationError' ) ;
} ) ;
// file: lib/android/plugin/inappbrowser/symbols.js
define ( "cordova/plugin/inappbrowser/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/InAppBrowser' , 'open' ) ;
} ) ;
2012-05-25 00:31:11 +08:00
// file: lib/common/plugin/logger.js
define ( "cordova/plugin/logger" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-05-25 00:31:11 +08:00
//------------------------------------------------------------------------------
// The logger module exports the following properties/functions:
//
// LOG - constant for the level LOG
// ERROR - constant for the level ERROR
// WARN - constant for the level WARN
// INFO - constant for the level INFO
// DEBUG - constant for the level DEBUG
// logLevel() - returns current log level
// logLevel(value) - sets and returns a new log level
// useConsole() - returns whether logger is using console
// useConsole(value) - sets and returns whether logger is using console
// log(message,...) - logs a message at level LOG
// error(message,...) - logs a message at level ERROR
// warn(message,...) - logs a message at level WARN
// info(message,...) - logs a message at level INFO
// debug(message,...) - logs a message at level DEBUG
// logLevel(level,message,...) - logs a message specified level
//
//------------------------------------------------------------------------------
var logger = exports ;
var exec = require ( 'cordova/exec' ) ;
var utils = require ( 'cordova/utils' ) ;
var UseConsole = true ;
var Queued = [ ] ;
var DeviceReady = false ;
var CurrentLevel ;
/ * *
* Logging levels
* /
var Levels = [
"LOG" ,
"ERROR" ,
"WARN" ,
"INFO" ,
"DEBUG"
] ;
/ *
* add the logging levels to the logger object and
* to a separate levelsMap object for testing
* /
var LevelsMap = { } ;
for ( var i = 0 ; i < Levels . length ; i ++ ) {
var level = Levels [ i ] ;
LevelsMap [ level ] = i ;
logger [ level ] = level ;
}
CurrentLevel = LevelsMap . WARN ;
/ * *
* Getter / Setter for the logging level
*
* Returns the current logging level .
*
* When a value is passed , sets the logging level to that value .
* The values should be one of the following constants :
* logger . LOG
* logger . ERROR
* logger . WARN
* logger . INFO
* logger . DEBUG
*
* The value used determines which messages get printed . The logging
* values above are in order , and only messages logged at the logging
2012-08-25 04:44:18 +08:00
* level or above will actually be displayed to the user . E . g . , the
2012-05-25 00:31:11 +08:00
* default level is WARN , so only messages logged with LOG , ERROR , or
* WARN will be displayed ; INFO and DEBUG messages will be ignored .
* /
logger . level = function ( value ) {
if ( arguments . length ) {
if ( LevelsMap [ value ] === null ) {
throw new Error ( "invalid logging level: " + value ) ;
}
CurrentLevel = LevelsMap [ value ] ;
}
return Levels [ CurrentLevel ] ;
} ;
/ * *
* Getter / Setter for the useConsole functionality
*
* When useConsole is true , the logger will log via the
* browser 'console' object . Otherwise , it will use the
* native Logger plugin .
* /
logger . useConsole = function ( value ) {
if ( arguments . length ) UseConsole = ! ! value ;
if ( UseConsole ) {
if ( typeof console == "undefined" ) {
throw new Error ( "global console object is not defined" ) ;
}
if ( typeof console . log != "function" ) {
throw new Error ( "global console object does not have a log function" ) ;
}
if ( typeof console . useLogger == "function" ) {
if ( console . useLogger ( ) ) {
throw new Error ( "console and logger are too intertwingly" ) ;
}
}
}
return UseConsole ;
} ;
/ * *
* Logs a message at the LOG level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . log = function ( message ) { logWithArgs ( "LOG" , arguments ) ; } ;
/ * *
* Logs a message at the ERROR level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . error = function ( message ) { logWithArgs ( "ERROR" , arguments ) ; } ;
/ * *
* Logs a message at the WARN level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . warn = function ( message ) { logWithArgs ( "WARN" , arguments ) ; } ;
/ * *
* Logs a message at the INFO level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . info = function ( message ) { logWithArgs ( "INFO" , arguments ) ; } ;
/ * *
* Logs a message at the DEBUG level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
logger . debug = function ( message ) { logWithArgs ( "DEBUG" , arguments ) ; } ;
// log at the specified level with args
function logWithArgs ( level , args ) {
args = [ level ] . concat ( [ ] . slice . call ( args ) ) ;
logger . logLevel . apply ( logger , args ) ;
}
/ * *
* Logs a message at the specified level .
*
* Parameters passed after message are used applied to
* the message with utils . format ( )
* /
2013-04-19 03:28:00 +08:00
logger . logLevel = function ( level /* , ... */ ) {
2012-05-25 00:31:11 +08:00
// format the message with the parameters
2013-04-19 03:28:00 +08:00
var formatArgs = [ ] . slice . call ( arguments , 1 ) ;
var message = logger . format . apply ( logger . format , formatArgs ) ;
2012-05-25 00:31:11 +08:00
if ( LevelsMap [ level ] === null ) {
throw new Error ( "invalid logging level: " + level ) ;
}
if ( LevelsMap [ level ] > CurrentLevel ) return ;
// queue the message if not yet at deviceready
if ( ! DeviceReady && ! UseConsole ) {
Queued . push ( [ level , message ] ) ;
return ;
}
// if not using the console, use the native logger
if ( ! UseConsole ) {
exec ( null , null , "Logger" , "logLevel" , [ level , message ] ) ;
return ;
}
// make sure console is not using logger
if ( console . _ _usingCordovaLogger ) {
throw new Error ( "console and logger are too intertwingly" ) ;
}
// log to the console
switch ( level ) {
case logger . LOG : console . log ( message ) ; break ;
case logger . ERROR : console . log ( "ERROR: " + message ) ; break ;
case logger . WARN : console . log ( "WARN: " + message ) ; break ;
case logger . INFO : console . log ( "INFO: " + message ) ; break ;
case logger . DEBUG : console . log ( "DEBUG: " + message ) ; break ;
}
} ;
2013-04-19 03:28:00 +08:00
/ * *
* Formats a string and arguments following it ala console . log ( )
*
* Any remaining arguments will be appended to the formatted string .
*
* for rationale , see FireBug ' s Console API :
* http : //getfirebug.com/wiki/index.php/Console_API
* /
logger . format = function ( formatString , args ) {
return _ _format ( arguments [ 0 ] , [ ] . slice . call ( arguments , 1 ) ) . join ( ' ' ) ;
} ;
//------------------------------------------------------------------------------
/ * *
* Formats a string and arguments following it ala vsprintf ( )
*
* format chars :
* % j - format arg as JSON
* % o - format arg as JSON
* % c - format arg as ''
* % % - replace with '%'
* any other char following % will format it ' s
* arg via toString ( ) .
*
* Returns an array containing the formatted string and any remaining
* arguments .
* /
function _ _format ( formatString , args ) {
if ( formatString === null || formatString === undefined ) return [ "" ] ;
if ( arguments . length == 1 ) return [ formatString . toString ( ) ] ;
if ( typeof formatString != "string" )
formatString = formatString . toString ( ) ;
var pattern = /(.*?)%(.)(.*)/ ;
var rest = formatString ;
var result = [ ] ;
while ( args . length ) {
var match = pattern . exec ( rest ) ;
if ( ! match ) break ;
var arg = args . shift ( ) ;
rest = match [ 3 ] ;
result . push ( match [ 1 ] ) ;
if ( match [ 2 ] == '%' ) {
result . push ( '%' ) ;
args . unshift ( arg ) ;
continue ;
}
result . push ( _ _formatted ( arg , match [ 2 ] ) ) ;
}
result . push ( rest ) ;
var remainingArgs = [ ] . slice . call ( args ) ;
remainingArgs . unshift ( result . join ( '' ) ) ;
return remainingArgs ;
}
function _ _formatted ( object , formatChar ) {
try {
switch ( formatChar ) {
case 'j' :
case 'o' : return JSON . stringify ( object ) ;
case 'c' : return '' ;
}
}
catch ( e ) {
return "error JSON.stringify()ing argument: " + e ;
}
if ( ( object === null ) || ( object === undefined ) ) {
return Object . prototype . toString . call ( object ) ;
}
return object . toString ( ) ;
}
//------------------------------------------------------------------------------
2012-05-25 00:31:11 +08:00
// when deviceready fires, log queued messages
logger . _ _onDeviceReady = function ( ) {
if ( DeviceReady ) return ;
DeviceReady = true ;
for ( var i = 0 ; i < Queued . length ; i ++ ) {
var messageArgs = Queued [ i ] ;
logger . logLevel ( messageArgs [ 0 ] , messageArgs [ 1 ] ) ;
}
Queued = null ;
} ;
// add a deviceready event to log queued messages
document . addEventListener ( "deviceready" , logger . _ _onDeviceReady , false ) ;
} ) ;
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/logger/symbols.js
define ( "cordova/plugin/logger/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/logger' , 'cordova.logger' ) ;
} ) ;
// file: lib/android/plugin/media/symbols.js
define ( "cordova/plugin/media/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . defaults ( 'cordova/plugin/Media' , 'Media' ) ;
modulemapper . clobbers ( 'cordova/plugin/MediaError' , 'MediaError' ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/network.js
define ( "cordova/plugin/network" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ,
cordova = require ( 'cordova' ) ,
2012-09-19 01:15:24 +08:00
channel = require ( 'cordova/channel' ) ,
utils = require ( 'cordova/utils' ) ;
// Link the onLine property with the Cordova-supplied network info.
// This works because we clobber the naviagtor object with our own
// object in bootstrap.js.
if ( typeof navigator != 'undefined' ) {
utils . defineGetter ( navigator , 'onLine' , function ( ) {
return this . connection . type != 'none' ;
} ) ;
}
2012-03-25 02:09:57 +08:00
2012-11-23 22:38:49 +08:00
function NetworkConnection ( ) {
this . type = 'unknown' ;
}
2012-03-25 02:09:57 +08:00
/ * *
* Get connection info
*
* @ param { Function } successCallback The function to call when the Connection data is available
* @ param { Function } errorCallback The function to call when there is an error getting the Connection data . ( OPTIONAL )
* /
2012-11-23 22:38:49 +08:00
NetworkConnection . prototype . getInfo = function ( successCallback , errorCallback ) {
2012-03-29 04:47:45 +08:00
exec ( successCallback , errorCallback , "NetworkStatus" , "getConnectionInfo" , [ ] ) ;
2012-03-25 02:09:57 +08:00
} ;
2012-11-23 22:38:49 +08:00
var me = new NetworkConnection ( ) ;
var timerId = null ;
var timeout = 500 ;
channel . onCordovaReady . subscribe ( function ( ) {
me . getInfo ( function ( info ) {
me . type = info ;
if ( info === "none" ) {
// set a timer if still offline at the end of timer send the offline event
timerId = setTimeout ( function ( ) {
cordova . fireDocumentEvent ( "offline" ) ;
timerId = null ;
} , timeout ) ;
} else {
// If there is a current offline event pending clear it
if ( timerId !== null ) {
clearTimeout ( timerId ) ;
timerId = null ;
}
cordova . fireDocumentEvent ( "online" ) ;
}
// should only fire this once
if ( channel . onCordovaConnectionReady . state !== 2 ) {
channel . onCordovaConnectionReady . fire ( ) ;
}
} ,
function ( e ) {
// If we can't get the network info we should still tell Cordova
// to fire the deviceready event.
if ( channel . onCordovaConnectionReady . state !== 2 ) {
channel . onCordovaConnectionReady . fire ( ) ;
}
console . log ( "Error initializing Network Connection: " + e ) ;
} ) ;
} ) ;
module . exports = me ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/networkstatus/symbols.js
define ( "cordova/plugin/networkstatus/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/network' , 'navigator.network.connection' , 'navigator.network.connection is deprecated. Use navigator.connection instead.' ) ;
modulemapper . clobbers ( 'cordova/plugin/network' , 'navigator.connection' ) ;
modulemapper . defaults ( 'cordova/plugin/Connection' , 'Connection' ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/notification.js
define ( "cordova/plugin/notification" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-03-25 02:09:57 +08:00
var exec = require ( 'cordova/exec' ) ;
2013-03-22 01:35:09 +08:00
var platform = require ( 'cordova/platform' ) ;
2012-03-25 02:09:57 +08:00
/ * *
* Provides access to notifications on the device .
* /
module . exports = {
/ * *
* Open a native alert dialog , with a customizable title and button text .
*
* @ param { String } message Message to print in the body of the alert
* @ param { Function } completeCallback The callback that is called when user clicks on a button .
* @ param { String } title Title of the alert dialog ( default : Alert )
* @ param { String } buttonLabel Label of the close button ( default : OK )
* /
alert : function ( message , completeCallback , title , buttonLabel ) {
var _title = ( title || "Alert" ) ;
var _buttonLabel = ( buttonLabel || "OK" ) ;
exec ( completeCallback , null , "Notification" , "alert" , [ message , _title , _buttonLabel ] ) ;
} ,
/ * *
* Open a native confirm dialog , with a customizable title and button text .
* The result that the user selects is returned to the result callback .
*
* @ param { String } message Message to print in the body of the alert
* @ param { Function } resultCallback The callback that is called when user clicks on a button .
* @ param { String } title Title of the alert dialog ( default : Confirm )
2013-03-22 01:35:09 +08:00
* @ param { Array } buttonLabels Array of the labels of the buttons ( default : [ 'OK' , 'Cancel' ] )
2012-03-25 02:09:57 +08:00
* /
confirm : function ( message , resultCallback , title , buttonLabels ) {
var _title = ( title || "Confirm" ) ;
2013-03-22 01:35:09 +08:00
var _buttonLabels = ( buttonLabels || [ "OK" , "Cancel" ] ) ;
// Strings are deprecated!
if ( typeof _buttonLabels === 'string' ) {
console . log ( "Notification.confirm(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)." ) ;
}
2013-04-19 03:28:00 +08:00
// Some platforms take an array of button label names.
2013-03-22 01:35:09 +08:00
// Other platforms take a comma separated list.
// For compatibility, we convert to the desired type based on the platform.
2013-04-19 03:28:00 +08:00
if ( platform . id == "android" || platform . id == "ios" || platform . id == "windowsphone" ) {
2013-03-22 01:35:09 +08:00
if ( typeof _buttonLabels === 'string' ) {
var buttonLabelString = _buttonLabels ;
2013-04-19 03:28:00 +08:00
_buttonLabels = _buttonLabels . split ( "," ) ; // not crazy about changing the var type here
2013-03-22 01:35:09 +08:00
}
} else {
if ( Array . isArray ( _buttonLabels ) ) {
var buttonLabelArray = _buttonLabels ;
_buttonLabels = buttonLabelArray . toString ( ) ;
}
}
2012-03-25 02:09:57 +08:00
exec ( resultCallback , null , "Notification" , "confirm" , [ message , _title , _buttonLabels ] ) ;
} ,
2013-03-22 01:35:09 +08:00
/ * *
* Open a native prompt dialog , with a customizable title and button text .
* The following results are returned to the result callback :
* buttonIndex Index number of the button selected .
* input1 The text entered in the prompt dialog box .
*
* @ param { String } message Dialog message to display ( default : "Prompt message" )
* @ param { Function } resultCallback The callback that is called when user clicks on a button .
* @ param { String } title Title of the dialog ( default : "Prompt" )
* @ param { Array } buttonLabels Array of strings for the button labels ( default : [ "OK" , "Cancel" ] )
* /
prompt : function ( message , resultCallback , title , buttonLabels ) {
var _message = ( message || "Prompt message" ) ;
var _title = ( title || "Prompt" ) ;
var _buttonLabels = ( buttonLabels || [ "OK" , "Cancel" ] ) ;
exec ( resultCallback , null , "Notification" , "prompt" , [ _message , _title , _buttonLabels ] ) ;
} ,
2012-03-25 02:09:57 +08:00
/ * *
* Causes the device to vibrate .
*
2012-11-27 05:09:52 +08:00
* @ param { Integer } mills The number of milliseconds to vibrate for .
2012-03-25 02:09:57 +08:00
* /
2012-11-27 05:09:52 +08:00
vibrate : function ( mills ) {
exec ( null , null , "Notification" , "vibrate" , [ mills ] ) ;
2012-03-25 02:09:57 +08:00
} ,
/ * *
* Causes the device to beep .
* On Android , the default notification ringtone is played "count" times .
*
* @ param { Integer } count The number of beeps .
* /
beep : function ( count ) {
exec ( null , null , "Notification" , "beep" , [ count ] ) ;
}
} ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2013-02-20 03:53:36 +08:00
// file: lib/android/plugin/notification/symbols.js
define ( "cordova/plugin/notification/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/notification' , 'navigator.notification' ) ;
modulemapper . merges ( 'cordova/plugin/android/notification' , 'navigator.notification' ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/requestFileSystem.js
define ( "cordova/plugin/requestFileSystem" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-11-27 05:09:52 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
FileError = require ( 'cordova/plugin/FileError' ) ,
2012-03-25 02:09:57 +08:00
FileSystem = require ( 'cordova/plugin/FileSystem' ) ,
exec = require ( 'cordova/exec' ) ;
/ * *
* Request a file system in which to store application data .
* @ param type local file system type
* @ param size indicates how much storage space , in bytes , the application expects to need
* @ param successCallback invoked with a FileSystem object
* @ param errorCallback invoked if error occurs retrieving file system
* /
var requestFileSystem = function ( type , size , successCallback , errorCallback ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'nnFF' , 'requestFileSystem' , arguments ) ;
2012-03-25 02:09:57 +08:00
var fail = function ( code ) {
2012-11-27 05:09:52 +08:00
errorCallback && errorCallback ( new FileError ( code ) ) ;
2012-03-25 02:09:57 +08:00
} ;
if ( type < 0 || type > 3 ) {
fail ( FileError . SYNTAX _ERR ) ;
} else {
// if successful, return a FileSystem object
var success = function ( file _system ) {
if ( file _system ) {
2012-11-27 05:09:52 +08:00
if ( successCallback ) {
2012-03-25 02:09:57 +08:00
// grab the name and root from the file system object
var result = new FileSystem ( file _system . name , file _system . root ) ;
successCallback ( result ) ;
}
}
else {
// no FileSystem object returned
fail ( FileError . NOT _FOUND _ERR ) ;
}
} ;
exec ( success , fail , "File" , "requestFileSystem" , [ type , size ] ) ;
}
} ;
module . exports = requestFileSystem ;
2012-09-19 01:15:24 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/plugin/resolveLocalFileSystemURI.js
define ( "cordova/plugin/resolveLocalFileSystemURI" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-11-27 05:09:52 +08:00
var argscheck = require ( 'cordova/argscheck' ) ,
DirectoryEntry = require ( 'cordova/plugin/DirectoryEntry' ) ,
2012-03-25 02:09:57 +08:00
FileEntry = require ( 'cordova/plugin/FileEntry' ) ,
2012-04-24 02:37:33 +08:00
FileError = require ( 'cordova/plugin/FileError' ) ,
2012-03-25 02:09:57 +08:00
exec = require ( 'cordova/exec' ) ;
2012-02-18 07:28:35 +08:00
/ * *
2012-03-25 02:09:57 +08:00
* Look up file system Entry referred to by local URI .
* @ param { DOMString } uri URI referring to a local file or directory
* @ param successCallback invoked with Entry object corresponding to URI
* @ param errorCallback invoked if error occurs retrieving file system entry
2012-02-18 07:28:35 +08:00
* /
2012-03-25 02:09:57 +08:00
module . exports = function ( uri , successCallback , errorCallback ) {
2012-11-27 05:09:52 +08:00
argscheck . checkArgs ( 'sFF' , 'resolveLocalFileSystemURI' , arguments ) ;
2012-03-25 02:09:57 +08:00
// error callback
var fail = function ( error ) {
2012-11-27 05:09:52 +08:00
errorCallback && errorCallback ( new FileError ( error ) ) ;
2012-03-25 02:09:57 +08:00
} ;
2012-05-25 09:39:45 +08:00
// sanity check for 'not:valid:filename'
if ( ! uri || uri . split ( ":" ) . length > 2 ) {
setTimeout ( function ( ) {
fail ( FileError . ENCODING _ERR ) ;
} , 0 ) ;
return ;
}
2012-03-25 02:09:57 +08:00
// if successful, return either a file or directory entry
var success = function ( entry ) {
var result ;
if ( entry ) {
2012-11-27 05:09:52 +08:00
if ( successCallback ) {
2012-03-25 02:09:57 +08:00
// create appropriate Entry object
result = ( entry . isDirectory ) ? new DirectoryEntry ( entry . name , entry . fullPath ) : new FileEntry ( entry . name , entry . fullPath ) ;
2012-11-27 05:09:52 +08:00
successCallback ( result ) ;
2012-02-18 07:28:35 +08:00
}
}
2012-03-25 02:09:57 +08:00
else {
// no Entry object returned
fail ( FileError . NOT _FOUND _ERR ) ;
}
} ;
2012-02-18 07:28:35 +08:00
2012-03-25 02:09:57 +08:00
exec ( success , fail , "File" , "resolveLocalFileSystemURI" , [ uri ] ) ;
2012-02-18 07:28:35 +08:00
} ;
2012-04-10 08:11:13 +08:00
} ) ;
2012-02-18 07:28:35 +08:00
2012-05-11 06:50:02 +08:00
// file: lib/common/plugin/splashscreen.js
define ( "cordova/plugin/splashscreen" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-05-11 06:50:02 +08:00
var exec = require ( 'cordova/exec' ) ;
var splashscreen = {
2012-06-22 02:12:30 +08:00
show : function ( ) {
exec ( null , null , "SplashScreen" , "show" , [ ] ) ;
} ,
2012-05-11 06:50:02 +08:00
hide : function ( ) {
exec ( null , null , "SplashScreen" , "hide" , [ ] ) ;
}
} ;
module . exports = splashscreen ;
2012-09-19 01:15:24 +08:00
2012-05-11 06:50:02 +08:00
} ) ;
2013-02-20 03:53:36 +08:00
// file: lib/common/plugin/splashscreen/symbols.js
define ( "cordova/plugin/splashscreen/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
modulemapper . clobbers ( 'cordova/plugin/splashscreen' , 'navigator.splashscreen' ) ;
} ) ;
// file: lib/common/symbols.js
define ( "cordova/symbols" , function ( require , exports , module ) {
var modulemapper = require ( 'cordova/modulemapper' ) ;
// Use merges here in case others symbols files depend on this running first,
// but fail to declare the dependency with a require().
modulemapper . merges ( 'cordova' , 'cordova' ) ;
modulemapper . clobbers ( 'cordova/exec' , 'cordova.exec' ) ;
modulemapper . clobbers ( 'cordova/exec' , 'Cordova.exec' ) ;
} ) ;
2012-03-25 02:09:57 +08:00
// file: lib/common/utils.js
define ( "cordova/utils" , function ( require , exports , module ) {
2012-09-19 01:15:24 +08:00
2012-05-11 06:50:02 +08:00
var utils = exports ;
2012-02-18 07:28:35 +08:00
2012-09-19 01:15:24 +08:00
/ * *
2013-01-19 07:33:38 +08:00
* Defines a property getter / setter for obj [ key ] .
2012-09-19 01:15:24 +08:00
* /
2013-01-19 07:33:38 +08:00
utils . defineGetterSetter = function ( obj , key , getFunc , opt _setFunc ) {
2012-09-19 01:15:24 +08:00
if ( Object . defineProperty ) {
2013-01-22 05:47:26 +08:00
var desc = {
get : getFunc ,
configurable : true
} ;
2013-01-19 07:33:38 +08:00
if ( opt _setFunc ) {
desc . set = opt _setFunc ;
}
Object . defineProperty ( obj , key , desc ) ;
2012-09-19 01:15:24 +08:00
} else {
2013-01-19 07:33:38 +08:00
obj . _ _defineGetter _ _ ( key , getFunc ) ;
if ( opt _setFunc ) {
obj . _ _defineSetter _ _ ( key , opt _setFunc ) ;
}
2012-09-19 01:15:24 +08:00
}
} ;
2013-01-19 07:33:38 +08:00
/ * *
* Defines a property getter for obj [ key ] .
* /
utils . defineGetter = utils . defineGetterSetter ;
2012-11-23 22:38:49 +08:00
utils . arrayIndexOf = function ( a , item ) {
if ( a . indexOf ) {
return a . indexOf ( item ) ;
}
var len = a . length ;
for ( var i = 0 ; i < len ; ++ i ) {
if ( a [ i ] == item ) {
return i ;
}
}
return - 1 ;
} ;
/ * *
* Returns whether the item was found in the array .
* /
utils . arrayRemove = function ( a , item ) {
var index = utils . arrayIndexOf ( a , item ) ;
if ( index != - 1 ) {
a . splice ( index , 1 ) ;
}
return index != - 1 ;
} ;
2013-01-19 07:33:38 +08:00
utils . typeName = function ( val ) {
return Object . prototype . toString . call ( val ) . slice ( 8 , - 1 ) ;
} ;
2012-05-11 06:50:02 +08:00
/ * *
* Returns an indication of whether the argument is an array or not
* /
utils . isArray = function ( a ) {
2013-01-19 07:33:38 +08:00
return utils . typeName ( a ) == 'Array' ;
2012-05-11 06:50:02 +08:00
} ;
2012-04-24 02:37:33 +08:00
2012-05-11 06:50:02 +08:00
/ * *
* Returns an indication of whether the argument is a Date or not
* /
utils . isDate = function ( d ) {
2013-01-19 07:33:38 +08:00
return utils . typeName ( d ) == 'Date' ;
2012-05-11 06:50:02 +08:00
} ;
2012-04-24 02:37:33 +08:00
2012-05-11 06:50:02 +08:00
/ * *
* Does a deep clone of the object .
* /
utils . clone = function ( obj ) {
if ( ! obj || typeof obj == 'function' || utils . isDate ( obj ) || typeof obj != 'object' ) {
return obj ;
}
2012-04-24 02:37:33 +08:00
2012-05-11 06:50:02 +08:00
var retVal , i ;
if ( utils . isArray ( obj ) ) {
retVal = [ ] ;
for ( i = 0 ; i < obj . length ; ++ i ) {
retVal . push ( utils . clone ( obj [ i ] ) ) ;
2012-03-25 02:09:57 +08:00
}
return retVal ;
2012-05-11 06:50:02 +08:00
}
2012-03-25 02:09:57 +08:00
2012-05-11 06:50:02 +08:00
retVal = { } ;
for ( i in obj ) {
if ( ! ( i in retVal ) || retVal [ i ] != obj [ i ] ) {
retVal [ i ] = utils . clone ( obj [ i ] ) ;
2012-03-25 02:09:57 +08:00
}
2012-05-11 06:50:02 +08:00
}
return retVal ;
} ;
2012-03-25 02:09:57 +08:00
2012-05-11 06:50:02 +08:00
/ * *
2012-09-29 02:36:36 +08:00
* Returns a wrapped version of the function
2012-05-11 06:50:02 +08:00
* /
utils . close = function ( context , func , params ) {
if ( typeof params == 'undefined' ) {
return function ( ) {
return func . apply ( context , arguments ) ;
} ;
} else {
return function ( ) {
return func . apply ( context , params ) ;
2012-03-25 02:09:57 +08:00
} ;
2012-05-11 06:50:02 +08:00
}
} ;
2012-02-18 07:28:35 +08:00
2012-05-11 06:50:02 +08:00
/ * *
* Create a UUID
* /
utils . createUUID = function ( ) {
return UUIDcreatePart ( 4 ) + '-' +
UUIDcreatePart ( 2 ) + '-' +
UUIDcreatePart ( 2 ) + '-' +
UUIDcreatePart ( 2 ) + '-' +
UUIDcreatePart ( 6 ) ;
} ;
/ * *
* Extends a child object from a parent object using classical inheritance
* pattern .
* /
utils . extend = ( function ( ) {
// proxy used to establish prototype chain
var F = function ( ) { } ;
// extend Child from Parent
return function ( Child , Parent ) {
F . prototype = Parent . prototype ;
Child . prototype = new F ( ) ;
Child . _ _super _ _ = Parent . prototype ;
Child . prototype . constructor = Child ;
} ;
} ( ) ) ;
/ * *
* Alerts a message in any available way : alert or console . log .
* /
utils . alert = function ( msg ) {
2012-10-25 04:29:26 +08:00
if ( window . alert ) {
window . alert ( msg ) ;
2012-05-11 06:50:02 +08:00
} else if ( console && console . log ) {
console . log ( msg ) ;
}
} ;
2012-02-18 07:28:35 +08:00
2012-05-11 06:50:02 +08:00
//------------------------------------------------------------------------------
function UUIDcreatePart ( length ) {
var uuidpart = "" ;
for ( var i = 0 ; i < length ; i ++ ) {
var uuidchar = parseInt ( ( Math . random ( ) * 256 ) , 10 ) . toString ( 16 ) ;
if ( uuidchar . length == 1 ) {
uuidchar = "0" + uuidchar ;
}
uuidpart += uuidchar ;
}
return uuidpart ;
}
2012-05-01 04:42:38 +08:00
2012-04-10 08:11:13 +08:00
} ) ;
2012-03-25 02:09:57 +08:00
2012-02-18 07:28:35 +08:00
window . cordova = require ( 'cordova' ) ;
2012-03-25 02:09:57 +08:00
// file: lib/scripts/bootstrap.js
2012-09-19 01:15:24 +08:00
2012-02-18 07:28:35 +08:00
( function ( context ) {
2013-04-19 03:28:00 +08:00
var channel = require ( 'cordova/channel' ) ;
var platformInitChannelsArray = [ channel . onNativeReady , channel . onPluginsReady ] ;
function logUnfiredChannels ( arr ) {
for ( var i = 0 ; i < arr . length ; ++ i ) {
if ( arr [ i ] . state != 2 ) {
console . log ( 'Channel not fired: ' + arr [ i ] . type ) ;
}
}
}
window . setTimeout ( function ( ) {
if ( channel . onDeviceReady . state != 2 ) {
console . log ( 'deviceready has not fired after 5 seconds.' ) ;
logUnfiredChannels ( platformInitChannelsArray ) ;
logUnfiredChannels ( channel . deviceReadyChannelsArray ) ;
}
} , 5000 ) ;
2012-09-19 01:15:24 +08:00
// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
2013-03-22 01:35:09 +08:00
function replaceNavigator ( origNavigator ) {
2013-01-19 07:33:38 +08:00
var CordovaNavigator = function ( ) { } ;
2013-03-22 01:35:09 +08:00
CordovaNavigator . prototype = origNavigator ;
var newNavigator = new CordovaNavigator ( ) ;
// This work-around really only applies to new APIs that are newer than Function.bind.
// Without it, APIs such as getGamepads() break.
if ( CordovaNavigator . bind ) {
for ( var key in origNavigator ) {
if ( typeof origNavigator [ key ] == 'function' ) {
newNavigator [ key ] = origNavigator [ key ] . bind ( origNavigator ) ;
}
}
}
return newNavigator ;
2012-09-19 01:15:24 +08:00
}
2013-03-22 01:35:09 +08:00
if ( context . navigator ) {
context . navigator = replaceNavigator ( context . navigator ) ;
}
// _nativeReady is global variable that the native side can set
// to signify that the native code is ready. It is a global since
// it may be called before any cordova JS is ready.
if ( window . _nativeReady ) {
channel . onNativeReady . fire ( ) ;
}
/ * *
2013-04-19 03:28:00 +08:00
* Create all cordova objects once native side is ready .
2013-03-22 01:35:09 +08:00
* /
channel . join ( function ( ) {
// Call the platform-specific initialization
2013-04-19 03:28:00 +08:00
require ( 'cordova/platform' ) . initialize ( ) ;
2013-03-22 01:35:09 +08:00
// Fire event to notify that all objects are created
channel . onCordovaReady . fire ( ) ;
2013-04-19 03:28:00 +08:00
// Fire onDeviceReady event once page has fully loaded, all
// constructors have run and cordova info has been received from native
// side.
// This join call is deliberately made after platform.initialize() in
// order that plugins may manipulate channel.deviceReadyChannelsArray
// if necessary.
2013-03-22 01:35:09 +08:00
channel . join ( function ( ) {
require ( 'cordova' ) . fireDocumentEvent ( 'deviceready' ) ;
} , channel . deviceReadyChannelsArray ) ;
2013-04-19 03:28:00 +08:00
} , platformInitChannelsArray ) ;
2012-09-19 01:15:24 +08:00
2013-03-22 01:35:09 +08:00
} ( window ) ) ;
2012-02-18 07:28:35 +08:00
2013-04-19 03:28:00 +08:00
// file: lib/scripts/bootstrap-android.js
require ( 'cordova/channel' ) . onNativeReady . fire ( ) ;
2013-03-22 01:35:09 +08:00
// file: lib/scripts/plugin_loader.js
2012-02-18 07:28:35 +08:00
2013-03-22 01:35:09 +08:00
// Tries to load all plugins' js-modules.
// This is an async process, but onDeviceReady is blocked on onPluginsReady.
// onPluginsReady is fired when there are no plugins to load, or they are all done.
( function ( context ) {
// To be populated with the handler by handlePluginsObject.
var onScriptLoadingComplete ;
var scriptCounter = 0 ;
function scriptLoadedCallback ( ) {
scriptCounter -- ;
if ( scriptCounter === 0 ) {
onScriptLoadingComplete && onScriptLoadingComplete ( ) ;
}
}
2012-02-18 07:28:35 +08:00
2013-03-22 01:35:09 +08:00
// Helper function to inject a <script> tag.
function injectScript ( path ) {
scriptCounter ++ ;
var script = document . createElement ( "script" ) ;
script . onload = scriptLoadedCallback ;
script . src = path ;
document . head . appendChild ( script ) ;
}
// Called when:
// * There are plugins defined and all plugins are finished loading.
// * There are no plugins to load.
function finishPluginLoading ( ) {
context . cordova . require ( 'cordova/channel' ) . onPluginsReady . fire ( ) ;
}
// Handler for the cordova_plugins.json content.
// See plugman's plugin_loader.js for the details of this object.
// This function is only called if the really is a plugins array that isn't empty.
// Otherwise the XHR response handler will just call finishPluginLoading().
function handlePluginsObject ( modules ) {
// First create the callback for when all plugins are loaded.
var mapper = context . cordova . require ( 'cordova/modulemapper' ) ;
onScriptLoadingComplete = function ( ) {
// Loop through all the plugins and then through their clobbers and merges.
for ( var i = 0 ; i < modules . length ; i ++ ) {
var module = modules [ i ] ;
if ( ! module ) continue ;
if ( module . clobbers && module . clobbers . length ) {
for ( var j = 0 ; j < module . clobbers . length ; j ++ ) {
mapper . clobbers ( module . id , module . clobbers [ j ] ) ;
}
}
2012-02-18 07:28:35 +08:00
2013-03-22 01:35:09 +08:00
if ( module . merges && module . merges . length ) {
for ( var k = 0 ; k < module . merges . length ; k ++ ) {
mapper . merges ( module . id , module . merges [ k ] ) ;
}
}
2012-04-24 02:37:33 +08:00
2013-03-22 01:35:09 +08:00
// Finally, if runs is truthy we want to simply require() the module.
// This can be skipped if it had any merges or clobbers, though,
// since the mapper will already have required the module.
if ( module . runs && ! ( module . clobbers && module . clobbers . length ) && ! ( module . merges && module . merges . length ) ) {
context . cordova . require ( module . id ) ;
}
2012-02-18 07:28:35 +08:00
}
2012-04-24 02:37:33 +08:00
2013-03-22 01:35:09 +08:00
finishPluginLoading ( ) ;
} ;
2012-02-18 07:28:35 +08:00
2013-03-22 01:35:09 +08:00
// Now inject the scripts.
for ( var i = 0 ; i < modules . length ; i ++ ) {
injectScript ( modules [ i ] . file ) ;
}
2012-02-18 07:28:35 +08:00
}
2013-04-19 03:28:00 +08:00
2013-03-22 01:35:09 +08:00
// Try to XHR the cordova_plugins.json file asynchronously.
2013-04-19 03:28:00 +08:00
try { // we commented we were going to try, so let us actually try and catch
2013-03-28 04:25:53 +08:00
var xhr = new context . XMLHttpRequest ( ) ;
2013-04-19 03:28:00 +08:00
xhr . onload = function ( ) {
2013-03-28 04:25:53 +08:00
// If the response is a JSON string which composes an array, call handlePluginsObject.
// If the request fails, or the response is not a JSON array, just call finishPluginLoading.
2013-04-19 03:28:00 +08:00
var obj = JSON . parse ( this . responseText ) ;
if ( obj && obj instanceof Array && obj . length > 0 ) {
handlePluginsObject ( obj ) ;
2013-03-22 01:35:09 +08:00
} else {
finishPluginLoading ( ) ;
}
2013-03-28 04:25:53 +08:00
} ;
2013-04-19 03:28:00 +08:00
xhr . onerror = function ( ) {
finishPluginLoading ( ) ;
} ;
2013-03-28 04:25:53 +08:00
xhr . open ( 'GET' , 'cordova_plugins.json' , true ) ; // Async
xhr . send ( ) ;
}
2013-04-19 03:28:00 +08:00
catch ( err ) {
2013-03-28 04:25:53 +08:00
finishPluginLoading ( ) ;
}
2012-02-18 07:28:35 +08:00
} ( window ) ) ;
2012-05-12 01:36:17 +08:00
2013-03-22 01:35:09 +08:00
2013-04-19 03:28:00 +08:00
} ) ( ) ;