From 197dcd2ae7a39747c587816d8bb7e7e693974134 Mon Sep 17 00:00:00 2001 From: Ryan McGrath Date: Wed, 11 May 2011 21:06:42 +0900 Subject: [PATCH] "Open Sourcing" this, perhaps people will find it interesting/useful. --- .gitignore | 1 + AndroidManifest.xml | 26 + LICENSE | 21 + README.txt | 63 + assets/www/index.html | 520 +++ assets/www/phonegap.0.9.4.js | 3498 +++++++++++++++++++ assets/www/zepto.js | 22 + build.properties | 18 + build.xml | 84 + default.properties | 11 + libs/phonegap.0.9.4.jar | Bin 0 -> 122562 bytes proguard.cfg | 36 + res/drawable-hdpi/icon.png | Bin 0 -> 8769 bytes res/drawable-ldpi/icon.png | Bin 0 -> 8769 bytes res/drawable-mdpi/icon.png | Bin 0 -> 8769 bytes res/layout/main.xml | 11 + res/values/strings.xml | 5 + src/com/phonegap/Katanakana/Katanakana.java | 23 + 18 files changed, 4339 insertions(+) create mode 100644 .gitignore create mode 100755 AndroidManifest.xml create mode 100644 LICENSE create mode 100755 README.txt create mode 100755 assets/www/index.html create mode 100755 assets/www/phonegap.0.9.4.js create mode 100644 assets/www/zepto.js create mode 100755 build.properties create mode 100755 build.xml create mode 100755 default.properties create mode 100755 libs/phonegap.0.9.4.jar create mode 100755 proguard.cfg create mode 100644 res/drawable-hdpi/icon.png create mode 100644 res/drawable-ldpi/icon.png create mode 100644 res/drawable-mdpi/icon.png create mode 100755 res/layout/main.xml create mode 100755 res/values/strings.xml create mode 100755 src/com/phonegap/Katanakana/Katanakana.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..639cdd5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +local.properties diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100755 index 0000000..b580340 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cd5b253 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2009 - 2010 Ryan McGrath + +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. diff --git a/README.txt b/README.txt new file mode 100755 index 0000000..5a9fa0e --- /dev/null +++ b/README.txt @@ -0,0 +1,63 @@ +Katanakana! (カタナカナ!) +--------------------------------------------------------------------------------------------------------------------------- +Katanakana is an Android application built using the **[Phonegap Mobile Framework](http://www.phonegap.com/)** that +aims to teach people one of the Japanese alphabets, Katakana. Katakana is often noted to be one of the more useful +languages to have some sense of if you're visiting Japan, as it's largely used on menus and for words that aren't +of Japanese origin. + +It aims to teach through a somewhat algorithmic approach; what this basically entails is a simple formula that watches +for how often a character is incorrectly identified by the user, and will adjust its "resurfacing" time based on the average +amount of seconds it seems to take a person to commit a character to short term memory. This app is built to try and use +short term memory as a jumping off point; **[for more information on the approach used here, consult the initial release article](http://venodesigns.net/2011/03/06/hacking-the-human-brain/)**. + +Something to note is that this application was built over the course of roughly 3 hours; it's an initial first shot/attempt +that may or may not be 100% beneficial to people, but with refinement could be quite interesting. Katanakana is released under +an MIT license in the hopes that others might find the approach interesting, and further extend it to the benefit of any party +interested in learning Japanese. + + +The Version of Katanakana in the Android Market... +--------------------------------------------------------------------------------------------------------------------------- +The version of this application is listed on the Android Market, and priced at 99 cents USD. The original author keeps it on +there for the hell of it, but anyone is free to repurpose this and upload it to the market for themselves, just give proper +attribution as the MIT license specifies. :) + +**[Katanakana on the Android Market](https://market.android.com/details?id=com.phonegap.Katanakana)** + + +Questions, Comments? +--------------------------------------------------------------------------------------------------------------------------- +Email: **ryan [at] venodesigns _dot_ net** +Twitter: **[@ryanmcgrath](http://twitter.com/ryanmcgrath)** +Web: **[Veno Designs](http://venodesigns.net/)** + + +Requirements for Compiling +------------------------------------------- +**[Android Development Environment](http://developer.android.com/sdk/index.html)** +**[Ant, if you're using a Terminal]()** +**[Eclipse, if you're a Java-head who uses IDEs](http://www.eclipse.org/)** + + +Compiling This Yourself (Eclipse) +------------------------------------------- +Eclipse has an Android plugin to facilitate this. I don't use it because +Eclipse and IDEs just get in my way (what this basically means is that I don't even +know where to begin with this). Documentation should be abound, though, as it's an official +Google supported method for Android development. + +If you work with this enough, feel free to submit a pull request for this section of the README, +other Eclipse users would surely appreciate it! + + +Compiling This Yourself (Terminal) +------------------------------------------- +To compile/run on a phone/device in debug mode, run (in the root directory): + + ant -v debug install + +To compile/store a signed version, **[generate an application keystore](http://developer.android.com/guide/publishing/app-signing.html)** and run: + + ant release + +It should ask you for a keystore password/etc; if you did the generation step, you should know them. ;) diff --git a/assets/www/index.html b/assets/www/index.html new file mode 100755 index 0000000..9406ed5 --- /dev/null +++ b/assets/www/index.html @@ -0,0 +1,520 @@ + + + + + + Katanakana + + + + + +
+

You Can Do This!

+

+ Learning any of the Japanese alphabets can seem like a daunting task because there's + just so many characters. Thing is, this doesn't have to be difficult! +

+ +

+ The human brain works in a mysterious fashion, and everybody has their own point at which the brain commits something + to memory. Katanakana watches how you identify characters, and will figure out when your brain has the best chance of + storing the relations you need to read Japanese. +

+ +

+ Once this is determined, it'll make you re-identify those characters + at the ideal moment, and you'll be good to go! +

+ + +
+ + + + + + + diff --git a/assets/www/phonegap.0.9.4.js b/assets/www/phonegap.0.9.4.js new file mode 100755 index 0000000..593f6cd --- /dev/null +++ b/assets/www/phonegap.0.9.4.js @@ -0,0 +1,3498 @@ +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + + +/** + * The order of events during page load and PhoneGap startup is as follows: + * + * onDOMContentLoaded Internal event that is received when the web page is loaded and parsed. + * window.onload Body onload event. + * onNativeReady Internal event that indicates the PhoneGap native side is ready. + * onPhoneGapInit Internal event that kicks off creation of all PhoneGap JavaScript objects (runs constructors). + * onPhoneGapReady Internal event fired when all PhoneGap JavaScript objects have been created + * onPhoneGapInfoReady Internal event fired when device properties are available + * onDeviceReady User event fired to indicate that PhoneGap is ready + * onResume User event fired to indicate a start/resume lifecycle event + * + * The only PhoneGap events that user code should register for are: + * onDeviceReady + * onResume + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + */ + +if (typeof(DeviceInfo) != 'object') + DeviceInfo = {}; + +/** + * This represents the PhoneGap API itself, and provides a global namespace for accessing + * information about the state of PhoneGap. + * @class + */ +var PhoneGap = { + queue: { + ready: true, + commands: [], + timer: null + } +}; + + +/** + * Custom pub-sub channel that can have functions subscribed to it + */ +PhoneGap.Channel = function(type) +{ + this.type = type; + this.handlers = {}; + this.guid = 0; + this.fired = false; + this.enabled = true; +}; + +/** + * Subscribes the given function to the channel. Any time that + * Channel.fire is called so too will the function. + * Optionally specify an execution context for the function + * and a guid that can be used to stop subscribing to the channel. + * Returns the guid. + */ +PhoneGap.Channel.prototype.subscribe = function(f, c, g) { + // need a function to call + if (f == null) { return; } + + var func = f; + if (typeof c == "object" && f instanceof Function) { func = PhoneGap.close(c, f); } + + g = g || func.observer_guid || f.observer_guid || this.guid++; + func.observer_guid = g; + f.observer_guid = g; + this.handlers[g] = func; + return g; +}; + +/** + * Like subscribe but the function is only called once and then it + * auto-unsubscribes itself. + */ +PhoneGap.Channel.prototype.subscribeOnce = function(f, c) { + var g = null; + var _this = this; + var m = function() { + f.apply(c || null, arguments); + _this.unsubscribe(g); + } + if (this.fired) { + if (typeof c == "object" && f instanceof Function) { f = PhoneGap.close(c, f); } + f.apply(this, this.fireArgs); + } else { + g = this.subscribe(m); + } + return g; +}; + +/** + * Unsubscribes the function with the given guid from the channel. + */ +PhoneGap.Channel.prototype.unsubscribe = function(g) { + if (g instanceof Function) { g = g.observer_guid; } + this.handlers[g] = null; + delete this.handlers[g]; +}; + +/** + * Calls all functions subscribed to this channel. + */ +PhoneGap.Channel.prototype.fire = function(e) { + if (this.enabled) { + var fail = false; + for (var item in this.handlers) { + var handler = this.handlers[item]; + if (handler instanceof Function) { + var rv = (handler.apply(this, arguments)==false); + fail = fail || rv; + } + } + this.fired = true; + this.fireArgs = arguments; + return !fail; + } + return true; +}; + +/** + * Calls the provided function only after all of the channels specified + * have been fired. + */ +PhoneGap.Channel.join = function(h, c) { + var i = c.length; + var f = function() { + if (!(--i)) h(); + } + var len = i; + for (var j=0; j + * + * @param name The plugin name + * @param obj The plugin object + */ +PhoneGap.addPlugin = function(name, obj) { + if (!window.plugins[name]) { + window.plugins[name] = obj; + } + else { + console.log("Error: Plugin "+name+" already exists."); + } +} + +/** + * onDOMContentLoaded channel is fired when the DOM content + * of the page has been parsed. + */ +PhoneGap.onDOMContentLoaded = new PhoneGap.Channel('onDOMContentLoaded'); + +/** + * onNativeReady channel is fired when the PhoneGap native code + * has been initialized. + */ +PhoneGap.onNativeReady = new PhoneGap.Channel('onNativeReady'); + +/** + * onPhoneGapInit channel is fired when the web page is fully loaded and + * PhoneGap native code has been initialized. + */ +PhoneGap.onPhoneGapInit = new PhoneGap.Channel('onPhoneGapInit'); + +/** + * onPhoneGapReady channel is fired when the JS PhoneGap objects have been created. + */ +PhoneGap.onPhoneGapReady = new PhoneGap.Channel('onPhoneGapReady'); + +/** + * onPhoneGapInfoReady channel is fired when the PhoneGap device properties + * has been set. + */ +PhoneGap.onPhoneGapInfoReady = new PhoneGap.Channel('onPhoneGapInfoReady'); + +/** + * onResume channel is fired when the PhoneGap native code + * resumes. + */ +PhoneGap.onResume = new PhoneGap.Channel('onResume'); + +/** + * onPause channel is fired when the PhoneGap native code + * pauses. + */ +PhoneGap.onPause = new PhoneGap.Channel('onPause'); + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any PhoneGap JS is ready. +if (typeof _nativeReady !== 'undefined') { PhoneGap.onNativeReady.fire(); } + +/** + * onDeviceReady is fired only after all PhoneGap objects are created and + * the device properties are set. + */ +PhoneGap.onDeviceReady = new PhoneGap.Channel('onDeviceReady'); + + +// Array of channels that must fire before "deviceready" is fired +PhoneGap.deviceReadyChannelsArray = [ PhoneGap.onPhoneGapReady, PhoneGap.onPhoneGapInfoReady]; + +// Hashtable of user defined channels that must also fire before "deviceready" is fired +PhoneGap.deviceReadyChannelsMap = {}; + +/** + * Indicate that a feature needs to be initialized before it is ready to be used. + * This holds up PhoneGap's "deviceready" event until the feature has been initialized + * and PhoneGap.initComplete(feature) is called. + * + * @param feature {String} The unique feature name + */ +PhoneGap.waitForInitialization = function(feature) { + if (feature) { + var channel = new PhoneGap.Channel(feature); + PhoneGap.deviceReadyChannelsMap[feature] = channel; + PhoneGap.deviceReadyChannelsArray.push(channel); + } +}; + +/** + * Indicate that initialization code has completed and the feature is ready to be used. + * + * @param feature {String} The unique feature name + */ +PhoneGap.initializationComplete = function(feature) { + var channel = PhoneGap.deviceReadyChannelsMap[feature]; + if (channel) { + channel.fire(); + } +}; + +/** + * Create all PhoneGap objects once page has fully loaded and native side is ready. + */ +PhoneGap.Channel.join(function() { + + // Start listening for XHR callbacks + setTimeout(function() { + if (CallbackServer.usePolling()) { + PhoneGap.JSCallbackPolling(); + } + else { + PhoneGap.JSCallback(); + } + }, 1); + + // Run PhoneGap constructors + PhoneGap.onPhoneGapInit.fire(); + + // Fire event to notify that all objects are created + PhoneGap.onPhoneGapReady.fire(); + + PhoneGap.Channel.join(function() { + + // Turn off app loading dialog + navigator.notification.activityStop(); + + PhoneGap.onDeviceReady.fire(); + + // Fire the onresume event, since first one happens before JavaScript is loaded + PhoneGap.onResume.fire(); + }, PhoneGap.deviceReadyChannelsArray); + +}, [ PhoneGap.onDOMContentLoaded, PhoneGap.onNativeReady ]); + +/** + * Fire onDeviceReady event once all constructors have run and PhoneGap info has been + * received from native side. + */ + /* +PhoneGap.Channel.join(function() { + // Turn off app loading dialog + navigator.notification.activityStop(); + + PhoneGap.onDeviceReady.fire(); + + // Fire the onresume event, since first one happens before JavaScript is loaded + PhoneGap.onResume.fire(); +}, [ PhoneGap.onPhoneGapReady, PhoneGap.onPhoneGapInfoReady]); +*/ + +// Listen for DOMContentLoaded and notify our channel subscribers +document.addEventListener('DOMContentLoaded', function() { + PhoneGap.onDOMContentLoaded.fire(); +}, false); + +// Intercept calls to document.addEventListener and watch for deviceready +PhoneGap.m_document_addEventListener = document.addEventListener; + +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (e == 'deviceready') { + PhoneGap.onDeviceReady.subscribeOnce(handler); + } else if (e == 'resume') { + PhoneGap.onResume.subscribe(handler); + if (PhoneGap.onDeviceReady.fired) { + PhoneGap.onResume.fire(); + } + } else if (e == 'pause') { + PhoneGap.onPause.subscribe(handler); + } else { + PhoneGap.m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +/** + * If JSON not included, use our own stringify. (Android 1.6) + * The restriction on ours is that it must be an array of simple types. + * + * @param args + * @return + */ +PhoneGap.stringify = function(args) { + if (typeof JSON == "undefined") { + var s = "["; + for (var i=0; i 0) { + s = s + ","; + } + var type = typeof args[i]; + if ((type == "number") || (type == "boolean")) { + s = s + args[i]; + } + else if (args[i] instanceof Array) { + s = s + "[" + args[i] + "]"; + } + else if (args[i] instanceof Object) { + var start = true; + s = s + '{'; + for (var name in args[i]) { + if (args[i][name] != null) { + if (!start) { + s = s + ','; + } + s = s + '"' + name + '":'; + var nameType = typeof args[i][name]; + if ((nameType == "number") || (nameType == "boolean")) { + s = s + args[i][name]; + } + else if ((typeof args[i][name]) == 'function') { + // don't copy the functions + s = s + '""'; + } + else if (args[i][name] instanceof Object) { + s = s + this.stringify(args[i][name]); + } + else { + s = s + '"' + args[i][name] + '"'; + } + start=false; + } + } + s = s + '}'; + } + else { + var a = args[i].replace(/\\/g, '\\\\'); + a = a.replace(/"/g, '\\"'); + s = s + '"' + a + '"'; + } + } + s = s + "]"; + return s; + } + else { + return JSON.stringify(args); + } +}; + +/** + * Does a deep clone of the object. + * + * @param obj + * @return + */ +PhoneGap.clone = function(obj) { + if(!obj) { + return obj; + } + + if(obj instanceof Array){ + var retVal = new Array(); + for(var i = 0; i < obj.length; ++i){ + retVal.push(PhoneGap.clone(obj[i])); + } + return retVal; + } + + if (obj instanceof Function) { + return obj; + } + + if(!(obj instanceof Object)){ + return obj; + } + + if (obj instanceof Date) { + return obj; + } + + retVal = new Object(); + for(i in obj){ + if(!(i in retVal) || retVal[i] != obj[i]) { + retVal[i] = PhoneGap.clone(obj[i]); + } + } + return retVal; +}; + +PhoneGap.callbackId = 0; +PhoneGap.callbacks = {}; +PhoneGap.callbackStatus = { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }; + + +/** + * Execute a PhoneGap command. It is up to the native side whether this action is synch or async. + * The native side can return: + * Synchronous: PluginResult object as a JSON string + * Asynchrounous: Empty string "" + * If async, the native side will PhoneGap.callbackSuccess or PhoneGap.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 PhoneGap + * @param {String[]} [args] Zero or more arguments to pass to the method + */ +PhoneGap.exec = function(success, fail, service, action, args) { + try { + var callbackId = service + PhoneGap.callbackId++; + if (success || fail) { + PhoneGap.callbacks[callbackId] = {success:success, fail:fail}; + } + + // Note: Device returns string, but for some reason emulator returns object - so convert to string. + var r = ""+PluginManager.exec(service, action, callbackId, this.stringify(args), true); + + // If a result was returned + if (r.length > 0) { + eval("var v="+r+";"); + + // If status is OK, then return value back to caller + if (v.status == PhoneGap.callbackStatus.OK) { + + // If there is a success callback, then call it now with returned value + if (success) { + try { + success(v.message); + } + catch (e) { + console.log("Error in success callback: "+callbackId+" = "+e); + } + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + return v.message; + } + + // If no result + else if (v.status == PhoneGap.callbackStatus.NO_RESULT) { + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + + // If error, then display error + else { + console.log("Error: Status="+r.status+" Message="+v.message); + + // If there is a fail callback, then call it now with returned value + if (fail) { + try { + fail(v.message); + } + catch (e) { + console.log("Error in error callback: "+callbackId+" = "+e); + } + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + return null; + } + } + } catch (e) { + console.log("Error: "+e); + } +}; + +/** + * Called by native code when returning successful result from an action. + * + * @param callbackId + * @param args + */ +PhoneGap.callbackSuccess = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + + // If result is to be sent to callback + if (args.status == PhoneGap.callbackStatus.OK) { + try { + if (PhoneGap.callbacks[callbackId].success) { + PhoneGap.callbacks[callbackId].success(args.message); + } + } + catch (e) { + console.log("Error in success callback: "+callbackId+" = "+e); + } + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + +/** + * Called by native code when returning error result from an action. + * + * @param callbackId + * @param args + */ +PhoneGap.callbackError = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + try { + if (PhoneGap.callbacks[callbackId].fail) { + PhoneGap.callbacks[callbackId].fail(args.message); + } + } + catch (e) { + console.log("Error in error callback: "+callbackId+" = "+e); + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + + +/** + * Internal function used to dispatch the request to PhoneGap. It processes the + * command queue and executes the next command on the list. If one of the + * arguments is a JavaScript object, it will be passed on the QueryString of the + * url, which will be turned into a dictionary on the other end. + * @private + */ +// TODO: Is this used? +PhoneGap.run_command = function() { + if (!PhoneGap.available || !PhoneGap.queue.ready) + return; + + PhoneGap.queue.ready = false; + + var args = PhoneGap.queue.commands.shift(); + if (PhoneGap.queue.commands.length == 0) { + clearInterval(PhoneGap.queue.timer); + PhoneGap.queue.timer = null; + } + + var uri = []; + var dict = null; + for (var i = 1; i < args.length; i++) { + var arg = args[i]; + if (arg == undefined || arg == null) + arg = ''; + if (typeof(arg) == 'object') + dict = arg; + else + uri.push(encodeURIComponent(arg)); + } + var url = "gap://" + args[0] + "/" + uri.join("/"); + if (dict != null) { + var query_args = []; + for (var name in dict) { + if (typeof(name) != 'string') + continue; + query_args.push(encodeURIComponent(name) + "=" + encodeURIComponent(dict[name])); + } + if (query_args.length > 0) + url += "?" + query_args.join("&"); + } + document.location = url; + +}; + +PhoneGap.JSCallbackPort = null; +PhoneGap.JSCallbackToken = null; + +/** + * This is only for Android. + * + * Internal function that uses XHR to call into PhoneGap Java code and retrieve + * any JavaScript code that needs to be run. This is used for callbacks from + * Java to JavaScript. + */ +PhoneGap.JSCallback = function() { + var xmlhttp = new XMLHttpRequest(); + + // Callback function when XMLHttpRequest is ready + xmlhttp.onreadystatechange=function(){ + if(xmlhttp.readyState == 4){ + + // If callback has JavaScript statement to execute + if (xmlhttp.status == 200) { + + var msg = xmlhttp.responseText; + setTimeout(function() { + try { + var t = eval(msg); + } + catch (e) { + // If we're getting an error here, seeing the message will help in debugging + console.log("JSCallback: Message from Server: " + msg); + console.log("JSCallback Error: "+e); + } + }, 1); + setTimeout(PhoneGap.JSCallback, 1); + } + + // If callback ping (used to keep XHR request from timing out) + else if (xmlhttp.status == 404) { + setTimeout(PhoneGap.JSCallback, 10); + } + + // If security error + else if (xmlhttp.status == 403) { + console.log("JSCallback Error: Invalid token. Stopping callbacks."); + } + + // If server is stopping + else if (xmlhttp.status == 503) { + console.log("JSCallback Error: Service unavailable. Stopping callbacks."); + } + + // If request wasn't GET + else if (xmlhttp.status == 400) { + console.log("JSCallback Error: Bad request. Stopping callbacks."); + } + + // If error, restart callback server + else { + console.log("JSCallback Error: Request failed."); + CallbackServer.restartServer(); + PhoneGap.JSCallbackPort = null; + PhoneGap.JSCallbackToken = null; + setTimeout(PhoneGap.JSCallback, 100); + } + } + } + + if (PhoneGap.JSCallbackPort == null) { + PhoneGap.JSCallbackPort = CallbackServer.getPort(); + } + if (PhoneGap.JSCallbackToken == null) { + PhoneGap.JSCallbackToken = CallbackServer.getToken(); + } + xmlhttp.open("GET", "http://127.0.0.1:"+PhoneGap.JSCallbackPort+"/"+PhoneGap.JSCallbackToken , true); + xmlhttp.send(); +}; + +/** + * The polling period to use with JSCallbackPolling. + * This can be changed by the application. The default is 50ms. + */ +PhoneGap.JSCallbackPollingPeriod = 50; + +/** + * This is only for Android. + * + * Internal function that uses polling to call into PhoneGap Java code and retrieve + * any JavaScript code that needs to be run. This is used for callbacks from + * Java to JavaScript. + */ +PhoneGap.JSCallbackPolling = function() { + var msg = CallbackServer.getJavascript(); + if (msg) { + setTimeout(function() { + try { + var t = eval(""+msg); + } + catch (e) { + console.log("JSCallbackPolling: Message from Server: " + msg); + console.log("JSCallbackPolling Error: "+e); + } + }, 1); + setTimeout(PhoneGap.JSCallbackPolling, 1); + } + else { + setTimeout(PhoneGap.JSCallbackPolling, PhoneGap.JSCallbackPollingPeriod); + } +}; + +/** + * Create a UUID + * + * @return + */ +PhoneGap.createUUID = function() { + return PhoneGap.UUIDcreatePart(4) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(6); +}; + +PhoneGap.UUIDcreatePart = function(length) { + var uuidpart = ""; + for (var i=0; i frequency + 10 sec + PhoneGap.exec( + function(timeout) { + if (timeout < (frequency + 10000)) { + PhoneGap.exec(null, null, "Accelerometer", "setTimeout", [frequency + 10000]); + } + }, + function(e) { }, "Accelerometer", "getTimeout", []); + + // Start watch timer + var id = PhoneGap.createUUID(); + navigator.accelerometer.timers[id] = setInterval(function() { + PhoneGap.exec(successCallback, errorCallback, "Accelerometer", "getAcceleration", []); + }, (frequency ? frequency : 1)); + + return id; +}; + +/** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ +Accelerometer.prototype.clearWatch = function(id) { + + // Stop javascript timer & remove from timer list + if (id && navigator.accelerometer.timers[id] != undefined) { + clearInterval(navigator.accelerometer.timers[id]); + delete navigator.accelerometer.timers[id]; + } +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer(); +}); +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * Constructor + */ +function App() { +} + +/** + * Clear the resource cache. + */ +App.prototype.clearCache = function() { + PhoneGap.exec(null, null, "App", "clearCache", []); +}; + +/** + * Load the url into the webview. + * + * @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 + * hideLoadingDialogOnPage: boolean => hide loadingDialog when page loaded instead of when deviceready event occurs. + * loadInWebView: boolean => cause all links on web page to be loaded into existing web view, instead of being loaded into new browser. + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * errorUrl: URL => URL to load if there's an error loading specified URL with loadUrl(). Should be a local URL such as file:///android_asset/www/error.html"); + * keepRunning: boolean => enable app to keep running in background + * + * Example: + * App app = new App(); + * app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ +App.prototype.loadUrl = function(url, props) { + PhoneGap.exec(null, null, "App", "loadUrl", [url, props]); +}; + +/** + * Cancel loadUrl that is waiting to be loaded. + */ +App.prototype.cancelLoadUrl = function() { + PhoneGap.exec(null, null, "App", "cancelLoadUrl", []); +}; + +/** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ +App.prototype.clearHistory = function() { + PhoneGap.exec(null, null, "App", "clearHistory", []); +}; + +/** + * Add a class that implements a service. + * + * @param serviceType + * @param className + */ +App.prototype.addService = function(serviceType, className) { + PhoneGap.exec(null, null, "App", "addService", [serviceType, className]); +}; +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * This class provides access to the device camera. + * + * @constructor + */ +Camera = function() { + this.successCallback = null; + this.errorCallback = null; + this.options = null; +}; + +/** + * Format of image that returned from getPicture. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.DestinationType = { + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1 // Return file uri (content://media/external/images/media/2 for Android) +}; +Camera.prototype.DestinationType = Camera.DestinationType; + +/** + * Source to getPicture from. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.PictureSourceType = { + PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) + CAMERA : 1, // Take picture from camera + SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) +}; +Camera.prototype.PictureSourceType = Camera.PictureSourceType; + +/** + * Gets a picture from source defined by "options.sourceType", and returns the + * image as defined by the "options.destinationType" option. + + * The defaults are sourceType=CAMERA and destinationType=DATA_URL. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +Camera.prototype.getPicture = function(successCallback, errorCallback, options) { + + // successCallback required + if (typeof successCallback != "function") { + console.log("Camera Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback != "function")) { + console.log("Camera Error: errorCallback is not a function"); + return; + } + + this.options = options; + var quality = 80; + if (options.quality) { + quality = this.options.quality; + } + var destinationType = Camera.DestinationType.DATA_URL; + if (this.options.destinationType) { + destinationType = this.options.destinationType; + } + var sourceType = Camera.PictureSourceType.CAMERA; + if (typeof this.options.sourceType == "number") { + sourceType = this.options.sourceType; + } + PhoneGap.exec(successCallback, errorCallback, "Camera", "takePicture", [quality, destinationType, sourceType]); +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); +}); +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * This class provides access to device Compass data. + * @constructor + */ +function Compass() { + /** + * The last known Compass position. + */ + this.lastHeading = null; + + /** + * List of compass watch timers + */ + this.timers = {}; +}; + +Compass.ERROR_MSG = ["Not running", "Starting", "", "Failed to start"]; + +/** + * Asynchronously aquires the current heading. + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + * @param {PositionOptions} options The options for getting the heading data such as timeout. (OPTIONAL) + */ +Compass.prototype.getCurrentHeading = function(successCallback, errorCallback, options) { + + // successCallback required + if (typeof successCallback != "function") { + console.log("Compass Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback != "function")) { + console.log("Compass Error: errorCallback is not a function"); + return; + } + + // Get heading + PhoneGap.exec(successCallback, errorCallback, "Compass", "getHeading", []); +}; + +/** + * Asynchronously aquires the heading repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + * @param {HeadingOptions} options The options for getting the heading data such as timeout and the frequency of the watch. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ +Compass.prototype.watchHeading= function(successCallback, errorCallback, options) { + + // Default interval (100 msec) + var frequency = (options != undefined) ? options.frequency : 100; + + // successCallback required + if (typeof successCallback != "function") { + console.log("Compass Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback != "function")) { + console.log("Compass Error: errorCallback is not a function"); + return; + } + + // Make sure compass timeout > frequency + 10 sec + PhoneGap.exec( + function(timeout) { + if (timeout < (frequency + 10000)) { + PhoneGap.exec(null, null, "Compass", "setTimeout", [frequency + 10000]); + } + }, + function(e) { }, "Compass", "getTimeout", []); + + // Start watch timer to get headings + var id = PhoneGap.createUUID(); + navigator.compass.timers[id] = setInterval( + function() { + PhoneGap.exec(successCallback, errorCallback, "Compass", "getHeading", []); + }, (frequency ? frequency : 1)); + + return id; +}; + + +/** + * Clears the specified heading watch. + * + * @param {String} id The ID of the watch returned from #watchHeading. + */ +Compass.prototype.clearWatch = function(id) { + + // Stop javascript timer & remove from timer list + if (id && navigator.compass.timers[id]) { + clearInterval(navigator.compass.timers[id]); + delete navigator.compass.timers[id]; + } +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.compass == "undefined") navigator.compass = new Compass(); +}); +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** +* Contains information about a single contact. +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {ContactField[]} phoneNumbers array of phone numbers +* @param {ContactField[]} emails array of email addresses +* @param {ContactAddress[]} addresses array of addresses +* @param {ContactField[]} ims instant messaging user ids +* @param {ContactOrganization[]} organizations +* @param {DOMString} revision date contact was last updated +* @param {DOMString} birthday contact's birthday +* @param {DOMString} gender contact's gender +* @param {DOMString} note user notes about contact +* @param {ContactField[]} photos +* @param {ContactField[]} categories +* @param {ContactField[]} urls contact's web sites +* @param {DOMString} timezone the contacts time zone +*/ +var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, revision, birthday, gender, note, photos, categories, urls, timezone) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.revision = revision || null; + this.birthday = birthday || null; + this.gender = gender || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] + this.timezone = timezone || null; +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + if (this.id == null) { + var errorObj = new ContactError(); + errorObj.code = ContactError.NOT_FOUND_ERROR; + errorCB(errorObj); + } + else { + PhoneGap.exec(successCB, errorCB, "Contacts", "remove", [this.id]); + } +}; + +/** +* Creates a deep copy of this Contact. +* With the contact ID set to null. +* @return copy of this Contact +*/ +Contact.prototype.clone = function() { + var clonedContact = PhoneGap.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + // Loop through and clear out any id's in phones, emails, etc. + if (clonedContact.phoneNumbers) { + for (i=0; i][;base64], + * + * @param file The name of the file + */ +FileReader.prototype.readAsDataURL = function(file) { + this.fileName = file; + + // LOADING state + this.readyState = FileReader.LOADING; + + // If loadstart callback + if (typeof this.onloadstart == "function") { + var evt = File._createEvent("loadstart", this); + this.onloadstart(evt); + } + + var me = this; + + // Read file + navigator.fileMgr.readAsDataURL(file, + + // Success callback + function(r) { + + // If DONE (cancelled), then don't do anything + if (me.readyState == FileReader.DONE) { + return; + } + + // Save result + me.result = r; + + // If onload callback + if (typeof me.onload == "function") { + var evt = File._createEvent("load", me); + me.onload(evt); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend == "function") { + var evt = File._createEvent("loadend", me); + me.onloadend(evt); + } + }, + + // Error callback + function(e) { + + // If DONE (cancelled), then don't do anything + if (me.readyState == FileReader.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror == "function") { + var evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend == "function") { + var evt = File._createEvent("loadend", me); + me.onloadend(evt); + } + } + ); +}; + +/** + * Read file and return data as a binary data. + * + * @param file The name of the file + */ +FileReader.prototype.readAsBinaryString = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +/** + * Read file and return data as a binary data. + * + * @param file The name of the file + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +//----------------------------------------------------------------------------- +// File Writer +//----------------------------------------------------------------------------- + +/** + * 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" + * + * @param filePath the file to write to + * @param append if true write to the end of the file, otherwise overwrite the file + */ +function FileWriter(filePath, append) { + this.fileName = ""; + this.length = 0; + if (filePath) { + var f = navigator.fileMgr.getFileProperties(filePath); + this.fileName = f.name; + this.length = f.size; + } + // default is to write at the beginning of the file + this.position = (append !== true) ? 0 : this.length; + + 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 FileError.INVALID_STATE_ERR; + } + + // set error + var error = new FileError(); + error.code = error.ABORT_ERR; + this.error = error; + + // If error callback + if (typeof this.onerror == "function") { + var evt = File._createEvent("error", this); + this.onerror(evt); + } + // If abort callback + if (typeof this.onabort == "function") { + var evt = File._createEvent("abort", this); + this.onabort(evt); + } + + this.readyState = FileWriter.DONE; + + // If write end callback + if (typeof this.onwriteend == "function") { + var evt = File._createEvent("writeend", this); + this.onwriteend(evt); + } +}; + +/** + * @Deprecated: use write instead + * + * @param file to write the data to + * @param text to be written + * @param bAppend if true write to end of file, otherwise overwrite the file + */ +FileWriter.prototype.writeAsText = function(file, text, bAppend) { + // Throw an exception if we are already writing a file + if (this.readyState == FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + if (bAppend != true) { + bAppend = false; // for null values + } + + this.fileName = file; + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart == "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + // Write file + navigator.fileMgr.writeAsText(file, text, bAppend, + + // Success callback + function(r) { + + // If DONE (cancelled), then don't do anything + if (me.readyState == FileWriter.DONE) { + return; + } + + // Save result + me.result = r; + + // If onwrite callback + if (typeof me.onwrite == "function") { + var evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend == "function") { + var evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + + // If DONE (cancelled), then don't do anything + if (me.readyState == FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror == "function") { + var evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend == "function") { + var evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); + +}; + +/** + * Writes data to the file + * + * @param text to be written + */ +FileWriter.prototype.write = function(text) { + // Throw an exception if we are already writing a file + if (this.readyState == FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart == "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + // Write file + navigator.fileMgr.write(this.fileName, text, this.position, + + // Success callback + function(r) { + + // If DONE (cancelled), then don't do anything + if (me.readyState == FileWriter.DONE) { + return; + } + + // So if the user wants to keep appending to the file + me.length = Math.max(me.length, me.position + r); + // position always increases by bytes written because file would be extended + me.position += r; + + // If onwrite callback + if (typeof me.onwrite == "function") { + var evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend == "function") { + var evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + + // If DONE (cancelled), then don't do anything + if (me.readyState == FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror == "function") { + var evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend == "function") { + var evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); + +}; + +/** + * 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 FileError.INVALID_STATE_ERR; + } + + if (!offset) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger then 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 FileError.INVALID_STATE_ERR; + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart == "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + // Write file + navigator.fileMgr.truncate(this.fileName, size, + + // Success callback + function(r) { + + // If DONE (cancelled), then don't do anything + if (me.readyState == FileWriter.DONE) { + return; + } + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r);; + + // If onwrite callback + if (typeof me.onwrite == "function") { + var evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend == "function") { + var evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + + // If DONE (cancelled), then don't do anything + if (me.readyState == FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror == "function") { + var evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend == "function") { + var evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); +}; + +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * FileTransfer uploads a file to a remote server. + */ +function FileTransfer() {}; + +/** + * FileUploadResult + */ +function FileUploadResult() { + this.bytesSent = 0; + this.responseCode = null; + this.response = null; +}; + +/** + * FileTransferError + */ +function FileTransferError() { + this.code = null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; + +/** +* Given an absolute file path, uploads a file on the device to a remote server +* using a multipart HTTP request. +* @param filePath {String} Full path of the file on the device +* @param server {String} URL of the server to receive the file +* @param successCallback (Function} Callback to be invoked when upload has completed +* @param errorCallback {Function} Callback to be invoked upon error +* @param options {FileUploadOptions} Optional parameters such as file name and mimetype +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, debug) { + + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + PhoneGap.exec(successCallback, errorCallback, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, debug]); +}; + +/** + * Options to customize the HTTP request used to upload files. + * @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. + */ +function FileUploadOptions(fileKey, fileName, mimeType, params) { + this.fileKey = fileKey || null; + this.fileName = fileName || null; + this.mimeType = mimeType || null; + this.params = params || null; +}; +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * This class provides access to device GPS data. + * @constructor + */ +function Geolocation() { + + // The last known GPS position. + this.lastPosition = null; + + // Geolocation listeners + this.listeners = {}; +}; + +/** + * Position error object + * + * @param code + * @param message + */ +function PositionError(code, message) { + this.code = code; + this.message = message; +}; + +PositionError.PERMISSION_DENIED = 1; +PositionError.POSITION_UNAVAILABLE = 2; +PositionError.TIMEOUT = 3; + +/** + * Asynchronously aquires the current position. + * + * @param {Function} successCallback The function to call when the position data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) + * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) + */ +Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) { + if (navigator._geo.listeners["global"]) { + console.log("Geolocation Error: Still waiting for previous getCurrentPosition() request."); + try { + errorCallback(new PositionError(PositionError.TIMEOUT, "Geolocation Error: Still waiting for previous getCurrentPosition() request.")); + } catch (e) { + } + return; + } + var maximumAge = 10000; + var enableHighAccuracy = false; + var timeout = 10000; + if (typeof options != "undefined") { + if (typeof options.maximumAge != "undefined") { + maximumAge = options.maximumAge; + } + if (typeof options.enableHighAccuracy != "undefined") { + enableHighAccuracy = options.enableHighAccuracy; + } + if (typeof options.timeout != "undefined") { + timeout = options.timeout; + } + } + navigator._geo.listeners["global"] = {"success" : successCallback, "fail" : errorCallback }; + PhoneGap.exec(null, null, "Geolocation", "getCurrentLocation", [enableHighAccuracy, timeout, maximumAge]); +} + +/** + * Asynchronously watches the geolocation for changes to geolocation. When a change occurs, + * the successCallback is called with the new location. + * + * @param {Function} successCallback The function to call each time the location data is available + * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL) + * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ +Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) { + var maximumAge = 10000; + var enableHighAccuracy = false; + var timeout = 10000; + if (typeof options != "undefined") { + if (typeof options.frequency != "undefined") { + maximumAge = options.frequency; + } + if (typeof options.maximumAge != "undefined") { + maximumAge = options.maximumAge; + } + if (typeof options.enableHighAccuracy != "undefined") { + enableHighAccuracy = options.enableHighAccuracy; + } + if (typeof options.timeout != "undefined") { + timeout = options.timeout; + } + } + var id = PhoneGap.createUUID(); + navigator._geo.listeners[id] = {"success" : successCallback, "fail" : errorCallback }; + PhoneGap.exec(null, null, "Geolocation", "start", [id, enableHighAccuracy, timeout, maximumAge]); + return id; +}; + +/* + * Native callback when watch position has a new position. + * PRIVATE METHOD + * + * @param {String} id + * @param {Number} lat + * @param {Number} lng + * @param {Number} alt + * @param {Number} altacc + * @param {Number} head + * @param {Number} vel + * @param {Number} stamp + */ +Geolocation.prototype.success = function(id, lat, lng, alt, altacc, head, vel, stamp) { + var coords = new Coordinates(lat, lng, alt, altacc, head, vel); + var loc = new Position(coords, stamp); + try { + if (lat == "undefined" || lng == "undefined") { + navigator._geo.listeners[id].fail(new PositionError(PositionError.POSITION_UNAVAILABLE, "Lat/Lng are undefined.")); + } + else { + navigator._geo.lastPosition = loc; + navigator._geo.listeners[id].success(loc); + } + } + catch (e) { + console.log("Geolocation Error: Error calling success callback function."); + } + + if (id == "global") { + delete navigator._geo.listeners["global"]; + } +}; + +/** + * Native callback when watch position has an error. + * PRIVATE METHOD + * + * @param {String} id The ID of the watch + * @param {Number} code The error code + * @param {String} msg The error message + */ +Geolocation.prototype.fail = function(id, code, msg) { + try { + navigator._geo.listeners[id].fail(new PositionError(code, msg)); + } + catch (e) { + console.log("Geolocation Error: Error calling error callback function."); + } +}; + +/** + * Clears the specified heading watch. + * + * @param {String} id The ID of the watch returned from #watchPosition + */ +Geolocation.prototype.clearWatch = function(id) { + PhoneGap.exec(null, null, "Geolocation", "stop", [id]); + delete navigator._geo.listeners[id]; +}; + +/** + * Force the PhoneGap geolocation to be used instead of built-in. + */ +Geolocation.usingPhoneGap = false; +Geolocation.usePhoneGap = function() { + if (Geolocation.usingPhoneGap) { + return; + } + Geolocation.usingPhoneGap = true; + + // Set built-in geolocation methods to our own implementations + // (Cannot replace entire geolocation, but can replace individual methods) + navigator.geolocation.setLocation = navigator._geo.setLocation; + navigator.geolocation.getCurrentPosition = navigator._geo.getCurrentPosition; + navigator.geolocation.watchPosition = navigator._geo.watchPosition; + navigator.geolocation.clearWatch = navigator._geo.clearWatch; + navigator.geolocation.start = navigator._geo.start; + navigator.geolocation.stop = navigator._geo.stop; +}; + +PhoneGap.addConstructor(function() { + navigator._geo = new Geolocation(); + + // No native geolocation object for Android 1.x, so use PhoneGap geolocation + if (typeof navigator.geolocation == 'undefined') { + navigator.geolocation = navigator._geo; + Geolocation.usingPhoneGap = true; + } +}); + +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +function KeyEvent() { +} + +KeyEvent.prototype.backTrigger = function() { + var e = document.createEvent('Events'); + e.initEvent('backKeyDown'); + document.dispatchEvent(e); +}; + +KeyEvent.prototype.menuTrigger = function() { + var e = document.createEvent('Events'); + e.initEvent('menuKeyDown'); + document.dispatchEvent(e); +}; + +KeyEvent.prototype.searchTrigger = function() { + var e = document.createEvent('Events'); + e.initEvent('searchKeyDown'); + document.dispatchEvent(e); +}; + +if (document.keyEvent == null || typeof document.keyEvent == 'undefined') { + window.keyEvent = document.keyEvent = new KeyEvent(); +} +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * List of media objects. + * PRIVATE + */ +PhoneGap.mediaObjects = {}; + +/** + * Object that receives native callbacks. + * PRIVATE + */ +PhoneGap.Media = function() {}; + +/** + * Get the media object. + * PRIVATE + * + * @param id The media object id (string) + */ +PhoneGap.Media.getMediaObject = function(id) { + return PhoneGap.mediaObjects[id]; +}; + +/** + * Audio has status update. + * PRIVATE + * + * @param id The media object id (string) + * @param status The status code (int) + * @param msg The status message (string) + */ +PhoneGap.Media.onStatus = function(id, msg, value) { + var media = PhoneGap.mediaObjects[id]; + + // If state update + if (msg == Media.MEDIA_STATE) { + if (value == Media.MEDIA_STOPPED) { + if (media.successCallback) { + media.successCallback(); + } + } + if (media.statusCallback) { + media.statusCallback(value); + } + } + else if (msg == Media.MEDIA_DURATION) { + media._duration = value; + } + else if (msg == Media.MEDIA_ERROR) { + if (media.errorCallback) { + media.errorCallback(value); + } + } +}; + +/** + * This class provides access to the device media, interfaces to both sound and video + * + * @param src The file name or url to play + * @param successCallback The callback to be called when the file is done playing or recording. + * successCallback() - OPTIONAL + * @param errorCallback The callback to be called if there is an error. + * errorCallback(int errorCode) - OPTIONAL + * @param statusCallback The callback to be called when media status has changed. + * statusCallback(int statusCode) - OPTIONAL + * @param positionCallback The callback to be called when media position has changed. + * positionCallback(long position) - OPTIONAL + */ +Media = function(src, successCallback, errorCallback, statusCallback, positionCallback) { + + // successCallback optional + if (successCallback && (typeof successCallback != "function")) { + console.log("Media Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback != "function")) { + console.log("Media Error: errorCallback is not a function"); + return; + } + + // statusCallback optional + if (statusCallback && (typeof statusCallback != "function")) { + console.log("Media Error: statusCallback is not a function"); + return; + } + + // statusCallback optional + if (positionCallback && (typeof positionCallback != "function")) { + console.log("Media Error: positionCallback is not a function"); + return; + } + + this.id = PhoneGap.createUUID(); + PhoneGap.mediaObjects[this.id] = this; + this.src = src; + this.successCallback = successCallback; + this.errorCallback = errorCallback; + this.statusCallback = statusCallback; + this.positionCallback = positionCallback; + this._duration = -1; + this._position = -1; +}; + +// Media messages +Media.MEDIA_STATE = 1; +Media.MEDIA_DURATION = 2; +Media.MEDIA_ERROR = 9; + +// Media states +Media.MEDIA_NONE = 0; +Media.MEDIA_STARTING = 1; +Media.MEDIA_RUNNING = 2; +Media.MEDIA_PAUSED = 3; +Media.MEDIA_STOPPED = 4; +Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"]; + +// TODO: Will MediaError be used? +/** + * This class contains information about any Media errors. + * @constructor + */ +function MediaError() { + this.code = null, + this.message = ""; +}; + +MediaError.MEDIA_ERR_ABORTED = 1; +MediaError.MEDIA_ERR_NETWORK = 2; +MediaError.MEDIA_ERR_DECODE = 3; +MediaError.MEDIA_ERR_NONE_SUPPORTED = 4; + +/** + * Start or resume playing audio file. + */ +Media.prototype.play = function() { + PhoneGap.exec(null, null, "Media", "startPlayingAudio", [this.id, this.src]); +}; + +/** + * Stop playing audio file. + */ +Media.prototype.stop = function() { + return PhoneGap.exec(null, null, "Media", "stopPlayingAudio", [this.id]); +}; + +/** + * Pause playing audio file. + */ +Media.prototype.pause = function() { + PhoneGap.exec(null, null, "Media", "pausePlayingAudio", [this.id]); +}; + +/** + * Get duration of an audio file. + * The duration is only set for audio that is playing, paused or stopped. + * + * @return duration or -1 if not known. + */ +Media.prototype.getDuration = function() { + return this._duration; +}; + +/** + * Get position of audio. + * + * @return + */ +Media.prototype.getCurrentPosition = function(success, fail) { + PhoneGap.exec(success, fail, "Media", "getCurrentPositionAudio", [this.id]); +}; + +/** + * Start recording audio file. + */ +Media.prototype.startRecord = function() { + PhoneGap.exec(null, null, "Media", "startRecordingAudio", [this.id, this.src]); +}; + +/** + * Stop recording audio file. + */ +Media.prototype.stopRecord = function() { + PhoneGap.exec(null, null, "Media", "stopRecordingAudio", [this.id]); +}; + +/** + * Release the resources. + */ +Media.prototype.release = function() { + PhoneGap.exec(null, null, "Media", "release", [this.id]); +}; + +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * This class contains information about any NetworkStatus. + * @constructor + */ +function NetworkStatus() { + //this.code = null; + //this.message = ""; +}; + +NetworkStatus.NOT_REACHABLE = 0; +NetworkStatus.REACHABLE_VIA_CARRIER_DATA_NETWORK = 1; +NetworkStatus.REACHABLE_VIA_WIFI_NETWORK = 2; + +/** + * This class provides access to device Network data (reachability). + * @constructor + */ +function Network() { + /** + * The last known Network status. + * { hostName: string, ipAddress: string, + remoteHostStatus: int(0/1/2), internetConnectionStatus: int(0/1/2), localWiFiConnectionStatus: int (0/2) } + */ + this.lastReachability = null; +}; + +/** + * Called by the geolocation framework when the reachability status has changed. + * @param {Reachibility} reachability The current reachability status. + */ +// TODO: Callback from native code not implemented for Android +Network.prototype.updateReachability = function(reachability) { + this.lastReachability = reachability; +}; + +/** + * Determine if a URI is reachable over the network. + + * @param {Object} uri + * @param {Function} callback + * @param {Object} options (isIpAddress:boolean) + */ +Network.prototype.isReachable = function(uri, callback, options) { + var isIpAddress = false; + if (options && options.isIpAddress) { + isIpAddress = options.isIpAddress; + } + PhoneGap.exec(callback, null, "Network Status", "isReachable", [uri, isIpAddress]); +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.network == "undefined") navigator.network = new Network(); +}); + +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * This class provides access to notifications on the device. + */ +function Notification() { +} + +/** + * Open a native alert dialog, with a customizable title and button text. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} completeCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Alert) + * @param {String} buttonLabel Label of the close button (default: OK) + */ +Notification.prototype.alert = function(message, completeCallback, title, buttonLabel) { + var _title = (title || "Alert"); + var _buttonLabel = (buttonLabel || "OK"); + PhoneGap.exec(completeCallback, null, "Notification", "alert", [message,_title,_buttonLabel]); +}; + +/** + * Open a native confirm dialog, with a customizable title and button text. + * The result that the user selects is returned to the result callback. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Confirm) + * @param {String} buttonLabels Comma separated list of the labels of the buttons (default: 'OK,Cancel') + */ +Notification.prototype.confirm = function(message, resultCallback, title, buttonLabels) { + var _title = (title || "Confirm"); + var _buttonLabels = (buttonLabels || "OK,Cancel"); + PhoneGap.exec(resultCallback, null, "Notification", "confirm", [message,_title,_buttonLabels]); +}; + +/** + * Start spinning the activity indicator on the statusbar + */ +Notification.prototype.activityStart = function() { + PhoneGap.exec(null, null, "Notification", "activityStart", ["Busy","Please wait..."]); +}; + +/** + * Stop spinning the activity indicator on the statusbar, if it's currently spinning + */ +Notification.prototype.activityStop = function() { + PhoneGap.exec(null, null, "Notification", "activityStop", []); +}; + +/** + * Display a progress dialog with progress bar that goes from 0 to 100. + * + * @param {String} title Title of the progress dialog. + * @param {String} message Message to display in the dialog. + */ +Notification.prototype.progressStart = function(title, message) { + PhoneGap.exec(null, null, "Notification", "progressStart", [title, message]); +}; + +/** + * Set the progress dialog value. + * + * @param {Number} value 0-100 + */ +Notification.prototype.progressValue = function(value) { + PhoneGap.exec(null, null, "Notification", "progressValue", [value]); +}; + +/** + * Close the progress dialog. + */ +Notification.prototype.progressStop = function() { + PhoneGap.exec(null, null, "Notification", "progressStop", []); +}; + +/** + * Causes the device to blink a status LED. + * + * @param {Integer} count The number of blinks. + * @param {String} colour The colour of the light. + */ +Notification.prototype.blink = function(count, colour) { + // NOT IMPLEMENTED +}; + +/** + * Causes the device to vibrate. + * + * @param {Integer} mills The number of milliseconds to vibrate for. + */ +Notification.prototype.vibrate = function(mills) { + PhoneGap.exec(null, null, "Notification", "vibrate", [mills]); +}; + +/** + * Causes the device to beep. + * On Android, the default notification ringtone is played "count" times. + * + * @param {Integer} count The number of beeps. + */ +Notification.prototype.beep = function(count) { + PhoneGap.exec(null, null, "Notification", "beep", [count]); +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.notification == "undefined") navigator.notification = new Notification(); +}); + +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/** + * This class contains position information. + * @param {Object} lat + * @param {Object} lng + * @param {Object} acc + * @param {Object} alt + * @param {Object} altacc + * @param {Object} head + * @param {Object} vel + * @constructor + */ +function Position(coords, timestamp) { + this.coords = coords; + this.timestamp = (timestamp != 'undefined') ? timestamp : new Date().getTime(); +} + +function Coordinates(lat, lng, alt, acc, head, vel, altacc) { + /** + * The latitude of the position. + */ + this.latitude = lat; + /** + * The longitude of the position, + */ + this.longitude = lng; + /** + * The accuracy of the position. + */ + this.accuracy = acc; + /** + * The altitude of the position. + */ + this.altitude = alt; + /** + * The direction the device is moving at the position. + */ + this.heading = head; + /** + * The velocity with which the device is moving at the position. + */ + this.speed = vel; + /** + * The altitude accuracy of the position. + */ + this.altitudeAccuracy = (altacc != 'undefined') ? altacc : null; +} + +/** + * This class specifies the options for requesting position data. + * @constructor + */ +function PositionOptions() { + /** + * Specifies the desired position accuracy. + */ + this.enableHighAccuracy = true; + /** + * The timeout after which if position data cannot be obtained the errorCallback + * is called. + */ + this.timeout = 10000; +} + +/** + * This class contains information about any GSP errors. + * @constructor + */ +function PositionError() { + this.code = null; + this.message = ""; +} + +PositionError.UNKNOWN_ERROR = 0; +PositionError.PERMISSION_DENIED = 1; +PositionError.POSITION_UNAVAILABLE = 2; +PositionError.TIMEOUT = 3; +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + +/* + * This is purely for the Android 1.5/1.6 HTML 5 Storage + * I was hoping that Android 2.0 would deprecate this, but given the fact that + * most manufacturers ship with Android 1.5 and do not do OTA Updates, this is required + */ + +/** + * Storage object that is called by native code when performing queries. + * PRIVATE METHOD + */ +var DroidDB = function() { + this.queryQueue = {}; +}; + +/** + * Callback from native code when query is complete. + * PRIVATE METHOD + * + * @param id Query id + */ +DroidDB.prototype.completeQuery = function(id, data) { + var query = this.queryQueue[id]; + if (query) { + try { + delete this.queryQueue[id]; + + // Get transaction + var tx = query.tx; + + // If transaction hasn't failed + // Note: We ignore all query results if previous query + // in the same transaction failed. + if (tx && tx.queryList[id]) { + + // Save query results + var r = new DroidDB_Result(); + r.rows.resultSet = data; + r.rows.length = data.length; + try { + if (typeof query.successCallback == 'function') { + query.successCallback(query.tx, r); + } + } catch (ex) { + console.log("executeSql error calling user success callback: "+ex); + } + + tx.queryComplete(id); + } + } catch (e) { + console.log("executeSql error: "+e); + } + } +}; + +/** + * Callback from native code when query fails + * PRIVATE METHOD + * + * @param reason Error message + * @param id Query id + */ +DroidDB.prototype.fail = function(reason, id) { + var query = this.queryQueue[id]; + if (query) { + try { + delete this.queryQueue[id]; + + // Get transaction + var tx = query.tx; + + // If transaction hasn't failed + // Note: We ignore all query results if previous query + // in the same transaction failed. + if (tx && tx.queryList[id]) { + tx.queryList = {}; + + try { + if (typeof query.errorCallback == 'function') { + query.errorCallback(query.tx, reason); + } + } catch (ex) { + console.log("executeSql error calling user error callback: "+ex); + } + + tx.queryFailed(id, reason); + } + + } catch (e) { + console.log("executeSql error: "+e); + } + } +}; + +var DatabaseShell = function() { +}; + +/** + * Start a transaction. + * Does not support rollback in event of failure. + * + * @param process {Function} The transaction function + * @param successCallback {Function} + * @param errorCallback {Function} + */ +DatabaseShell.prototype.transaction = function(process, errorCallback, successCallback) { + var tx = new DroidDB_Tx(); + tx.successCallback = successCallback; + tx.errorCallback = errorCallback; + try { + process(tx); + } catch (e) { + console.log("Transaction error: "+e); + if (tx.errorCallback) { + try { + tx.errorCallback(e); + } catch (ex) { + console.log("Transaction error calling user error callback: "+e); + } + } + } +}; + +/** + * Transaction object + * PRIVATE METHOD + */ +var DroidDB_Tx = function() { + + // Set the id of the transaction + this.id = PhoneGap.createUUID(); + + // Callbacks + this.successCallback = null; + this.errorCallback = null; + + // Query list + this.queryList = {}; +}; + +/** + * Mark query in transaction as complete. + * If all queries are complete, call the user's transaction success callback. + * + * @param id Query id + */ +DroidDB_Tx.prototype.queryComplete = function(id) { + delete this.queryList[id]; + + // If no more outstanding queries, then fire transaction success + if (this.successCallback) { + var count = 0; + for (var i in this.queryList) { + count++; + } + if (count == 0) { + try { + this.successCallback(); + } catch(e) { + console.log("Transaction error calling user success callback: " + e); + } + } + } +}; + +/** + * Mark query in transaction as failed. + * + * @param id Query id + * @param reason Error message + */ +DroidDB_Tx.prototype.queryFailed = function(id, reason) { + + // The sql queries in this transaction have already been run, since + // we really don't have a real transaction implemented in native code. + // However, the user callbacks for the remaining sql queries in transaction + // will not be called. + this.queryList = {}; + + if (this.errorCallback) { + try { + this.errorCallback(reason); + } catch(e) { + console.log("Transaction error calling user error callback: " + e); + } + } +}; + +/** + * SQL query object + * PRIVATE METHOD + * + * @param tx The transaction object that this query belongs to + */ +var DroidDB_Query = function(tx) { + + // Set the id of the query + this.id = PhoneGap.createUUID(); + + // Add this query to the queue + droiddb.queryQueue[this.id] = this; + + // Init result + this.resultSet = []; + + // Set transaction that this query belongs to + this.tx = tx; + + // Add this query to transaction list + this.tx.queryList[this.id] = this; + + // Callbacks + this.successCallback = null; + this.errorCallback = null; + +} + +/** + * Execute SQL statement + * + * @param sql SQL statement to execute + * @param params Statement parameters + * @param successCallback Success callback + * @param errorCallback Error callback + */ +DroidDB_Tx.prototype.executeSql = function(sql, params, successCallback, errorCallback) { + + // Init params array + if (typeof params == 'undefined') { + params = []; + } + + // Create query and add to queue + var query = new DroidDB_Query(this); + droiddb.queryQueue[query.id] = query; + + // Save callbacks + query.successCallback = successCallback; + query.errorCallback = errorCallback; + + // Call native code + PhoneGap.exec(null, null, "Storage", "executeSql", [sql, params, query.id]); +}; + +/** + * SQL result set that is returned to user. + * PRIVATE METHOD + */ +DroidDB_Result = function() { + this.rows = new DroidDB_Rows(); +}; + +/** + * SQL result set object + * PRIVATE METHOD + */ +DroidDB_Rows = function() { + this.resultSet = []; // results array + this.length = 0; // number of rows +}; + +/** + * Get item from SQL result set + * + * @param row The row number to return + * @return The row object + */ +DroidDB_Rows.prototype.item = function(row) { + return this.resultSet[row]; +}; + +/** + * Open database + * + * @param name Database name + * @param version Database version + * @param display_name Database display name + * @param size Database size in bytes + * @return Database object + */ +DroidDB_openDatabase = function(name, version, display_name, size) { + PhoneGap.exec(null, null, "Storage", "openDatabase", [name, version, display_name, size]); + var db = new DatabaseShell(); + return db; +}; + + +/** + * For browsers with no localStorage we emulate it with SQLite. Follows the w3c api. + * TODO: Do similar for sessionStorage. + */ + +var CupcakeLocalStorage = function() { + try { + + this.db = openDatabase('localStorage', '1.0', 'localStorage', 2621440); + var storage = {}; + this.db.transaction( + function (transaction) { + transaction.executeSql('CREATE TABLE IF NOT EXISTS storage (id NVARCHAR(40) PRIMARY KEY, body NVARCHAR(255))'); + transaction.executeSql('SELECT * FROM storage', [], function(tx, result) { + for(var i = 0; i < result.rows.length; i++) { + storage[result.rows.item(i)['id']] = result.rows.item(i)['body']; + } + PhoneGap.initializationComplete("cupcakeStorage"); + }); + + }, + function (err) { + alert(err.message); + } + ); + this.setItem = function(key, val) { + console.log('set'); + storage[key] = val; + + this.db.transaction( + function (transaction) { + transaction.executeSql('CREATE TABLE IF NOT EXISTS storage (id NVARCHAR(40) PRIMARY KEY, body NVARCHAR(255))'); + + transaction.executeSql('REPLACE INTO storage (id, body) values(?,?)', [key,val]); + } + ); + } + this.getItem = function(key) { + return storage[key]; + } + this.removeItem = function(key) { + delete storage[key]; + this.db.transaction( + function (transaction) { + transaction.executeSql('CREATE TABLE IF NOT EXISTS storage (id NVARCHAR(40) PRIMARY KEY, body NVARCHAR(255))'); + + transaction.executeSql('DELETE FROM storage where id=?', [key]); + } + ); + + } + + } catch(e) { + alert("Database error "+e+"."); + return; + } +}; +PhoneGap.addConstructor(function() { + if (typeof window.openDatabase == "undefined") { + navigator.openDatabase = window.openDatabase = DroidDB_openDatabase; + window.droiddb = new DroidDB(); + } + + if (typeof window.localStorage == "undefined") { + navigator.localStorage = window.localStorage = new CupcakeLocalStorage(); + PhoneGap.waitForInitialization("cupcakeStorage"); + } +}); + diff --git a/assets/www/zepto.js b/assets/www/zepto.js new file mode 100644 index 0000000..80a023a --- /dev/null +++ b/assets/www/zepto.js @@ -0,0 +1,22 @@ +var Zepto=function(){function f(a){return a.filter(function(c){return c!==i&&c!==null})}function h(a){return a.reduce(function(c,d){return c.concat(d)},[])}function n(a){return a.replace(/-+(.)?/g,function(c,d){return d?d.toUpperCase():""})}function j(a,c){this.dom=a||[];this.length=this.dom.length;this.selector=c||""}function b(a,c){if(a==g)return new j;else if(c!==i)return b(c).find(a);else if(typeof a==="function")return b(g).ready(a);else{var d;if(a instanceof j)d=a.dom;else{if(a instanceof Array)d= +f(a);else{if(a instanceof Element||a===window)d=[a];else{if(q.test(a)){e.innerHTML=(""+a).trim();d=l.call(e.childNodes);e.innerHTML="";d=d}else d=o(g,a);d=d}d=d}d=d}return new j(d,a)}}var l=[].slice,k,m,o,q,e,g=window.document,i;if(String.prototype.trim===i)String.prototype.trim=function(){return this.replace(/^\s+/,"").replace(/\s+$/,"")};q=/^\s*<.+>/;e=g.createElement("div");b.extend=function(a,c){for(k in c)a[k]=c[k];return a};b.qsa=o=function(a,c){return l.call(a.querySelectorAll(c))};b.fn={ready:function(a){g.addEventListener("DOMContentLoaded", +a,false);return this},get:function(a){return a===i?this.dom:this.dom[a]},size:function(){return this.length},remove:function(){return this.each(function(){this.parentNode.removeChild(this)})},each:function(a){this.dom.forEach(function(c,d){a.call(c,d,c)});return this},filter:function(a){return b(this.dom.filter(function(c){return o(c.parentNode,a).indexOf(c)>=0}))},is:function(a){return this.length>0&&b(this.dom[0]).filter(a).length>0},eq:function(a){return b(this.get(a))},first:function(){return b(this.get(0))}, +last:function(){return b(this.get(this.length-1))},find:function(a){var c;c=this.length==1?o(this.get(0),a):h(this.dom.map(function(d){return o(d,a)}));return b(c)},closest:function(a,c){var d=this.dom[0],p=o(c!==i?c:g,a);if(p.length===0)d=null;for(;d&&d!==g&&p.indexOf(d)<0;)d=d.parentNode;return b(d)},parents:function(a){for(var c=[],d=this.get();d.length>0;)d=f(d.map(function(p){if((p=p.parentNode)&&p!==g&&c.indexOf(p)<0){c.push(p);return p}}));c=b(c);return a===i?c:c.filter(a)},parent:function(a){var c, +d=[];this.each(function(){if((c=this.parentNode)&&d.indexOf(c)<0)d.push(c)});d=b(d);return a===i?d:d.filter(a)},pluck:function(a){return this.dom.map(function(c){return c[a]})},show:function(){return this.css("display","block")},hide:function(){return this.css("display","none")},prev:function(){return b(this.pluck("previousElementSibling"))},next:function(){return b(this.pluck("nextElementSibling"))},html:function(a){return a===i?this.length>0?this.dom[0].innerHTML:null:this.each(function(c){this.innerHTML= +typeof a=="function"?a(c,this.innerHTML):a})},text:function(a){return a===i?this.length>0?this.dom[0].innerText:null:this.each(function(){this.innerText=a})},attr:function(a,c){return typeof a=="string"&&c===i?this.length>0&&this.dom[0].nodeName==="INPUT"&&this.dom[0].type==="text"&&a==="value"?this.val():this.length>0?this.dom[0].getAttribute(a)||i:null:this.each(function(d){if(typeof a=="object")for(k in a)this.setAttribute(k,a[k]);else this.setAttribute(a,typeof c=="function"?c(d,this.getAttribute(a)): +c)})},removeAttr:function(a){return this.each(function(){this.removeAttribute(a)})},val:function(a){return a===i?this.length>0?this.dom[0].value:null:this.each(function(){this.value=a})},offset:function(){var a=this.dom[0].getBoundingClientRect();return{left:a.left+g.body.scrollLeft,top:a.top+g.body.scrollTop,width:a.width,height:a.height}},css:function(a,c){if(c===i&&typeof a=="string")return this.dom[0].style[n(a)];m="";for(k in a)m+=k+":"+a[k]+";";if(typeof a=="string")m=a+":"+c;return this.each(function(){this.style.cssText+= +";"+m})},index:function(a){return this.dom.indexOf(b(a).get(0))},hasClass:function(a){return RegExp("(^|\\s)"+a+"(\\s|$)").test(this.dom[0].className)},addClass:function(a){return this.each(function(){!b(this).hasClass(a)&&(this.className+=(this.className?" ":"")+a)})},removeClass:function(a){return this.each(function(){this.className=this.className.replace(RegExp("(^|\\s)"+a+"(\\s|$)")," ").trim()})},toggleClass:function(a,c){return this.each(function(){c!==i&&!c||b(this).hasClass(a)?b(this).removeClass(a): +b(this).addClass(a)})}};["width","height"].forEach(function(a){b.fn[a]=function(){return this.offset()[a]}});var r={append:"beforeEnd",prepend:"afterBegin",before:"beforeBegin",after:"afterEnd"};for(k in r)b.fn[k]=function(a){return function(c){return this.each(function(d,p){if(c instanceof j){dom=c.dom;if(a=="afterBegin"||a=="afterEnd")for(var s=0;s0&&l<=250)h.isDoubleTap=true;h.last=b}).bind("touchmove",function(j){h.x2=j.touches[0].pageX}).bind("touchend",function(){if(h.isDoubleTap){f(h.target).trigger("doubleTap");h={}}else if(h.x2>0){Math.abs(h.x1-h.x2)>30&&f(h.target).trigger("swipe")&& +f(h.target).trigger("swipe"+(h.x1-h.x2>0?"Left":"Right"));h.x1=h.x2=h.last=0}else if("last"in h)n=setTimeout(function(){n=null;f(h.target).trigger("tap");h={}},250)}).bind("touchcancel",function(){h={}})});["swipe","swipeLeft","swipeRight","doubleTap","tap"].forEach(function(j){f.fn[j]=function(b){return this.bind(j,b)}})})(Zepto); +(function(f){function h(){}var n=0;f.ajaxJSONP=function(b){var l;l="jsonp"+ ++n;window[l]=b.success;var k=document.createElement("script");f(k).attr({src:b.url.replace(/callback=\?/,"callback="+l)});f("head").append(k)};f.ajax=function(b){b=b||{};if(b.url&&/callback=\?/.test(b.url))return f.ajaxJSONP(b);var l=b.data,k=b.success||h,m=b.error||h,o=j[b.dataType],q=b.contentType,e=new XMLHttpRequest;e.onreadystatechange=function(){if(e.readyState==4)if(e.status>=200&&e.status<300||e.status==0)if(o=="application/json"){var g, +i=false;try{g=JSON.parse(e.responseText)}catch(r){i=r}i?m(e,"parsererror",i):k(g,"success",e)}else k(e.responseText,"success",e);else m(e,"error")};e.open(b.type||"GET",b.url||window.location,true);o&&e.setRequestHeader("Accept",o);if(l instanceof Object){l=JSON.stringify(l);q=q||"application/json"}q&&e.setRequestHeader("Content-Type",q);e.setRequestHeader("X-Requested-With","XMLHttpRequest");e.send(l)};var j=f.ajax.mimeTypes={json:"application/json",xml:"application/xml",html:"text/html",text:"text/plain"}; +f.get=function(b,l){f.ajax({url:b,success:l})};f.post=function(b,l,k,m){if(l instanceof Function){m=m||k;k=l;l=null}f.ajax({type:"POST",url:b,data:l,success:k,dataType:m})};f.getJSON=function(b,l){f.ajax({url:b,success:l,dataType:"json"})};f.fn.load=function(b,l){if(!this.dom.length)return this;var k=this,m=b.split(/\s/),o;if(m.length>1){b=m[0];o=m[1]}f.get(b,function(q){k.html(o?f(document.createElement("div")).html(q).find(o).html():q);l&&l()});return this}})(Zepto); +(function(f){var h=[],n;f.fn.remove=function(){return this.each(function(j){if(j.tagName=="IMG"){h.push(j);j.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";n&&clearTimeout(n);n=setTimeout(function(){h=[]},6E4)}j.parentNode.removeChild(j)})}})(Zepto); diff --git a/build.properties b/build.properties new file mode 100755 index 0000000..1345d07 --- /dev/null +++ b/build.properties @@ -0,0 +1,18 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked in Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. +#key.store=kana-key.keystore +#key.alias=kanalulz diff --git a/build.xml b/build.xml new file mode 100755 index 0000000..61e09f8 --- /dev/null +++ b/build.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/default.properties b/default.properties new file mode 100755 index 0000000..9d79b12 --- /dev/null +++ b/default.properties @@ -0,0 +1,11 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-4 diff --git a/libs/phonegap.0.9.4.jar b/libs/phonegap.0.9.4.jar new file mode 100755 index 0000000000000000000000000000000000000000..b99d128f9766a0396b16e0ef26cb40ff7f21e012 GIT binary patch literal 122562 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 literal 0 HcmV?d00001 diff --git a/proguard.cfg b/proguard.cfg new file mode 100755 index 0000000..12dd039 --- /dev/null +++ b/proguard.cfg @@ -0,0 +1,36 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/res/drawable-hdpi/icon.png b/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d636a8882b8fd8372222c59e8e5eb353962e026e GIT binary patch literal 8769 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 + + + diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100755 index 0000000..7c88b76 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Katanakana + Snap + diff --git a/src/com/phonegap/Katanakana/Katanakana.java b/src/com/phonegap/Katanakana/Katanakana.java new file mode 100755 index 0000000..33e6e50 --- /dev/null +++ b/src/com/phonegap/Katanakana/Katanakana.java @@ -0,0 +1,23 @@ +package com.phonegap.Katanakana; + +import android.app.Activity; +import android.os.Bundle; +import com.phonegap.*; + +public class Katanakana extends DroidGap { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + super.init(); + + /* By default, the Android Webkit instance shows scrollbars, but our + App should scale enough that the existence of scrollbars should never + NEED to be indicated. This'll kill them by default. Scrolling/panning + around is still totally supported. + */ + super.appView.setVerticalScrollBarEnabled(false); + super.appView.setHorizontalScrollBarEnabled(false); + + super.loadUrl("file:///android_asset/www/index.html"); + } +}