Initial commit
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi.
|
||||
*/
|
||||
|
||||
var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi');
|
||||
var currentApi = nativeApi;
|
||||
|
||||
module.exports = {
|
||||
get: function() { return currentApi; },
|
||||
setPreferPrompt: function(value) {
|
||||
currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi;
|
||||
},
|
||||
// Used only by tests.
|
||||
set: function(value) {
|
||||
currentApi = value;
|
||||
}
|
||||
};
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements the API of ExposedJsApi.java, but uses prompt() to communicate.
|
||||
* This is used pre-JellyBean, where addJavascriptInterface() is disabled.
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
exec: function(bridgeSecret, service, action, callbackId, argsJson) {
|
||||
return prompt(argsJson, 'gap:'+JSON.stringify([bridgeSecret, service, action, callbackId]));
|
||||
},
|
||||
setNativeToJsBridgeMode: function(bridgeSecret, value) {
|
||||
prompt(value, 'gap_bridge_mode:' + bridgeSecret);
|
||||
},
|
||||
retrieveJsMessages: function(bridgeSecret, fromOnlineEvent) {
|
||||
return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,297 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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
|
||||
* Asynchronous: Empty string ""
|
||||
* 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
|
||||
*/
|
||||
var cordova = require('cordova'),
|
||||
nativeApiProvider = require('cordova/android/nativeapiprovider'),
|
||||
utils = require('cordova/utils'),
|
||||
base64 = require('cordova/base64'),
|
||||
channel = require('cordova/channel'),
|
||||
jsToNativeModes = {
|
||||
PROMPT: 0,
|
||||
JS_OBJECT: 1
|
||||
},
|
||||
nativeToJsModes = {
|
||||
// Polls for messages using the JS->Native bridge.
|
||||
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.
|
||||
LOAD_URL: 1,
|
||||
// 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.
|
||||
ONLINE_EVENT: 2,
|
||||
EVAL_BRIDGE: 3
|
||||
},
|
||||
jsToNativeBridgeMode, // Set lazily.
|
||||
nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE,
|
||||
pollEnabled = false,
|
||||
bridgeSecret = -1;
|
||||
|
||||
var messagesFromNative = [];
|
||||
var isProcessing = false;
|
||||
var resolvedPromise = typeof Promise == 'undefined' ? null : Promise.resolve();
|
||||
var nextTick = resolvedPromise ? function(fn) { resolvedPromise.then(fn); } : function(fn) { setTimeout(fn); };
|
||||
|
||||
function androidExec(success, fail, service, action, args) {
|
||||
if (bridgeSecret < 0) {
|
||||
// If we ever catch this firing, we'll need to queue up exec()s
|
||||
// and fire them once we get a secret. For now, I don't think
|
||||
// it's possible for exec() to be called since plugins are parsed but
|
||||
// not run until until after onNativeReady.
|
||||
throw new Error('exec() called without bridgeSecret');
|
||||
}
|
||||
// Set default bridge modes if they have not already been set.
|
||||
// By default, we use the failsafe, since addJavascriptInterface breaks too often
|
||||
if (jsToNativeBridgeMode === undefined) {
|
||||
androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
|
||||
}
|
||||
|
||||
// If args is not provided, default to an empty array
|
||||
args = args || [];
|
||||
|
||||
// Process any ArrayBuffers in the args into a string.
|
||||
for (var i = 0; i < args.length; i++) {
|
||||
if (utils.typeName(args[i]) == 'ArrayBuffer') {
|
||||
args[i] = base64.fromArrayBuffer(args[i]);
|
||||
}
|
||||
}
|
||||
|
||||
var callbackId = service + cordova.callbackId++,
|
||||
argsJson = JSON.stringify(args);
|
||||
if (success || fail) {
|
||||
cordova.callbacks[callbackId] = {success:success, fail:fail};
|
||||
}
|
||||
|
||||
var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);
|
||||
// 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 && msgs === "@Null arguments.") {
|
||||
androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT);
|
||||
androidExec(success, fail, service, action, args);
|
||||
androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
|
||||
} else if (msgs) {
|
||||
messagesFromNative.push(msgs);
|
||||
// Always process async to avoid exceptions messing up stack.
|
||||
nextTick(processMessages);
|
||||
}
|
||||
}
|
||||
|
||||
androidExec.init = function() {
|
||||
//CB-11828
|
||||
//This failsafe checks the version of Android and if it's Jellybean, it switches it to
|
||||
//using the Online Event bridge for communicating from Native to JS
|
||||
//
|
||||
//It's ugly, but it's necessary.
|
||||
var check = navigator.userAgent.toLowerCase().match(/android\s[0-9].[0-9]/);
|
||||
var version_code = check && check[0].match(/4.[0-3].*/);
|
||||
if (version_code != null && nativeToJsBridgeMode == nativeToJsModes.EVAL_BRIDGE) {
|
||||
nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT;
|
||||
}
|
||||
|
||||
bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode);
|
||||
channel.onNativeReady.fire();
|
||||
};
|
||||
|
||||
function pollOnceFromOnlineEvent() {
|
||||
pollOnce(true);
|
||||
}
|
||||
|
||||
function pollOnce(opt_fromOnlineEvent) {
|
||||
if (bridgeSecret < 0) {
|
||||
// This can happen when the NativeToJsMessageQueue resets the online state on page transitions.
|
||||
// We know there's nothing to retrieve, so no need to poll.
|
||||
return;
|
||||
}
|
||||
var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent);
|
||||
if (msgs) {
|
||||
messagesFromNative.push(msgs);
|
||||
// Process sync since we know we're already top-of-stack.
|
||||
processMessages();
|
||||
}
|
||||
}
|
||||
|
||||
function pollingTimerFunc() {
|
||||
if (pollEnabled) {
|
||||
pollOnce();
|
||||
setTimeout(pollingTimerFunc, 50);
|
||||
}
|
||||
}
|
||||
|
||||
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).
|
||||
window.addEventListener('online', pollOnceFromOnlineEvent, false);
|
||||
window.addEventListener('offline', pollOnceFromOnlineEvent, false);
|
||||
cordova.addWindowEventHandler('online');
|
||||
cordova.addWindowEventHandler('offline');
|
||||
document.addEventListener('online', proxyEvent, false);
|
||||
document.addEventListener('offline', proxyEvent, false);
|
||||
}
|
||||
|
||||
hookOnlineApis();
|
||||
|
||||
androidExec.jsToNativeModes = jsToNativeModes;
|
||||
androidExec.nativeToJsModes = nativeToJsModes;
|
||||
|
||||
androidExec.setJsToNativeBridgeMode = function(mode) {
|
||||
if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) {
|
||||
mode = jsToNativeModes.PROMPT;
|
||||
}
|
||||
nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT);
|
||||
jsToNativeBridgeMode = mode;
|
||||
};
|
||||
|
||||
androidExec.setNativeToJsBridgeMode = function(mode) {
|
||||
if (mode == nativeToJsBridgeMode) {
|
||||
return;
|
||||
}
|
||||
if (nativeToJsBridgeMode == nativeToJsModes.POLLING) {
|
||||
pollEnabled = false;
|
||||
}
|
||||
|
||||
nativeToJsBridgeMode = mode;
|
||||
// Tell the native side to switch modes.
|
||||
// Otherwise, it will be set by androidExec.init()
|
||||
if (bridgeSecret >= 0) {
|
||||
nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode);
|
||||
}
|
||||
|
||||
if (mode == nativeToJsModes.POLLING) {
|
||||
pollEnabled = true;
|
||||
setTimeout(pollingTimerFunc, 1);
|
||||
}
|
||||
};
|
||||
|
||||
function buildPayload(payload, message) {
|
||||
var payloadKind = message.charAt(0);
|
||||
if (payloadKind == 's') {
|
||||
payload.push(message.slice(1));
|
||||
} else if (payloadKind == 't') {
|
||||
payload.push(true);
|
||||
} else if (payloadKind == 'f') {
|
||||
payload.push(false);
|
||||
} else if (payloadKind == 'N') {
|
||||
payload.push(null);
|
||||
} else if (payloadKind == 'n') {
|
||||
payload.push(+message.slice(1));
|
||||
} else if (payloadKind == 'A') {
|
||||
var data = message.slice(1);
|
||||
payload.push(base64.toArrayBuffer(data));
|
||||
} else if (payloadKind == 'S') {
|
||||
payload.push(window.atob(message.slice(1)));
|
||||
} else if (payloadKind == 'M') {
|
||||
var multipartMessages = message.slice(1);
|
||||
while (multipartMessages !== "") {
|
||||
var spaceIdx = multipartMessages.indexOf(' ');
|
||||
var msgLen = +multipartMessages.slice(0, spaceIdx);
|
||||
var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen);
|
||||
multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1);
|
||||
buildPayload(payload, multipartMessage);
|
||||
}
|
||||
} else {
|
||||
payload.push(JSON.parse(message));
|
||||
}
|
||||
}
|
||||
|
||||
// Processes a single message, as encoded by NativeToJsMessageQueue.java.
|
||||
function processMessage(message) {
|
||||
var firstChar = message.charAt(0);
|
||||
if (firstChar == 'J') {
|
||||
// This is deprecated on the .java side. It doesn't work with CSP enabled.
|
||||
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 payloadMessage = message.slice(nextSpaceIdx + 1);
|
||||
var payload = [];
|
||||
buildPayload(payload, payloadMessage);
|
||||
cordova.callbackFromNative(callbackId, success, status, payload, keepCallback);
|
||||
} else {
|
||||
console.log("processMessage failed: invalid message: " + JSON.stringify(message));
|
||||
}
|
||||
}
|
||||
|
||||
function processMessages() {
|
||||
// Check for the reentrant case.
|
||||
if (isProcessing) {
|
||||
return;
|
||||
}
|
||||
if (messagesFromNative.length === 0) {
|
||||
return;
|
||||
}
|
||||
isProcessing = true;
|
||||
try {
|
||||
var msg = popMessageFromQueue();
|
||||
// The Java side can send a * message to indicate that it
|
||||
// still has messages waiting to be retrieved.
|
||||
if (msg == '*' && messagesFromNative.length === 0) {
|
||||
nextTick(pollOnce);
|
||||
return;
|
||||
}
|
||||
processMessage(msg);
|
||||
} finally {
|
||||
isProcessing = false;
|
||||
if (messagesFromNative.length > 0) {
|
||||
nextTick(processMessages);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function popMessageFromQueue() {
|
||||
var messageBatch = messagesFromNative.shift();
|
||||
if (messageBatch == '*') {
|
||||
return '*';
|
||||
}
|
||||
|
||||
var spaceIdx = messageBatch.indexOf(' ');
|
||||
var msgLen = +messageBatch.slice(0, spaceIdx);
|
||||
var message = messageBatch.substr(spaceIdx + 1, msgLen);
|
||||
messageBatch = messageBatch.slice(spaceIdx + msgLen + 1);
|
||||
if (messageBatch) {
|
||||
messagesFromNative.unshift(messageBatch);
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
module.exports = androidExec;
|
||||
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
// The last resume event that was received that had the result of a plugin call.
|
||||
var lastResumeEvent = null;
|
||||
|
||||
module.exports = {
|
||||
id: 'android',
|
||||
bootstrap: function() {
|
||||
var channel = require('cordova/channel'),
|
||||
cordova = require('cordova'),
|
||||
exec = require('cordova/exec'),
|
||||
modulemapper = require('cordova/modulemapper');
|
||||
|
||||
// Get the shared secret needed to use the bridge.
|
||||
exec.init();
|
||||
|
||||
// TODO: Extract this as a proper plugin.
|
||||
modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app');
|
||||
|
||||
var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App';
|
||||
|
||||
// Inject a listener for the backbutton on the document.
|
||||
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_PLUGIN_NAME, "overrideBackbutton", [this.numHandlers == 1]);
|
||||
};
|
||||
|
||||
// Add hardware MENU and SEARCH button handlers
|
||||
cordova.addDocumentEventHandler('menubutton');
|
||||
cordova.addDocumentEventHandler('searchbutton');
|
||||
|
||||
function bindButtonChannel(buttonName) {
|
||||
// generic button bind used for volumeup/volumedown buttons
|
||||
var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button');
|
||||
volumeButtonChannel.onHasSubscribersChange = function() {
|
||||
exec(null, null, APP_PLUGIN_NAME, "overrideButton", [buttonName, this.numHandlers == 1]);
|
||||
};
|
||||
}
|
||||
// Inject a listener for the volume buttons on the document.
|
||||
bindButtonChannel('volumeup');
|
||||
bindButtonChannel('volumedown');
|
||||
|
||||
// The resume event is not "sticky", but it is possible that the event
|
||||
// will contain the result of a plugin call. We need to ensure that the
|
||||
// plugin result is delivered even after the event is fired (CB-10498)
|
||||
var cordovaAddEventListener = document.addEventListener;
|
||||
|
||||
document.addEventListener = function(evt, handler, capture) {
|
||||
cordovaAddEventListener(evt, handler, capture);
|
||||
|
||||
if (evt === 'resume' && lastResumeEvent) {
|
||||
handler(lastResumeEvent);
|
||||
}
|
||||
};
|
||||
|
||||
// Let native code know we are all done on the JS side.
|
||||
// Native code will then un-hide the WebView.
|
||||
channel.onCordovaReady.subscribe(function() {
|
||||
exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []);
|
||||
exec(null, null, APP_PLUGIN_NAME, "show", []);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
function onMessageFromNative(msg) {
|
||||
var cordova = require('cordova');
|
||||
var action = msg.action;
|
||||
|
||||
switch (action)
|
||||
{
|
||||
// Button events
|
||||
case 'backbutton':
|
||||
case 'menubutton':
|
||||
case 'searchbutton':
|
||||
// App life cycle events
|
||||
case 'pause':
|
||||
// Volume events
|
||||
case 'volumedownbutton':
|
||||
case 'volumeupbutton':
|
||||
cordova.fireDocumentEvent(action);
|
||||
break;
|
||||
case 'resume':
|
||||
if(arguments.length > 1 && msg.pendingResult) {
|
||||
if(arguments.length === 2) {
|
||||
msg.pendingResult.result = arguments[1];
|
||||
} else {
|
||||
// The plugin returned a multipart message
|
||||
var res = [];
|
||||
for(var i = 1; i < arguments.length; i++) {
|
||||
res.push(arguments[i]);
|
||||
}
|
||||
msg.pendingResult.result = res;
|
||||
}
|
||||
|
||||
// Save the plugin result so that it can be delivered to the js
|
||||
// even if they miss the initial firing of the event
|
||||
lastResumeEvent = msg;
|
||||
}
|
||||
cordova.fireDocumentEvent(action, msg);
|
||||
break;
|
||||
default:
|
||||
throw new Error('Unknown event action ' + action);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var exec = require('cordova/exec');
|
||||
var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App';
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* Clear the resource cache.
|
||||
*/
|
||||
clearCache:function() {
|
||||
exec(null, null, APP_PLUGIN_NAME, "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_PLUGIN_NAME, "loadUrl", [url, props]);
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel loadUrl that is waiting to be loaded.
|
||||
*/
|
||||
cancelLoadUrl:function() {
|
||||
exec(null, null, APP_PLUGIN_NAME, "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_PLUGIN_NAME, "clearHistory", []);
|
||||
},
|
||||
|
||||
/**
|
||||
* Go to previous page displayed.
|
||||
* This is the same as pressing the backbutton on Android device.
|
||||
*/
|
||||
backHistory:function() {
|
||||
exec(null, null, APP_PLUGIN_NAME, "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.
|
||||
*
|
||||
* @param override T=override, F=cancel override
|
||||
*/
|
||||
overrideBackbutton:function(override) {
|
||||
exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [override]);
|
||||
},
|
||||
|
||||
/**
|
||||
* Override the default behavior of the Android volume button.
|
||||
* If overridden, when the volume button is pressed, the "volume[up|down]button"
|
||||
* JavaScript event will be fired.
|
||||
*
|
||||
* Note: The user should not have to call this method. Instead, when the user
|
||||
* registers for the "volume[up|down]button" event, this is automatically done.
|
||||
*
|
||||
* @param button volumeup, volumedown
|
||||
* @param override T=override, F=cancel override
|
||||
*/
|
||||
overrideButton:function(button, override) {
|
||||
exec(null, null, APP_PLUGIN_NAME, "overrideButton", [button, override]);
|
||||
},
|
||||
|
||||
/**
|
||||
* Exit and terminate the application.
|
||||
*/
|
||||
exitApp:function() {
|
||||
return exec(null, null, APP_PLUGIN_NAME, "exitApp", []);
|
||||
}
|
||||
};
|
||||
+2208
File diff suppressed because it is too large
Load Diff
+387
@@ -0,0 +1,387 @@
|
||||
cordova.define('cordova/plugin_list', function(require, exports, module) {
|
||||
module.exports = [
|
||||
{
|
||||
"id": "com.jiliac.systemvolume.SystemVolume",
|
||||
"file": "plugins/com.jiliac.systemvolume/www/systemvolume.js",
|
||||
"pluginId": "com.jiliac.systemvolume",
|
||||
"clobbers": [
|
||||
"window.system"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "com.phonegap.plugins.OrientationLock.OrientationLock",
|
||||
"file": "plugins/com.phonegap.plugins.OrientationLock/www/orientationLock.js",
|
||||
"pluginId": "com.phonegap.plugins.OrientationLock",
|
||||
"clobbers": [
|
||||
"OrientationLock"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-tts.tts",
|
||||
"file": "plugins/cordova-plugin-tts/www/tts.js",
|
||||
"pluginId": "cordova-plugin-tts",
|
||||
"clobbers": [
|
||||
"TTS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova.custom.plugins.exitapp.exitApp",
|
||||
"file": "plugins/cordova.custom.plugins.exitapp/www/ExitApp.js",
|
||||
"pluginId": "cordova.custom.plugins.exitapp",
|
||||
"merges": [
|
||||
"navigator.app"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-geolocation.geolocation",
|
||||
"file": "plugins/cordova-plugin-geolocation/www/android/geolocation.js",
|
||||
"pluginId": "cordova-plugin-geolocation",
|
||||
"clobbers": [
|
||||
"navigator.geolocation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-geolocation.PositionError",
|
||||
"file": "plugins/cordova-plugin-geolocation/www/PositionError.js",
|
||||
"pluginId": "cordova-plugin-geolocation",
|
||||
"runs": true
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-battery-status.battery",
|
||||
"file": "plugins/cordova-plugin-battery-status/www/battery.js",
|
||||
"pluginId": "cordova-plugin-battery-status",
|
||||
"clobbers": [
|
||||
"navigator.battery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-x-toast.Toast",
|
||||
"file": "plugins/cordova-plugin-x-toast/www/Toast.js",
|
||||
"pluginId": "cordova-plugin-x-toast",
|
||||
"clobbers": [
|
||||
"window.plugins.toast"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-x-toast.tests",
|
||||
"file": "plugins/cordova-plugin-x-toast/test/tests.js",
|
||||
"pluginId": "cordova-plugin-x-toast"
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-app-version.AppVersionPlugin",
|
||||
"file": "plugins/cordova-plugin-app-version/www/AppVersionPlugin.js",
|
||||
"pluginId": "cordova-plugin-app-version",
|
||||
"clobbers": [
|
||||
"cordova.getAppVersion"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "phonegap-plugin-speech-recognition.SpeechRecognition",
|
||||
"file": "plugins/phonegap-plugin-speech-recognition/www/SpeechRecognition.js",
|
||||
"pluginId": "phonegap-plugin-speech-recognition",
|
||||
"clobbers": [
|
||||
"SpeechRecognition"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "phonegap-plugin-speech-recognition.SpeechRecognitionError",
|
||||
"file": "plugins/phonegap-plugin-speech-recognition/www/SpeechRecognitionError.js",
|
||||
"pluginId": "phonegap-plugin-speech-recognition",
|
||||
"clobbers": [
|
||||
"SpeechRecognitionError"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "phonegap-plugin-speech-recognition.SpeechRecognitionAlternative",
|
||||
"file": "plugins/phonegap-plugin-speech-recognition/www/SpeechRecognitionAlternative.js",
|
||||
"pluginId": "phonegap-plugin-speech-recognition",
|
||||
"clobbers": [
|
||||
"SpeechRecognitionAlternative"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "phonegap-plugin-speech-recognition.SpeechRecognitionResult",
|
||||
"file": "plugins/phonegap-plugin-speech-recognition/www/SpeechRecognitionResult.js",
|
||||
"pluginId": "phonegap-plugin-speech-recognition",
|
||||
"clobbers": [
|
||||
"SpeechRecognitionResult"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "phonegap-plugin-speech-recognition.SpeechRecognitionResultList",
|
||||
"file": "plugins/phonegap-plugin-speech-recognition/www/SpeechRecognitionResultList.js",
|
||||
"pluginId": "phonegap-plugin-speech-recognition",
|
||||
"clobbers": [
|
||||
"SpeechRecognitionResultList"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "phonegap-plugin-speech-recognition.SpeechRecognitionEvent",
|
||||
"file": "plugins/phonegap-plugin-speech-recognition/www/SpeechRecognitionEvent.js",
|
||||
"pluginId": "phonegap-plugin-speech-recognition",
|
||||
"clobbers": [
|
||||
"SpeechRecognitionEvent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "phonegap-plugin-speech-recognition.SpeechGrammar",
|
||||
"file": "plugins/phonegap-plugin-speech-recognition/www/SpeechGrammar.js",
|
||||
"pluginId": "phonegap-plugin-speech-recognition",
|
||||
"clobbers": [
|
||||
"SpeechGrammar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "phonegap-plugin-speech-recognition.SpeechGrammarList",
|
||||
"file": "plugins/phonegap-plugin-speech-recognition/www/SpeechGrammarList.js",
|
||||
"pluginId": "phonegap-plugin-speech-recognition",
|
||||
"clobbers": [
|
||||
"SpeechGrammarList"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-network-information.network",
|
||||
"file": "plugins/cordova-plugin-network-information/www/network.js",
|
||||
"pluginId": "cordova-plugin-network-information",
|
||||
"clobbers": [
|
||||
"navigator.connection",
|
||||
"navigator.network.connection"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-network-information.Connection",
|
||||
"file": "plugins/cordova-plugin-network-information/www/Connection.js",
|
||||
"pluginId": "cordova-plugin-network-information",
|
||||
"clobbers": [
|
||||
"Connection"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-insomnia.Insomnia",
|
||||
"file": "plugins/cordova-plugin-insomnia/www/Insomnia.js",
|
||||
"pluginId": "cordova-plugin-insomnia",
|
||||
"clobbers": [
|
||||
"window.plugins.insomnia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-fullscreen.AndroidFullScreen",
|
||||
"file": "plugins/cordova-plugin-fullscreen/www/AndroidFullScreen.js",
|
||||
"pluginId": "cordova-plugin-fullscreen",
|
||||
"clobbers": [
|
||||
"AndroidFullScreen"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.DirectoryEntry",
|
||||
"file": "plugins/cordova-plugin-file/www/DirectoryEntry.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.DirectoryEntry"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.DirectoryReader",
|
||||
"file": "plugins/cordova-plugin-file/www/DirectoryReader.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.DirectoryReader"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.Entry",
|
||||
"file": "plugins/cordova-plugin-file/www/Entry.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.Entry"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.File",
|
||||
"file": "plugins/cordova-plugin-file/www/File.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.File"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.FileEntry",
|
||||
"file": "plugins/cordova-plugin-file/www/FileEntry.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.FileEntry"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.FileError",
|
||||
"file": "plugins/cordova-plugin-file/www/FileError.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.FileError"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.FileReader",
|
||||
"file": "plugins/cordova-plugin-file/www/FileReader.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.FileReader"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.FileSystem",
|
||||
"file": "plugins/cordova-plugin-file/www/FileSystem.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.FileSystem"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.FileUploadOptions",
|
||||
"file": "plugins/cordova-plugin-file/www/FileUploadOptions.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.FileUploadOptions"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.FileUploadResult",
|
||||
"file": "plugins/cordova-plugin-file/www/FileUploadResult.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.FileUploadResult"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.FileWriter",
|
||||
"file": "plugins/cordova-plugin-file/www/FileWriter.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.FileWriter"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.Flags",
|
||||
"file": "plugins/cordova-plugin-file/www/Flags.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.Flags"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.LocalFileSystem",
|
||||
"file": "plugins/cordova-plugin-file/www/LocalFileSystem.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.LocalFileSystem"
|
||||
],
|
||||
"merges": [
|
||||
"window"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.Metadata",
|
||||
"file": "plugins/cordova-plugin-file/www/Metadata.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.Metadata"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.ProgressEvent",
|
||||
"file": "plugins/cordova-plugin-file/www/ProgressEvent.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.ProgressEvent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.fileSystems",
|
||||
"file": "plugins/cordova-plugin-file/www/fileSystems.js",
|
||||
"pluginId": "cordova-plugin-file"
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.requestFileSystem",
|
||||
"file": "plugins/cordova-plugin-file/www/requestFileSystem.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"clobbers": [
|
||||
"window.requestFileSystem"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.resolveLocalFileSystemURI",
|
||||
"file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"merges": [
|
||||
"window"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.isChrome",
|
||||
"file": "plugins/cordova-plugin-file/www/browser/isChrome.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"runs": true
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.androidFileSystem",
|
||||
"file": "plugins/cordova-plugin-file/www/android/FileSystem.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"merges": [
|
||||
"FileSystem"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.fileSystems-roots",
|
||||
"file": "plugins/cordova-plugin-file/www/fileSystems-roots.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"runs": true
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-file.fileSystemPaths",
|
||||
"file": "plugins/cordova-plugin-file/www/fileSystemPaths.js",
|
||||
"pluginId": "cordova-plugin-file",
|
||||
"merges": [
|
||||
"cordova"
|
||||
],
|
||||
"runs": true
|
||||
},
|
||||
{
|
||||
"id": "com.pylonproducts.wifiwizard.WifiWizard",
|
||||
"file": "plugins/com.pylonproducts.wifiwizard/www/WifiWizard.js",
|
||||
"pluginId": "com.pylonproducts.wifiwizard",
|
||||
"clobbers": [
|
||||
"window.WifiWizard"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cordova-plugin-certificates.Certificates",
|
||||
"file": "plugins/cordova-plugin-certificates/www/certificate.js",
|
||||
"pluginId": "cordova-plugin-certificates",
|
||||
"clobbers": [
|
||||
"cordova.plugins.certificates"
|
||||
]
|
||||
}
|
||||
];
|
||||
module.exports.metadata =
|
||||
// TOP OF METADATA
|
||||
{
|
||||
"com.jiliac.systemvolume": "0.1.0",
|
||||
"com.phonegap.plugins.OrientationLock": "0.1",
|
||||
"cordova-plugin-tts": "0.2.3",
|
||||
"cordova.custom.plugins.exitapp": "1.0.0",
|
||||
"cordova-plugin-compat": "1.0.0",
|
||||
"cordova-plugin-geolocation": "2.4.3",
|
||||
"cordova-plugin-battery-status": "1.2.4",
|
||||
"cordova-plugin-x-toast": "2.6.0",
|
||||
"cordova-plugin-app-version": "0.1.9",
|
||||
"phonegap-plugin-speech-recognition": "0.2.0",
|
||||
"cordova-plugin-network-information": "1.3.3",
|
||||
"cordova-plugin-insomnia": "4.3.0",
|
||||
"cordova-plugin-whitelist": "1.3.2",
|
||||
"cordova-plugin-fullscreen": "1.1.0",
|
||||
"cordova-plugin-file": "4.3.3",
|
||||
"com.pylonproducts.wifiwizard": "0.2.11",
|
||||
"cordova-plugin-certificates": "0.6.4"
|
||||
};
|
||||
// BOTTOM OF METADATA
|
||||
});
|
||||
@@ -0,0 +1,10 @@
|
||||
cordova.define("com.jiliac.systemvolume.SystemVolume", function(require, exports, module) {
|
||||
var exec = require('cordova/exec');
|
||||
|
||||
module.exports = {
|
||||
|
||||
setSystemVolume: function(volume) {
|
||||
exec(null, null, "SystemVolume", "setSystemVolume", [volume]);
|
||||
},
|
||||
};
|
||||
});
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
cordova.define("com.phonegap.plugins.OrientationLock.OrientationLock", function(require, exports, module) {
|
||||
var OrientationLock = function() {}
|
||||
|
||||
OrientationLock.prototype.lock = function(orientation, success, fail) {
|
||||
return cordova.exec(success, fail, "OrientationLock", "lock", [orientation])
|
||||
}
|
||||
|
||||
OrientationLock.prototype.unlock = function(success, fail) {
|
||||
return cordova.exec(success, fail, "OrientationLock", "unlock", [])
|
||||
}
|
||||
|
||||
if ( ! window.plugins ) {
|
||||
window.plugins = {}
|
||||
}
|
||||
if ( ! window.plugins.orientationLock ) {
|
||||
window.plugins.orientationLock = new OrientationLock()
|
||||
}
|
||||
|
||||
module.exports = OrientationLock
|
||||
|
||||
});
|
||||
+298
@@ -0,0 +1,298 @@
|
||||
cordova.define("com.pylonproducts.wifiwizard.WifiWizard", function(require, exports, module) {
|
||||
/*
|
||||
* Copyright 2015 Matt Parsons
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is the interface for the WifiWizard Phonegap plugin.
|
||||
*/
|
||||
|
||||
var WifiWizard = {
|
||||
|
||||
/**
|
||||
* This method formats wifi information into an object for use with the
|
||||
* addNetwork function. Currently only supports
|
||||
* @param SSID the SSID of the network enclosed in double quotes
|
||||
* @param password the password for the network enclosed in double quotes
|
||||
* @param algorithm the authentication algorithm
|
||||
* @return wifiConfig a JSON object properly formatted for the plugin.
|
||||
*/
|
||||
formatWifiConfig: function(SSID, password, algorithm) {
|
||||
var wifiConfig = {
|
||||
SSID: WifiWizard.formatWifiString(SSID)
|
||||
};
|
||||
if (!algorithm && !password) {
|
||||
// open network
|
||||
wifiConfig.auth = {
|
||||
algorithm: 'NONE'
|
||||
};
|
||||
} else if (algorithm === 'WPA') {
|
||||
wifiConfig.auth = {
|
||||
algorithm : algorithm,
|
||||
password : WifiWizard.formatWifiString(password)
|
||||
// Other parameters can be added depending on algorithm.
|
||||
};
|
||||
}
|
||||
else if (algorithm === 'New network type') {
|
||||
wifiConfig.auth = {
|
||||
algorithm : algorithm
|
||||
// Etc...
|
||||
};
|
||||
}
|
||||
else {
|
||||
console.log("Algorithm incorrect")
|
||||
return false;
|
||||
}
|
||||
return wifiConfig;
|
||||
},
|
||||
|
||||
/**
|
||||
* This method is a helper method that returns a wifi object with WPA.
|
||||
*/
|
||||
formatWPAConfig: function(SSID, password) {
|
||||
return WifiWizard.formatWifiConfig(SSID, password, 'WPA');
|
||||
},
|
||||
|
||||
/**
|
||||
* This method formats a given SSID and ensures that it is appropriate.
|
||||
* If the SSID is not wrapped in double quotes, it wraps it in double quotes.
|
||||
* Despite the name, this also needs to be done to WPA PSK.
|
||||
* @param ssid the SSID to format
|
||||
*/
|
||||
formatWifiString: function(ssid) {
|
||||
if (ssid === undefined || ssid === null) {
|
||||
ssid = "";
|
||||
}
|
||||
ssid = ssid.trim()
|
||||
|
||||
if (ssid.charAt(0) != '"' ) {
|
||||
ssid = '"' + ssid;
|
||||
}
|
||||
|
||||
if (ssid.charAt(ssid.length-1) != '"' ) {
|
||||
ssid = ssid + '"';
|
||||
}
|
||||
|
||||
return ssid;
|
||||
},
|
||||
|
||||
/**
|
||||
* This methods adds a network to the list of available networks.
|
||||
* Currently, only WPA authentication method is supported.
|
||||
*
|
||||
* @param wifi is JSON formatted information necessary for adding the Wifi
|
||||
* network, as is done in formatWifiConfig.
|
||||
* @param win is a callback function that gets called if the plugin is
|
||||
* successful.
|
||||
* @param fail is a callback function that gets called if the plugin gets
|
||||
* an error
|
||||
*/
|
||||
addNetwork: function(wifi, win, fail) {
|
||||
//console.log("WifiWizard add method entered.");
|
||||
if (wifi !== null && typeof wifi === 'object') {
|
||||
// Ok to proceed!
|
||||
}
|
||||
else {
|
||||
console.log('WifiWizard: Invalid parameter. wifi not an object.');
|
||||
}
|
||||
|
||||
var networkInformation = [];
|
||||
|
||||
if (wifi.SSID !== undefined && wifi.SSID !== '') {
|
||||
networkInformation.push(wifi.SSID);
|
||||
}
|
||||
else {
|
||||
// i dunno, like, reject the call or something? what are you even doing?
|
||||
console.log('WifiWizard: No SSID given.');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (typeof wifi.auth == 'object') {
|
||||
|
||||
switch (wifi.auth.algorithm) {
|
||||
case 'WPA':
|
||||
networkInformation.push('WPA');
|
||||
networkInformation.push(wifi.auth.password);
|
||||
break;
|
||||
case 'NONE':
|
||||
networkInformation.push('NONE');
|
||||
break;
|
||||
case 'Newly supported type':
|
||||
// Push values in specific order, and implement new type in the Java code.
|
||||
break;
|
||||
default:
|
||||
console.log("WifiWizard: authentication invalid.");
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
console.log('WifiWizard: No authentication algorithm given.');
|
||||
return false;
|
||||
}
|
||||
|
||||
cordova.exec(win, fail, 'WifiWizard', 'addNetwork', networkInformation);
|
||||
},
|
||||
|
||||
/**
|
||||
* This method removes a given network from the list of configured networks.
|
||||
* @param SSID of the network to remove
|
||||
* @param win function to handle successful callback
|
||||
* @param fail function to handle error callback
|
||||
*/
|
||||
removeNetwork: function(SSID, win, fail) {
|
||||
cordova.exec(win, fail, 'WifiWizard', 'removeNetwork', [WifiWizard.formatWifiString(SSID)]);
|
||||
},
|
||||
|
||||
/**
|
||||
* This method connects a network if it is configured.
|
||||
* @param SSID the network to connect
|
||||
* @param win function that is called if successful
|
||||
* @param fail function that is called to handle errors
|
||||
*/
|
||||
connectNetwork: function(SSID, win, fail) {
|
||||
cordova.exec(win, fail, 'WifiWizard', 'connectNetwork', [WifiWizard.formatWifiString(SSID)]);
|
||||
},
|
||||
|
||||
/**
|
||||
* This method disconnects a network if it is configured.
|
||||
* @param SSID the network to disconnect
|
||||
* @param win function that is called if successful
|
||||
* @param fail function that is called to handle errors
|
||||
*/
|
||||
disconnectNetwork: function(SSID, win, fail) {
|
||||
cordova.exec(win, fail, 'WifiWizard', 'disconnectNetwork', [WifiWizard.formatWifiString(SSID)]);
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Hands the list of previously used and configured networks to the `win` success callback function.
|
||||
* @param win callback function that receives list of networks
|
||||
* @param fail callback function if error
|
||||
* @return a list of networks
|
||||
*/
|
||||
listNetworks: function(win, fail) {
|
||||
if (typeof win != "function") {
|
||||
console.log("listNetworks first parameter must be a function to handle list.");
|
||||
return;
|
||||
}
|
||||
cordova.exec(win, fail, 'WifiWizard', 'listNetworks', []);
|
||||
},
|
||||
|
||||
/**
|
||||
* Hands the list of scanned networks to the `win` success callback function.
|
||||
* @param opts optional json object of options
|
||||
* @param win callback function that receives list of networks
|
||||
* @param fail callback function if error
|
||||
* @return a list of networks
|
||||
*/
|
||||
getScanResults: function(options, win, fail) {
|
||||
if (typeof options === 'function') {
|
||||
fail = win;
|
||||
win = options;
|
||||
options = {};
|
||||
}
|
||||
|
||||
if (typeof win != "function") {
|
||||
console.log("getScanResults first parameter must be a function to handle list.");
|
||||
return;
|
||||
}
|
||||
|
||||
cordova.exec(win, fail, 'WifiWizard', 'getScanResults', [options]);
|
||||
},
|
||||
|
||||
/**
|
||||
* Start scanning wifi.
|
||||
* @param win callback function
|
||||
* @param fail callback function if error
|
||||
*/
|
||||
startScan: function(win, fail) {
|
||||
if (typeof win != "function") {
|
||||
console.log("startScan first parameter must be a function to handle list.");
|
||||
return;
|
||||
}
|
||||
cordova.exec(win, fail, 'WifiWizard', 'startScan', []);
|
||||
},
|
||||
|
||||
/**
|
||||
* Disconnect current wifi.
|
||||
* @param win callback function
|
||||
* @param fail callback function if error
|
||||
*/
|
||||
disconnect: function(win, fail) {
|
||||
if (typeof win != "function") {
|
||||
console.log("disconnect first parameter must be a function to handle list.");
|
||||
return;
|
||||
}
|
||||
cordova.exec(win, fail, 'WifiWizard', 'disconnect', []);
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the currently connected wifi SSID
|
||||
* @param win callback function
|
||||
* @param fail callback function if error
|
||||
*/
|
||||
getCurrentSSID: function(win, fail) {
|
||||
if (typeof win != "function") {
|
||||
console.log("getCurrentSSID first parameter must be a function to handle SSID.");
|
||||
return;
|
||||
}
|
||||
cordova.exec(win, fail, 'WifiWizard', 'getConnectedSSID', []);
|
||||
},
|
||||
|
||||
getCurrentBSSID: function(win, fail) {
|
||||
if (typeof win != "function") {
|
||||
console.log("getCurrentSSID first parameter must be a function to handle SSID.");
|
||||
return;
|
||||
}
|
||||
cordova.exec(win, fail, 'WifiWizard', 'getConnectedBSSID', []);
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets 'true' or 'false' if WiFi is enabled or disabled
|
||||
* @param win callback function
|
||||
* @param fail
|
||||
*/
|
||||
isWifiEnabled: function(win, fail) {
|
||||
if (typeof win != "function") {
|
||||
console.log("isWifiEnabled first parameter must be a function to handle wifi status.");
|
||||
return;
|
||||
}
|
||||
cordova.exec(
|
||||
// Cordova can only return strings to JS, and the underlying plugin
|
||||
// sends a "1" for true and "0" for false.
|
||||
function(result) {
|
||||
win(result == "1");
|
||||
},
|
||||
fail, 'WifiWizard', 'isWifiEnabled', []
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets '1' if WiFi is enabled
|
||||
* @param enabled callback function
|
||||
* @param win callback function
|
||||
* @param fail callback function if wifi is disabled
|
||||
*/
|
||||
setWifiEnabled: function(enabled, win, fail) {
|
||||
if (typeof win != "function") {
|
||||
console.log("setWifiEnabled second parameter must be a function to handle enable result.");
|
||||
return;
|
||||
}
|
||||
cordova.exec(win, fail, 'WifiWizard', 'setWifiEnabled', [enabled]);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = WifiWizard;
|
||||
|
||||
});
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
cordova.define("cordova-plugin-app-version.AppVersionPlugin", function(require, exports, module) {
|
||||
/*jslint indent: 2 */
|
||||
/*global window, jQuery, angular, cordova */
|
||||
"use strict";
|
||||
|
||||
// Returns a jQuery or AngularJS deferred object, or pass a success and fail callbacks if you don't want to use jQuery or AngularJS
|
||||
var getPromisedCordovaExec = function (command, success, fail) {
|
||||
var toReturn, deferred, injector, $q;
|
||||
if (success === undefined) {
|
||||
if (window.jQuery) {
|
||||
deferred = jQuery.Deferred();
|
||||
success = deferred.resolve;
|
||||
fail = deferred.reject;
|
||||
toReturn = deferred;
|
||||
} else if (window.angular) {
|
||||
injector = angular.injector(["ng"]);
|
||||
$q = injector.get("$q");
|
||||
deferred = $q.defer();
|
||||
success = deferred.resolve;
|
||||
fail = deferred.reject;
|
||||
toReturn = deferred.promise;
|
||||
} else if (window.when && window.when.promise) {
|
||||
deferred = when.defer();
|
||||
success = deferred.resolve;
|
||||
fail = deferred.reject;
|
||||
toReturn = deferred.promise;
|
||||
} else if (window.Promise) {
|
||||
toReturn = new Promise(function(c, e) {
|
||||
success = c;
|
||||
fail = e;
|
||||
});
|
||||
} else if (window.WinJS && window.WinJS.Promise) {
|
||||
toReturn = new WinJS.Promise(function(c, e) {
|
||||
success = c;
|
||||
fail = e;
|
||||
});
|
||||
} else {
|
||||
return console.error('AppVersion either needs a success callback, or jQuery/AngularJS/Promise/WinJS.Promise defined for using promises');
|
||||
}
|
||||
}
|
||||
// 5th param is NOT optional. must be at least empty array
|
||||
cordova.exec(success, fail, "AppVersion", command, []);
|
||||
return toReturn;
|
||||
};
|
||||
|
||||
var getAppVersion = function (success, fail) {
|
||||
return getPromisedCordovaExec('getVersionNumber', success, fail);
|
||||
};
|
||||
|
||||
getAppVersion.getAppName = function (success, fail) {
|
||||
return getPromisedCordovaExec('getAppName', success, fail);
|
||||
};
|
||||
|
||||
getAppVersion.getPackageName = function (success, fail) {
|
||||
return getPromisedCordovaExec('getPackageName', success, fail);
|
||||
};
|
||||
|
||||
getAppVersion.getVersionNumber = function (success, fail) {
|
||||
return getPromisedCordovaExec('getVersionNumber', success, fail);
|
||||
};
|
||||
|
||||
getAppVersion.getVersionCode = function (success, fail) {
|
||||
return getPromisedCordovaExec('getVersionCode', success, fail);
|
||||
};
|
||||
|
||||
module.exports = getAppVersion;
|
||||
|
||||
});
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
cordova.define("cordova-plugin-battery-status.battery", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class contains information about the current battery status.
|
||||
* @constructor
|
||||
*/
|
||||
var cordova = require('cordova'),
|
||||
exec = require('cordova/exec');
|
||||
|
||||
var STATUS_CRITICAL = 5;
|
||||
var STATUS_LOW = 20;
|
||||
|
||||
var Battery = function() {
|
||||
this._level = null;
|
||||
this._isPlugged = null;
|
||||
// Create new event handlers on the window (returns a channel instance)
|
||||
this.channels = {
|
||||
batterystatus:cordova.addWindowEventHandler("batterystatus"),
|
||||
batterylow:cordova.addWindowEventHandler("batterylow"),
|
||||
batterycritical:cordova.addWindowEventHandler("batterycritical")
|
||||
};
|
||||
for (var key in this.channels) {
|
||||
this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange;
|
||||
}
|
||||
};
|
||||
|
||||
function handlers() {
|
||||
return battery.channels.batterystatus.numHandlers +
|
||||
battery.channels.batterylow.numHandlers +
|
||||
battery.channels.batterycritical.numHandlers;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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!).
|
||||
*/
|
||||
Battery.onHasSubscribersChange = function() {
|
||||
// If we just registered the first handler, make sure native listener is started.
|
||||
if (this.numHandlers === 1 && handlers() === 1) {
|
||||
exec(battery._status, battery._error, "Battery", "start", []);
|
||||
} else if (handlers() === 0) {
|
||||
exec(null, null, "Battery", "stop", []);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Callback for battery status
|
||||
*
|
||||
* @param {Object} info keys: level, isPlugged
|
||||
*/
|
||||
Battery.prototype._status = function (info) {
|
||||
|
||||
if (info) {
|
||||
if (battery._level !== info.level || battery._isPlugged !== info.isPlugged) {
|
||||
|
||||
if(info.level === null && battery._level !== null) {
|
||||
return; // special case where callback is called because we stopped listening to the native side.
|
||||
}
|
||||
|
||||
// Something changed. Fire batterystatus event
|
||||
cordova.fireWindowEvent("batterystatus", info);
|
||||
|
||||
if (!info.isPlugged) { // do not fire low/critical if we are charging. issue: CB-4520
|
||||
// note the following are NOT exact checks, as we want to catch a transition from
|
||||
// above the threshold to below. issue: CB-4519
|
||||
if (battery._level > STATUS_CRITICAL && info.level <= STATUS_CRITICAL) {
|
||||
// Fire critical battery event
|
||||
cordova.fireWindowEvent("batterycritical", info);
|
||||
}
|
||||
else if (battery._level > STATUS_LOW && info.level <= STATUS_LOW) {
|
||||
// Fire low battery event
|
||||
cordova.fireWindowEvent("batterylow", info);
|
||||
}
|
||||
}
|
||||
battery._level = info.level;
|
||||
battery._isPlugged = info.isPlugged;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Error callback for battery start
|
||||
*/
|
||||
Battery.prototype._error = function(e) {
|
||||
console.log("Error initializing Battery: " + e);
|
||||
};
|
||||
|
||||
var battery = new Battery(); // jshint ignore:line
|
||||
|
||||
module.exports = battery;
|
||||
|
||||
});
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
cordova.define("cordova-plugin-certificates.Certificates", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2014 Martin Reinhardt
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
var Certificate = function () {
|
||||
|
||||
};
|
||||
|
||||
Certificate.prototype = {
|
||||
/**
|
||||
* Activates or deactivates the acceptance of self signed/unsecure SSL certificates
|
||||
*
|
||||
* @param {Function} boolActivateUnsecure
|
||||
* boolean value to set desired behaviour
|
||||
*/
|
||||
trustUnsecureCerts: function (boolActivateUnsecure) {
|
||||
if (cordova.platformId == 'android')
|
||||
cordova.exec(null, null, 'CertificatesPlugin', 'setUntrusted', [boolActivateUnsecure]);
|
||||
else
|
||||
cordova.exec(null, null, 'CDVCertificate', 'setUntrusted', [boolActivateUnsecure]);
|
||||
}
|
||||
};
|
||||
|
||||
var plugin = new Certificate();
|
||||
|
||||
module.exports = plugin;
|
||||
|
||||
});
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
cordova.define("cordova-plugin-file.DirectoryEntry", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var argscheck = require('cordova/argscheck'),
|
||||
utils = require('cordova/utils'),
|
||||
exec = require('cordova/exec'),
|
||||
Entry = require('./Entry'),
|
||||
FileError = require('./FileError'),
|
||||
DirectoryReader = require('./DirectoryReader');
|
||||
|
||||
/**
|
||||
* An interface representing a directory on the file system.
|
||||
*
|
||||
* {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)
|
||||
* {FileSystem} filesystem on which the directory resides (readonly)
|
||||
*/
|
||||
var DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) {
|
||||
|
||||
// add trailing slash if it is missing
|
||||
if ((fullPath) && !/\/$/.test(fullPath)) {
|
||||
fullPath += "/";
|
||||
}
|
||||
// add trailing slash if it is missing
|
||||
if (nativeURL && !/\/$/.test(nativeURL)) {
|
||||
nativeURL += "/";
|
||||
}
|
||||
DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, fileSystem, nativeURL);
|
||||
};
|
||||
|
||||
utils.extend(DirectoryEntry, Entry);
|
||||
|
||||
/**
|
||||
* Creates a new DirectoryReader to read entries from this directory
|
||||
*/
|
||||
DirectoryEntry.prototype.createReader = function() {
|
||||
return new DirectoryReader(this.toInternalURL());
|
||||
};
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @param {Flags} options to create or exclusively create the directory
|
||||
* @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) {
|
||||
argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments);
|
||||
var fs = this.filesystem;
|
||||
var win = successCallback && function(result) {
|
||||
var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL);
|
||||
successCallback(entry);
|
||||
};
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
exec(win, fail, "File", "getDirectory", [this.toInternalURL(), 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) {
|
||||
argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments);
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
exec(successCallback, fail, "File", "removeRecursively", [this.toInternalURL()]);
|
||||
};
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @param {Flags} options to create or exclusively create the file
|
||||
* @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) {
|
||||
argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments);
|
||||
var fs = this.filesystem;
|
||||
var win = successCallback && function(result) {
|
||||
var FileEntry = require('./FileEntry');
|
||||
var entry = new FileEntry(result.name, result.fullPath, fs, result.nativeURL);
|
||||
successCallback(entry);
|
||||
};
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
exec(win, fail, "File", "getFile", [this.toInternalURL(), path, options]);
|
||||
};
|
||||
|
||||
module.exports = DirectoryEntry;
|
||||
|
||||
});
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
cordova.define("cordova-plugin-file.DirectoryReader", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var exec = require('cordova/exec'),
|
||||
FileError = require('./FileError') ;
|
||||
|
||||
/**
|
||||
* An interface that lists the files and directories in a directory.
|
||||
*/
|
||||
function DirectoryReader(localURL) {
|
||||
this.localURL = localURL || null;
|
||||
this.hasReadEntries = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
// If we've already read and passed on this directory's entries, return an empty list.
|
||||
if (this.hasReadEntries) {
|
||||
successCallback([]);
|
||||
return;
|
||||
}
|
||||
var reader = this;
|
||||
var win = typeof successCallback !== 'function' ? null : function(result) {
|
||||
var retVal = [];
|
||||
for (var i=0; i<result.length; i++) {
|
||||
var entry = null;
|
||||
if (result[i].isDirectory) {
|
||||
entry = new (require('./DirectoryEntry'))();
|
||||
}
|
||||
else if (result[i].isFile) {
|
||||
entry = new (require('./FileEntry'))();
|
||||
}
|
||||
entry.isDirectory = result[i].isDirectory;
|
||||
entry.isFile = result[i].isFile;
|
||||
entry.name = result[i].name;
|
||||
entry.fullPath = result[i].fullPath;
|
||||
entry.filesystem = new (require('./FileSystem'))(result[i].filesystemName);
|
||||
entry.nativeURL = result[i].nativeURL;
|
||||
retVal.push(entry);
|
||||
}
|
||||
reader.hasReadEntries = true;
|
||||
successCallback(retVal);
|
||||
};
|
||||
var fail = typeof errorCallback !== 'function' ? null : function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
exec(win, fail, "File", "readEntries", [this.localURL]);
|
||||
};
|
||||
|
||||
module.exports = DirectoryReader;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,265 @@
|
||||
cordova.define("cordova-plugin-file.Entry", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var argscheck = require('cordova/argscheck'),
|
||||
exec = require('cordova/exec'),
|
||||
FileError = require('./FileError'),
|
||||
Metadata = require('./Metadata');
|
||||
|
||||
/**
|
||||
* Represents a file or directory on the local file system.
|
||||
*
|
||||
* @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)
|
||||
* @param fileSystem
|
||||
* {FileSystem} the filesystem on which this entry resides
|
||||
* (readonly)
|
||||
* @param nativeURL
|
||||
* {DOMString} an alternate URL which can be used by native
|
||||
* webview controls, for example media players.
|
||||
* (optional, readonly)
|
||||
*/
|
||||
function Entry(isFile, isDirectory, name, fullPath, fileSystem, nativeURL) {
|
||||
this.isFile = !!isFile;
|
||||
this.isDirectory = !!isDirectory;
|
||||
this.name = name || '';
|
||||
this.fullPath = fullPath || '';
|
||||
this.filesystem = fileSystem || null;
|
||||
this.nativeURL = nativeURL || null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Look up the metadata of the entry.
|
||||
*
|
||||
* @param successCallback
|
||||
* {Function} is called with a Metadata object
|
||||
* @param errorCallback
|
||||
* {Function} is called with a FileError
|
||||
*/
|
||||
Entry.prototype.getMetadata = function(successCallback, errorCallback) {
|
||||
argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);
|
||||
var success = successCallback && function(entryMetadata) {
|
||||
var metadata = new Metadata({
|
||||
size: entryMetadata.size,
|
||||
modificationTime: entryMetadata.lastModifiedDate
|
||||
});
|
||||
successCallback(metadata);
|
||||
};
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
exec(success, fail, "File", "getFileMetadata", [this.toInternalURL()]);
|
||||
};
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);
|
||||
exec(successCallback, errorCallback, "File", "setMetadata", [this.toInternalURL(), metadataObject]);
|
||||
};
|
||||
|
||||
/**
|
||||
* Move a file or directory to a new location.
|
||||
*
|
||||
* @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) {
|
||||
argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
var srcURL = this.toInternalURL(),
|
||||
// entry name
|
||||
name = newName || this.name,
|
||||
success = function(entry) {
|
||||
if (entry) {
|
||||
if (successCallback) {
|
||||
// create appropriate Entry object
|
||||
var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name);
|
||||
var fs = newFSName ? new FileSystem(newFSName, { name: "", fullPath: "/" }) : new FileSystem(parent.filesystem.name, { name: "", fullPath: "/" });
|
||||
var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL);
|
||||
successCallback(result);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// no Entry object returned
|
||||
if (fail) {
|
||||
fail(FileError.NOT_FOUND_ERR);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// copy
|
||||
exec(success, fail, "File", "moveTo", [srcURL, parent.toInternalURL(), name]);
|
||||
};
|
||||
|
||||
/**
|
||||
* Copy a directory to a different location.
|
||||
*
|
||||
* @param parent
|
||||
* {DirectoryEntry} the directory to which to copy the entry
|
||||
* @param newName
|
||||
* {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) {
|
||||
argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
var srcURL = this.toInternalURL(),
|
||||
// entry name
|
||||
name = newName || this.name,
|
||||
// success callback
|
||||
success = function(entry) {
|
||||
if (entry) {
|
||||
if (successCallback) {
|
||||
// create appropriate Entry object
|
||||
var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name);
|
||||
var fs = newFSName ? new FileSystem(newFSName, { name: "", fullPath: "/" }) : new FileSystem(parent.filesystem.name, { name: "", fullPath: "/" });
|
||||
var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL);
|
||||
successCallback(result);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// no Entry object returned
|
||||
if (fail) {
|
||||
fail(FileError.NOT_FOUND_ERR);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// copy
|
||||
exec(success, fail, "File", "copyTo", [srcURL, parent.toInternalURL(), name]);
|
||||
};
|
||||
|
||||
/**
|
||||
* Return a URL that can be passed across the bridge to identify this entry.
|
||||
*/
|
||||
Entry.prototype.toInternalURL = function() {
|
||||
if (this.filesystem && this.filesystem.__format__) {
|
||||
return this.filesystem.__format__(this.fullPath, this.nativeURL);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Return a URL that can be used to identify this entry.
|
||||
* Use a URL that can be used to as the src attribute of a <video> or
|
||||
* <audio> tag. If that is not possible, construct a cdvfile:// URL.
|
||||
*/
|
||||
Entry.prototype.toURL = function() {
|
||||
if (this.nativeURL) {
|
||||
return this.nativeURL;
|
||||
}
|
||||
// fullPath attribute may contain the full URL in the case that
|
||||
// toInternalURL fails.
|
||||
return this.toInternalURL() || "file://localhost" + this.fullPath;
|
||||
};
|
||||
|
||||
/**
|
||||
* Backwards-compatibility: In v1.0.0 - 1.0.2, .toURL would only return a
|
||||
* cdvfile:// URL, and this method was necessary to obtain URLs usable by the
|
||||
* webview.
|
||||
* See CB-6051, CB-6106, CB-6117, CB-6152, CB-6199, CB-6201, CB-6243, CB-6249,
|
||||
* and CB-6300.
|
||||
*/
|
||||
Entry.prototype.toNativeURL = function() {
|
||||
console.log("DEPRECATED: Update your code to use 'toURL'");
|
||||
return this.toURL();
|
||||
};
|
||||
|
||||
/**
|
||||
* 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'");
|
||||
return this.toURL();
|
||||
};
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @param successCallback {Function} called with no parameters
|
||||
* @param errorCallback {Function} called with a FileError
|
||||
*/
|
||||
Entry.prototype.remove = function(successCallback, errorCallback) {
|
||||
argscheck.checkArgs('FF', 'Entry.remove', arguments);
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
exec(successCallback, fail, "File", "remove", [this.toInternalURL()]);
|
||||
};
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
argscheck.checkArgs('FF', 'Entry.getParent', arguments);
|
||||
var fs = this.filesystem;
|
||||
var win = successCallback && function(result) {
|
||||
var DirectoryEntry = require('./DirectoryEntry');
|
||||
var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL);
|
||||
successCallback(entry);
|
||||
};
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
exec(win, fail, "File", "getParent", [this.toInternalURL()]);
|
||||
};
|
||||
|
||||
module.exports = Entry;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,82 @@
|
||||
cordova.define("cordova-plugin-file.File", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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, localURL, type, lastModifiedDate, size){
|
||||
this.name = name || '';
|
||||
this.localURL = localURL || null;
|
||||
this.type = type || null;
|
||||
this.lastModified = lastModifiedDate || null;
|
||||
// For backwards compatibility, store the timestamp in lastModifiedDate as well
|
||||
this.lastModifiedDate = lastModifiedDate || null;
|
||||
this.size = size || 0;
|
||||
|
||||
// These store the absolute start and end for slicing the file.
|
||||
this.start = 0;
|
||||
this.end = this.size;
|
||||
};
|
||||
|
||||
/**
|
||||
* 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.localURL, this.type, this.lastModified, this.size);
|
||||
newFile.start = this.start + newStart;
|
||||
newFile.end = this.start + newEnd;
|
||||
return newFile;
|
||||
};
|
||||
|
||||
|
||||
module.exports = File;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,96 @@
|
||||
cordova.define("cordova-plugin-file.FileEntry", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var utils = require('cordova/utils'),
|
||||
exec = require('cordova/exec'),
|
||||
Entry = require('./Entry'),
|
||||
FileWriter = require('./FileWriter'),
|
||||
File = require('./File'),
|
||||
FileError = require('./FileError');
|
||||
|
||||
/**
|
||||
* An interface representing a file on the file system.
|
||||
*
|
||||
* {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, fileSystem, nativeURL) {
|
||||
// remove trailing slash if it is present
|
||||
if (fullPath && /\/$/.test(fullPath)) {
|
||||
fullPath = fullPath.substring(0, fullPath.length - 1);
|
||||
}
|
||||
if (nativeURL && /\/$/.test(nativeURL)) {
|
||||
nativeURL = nativeURL.substring(0, nativeURL.length - 1);
|
||||
}
|
||||
|
||||
FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath, fileSystem, nativeURL]);
|
||||
};
|
||||
|
||||
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.localURL === null || writer.localURL === "") {
|
||||
if (errorCallback) {
|
||||
errorCallback(new FileError(FileError.INVALID_STATE_ERR));
|
||||
}
|
||||
} else {
|
||||
if (successCallback) {
|
||||
successCallback(writer);
|
||||
}
|
||||
}
|
||||
}, 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) {
|
||||
var localURL = this.toInternalURL();
|
||||
var win = successCallback && function(f) {
|
||||
var file = new File(f.name, localURL, f.type, f.lastModifiedDate, f.size);
|
||||
successCallback(file);
|
||||
};
|
||||
var fail = errorCallback && function(code) {
|
||||
errorCallback(new FileError(code));
|
||||
};
|
||||
exec(win, fail, "File", "getFileMetadata", [localURL]);
|
||||
};
|
||||
|
||||
|
||||
module.exports = FileEntry;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,49 @@
|
||||
cordova.define("cordova-plugin-file.FileError", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
});
|
||||
+302
@@ -0,0 +1,302 @@
|
||||
cordova.define("cordova-plugin-file.FileReader", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var exec = require('cordova/exec'),
|
||||
modulemapper = require('cordova/modulemapper'),
|
||||
utils = require('cordova/utils'),
|
||||
FileError = require('./FileError'),
|
||||
ProgressEvent = require('./ProgressEvent'),
|
||||
origFileReader = modulemapper.getOriginalSymbol(window, 'FileReader');
|
||||
|
||||
/**
|
||||
* 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() {
|
||||
this._readyState = 0;
|
||||
this._error = null;
|
||||
this._result = null;
|
||||
this._progress = null;
|
||||
this._localURL = '';
|
||||
this._realReader = origFileReader ? new origFileReader() : {};
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines the maximum size to read at a time via the native API. The default value is a compromise between
|
||||
* minimizing the overhead of many exec() calls while still reporting progress frequently enough for large files.
|
||||
* (Note attempts to allocate more than a few MB of contiguous memory on the native side are likely to cause
|
||||
* OOM exceptions, while the JS engine seems to have fewer problems managing large strings or ArrayBuffers.)
|
||||
*/
|
||||
FileReader.READ_CHUNK_SIZE = 256*1024;
|
||||
|
||||
// States
|
||||
FileReader.EMPTY = 0;
|
||||
FileReader.LOADING = 1;
|
||||
FileReader.DONE = 2;
|
||||
|
||||
utils.defineGetter(FileReader.prototype, 'readyState', function() {
|
||||
return this._localURL ? this._readyState : this._realReader.readyState;
|
||||
});
|
||||
|
||||
utils.defineGetter(FileReader.prototype, 'error', function() {
|
||||
return this._localURL ? this._error: this._realReader.error;
|
||||
});
|
||||
|
||||
utils.defineGetter(FileReader.prototype, 'result', function() {
|
||||
return this._localURL ? 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._progress = 0;
|
||||
reader._readyState = FileReader.LOADING;
|
||||
|
||||
if (typeof file.localURL == 'string') {
|
||||
reader._localURL = file.localURL;
|
||||
} else {
|
||||
reader._localURL = '';
|
||||
return true;
|
||||
}
|
||||
|
||||
if (reader.onloadstart) {
|
||||
reader.onloadstart(new ProgressEvent("loadstart", {target:reader}));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback used by the following read* functions to handle incremental or final success.
|
||||
* Must be bound to the FileReader's this along with all but the last parameter,
|
||||
* e.g. readSuccessCallback.bind(this, "readAsText", "UTF-8", offset, totalSize, accumulate)
|
||||
* @param readType The name of the read function to call.
|
||||
* @param encoding Text encoding, or null if this is not a text type read.
|
||||
* @param offset Starting offset of the read.
|
||||
* @param totalSize Total number of bytes or chars to read.
|
||||
* @param accumulate A function that takes the callback result and accumulates it in this._result.
|
||||
* @param r Callback result returned by the last read exec() call, or null to begin reading.
|
||||
*/
|
||||
function readSuccessCallback(readType, encoding, offset, totalSize, accumulate, r) {
|
||||
if (this._readyState === FileReader.DONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
var CHUNK_SIZE = FileReader.READ_CHUNK_SIZE;
|
||||
if (readType === 'readAsDataURL') {
|
||||
// Windows proxy does not support reading file slices as Data URLs
|
||||
// so read the whole file at once.
|
||||
CHUNK_SIZE = cordova.platformId === 'windows' ? totalSize :
|
||||
// Calculate new chunk size for data URLs to be multiply of 3
|
||||
// Otherwise concatenated base64 chunks won't be valid base64 data
|
||||
FileReader.READ_CHUNK_SIZE - (FileReader.READ_CHUNK_SIZE % 3) + 3;
|
||||
}
|
||||
|
||||
if (typeof r !== "undefined") {
|
||||
accumulate(r);
|
||||
this._progress = Math.min(this._progress + CHUNK_SIZE, totalSize);
|
||||
|
||||
if (typeof this.onprogress === "function") {
|
||||
this.onprogress(new ProgressEvent("progress", {loaded:this._progress, total:totalSize}));
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof r === "undefined" || this._progress < totalSize) {
|
||||
var execArgs = [
|
||||
this._localURL,
|
||||
offset + this._progress,
|
||||
offset + this._progress + Math.min(totalSize - this._progress, CHUNK_SIZE)];
|
||||
if (encoding) {
|
||||
execArgs.splice(1, 0, encoding);
|
||||
}
|
||||
exec(
|
||||
readSuccessCallback.bind(this, readType, encoding, offset, totalSize, accumulate),
|
||||
readFailureCallback.bind(this),
|
||||
"File", readType, execArgs);
|
||||
} else {
|
||||
this._readyState = FileReader.DONE;
|
||||
|
||||
if (typeof this.onload === "function") {
|
||||
this.onload(new ProgressEvent("load", {target:this}));
|
||||
}
|
||||
|
||||
if (typeof this.onloadend === "function") {
|
||||
this.onloadend(new ProgressEvent("loadend", {target:this}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback used by the following read* functions to handle errors.
|
||||
* Must be bound to the FileReader's this, e.g. readFailureCallback.bind(this)
|
||||
*/
|
||||
function readFailureCallback(e) {
|
||||
if (this._readyState === FileReader.DONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._readyState = FileReader.DONE;
|
||||
this._result = null;
|
||||
this._error = new FileError(e);
|
||||
|
||||
if (typeof this.onerror === "function") {
|
||||
this.onerror(new ProgressEvent("error", {target:this}));
|
||||
}
|
||||
|
||||
if (typeof this.onloadend === "function") {
|
||||
this.onloadend(new ProgressEvent("loadend", {target:this}));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Abort reading file.
|
||||
*/
|
||||
FileReader.prototype.abort = function() {
|
||||
if (origFileReader && !this._localURL) {
|
||||
return this._realReader.abort();
|
||||
}
|
||||
this._result = null;
|
||||
|
||||
if (this._readyState == FileReader.DONE || this._readyState == FileReader.EMPTY) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._readyState = FileReader.DONE;
|
||||
|
||||
// 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) {
|
||||
if (initRead(this, file)) {
|
||||
return this._realReader.readAsText(file, encoding);
|
||||
}
|
||||
|
||||
// Default encoding is UTF-8
|
||||
var enc = encoding ? encoding : "UTF-8";
|
||||
|
||||
var totalSize = file.end - file.start;
|
||||
readSuccessCallback.bind(this)("readAsText", enc, file.start, totalSize, function(r) {
|
||||
if (this._progress === 0) {
|
||||
this._result = "";
|
||||
}
|
||||
this._result += r;
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
if (initRead(this, file)) {
|
||||
return this._realReader.readAsDataURL(file);
|
||||
}
|
||||
|
||||
var totalSize = file.end - file.start;
|
||||
readSuccessCallback.bind(this)("readAsDataURL", null, file.start, totalSize, function(r) {
|
||||
var commaIndex = r.indexOf(',');
|
||||
if (this._progress === 0) {
|
||||
this._result = r;
|
||||
} else {
|
||||
this._result += r.substring(commaIndex + 1);
|
||||
}
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
/**
|
||||
* Read file and return data as a binary data.
|
||||
*
|
||||
* @param file {File} File object containing file properties
|
||||
*/
|
||||
FileReader.prototype.readAsBinaryString = function(file) {
|
||||
if (initRead(this, file)) {
|
||||
return this._realReader.readAsBinaryString(file);
|
||||
}
|
||||
|
||||
var totalSize = file.end - file.start;
|
||||
readSuccessCallback.bind(this)("readAsBinaryString", null, file.start, totalSize, function(r) {
|
||||
if (this._progress === 0) {
|
||||
this._result = "";
|
||||
}
|
||||
this._result += r;
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
/**
|
||||
* Read file and return data as a binary data.
|
||||
*
|
||||
* @param file {File} File object containing file properties
|
||||
*/
|
||||
FileReader.prototype.readAsArrayBuffer = function(file) {
|
||||
if (initRead(this, file)) {
|
||||
return this._realReader.readAsArrayBuffer(file);
|
||||
}
|
||||
|
||||
var totalSize = file.end - file.start;
|
||||
readSuccessCallback.bind(this)("readAsArrayBuffer", null, file.start, totalSize, function(r) {
|
||||
var resultArray = (this._progress === 0 ? new Uint8Array(totalSize) : new Uint8Array(this._result));
|
||||
resultArray.set(new Uint8Array(r), this._progress);
|
||||
this._result = resultArray.buffer;
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
module.exports = FileReader;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,58 @@
|
||||
cordova.define("cordova-plugin-file.FileSystem", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var DirectoryEntry = require('./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;
|
||||
if (root) {
|
||||
this.root = new DirectoryEntry(root.name, root.fullPath, this, root.nativeURL);
|
||||
} else {
|
||||
this.root = new DirectoryEntry(this.name, '/', this);
|
||||
}
|
||||
};
|
||||
|
||||
FileSystem.prototype.__format__ = function(fullPath, nativeUrl) {
|
||||
return fullPath;
|
||||
};
|
||||
|
||||
FileSystem.prototype.toJSON = function() {
|
||||
return "<FileSystem: " + this.name + ">";
|
||||
};
|
||||
|
||||
// Use instead of encodeURI() when encoding just the path part of a URI rather than an entire URI.
|
||||
FileSystem.encodeURIPath = function(path) {
|
||||
// Because # is a valid filename character, it must be encoded to prevent part of the
|
||||
// path from being parsed as a URI fragment.
|
||||
return encodeURI(path).replace(/#/g, '%23');
|
||||
};
|
||||
|
||||
module.exports = FileSystem;
|
||||
|
||||
});
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
cordova.define("cordova-plugin-file.FileUploadOptions", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param headers {Object} Keys are header names, values are header values. Multiple
|
||||
* headers of the same name are not supported.
|
||||
*/
|
||||
var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers, httpMethod) {
|
||||
this.fileKey = fileKey || null;
|
||||
this.fileName = fileName || null;
|
||||
this.mimeType = mimeType || null;
|
||||
this.params = params || null;
|
||||
this.headers = headers || null;
|
||||
this.httpMethod = httpMethod || null;
|
||||
};
|
||||
|
||||
module.exports = FileUploadOptions;
|
||||
|
||||
});
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
cordova.define("cordova-plugin-file.FileUploadResult", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* FileUploadResult
|
||||
* @constructor
|
||||
*/
|
||||
module.exports = function FileUploadResult(size, code, content) {
|
||||
this.bytesSent = size;
|
||||
this.responseCode = code;
|
||||
this.response = content;
|
||||
};
|
||||
});
|
||||
+327
@@ -0,0 +1,327 @@
|
||||
cordova.define("cordova-plugin-file.FileWriter", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var exec = require('cordova/exec'),
|
||||
FileError = require('./FileError'),
|
||||
ProgressEvent = require('./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.localURL = file.localURL || 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 data text or blob to be written
|
||||
* @param isPendingBlobReadResult {Boolean} true if the data is the pending blob read operation result
|
||||
*/
|
||||
FileWriter.prototype.write = function(data, isPendingBlobReadResult) {
|
||||
|
||||
var that=this;
|
||||
var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined');
|
||||
var isProxySupportBlobNatively = (cordova.platformId === "windows8" || cordova.platformId === "windows");
|
||||
var isBinary;
|
||||
|
||||
// Check to see if the incoming data is a blob
|
||||
if (data instanceof File || (!isProxySupportBlobNatively && supportsBinary && data instanceof Blob)) {
|
||||
var fileReader = new FileReader();
|
||||
fileReader.onload = function() {
|
||||
// Call this method again, with the arraybuffer as argument
|
||||
FileWriter.prototype.write.call(that, this.result, true /* isPendingBlobReadResult */);
|
||||
};
|
||||
fileReader.onerror = function () {
|
||||
// DONE state
|
||||
that.readyState = FileWriter.DONE;
|
||||
|
||||
// Save error
|
||||
that.error = this.error;
|
||||
|
||||
// If onerror callback
|
||||
if (typeof that.onerror === "function") {
|
||||
that.onerror(new ProgressEvent("error", {"target":that}));
|
||||
}
|
||||
|
||||
// If onwriteend callback
|
||||
if (typeof that.onwriteend === "function") {
|
||||
that.onwriteend(new ProgressEvent("writeend", {"target":that}));
|
||||
}
|
||||
};
|
||||
|
||||
// WRITING state
|
||||
this.readyState = FileWriter.WRITING;
|
||||
|
||||
if (supportsBinary) {
|
||||
fileReader.readAsArrayBuffer(data);
|
||||
} else {
|
||||
fileReader.readAsText(data);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Mark data type for safer transport over the binary bridge
|
||||
isBinary = supportsBinary && (data instanceof ArrayBuffer);
|
||||
if (isBinary && cordova.platformId === "windowsphone") {
|
||||
// create a plain array, using the keys from the Uint8Array view so that we can serialize it
|
||||
data = Array.apply(null, new Uint8Array(data));
|
||||
}
|
||||
|
||||
// Throw an exception if we are already writing a file
|
||||
if (this.readyState === FileWriter.WRITING && !isPendingBlobReadResult) {
|
||||
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.localURL, data, this.position, isBinary]);
|
||||
};
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
if (!offset && offset !== 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// See back from end of file.
|
||||
if (offset < 0) {
|
||||
this.position = Math.max(offset + this.length, 0);
|
||||
}
|
||||
// Offset is bigger than file size so set position
|
||||
// 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.localURL, size]);
|
||||
};
|
||||
|
||||
module.exports = FileWriter;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,39 @@
|
||||
cordova.define("cordova-plugin-file.Flags", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Supplies arguments to methods that lookup or create files and directories.
|
||||
*
|
||||
* @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;
|
||||
|
||||
});
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
cordova.define("cordova-plugin-file.LocalFileSystem", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
exports.TEMPORARY = 0;
|
||||
exports.PERSISTENT = 1;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,43 @@
|
||||
cordova.define("cordova-plugin-file.Metadata", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Information about the state of the file or directory
|
||||
*
|
||||
* {Date} modificationTime (readonly)
|
||||
*/
|
||||
var Metadata = function(metadata) {
|
||||
if (typeof metadata == "object") {
|
||||
this.modificationTime = new Date(metadata.modificationTime);
|
||||
this.size = metadata.size || 0;
|
||||
} else if (typeof metadata == "undefined") {
|
||||
this.modificationTime = null;
|
||||
this.size = 0;
|
||||
} else {
|
||||
/* Backwards compatiblity with platforms that only return a timestamp */
|
||||
this.modificationTime = new Date(metadata);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = Metadata;
|
||||
|
||||
});
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
cordova.define("cordova-plugin-file.ProgressEvent", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
// 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;
|
||||
|
||||
});
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
cordova.define("cordova-plugin-file.androidFileSystem", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
FILESYSTEM_PROTOCOL = "cdvfile";
|
||||
|
||||
module.exports = {
|
||||
__format__: function(fullPath, nativeUrl) {
|
||||
var path;
|
||||
var contentUrlMatch = /^content:\/\//.exec(nativeUrl);
|
||||
if (contentUrlMatch) {
|
||||
// When available, use the path from a native content URL, which was already encoded by Android.
|
||||
// This is necessary because JavaScript's encodeURI() does not encode as many characters as
|
||||
// Android, which can result in permission exceptions when the encoding of a content URI
|
||||
// doesn't match the string for which permission was originally granted.
|
||||
path = nativeUrl.substring(contentUrlMatch[0].length - 1);
|
||||
} else {
|
||||
path = FileSystem.encodeURIPath(fullPath);
|
||||
if (!/^\//.test(path)) {
|
||||
path = '/' + path;
|
||||
}
|
||||
|
||||
var m = /\?.*/.exec(nativeUrl);
|
||||
if (m) {
|
||||
path += m[0];
|
||||
}
|
||||
}
|
||||
|
||||
return FILESYSTEM_PROTOCOL + '://localhost/' + this.name + path;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
});
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
cordova.define("cordova-plugin-file.isChrome", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
module.exports = function () {
|
||||
// window.webkitRequestFileSystem and window.webkitResolveLocalFileSystemURL are available only in Chrome and
|
||||
// possibly a good flag to indicate that we're running in Chrome
|
||||
return window.webkitRequestFileSystem && window.webkitResolveLocalFileSystemURL;
|
||||
};
|
||||
|
||||
});
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
cordova.define("cordova-plugin-file.fileSystemPaths", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var exec = require('cordova/exec');
|
||||
var channel = require('cordova/channel');
|
||||
|
||||
exports.file = {
|
||||
// Read-only directory where the application is installed.
|
||||
applicationDirectory: null,
|
||||
// Root of app's private writable storage
|
||||
applicationStorageDirectory: null,
|
||||
// Where to put app-specific data files.
|
||||
dataDirectory: null,
|
||||
// Cached files that should survive app restarts.
|
||||
// Apps should not rely on the OS to delete files in here.
|
||||
cacheDirectory: null,
|
||||
// Android: the application space on external storage.
|
||||
externalApplicationStorageDirectory: null,
|
||||
// Android: Where to put app-specific data files on external storage.
|
||||
externalDataDirectory: null,
|
||||
// Android: the application cache on external storage.
|
||||
externalCacheDirectory: null,
|
||||
// Android: the external storage (SD card) root.
|
||||
externalRootDirectory: null,
|
||||
// iOS: Temp directory that the OS can clear at will.
|
||||
tempDirectory: null,
|
||||
// iOS: Holds app-specific files that should be synced (e.g. to iCloud).
|
||||
syncedDataDirectory: null,
|
||||
// iOS: Files private to the app, but that are meaningful to other applications (e.g. Office files)
|
||||
documentsDirectory: null,
|
||||
// BlackBerry10: Files globally available to all apps
|
||||
sharedDirectory: null
|
||||
};
|
||||
|
||||
channel.waitForInitialization('onFileSystemPathsReady');
|
||||
channel.onCordovaReady.subscribe(function() {
|
||||
function after(paths) {
|
||||
for (var k in paths) {
|
||||
exports.file[k] = paths[k];
|
||||
}
|
||||
channel.initializationComplete('onFileSystemPathsReady');
|
||||
}
|
||||
exec(after, null, 'File', 'requestAllPaths', []);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
cordova.define("cordova-plugin-file.fileSystems-roots", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
// Map of fsName -> FileSystem.
|
||||
var fsMap = null;
|
||||
var FileSystem = require('./FileSystem');
|
||||
var exec = require('cordova/exec');
|
||||
|
||||
// Overridden by Android, BlackBerry 10 and iOS to populate fsMap.
|
||||
require('./fileSystems').getFs = function(name, callback) {
|
||||
function success(response) {
|
||||
fsMap = {};
|
||||
for (var i = 0; i < response.length; ++i) {
|
||||
var fsRoot = response[i];
|
||||
var fs = new FileSystem(fsRoot.filesystemName, fsRoot);
|
||||
fsMap[fs.name] = fs;
|
||||
}
|
||||
callback(fsMap[name]);
|
||||
}
|
||||
|
||||
if (fsMap) {
|
||||
callback(fsMap[name]);
|
||||
} else {
|
||||
exec(success, null, "File", "requestAllFileSystems", []);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
});
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
cordova.define("cordova-plugin-file.fileSystems", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
// Overridden by Android, BlackBerry 10 and iOS to populate fsMap.
|
||||
module.exports.getFs = function(name, callback) {
|
||||
callback(null);
|
||||
};
|
||||
|
||||
});
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
cordova.define("cordova-plugin-file.requestFileSystem", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
//For browser platform: not all browsers use this file.
|
||||
function checkBrowser() {
|
||||
if (cordova.platformId === "browser" && require('./isChrome')()) {
|
||||
module.exports = window.requestFileSystem || window.webkitRequestFileSystem;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (checkBrowser()) {
|
||||
return;
|
||||
}
|
||||
|
||||
var argscheck = require('cordova/argscheck'),
|
||||
FileError = require('./FileError'),
|
||||
FileSystem = require('./FileSystem'),
|
||||
exec = require('cordova/exec');
|
||||
var fileSystems = require('./fileSystems');
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
argscheck.checkArgs('nnFF', 'requestFileSystem', arguments);
|
||||
var fail = function(code) {
|
||||
if (errorCallback) {
|
||||
errorCallback(new FileError(code));
|
||||
}
|
||||
};
|
||||
|
||||
if (type < 0) {
|
||||
fail(FileError.SYNTAX_ERR);
|
||||
} else {
|
||||
// if successful, return a FileSystem object
|
||||
var success = function(file_system) {
|
||||
if (file_system) {
|
||||
if (successCallback) {
|
||||
fileSystems.getFs(file_system.name, function(fs) {
|
||||
// This should happen only on platforms that haven't implemented requestAllFileSystems (windows)
|
||||
if (!fs) {
|
||||
fs = new FileSystem(file_system.name, file_system.root);
|
||||
}
|
||||
successCallback(fs);
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
// no FileSystem object returned
|
||||
fail(FileError.NOT_FOUND_ERR);
|
||||
}
|
||||
};
|
||||
exec(success, fail, "File", "requestFileSystem", [type, size]);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = requestFileSystem;
|
||||
})();
|
||||
|
||||
});
|
||||
Vendored
+95
@@ -0,0 +1,95 @@
|
||||
cordova.define("cordova-plugin-file.resolveLocalFileSystemURI", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
(function() {
|
||||
//For browser platform: not all browsers use overrided `resolveLocalFileSystemURL`.
|
||||
function checkBrowser() {
|
||||
if (cordova.platformId === "browser" && require('./isChrome')()) {
|
||||
module.exports.resolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (checkBrowser()) {
|
||||
return;
|
||||
}
|
||||
|
||||
var argscheck = require('cordova/argscheck'),
|
||||
DirectoryEntry = require('./DirectoryEntry'),
|
||||
FileEntry = require('./FileEntry'),
|
||||
FileError = require('./FileError'),
|
||||
exec = require('cordova/exec');
|
||||
var fileSystems = require('./fileSystems');
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
module.exports.resolveLocalFileSystemURL = module.exports.resolveLocalFileSystemURL || function(uri, successCallback, errorCallback) {
|
||||
argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments);
|
||||
// error callback
|
||||
var fail = function(error) {
|
||||
if (errorCallback) {
|
||||
errorCallback(new FileError(error));
|
||||
}
|
||||
};
|
||||
// sanity check for 'not:valid:filename' or '/not:valid:filename'
|
||||
// file.spec.12 window.resolveLocalFileSystemURI should error (ENCODING_ERR) when resolving invalid URI with leading /.
|
||||
if(!uri || uri.split(":").length > 2) {
|
||||
setTimeout( function() {
|
||||
fail(FileError.ENCODING_ERR);
|
||||
},0);
|
||||
return;
|
||||
}
|
||||
// if successful, return either a file or directory entry
|
||||
var success = function(entry) {
|
||||
if (entry) {
|
||||
if (successCallback) {
|
||||
// create appropriate Entry object
|
||||
var fsName = entry.filesystemName || (entry.filesystem && entry.filesystem.name) || (entry.filesystem == window.PERSISTENT ? 'persistent' : 'temporary');
|
||||
fileSystems.getFs(fsName, function(fs) {
|
||||
// This should happen only on platforms that haven't implemented requestAllFileSystems (windows)
|
||||
if (!fs) {
|
||||
fs = new FileSystem(fsName, {name:"", fullPath:"/"});
|
||||
}
|
||||
var result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath, fs, entry.nativeURL) : new FileEntry(entry.name, entry.fullPath, fs, entry.nativeURL);
|
||||
successCallback(result);
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
// no Entry object returned
|
||||
fail(FileError.NOT_FOUND_ERR);
|
||||
}
|
||||
};
|
||||
|
||||
exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
|
||||
};
|
||||
|
||||
module.exports.resolveLocalFileSystemURI = function() {
|
||||
console.log("resolveLocalFileSystemURI is deprecated. Please call resolveLocalFileSystemURL instead.");
|
||||
module.exports.resolveLocalFileSystemURL.apply(this, arguments);
|
||||
};
|
||||
})();
|
||||
|
||||
});
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
cordova.define("cordova-plugin-fullscreen.AndroidFullScreen", function(require, exports, module) {
|
||||
(function(window, undefined)
|
||||
{
|
||||
'use strict';
|
||||
|
||||
var AndroidFullScreen =
|
||||
{
|
||||
SYSTEM_UI_FLAG_FULLSCREEN: 4,
|
||||
SYSTEM_UI_FLAG_HIDE_NAVIGATION: 2,
|
||||
SYSTEM_UI_FLAG_IMMERSIVE: 2048,
|
||||
SYSTEM_UI_FLAG_IMMERSIVE_STICKY: 4096,
|
||||
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: 1024,
|
||||
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION: 512,
|
||||
SYSTEM_UI_FLAG_LAYOUT_STABLE: 256,
|
||||
SYSTEM_UI_FLAG_LIGHT_STATUS_BAR: 8192,
|
||||
SYSTEM_UI_FLAG_LOW_PROFILE: 1,
|
||||
SYSTEM_UI_FLAG_VISIBLE: 0,
|
||||
|
||||
isSupported: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'isSupported', []);
|
||||
},
|
||||
|
||||
isImmersiveModeSupported: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'isImmersiveModeSupported', []);
|
||||
},
|
||||
|
||||
immersiveWidth: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'immersiveWidth', []);
|
||||
},
|
||||
|
||||
immersiveHeight: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'immersiveHeight', []);
|
||||
},
|
||||
|
||||
leanMode: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'leanMode', []);
|
||||
},
|
||||
|
||||
showSystemUI: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'showSystemUI', []);
|
||||
},
|
||||
|
||||
showUnderStatusBar: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'showUnderStatusBar', []);
|
||||
},
|
||||
|
||||
showUnderSystemUI: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'showUnderSystemUI', []);
|
||||
},
|
||||
|
||||
immersiveMode: function(successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'immersiveMode', []);
|
||||
},
|
||||
|
||||
/**
|
||||
* @see https://developer.android.com/reference/android/view/View.html#setSystemUiVisibility(int)
|
||||
*/
|
||||
setSystemUiVisibility: function(visibility, successFunction, errorFunction)
|
||||
{
|
||||
cordova.exec(successFunction, errorFunction, 'AndroidFullScreen', 'setSystemUiVisibility', [visibility || 0]);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
cordova.addConstructor(function()
|
||||
{
|
||||
window.AndroidFullScreen = AndroidFullScreen;
|
||||
return window.AndroidFullScreen;
|
||||
});
|
||||
|
||||
})(window);
|
||||
|
||||
});
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
cordova.define("cordova-plugin-geolocation.PositionError", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Position error object
|
||||
*
|
||||
* @constructor
|
||||
* @param code
|
||||
* @param message
|
||||
*/
|
||||
var PositionError = function(code, message) {
|
||||
this.code = code || null;
|
||||
this.message = message || '';
|
||||
};
|
||||
|
||||
PositionError.prototype.PERMISSION_DENIED = PositionError.PERMISSION_DENIED = 1;
|
||||
PositionError.prototype.POSITION_UNAVAILABLE = PositionError.POSITION_UNAVAILABLE = 2;
|
||||
PositionError.prototype.TIMEOUT = PositionError.TIMEOUT = 3;
|
||||
|
||||
module.exports = PositionError;
|
||||
|
||||
});
|
||||
Vendored
+74
@@ -0,0 +1,74 @@
|
||||
cordova.define("cordova-plugin-geolocation.geolocation", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var exec = cordova.require('cordova/exec');
|
||||
var utils = require('cordova/utils');
|
||||
var PositionError = require('./PositionError');
|
||||
|
||||
// Native watchPosition method is called async after permissions prompt.
|
||||
// So we use additional map and own ids to return watch id synchronously.
|
||||
var pluginToNativeWatchMap = {};
|
||||
|
||||
module.exports = {
|
||||
getCurrentPosition: function(success, error, args) {
|
||||
var win = function() {
|
||||
var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation');
|
||||
geo.getCurrentPosition(success, error, args);
|
||||
};
|
||||
var fail = function() {
|
||||
if (error) {
|
||||
error(new PositionError (PositionError.PERMISSION_DENIED, 'Illegal Access'));
|
||||
}
|
||||
};
|
||||
exec(win, fail, "Geolocation", "getPermission", []);
|
||||
},
|
||||
|
||||
watchPosition: function(success, error, args) {
|
||||
var pluginWatchId = utils.createUUID();
|
||||
|
||||
var win = function() {
|
||||
var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation');
|
||||
pluginToNativeWatchMap[pluginWatchId] = geo.watchPosition(success, error, args);
|
||||
};
|
||||
|
||||
var fail = function() {
|
||||
if (error) {
|
||||
error(new PositionError(PositionError.PERMISSION_DENIED, 'Illegal Access'));
|
||||
}
|
||||
};
|
||||
exec(win, fail, "Geolocation", "getPermission", []);
|
||||
|
||||
return pluginWatchId;
|
||||
},
|
||||
|
||||
clearWatch: function(pluginWatchId) {
|
||||
var win = function() {
|
||||
var nativeWatchId = pluginToNativeWatchMap[pluginWatchId];
|
||||
var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation');
|
||||
geo.clearWatch(nativeWatchId);
|
||||
};
|
||||
|
||||
exec(win, null, "Geolocation", "getPermission", []);
|
||||
}
|
||||
};
|
||||
|
||||
});
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
cordova.define("cordova-plugin-insomnia.Insomnia", function(require, exports, module) {
|
||||
function Insomnia() {
|
||||
}
|
||||
|
||||
Insomnia.prototype.keepAwake = function (successCallback, errorCallback) {
|
||||
cordova.exec(successCallback, errorCallback, "Insomnia", "keepAwake", []);
|
||||
};
|
||||
|
||||
Insomnia.prototype.allowSleepAgain = function (successCallback, errorCallback) {
|
||||
cordova.exec(successCallback, errorCallback, "Insomnia", "allowSleepAgain", []);
|
||||
};
|
||||
|
||||
Insomnia.install = function () {
|
||||
if (!window.plugins) {
|
||||
window.plugins = {};
|
||||
}
|
||||
|
||||
window.plugins.insomnia = new Insomnia();
|
||||
return window.plugins.insomnia;
|
||||
};
|
||||
|
||||
cordova.addConstructor(Insomnia.install);
|
||||
});
|
||||
Vendored
+37
@@ -0,0 +1,37 @@
|
||||
cordova.define("cordova-plugin-network-information.Connection", function(require, exports, module) {
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Network status
|
||||
*/
|
||||
module.exports = {
|
||||
UNKNOWN: "unknown",
|
||||
ETHERNET: "ethernet",
|
||||
WIFI: "wifi",
|
||||
CELL_2G: "2g",
|
||||
CELL_3G: "3g",
|
||||
CELL_4G: "4g",
|
||||
CELL:"cellular",
|
||||
NONE: "none"
|
||||
};
|
||||
|
||||
});
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
cordova.define("cordova-plugin-network-information.network", function(require, exports, module) {
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
var exec = require('cordova/exec'),
|
||||
cordova = require('cordova'),
|
||||
channel = require('cordova/channel'),
|
||||
utils = require('cordova/utils');
|
||||
|
||||
// Link the onLine property with the Cordova-supplied network info.
|
||||
// This works because we clobber the navigator object with our own
|
||||
// object in bootstrap.js.
|
||||
// Browser platform do not need to define this property, because
|
||||
// it is already supported by modern browsers
|
||||
if (cordova.platformId !== 'browser' && typeof navigator != 'undefined') {
|
||||
utils.defineGetter(navigator, 'onLine', function() {
|
||||
return this.connection.type != 'none';
|
||||
});
|
||||
}
|
||||
|
||||
function NetworkConnection() {
|
||||
this.type = 'unknown';
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)
|
||||
*/
|
||||
NetworkConnection.prototype.getInfo = function(successCallback, errorCallback) {
|
||||
exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
|
||||
};
|
||||
|
||||
var me = new NetworkConnection();
|
||||
var timerId = null;
|
||||
var timeout = 500;
|
||||
|
||||
channel.createSticky('onCordovaConnectionReady');
|
||||
channel.waitForInitialization('onCordovaConnectionReady');
|
||||
|
||||
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;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,30 @@
|
||||
cordova.define("cordova-plugin-tts.tts", function(require, exports, module) {
|
||||
/*
|
||||
|
||||
Cordova Text-to-Speech Plugin
|
||||
https://github.com/vilic/cordova-plugin-tts
|
||||
|
||||
by VILIC VANE
|
||||
https://github.com/vilic
|
||||
|
||||
MIT License
|
||||
|
||||
*/
|
||||
|
||||
exports.speak = function (text, onfulfilled, onrejected) {
|
||||
var options = {};
|
||||
|
||||
if (typeof text == 'string') {
|
||||
options.text = text;
|
||||
} else {
|
||||
options = text;
|
||||
}
|
||||
|
||||
cordova
|
||||
.exec(function () {
|
||||
onfulfilled();
|
||||
}, function (reason) {
|
||||
onrejected(reason);
|
||||
}, 'TTS', 'speak', [options]);
|
||||
};
|
||||
});
|
||||
@@ -0,0 +1,64 @@
|
||||
cordova.define("cordova-plugin-x-toast.tests", function(require, exports, module) {
|
||||
exports.defineAutoTests = function() {
|
||||
|
||||
var fail = function (done) {
|
||||
expect(true).toBe(false);
|
||||
done();
|
||||
},
|
||||
succeed = function (done) {
|
||||
expect(true).toBe(true);
|
||||
done();
|
||||
};
|
||||
|
||||
describe('Plugin availability', function () {
|
||||
it("window.plugins.toast should exist", function() {
|
||||
expect(window.plugins.toast).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('API functions', function () {
|
||||
it("should define show", function() {
|
||||
expect(window.plugins.toast.show).toBeDefined();
|
||||
});
|
||||
|
||||
it("should define showWithOptions", function() {
|
||||
expect(window.plugins.toast.showWithOptions).toBeDefined();
|
||||
});
|
||||
|
||||
it("should define optionsBuilder", function() {
|
||||
expect(window.plugins.toast.optionsBuilder).toBeDefined();
|
||||
});
|
||||
|
||||
it("should define showShortTop", function() {
|
||||
expect(window.plugins.toast.showShortTop).toBeDefined();
|
||||
});
|
||||
|
||||
it("should define showShortCenter", function() {
|
||||
expect(window.plugins.toast.showShortCenter).toBeDefined();
|
||||
});
|
||||
|
||||
it("should define showShortBottom", function() {
|
||||
expect(window.plugins.toast.showShortBottom).toBeDefined();
|
||||
});
|
||||
|
||||
it("should define showLongTop", function() {
|
||||
expect(window.plugins.toast.showLongTop).toBeDefined();
|
||||
});
|
||||
|
||||
it("should define showLongCenter", function() {
|
||||
expect(window.plugins.toast.showLongCenter).toBeDefined();
|
||||
});
|
||||
|
||||
it("should define showLongBottom", function() {
|
||||
expect(window.plugins.toast.showLongBottom).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('Invalid usage', function () {
|
||||
it("should fail due to an invalid position", function(done) {
|
||||
window.plugins.toast.show('hi', 'short', 'nowhere', fail.bind(null, done), succeed.bind(null, done));
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
});
|
||||
@@ -0,0 +1,101 @@
|
||||
cordova.define("cordova-plugin-x-toast.Toast", function(require, exports, module) {
|
||||
function Toast() {
|
||||
}
|
||||
|
||||
Toast.prototype.optionsBuilder = function () {
|
||||
|
||||
// defaults
|
||||
var message = null;
|
||||
var duration = "short";
|
||||
var position = "center";
|
||||
var addPixelsY = 0;
|
||||
|
||||
return {
|
||||
withMessage: function(m) {
|
||||
message = m.toString();
|
||||
return this;
|
||||
},
|
||||
|
||||
withDuration: function(d) {
|
||||
duration = d.toString();
|
||||
return this;
|
||||
},
|
||||
|
||||
withPosition: function(p) {
|
||||
position = p;
|
||||
return this;
|
||||
},
|
||||
|
||||
withAddPixelsY: function(y) {
|
||||
addPixelsY = y;
|
||||
return this;
|
||||
},
|
||||
|
||||
build: function() {
|
||||
return {
|
||||
message: message,
|
||||
duration: duration,
|
||||
position: position,
|
||||
addPixelsY: addPixelsY
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Toast.prototype.showWithOptions = function (options, successCallback, errorCallback) {
|
||||
options.duration = (options.duration === undefined ? 'long' : options.duration.toString());
|
||||
options.message = options.message.toString();
|
||||
cordova.exec(successCallback, errorCallback, "Toast", "show", [options]);
|
||||
};
|
||||
|
||||
Toast.prototype.show = function (message, duration, position, successCallback, errorCallback) {
|
||||
this.showWithOptions(
|
||||
this.optionsBuilder()
|
||||
.withMessage(message)
|
||||
.withDuration(duration)
|
||||
.withPosition(position)
|
||||
.build(),
|
||||
successCallback,
|
||||
errorCallback);
|
||||
};
|
||||
|
||||
Toast.prototype.showShortTop = function (message, successCallback, errorCallback) {
|
||||
this.show(message, "short", "top", successCallback, errorCallback);
|
||||
};
|
||||
|
||||
Toast.prototype.showShortCenter = function (message, successCallback, errorCallback) {
|
||||
this.show(message, "short", "center", successCallback, errorCallback);
|
||||
};
|
||||
|
||||
Toast.prototype.showShortBottom = function (message, successCallback, errorCallback) {
|
||||
this.show(message, "short", "bottom", successCallback, errorCallback);
|
||||
};
|
||||
|
||||
Toast.prototype.showLongTop = function (message, successCallback, errorCallback) {
|
||||
this.show(message, "long", "top", successCallback, errorCallback);
|
||||
};
|
||||
|
||||
Toast.prototype.showLongCenter = function (message, successCallback, errorCallback) {
|
||||
this.show(message, "long", "center", successCallback, errorCallback);
|
||||
};
|
||||
|
||||
Toast.prototype.showLongBottom = function (message, successCallback, errorCallback) {
|
||||
this.show(message, "long", "bottom", successCallback, errorCallback);
|
||||
};
|
||||
|
||||
Toast.prototype.hide = function (successCallback, errorCallback) {
|
||||
cordova.exec(successCallback, errorCallback, "Toast", "hide", []);
|
||||
};
|
||||
|
||||
Toast.install = function () {
|
||||
if (!window.plugins) {
|
||||
window.plugins = {};
|
||||
}
|
||||
|
||||
window.plugins.toast = new Toast();
|
||||
return window.plugins.toast;
|
||||
};
|
||||
|
||||
cordova.addConstructor(Toast.install);
|
||||
});
|
||||
@@ -0,0 +1,13 @@
|
||||
cordova.define("cordova.custom.plugins.exitapp.exitApp", function(require, exports, module) {
|
||||
var exec = require('cordova/exec');
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* Exits the PhoneGap application with no questions asked.
|
||||
*/
|
||||
exitApp: function() {
|
||||
exec(null, null, 'ExitApp', 'exitApp', []);
|
||||
}
|
||||
};
|
||||
|
||||
});
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
cordova.define("phonegap-plugin-speech-recognition.SpeechGrammar", function(require, exports, module) {
|
||||
var SpeechGrammar = function() {
|
||||
this.src;
|
||||
this.weight;
|
||||
};
|
||||
|
||||
module.exports = SpeechGrammar;
|
||||
|
||||
});
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
cordova.define("phonegap-plugin-speech-recognition.SpeechGrammarList", function(require, exports, module) {
|
||||
var SpeechGrammarList = function(data) {
|
||||
this._list = data;
|
||||
this.length = this._list.length;
|
||||
};
|
||||
|
||||
SpeechGrammarList.prototype.item = function(item) {
|
||||
return this._list[item];
|
||||
};
|
||||
|
||||
SpeechGrammarList.prototype.addFromUri = function(item) {
|
||||
};
|
||||
|
||||
SpeechGrammarList.prototype.addFromString = function(item) {
|
||||
};
|
||||
|
||||
module.exports = SpeechGrammarList;
|
||||
|
||||
});
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
cordova.define("phonegap-plugin-speech-recognition.SpeechRecognition", function(require, exports, module) {
|
||||
var exec = require("cordova/exec");
|
||||
|
||||
/**
|
||||
attribute SpeechGrammarList grammars;
|
||||
attribute DOMString lang;
|
||||
attribute boolean continuous;
|
||||
attribute boolean interimResults;
|
||||
attribute unsigned long maxAlternatives;
|
||||
attribute DOMString serviceURI;
|
||||
*/
|
||||
var SpeechRecognition = function () {
|
||||
this.grammars = null;
|
||||
this.lang = "en";
|
||||
this.continuous = false;
|
||||
this.interimResults = false;
|
||||
this.maxAlternatives = 1;
|
||||
this.serviceURI = "";
|
||||
|
||||
// event methods
|
||||
this.onaudiostart = null;
|
||||
this.onsoundstart = null;
|
||||
this.onspeechstart = null;
|
||||
this.onspeechend = null;
|
||||
this.onsoundend = null;
|
||||
this.onaudioend = null;
|
||||
this.onresult = null;
|
||||
this.onnomatch = null;
|
||||
this.onerror = null;
|
||||
this.onstart = null;
|
||||
this.onend = null;
|
||||
|
||||
exec(function() {
|
||||
console.log("initialized");
|
||||
}, function(e) {
|
||||
console.log("error: " + e);
|
||||
}, "SpeechRecognition", "init", []);
|
||||
};
|
||||
|
||||
SpeechRecognition.prototype.start = function() {
|
||||
var that = this;
|
||||
var successCallback = function(event) {
|
||||
if (event.type === "audiostart" && typeof that.onaudiostart === "function") {
|
||||
that.onaudiostart(event);
|
||||
} else if (event.type === "soundstart" && typeof that.onsoundstart === "function") {
|
||||
that.onsoundstart(event);
|
||||
} else if (event.type === "speechstart" && typeof that.onspeechstart === "function") {
|
||||
that.onspeechstart(event);
|
||||
} else if (event.type === "speechend" && typeof that.onspeechend === "function") {
|
||||
that.onspeechend(event);
|
||||
} else if (event.type === "soundend" && typeof that.onsoundend === "function") {
|
||||
that.onsoundend(event);
|
||||
} else if (event.type === "audioend" && typeof that.onaudioend === "function") {
|
||||
that.onaudioend(event);
|
||||
} else if (event.type === "result" && typeof that.onresult === "function") {
|
||||
that.onresult(event);
|
||||
} else if (event.type === "nomatch" && typeof that.onnomatch === "function") {
|
||||
that.onnomatch(event);
|
||||
} else if (event.type === "start" && typeof that.onstart === "function") {
|
||||
that.onstart(event);
|
||||
} else if (event.type === "end" && typeof that.onend === "function") {
|
||||
that.onend(event);
|
||||
}
|
||||
};
|
||||
var errorCallback = function(err) {
|
||||
if (typeof that.onerror === "function") {
|
||||
that.onerror(err);
|
||||
}
|
||||
};
|
||||
|
||||
exec(successCallback, errorCallback, "SpeechRecognition", "start", [this.lang, this.interimResults, this.maxAlternatives]);
|
||||
};
|
||||
|
||||
SpeechRecognition.prototype.stop = function() {
|
||||
exec(null, null, "SpeechRecognition", "stop", []);
|
||||
};
|
||||
|
||||
SpeechRecognition.prototype.abort = function() {
|
||||
exec(null, null, "SpeechRecognition", "abort", []);
|
||||
};
|
||||
|
||||
module.exports = SpeechRecognition;
|
||||
|
||||
});
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
cordova.define("phonegap-plugin-speech-recognition.SpeechRecognitionAlternative", function(require, exports, module) {
|
||||
var SpeechRecognitionAlternative = function() {
|
||||
this.transcript = null;
|
||||
this.confidence = 0.0;
|
||||
};
|
||||
|
||||
module.exports = SpeechRecognitionAlternative;
|
||||
|
||||
});
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
cordova.define("phonegap-plugin-speech-recognition.SpeechRecognitionError", function(require, exports, module) {
|
||||
var SpeechRecognitionError = function() {
|
||||
this.error = null;
|
||||
this.message = null;
|
||||
};
|
||||
|
||||
SpeechRecognitionError['no-speech'] = 0;
|
||||
SpeechRecognitionError['aborted'] = 1;
|
||||
SpeechRecognitionError['audio-capture'] = 2;
|
||||
SpeechRecognitionError['network'] = 3;
|
||||
SpeechRecognitionError['not-allowed'] = 4;
|
||||
SpeechRecognitionError['service-not-allowed'] = 5;
|
||||
SpeechRecognitionError['bad-grammar'] = 6;
|
||||
SpeechRecognitionError['language-not-supported'] = 7;
|
||||
|
||||
module.exports = SpeechRecognitionError;
|
||||
|
||||
});
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
cordova.define("phonegap-plugin-speech-recognition.SpeechRecognitionEvent", function(require, exports, module) {
|
||||
var SpeechRecognitionEvent = function() {
|
||||
this.resultIndex;
|
||||
this.results;
|
||||
this.interpretation;
|
||||
this.emma;
|
||||
};
|
||||
|
||||
module.exports = SpeechRecognitionEvent;
|
||||
|
||||
});
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
cordova.define("phonegap-plugin-speech-recognition.SpeechRecognitionResult", function(require, exports, module) {
|
||||
// A complete one-shot simple response
|
||||
var SpeechRecognitionResult = function() {
|
||||
this._result = [];
|
||||
this.length = 0;
|
||||
this.final = false;
|
||||
};
|
||||
|
||||
SpeechRecognitionResult.prototype.item = function(item) {
|
||||
return this._result[item];
|
||||
};
|
||||
|
||||
module.exports = SpeechRecognitionResult;
|
||||
|
||||
});
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
cordova.define("phonegap-plugin-speech-recognition.SpeechRecognitionResultList", function(require, exports, module) {
|
||||
// A collection of responses (used in continuous mode)
|
||||
var SpeechRecognitionResultList = function() {
|
||||
this._result = [];
|
||||
this.length = 0;
|
||||
};
|
||||
|
||||
SpeechRecognitionResultList.prototype.item = function(item) {
|
||||
return this._result[item];
|
||||
};
|
||||
|
||||
module.exports = SpeechRecognitionResultList;
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user