From 41e1c6e2672cf905d36a960a5907e2a6442db875 Mon Sep 17 00:00:00 2001 From: Skylar Date: Mon, 16 May 2016 17:19:54 -0600 Subject: [PATCH] Branding --- config.xml | 8 +- .../2.2.1/taskArtifacts/cache.properties | 1 + .../2.2.1/taskArtifacts/cache.properties.lock | Bin 0 -> 17 bytes .../2.2.1/taskArtifacts/fileHashes.bin | Bin 0 -> 73940 bytes .../2.2.1/taskArtifacts/fileSnapshots.bin | Bin 0 -> 178362 bytes .../2.2.1/taskArtifacts/outputFileStates.bin | Bin 0 -> 20132 bytes .../2.2.1/taskArtifacts/taskArtifacts.bin | Bin 0 -> 38793 bytes platforms/android/AndroidManifest.xml | 33 +- .../debug/org/apache/cordova/BuildConfig.java | 13 + .../bundles/debug/AndroidManifest.xml | 27 + .../bundles/debug/aapt/AndroidManifest.xml | 27 + .../intermediates/bundles/debug/classes.jar | Bin 0 -> 124211 bytes .../apache/cordova/AuthenticationToken.class | Bin 0 -> 776 bytes .../org/apache/cordova/BuildConfig.class | Bin 0 -> 711 bytes .../org/apache/cordova/CallbackContext.class | Bin 0 -> 3324 bytes .../debug/org/apache/cordova/Config.class | Bin 0 -> 1841 bytes .../org/apache/cordova/ConfigXmlParser.class | Bin 0 -> 4919 bytes .../apache/cordova/CordovaActivity$1.class | Bin 0 -> 943 bytes .../apache/cordova/CordovaActivity$2.class | Bin 0 -> 1019 bytes .../apache/cordova/CordovaActivity$3.class | Bin 0 -> 1522 bytes .../apache/cordova/CordovaActivity$4$1.class | Bin 0 -> 1090 bytes .../apache/cordova/CordovaActivity$4.class | Bin 0 -> 2012 bytes .../org/apache/cordova/CordovaActivity.class | Bin 0 -> 11638 bytes .../org/apache/cordova/CordovaArgs.class | Bin 0 -> 2561 bytes .../org/apache/cordova/CordovaBridge.class | Bin 0 -> 5456 bytes .../cordova/CordovaClientCertRequest.class | Bin 0 -> 1426 bytes .../cordova/CordovaDialogsHelper$1.class | Bin 0 -> 1221 bytes .../cordova/CordovaDialogsHelper$2.class | Bin 0 -> 1201 bytes .../cordova/CordovaDialogsHelper$3.class | Bin 0 -> 1352 bytes .../cordova/CordovaDialogsHelper$4.class | Bin 0 -> 1223 bytes .../cordova/CordovaDialogsHelper$5.class | Bin 0 -> 1223 bytes .../cordova/CordovaDialogsHelper$6.class | Bin 0 -> 1203 bytes .../cordova/CordovaDialogsHelper$7.class | Bin 0 -> 1354 bytes .../cordova/CordovaDialogsHelper$8.class | Bin 0 -> 1506 bytes .../cordova/CordovaDialogsHelper$9.class | Bin 0 -> 1240 bytes .../cordova/CordovaDialogsHelper$Result.class | Bin 0 -> 277 bytes .../apache/cordova/CordovaDialogsHelper.class | Bin 0 -> 3796 bytes .../cordova/CordovaHttpAuthHandler.class | Bin 0 -> 821 bytes .../org/apache/cordova/CordovaInterface.class | Bin 0 -> 725 bytes ...vaInterfaceImpl$ActivityResultHolder.class | Bin 0 -> 1064 bytes .../apache/cordova/CordovaInterfaceImpl.class | Bin 0 -> 7378 bytes .../org/apache/cordova/CordovaPlugin.class | Bin 0 -> 6873 bytes .../apache/cordova/CordovaPreferences.class | Bin 0 -> 3223 bytes ...CordovaResourceApi$OpenForReadResult.class | Bin 0 -> 905 bytes .../apache/cordova/CordovaResourceApi.class | Bin 0 -> 12703 bytes .../org/apache/cordova/CordovaWebView.class | Bin 0 -> 2239 bytes .../cordova/CordovaWebViewEngine$Client.class | Bin 0 -> 549 bytes .../CordovaWebViewEngine$EngineView.class | Bin 0 -> 308 bytes .../apache/cordova/CordovaWebViewEngine.class | Bin 0 -> 993 bytes .../apache/cordova/CordovaWebViewImpl$1.class | Bin 0 -> 1660 bytes .../apache/cordova/CordovaWebViewImpl$2.class | Bin 0 -> 1560 bytes .../apache/cordova/CordovaWebViewImpl$3.class | Bin 0 -> 1468 bytes .../CordovaWebViewImpl$EngineClient$1$1.class | Bin 0 -> 1256 bytes .../CordovaWebViewImpl$EngineClient$1.class | Bin 0 -> 1482 bytes .../CordovaWebViewImpl$EngineClient.class | Bin 0 -> 4953 bytes .../apache/cordova/CordovaWebViewImpl.class | Bin 0 -> 16111 bytes .../org/apache/cordova/CoreAndroid$1.class | Bin 0 -> 1027 bytes .../org/apache/cordova/CoreAndroid$2.class | Bin 0 -> 748 bytes .../org/apache/cordova/CoreAndroid$3.class | Bin 0 -> 737 bytes .../org/apache/cordova/CoreAndroid$4.class | Bin 0 -> 748 bytes .../org/apache/cordova/CoreAndroid$5.class | Bin 0 -> 1988 bytes .../org/apache/cordova/CoreAndroid.class | Bin 0 -> 8259 bytes .../org/apache/cordova/ExposedJsApi.class | Bin 0 -> 442 bytes .../cordova/ICordovaClientCertRequest.class | Bin 0 -> 443 bytes .../cordova/ICordovaCookieManager.class | Bin 0 -> 345 bytes .../cordova/ICordovaHttpAuthHandler.class | Bin 0 -> 229 bytes .../debug/org/apache/cordova/LOG.class | Bin 0 -> 3423 bytes .../NativeToJsMessageQueue$BridgeMode.class | Bin 0 -> 814 bytes .../NativeToJsMessageQueue$JsMessage.class | Bin 0 -> 4055 bytes ...ToJsMessageQueue$LoadUrlBridgeMode$1.class | Bin 0 -> 1594 bytes ...veToJsMessageQueue$LoadUrlBridgeMode.class | Bin 0 -> 1562 bytes ...ativeToJsMessageQueue$NoOpBridgeMode.class | Bin 0 -> 712 bytes ...essageQueue$OnlineEventsBridgeMode$1.class | Bin 0 -> 1407 bytes ...essageQueue$OnlineEventsBridgeMode$2.class | Bin 0 -> 1733 bytes ...eMode$OnlineEventsBridgeModeDelegate.class | Bin 0 -> 499 bytes ...sMessageQueue$OnlineEventsBridgeMode.class | Bin 0 -> 2619 bytes .../cordova/NativeToJsMessageQueue.class | Bin 0 -> 7360 bytes .../org/apache/cordova/PluginEntry.class | Bin 0 -> 1042 bytes .../org/apache/cordova/PluginManager.class | Bin 0 -> 12391 bytes .../apache/cordova/PluginResult$Status.class | Bin 0 -> 1651 bytes .../org/apache/cordova/PluginResult.class | Bin 0 -> 5908 bytes .../org/apache/cordova/ResumeCallback.class | Bin 0 -> 2995 bytes .../apache/cordova/Whitelist$URLPattern.class | Bin 0 -> 3129 bytes .../debug/org/apache/cordova/Whitelist.class | Bin 0 -> 2952 bytes .../cordova/engine/SystemCookieManager.class | Bin 0 -> 1791 bytes .../cordova/engine/SystemExposedJsApi.class | Bin 0 -> 1433 bytes .../engine/SystemWebChromeClient$1.class | Bin 0 -> 1202 bytes .../engine/SystemWebChromeClient$2.class | Bin 0 -> 1204 bytes .../engine/SystemWebChromeClient$3.class | Bin 0 -> 1270 bytes .../engine/SystemWebChromeClient$4.class | Bin 0 -> 1702 bytes .../engine/SystemWebChromeClient$5.class | Bin 0 -> 1782 bytes .../engine/SystemWebChromeClient.class | Bin 0 -> 11016 bytes .../apache/cordova/engine/SystemWebView.class | Bin 0 -> 2658 bytes .../cordova/engine/SystemWebViewClient.class | Bin 0 -> 9561 bytes .../engine/SystemWebViewEngine$1.class | Bin 0 -> 1841 bytes .../engine/SystemWebViewEngine$2.class | Bin 0 -> 1050 bytes .../cordova/engine/SystemWebViewEngine.class | Bin 0 -> 11406 bytes .../compileDebugAidl/dependency.store | Bin 0 -> 5 bytes .../incremental/mergeDebugAssets/merger.xml | 2 + .../mergeDebugJniLibFolders/merger.xml | 2 + .../packageDebugResources/merger.xml | 2 + .../build/outputs/aar/CordovaLib-debug.aar | Bin 0 -> 115057 bytes platforms/android/android.json | 597 +- .../android/assets/www/cordova_plugins.js | 446 +- platforms/android/assets/www/css/main.css | 17 - platforms/android/assets/www/img/logo.png | Bin 0 -> 16260 bytes platforms/android/assets/www/img/logo.svg | 114 + platforms/android/assets/www/index.html | 3 +- platforms/android/assets/www/js/main.js | 148 +- .../www/battery.js | 113 + .../cordova-plugin-camera/www/Camera.js | 194 + .../www/CameraConstants.js | 91 + .../www/CameraPopoverHandle.js | 35 + .../www/CameraPopoverOptions.js | 55 + .../cordova-plugin-contacts/www/Contact.js | 143 + .../www/ContactAddress.js | 49 + .../www/ContactError.js | 46 + .../www/ContactField.js | 40 + .../www/ContactFieldType.js | 58 + .../www/ContactFindOptions.js | 41 + .../www/ContactName.js | 44 + .../www/ContactOrganization.js | 44 + .../cordova-plugin-contacts/www/contacts.js | 102 + .../www/convertUtils.js | 73 + .../www/Acceleration.js | 32 + .../www/accelerometer.js | 205 + .../www/CompassError.js | 37 + .../www/CompassHeading.js | 32 + .../www/compass.js | 121 + .../cordova-plugin-device/www/device.js | 86 + .../www/android/notification.js | 77 + .../www/notification.js | 130 + .../www/FileTransfer.js | 242 + .../www/FileTransferError.js | 44 + .../cordova-plugin-file/www/DirectoryEntry.js | 120 + .../www/DirectoryReader.js | 76 + .../plugins/cordova-plugin-file/www/Entry.js | 265 + .../plugins/cordova-plugin-file/www/File.js | 82 + .../cordova-plugin-file/www/FileEntry.js | 96 + .../cordova-plugin-file/www/FileError.js | 49 + .../cordova-plugin-file/www/FileReader.js | 292 + .../cordova-plugin-file/www/FileSystem.js | 58 + .../www/FileUploadOptions.js | 44 + .../www/FileUploadResult.js | 32 + .../cordova-plugin-file/www/FileWriter.js | 327 + .../plugins/cordova-plugin-file/www/Flags.js | 39 + .../www/LocalFileSystem.js | 26 + .../cordova-plugin-file/www/Metadata.js | 43 + .../cordova-plugin-file/www/ProgressEvent.js | 70 + .../www/android/FileSystem.js | 52 + .../www/browser/isChrome.js | 29 + .../www/fileSystemPaths.js | 66 + .../www/fileSystems-roots.js | 48 + .../cordova-plugin-file/www/fileSystems.js | 28 + .../www/requestFileSystem.js | 85 + .../www/resolveLocalFileSystemURI.js | 95 + .../www/PositionError.js | 41 + .../www/android/geolocation.js | 74 + .../www/CaptureAudioOptions.js | 35 + .../www/CaptureError.js | 45 + .../www/CaptureImageOptions.js | 33 + .../www/CaptureVideoOptions.js | 37 + .../www/MediaFile.js | 58 + .../www/MediaFileData.js | 42 + .../www/android/init.js | 47 + .../www/capture.js | 87 + .../www/helpers.js | 46 + .../plugins/cordova-plugin-media/www/Media.js | 260 + .../cordova-plugin-media/www/MediaError.js | 58 + .../www/Connection.js | 37 + .../www/network.js | 94 + .../cordova-plugin-vibration/www/vibration.js | 124 + .../www/barcodescanner.js | 129 - .../android/assets/www/screens/home.html | 134 +- .../android/assets/www/screens/login.html | 23 +- platforms/android/assets/www/screens/pay.html | 18 - .../assets/www/screens/paymentsent.html | 13 - .../android/assets/www/screens/peerpay.html | 20 - .../android/assets/www/screens/peersent.html | 13 - .../android/assets/www/screens/signup.html | 42 - platforms/android/build.gradle | 1 - platforms/android/libs/barcodescanner.aar | Bin 988915 -> 0 bytes .../SnipeITMobile-barcodescanner.gradle | 20 - .../android/platform_www/cordova_plugins.js | 446 +- .../www/battery.js | 113 + .../cordova-plugin-camera/www/Camera.js | 194 + .../www/CameraConstants.js | 91 + .../www/CameraPopoverHandle.js | 35 + .../www/CameraPopoverOptions.js | 55 + .../cordova-plugin-contacts/www/Contact.js | 143 + .../www/ContactAddress.js | 49 + .../www/ContactError.js | 46 + .../www/ContactField.js | 40 + .../www/ContactFieldType.js | 58 + .../www/ContactFindOptions.js | 41 + .../www/ContactName.js | 44 + .../www/ContactOrganization.js | 44 + .../cordova-plugin-contacts/www/contacts.js | 102 + .../www/convertUtils.js | 73 + .../www/Acceleration.js | 32 + .../www/accelerometer.js | 205 + .../www/CompassError.js | 37 + .../www/CompassHeading.js | 32 + .../www/compass.js | 121 + .../cordova-plugin-device/www/device.js | 86 + .../www/android/notification.js | 77 + .../www/notification.js | 130 + .../www/FileTransfer.js | 242 + .../www/FileTransferError.js | 44 + .../cordova-plugin-file/www/DirectoryEntry.js | 120 + .../www/DirectoryReader.js | 76 + .../plugins/cordova-plugin-file/www/Entry.js | 265 + .../plugins/cordova-plugin-file/www/File.js | 82 + .../cordova-plugin-file/www/FileEntry.js | 96 + .../cordova-plugin-file/www/FileError.js | 49 + .../cordova-plugin-file/www/FileReader.js | 292 + .../cordova-plugin-file/www/FileSystem.js | 58 + .../www/FileUploadOptions.js | 44 + .../www/FileUploadResult.js | 32 + .../cordova-plugin-file/www/FileWriter.js | 327 + .../plugins/cordova-plugin-file/www/Flags.js | 39 + .../www/LocalFileSystem.js | 26 + .../cordova-plugin-file/www/Metadata.js | 43 + .../cordova-plugin-file/www/ProgressEvent.js | 70 + .../www/android/FileSystem.js | 52 + .../www/browser/isChrome.js | 29 + .../www/fileSystemPaths.js | 66 + .../www/fileSystems-roots.js | 48 + .../cordova-plugin-file/www/fileSystems.js | 28 + .../www/requestFileSystem.js | 85 + .../www/resolveLocalFileSystemURI.js | 95 + .../www/PositionError.js | 41 + .../www/android/geolocation.js | 74 + .../www/CaptureAudioOptions.js | 35 + .../www/CaptureError.js | 45 + .../www/CaptureImageOptions.js | 33 + .../www/CaptureVideoOptions.js | 37 + .../www/MediaFile.js | 58 + .../www/MediaFileData.js | 42 + .../www/android/init.js | 47 + .../www/capture.js | 87 + .../www/helpers.js | 46 + .../plugins/cordova-plugin-media/www/Media.js | 260 + .../cordova-plugin-media/www/MediaError.js | 58 + .../www/Connection.js | 37 + .../www/network.js | 94 + .../cordova-plugin-vibration/www/vibration.js | 124 + .../www/barcodescanner.js | 129 - platforms/android/project.properties | 1 - platforms/android/res/xml/config.xml | 44 +- .../barcodescanner/BarcodeScanner.java | 305 - .../batterystatus/BatteryListener.java | 163 + .../apache/cordova/camera/CameraLauncher.java | 1291 ++ .../org/apache/cordova/camera/ExifHelper.java | 185 + .../org/apache/cordova/camera/FileHelper.java | 319 + .../cordova/contacts/ContactAccessor.java | 194 + .../cordova/contacts/ContactAccessorSdk5.java | 2295 +++ .../cordova/contacts/ContactInfoDTO.java | 59 + .../cordova/contacts/ContactManager.java | 307 + .../src/org/apache/cordova/device/Device.java | 174 + .../cordova/devicemotion/AccelListener.java | 306 + .../deviceorientation/CompassListener.java | 296 + .../apache/cordova/dialogs/Notification.java | 505 + .../apache/cordova/file/AssetFilesystem.java | 286 + .../cordova/file/ContentFilesystem.java | 216 + .../apache/cordova/file/DirectoryManager.java | 134 + .../cordova/file/EncodingException.java | 29 + .../cordova/file/FileExistsException.java | 29 + .../org/apache/cordova/file/FileUtils.java | 1196 ++ .../org/apache/cordova/file/Filesystem.java | 331 + .../file/InvalidModificationException.java | 30 + .../apache/cordova/file/LocalFilesystem.java | 510 + .../cordova/file/LocalFilesystemURL.java | 64 + .../file/NoModificationAllowedException.java | 29 + .../apache/cordova/file/PendingRequests.java | 94 + .../cordova/file/TypeMismatchException.java | 30 + .../filetransfer/FileProgressResult.java | 63 + .../cordova/filetransfer/FileTransfer.java | 1024 ++ .../filetransfer/FileUploadResult.java | 73 + .../cordova/geolocation/Geolocation.java | 108 + .../apache/cordova/media/AudioHandler.java | 562 + .../org/apache/cordova/media/AudioPlayer.java | 701 + .../org/apache/cordova/media/FileHelper.java | 38 + .../apache/cordova/mediacapture/Capture.java | 615 + .../cordova/mediacapture/FileHelper.java | 60 + .../cordova/mediacapture/PendingRequests.java | 228 + .../networkinformation/NetworkManager.java | 274 + .../apache/cordova/vibration/Vibration.java | 133 + platforms/browser/browser.json | 611 +- platforms/browser/config.xml | 7 +- .../browser/platform_www/cordova_plugins.js | 559 +- .../src/browser/BatteryProxy.js | 82 + .../www/battery.js | 112 + .../src/browser/CameraProxy.js | 125 + .../cordova-plugin-camera/www/Camera.js | 193 + .../www/CameraConstants.js | 90 + .../www/CameraPopoverOptions.js | 54 + .../cordova-plugin-contacts/www/Contact.js | 142 + .../www/ContactAddress.js | 48 + .../www/ContactError.js | 45 + .../www/ContactField.js | 39 + .../www/ContactFieldType.js | 57 + .../www/ContactFindOptions.js | 40 + .../www/ContactName.js | 43 + .../www/ContactOrganization.js | 43 + .../cordova-plugin-contacts/www/contacts.js | 101 + .../www/convertUtils.js | 72 + .../src/browser/AccelerometerProxy.js | 47 + .../www/Acceleration.js | 31 + .../www/accelerometer.js | 204 + .../src/browser/CompassProxy.js | 45 + .../www/CompassError.js | 36 + .../www/CompassHeading.js | 31 + .../www/compass.js | 120 + .../src/browser/DeviceProxy.js | 84 + .../cordova-plugin-device/www/device.js | 85 + .../www/browser/notification.js | 117 + .../www/notification.js | 129 + .../www/FileTransfer.js | 241 + .../www/FileTransferError.js | 43 + .../www/browser/FileTransfer.js | 346 + .../src/browser/FileProxy.js | 986 ++ .../cordova-plugin-file/www/DirectoryEntry.js | 119 + .../www/DirectoryReader.js | 75 + .../plugins/cordova-plugin-file/www/Entry.js | 264 + .../plugins/cordova-plugin-file/www/File.js | 81 + .../cordova-plugin-file/www/FileEntry.js | 95 + .../cordova-plugin-file/www/FileError.js | 48 + .../cordova-plugin-file/www/FileReader.js | 291 + .../cordova-plugin-file/www/FileSystem.js | 57 + .../www/FileUploadOptions.js | 43 + .../www/FileUploadResult.js | 31 + .../cordova-plugin-file/www/FileWriter.js | 326 + .../plugins/cordova-plugin-file/www/Flags.js | 38 + .../www/LocalFileSystem.js | 25 + .../cordova-plugin-file/www/Metadata.js | 42 + .../cordova-plugin-file/www/ProgressEvent.js | 69 + .../www/browser/FileSystem.js | 33 + .../www/browser/Preparing.js | 194 + .../www/browser/isChrome.js | 28 + .../www/fileSystemPaths.js | 65 + .../cordova-plugin-file/www/fileSystems.js | 27 + .../www/requestFileSystem.js | 84 + .../www/resolveLocalFileSystemURI.js | 94 + .../src/browser/CaptureProxy.js | 236 + .../www/CaptureAudioOptions.js | 34 + .../www/CaptureError.js | 44 + .../www/CaptureImageOptions.js | 32 + .../www/CaptureVideoOptions.js | 36 + .../www/MediaFile.js | 57 + .../www/MediaFileData.js | 41 + .../www/capture.js | 86 + .../www/helpers.js | 45 + .../plugins/cordova-plugin-media/www/Media.js | 259 + .../cordova-plugin-media/www/MediaError.js | 57 + .../cordova-plugin-media/www/browser/Media.js | 269 + .../src/browser/network.js | 50 + .../www/Connection.js | 36 + .../www/network.js | 93 + .../src/browser/Vibration.js | 29 + .../cordova-plugin-vibration/www/vibration.js | 123 + .../src/browser/BarcodeScannerProxy.js | 25 - .../www/barcodescanner.js | 128 - platforms/browser/www/config.xml | 7 +- platforms/browser/www/cordova_plugins.js | 559 +- platforms/browser/www/css/main.css | 17 - platforms/browser/www/img/logo.png | Bin 0 -> 16260 bytes platforms/browser/www/img/logo.svg | 114 + platforms/browser/www/index.html | 3 +- platforms/browser/www/js/main.js | 148 +- .../src/browser/BatteryProxy.js | 82 + .../www/battery.js | 112 + .../src/browser/CameraProxy.js | 125 + .../cordova-plugin-camera/www/Camera.js | 193 + .../www/CameraConstants.js | 90 + .../www/CameraPopoverOptions.js | 54 + .../cordova-plugin-contacts/www/Contact.js | 142 + .../www/ContactAddress.js | 48 + .../www/ContactError.js | 45 + .../www/ContactField.js | 39 + .../www/ContactFieldType.js | 57 + .../www/ContactFindOptions.js | 40 + .../www/ContactName.js | 43 + .../www/ContactOrganization.js | 43 + .../cordova-plugin-contacts/www/contacts.js | 101 + .../www/convertUtils.js | 72 + .../src/browser/AccelerometerProxy.js | 47 + .../www/Acceleration.js | 31 + .../www/accelerometer.js | 204 + .../src/browser/CompassProxy.js | 45 + .../www/CompassError.js | 36 + .../www/CompassHeading.js | 31 + .../www/compass.js | 120 + .../src/browser/DeviceProxy.js | 84 + .../cordova-plugin-device/www/device.js | 85 + .../www/browser/notification.js | 117 + .../www/notification.js | 129 + .../www/FileTransfer.js | 241 + .../www/FileTransferError.js | 43 + .../www/browser/FileTransfer.js | 346 + .../src/browser/FileProxy.js | 986 ++ .../cordova-plugin-file/www/DirectoryEntry.js | 119 + .../www/DirectoryReader.js | 75 + .../plugins/cordova-plugin-file/www/Entry.js | 264 + .../plugins/cordova-plugin-file/www/File.js | 81 + .../cordova-plugin-file/www/FileEntry.js | 95 + .../cordova-plugin-file/www/FileError.js | 48 + .../cordova-plugin-file/www/FileReader.js | 291 + .../cordova-plugin-file/www/FileSystem.js | 57 + .../www/FileUploadOptions.js | 43 + .../www/FileUploadResult.js | 31 + .../cordova-plugin-file/www/FileWriter.js | 326 + .../plugins/cordova-plugin-file/www/Flags.js | 38 + .../www/LocalFileSystem.js | 25 + .../cordova-plugin-file/www/Metadata.js | 42 + .../cordova-plugin-file/www/ProgressEvent.js | 69 + .../www/browser/FileSystem.js | 33 + .../www/browser/Preparing.js | 194 + .../www/browser/isChrome.js | 28 + .../www/fileSystemPaths.js | 65 + .../cordova-plugin-file/www/fileSystems.js | 27 + .../www/requestFileSystem.js | 84 + .../www/resolveLocalFileSystemURI.js | 94 + .../src/browser/CaptureProxy.js | 236 + .../www/CaptureAudioOptions.js | 34 + .../www/CaptureError.js | 44 + .../www/CaptureImageOptions.js | 32 + .../www/CaptureVideoOptions.js | 36 + .../www/MediaFile.js | 57 + .../www/MediaFileData.js | 41 + .../www/capture.js | 86 + .../www/helpers.js | 45 + .../plugins/cordova-plugin-media/www/Media.js | 259 + .../cordova-plugin-media/www/MediaError.js | 57 + .../cordova-plugin-media/www/browser/Media.js | 269 + .../src/browser/network.js | 50 + .../www/Connection.js | 36 + .../www/network.js | 93 + .../src/browser/Vibration.js | 29 + .../cordova-plugin-vibration/www/vibration.js | 123 + .../src/browser/BarcodeScannerProxy.js | 25 - .../www/barcodescanner.js | 128 - platforms/browser/www/screens/home.html | 134 +- platforms/browser/www/screens/login.html | 23 +- platforms/browser/www/screens/pay.html | 18 - .../browser/www/screens/paymentsent.html | 13 - platforms/browser/www/screens/peerpay.html | 20 - platforms/browser/www/screens/peersent.html | 13 - platforms/browser/www/screens/signup.html | 42 - platforms/ubuntu/apparmor.json | 2 +- platforms/ubuntu/build/src/coreplugins.cpp | 17 +- .../cordova-plugin-battery-status/battery.cpp | 78 + .../cordova-plugin-battery-status/battery.h | 62 + .../plugins/cordova-plugin-camera/camera.cpp | 140 + .../plugins/cordova-plugin-camera/camera.h | 86 + .../cordova-plugin-console/console.cpp | 29 + .../plugins/cordova-plugin-console/console.h | 43 + .../cordova-plugin-contacts/contacts.cpp | 576 + .../cordova-plugin-contacts/contacts.h | 70 + .../accelerometer.cpp | 58 + .../accelerometer.h | 55 + .../compass.cpp | 75 + .../compass.h | 58 + .../plugins/cordova-plugin-device/device.cpp | 64 + .../plugins/cordova-plugin-device/device.h | 47 + .../cordova-plugin-dialogs/notification.cpp | 85 + .../cordova-plugin-dialogs/notification.h | 64 + .../file-transfer.cpp | 265 + .../file-transfer.h | 103 + .../src/plugins/cordova-plugin-file/file.cpp | 912 ++ .../src/plugins/cordova-plugin-file/file.h | 81 + .../geolocation.cpp | 119 + .../cordova-plugin-geolocation/geolocation.h | 69 + .../cordova-plugin-media-capture/capture.cpp | 161 + .../cordova-plugin-media-capture/capture.h | 84 + .../plugins/cordova-plugin-media/media.cpp | 128 + .../src/plugins/cordova-plugin-media/media.h | 267 + .../network_information.cpp | 63 + .../network_information.h | 47 + .../cordova-plugin-vibration/vibration.cpp | 64 + .../cordova-plugin-vibration/vibration.h | 54 + platforms/ubuntu/config.xml | 21 + platforms/ubuntu/cordova.desktop | 4 +- platforms/ubuntu/manifest.json | 2 +- .../ubuntu/platform_www/cordova_plugins.js | 547 + .../www/battery.js | 112 + .../cordova-plugin-camera/www/Camera.js | 193 + .../www/CameraConstants.js | 90 + .../www/CameraPopoverHandle.js | 34 + .../www/CameraPopoverOptions.js | 54 + .../www/console-via-logger.js | 188 + .../cordova-plugin-console/www/logger.js | 356 + .../cordova-plugin-contacts/www/Contact.js | 142 + .../www/ContactAddress.js | 48 + .../www/ContactError.js | 45 + .../www/ContactField.js | 39 + .../www/ContactFieldType.js | 57 + .../www/ContactFindOptions.js | 40 + .../www/ContactName.js | 43 + .../www/ContactOrganization.js | 43 + .../cordova-plugin-contacts/www/contacts.js | 101 + .../www/convertUtils.js | 72 + .../www/Acceleration.js | 31 + .../www/accelerometer.js | 204 + .../www/CompassError.js | 36 + .../www/CompassHeading.js | 31 + .../www/compass.js | 120 + .../src/ubuntu/device.js | 35 + .../cordova-plugin-device/www/device.js | 85 + .../www/notification.js | 129 + .../www/FileTransfer.js | 241 + .../www/FileTransferError.js | 43 + .../cordova-plugin-file/www/DirectoryEntry.js | 119 + .../www/DirectoryReader.js | 75 + .../plugins/cordova-plugin-file/www/Entry.js | 264 + .../plugins/cordova-plugin-file/www/File.js | 81 + .../cordova-plugin-file/www/FileEntry.js | 95 + .../cordova-plugin-file/www/FileError.js | 48 + .../cordova-plugin-file/www/FileReader.js | 291 + .../cordova-plugin-file/www/FileSystem.js | 57 + .../www/FileUploadOptions.js | 43 + .../www/FileUploadResult.js | 31 + .../cordova-plugin-file/www/FileWriter.js | 326 + .../plugins/cordova-plugin-file/www/Flags.js | 38 + .../www/LocalFileSystem.js | 25 + .../cordova-plugin-file/www/Metadata.js | 42 + .../cordova-plugin-file/www/ProgressEvent.js | 69 + .../www/browser/isChrome.js | 28 + .../cordova-plugin-file/www/fileSystems.js | 27 + .../www/requestFileSystem.js | 84 + .../www/resolveLocalFileSystemURI.js | 94 + .../www/ubuntu/FileSystem.js | 36 + .../www/ubuntu/FileWriter.js | 137 + .../www/ubuntu/fileSystems-roots.js | 55 + .../www/Coordinates.js | 71 + .../www/Position.js | 35 + .../www/PositionError.js | 40 + .../www/geolocation.js | 213 + .../www/CaptureAudioOptions.js | 34 + .../www/CaptureError.js | 44 + .../www/CaptureImageOptions.js | 32 + .../www/CaptureVideoOptions.js | 36 + .../www/MediaFile.js | 57 + .../www/MediaFileData.js | 41 + .../www/capture.js | 86 + .../www/helpers.js | 45 + .../plugins/cordova-plugin-media/www/Media.js | 259 + .../cordova-plugin-media/www/MediaError.js | 57 + .../www/Connection.js | 36 + .../www/network.js | 93 + .../cordova-plugin-vibration/www/vibration.js | 123 + platforms/ubuntu/qml/CaptureWidget.qml | 118 + platforms/ubuntu/qml/MediaCaptureWidget.qml | 206 + platforms/ubuntu/qml/back.png | Bin 0 -> 12428 bytes platforms/ubuntu/qml/microphone.png | Bin 0 -> 10415 bytes platforms/ubuntu/qml/notification.qml | 65 + platforms/ubuntu/qml/record_off.png | Bin 0 -> 10087 bytes platforms/ubuntu/qml/record_on.png | Bin 0 -> 4902 bytes platforms/ubuntu/qml/shoot.png | Bin 0 -> 14430 bytes platforms/ubuntu/qml/toolbar-left.png | Bin 0 -> 1212 bytes platforms/ubuntu/qml/toolbar-middle.png | Bin 0 -> 4416 bytes platforms/ubuntu/qml/toolbar-right.png | Bin 0 -> 1161 bytes platforms/ubuntu/ubuntu.json | 635 +- platforms/ubuntu/www/css/main.css | 17 - platforms/ubuntu/www/img/logo.png | Bin 0 -> 16260 bytes platforms/ubuntu/www/img/logo.svg | 114 + platforms/ubuntu/www/index.html | 3 +- platforms/ubuntu/www/js/main.js | 148 +- platforms/ubuntu/www/screens/home.html | 134 +- platforms/ubuntu/www/screens/login.html | 23 +- platforms/ubuntu/www/screens/pay.html | 18 - platforms/ubuntu/www/screens/paymentsent.html | 13 - platforms/ubuntu/www/screens/peerpay.html | 20 - platforms/ubuntu/www/screens/peersent.html | 13 - platforms/ubuntu/www/screens/signup.html | 42 - plugins/android.json | 44 +- plugins/browser.json | 46 +- .../CONTRIBUTING.md | 37 + plugins/cordova-plugin-battery-status/LICENSE | 202 + plugins/cordova-plugin-battery-status/NOTICE | 5 + .../cordova-plugin-battery-status/README.md | 135 + .../RELEASENOTES.md | 100 + .../doc/de/README.md | 151 + .../doc/de/index.md | 132 + .../doc/es/README.md | 151 + .../doc/es/index.md | 132 + .../doc/fr/README.md | 151 + .../doc/fr/index.md | 132 + .../doc/it/README.md | 151 + .../doc/it/index.md | 132 + .../doc/ja/README.md | 151 + .../doc/ja/index.md | 132 + .../doc/ko/README.md | 151 + .../doc/ko/index.md | 132 + .../doc/pl/README.md | 151 + .../doc/pl/index.md | 132 + .../doc/ru/index.md | 132 + .../doc/zh/README.md | 151 + .../doc/zh/index.md | 132 + .../package.json | 46 + .../cordova-plugin-battery-status/plugin.xml | 133 + .../src/android/BatteryListener.java | 163 + .../src/blackberry10/index.js | 79 + .../src/browser/BatteryProxy.js | 80 + .../src/firefoxos/BatteryProxy.js | 61 + .../src/ios/CDVBattery.h | 40 + .../src/ios/CDVBattery.m | 148 + .../src/tizen/BatteryStatusProxy.js | 47 + .../src/ubuntu/battery.cpp | 78 + .../src/ubuntu/battery.h | 62 + .../src/windows/BatteryProxy.js | 85 + .../src/windows/BatteryStatus.winmd | Bin 0 -> 9216 bytes .../windows/BatteryStatus/BatteryStatus.sln | 40 + .../BatteryStatus/BatteryStatus/.gitignore | 3 + .../BatteryStatus/BatteryStatus.cs | 104 + .../BatteryStatus/BatteryStatus.csproj | 72 + .../BatteryStatus}/Properties/AssemblyInfo.cs | 27 +- .../src/wp/Battery.cs | 104 + .../tests/plugin.xml | 6 +- .../tests/tests.js | 552 + .../www/battery.js | 110 + plugins/cordova-plugin-camera/CONTRIBUTING.md | 37 + plugins/cordova-plugin-camera/LICENSE | 202 + plugins/cordova-plugin-camera/NOTICE | 5 + plugins/cordova-plugin-camera/README.md | 752 + plugins/cordova-plugin-camera/RELEASENOTES.md | 293 + .../appium-tests/android/android.spec.js | 450 + .../appium-tests/helpers/cameraHelper.js | 113 + .../appium-tests/ios/ios.spec.js | 256 + .../cordova-plugin-camera/doc/de/README.md | 421 + plugins/cordova-plugin-camera/doc/de/index.md | 434 + .../cordova-plugin-camera/doc/es/README.md | 411 + plugins/cordova-plugin-camera/doc/es/index.md | 391 + .../cordova-plugin-camera/doc/fr/README.md | 378 + plugins/cordova-plugin-camera/doc/fr/index.md | 391 + .../doc/img/android-fail.png | Bin 0 -> 753 bytes .../doc/img/android-success.png | Bin 0 -> 716 bytes .../doc/img/blackberry-fail.png | Bin 0 -> 1009 bytes .../doc/img/blackberry-success.png | Bin 0 -> 984 bytes .../doc/img/browser-fail.png | Bin 0 -> 806 bytes .../doc/img/browser-success.png | Bin 0 -> 776 bytes .../doc/img/firefox-fail.png | Bin 0 -> 802 bytes .../doc/img/firefox-success.png | Bin 0 -> 770 bytes .../doc/img/fireos-fail.png | Bin 0 -> 965 bytes .../doc/img/fireos-success.png | Bin 0 -> 936 bytes .../doc/img/ios-fail.png | Bin 0 -> 573 bytes .../doc/img/ios-success.png | Bin 0 -> 550 bytes .../doc/img/ubuntu-fail.png | Bin 0 -> 649 bytes .../doc/img/ubuntu-success.png | Bin 0 -> 622 bytes .../doc/img/windows-fail.png | Bin 0 -> 784 bytes .../doc/img/windows-success.png | Bin 0 -> 759 bytes .../doc/img/wp8-fail.png | Bin 0 -> 714 bytes .../doc/img/wp8-success.png | Bin 0 -> 679 bytes .../cordova-plugin-camera/doc/it/README.md | 421 + plugins/cordova-plugin-camera/doc/it/index.md | 434 + .../cordova-plugin-camera/doc/ja/README.md | 421 + plugins/cordova-plugin-camera/doc/ja/index.md | 434 + .../cordova-plugin-camera/doc/ko/README.md | 421 + plugins/cordova-plugin-camera/doc/ko/index.md | 434 + .../cordova-plugin-camera/doc/pl/README.md | 421 + plugins/cordova-plugin-camera/doc/pl/index.md | 434 + plugins/cordova-plugin-camera/doc/ru/index.md | 417 + .../cordova-plugin-camera/doc/zh/README.md | 421 + plugins/cordova-plugin-camera/doc/zh/index.md | 435 + .../jsdoc2md/TEMPLATE.md | 408 + plugins/cordova-plugin-camera/package.json | 55 + plugins/cordova-plugin-camera/plugin.xml | 260 + .../src/android/CameraLauncher.java | 1291 ++ .../src/android/ExifHelper.java | 185 + .../src/android/FileHelper.java | 319 + .../src/blackberry10/index.js | 227 + .../src/browser/CameraProxy.js | 123 + .../src/firefoxos/CameraProxy.js | 53 + .../cordova-plugin-camera/src/ios/CDVCamera.h | 116 + .../cordova-plugin-camera/src/ios/CDVCamera.m | 765 + .../cordova-plugin-camera/src/ios/CDVExif.h | 43 + .../src/ios/CDVJpegHeaderWriter.h | 62 + .../src/ios/CDVJpegHeaderWriter.m | 547 + .../src/ios/UIImage+CropScaleOrientation.h | 29 + .../src/ios/UIImage+CropScaleOrientation.m | 175 + .../src/ubuntu/CaptureWidget.qml | 118 + .../cordova-plugin-camera/src/ubuntu/back.png | Bin 0 -> 12428 bytes .../src/ubuntu/camera.cpp | 140 + .../cordova-plugin-camera/src/ubuntu/camera.h | 86 + .../src/ubuntu/shoot.png | Bin 0 -> 14430 bytes .../src/ubuntu/toolbar-left.png | Bin 0 -> 1212 bytes .../src/ubuntu/toolbar-middle.png | Bin 0 -> 4416 bytes .../src/ubuntu/toolbar-right.png | Bin 0 -> 1161 bytes .../src/windows/CameraProxy.js | 878 ++ .../cordova-plugin-camera/src/wp/Camera.cs | 534 + .../tests/ios/.gitignore | 1 + .../contents.xcworkspacedata | 7 + .../xcshareddata/CDVCameraTest.xccheckout | 41 + .../xcschemes/CordovaLib.xcscheme | 77 + .../CDVCameraLibTests/CameraTest.m | 511 + .../CDVCameraLibTests/Info.plist | 44 + .../CDVCameraTest.xcodeproj/project.pbxproj | 561 + .../contents.xcworkspacedata | 7 + .../xcshareddata/CDVCameraTest.xccheckout | 41 + .../xcschemes/CDVCameraLib.xcscheme | 77 + .../xcschemes/CDVCameraLibTests.xcscheme | 96 + .../cordova-plugin-camera/tests/ios/README.md | 40 + .../tests/ios/doc/de/README.md | 39 + .../tests/ios/doc/es/README.md | 39 + .../tests/ios/doc/fr/README.md | 39 + .../tests/ios/doc/it/README.md | 39 + .../tests/ios/doc/ja/README.md | 39 + .../tests/ios/doc/ko/README.md | 39 + .../tests/ios/doc/pl/README.md | 39 + .../tests/ios/doc/zh/README.md | 39 + .../tests/ios/package.json | 13 + .../cordova-plugin-camera/tests/plugin.xml | 33 + plugins/cordova-plugin-camera/tests/tests.js | 510 + plugins/cordova-plugin-camera/www/Camera.js | 191 + .../www/CameraConstants.js | 88 + .../www/CameraPopoverHandle.js | 32 + .../www/CameraPopoverOptions.js | 52 + .../www/blackberry10/assets/camera.html | 82 + .../www/blackberry10/assets/camera.js | 46 + .../www/ios/CameraPopoverHandle.js | 60 + .../cordova-plugin-console/CONTRIBUTING.md | 37 + plugins/cordova-plugin-console/LICENSE | 202 + plugins/cordova-plugin-console/NOTICE | 5 + plugins/cordova-plugin-console/README.md | 104 + .../cordova-plugin-console/RELEASENOTES.md | 97 + .../cordova-plugin-console/doc/de/README.md | 43 + .../cordova-plugin-console/doc/de/index.md | 41 + .../cordova-plugin-console/doc/es/README.md | 41 + .../cordova-plugin-console/doc/es/index.md | 39 + .../cordova-plugin-console/doc/fr/README.md | 41 + .../cordova-plugin-console/doc/fr/index.md | 39 + .../cordova-plugin-console/doc/it/README.md | 43 + .../cordova-plugin-console/doc/it/index.md | 41 + .../cordova-plugin-console/doc/ja/README.md | 43 + .../cordova-plugin-console/doc/ja/index.md | 41 + .../cordova-plugin-console/doc/ko/README.md | 43 + .../cordova-plugin-console/doc/ko/index.md | 41 + .../cordova-plugin-console/doc/pl/README.md | 43 + .../cordova-plugin-console/doc/pl/index.md | 41 + .../cordova-plugin-console/doc/ru/index.md | 31 + .../cordova-plugin-console/doc/zh/README.md | 43 + .../cordova-plugin-console/doc/zh/index.md | 41 + plugins/cordova-plugin-console/package.json | 40 + plugins/cordova-plugin-console/plugin.xml | 127 + .../src/ios/CDVLogger.h | 26 + .../src/ios/CDVLogger.m | 38 + .../src/ubuntu/console.cpp | 29 + .../src/ubuntu/console.h | 43 + .../src/wp/DebugConsole.cs | 47 + .../cordova-plugin-console/tests/plugin.xml | 31 + plugins/cordova-plugin-console/tests/tests.js | 43 + .../www/console-via-logger.js | 186 + plugins/cordova-plugin-console/www/logger.js | 354 + .../cordova-plugin-contacts/CONTRIBUTING.md | 37 + plugins/cordova-plugin-contacts/LICENSE | 202 + plugins/cordova-plugin-contacts/NOTICE | 6 + plugins/cordova-plugin-contacts/README.md | 885 ++ .../cordova-plugin-contacts/RELEASENOTES.md | 224 + .../appium-tests/common/common.spec.js | 323 + .../appium-tests/helpers/contactsHelper.js | 41 + .../cordova-plugin-contacts/doc/de/README.md | 735 + .../cordova-plugin-contacts/doc/de/index.md | 719 + .../cordova-plugin-contacts/doc/es/README.md | 732 + .../cordova-plugin-contacts/doc/es/index.md | 652 + .../cordova-plugin-contacts/doc/fr/README.md | 668 + .../cordova-plugin-contacts/doc/fr/index.md | 652 + .../cordova-plugin-contacts/doc/it/README.md | 735 + .../cordova-plugin-contacts/doc/it/index.md | 719 + .../cordova-plugin-contacts/doc/ja/README.md | 735 + .../cordova-plugin-contacts/doc/ja/index.md | 719 + .../cordova-plugin-contacts/doc/ko/README.md | 735 + .../cordova-plugin-contacts/doc/ko/index.md | 719 + .../cordova-plugin-contacts/doc/pl/README.md | 735 + .../cordova-plugin-contacts/doc/pl/index.md | 719 + .../cordova-plugin-contacts/doc/ru/index.md | 709 + .../cordova-plugin-contacts/doc/zh/README.md | 735 + .../cordova-plugin-contacts/doc/zh/index.md | 719 + plugins/cordova-plugin-contacts/package.json | 47 + plugins/cordova-plugin-contacts/plugin.xml | 228 + .../src/android/ContactAccessor.java | 194 + .../src/android/ContactAccessorSdk5.java | 2295 +++ .../src/android/ContactInfoDTO.java | 59 + .../src/android/ContactManager.java | 307 + .../src/blackberry10/ContactActivity.js | 31 + .../src/blackberry10/ContactAddress.js | 35 + .../src/blackberry10/ContactError.js | 35 + .../src/blackberry10/ContactField.js | 32 + .../src/blackberry10/ContactFindOptions.js | 55 + .../src/blackberry10/ContactName.js | 44 + .../src/blackberry10/ContactNews.js | 31 + .../src/blackberry10/ContactOrganization.js | 27 + .../src/blackberry10/ContactPhoto.js | 28 + .../src/blackberry10/contactConsts.js | 225 + .../src/blackberry10/contactUtils.js | 230 + .../src/blackberry10/index.js | 357 + .../src/firefoxos/ContactsProxy.js | 467 + .../src/ios/CDVContact.h | 137 + .../src/ios/CDVContact.m | 1781 +++ .../src/ios/CDVContacts.h | 160 + .../src/ios/CDVContacts.m | 612 + .../src/ubuntu/contacts.cpp | 576 + .../src/ubuntu/contacts.h | 70 + .../src/windows/ContactProxy.js | 430 + .../src/windows8/ContactProxy.js | 130 + .../src/wp/ContactPicker.xaml | 73 + .../src/wp/ContactPicker.xaml.cs | 125 + .../src/wp/ContactPickerTask.cs | 122 + .../src/wp/Contacts.cs | 592 + .../src/wp/ContactsHelper.cs | 335 + .../cordova-plugin-contacts/tests/plugin.xml | 31 + .../cordova-plugin-contacts/tests/tests.js | 975 ++ .../cordova-plugin-contacts/www/Contact.js | 140 + .../www/ContactAddress.js | 46 + .../www/ContactError.js | 43 + .../www/ContactField.js | 37 + .../www/ContactFieldType.js | 55 + .../www/ContactFindOptions.js | 38 + .../www/ContactName.js | 41 + .../www/ContactOrganization.js | 41 + .../cordova-plugin-contacts/www/contacts.js | 99 + .../www/convertUtils.js | 70 + .../www/ios/Contact.js | 51 + .../www/ios/contacts.js | 62 + .../CONTRIBUTING.md | 37 + plugins/cordova-plugin-device-motion/LICENSE | 202 + plugins/cordova-plugin-device-motion/NOTICE | 5 + .../cordova-plugin-device-motion/README.md | 183 + .../RELEASENOTES.md | 139 + .../doc/de/README.md | 163 + .../doc/de/index.md | 161 + .../doc/es/README.md | 159 + .../doc/es/index.md | 139 + .../doc/fr/README.md | 141 + .../doc/fr/index.md | 139 + .../doc/it/README.md | 163 + .../doc/it/index.md | 161 + .../doc/ja/README.md | 163 + .../doc/ja/index.md | 161 + .../doc/ko/README.md | 163 + .../doc/ko/index.md | 161 + .../doc/pl/README.md | 163 + .../doc/pl/index.md | 161 + .../doc/ru/index.md | 151 + .../doc/zh/README.md | 163 + .../doc/zh/index.md | 161 + .../cordova-plugin-device-motion/package.json | 53 + .../cordova-plugin-device-motion/plugin.xml | 165 + .../src/android/AccelListener.java | 306 + .../src/blackberry10/index.js | 47 + .../src/browser/AccelerometerProxy.js | 45 + .../src/firefoxos/accelerometer.js | 41 + .../src/ios/CDVAccelerometer.h | 39 + .../src/ios/CDVAccelerometer.m | 149 + .../src/tizen/AccelerometerProxy.js | 49 + .../src/ubuntu/accelerometer.cpp | 58 + .../src/ubuntu/accelerometer.h | 55 + .../src/windows/AccelerometerProxy.js | 73 + .../src/wp/Accelerometer.cs | 179 + .../tests/plugin.xml | 29 + .../tests/tests.js | 368 + .../www/Acceleration.js | 29 + .../www/accelerometer.js | 202 + .../CONTRIBUTING.md | 37 + .../cordova-plugin-device-orientation/LICENSE | 202 + .../cordova-plugin-device-orientation/NOTICE | 5 + .../README.md | 215 + .../RELEASENOTES.md | 122 + .../doc/de/README.md | 204 + .../doc/de/index.md | 202 + .../doc/es/README.md | 204 + .../doc/es/index.md | 189 + .../doc/fr/README.md | 191 + .../doc/fr/index.md | 189 + .../doc/it/README.md | 204 + .../doc/it/index.md | 202 + .../doc/ja/README.md | 204 + .../doc/ja/index.md | 202 + .../doc/ko/README.md | 204 + .../doc/ko/index.md | 202 + .../doc/pl/README.md | 204 + .../doc/pl/index.md | 202 + .../doc/ru/index.md | 192 + .../doc/zh/README.md | 204 + .../doc/zh/index.md | 202 + .../package.json | 51 + .../plugin.xml | 173 + .../src/android/CompassListener.java | 296 + .../src/blackberry10/index.js | 35 + .../src/browser/CompassProxy.js | 43 + .../src/firefoxos/compass.js | 41 + .../src/ios/CDVCompass.h | 68 + .../src/ios/CDVCompass.m | 288 + .../src/tizen/CompassProxy.js | 56 + .../src/ubuntu/compass.cpp | 75 + .../src/ubuntu/compass.h | 58 + .../src/windows/CompassProxy.js | 53 + .../src/wp/Compass.cs | 362 + .../tests/plugin.xml | 30 + .../tests/tests.js | 253 + .../www/CompassError.js | 34 + .../www/CompassHeading.js | 29 + .../www/compass.js | 118 + plugins/cordova-plugin-device/CONTRIBUTING.md | 37 + plugins/cordova-plugin-device/LICENSE | 202 + plugins/cordova-plugin-device/NOTICE | 5 + plugins/cordova-plugin-device/README.md | 290 + plugins/cordova-plugin-device/RELEASENOTES.md | 141 + .../cordova-plugin-device/doc/de/README.md | 203 + plugins/cordova-plugin-device/doc/de/index.md | 206 + .../cordova-plugin-device/doc/es/README.md | 216 + plugins/cordova-plugin-device/doc/es/index.md | 220 + .../cordova-plugin-device/doc/fr/README.md | 215 + plugins/cordova-plugin-device/doc/fr/index.md | 218 + .../cordova-plugin-device/doc/it/README.md | 203 + plugins/cordova-plugin-device/doc/it/index.md | 206 + .../cordova-plugin-device/doc/ja/README.md | 203 + plugins/cordova-plugin-device/doc/ja/index.md | 206 + .../cordova-plugin-device/doc/ko/README.md | 203 + plugins/cordova-plugin-device/doc/ko/index.md | 206 + .../cordova-plugin-device/doc/pl/README.md | 214 + plugins/cordova-plugin-device/doc/pl/index.md | 206 + plugins/cordova-plugin-device/doc/ru/index.md | 219 + .../cordova-plugin-device/doc/zh/README.md | 203 + plugins/cordova-plugin-device/doc/zh/index.md | 206 + plugins/cordova-plugin-device/package.json | 54 + plugins/cordova-plugin-device/plugin.xml | 174 + .../src/android/Device.java | 174 + .../src/blackberry10/index.js | 71 + .../src/browser/DeviceProxy.js | 82 + .../src/firefoxos/DeviceProxy.js | 77 + .../cordova-plugin-device/src/ios/CDVDevice.h | 30 + .../cordova-plugin-device/src/ios/CDVDevice.m | 112 + .../cordova-plugin-device/src/osx/CDVDevice.h | 28 + .../cordova-plugin-device/src/osx/CDVDevice.m | 113 + .../src/tizen/DeviceProxy.js | 38 + .../src/ubuntu/device.cpp | 64 + .../cordova-plugin-device/src/ubuntu/device.h | 47 + .../src/ubuntu/device.js | 33 + .../src/windows/DeviceProxy.js | 98 + .../cordova-plugin-device/src/wp/Device.cs | 87 + .../cordova-plugin-device/tests/plugin.xml | 31 + plugins/cordova-plugin-device/tests/tests.js | 113 + plugins/cordova-plugin-device/www/device.js | 83 + .../cordova-plugin-dialogs/CONTRIBUTING.md | 37 + plugins/cordova-plugin-dialogs/LICENSE | 202 + plugins/cordova-plugin-dialogs/NOTICE | 5 + plugins/cordova-plugin-dialogs/README.md | 284 + .../cordova-plugin-dialogs/RELEASENOTES.md | 151 + .../cordova-plugin-dialogs/doc/de/README.md | 275 + .../cordova-plugin-dialogs/doc/de/index.md | 273 + .../cordova-plugin-dialogs/doc/es/README.md | 275 + .../cordova-plugin-dialogs/doc/es/index.md | 247 + .../cordova-plugin-dialogs/doc/fr/README.md | 249 + .../cordova-plugin-dialogs/doc/fr/index.md | 247 + .../cordova-plugin-dialogs/doc/it/README.md | 275 + .../cordova-plugin-dialogs/doc/it/index.md | 273 + .../cordova-plugin-dialogs/doc/ja/README.md | 275 + .../cordova-plugin-dialogs/doc/ja/index.md | 273 + .../cordova-plugin-dialogs/doc/ko/README.md | 275 + .../cordova-plugin-dialogs/doc/ko/index.md | 273 + .../cordova-plugin-dialogs/doc/pl/README.md | 275 + .../cordova-plugin-dialogs/doc/pl/index.md | 273 + .../cordova-plugin-dialogs/doc/ru/index.md | 247 + .../cordova-plugin-dialogs/doc/zh/README.md | 275 + .../cordova-plugin-dialogs/doc/zh/index.md | 273 + plugins/cordova-plugin-dialogs/package.json | 50 + plugins/cordova-plugin-dialogs/plugin.xml | 171 + .../src/android/Notification.java | 505 + .../src/blackberry10/index.js | 89 + .../src/firefoxos/notification.js | 155 + .../src/ios/CDVNotification.bundle/beep.wav | Bin 0 -> 8114 bytes .../src/ios/CDVNotification.h | 37 + .../src/ios/CDVNotification.m | 248 + .../src/ubuntu/notification.cpp | 85 + .../src/ubuntu/notification.h | 64 + .../src/ubuntu/notification.qml | 65 + .../src/windows/NotificationProxy.js | 256 + .../src/wp/Notification.cs | 482 + .../src/wp/NotificationBox.xaml | 79 + .../src/wp/NotificationBox.xaml.cs | 41 + .../src/wp/notification-beep.wav | Bin 0 -> 16630 bytes .../cordova-plugin-dialogs/tests/plugin.xml | 29 + plugins/cordova-plugin-dialogs/tests/tests.js | 203 + .../www/android/notification.js | 74 + .../www/blackberry10/beep.js | 46 + .../www/blackberry10/notification-beep.wav | Bin 0 -> 16630 bytes .../www/browser/notification.js | 115 + .../www/firefoxos/danger-press.png | Bin 0 -> 1015 bytes .../www/firefoxos/danger.png | Bin 0 -> 1031 bytes .../www/firefoxos/default.png | Bin 0 -> 1014 bytes .../www/firefoxos/gradient.png | Bin 0 -> 3713 bytes .../www/firefoxos/notification.css | 248 + .../www/firefoxos/pattern.png | Bin 0 -> 6851 bytes .../www/firefoxos/recommend.png | Bin 0 -> 1020 bytes .../www/notification.js | 128 + .../CONTRIBUTING.md | 37 + plugins/cordova-plugin-file-transfer/LICENSE | 202 + plugins/cordova-plugin-file-transfer/NOTICE | 8 + .../cordova-plugin-file-transfer/README.md | 582 + .../RELEASENOTES.md | 267 + .../doc/de/README.md | 311 + .../doc/de/index.md | 302 + .../doc/es/README.md | 311 + .../doc/es/index.md | 262 + .../doc/fr/README.md | 270 + .../doc/fr/index.md | 261 + .../doc/it/README.md | 311 + .../doc/it/index.md | 302 + .../doc/ja/README.md | 311 + .../doc/ja/index.md | 302 + .../doc/ko/README.md | 311 + .../doc/ko/index.md | 302 + .../doc/pl/README.md | 311 + .../doc/pl/index.md | 302 + .../doc/ru/index.md | 290 + .../doc/zh/README.md | 311 + .../doc/zh/index.md | 302 + .../cordova-plugin-file-transfer/package.json | 53 + .../cordova-plugin-file-transfer/plugin.xml | 170 + .../src/amazon/FileTransfer.java | 898 ++ .../src/android/FileProgressResult.java | 63 + .../src/android/FileTransfer.java | 1024 ++ .../src/android/FileUploadResult.java | 73 + .../src/ios/CDVFileTransfer.h | 88 + .../src/ios/CDVFileTransfer.m | 845 ++ .../src/ubuntu/file-transfer.cpp | 265 + .../src/ubuntu/file-transfer.h | 103 + .../src/windows/FileTransferProxy.js | 578 + .../src/wp/FileTransfer.cs | 994 ++ .../tests/plugin.xml | 30 + .../tests/tests.js | 1601 +++ .../www/FileTransfer.js | 239 + .../www/FileTransferError.js | 41 + .../www/blackberry10/.jshintrc | 5 + .../www/blackberry10/FileTransfer.js | 190 + .../www/blackberry10/FileTransferProxy.js | 36 + .../www/blackberry10/xhrFileTransfer.js | 260 + .../www/browser/FileTransfer.js | 344 + .../www/firefoxos/FileTransferProxy.js | 222 + .../www/wp7/base64.js | 73 + plugins/cordova-plugin-file/CONTRIBUTING.md | 37 + plugins/cordova-plugin-file/LICENSE | 202 + plugins/cordova-plugin-file/NOTICE | 5 + plugins/cordova-plugin-file/README.md | 540 + plugins/cordova-plugin-file/RELEASENOTES.md | 417 + plugins/cordova-plugin-file/doc/de/README.md | 335 + plugins/cordova-plugin-file/doc/de/index.md | 338 + plugins/cordova-plugin-file/doc/de/plugins.md | 101 + plugins/cordova-plugin-file/doc/es/README.md | 335 + plugins/cordova-plugin-file/doc/es/index.md | 336 + plugins/cordova-plugin-file/doc/es/plugins.md | 101 + plugins/cordova-plugin-file/doc/fr/README.md | 328 + plugins/cordova-plugin-file/doc/fr/index.md | 331 + plugins/cordova-plugin-file/doc/fr/plugins.md | 101 + plugins/cordova-plugin-file/doc/it/README.md | 335 + plugins/cordova-plugin-file/doc/it/index.md | 338 + plugins/cordova-plugin-file/doc/it/plugins.md | 101 + plugins/cordova-plugin-file/doc/ja/README.md | 335 + plugins/cordova-plugin-file/doc/ja/index.md | 338 + plugins/cordova-plugin-file/doc/ja/plugins.md | 101 + plugins/cordova-plugin-file/doc/ko/README.md | 335 + plugins/cordova-plugin-file/doc/ko/index.md | 338 + plugins/cordova-plugin-file/doc/ko/plugins.md | 101 + plugins/cordova-plugin-file/doc/pl/README.md | 335 + plugins/cordova-plugin-file/doc/pl/index.md | 338 + plugins/cordova-plugin-file/doc/pl/plugins.md | 101 + plugins/cordova-plugin-file/doc/plugins.md | 120 + plugins/cordova-plugin-file/doc/ru/index.md | 275 + plugins/cordova-plugin-file/doc/ru/plugins.md | 124 + plugins/cordova-plugin-file/doc/zh/README.md | 335 + plugins/cordova-plugin-file/doc/zh/index.md | 343 + plugins/cordova-plugin-file/doc/zh/plugins.md | 101 + plugins/cordova-plugin-file/package.json | 50 + plugins/cordova-plugin-file/plugin.xml | 425 + .../src/android/AssetFilesystem.java | 286 + .../src/android/ContentFilesystem.java | 216 + .../src/android/DirectoryManager.java | 134 + .../src/android/EncodingException.java | 29 + .../src/android/FileExistsException.java | 29 + .../src/android/FileUtils.java | 1196 ++ .../src/android/Filesystem.java | 331 + .../android/InvalidModificationException.java | 30 + .../src/android/LocalFilesystem.java | 510 + .../src/android/LocalFilesystemURL.java | 64 + .../NoModificationAllowedException.java | 29 + .../src/android/PendingRequests.java | 94 + .../src/android/TypeMismatchException.java | 30 + .../src/android/build-extras.gradle | 47 + .../src/blackberry10/index.js | 47 + .../src/browser/FileProxy.js | 984 ++ .../src/firefoxos/FileProxy.js | 805 ++ .../src/ios/CDVAssetLibraryFilesystem.h | 30 + .../src/ios/CDVAssetLibraryFilesystem.m | 253 + plugins/cordova-plugin-file/src/ios/CDVFile.h | 157 + plugins/cordova-plugin-file/src/ios/CDVFile.m | 1117 ++ .../src/ios/CDVLocalFilesystem.h | 32 + .../src/ios/CDVLocalFilesystem.m | 734 + plugins/cordova-plugin-file/src/osx/CDVFile.h | 189 + plugins/cordova-plugin-file/src/osx/CDVFile.m | 1056 ++ .../src/osx/CDVLocalFilesystem.h | 32 + .../src/osx/CDVLocalFilesystem.m | 733 + .../cordova-plugin-file/src/ubuntu/file.cpp | 912 ++ plugins/cordova-plugin-file/src/ubuntu/file.h | 81 + .../src/windows/FileProxy.js | 1198 ++ plugins/cordova-plugin-file/src/wp/File.cs | 1800 +++ plugins/cordova-plugin-file/tests/plugin.xml | 43 + .../src/android/TestContentProvider.java | 96 + plugins/cordova-plugin-file/tests/tests.js | 3842 +++++ .../www/fixtures/asset-test/asset-test.txt | 1 + .../cordova-plugin-file/www/DirectoryEntry.js | 117 + .../www/DirectoryReader.js | 73 + plugins/cordova-plugin-file/www/Entry.js | 262 + plugins/cordova-plugin-file/www/File.js | 79 + plugins/cordova-plugin-file/www/FileEntry.js | 93 + plugins/cordova-plugin-file/www/FileError.js | 46 + plugins/cordova-plugin-file/www/FileReader.js | 289 + plugins/cordova-plugin-file/www/FileSystem.js | 55 + .../www/FileUploadOptions.js | 41 + .../www/FileUploadResult.js | 30 + plugins/cordova-plugin-file/www/FileWriter.js | 324 + plugins/cordova-plugin-file/www/Flags.js | 36 + .../www/LocalFileSystem.js | 23 + plugins/cordova-plugin-file/www/Metadata.js | 40 + .../cordova-plugin-file/www/ProgressEvent.js | 67 + .../www/android/FileSystem.js | 49 + .../www/blackberry10/.jshintrc | 5 + .../www/blackberry10/FileProxy.js | 51 + .../www/blackberry10/FileSystem.js | 47 + .../www/blackberry10/copyTo.js | 143 + .../www/blackberry10/createEntryFromNative.js | 75 + .../www/blackberry10/getDirectory.js | 72 + .../www/blackberry10/getFile.js | 57 + .../www/blackberry10/getFileMetadata.js | 65 + .../www/blackberry10/getMetadata.js | 54 + .../www/blackberry10/getParent.js | 57 + .../www/blackberry10/info.js | 52 + .../www/blackberry10/moveTo.js | 39 + .../www/blackberry10/readAsArrayBuffer.js | 68 + .../www/blackberry10/readAsBinaryString.js | 68 + .../www/blackberry10/readAsDataURL.js | 65 + .../www/blackberry10/readAsText.js | 77 + .../www/blackberry10/readEntries.js | 70 + .../www/blackberry10/remove.js | 61 + .../www/blackberry10/removeRecursively.js | 62 + .../www/blackberry10/requestAllFileSystems.js | 42 + .../www/blackberry10/requestAnimationFrame.js | 38 + .../www/blackberry10/requestFileSystem.js | 53 + .../blackberry10/resolveLocalFileSystemURI.js | 172 + .../www/blackberry10/setMetadata.js | 33 + .../www/blackberry10/truncate.js | 74 + .../www/blackberry10/write.js | 73 + .../www/browser/FileSystem.js | 31 + .../www/browser/Preparing.js | 192 + .../www/browser/isChrome.js | 26 + .../www/fileSystemPaths.js | 63 + .../www/fileSystems-roots.js | 45 + .../cordova-plugin-file/www/fileSystems.js | 25 + .../www/firefoxos/FileSystem.js | 29 + .../cordova-plugin-file/www/ios/FileSystem.js | 30 + .../cordova-plugin-file/www/osx/FileSystem.js | 30 + .../www/requestFileSystem.js | 82 + .../www/resolveLocalFileSystemURI.js | 92 + .../www/ubuntu/FileSystem.js | 34 + .../www/ubuntu/FileWriter.js | 135 + .../www/ubuntu/fileSystems-roots.js | 53 + .../www/wp/FileUploadOptions.js | 49 + .../CONTRIBUTING.md | 37 + plugins/cordova-plugin-geolocation/LICENSE | 202 + plugins/cordova-plugin-geolocation/NOTICE | 5 + plugins/cordova-plugin-geolocation/README.md | 756 + .../RELEASENOTES.md | 158 + .../doc/de/README.md | 268 + .../doc/de/index.md | 255 + .../doc/es/README.md | 266 + .../doc/es/index.md | 214 + .../doc/fr/README.md | 227 + .../doc/fr/index.md | 214 + .../doc/it/README.md | 268 + .../doc/it/index.md | 255 + .../doc/ja/README.md | 268 + .../doc/ja/index.md | 255 + .../doc/ko/README.md | 268 + .../doc/ko/index.md | 255 + .../doc/pl/README.md | 268 + .../doc/pl/index.md | 255 + .../doc/ru/index.md | 206 + .../doc/zh/README.md | 268 + .../doc/zh/index.md | 255 + .../cordova-plugin-geolocation/package.json | 48 + plugins/cordova-plugin-geolocation/plugin.xml | 267 + .../src/android/Geolocation.java | 108 + .../src/firefoxos/GeolocationProxy.js | 67 + .../src/ios/CDVLocation.h | 70 + .../src/ios/CDVLocation.m | 367 + .../src/ubuntu/geolocation.cpp | 119 + .../src/ubuntu/geolocation.h | 69 + .../src/windows/GeolocationProxy.js | 202 + .../src/wp/GeoLocation.cs | 34 + .../tests/plugin.xml | 32 + .../cordova-plugin-geolocation/tests/tests.js | 448 + .../www/Coordinates.js | 69 + .../www/Position.js | 33 + .../www/PositionError.js | 38 + .../www/android/geolocation.js | 71 + .../www/blackberry10/GeolocationProxy.js | 69 + .../www/geolocation.js | 211 + .../CONTRIBUTING.md | 37 + plugins/cordova-plugin-media-capture/LICENSE | 202 + plugins/cordova-plugin-media-capture/NOTICE | 5 + .../cordova-plugin-media-capture/README.md | 677 + .../RELEASENOTES.md | 150 + .../doc/de/README.md | 564 + .../doc/de/index.md | 551 + .../doc/es/README.md | 562 + .../doc/es/index.md | 498 + .../doc/fr/README.md | 526 + .../doc/fr/index.md | 513 + .../doc/it/README.md | 564 + .../doc/it/index.md | 551 + .../doc/ja/README.md | 564 + .../doc/ja/index.md | 551 + .../doc/ko/README.md | 564 + .../doc/ko/index.md | 551 + .../doc/pl/README.md | 564 + .../doc/pl/index.md | 551 + .../doc/ru/index.md | 541 + .../doc/zh/README.md | 564 + .../doc/zh/index.md | 551 + .../cordova-plugin-media-capture/package.json | 47 + .../cordova-plugin-media-capture/plugin.xml | 250 + .../src/android/Capture.java | 615 + .../src/android/FileHelper.java | 60 + .../src/android/PendingRequests.java | 228 + .../src/blackberry10/index.js | 116 + .../src/browser/CaptureProxy.js | 234 + .../src/ios/CDVCapture.bundle/controls_bg.png | Bin 0 -> 955 bytes .../ios/CDVCapture.bundle/controls_bg@2x.png | Bin 0 -> 971 bytes .../CDVCapture.bundle/controls_bg@2x~ipad.png | Bin 0 -> 2858 bytes .../CDVCapture.bundle/controls_bg~ipad.png | Bin 0 -> 969 bytes .../de.lproj/Localizable.strings | 28 + .../en.lproj/Localizable.strings | 27 + .../es.lproj/Localizable.strings | 27 + .../microphone-568h@2x~iphone.png | Bin 0 -> 531673 bytes .../src/ios/CDVCapture.bundle/microphone.png | Bin 0 -> 72226 bytes .../ios/CDVCapture.bundle/microphone@2x.png | Bin 0 -> 282409 bytes .../CDVCapture.bundle/microphone@2x~ipad.png | Bin 0 -> 911582 bytes .../ios/CDVCapture.bundle/microphone~ipad.png | Bin 0 -> 393975 bytes .../ios/CDVCapture.bundle/record_button.png | Bin 0 -> 5852 bytes .../CDVCapture.bundle/record_button@2x.png | Bin 0 -> 13875 bytes .../record_button@2x~ipad.png | Bin 0 -> 15822 bytes .../CDVCapture.bundle/record_button~ipad.png | Bin 0 -> 7547 bytes .../ios/CDVCapture.bundle/recording_bg.png | Bin 0 -> 973 bytes .../ios/CDVCapture.bundle/recording_bg@2x.png | Bin 0 -> 990 bytes .../recording_bg@2x~ipad.png | Bin 0 -> 1026 bytes .../CDVCapture.bundle/recording_bg~ipad.png | Bin 0 -> 996 bytes .../se.lproj/Localizable.strings | 28 + .../src/ios/CDVCapture.bundle/stop_button.png | Bin 0 -> 5514 bytes .../ios/CDVCapture.bundle/stop_button@2x.png | Bin 0 -> 12965 bytes .../CDVCapture.bundle/stop_button@2x~ipad.png | Bin 0 -> 14474 bytes .../CDVCapture.bundle/stop_button~ipad.png | Bin 0 -> 7119 bytes .../src/ios/CDVCapture.h | 118 + .../src/ios/CDVCapture.m | 935 ++ .../src/ubuntu/MediaCaptureWidget.qml | 206 + .../src/ubuntu/back.png | Bin 0 -> 12428 bytes .../src/ubuntu/capture.cpp | 161 + .../src/ubuntu/capture.h | 84 + .../src/ubuntu/microphone.png | Bin 0 -> 10415 bytes .../src/ubuntu/record_off.png | Bin 0 -> 10087 bytes .../src/ubuntu/record_on.png | Bin 0 -> 4902 bytes .../src/ubuntu/shoot.png | Bin 0 -> 14430 bytes .../src/ubuntu/toolbar-left.png | Bin 0 -> 1212 bytes .../src/ubuntu/toolbar-middle.png | Bin 0 -> 4416 bytes .../src/ubuntu/toolbar-right.png | Bin 0 -> 1161 bytes .../src/windows/CaptureProxy.js | 491 + .../src/windows/MediaFile.js | 65 + .../src/wp/Capture.cs | 736 + .../src/wp/UI/AudioCaptureTask.cs | 107 + .../src/wp/UI/AudioRecorder.xaml | 66 + .../src/wp/UI/AudioRecorder.xaml.cs | 330 + .../src/wp/UI/VideoCaptureTask.cs | 105 + .../src/wp/UI/VideoRecorder.xaml | 52 + .../src/wp/UI/VideoRecorder.xaml.cs | 405 + .../tests/plugin.xml | 33 + .../tests/tests.js | 266 + .../www/CaptureAudioOptions.js | 32 + .../www/CaptureError.js | 42 + .../www/CaptureImageOptions.js | 30 + .../www/CaptureVideoOptions.js | 34 + .../www/ConfigurationData.js | 36 + .../www/MediaFile.js | 55 + .../www/MediaFileData.js | 39 + .../www/android/init.js | 44 + .../www/capture.js | 84 + .../www/helpers.js | 44 + plugins/cordova-plugin-media/CONTRIBUTING.md | 37 + plugins/cordova-plugin-media/LICENSE | 202 + plugins/cordova-plugin-media/NOTICE | 5 + plugins/cordova-plugin-media/README.md | 651 + plugins/cordova-plugin-media/RELEASENOTES.md | 180 + plugins/cordova-plugin-media/doc/de/README.md | 509 + plugins/cordova-plugin-media/doc/de/index.md | 505 + plugins/cordova-plugin-media/doc/es/README.md | 509 + plugins/cordova-plugin-media/doc/es/index.md | 400 + plugins/cordova-plugin-media/doc/fr/README.md | 404 + plugins/cordova-plugin-media/doc/fr/index.md | 400 + plugins/cordova-plugin-media/doc/it/README.md | 509 + plugins/cordova-plugin-media/doc/it/index.md | 505 + plugins/cordova-plugin-media/doc/ja/README.md | 509 + plugins/cordova-plugin-media/doc/ja/index.md | 505 + plugins/cordova-plugin-media/doc/ko/README.md | 509 + plugins/cordova-plugin-media/doc/ko/index.md | 505 + plugins/cordova-plugin-media/doc/pl/README.md | 509 + plugins/cordova-plugin-media/doc/pl/index.md | 505 + plugins/cordova-plugin-media/doc/ru/index.md | 494 + plugins/cordova-plugin-media/doc/zh/README.md | 509 + plugins/cordova-plugin-media/doc/zh/index.md | 505 + plugins/cordova-plugin-media/package.json | 48 + plugins/cordova-plugin-media/plugin.xml | 187 + .../src/android/AudioHandler.java | 562 + .../src/android/AudioPlayer.java | 701 + .../src/android/FileHelper.java | 38 + .../src/blackberry10/index.js | 239 + .../cordova-plugin-media/src/ios/CDVSound.h | 120 + .../cordova-plugin-media/src/ios/CDVSound.m | 929 ++ .../src/tizen/MediaProxy.js | 224 + .../cordova-plugin-media/src/ubuntu/media.cpp | 128 + .../cordova-plugin-media/src/ubuntu/media.h | 267 + .../src/windows/MediaProxy.js | 410 + .../src/wp/AudioPlayer.cs | 648 + plugins/cordova-plugin-media/src/wp/Media.cs | 678 + plugins/cordova-plugin-media/tests/plugin.xml | 30 + plugins/cordova-plugin-media/tests/tests.js | 1034 ++ plugins/cordova-plugin-media/www/Media.js | 257 + .../cordova-plugin-media/www/MediaError.js | 55 + .../cordova-plugin-media/www/browser/Media.js | 267 + .../CONTRIBUTING.md | 37 + .../LICENSE | 202 + .../cordova-plugin-network-information/NOTICE | 8 + .../README.md | 337 + .../RELEASENOTES.md | 134 + .../doc/de/README.md | 190 + .../doc/de/index.md | 186 + .../doc/es/README.md | 190 + .../doc/es/index.md | 186 + .../doc/fr/README.md | 188 + .../doc/fr/index.md | 184 + .../doc/it/README.md | 190 + .../doc/it/index.md | 186 + .../doc/ja/README.md | 190 + .../doc/ja/index.md | 186 + .../doc/ko/README.md | 190 + .../doc/ko/index.md | 186 + .../doc/pl/README.md | 190 + .../doc/pl/index.md | 186 + .../doc/ru/index.md | 182 + .../doc/zh/README.md | 190 + .../doc/zh/index.md | 186 + .../package.json | 53 + .../plugin.xml | 174 + .../src/android/NetworkManager.java | 274 + .../src/blackberry10/index.js | 66 + .../src/browser/network.js | 48 + .../src/firefoxos/NetworkProxy.js | 96 + .../src/ios/CDVConnection.h | 34 + .../src/ios/CDVConnection.m | 156 + .../src/ios/CDVReachability.h | 85 + .../src/ios/CDVReachability.m | 260 + .../src/tizen/NetworkProxy.js | 93 + .../src/ubuntu/network_information.cpp | 63 + .../src/ubuntu/network_information.h | 47 + .../src/windows/NetworkInfoProxy.js | 83 + .../src/wp/NetworkStatus.cs | 129 + .../tests/plugin.xml | 30 + .../tests/tests.js | 104 + .../www/Connection.js | 34 + .../www/network.js | 91 + .../cordova-plugin-vibration/CONTRIBUTING.md | 37 + plugins/cordova-plugin-vibration/LICENSE | 202 + plugins/cordova-plugin-vibration/NOTICE | 7 + plugins/cordova-plugin-vibration/README.md | 184 + .../cordova-plugin-vibration/RELEASENOTES.md | 155 + .../cordova-plugin-vibration/doc/de/README.md | 190 + .../cordova-plugin-vibration/doc/de/index.md | 184 + .../cordova-plugin-vibration/doc/es/README.md | 189 + .../cordova-plugin-vibration/doc/es/index.md | 165 + .../cordova-plugin-vibration/doc/fr/README.md | 171 + .../cordova-plugin-vibration/doc/fr/index.md | 165 + .../cordova-plugin-vibration/doc/it/README.md | 190 + .../cordova-plugin-vibration/doc/it/index.md | 184 + .../cordova-plugin-vibration/doc/ja/README.md | 190 + .../cordova-plugin-vibration/doc/ja/index.md | 184 + .../cordova-plugin-vibration/doc/ko/README.md | 190 + .../cordova-plugin-vibration/doc/ko/index.md | 184 + .../cordova-plugin-vibration/doc/pl/README.md | 190 + .../cordova-plugin-vibration/doc/pl/index.md | 184 + .../cordova-plugin-vibration/doc/ru/index.md | 170 + .../cordova-plugin-vibration/doc/zh/README.md | 190 + .../cordova-plugin-vibration/doc/zh/index.md | 184 + plugins/cordova-plugin-vibration/package.json | 46 + plugins/cordova-plugin-vibration/plugin.xml | 155 + .../src/android/Vibration.java | 133 + .../src/blackberry10/index.js | 82 + .../src/blackberry10/native/.cproject | 526 + .../src/blackberry10/native/.project | 51 + .../native/device/libVibration.so | Bin 0 -> 417305 bytes .../src/blackberry10/native/public/plugin.cpp | 21 + .../src/blackberry10/native/public/plugin.h | 21 + .../blackberry10/native/public/tokenizer.cpp | 0 .../blackberry10/native/public/tokenizer.h | 0 .../native/simulator/libVibration.so | Bin 0 -> 404571 bytes .../blackberry10/native/src/vibration_js.cpp | 116 + .../blackberry10/native/src/vibration_js.hpp | 42 + .../src/browser/Vibration.js | 27 + .../src/firefoxos/VibrationProxy.js | 33 + .../src/ios/CDVVibration.h | 29 + .../src/ios/CDVVibration.m | 29 + .../src/tizen/VibrationProxy.js | 30 + .../src/ubuntu/vibration.cpp | 64 + .../src/ubuntu/vibration.h | 54 + .../src/windows/Vibration/.gitignore | 3 + .../Vibration/Properties/AssemblyInfo.cs | 44 + .../src/windows/Vibration/Vibration.cs | 55 + .../src/windows/Vibration/Vibration.csproj | 70 + .../src/windows/VibrationProxy.js | 253 + .../src/wp/Vibration.cs | 117 + .../cordova-plugin-vibration/tests/plugin.xml | 31 + .../cordova-plugin-vibration/tests/tests.js | 327 + .../www/blackberry10/vibrate.js | 26 + .../cordova-plugin-vibration/www/vibration.js | 121 + plugins/fetch.json | 143 +- .../phonegap-plugin-barcodescanner/README.md | 211 - .../package.json | 45 - .../phonegap-plugin-barcodescanner/plugin.xml | 183 - .../src/android/README.md | 1 - .../android/barcodescanner-release-2.0.1.aar | Bin 988915 -> 0 bytes .../src/android/barcodescanner.gradle | 20 - .../barcodescanner/BarcodeScanner.java | 305 - .../src/blackberry10/LICENSE | 703 - .../src/blackberry10/index.js | 213 - .../src/blackberry10/native/.cproject | 220 - .../.settings/com.qnx.tools.ide.core.prefs | 2 - .../src/blackberry10/native/device/.npmignore | 2 - .../native/device/libBarcodeScanner.so | Bin 270830 -> 0 bytes .../native/public/json/autolink.h | 19 - .../blackberry10/native/public/json/config.h | 43 - .../native/public/json/features.h | 42 - .../native/public/json/forwards.h | 39 - .../blackberry10/native/public/json/json.h | 10 - .../blackberry10/native/public/json/reader.h | 196 - .../blackberry10/native/public/json/value.h | 1069 -- .../blackberry10/native/public/json/writer.h | 174 - .../native/public/json_batchallocator.h | 125 - .../native/public/json_internalarray.inl | 448 - .../native/public/json_internalmap.inl | 607 - .../native/public/json_reader.cpp | 892 -- .../blackberry10/native/public/json_value.cpp | 1726 --- .../native/public/json_valueiterator.inl | 292 - .../native/public/json_writer.cpp | 829 -- .../blackberry10/native/simulator/.npmignore | 2 - .../native/simulator/libBarcodeScanner.so | Bin 1553593 -> 0 bytes .../src/blackberry10/native/src/Logger.cpp | 104 - .../src/blackberry10/native/src/Logger.hpp | 49 - .../native/src/barcodescanner_js.cpp | 105 - .../native/src/barcodescanner_js.hpp | 41 - .../native/src/barcodescanner_ndk.cpp | 709 - .../native/src/barcodescanner_ndk.hpp | 55 - .../src/blackberry10/qrcode.js | 622 - .../src/browser/BarcodeScannerProxy.js | 24 - .../src/ios/CDVBarcodeScanner.bundle/beep.caf | Bin 16020 -> 0 bytes .../src/ios/CDVBarcodeScanner.mm | 1107 -- .../src/ios/scannerOverlay.xib | 185 - .../src/ios/zxing-all-in-one.cpp | 11982 ---------------- .../src/ios/zxing-all-in-one.h | 5007 ------- .../src/windows/BarcodeScannerProxy.js | 477 - .../windows/assets/plugin-barcodeScanner.css | 74 - .../src/windows/lib.UW/ANY/ZXing.winmd | Bin 446464 -> 0 bytes .../src/windows/lib.UW/ARM/ZXing.winmd | Bin 445952 -> 0 bytes .../src/windows/lib.UW/x64/ZXing.winmd | Bin 445952 -> 0 bytes .../src/windows/lib.UW/x86/ZXing.winmd | Bin 446464 -> 0 bytes .../src/windows/lib/Reader.cs | 173 - .../src/windows/lib/WinRTBarcodeReader.csproj | 134 - .../src/windows/lib/ZXing.winmd | Bin 446464 -> 0 bytes .../src/wp8/BarcodeScanner.cs | 117 - .../src/wp8/BarcodeScannerTask.cs | 103 - .../src/wp8/BarcodeScannerUI.xaml | 46 - .../src/wp8/BarcodeScannerUI.xaml.cs | 182 - .../src/wp8/assets/cancel.png | Bin 550 -> 0 bytes .../src/wp8/lib/zxing.wp8.0.dll | Bin 432640 -> 0 bytes .../tests/tests.js | 57 - .../www/barcodescanner.js | 126 - plugins/ubuntu.json | 64 + www/img/logo.png | Bin 0 -> 16260 bytes www/img/logo.svg | 117 + www/index.html | 2 +- www/screens/item.html | 13 + 1495 files changed, 227679 insertions(+), 31718 deletions(-) create mode 100644 platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties create mode 100644 platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties.lock create mode 100644 platforms/android/.gradle/2.2.1/taskArtifacts/fileHashes.bin create mode 100644 platforms/android/.gradle/2.2.1/taskArtifacts/fileSnapshots.bin create mode 100644 platforms/android/.gradle/2.2.1/taskArtifacts/outputFileStates.bin create mode 100644 platforms/android/.gradle/2.2.1/taskArtifacts/taskArtifacts.bin create mode 100644 platforms/android/CordovaLib/build/generated/source/buildConfig/debug/org/apache/cordova/BuildConfig.java create mode 100644 platforms/android/CordovaLib/build/intermediates/bundles/debug/AndroidManifest.xml create mode 100644 platforms/android/CordovaLib/build/intermediates/bundles/debug/aapt/AndroidManifest.xml create mode 100644 platforms/android/CordovaLib/build/intermediates/bundles/debug/classes.jar create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/AuthenticationToken.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/BuildConfig.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CallbackContext.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/Config.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ConfigXmlParser.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$2.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$3.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$4$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$4.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaArgs.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaBridge.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaClientCertRequest.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$2.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$3.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$4.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$5.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$6.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$7.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$8.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$9.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$Result.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaHttpAuthHandler.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaInterface.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaInterfaceImpl$ActivityResultHolder.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaInterfaceImpl.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaPlugin.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaPreferences.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaResourceApi$OpenForReadResult.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaResourceApi.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebView.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewEngine$Client.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewEngine$EngineView.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewEngine.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$2.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$3.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$EngineClient$1$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$EngineClient$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$EngineClient.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$2.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$3.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$4.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$5.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ExposedJsApi.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ICordovaClientCertRequest.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ICordovaCookieManager.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ICordovaHttpAuthHandler.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/LOG.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$BridgeMode.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$JsMessage.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$LoadUrlBridgeMode$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$LoadUrlBridgeMode.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$NoOpBridgeMode.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$2.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$OnlineEventsBridgeModeDelegate.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/PluginEntry.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/PluginManager.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/PluginResult$Status.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/PluginResult.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ResumeCallback.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/Whitelist$URLPattern.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/Whitelist.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemCookieManager.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemExposedJsApi.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$2.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$3.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$4.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$5.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebView.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewClient.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewEngine$1.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewEngine$2.class create mode 100644 platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewEngine.class create mode 100644 platforms/android/CordovaLib/build/intermediates/incremental/compileDebugAidl/dependency.store create mode 100644 platforms/android/CordovaLib/build/intermediates/incremental/mergeDebugAssets/merger.xml create mode 100644 platforms/android/CordovaLib/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml create mode 100644 platforms/android/CordovaLib/build/intermediates/incremental/packageDebugResources/merger.xml create mode 100644 platforms/android/CordovaLib/build/outputs/aar/CordovaLib-debug.aar create mode 100644 platforms/android/assets/www/img/logo.png create mode 100644 platforms/android/assets/www/img/logo.svg create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-battery-status/www/battery.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-camera/www/Camera.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraConstants.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/Contact.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactAddress.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactError.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactField.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactFieldType.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactName.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactOrganization.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/contacts.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-contacts/www/convertUtils.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-device-motion/www/Acceleration.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-device-motion/www/accelerometer.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/CompassError.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/compass.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-device/www/device.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-dialogs/www/android/notification.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-dialogs/www/notification.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/DirectoryEntry.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/DirectoryReader.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/Entry.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/File.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/FileEntry.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/FileError.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/FileReader.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/FileSystem.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/FileUploadOptions.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/FileUploadResult.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/FileWriter.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/Flags.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/LocalFileSystem.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/Metadata.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/ProgressEvent.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/android/FileSystem.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/browser/isChrome.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/fileSystemPaths.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/fileSystems-roots.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/fileSystems.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/requestFileSystem.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-geolocation/www/PositionError.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-geolocation/www/android/geolocation.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/CaptureError.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/MediaFile.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/MediaFileData.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/android/init.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/capture.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media-capture/www/helpers.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media/www/Media.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-media/www/MediaError.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-network-information/www/Connection.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-network-information/www/network.js create mode 100644 platforms/android/assets/www/plugins/cordova-plugin-vibration/www/vibration.js delete mode 100644 platforms/android/assets/www/plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js delete mode 100644 platforms/android/assets/www/screens/pay.html delete mode 100644 platforms/android/assets/www/screens/paymentsent.html delete mode 100644 platforms/android/assets/www/screens/peerpay.html delete mode 100644 platforms/android/assets/www/screens/peersent.html delete mode 100644 platforms/android/assets/www/screens/signup.html delete mode 100644 platforms/android/libs/barcodescanner.aar delete mode 100644 platforms/android/phonegap-plugin-barcodescanner/SnipeITMobile-barcodescanner.gradle create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-battery-status/www/battery.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-camera/www/Camera.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/Contact.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/contacts.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-device/www/device.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-dialogs/www/android/notification.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-dialogs/www/notification.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/Entry.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/File.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/FileEntry.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/FileError.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/FileReader.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/FileSystem.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/FileUploadOptions.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/FileUploadResult.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/FileWriter.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/Flags.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/LocalFileSystem.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/Metadata.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/ProgressEvent.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/android/FileSystem.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/browser/isChrome.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/fileSystemPaths.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/fileSystems-roots.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/fileSystems.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/requestFileSystem.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-geolocation/www/PositionError.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-geolocation/www/android/geolocation.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/CaptureError.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/MediaFile.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/MediaFileData.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/android/init.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/capture.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media-capture/www/helpers.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media/www/Media.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-media/www/MediaError.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-network-information/www/Connection.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-network-information/www/network.js create mode 100644 platforms/android/platform_www/plugins/cordova-plugin-vibration/www/vibration.js delete mode 100644 platforms/android/platform_www/plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js delete mode 100644 platforms/android/src/com/phonegap/plugins/barcodescanner/BarcodeScanner.java create mode 100755 platforms/android/src/org/apache/cordova/batterystatus/BatteryListener.java create mode 100644 platforms/android/src/org/apache/cordova/camera/CameraLauncher.java create mode 100644 platforms/android/src/org/apache/cordova/camera/ExifHelper.java create mode 100644 platforms/android/src/org/apache/cordova/camera/FileHelper.java create mode 100644 platforms/android/src/org/apache/cordova/contacts/ContactAccessor.java create mode 100644 platforms/android/src/org/apache/cordova/contacts/ContactAccessorSdk5.java create mode 100644 platforms/android/src/org/apache/cordova/contacts/ContactInfoDTO.java create mode 100644 platforms/android/src/org/apache/cordova/contacts/ContactManager.java create mode 100644 platforms/android/src/org/apache/cordova/device/Device.java create mode 100755 platforms/android/src/org/apache/cordova/devicemotion/AccelListener.java create mode 100755 platforms/android/src/org/apache/cordova/deviceorientation/CompassListener.java create mode 100644 platforms/android/src/org/apache/cordova/dialogs/Notification.java create mode 100644 platforms/android/src/org/apache/cordova/file/AssetFilesystem.java create mode 100644 platforms/android/src/org/apache/cordova/file/ContentFilesystem.java create mode 100644 platforms/android/src/org/apache/cordova/file/DirectoryManager.java create mode 100644 platforms/android/src/org/apache/cordova/file/EncodingException.java create mode 100644 platforms/android/src/org/apache/cordova/file/FileExistsException.java create mode 100644 platforms/android/src/org/apache/cordova/file/FileUtils.java create mode 100644 platforms/android/src/org/apache/cordova/file/Filesystem.java create mode 100644 platforms/android/src/org/apache/cordova/file/InvalidModificationException.java create mode 100644 platforms/android/src/org/apache/cordova/file/LocalFilesystem.java create mode 100644 platforms/android/src/org/apache/cordova/file/LocalFilesystemURL.java create mode 100644 platforms/android/src/org/apache/cordova/file/NoModificationAllowedException.java create mode 100644 platforms/android/src/org/apache/cordova/file/PendingRequests.java create mode 100644 platforms/android/src/org/apache/cordova/file/TypeMismatchException.java create mode 100644 platforms/android/src/org/apache/cordova/filetransfer/FileProgressResult.java create mode 100644 platforms/android/src/org/apache/cordova/filetransfer/FileTransfer.java create mode 100644 platforms/android/src/org/apache/cordova/filetransfer/FileUploadResult.java create mode 100644 platforms/android/src/org/apache/cordova/geolocation/Geolocation.java create mode 100644 platforms/android/src/org/apache/cordova/media/AudioHandler.java create mode 100644 platforms/android/src/org/apache/cordova/media/AudioPlayer.java create mode 100644 platforms/android/src/org/apache/cordova/media/FileHelper.java create mode 100644 platforms/android/src/org/apache/cordova/mediacapture/Capture.java create mode 100644 platforms/android/src/org/apache/cordova/mediacapture/FileHelper.java create mode 100644 platforms/android/src/org/apache/cordova/mediacapture/PendingRequests.java create mode 100755 platforms/android/src/org/apache/cordova/networkinformation/NetworkManager.java create mode 100644 platforms/android/src/org/apache/cordova/vibration/Vibration.java create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-battery-status/src/browser/BatteryProxy.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-battery-status/www/battery.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-camera/src/browser/CameraProxy.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-camera/www/Camera.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/Contact.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/contacts.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device-motion/src/browser/AccelerometerProxy.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/src/browser/CompassProxy.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device/src/browser/DeviceProxy.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-device/www/device.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-dialogs/www/browser/notification.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-dialogs/www/notification.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/browser/FileTransfer.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/src/browser/FileProxy.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/Entry.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/File.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/FileEntry.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/FileError.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/FileReader.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/FileSystem.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/FileUploadOptions.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/FileUploadResult.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/FileWriter.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/Flags.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/LocalFileSystem.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/Metadata.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/ProgressEvent.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/browser/FileSystem.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/browser/Preparing.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/browser/isChrome.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/fileSystemPaths.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/fileSystems.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/requestFileSystem.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/src/browser/CaptureProxy.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/www/CaptureError.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/www/MediaFile.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/www/MediaFileData.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/www/capture.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media-capture/www/helpers.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media/www/Media.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media/www/MediaError.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-media/www/browser/Media.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-network-information/src/browser/network.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-network-information/www/Connection.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-network-information/www/network.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-vibration/src/browser/Vibration.js create mode 100644 platforms/browser/platform_www/plugins/cordova-plugin-vibration/www/vibration.js delete mode 100644 platforms/browser/platform_www/plugins/phonegap-plugin-barcodescanner/src/browser/BarcodeScannerProxy.js delete mode 100644 platforms/browser/platform_www/plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js create mode 100644 platforms/browser/www/img/logo.png create mode 100644 platforms/browser/www/img/logo.svg create mode 100644 platforms/browser/www/plugins/cordova-plugin-battery-status/src/browser/BatteryProxy.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-battery-status/www/battery.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-camera/src/browser/CameraProxy.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-camera/www/Camera.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-camera/www/CameraConstants.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/Contact.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/ContactAddress.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/ContactError.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/ContactField.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/ContactFieldType.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/ContactName.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/ContactOrganization.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/contacts.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-contacts/www/convertUtils.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device-motion/src/browser/AccelerometerProxy.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device-motion/www/Acceleration.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device-motion/www/accelerometer.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device-orientation/src/browser/CompassProxy.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device-orientation/www/CompassError.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device-orientation/www/compass.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device/src/browser/DeviceProxy.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-device/www/device.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-dialogs/www/browser/notification.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-dialogs/www/notification.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file-transfer/www/browser/FileTransfer.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/src/browser/FileProxy.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/DirectoryEntry.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/DirectoryReader.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/Entry.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/File.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/FileEntry.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/FileError.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/FileReader.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/FileSystem.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/FileUploadOptions.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/FileUploadResult.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/FileWriter.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/Flags.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/LocalFileSystem.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/Metadata.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/ProgressEvent.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/browser/FileSystem.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/browser/Preparing.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/browser/isChrome.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/fileSystemPaths.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/fileSystems.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/requestFileSystem.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/src/browser/CaptureProxy.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/www/CaptureError.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/www/MediaFile.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/www/MediaFileData.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/www/capture.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media-capture/www/helpers.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media/www/Media.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media/www/MediaError.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-media/www/browser/Media.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-network-information/src/browser/network.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-network-information/www/Connection.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-network-information/www/network.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-vibration/src/browser/Vibration.js create mode 100644 platforms/browser/www/plugins/cordova-plugin-vibration/www/vibration.js delete mode 100644 platforms/browser/www/plugins/phonegap-plugin-barcodescanner/src/browser/BarcodeScannerProxy.js delete mode 100644 platforms/browser/www/plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js delete mode 100644 platforms/browser/www/screens/pay.html delete mode 100644 platforms/browser/www/screens/paymentsent.html delete mode 100644 platforms/browser/www/screens/peerpay.html delete mode 100644 platforms/browser/www/screens/peersent.html delete mode 100644 platforms/browser/www/screens/signup.html create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-battery-status/battery.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-battery-status/battery.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-camera/camera.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-camera/camera.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-console/console.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-console/console.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-contacts/contacts.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-contacts/contacts.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-device-motion/accelerometer.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-device-motion/accelerometer.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-device-orientation/compass.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-device-orientation/compass.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-device/device.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-device/device.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-dialogs/notification.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-dialogs/notification.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-file-transfer/file-transfer.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-file-transfer/file-transfer.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-file/file.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-file/file.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-geolocation/geolocation.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-geolocation/geolocation.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-media-capture/capture.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-media-capture/capture.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-media/media.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-media/media.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-network-information/network_information.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-network-information/network_information.h create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-vibration/vibration.cpp create mode 100644 platforms/ubuntu/build/src/plugins/cordova-plugin-vibration/vibration.h create mode 100644 platforms/ubuntu/platform_www/cordova_plugins.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-battery-status/www/battery.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/Camera.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-console/www/console-via-logger.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-console/www/logger.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/Contact.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/contacts.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-device/src/ubuntu/device.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-device/www/device.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-dialogs/www/notification.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/Entry.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/File.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/FileEntry.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/FileError.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/FileReader.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/FileSystem.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/FileUploadOptions.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/FileUploadResult.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/FileWriter.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/Flags.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/LocalFileSystem.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/Metadata.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/ProgressEvent.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/browser/isChrome.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/fileSystems.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/requestFileSystem.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/ubuntu/FileSystem.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/ubuntu/FileWriter.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/ubuntu/fileSystems-roots.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-geolocation/www/Coordinates.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-geolocation/www/Position.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-geolocation/www/PositionError.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-geolocation/www/geolocation.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media-capture/www/CaptureError.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media-capture/www/MediaFile.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media-capture/www/MediaFileData.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media-capture/www/capture.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media-capture/www/helpers.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media/www/Media.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-media/www/MediaError.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-network-information/www/Connection.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-network-information/www/network.js create mode 100644 platforms/ubuntu/platform_www/plugins/cordova-plugin-vibration/www/vibration.js create mode 100644 platforms/ubuntu/qml/CaptureWidget.qml create mode 100644 platforms/ubuntu/qml/MediaCaptureWidget.qml create mode 100644 platforms/ubuntu/qml/back.png create mode 100644 platforms/ubuntu/qml/microphone.png create mode 100644 platforms/ubuntu/qml/notification.qml create mode 100644 platforms/ubuntu/qml/record_off.png create mode 100644 platforms/ubuntu/qml/record_on.png create mode 100644 platforms/ubuntu/qml/shoot.png create mode 100644 platforms/ubuntu/qml/toolbar-left.png create mode 100644 platforms/ubuntu/qml/toolbar-middle.png create mode 100644 platforms/ubuntu/qml/toolbar-right.png create mode 100644 platforms/ubuntu/www/img/logo.png create mode 100644 platforms/ubuntu/www/img/logo.svg delete mode 100644 platforms/ubuntu/www/screens/pay.html delete mode 100644 platforms/ubuntu/www/screens/paymentsent.html delete mode 100644 platforms/ubuntu/www/screens/peerpay.html delete mode 100644 platforms/ubuntu/www/screens/peersent.html delete mode 100644 platforms/ubuntu/www/screens/signup.html create mode 100644 plugins/cordova-plugin-battery-status/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-battery-status/LICENSE create mode 100644 plugins/cordova-plugin-battery-status/NOTICE create mode 100644 plugins/cordova-plugin-battery-status/README.md create mode 100644 plugins/cordova-plugin-battery-status/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-battery-status/doc/de/README.md create mode 100644 plugins/cordova-plugin-battery-status/doc/de/index.md create mode 100644 plugins/cordova-plugin-battery-status/doc/es/README.md create mode 100644 plugins/cordova-plugin-battery-status/doc/es/index.md create mode 100644 plugins/cordova-plugin-battery-status/doc/fr/README.md create mode 100644 plugins/cordova-plugin-battery-status/doc/fr/index.md create mode 100644 plugins/cordova-plugin-battery-status/doc/it/README.md create mode 100644 plugins/cordova-plugin-battery-status/doc/it/index.md create mode 100644 plugins/cordova-plugin-battery-status/doc/ja/README.md create mode 100644 plugins/cordova-plugin-battery-status/doc/ja/index.md create mode 100644 plugins/cordova-plugin-battery-status/doc/ko/README.md create mode 100644 plugins/cordova-plugin-battery-status/doc/ko/index.md create mode 100644 plugins/cordova-plugin-battery-status/doc/pl/README.md create mode 100644 plugins/cordova-plugin-battery-status/doc/pl/index.md create mode 100644 plugins/cordova-plugin-battery-status/doc/ru/index.md create mode 100644 plugins/cordova-plugin-battery-status/doc/zh/README.md create mode 100644 plugins/cordova-plugin-battery-status/doc/zh/index.md create mode 100644 plugins/cordova-plugin-battery-status/package.json create mode 100644 plugins/cordova-plugin-battery-status/plugin.xml create mode 100755 plugins/cordova-plugin-battery-status/src/android/BatteryListener.java create mode 100644 plugins/cordova-plugin-battery-status/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-battery-status/src/browser/BatteryProxy.js create mode 100644 plugins/cordova-plugin-battery-status/src/firefoxos/BatteryProxy.js create mode 100644 plugins/cordova-plugin-battery-status/src/ios/CDVBattery.h create mode 100644 plugins/cordova-plugin-battery-status/src/ios/CDVBattery.m create mode 100644 plugins/cordova-plugin-battery-status/src/tizen/BatteryStatusProxy.js create mode 100644 plugins/cordova-plugin-battery-status/src/ubuntu/battery.cpp create mode 100644 plugins/cordova-plugin-battery-status/src/ubuntu/battery.h create mode 100644 plugins/cordova-plugin-battery-status/src/windows/BatteryProxy.js create mode 100644 plugins/cordova-plugin-battery-status/src/windows/BatteryStatus.winmd create mode 100644 plugins/cordova-plugin-battery-status/src/windows/BatteryStatus/BatteryStatus.sln create mode 100644 plugins/cordova-plugin-battery-status/src/windows/BatteryStatus/BatteryStatus/.gitignore create mode 100644 plugins/cordova-plugin-battery-status/src/windows/BatteryStatus/BatteryStatus/BatteryStatus.cs create mode 100644 plugins/cordova-plugin-battery-status/src/windows/BatteryStatus/BatteryStatus/BatteryStatus.csproj rename plugins/{phonegap-plugin-barcodescanner/src/windows/lib => cordova-plugin-battery-status/src/windows/BatteryStatus/BatteryStatus}/Properties/AssemblyInfo.cs (55%) mode change 100755 => 100644 create mode 100644 plugins/cordova-plugin-battery-status/src/wp/Battery.cs rename plugins/{phonegap-plugin-barcodescanner => cordova-plugin-battery-status}/tests/plugin.xml (90%) mode change 100755 => 100644 create mode 100644 plugins/cordova-plugin-battery-status/tests/tests.js create mode 100644 plugins/cordova-plugin-battery-status/www/battery.js create mode 100644 plugins/cordova-plugin-camera/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-camera/LICENSE create mode 100644 plugins/cordova-plugin-camera/NOTICE create mode 100644 plugins/cordova-plugin-camera/README.md create mode 100644 plugins/cordova-plugin-camera/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-camera/appium-tests/android/android.spec.js create mode 100644 plugins/cordova-plugin-camera/appium-tests/helpers/cameraHelper.js create mode 100644 plugins/cordova-plugin-camera/appium-tests/ios/ios.spec.js create mode 100644 plugins/cordova-plugin-camera/doc/de/README.md create mode 100644 plugins/cordova-plugin-camera/doc/de/index.md create mode 100644 plugins/cordova-plugin-camera/doc/es/README.md create mode 100644 plugins/cordova-plugin-camera/doc/es/index.md create mode 100644 plugins/cordova-plugin-camera/doc/fr/README.md create mode 100644 plugins/cordova-plugin-camera/doc/fr/index.md create mode 100644 plugins/cordova-plugin-camera/doc/img/android-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/android-success.png create mode 100644 plugins/cordova-plugin-camera/doc/img/blackberry-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/blackberry-success.png create mode 100644 plugins/cordova-plugin-camera/doc/img/browser-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/browser-success.png create mode 100644 plugins/cordova-plugin-camera/doc/img/firefox-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/firefox-success.png create mode 100644 plugins/cordova-plugin-camera/doc/img/fireos-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/fireos-success.png create mode 100644 plugins/cordova-plugin-camera/doc/img/ios-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/ios-success.png create mode 100644 plugins/cordova-plugin-camera/doc/img/ubuntu-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/ubuntu-success.png create mode 100644 plugins/cordova-plugin-camera/doc/img/windows-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/windows-success.png create mode 100644 plugins/cordova-plugin-camera/doc/img/wp8-fail.png create mode 100644 plugins/cordova-plugin-camera/doc/img/wp8-success.png create mode 100644 plugins/cordova-plugin-camera/doc/it/README.md create mode 100644 plugins/cordova-plugin-camera/doc/it/index.md create mode 100644 plugins/cordova-plugin-camera/doc/ja/README.md create mode 100644 plugins/cordova-plugin-camera/doc/ja/index.md create mode 100644 plugins/cordova-plugin-camera/doc/ko/README.md create mode 100644 plugins/cordova-plugin-camera/doc/ko/index.md create mode 100644 plugins/cordova-plugin-camera/doc/pl/README.md create mode 100644 plugins/cordova-plugin-camera/doc/pl/index.md create mode 100644 plugins/cordova-plugin-camera/doc/ru/index.md create mode 100644 plugins/cordova-plugin-camera/doc/zh/README.md create mode 100644 plugins/cordova-plugin-camera/doc/zh/index.md create mode 100644 plugins/cordova-plugin-camera/jsdoc2md/TEMPLATE.md create mode 100644 plugins/cordova-plugin-camera/package.json create mode 100644 plugins/cordova-plugin-camera/plugin.xml create mode 100644 plugins/cordova-plugin-camera/src/android/CameraLauncher.java create mode 100644 plugins/cordova-plugin-camera/src/android/ExifHelper.java create mode 100644 plugins/cordova-plugin-camera/src/android/FileHelper.java create mode 100644 plugins/cordova-plugin-camera/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-camera/src/browser/CameraProxy.js create mode 100644 plugins/cordova-plugin-camera/src/firefoxos/CameraProxy.js create mode 100644 plugins/cordova-plugin-camera/src/ios/CDVCamera.h create mode 100644 plugins/cordova-plugin-camera/src/ios/CDVCamera.m create mode 100644 plugins/cordova-plugin-camera/src/ios/CDVExif.h create mode 100644 plugins/cordova-plugin-camera/src/ios/CDVJpegHeaderWriter.h create mode 100644 plugins/cordova-plugin-camera/src/ios/CDVJpegHeaderWriter.m create mode 100644 plugins/cordova-plugin-camera/src/ios/UIImage+CropScaleOrientation.h create mode 100644 plugins/cordova-plugin-camera/src/ios/UIImage+CropScaleOrientation.m create mode 100644 plugins/cordova-plugin-camera/src/ubuntu/CaptureWidget.qml create mode 100644 plugins/cordova-plugin-camera/src/ubuntu/back.png create mode 100644 plugins/cordova-plugin-camera/src/ubuntu/camera.cpp create mode 100644 plugins/cordova-plugin-camera/src/ubuntu/camera.h create mode 100644 plugins/cordova-plugin-camera/src/ubuntu/shoot.png create mode 100644 plugins/cordova-plugin-camera/src/ubuntu/toolbar-left.png create mode 100644 plugins/cordova-plugin-camera/src/ubuntu/toolbar-middle.png create mode 100644 plugins/cordova-plugin-camera/src/ubuntu/toolbar-right.png create mode 100644 plugins/cordova-plugin-camera/src/windows/CameraProxy.js create mode 100644 plugins/cordova-plugin-camera/src/wp/Camera.cs create mode 100644 plugins/cordova-plugin-camera/tests/ios/.gitignore create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest.xcworkspace/contents.xcworkspacedata create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest.xcworkspace/xcshareddata/CDVCameraTest.xccheckout create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest.xcworkspace/xcshareddata/xcschemes/CordovaLib.xcscheme create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest/CDVCameraLibTests/CameraTest.m create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest/CDVCameraLibTests/Info.plist create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest/CDVCameraTest.xcodeproj/project.pbxproj create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest/CDVCameraTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest/CDVCameraTest.xcodeproj/project.xcworkspace/xcshareddata/CDVCameraTest.xccheckout create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest/CDVCameraTest.xcodeproj/xcshareddata/xcschemes/CDVCameraLib.xcscheme create mode 100644 plugins/cordova-plugin-camera/tests/ios/CDVCameraTest/CDVCameraTest.xcodeproj/xcshareddata/xcschemes/CDVCameraLibTests.xcscheme create mode 100644 plugins/cordova-plugin-camera/tests/ios/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/doc/de/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/doc/es/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/doc/fr/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/doc/it/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/doc/ja/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/doc/ko/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/doc/pl/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/doc/zh/README.md create mode 100644 plugins/cordova-plugin-camera/tests/ios/package.json create mode 100644 plugins/cordova-plugin-camera/tests/plugin.xml create mode 100644 plugins/cordova-plugin-camera/tests/tests.js create mode 100644 plugins/cordova-plugin-camera/www/Camera.js create mode 100644 plugins/cordova-plugin-camera/www/CameraConstants.js create mode 100644 plugins/cordova-plugin-camera/www/CameraPopoverHandle.js create mode 100644 plugins/cordova-plugin-camera/www/CameraPopoverOptions.js create mode 100644 plugins/cordova-plugin-camera/www/blackberry10/assets/camera.html create mode 100644 plugins/cordova-plugin-camera/www/blackberry10/assets/camera.js create mode 100644 plugins/cordova-plugin-camera/www/ios/CameraPopoverHandle.js create mode 100644 plugins/cordova-plugin-console/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-console/LICENSE create mode 100644 plugins/cordova-plugin-console/NOTICE create mode 100644 plugins/cordova-plugin-console/README.md create mode 100644 plugins/cordova-plugin-console/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-console/doc/de/README.md create mode 100644 plugins/cordova-plugin-console/doc/de/index.md create mode 100644 plugins/cordova-plugin-console/doc/es/README.md create mode 100644 plugins/cordova-plugin-console/doc/es/index.md create mode 100644 plugins/cordova-plugin-console/doc/fr/README.md create mode 100644 plugins/cordova-plugin-console/doc/fr/index.md create mode 100644 plugins/cordova-plugin-console/doc/it/README.md create mode 100644 plugins/cordova-plugin-console/doc/it/index.md create mode 100644 plugins/cordova-plugin-console/doc/ja/README.md create mode 100644 plugins/cordova-plugin-console/doc/ja/index.md create mode 100644 plugins/cordova-plugin-console/doc/ko/README.md create mode 100644 plugins/cordova-plugin-console/doc/ko/index.md create mode 100644 plugins/cordova-plugin-console/doc/pl/README.md create mode 100644 plugins/cordova-plugin-console/doc/pl/index.md create mode 100644 plugins/cordova-plugin-console/doc/ru/index.md create mode 100644 plugins/cordova-plugin-console/doc/zh/README.md create mode 100644 plugins/cordova-plugin-console/doc/zh/index.md create mode 100644 plugins/cordova-plugin-console/package.json create mode 100644 plugins/cordova-plugin-console/plugin.xml create mode 100644 plugins/cordova-plugin-console/src/ios/CDVLogger.h create mode 100644 plugins/cordova-plugin-console/src/ios/CDVLogger.m create mode 100644 plugins/cordova-plugin-console/src/ubuntu/console.cpp create mode 100644 plugins/cordova-plugin-console/src/ubuntu/console.h create mode 100644 plugins/cordova-plugin-console/src/wp/DebugConsole.cs create mode 100644 plugins/cordova-plugin-console/tests/plugin.xml create mode 100644 plugins/cordova-plugin-console/tests/tests.js create mode 100644 plugins/cordova-plugin-console/www/console-via-logger.js create mode 100644 plugins/cordova-plugin-console/www/logger.js create mode 100644 plugins/cordova-plugin-contacts/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-contacts/LICENSE create mode 100644 plugins/cordova-plugin-contacts/NOTICE create mode 100644 plugins/cordova-plugin-contacts/README.md create mode 100644 plugins/cordova-plugin-contacts/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-contacts/appium-tests/common/common.spec.js create mode 100644 plugins/cordova-plugin-contacts/appium-tests/helpers/contactsHelper.js create mode 100644 plugins/cordova-plugin-contacts/doc/de/README.md create mode 100644 plugins/cordova-plugin-contacts/doc/de/index.md create mode 100644 plugins/cordova-plugin-contacts/doc/es/README.md create mode 100644 plugins/cordova-plugin-contacts/doc/es/index.md create mode 100644 plugins/cordova-plugin-contacts/doc/fr/README.md create mode 100644 plugins/cordova-plugin-contacts/doc/fr/index.md create mode 100644 plugins/cordova-plugin-contacts/doc/it/README.md create mode 100644 plugins/cordova-plugin-contacts/doc/it/index.md create mode 100644 plugins/cordova-plugin-contacts/doc/ja/README.md create mode 100644 plugins/cordova-plugin-contacts/doc/ja/index.md create mode 100644 plugins/cordova-plugin-contacts/doc/ko/README.md create mode 100644 plugins/cordova-plugin-contacts/doc/ko/index.md create mode 100644 plugins/cordova-plugin-contacts/doc/pl/README.md create mode 100644 plugins/cordova-plugin-contacts/doc/pl/index.md create mode 100644 plugins/cordova-plugin-contacts/doc/ru/index.md create mode 100644 plugins/cordova-plugin-contacts/doc/zh/README.md create mode 100644 plugins/cordova-plugin-contacts/doc/zh/index.md create mode 100644 plugins/cordova-plugin-contacts/package.json create mode 100644 plugins/cordova-plugin-contacts/plugin.xml create mode 100644 plugins/cordova-plugin-contacts/src/android/ContactAccessor.java create mode 100644 plugins/cordova-plugin-contacts/src/android/ContactAccessorSdk5.java create mode 100644 plugins/cordova-plugin-contacts/src/android/ContactInfoDTO.java create mode 100644 plugins/cordova-plugin-contacts/src/android/ContactManager.java create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactActivity.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactAddress.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactError.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactField.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactFindOptions.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactName.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactNews.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactOrganization.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/ContactPhoto.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/contactConsts.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/contactUtils.js create mode 100644 plugins/cordova-plugin-contacts/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-contacts/src/firefoxos/ContactsProxy.js create mode 100644 plugins/cordova-plugin-contacts/src/ios/CDVContact.h create mode 100644 plugins/cordova-plugin-contacts/src/ios/CDVContact.m create mode 100644 plugins/cordova-plugin-contacts/src/ios/CDVContacts.h create mode 100644 plugins/cordova-plugin-contacts/src/ios/CDVContacts.m create mode 100644 plugins/cordova-plugin-contacts/src/ubuntu/contacts.cpp create mode 100644 plugins/cordova-plugin-contacts/src/ubuntu/contacts.h create mode 100644 plugins/cordova-plugin-contacts/src/windows/ContactProxy.js create mode 100644 plugins/cordova-plugin-contacts/src/windows8/ContactProxy.js create mode 100644 plugins/cordova-plugin-contacts/src/wp/ContactPicker.xaml create mode 100644 plugins/cordova-plugin-contacts/src/wp/ContactPicker.xaml.cs create mode 100644 plugins/cordova-plugin-contacts/src/wp/ContactPickerTask.cs create mode 100644 plugins/cordova-plugin-contacts/src/wp/Contacts.cs create mode 100644 plugins/cordova-plugin-contacts/src/wp/ContactsHelper.cs create mode 100644 plugins/cordova-plugin-contacts/tests/plugin.xml create mode 100644 plugins/cordova-plugin-contacts/tests/tests.js create mode 100644 plugins/cordova-plugin-contacts/www/Contact.js create mode 100644 plugins/cordova-plugin-contacts/www/ContactAddress.js create mode 100644 plugins/cordova-plugin-contacts/www/ContactError.js create mode 100644 plugins/cordova-plugin-contacts/www/ContactField.js create mode 100644 plugins/cordova-plugin-contacts/www/ContactFieldType.js create mode 100644 plugins/cordova-plugin-contacts/www/ContactFindOptions.js create mode 100644 plugins/cordova-plugin-contacts/www/ContactName.js create mode 100644 plugins/cordova-plugin-contacts/www/ContactOrganization.js create mode 100644 plugins/cordova-plugin-contacts/www/contacts.js create mode 100644 plugins/cordova-plugin-contacts/www/convertUtils.js create mode 100644 plugins/cordova-plugin-contacts/www/ios/Contact.js create mode 100644 plugins/cordova-plugin-contacts/www/ios/contacts.js create mode 100644 plugins/cordova-plugin-device-motion/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-device-motion/LICENSE create mode 100644 plugins/cordova-plugin-device-motion/NOTICE create mode 100644 plugins/cordova-plugin-device-motion/README.md create mode 100644 plugins/cordova-plugin-device-motion/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-device-motion/doc/de/README.md create mode 100644 plugins/cordova-plugin-device-motion/doc/de/index.md create mode 100644 plugins/cordova-plugin-device-motion/doc/es/README.md create mode 100644 plugins/cordova-plugin-device-motion/doc/es/index.md create mode 100644 plugins/cordova-plugin-device-motion/doc/fr/README.md create mode 100644 plugins/cordova-plugin-device-motion/doc/fr/index.md create mode 100644 plugins/cordova-plugin-device-motion/doc/it/README.md create mode 100644 plugins/cordova-plugin-device-motion/doc/it/index.md create mode 100644 plugins/cordova-plugin-device-motion/doc/ja/README.md create mode 100644 plugins/cordova-plugin-device-motion/doc/ja/index.md create mode 100644 plugins/cordova-plugin-device-motion/doc/ko/README.md create mode 100644 plugins/cordova-plugin-device-motion/doc/ko/index.md create mode 100644 plugins/cordova-plugin-device-motion/doc/pl/README.md create mode 100644 plugins/cordova-plugin-device-motion/doc/pl/index.md create mode 100644 plugins/cordova-plugin-device-motion/doc/ru/index.md create mode 100644 plugins/cordova-plugin-device-motion/doc/zh/README.md create mode 100644 plugins/cordova-plugin-device-motion/doc/zh/index.md create mode 100644 plugins/cordova-plugin-device-motion/package.json create mode 100644 plugins/cordova-plugin-device-motion/plugin.xml create mode 100755 plugins/cordova-plugin-device-motion/src/android/AccelListener.java create mode 100644 plugins/cordova-plugin-device-motion/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-device-motion/src/browser/AccelerometerProxy.js create mode 100644 plugins/cordova-plugin-device-motion/src/firefoxos/accelerometer.js create mode 100755 plugins/cordova-plugin-device-motion/src/ios/CDVAccelerometer.h create mode 100755 plugins/cordova-plugin-device-motion/src/ios/CDVAccelerometer.m create mode 100644 plugins/cordova-plugin-device-motion/src/tizen/AccelerometerProxy.js create mode 100644 plugins/cordova-plugin-device-motion/src/ubuntu/accelerometer.cpp create mode 100644 plugins/cordova-plugin-device-motion/src/ubuntu/accelerometer.h create mode 100644 plugins/cordova-plugin-device-motion/src/windows/AccelerometerProxy.js create mode 100644 plugins/cordova-plugin-device-motion/src/wp/Accelerometer.cs create mode 100644 plugins/cordova-plugin-device-motion/tests/plugin.xml create mode 100644 plugins/cordova-plugin-device-motion/tests/tests.js create mode 100644 plugins/cordova-plugin-device-motion/www/Acceleration.js create mode 100644 plugins/cordova-plugin-device-motion/www/accelerometer.js create mode 100644 plugins/cordova-plugin-device-orientation/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-device-orientation/LICENSE create mode 100644 plugins/cordova-plugin-device-orientation/NOTICE create mode 100644 plugins/cordova-plugin-device-orientation/README.md create mode 100644 plugins/cordova-plugin-device-orientation/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/de/README.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/de/index.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/es/README.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/es/index.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/fr/README.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/fr/index.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/it/README.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/it/index.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/ja/README.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/ja/index.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/ko/README.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/ko/index.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/pl/README.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/pl/index.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/ru/index.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/zh/README.md create mode 100644 plugins/cordova-plugin-device-orientation/doc/zh/index.md create mode 100644 plugins/cordova-plugin-device-orientation/package.json create mode 100644 plugins/cordova-plugin-device-orientation/plugin.xml create mode 100755 plugins/cordova-plugin-device-orientation/src/android/CompassListener.java create mode 100644 plugins/cordova-plugin-device-orientation/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-device-orientation/src/browser/CompassProxy.js create mode 100644 plugins/cordova-plugin-device-orientation/src/firefoxos/compass.js create mode 100644 plugins/cordova-plugin-device-orientation/src/ios/CDVCompass.h create mode 100644 plugins/cordova-plugin-device-orientation/src/ios/CDVCompass.m create mode 100644 plugins/cordova-plugin-device-orientation/src/tizen/CompassProxy.js create mode 100644 plugins/cordova-plugin-device-orientation/src/ubuntu/compass.cpp create mode 100644 plugins/cordova-plugin-device-orientation/src/ubuntu/compass.h create mode 100644 plugins/cordova-plugin-device-orientation/src/windows/CompassProxy.js create mode 100644 plugins/cordova-plugin-device-orientation/src/wp/Compass.cs create mode 100644 plugins/cordova-plugin-device-orientation/tests/plugin.xml create mode 100644 plugins/cordova-plugin-device-orientation/tests/tests.js create mode 100644 plugins/cordova-plugin-device-orientation/www/CompassError.js create mode 100644 plugins/cordova-plugin-device-orientation/www/CompassHeading.js create mode 100644 plugins/cordova-plugin-device-orientation/www/compass.js create mode 100644 plugins/cordova-plugin-device/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-device/LICENSE create mode 100644 plugins/cordova-plugin-device/NOTICE create mode 100644 plugins/cordova-plugin-device/README.md create mode 100644 plugins/cordova-plugin-device/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-device/doc/de/README.md create mode 100644 plugins/cordova-plugin-device/doc/de/index.md create mode 100644 plugins/cordova-plugin-device/doc/es/README.md create mode 100644 plugins/cordova-plugin-device/doc/es/index.md create mode 100644 plugins/cordova-plugin-device/doc/fr/README.md create mode 100644 plugins/cordova-plugin-device/doc/fr/index.md create mode 100644 plugins/cordova-plugin-device/doc/it/README.md create mode 100644 plugins/cordova-plugin-device/doc/it/index.md create mode 100644 plugins/cordova-plugin-device/doc/ja/README.md create mode 100644 plugins/cordova-plugin-device/doc/ja/index.md create mode 100644 plugins/cordova-plugin-device/doc/ko/README.md create mode 100644 plugins/cordova-plugin-device/doc/ko/index.md create mode 100644 plugins/cordova-plugin-device/doc/pl/README.md create mode 100644 plugins/cordova-plugin-device/doc/pl/index.md create mode 100644 plugins/cordova-plugin-device/doc/ru/index.md create mode 100644 plugins/cordova-plugin-device/doc/zh/README.md create mode 100644 plugins/cordova-plugin-device/doc/zh/index.md create mode 100644 plugins/cordova-plugin-device/package.json create mode 100644 plugins/cordova-plugin-device/plugin.xml create mode 100644 plugins/cordova-plugin-device/src/android/Device.java create mode 100644 plugins/cordova-plugin-device/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-device/src/browser/DeviceProxy.js create mode 100644 plugins/cordova-plugin-device/src/firefoxos/DeviceProxy.js create mode 100644 plugins/cordova-plugin-device/src/ios/CDVDevice.h create mode 100644 plugins/cordova-plugin-device/src/ios/CDVDevice.m create mode 100644 plugins/cordova-plugin-device/src/osx/CDVDevice.h create mode 100644 plugins/cordova-plugin-device/src/osx/CDVDevice.m create mode 100644 plugins/cordova-plugin-device/src/tizen/DeviceProxy.js create mode 100644 plugins/cordova-plugin-device/src/ubuntu/device.cpp create mode 100644 plugins/cordova-plugin-device/src/ubuntu/device.h create mode 100644 plugins/cordova-plugin-device/src/ubuntu/device.js create mode 100644 plugins/cordova-plugin-device/src/windows/DeviceProxy.js create mode 100644 plugins/cordova-plugin-device/src/wp/Device.cs create mode 100644 plugins/cordova-plugin-device/tests/plugin.xml create mode 100644 plugins/cordova-plugin-device/tests/tests.js create mode 100644 plugins/cordova-plugin-device/www/device.js create mode 100644 plugins/cordova-plugin-dialogs/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-dialogs/LICENSE create mode 100644 plugins/cordova-plugin-dialogs/NOTICE create mode 100644 plugins/cordova-plugin-dialogs/README.md create mode 100644 plugins/cordova-plugin-dialogs/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-dialogs/doc/de/README.md create mode 100644 plugins/cordova-plugin-dialogs/doc/de/index.md create mode 100644 plugins/cordova-plugin-dialogs/doc/es/README.md create mode 100644 plugins/cordova-plugin-dialogs/doc/es/index.md create mode 100644 plugins/cordova-plugin-dialogs/doc/fr/README.md create mode 100644 plugins/cordova-plugin-dialogs/doc/fr/index.md create mode 100644 plugins/cordova-plugin-dialogs/doc/it/README.md create mode 100644 plugins/cordova-plugin-dialogs/doc/it/index.md create mode 100644 plugins/cordova-plugin-dialogs/doc/ja/README.md create mode 100644 plugins/cordova-plugin-dialogs/doc/ja/index.md create mode 100644 plugins/cordova-plugin-dialogs/doc/ko/README.md create mode 100644 plugins/cordova-plugin-dialogs/doc/ko/index.md create mode 100644 plugins/cordova-plugin-dialogs/doc/pl/README.md create mode 100644 plugins/cordova-plugin-dialogs/doc/pl/index.md create mode 100644 plugins/cordova-plugin-dialogs/doc/ru/index.md create mode 100644 plugins/cordova-plugin-dialogs/doc/zh/README.md create mode 100644 plugins/cordova-plugin-dialogs/doc/zh/index.md create mode 100644 plugins/cordova-plugin-dialogs/package.json create mode 100644 plugins/cordova-plugin-dialogs/plugin.xml create mode 100644 plugins/cordova-plugin-dialogs/src/android/Notification.java create mode 100644 plugins/cordova-plugin-dialogs/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-dialogs/src/firefoxos/notification.js create mode 100644 plugins/cordova-plugin-dialogs/src/ios/CDVNotification.bundle/beep.wav create mode 100644 plugins/cordova-plugin-dialogs/src/ios/CDVNotification.h create mode 100644 plugins/cordova-plugin-dialogs/src/ios/CDVNotification.m create mode 100644 plugins/cordova-plugin-dialogs/src/ubuntu/notification.cpp create mode 100644 plugins/cordova-plugin-dialogs/src/ubuntu/notification.h create mode 100644 plugins/cordova-plugin-dialogs/src/ubuntu/notification.qml create mode 100644 plugins/cordova-plugin-dialogs/src/windows/NotificationProxy.js create mode 100644 plugins/cordova-plugin-dialogs/src/wp/Notification.cs create mode 100644 plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml create mode 100644 plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml.cs create mode 100644 plugins/cordova-plugin-dialogs/src/wp/notification-beep.wav create mode 100644 plugins/cordova-plugin-dialogs/tests/plugin.xml create mode 100644 plugins/cordova-plugin-dialogs/tests/tests.js create mode 100644 plugins/cordova-plugin-dialogs/www/android/notification.js create mode 100644 plugins/cordova-plugin-dialogs/www/blackberry10/beep.js create mode 100644 plugins/cordova-plugin-dialogs/www/blackberry10/notification-beep.wav create mode 100644 plugins/cordova-plugin-dialogs/www/browser/notification.js create mode 100644 plugins/cordova-plugin-dialogs/www/firefoxos/danger-press.png create mode 100644 plugins/cordova-plugin-dialogs/www/firefoxos/danger.png create mode 100644 plugins/cordova-plugin-dialogs/www/firefoxos/default.png create mode 100644 plugins/cordova-plugin-dialogs/www/firefoxos/gradient.png create mode 100644 plugins/cordova-plugin-dialogs/www/firefoxos/notification.css create mode 100644 plugins/cordova-plugin-dialogs/www/firefoxos/pattern.png create mode 100644 plugins/cordova-plugin-dialogs/www/firefoxos/recommend.png create mode 100644 plugins/cordova-plugin-dialogs/www/notification.js create mode 100644 plugins/cordova-plugin-file-transfer/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-file-transfer/LICENSE create mode 100644 plugins/cordova-plugin-file-transfer/NOTICE create mode 100644 plugins/cordova-plugin-file-transfer/README.md create mode 100644 plugins/cordova-plugin-file-transfer/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/de/README.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/de/index.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/es/README.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/es/index.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/fr/README.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/fr/index.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/it/README.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/it/index.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/ja/README.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/ja/index.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/ko/README.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/ko/index.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/pl/README.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/pl/index.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/ru/index.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/zh/README.md create mode 100644 plugins/cordova-plugin-file-transfer/doc/zh/index.md create mode 100644 plugins/cordova-plugin-file-transfer/package.json create mode 100644 plugins/cordova-plugin-file-transfer/plugin.xml create mode 100644 plugins/cordova-plugin-file-transfer/src/amazon/FileTransfer.java create mode 100644 plugins/cordova-plugin-file-transfer/src/android/FileProgressResult.java create mode 100644 plugins/cordova-plugin-file-transfer/src/android/FileTransfer.java create mode 100644 plugins/cordova-plugin-file-transfer/src/android/FileUploadResult.java create mode 100644 plugins/cordova-plugin-file-transfer/src/ios/CDVFileTransfer.h create mode 100644 plugins/cordova-plugin-file-transfer/src/ios/CDVFileTransfer.m create mode 100644 plugins/cordova-plugin-file-transfer/src/ubuntu/file-transfer.cpp create mode 100644 plugins/cordova-plugin-file-transfer/src/ubuntu/file-transfer.h create mode 100644 plugins/cordova-plugin-file-transfer/src/windows/FileTransferProxy.js create mode 100644 plugins/cordova-plugin-file-transfer/src/wp/FileTransfer.cs create mode 100644 plugins/cordova-plugin-file-transfer/tests/plugin.xml create mode 100644 plugins/cordova-plugin-file-transfer/tests/tests.js create mode 100644 plugins/cordova-plugin-file-transfer/www/FileTransfer.js create mode 100644 plugins/cordova-plugin-file-transfer/www/FileTransferError.js create mode 100644 plugins/cordova-plugin-file-transfer/www/blackberry10/.jshintrc create mode 100644 plugins/cordova-plugin-file-transfer/www/blackberry10/FileTransfer.js create mode 100644 plugins/cordova-plugin-file-transfer/www/blackberry10/FileTransferProxy.js create mode 100644 plugins/cordova-plugin-file-transfer/www/blackberry10/xhrFileTransfer.js create mode 100644 plugins/cordova-plugin-file-transfer/www/browser/FileTransfer.js create mode 100644 plugins/cordova-plugin-file-transfer/www/firefoxos/FileTransferProxy.js create mode 100644 plugins/cordova-plugin-file-transfer/www/wp7/base64.js create mode 100644 plugins/cordova-plugin-file/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-file/LICENSE create mode 100644 plugins/cordova-plugin-file/NOTICE create mode 100644 plugins/cordova-plugin-file/README.md create mode 100644 plugins/cordova-plugin-file/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-file/doc/de/README.md create mode 100644 plugins/cordova-plugin-file/doc/de/index.md create mode 100644 plugins/cordova-plugin-file/doc/de/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/es/README.md create mode 100644 plugins/cordova-plugin-file/doc/es/index.md create mode 100644 plugins/cordova-plugin-file/doc/es/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/fr/README.md create mode 100644 plugins/cordova-plugin-file/doc/fr/index.md create mode 100644 plugins/cordova-plugin-file/doc/fr/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/it/README.md create mode 100644 plugins/cordova-plugin-file/doc/it/index.md create mode 100644 plugins/cordova-plugin-file/doc/it/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/ja/README.md create mode 100644 plugins/cordova-plugin-file/doc/ja/index.md create mode 100644 plugins/cordova-plugin-file/doc/ja/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/ko/README.md create mode 100644 plugins/cordova-plugin-file/doc/ko/index.md create mode 100644 plugins/cordova-plugin-file/doc/ko/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/pl/README.md create mode 100644 plugins/cordova-plugin-file/doc/pl/index.md create mode 100644 plugins/cordova-plugin-file/doc/pl/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/ru/index.md create mode 100644 plugins/cordova-plugin-file/doc/ru/plugins.md create mode 100644 plugins/cordova-plugin-file/doc/zh/README.md create mode 100644 plugins/cordova-plugin-file/doc/zh/index.md create mode 100644 plugins/cordova-plugin-file/doc/zh/plugins.md create mode 100644 plugins/cordova-plugin-file/package.json create mode 100644 plugins/cordova-plugin-file/plugin.xml create mode 100644 plugins/cordova-plugin-file/src/android/AssetFilesystem.java create mode 100644 plugins/cordova-plugin-file/src/android/ContentFilesystem.java create mode 100644 plugins/cordova-plugin-file/src/android/DirectoryManager.java create mode 100644 plugins/cordova-plugin-file/src/android/EncodingException.java create mode 100644 plugins/cordova-plugin-file/src/android/FileExistsException.java create mode 100644 plugins/cordova-plugin-file/src/android/FileUtils.java create mode 100644 plugins/cordova-plugin-file/src/android/Filesystem.java create mode 100644 plugins/cordova-plugin-file/src/android/InvalidModificationException.java create mode 100644 plugins/cordova-plugin-file/src/android/LocalFilesystem.java create mode 100644 plugins/cordova-plugin-file/src/android/LocalFilesystemURL.java create mode 100644 plugins/cordova-plugin-file/src/android/NoModificationAllowedException.java create mode 100644 plugins/cordova-plugin-file/src/android/PendingRequests.java create mode 100644 plugins/cordova-plugin-file/src/android/TypeMismatchException.java create mode 100644 plugins/cordova-plugin-file/src/android/build-extras.gradle create mode 100644 plugins/cordova-plugin-file/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-file/src/browser/FileProxy.js create mode 100644 plugins/cordova-plugin-file/src/firefoxos/FileProxy.js create mode 100644 plugins/cordova-plugin-file/src/ios/CDVAssetLibraryFilesystem.h create mode 100644 plugins/cordova-plugin-file/src/ios/CDVAssetLibraryFilesystem.m create mode 100644 plugins/cordova-plugin-file/src/ios/CDVFile.h create mode 100644 plugins/cordova-plugin-file/src/ios/CDVFile.m create mode 100644 plugins/cordova-plugin-file/src/ios/CDVLocalFilesystem.h create mode 100644 plugins/cordova-plugin-file/src/ios/CDVLocalFilesystem.m create mode 100644 plugins/cordova-plugin-file/src/osx/CDVFile.h create mode 100644 plugins/cordova-plugin-file/src/osx/CDVFile.m create mode 100644 plugins/cordova-plugin-file/src/osx/CDVLocalFilesystem.h create mode 100644 plugins/cordova-plugin-file/src/osx/CDVLocalFilesystem.m create mode 100644 plugins/cordova-plugin-file/src/ubuntu/file.cpp create mode 100644 plugins/cordova-plugin-file/src/ubuntu/file.h create mode 100644 plugins/cordova-plugin-file/src/windows/FileProxy.js create mode 100644 plugins/cordova-plugin-file/src/wp/File.cs create mode 100644 plugins/cordova-plugin-file/tests/plugin.xml create mode 100644 plugins/cordova-plugin-file/tests/src/android/TestContentProvider.java create mode 100644 plugins/cordova-plugin-file/tests/tests.js create mode 100644 plugins/cordova-plugin-file/tests/www/fixtures/asset-test/asset-test.txt create mode 100644 plugins/cordova-plugin-file/www/DirectoryEntry.js create mode 100644 plugins/cordova-plugin-file/www/DirectoryReader.js create mode 100644 plugins/cordova-plugin-file/www/Entry.js create mode 100644 plugins/cordova-plugin-file/www/File.js create mode 100644 plugins/cordova-plugin-file/www/FileEntry.js create mode 100644 plugins/cordova-plugin-file/www/FileError.js create mode 100644 plugins/cordova-plugin-file/www/FileReader.js create mode 100644 plugins/cordova-plugin-file/www/FileSystem.js create mode 100644 plugins/cordova-plugin-file/www/FileUploadOptions.js create mode 100644 plugins/cordova-plugin-file/www/FileUploadResult.js create mode 100644 plugins/cordova-plugin-file/www/FileWriter.js create mode 100644 plugins/cordova-plugin-file/www/Flags.js create mode 100644 plugins/cordova-plugin-file/www/LocalFileSystem.js create mode 100644 plugins/cordova-plugin-file/www/Metadata.js create mode 100644 plugins/cordova-plugin-file/www/ProgressEvent.js create mode 100644 plugins/cordova-plugin-file/www/android/FileSystem.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/.jshintrc create mode 100644 plugins/cordova-plugin-file/www/blackberry10/FileProxy.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/FileSystem.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/copyTo.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/createEntryFromNative.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/getDirectory.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/getFile.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/getFileMetadata.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/getMetadata.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/getParent.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/info.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/moveTo.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/readAsArrayBuffer.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/readAsBinaryString.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/readAsDataURL.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/readAsText.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/readEntries.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/remove.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/removeRecursively.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/requestAllFileSystems.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/requestAnimationFrame.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/requestFileSystem.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/resolveLocalFileSystemURI.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/setMetadata.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/truncate.js create mode 100644 plugins/cordova-plugin-file/www/blackberry10/write.js create mode 100644 plugins/cordova-plugin-file/www/browser/FileSystem.js create mode 100644 plugins/cordova-plugin-file/www/browser/Preparing.js create mode 100644 plugins/cordova-plugin-file/www/browser/isChrome.js create mode 100644 plugins/cordova-plugin-file/www/fileSystemPaths.js create mode 100644 plugins/cordova-plugin-file/www/fileSystems-roots.js create mode 100644 plugins/cordova-plugin-file/www/fileSystems.js create mode 100644 plugins/cordova-plugin-file/www/firefoxos/FileSystem.js create mode 100644 plugins/cordova-plugin-file/www/ios/FileSystem.js create mode 100644 plugins/cordova-plugin-file/www/osx/FileSystem.js create mode 100644 plugins/cordova-plugin-file/www/requestFileSystem.js create mode 100644 plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js create mode 100644 plugins/cordova-plugin-file/www/ubuntu/FileSystem.js create mode 100644 plugins/cordova-plugin-file/www/ubuntu/FileWriter.js create mode 100644 plugins/cordova-plugin-file/www/ubuntu/fileSystems-roots.js create mode 100644 plugins/cordova-plugin-file/www/wp/FileUploadOptions.js create mode 100644 plugins/cordova-plugin-geolocation/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-geolocation/LICENSE create mode 100644 plugins/cordova-plugin-geolocation/NOTICE create mode 100644 plugins/cordova-plugin-geolocation/README.md create mode 100644 plugins/cordova-plugin-geolocation/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-geolocation/doc/de/README.md create mode 100644 plugins/cordova-plugin-geolocation/doc/de/index.md create mode 100644 plugins/cordova-plugin-geolocation/doc/es/README.md create mode 100644 plugins/cordova-plugin-geolocation/doc/es/index.md create mode 100644 plugins/cordova-plugin-geolocation/doc/fr/README.md create mode 100644 plugins/cordova-plugin-geolocation/doc/fr/index.md create mode 100644 plugins/cordova-plugin-geolocation/doc/it/README.md create mode 100644 plugins/cordova-plugin-geolocation/doc/it/index.md create mode 100644 plugins/cordova-plugin-geolocation/doc/ja/README.md create mode 100644 plugins/cordova-plugin-geolocation/doc/ja/index.md create mode 100644 plugins/cordova-plugin-geolocation/doc/ko/README.md create mode 100644 plugins/cordova-plugin-geolocation/doc/ko/index.md create mode 100644 plugins/cordova-plugin-geolocation/doc/pl/README.md create mode 100644 plugins/cordova-plugin-geolocation/doc/pl/index.md create mode 100644 plugins/cordova-plugin-geolocation/doc/ru/index.md create mode 100644 plugins/cordova-plugin-geolocation/doc/zh/README.md create mode 100644 plugins/cordova-plugin-geolocation/doc/zh/index.md create mode 100644 plugins/cordova-plugin-geolocation/package.json create mode 100644 plugins/cordova-plugin-geolocation/plugin.xml create mode 100644 plugins/cordova-plugin-geolocation/src/android/Geolocation.java create mode 100644 plugins/cordova-plugin-geolocation/src/firefoxos/GeolocationProxy.js create mode 100644 plugins/cordova-plugin-geolocation/src/ios/CDVLocation.h create mode 100644 plugins/cordova-plugin-geolocation/src/ios/CDVLocation.m create mode 100644 plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.cpp create mode 100644 plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.h create mode 100644 plugins/cordova-plugin-geolocation/src/windows/GeolocationProxy.js create mode 100644 plugins/cordova-plugin-geolocation/src/wp/GeoLocation.cs create mode 100644 plugins/cordova-plugin-geolocation/tests/plugin.xml create mode 100644 plugins/cordova-plugin-geolocation/tests/tests.js create mode 100644 plugins/cordova-plugin-geolocation/www/Coordinates.js create mode 100644 plugins/cordova-plugin-geolocation/www/Position.js create mode 100644 plugins/cordova-plugin-geolocation/www/PositionError.js create mode 100644 plugins/cordova-plugin-geolocation/www/android/geolocation.js create mode 100644 plugins/cordova-plugin-geolocation/www/blackberry10/GeolocationProxy.js create mode 100644 plugins/cordova-plugin-geolocation/www/geolocation.js create mode 100644 plugins/cordova-plugin-media-capture/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-media-capture/LICENSE create mode 100644 plugins/cordova-plugin-media-capture/NOTICE create mode 100644 plugins/cordova-plugin-media-capture/README.md create mode 100644 plugins/cordova-plugin-media-capture/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-media-capture/doc/de/README.md create mode 100644 plugins/cordova-plugin-media-capture/doc/de/index.md create mode 100644 plugins/cordova-plugin-media-capture/doc/es/README.md create mode 100644 plugins/cordova-plugin-media-capture/doc/es/index.md create mode 100644 plugins/cordova-plugin-media-capture/doc/fr/README.md create mode 100644 plugins/cordova-plugin-media-capture/doc/fr/index.md create mode 100644 plugins/cordova-plugin-media-capture/doc/it/README.md create mode 100644 plugins/cordova-plugin-media-capture/doc/it/index.md create mode 100644 plugins/cordova-plugin-media-capture/doc/ja/README.md create mode 100644 plugins/cordova-plugin-media-capture/doc/ja/index.md create mode 100644 plugins/cordova-plugin-media-capture/doc/ko/README.md create mode 100644 plugins/cordova-plugin-media-capture/doc/ko/index.md create mode 100644 plugins/cordova-plugin-media-capture/doc/pl/README.md create mode 100644 plugins/cordova-plugin-media-capture/doc/pl/index.md create mode 100644 plugins/cordova-plugin-media-capture/doc/ru/index.md create mode 100644 plugins/cordova-plugin-media-capture/doc/zh/README.md create mode 100644 plugins/cordova-plugin-media-capture/doc/zh/index.md create mode 100644 plugins/cordova-plugin-media-capture/package.json create mode 100644 plugins/cordova-plugin-media-capture/plugin.xml create mode 100644 plugins/cordova-plugin-media-capture/src/android/Capture.java create mode 100644 plugins/cordova-plugin-media-capture/src/android/FileHelper.java create mode 100644 plugins/cordova-plugin-media-capture/src/android/PendingRequests.java create mode 100644 plugins/cordova-plugin-media-capture/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-media-capture/src/browser/CaptureProxy.js create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/controls_bg.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/controls_bg@2x.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/controls_bg@2x~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/controls_bg~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/de.lproj/Localizable.strings create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/en.lproj/Localizable.strings create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/es.lproj/Localizable.strings create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/microphone-568h@2x~iphone.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/microphone.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/microphone@2x.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/microphone@2x~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/microphone~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/record_button.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/record_button@2x.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/record_button@2x~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/record_button~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/recording_bg.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/recording_bg@2x.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/recording_bg@2x~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/recording_bg~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/se.lproj/Localizable.strings create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/stop_button.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/stop_button@2x.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/stop_button@2x~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.bundle/stop_button~ipad.png create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.h create mode 100644 plugins/cordova-plugin-media-capture/src/ios/CDVCapture.m create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/MediaCaptureWidget.qml create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/back.png create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/capture.cpp create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/capture.h create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/microphone.png create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/record_off.png create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/record_on.png create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/shoot.png create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/toolbar-left.png create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/toolbar-middle.png create mode 100644 plugins/cordova-plugin-media-capture/src/ubuntu/toolbar-right.png create mode 100644 plugins/cordova-plugin-media-capture/src/windows/CaptureProxy.js create mode 100644 plugins/cordova-plugin-media-capture/src/windows/MediaFile.js create mode 100644 plugins/cordova-plugin-media-capture/src/wp/Capture.cs create mode 100644 plugins/cordova-plugin-media-capture/src/wp/UI/AudioCaptureTask.cs create mode 100644 plugins/cordova-plugin-media-capture/src/wp/UI/AudioRecorder.xaml create mode 100644 plugins/cordova-plugin-media-capture/src/wp/UI/AudioRecorder.xaml.cs create mode 100644 plugins/cordova-plugin-media-capture/src/wp/UI/VideoCaptureTask.cs create mode 100644 plugins/cordova-plugin-media-capture/src/wp/UI/VideoRecorder.xaml create mode 100644 plugins/cordova-plugin-media-capture/src/wp/UI/VideoRecorder.xaml.cs create mode 100644 plugins/cordova-plugin-media-capture/tests/plugin.xml create mode 100644 plugins/cordova-plugin-media-capture/tests/tests.js create mode 100644 plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js create mode 100644 plugins/cordova-plugin-media-capture/www/CaptureError.js create mode 100644 plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js create mode 100644 plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js create mode 100644 plugins/cordova-plugin-media-capture/www/ConfigurationData.js create mode 100644 plugins/cordova-plugin-media-capture/www/MediaFile.js create mode 100644 plugins/cordova-plugin-media-capture/www/MediaFileData.js create mode 100644 plugins/cordova-plugin-media-capture/www/android/init.js create mode 100644 plugins/cordova-plugin-media-capture/www/capture.js create mode 100644 plugins/cordova-plugin-media-capture/www/helpers.js create mode 100644 plugins/cordova-plugin-media/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-media/LICENSE create mode 100644 plugins/cordova-plugin-media/NOTICE create mode 100644 plugins/cordova-plugin-media/README.md create mode 100644 plugins/cordova-plugin-media/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-media/doc/de/README.md create mode 100644 plugins/cordova-plugin-media/doc/de/index.md create mode 100644 plugins/cordova-plugin-media/doc/es/README.md create mode 100644 plugins/cordova-plugin-media/doc/es/index.md create mode 100644 plugins/cordova-plugin-media/doc/fr/README.md create mode 100644 plugins/cordova-plugin-media/doc/fr/index.md create mode 100644 plugins/cordova-plugin-media/doc/it/README.md create mode 100644 plugins/cordova-plugin-media/doc/it/index.md create mode 100644 plugins/cordova-plugin-media/doc/ja/README.md create mode 100644 plugins/cordova-plugin-media/doc/ja/index.md create mode 100644 plugins/cordova-plugin-media/doc/ko/README.md create mode 100644 plugins/cordova-plugin-media/doc/ko/index.md create mode 100644 plugins/cordova-plugin-media/doc/pl/README.md create mode 100644 plugins/cordova-plugin-media/doc/pl/index.md create mode 100644 plugins/cordova-plugin-media/doc/ru/index.md create mode 100644 plugins/cordova-plugin-media/doc/zh/README.md create mode 100644 plugins/cordova-plugin-media/doc/zh/index.md create mode 100644 plugins/cordova-plugin-media/package.json create mode 100644 plugins/cordova-plugin-media/plugin.xml create mode 100644 plugins/cordova-plugin-media/src/android/AudioHandler.java create mode 100644 plugins/cordova-plugin-media/src/android/AudioPlayer.java create mode 100644 plugins/cordova-plugin-media/src/android/FileHelper.java create mode 100644 plugins/cordova-plugin-media/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-media/src/ios/CDVSound.h create mode 100644 plugins/cordova-plugin-media/src/ios/CDVSound.m create mode 100644 plugins/cordova-plugin-media/src/tizen/MediaProxy.js create mode 100644 plugins/cordova-plugin-media/src/ubuntu/media.cpp create mode 100644 plugins/cordova-plugin-media/src/ubuntu/media.h create mode 100644 plugins/cordova-plugin-media/src/windows/MediaProxy.js create mode 100644 plugins/cordova-plugin-media/src/wp/AudioPlayer.cs create mode 100644 plugins/cordova-plugin-media/src/wp/Media.cs create mode 100644 plugins/cordova-plugin-media/tests/plugin.xml create mode 100644 plugins/cordova-plugin-media/tests/tests.js create mode 100644 plugins/cordova-plugin-media/www/Media.js create mode 100644 plugins/cordova-plugin-media/www/MediaError.js create mode 100644 plugins/cordova-plugin-media/www/browser/Media.js create mode 100644 plugins/cordova-plugin-network-information/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-network-information/LICENSE create mode 100644 plugins/cordova-plugin-network-information/NOTICE create mode 100644 plugins/cordova-plugin-network-information/README.md create mode 100644 plugins/cordova-plugin-network-information/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-network-information/doc/de/README.md create mode 100644 plugins/cordova-plugin-network-information/doc/de/index.md create mode 100644 plugins/cordova-plugin-network-information/doc/es/README.md create mode 100644 plugins/cordova-plugin-network-information/doc/es/index.md create mode 100644 plugins/cordova-plugin-network-information/doc/fr/README.md create mode 100644 plugins/cordova-plugin-network-information/doc/fr/index.md create mode 100644 plugins/cordova-plugin-network-information/doc/it/README.md create mode 100644 plugins/cordova-plugin-network-information/doc/it/index.md create mode 100644 plugins/cordova-plugin-network-information/doc/ja/README.md create mode 100644 plugins/cordova-plugin-network-information/doc/ja/index.md create mode 100644 plugins/cordova-plugin-network-information/doc/ko/README.md create mode 100644 plugins/cordova-plugin-network-information/doc/ko/index.md create mode 100644 plugins/cordova-plugin-network-information/doc/pl/README.md create mode 100644 plugins/cordova-plugin-network-information/doc/pl/index.md create mode 100644 plugins/cordova-plugin-network-information/doc/ru/index.md create mode 100644 plugins/cordova-plugin-network-information/doc/zh/README.md create mode 100644 plugins/cordova-plugin-network-information/doc/zh/index.md create mode 100644 plugins/cordova-plugin-network-information/package.json create mode 100644 plugins/cordova-plugin-network-information/plugin.xml create mode 100755 plugins/cordova-plugin-network-information/src/android/NetworkManager.java create mode 100644 plugins/cordova-plugin-network-information/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-network-information/src/browser/network.js create mode 100644 plugins/cordova-plugin-network-information/src/firefoxos/NetworkProxy.js create mode 100644 plugins/cordova-plugin-network-information/src/ios/CDVConnection.h create mode 100644 plugins/cordova-plugin-network-information/src/ios/CDVConnection.m create mode 100644 plugins/cordova-plugin-network-information/src/ios/CDVReachability.h create mode 100644 plugins/cordova-plugin-network-information/src/ios/CDVReachability.m create mode 100644 plugins/cordova-plugin-network-information/src/tizen/NetworkProxy.js create mode 100644 plugins/cordova-plugin-network-information/src/ubuntu/network_information.cpp create mode 100644 plugins/cordova-plugin-network-information/src/ubuntu/network_information.h create mode 100644 plugins/cordova-plugin-network-information/src/windows/NetworkInfoProxy.js create mode 100644 plugins/cordova-plugin-network-information/src/wp/NetworkStatus.cs create mode 100644 plugins/cordova-plugin-network-information/tests/plugin.xml create mode 100644 plugins/cordova-plugin-network-information/tests/tests.js create mode 100644 plugins/cordova-plugin-network-information/www/Connection.js create mode 100644 plugins/cordova-plugin-network-information/www/network.js create mode 100644 plugins/cordova-plugin-vibration/CONTRIBUTING.md create mode 100644 plugins/cordova-plugin-vibration/LICENSE create mode 100644 plugins/cordova-plugin-vibration/NOTICE create mode 100644 plugins/cordova-plugin-vibration/README.md create mode 100644 plugins/cordova-plugin-vibration/RELEASENOTES.md create mode 100644 plugins/cordova-plugin-vibration/doc/de/README.md create mode 100644 plugins/cordova-plugin-vibration/doc/de/index.md create mode 100644 plugins/cordova-plugin-vibration/doc/es/README.md create mode 100644 plugins/cordova-plugin-vibration/doc/es/index.md create mode 100644 plugins/cordova-plugin-vibration/doc/fr/README.md create mode 100644 plugins/cordova-plugin-vibration/doc/fr/index.md create mode 100644 plugins/cordova-plugin-vibration/doc/it/README.md create mode 100644 plugins/cordova-plugin-vibration/doc/it/index.md create mode 100644 plugins/cordova-plugin-vibration/doc/ja/README.md create mode 100644 plugins/cordova-plugin-vibration/doc/ja/index.md create mode 100644 plugins/cordova-plugin-vibration/doc/ko/README.md create mode 100644 plugins/cordova-plugin-vibration/doc/ko/index.md create mode 100644 plugins/cordova-plugin-vibration/doc/pl/README.md create mode 100644 plugins/cordova-plugin-vibration/doc/pl/index.md create mode 100644 plugins/cordova-plugin-vibration/doc/ru/index.md create mode 100644 plugins/cordova-plugin-vibration/doc/zh/README.md create mode 100644 plugins/cordova-plugin-vibration/doc/zh/index.md create mode 100644 plugins/cordova-plugin-vibration/package.json create mode 100644 plugins/cordova-plugin-vibration/plugin.xml create mode 100644 plugins/cordova-plugin-vibration/src/android/Vibration.java create mode 100644 plugins/cordova-plugin-vibration/src/blackberry10/index.js create mode 100644 plugins/cordova-plugin-vibration/src/blackberry10/native/.cproject create mode 100644 plugins/cordova-plugin-vibration/src/blackberry10/native/.project create mode 100644 plugins/cordova-plugin-vibration/src/blackberry10/native/device/libVibration.so rename plugins/{phonegap-plugin-barcodescanner => cordova-plugin-vibration}/src/blackberry10/native/public/plugin.cpp (90%) mode change 100755 => 100644 rename plugins/{phonegap-plugin-barcodescanner => cordova-plugin-vibration}/src/blackberry10/native/public/plugin.h (75%) mode change 100755 => 100644 rename plugins/{phonegap-plugin-barcodescanner => cordova-plugin-vibration}/src/blackberry10/native/public/tokenizer.cpp (100%) mode change 100755 => 100644 rename plugins/{phonegap-plugin-barcodescanner => cordova-plugin-vibration}/src/blackberry10/native/public/tokenizer.h (100%) mode change 100755 => 100644 create mode 100644 plugins/cordova-plugin-vibration/src/blackberry10/native/simulator/libVibration.so create mode 100644 plugins/cordova-plugin-vibration/src/blackberry10/native/src/vibration_js.cpp create mode 100644 plugins/cordova-plugin-vibration/src/blackberry10/native/src/vibration_js.hpp create mode 100644 plugins/cordova-plugin-vibration/src/browser/Vibration.js create mode 100644 plugins/cordova-plugin-vibration/src/firefoxos/VibrationProxy.js create mode 100644 plugins/cordova-plugin-vibration/src/ios/CDVVibration.h create mode 100644 plugins/cordova-plugin-vibration/src/ios/CDVVibration.m create mode 100644 plugins/cordova-plugin-vibration/src/tizen/VibrationProxy.js create mode 100644 plugins/cordova-plugin-vibration/src/ubuntu/vibration.cpp create mode 100644 plugins/cordova-plugin-vibration/src/ubuntu/vibration.h create mode 100644 plugins/cordova-plugin-vibration/src/windows/Vibration/.gitignore create mode 100644 plugins/cordova-plugin-vibration/src/windows/Vibration/Properties/AssemblyInfo.cs create mode 100644 plugins/cordova-plugin-vibration/src/windows/Vibration/Vibration.cs create mode 100644 plugins/cordova-plugin-vibration/src/windows/Vibration/Vibration.csproj create mode 100644 plugins/cordova-plugin-vibration/src/windows/VibrationProxy.js create mode 100644 plugins/cordova-plugin-vibration/src/wp/Vibration.cs create mode 100644 plugins/cordova-plugin-vibration/tests/plugin.xml create mode 100644 plugins/cordova-plugin-vibration/tests/tests.js create mode 100644 plugins/cordova-plugin-vibration/www/blackberry10/vibrate.js create mode 100644 plugins/cordova-plugin-vibration/www/vibration.js delete mode 100644 plugins/phonegap-plugin-barcodescanner/README.md delete mode 100644 plugins/phonegap-plugin-barcodescanner/package.json delete mode 100644 plugins/phonegap-plugin-barcodescanner/plugin.xml delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/android/README.md delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/android/barcodescanner-release-2.0.1.aar delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/android/barcodescanner.gradle delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/android/com/phonegap/plugins/barcodescanner/BarcodeScanner.java delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/LICENSE delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/blackberry10/index.js delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/.cproject delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/.settings/com.qnx.tools.ide.core.prefs delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/device/.npmignore delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/device/libBarcodeScanner.so delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json/autolink.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json/config.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json/features.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json/forwards.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json/json.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json/reader.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json/value.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json/writer.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json_batchallocator.h delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json_internalarray.inl delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json_internalmap.inl delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json_reader.cpp delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json_value.cpp delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json_valueiterator.inl delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/public/json_writer.cpp delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/simulator/.npmignore delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/simulator/libBarcodeScanner.so delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/src/Logger.cpp delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/src/Logger.hpp delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/src/barcodescanner_js.cpp delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/src/barcodescanner_js.hpp delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/src/barcodescanner_ndk.cpp delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/blackberry10/native/src/barcodescanner_ndk.hpp delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/blackberry10/qrcode.js delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/browser/BarcodeScannerProxy.js delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/ios/CDVBarcodeScanner.bundle/beep.caf delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/ios/CDVBarcodeScanner.mm delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/ios/scannerOverlay.xib delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/ios/zxing-all-in-one.cpp delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/ios/zxing-all-in-one.h delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/windows/BarcodeScannerProxy.js delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/windows/assets/plugin-barcodeScanner.css delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/windows/lib.UW/ANY/ZXing.winmd delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/windows/lib.UW/ARM/ZXing.winmd delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/windows/lib.UW/x64/ZXing.winmd delete mode 100644 plugins/phonegap-plugin-barcodescanner/src/windows/lib.UW/x86/ZXing.winmd delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/windows/lib/Reader.cs delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/windows/lib/WinRTBarcodeReader.csproj delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/windows/lib/ZXing.winmd delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/wp8/BarcodeScanner.cs delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/wp8/BarcodeScannerTask.cs delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/wp8/BarcodeScannerUI.xaml delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/wp8/BarcodeScannerUI.xaml.cs delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/wp8/assets/cancel.png delete mode 100755 plugins/phonegap-plugin-barcodescanner/src/wp8/lib/zxing.wp8.0.dll delete mode 100755 plugins/phonegap-plugin-barcodescanner/tests/tests.js delete mode 100644 plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js create mode 100644 plugins/ubuntu.json create mode 100644 www/img/logo.png create mode 100644 www/img/logo.svg create mode 100644 www/screens/item.html diff --git a/config.xml b/config.xml index e8bc3af..808760b 100644 --- a/config.xml +++ b/config.xml @@ -1,11 +1,11 @@ - Snipe IT Mobile + E-Recycle Tracker - A sample Apache Cordova application that responds to the deviceready event. + Helena Industries Big Sky E-Recycling asset/inventory tracking app, integrated with custom SnipeIT database API - - Apache Cordova Team + + Netsyms Technologies diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties b/platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties new file mode 100644 index 0000000..2ce41db --- /dev/null +++ b/platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Mon May 16 15:53:03 MDT 2016 diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties.lock b/platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties.lock new file mode 100644 index 0000000000000000000000000000000000000000..9561698671faa8bc1e8aca450bbafe3ca03c66b1 GIT binary patch literal 17 VcmZP;oV%CDnrFQ>0~j!~0{|f>0;T`} literal 0 HcmV?d00001 diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/fileHashes.bin b/platforms/android/.gradle/2.2.1/taskArtifacts/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..357a3177f5433c406320fe49468a18b7d6dcd477 GIT binary patch literal 73940 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ÿrpjKXb^AjhHFu-|!) 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 literal 0 HcmV?d00001 diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/fileSnapshots.bin b/platforms/android/.gradle/2.2.1/taskArtifacts/fileSnapshots.bin new file mode 100644 index 0000000000000000000000000000000000000000..3785a4325be25e821229f578f3a2d53fe98ffa05 GIT binary patch literal 178362 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 Rk^DI_%g+~Cwczdb{{m1)O*#Mo literal 0 HcmV?d00001 diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/taskArtifacts.bin b/platforms/android/.gradle/2.2.1/taskArtifacts/taskArtifacts.bin new file mode 100644 index 0000000000000000000000000000000000000000..3dc0ff5e73de194a60de408bf857df59cddf5dca GIT binary patch literal 38793 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 - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/platforms/android/CordovaLib/build/generated/source/buildConfig/debug/org/apache/cordova/BuildConfig.java b/platforms/android/CordovaLib/build/generated/source/buildConfig/debug/org/apache/cordova/BuildConfig.java new file mode 100644 index 0000000..f2feb90 --- /dev/null +++ b/platforms/android/CordovaLib/build/generated/source/buildConfig/debug/org/apache/cordova/BuildConfig.java @@ -0,0 +1,13 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package org.apache.cordova; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "org.apache.cordova"; + public static final String BUILD_TYPE = "debug"; + public static final String FLAVOR = ""; + public static final int VERSION_CODE = 1; + public static final String VERSION_NAME = "1.0"; +} diff --git a/platforms/android/CordovaLib/build/intermediates/bundles/debug/AndroidManifest.xml b/platforms/android/CordovaLib/build/intermediates/bundles/debug/AndroidManifest.xml new file mode 100644 index 0000000..90863ed --- /dev/null +++ b/platforms/android/CordovaLib/build/intermediates/bundles/debug/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/platforms/android/CordovaLib/build/intermediates/bundles/debug/aapt/AndroidManifest.xml b/platforms/android/CordovaLib/build/intermediates/bundles/debug/aapt/AndroidManifest.xml new file mode 100644 index 0000000..90863ed --- /dev/null +++ b/platforms/android/CordovaLib/build/intermediates/bundles/debug/aapt/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/platforms/android/CordovaLib/build/intermediates/bundles/debug/classes.jar b/platforms/android/CordovaLib/build/intermediates/bundles/debug/classes.jar new file mode 100644 index 0000000000000000000000000000000000000000..67998b682bbe79be2835db902540c7b5cb9debd0 GIT binary patch literal 124211 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 W{Qd(4r3U=t0zQDQbpweG)c*nWdpNHE literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/AuthenticationToken.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/AuthenticationToken.class new file mode 100644 index 0000000000000000000000000000000000000000..e9d514658d246628f7dc86e678b6e2389119a888 GIT binary patch literal 776 zcma)(TT22_5Xb+=+j`luOwDc&^$=>8g`lUxil8U4K=b{$9rT#)%3kVg6%;`aeSkhx zG-nen+aMO^oSB`O|8M5Jf4sf{IKW04ag$LUcb^ijj$Mm_0_gDD-d8S)G|nTl3lz#fA%oopfqmM}+m{VM_U$dX55SS0(i z_z97Rnc}U`;vAO7#kGKqq^dj5h)ku^6bE*Rb1&#n4E)4cUZJUZ6m>onBsvRn7z$Dd W2Z_#toDj(AA0TR>3Zxi}zWfQRn}!7d literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/BuildConfig.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/BuildConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..4c5619f629da9b6eaca3877bbdc2e3455f4e480b GIT binary patch literal 711 zcmaJ;+iufP5S-1$c8q%q6bP5n(gH~VoAOG9lv|M{lSEBwiM~`P&LMSW?8>qEFT?|g z2R?w0Laft}T0-LGcxTVf?0C+v-#>l=cnwpBf^7{uIv!)Uf-?40JW=tKQ0{bFC+`S! zN?2_U29Disj_iK#%LWOO)&Pn(vvl~^pm%QV!h!KO6_PO z32TlY%3k_uEaQyIy_ zm#}T-m{-osg)@$SBFE{JI1v;N%vXesYho*k0x3d{>QclrxrCebf1jmsiUWRDg|k&q z%S>`rLj^i3-{86cgYilZuQFcC;dRCvs4nMkGQO3&-((HSBH{BcD_ZgObCNu#CL1sqY{#6TB%e;Mlcmc3?GQcbQCx6p?J=;;3j5eeAJ9vxGgw$ zqQv-E+*Cp41Stqo6hsqpcV)~=kn`iiccuo0CB*WJ>U}j+Qp@w1N!!%R^Su&Uvqssn z)v`UUma3YBXhAKN=G4NyT#>rV+T66RElW6>H_Z8rT2TuNTBcx_MT1CL_q^c>5iD|7 zFYDHVMpfyigto#0ZPCuuf~l!Ri`<-qrt=iCFG@I**zQmRX1b;>A7F&bH9e%A6 z%g-KT)5ut0Ev;&ypjphrKG)u&Wt1~lC&$Oe=N7es?bwi)D51_Xk-HuEtuo~M6is-y zcMIr%X{rw$%#O`S?gt6s#O$C@49pI)o{5~eGuxzL%`^>@g_ty|WT%j!QV=*RPvv?KHpB$!@M0#MS{Btm>trMqkncwyiBy zY^@l#jku^`T;)+Pcv+j6_+7({=PsR#E6}k>^r&0m__AsV<~?*PD4|=%l7cb}1r=mu ze4^kz(8OCl9@jR33`@a%EQ_EY2%Xd7_E3;d1^G;nM}j<7@HsfN?Hl2^HI}ezgT zL+|b4l4v9Fh^AH6sxINMPkJ^lAPGIMpCli1Y`Nn;;I+9w#$mUsoSmk%i;^psH8WdM zElVRmFg_yTwbnftCa%9>+0D~aGpiRGhuA2(xA(=E^);?9va`MlHYS_h(pcVl-BC|B zEbnZCRKw!V*0?+|F+RaH(8M2HAdCZe6NkXL;wu1|f7}z!ovVUpNNfw|&4s~p2W2~v zAnoF7hVnt4ZOK(g$<%WMlIiCNK64b3q%i`3yCy{CW-9KWYKok=tA;dA@I?T}tmNE; z;Q$SsM8-2CPVp_A{0X7&c?m#(H#y9d1E{zH9-xGG)|Cf6U&k;($e2U0e`sIn=sTNEL z-CwXXh-Z$O(-@(t9$azG5sW#f8}(l z-St8dw;pOq5XtF8_#gDhI5Q&S?0;kgdCE9P4g$PN!!mmRrU{9_7rYEy5jmx7d-4Th zGe2TiY84$T*uBv+QRn*=_C&76h4yt9+Ua5+(FAJ$D^U0Npk62HL|s%d2m*EB6{vfC zP;U}-wl1pMfaj5Y1?oN@)B;h9bx|*QzFw|}dTm>6lqJCW$RU|XO=@Tm=hbqq~Ik&hJ?f(7$0~x)O|Wm(o9b62xL~%iW0a~)`@yhKiE}fTkghODV5Vm#yiqzXEzr!c3;;7uDza$3>ilt zFg#h7NyVhPLQ#j|a%A;0ZBG^)YgW=q6M>=5KFoB>%IL@Y^03L=S5=lv#y&Q&z~JOm zr}8+bHDglaor<(J<9bymYY7XeD7+aLc63d%QOik^TIq^Q6+>-BYQ-!BxQaIgMmq|8WnKbY!BBv8 z+zT*`4|Dh`zy`j~;hO+u+|S`bfQQ)R@a<9Od>Dq!mj57YHD$x2qoYtK6?HtbZx7-C z-(pN4uUw1jhV~ioxR@b2~o? zoNAV=Z8RG3J~f;~~2G$`M#LMxOYC zg762VI3byu(;2#~HF(?)NGGPWlbtKYrGy>i_@% literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ConfigXmlParser.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ConfigXmlParser.class new file mode 100644 index 0000000000000000000000000000000000000000..62fa0b3dc1856015bdd6538ae7525d75a85ff763 GIT binary patch literal 4919 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 Va|JiaTJ#s*##LI`gtExe^Bb5V?VSJs literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$2.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$2.class new file mode 100644 index 0000000000000000000000000000000000000000..fff3f96b98fbd01cd17a81749724f3025707852c GIT binary patch literal 1019 zcma)5ZEq4m5Pp_BxB{mjMXm3BIq{$`*YLH*L`jWJs5Px((!>wTv4L%_d$=4l{w$Lc zqaXYM{wU)tkdR2U-Q;Fw=bn3J_LzYhDgFbnmnEe5+0cjyd-rc~nX@VqVbd)|&H zQ)Kq;Xc5g!Z$Z7bI(@73vemL4jyzA2nLiHABAucawg{!6YM z(<^ngufixEkT!=R>BSufzKbeqE^Z?4B4>-)~8A!LackIX{ZF z0g;w#|L$l8V#p7A@dfSP@h*v6@fRzfo=$VaL`K0O@9$MxSf&4d2@F|S#i9`zAWu3^ zJSk5XB}GpGMMB-8=nd^{^5xp*7_7E6Myj?whE@9p`|AWtmUHo-n)9Z)VIE?h!)@_wj(d QP51Z_Zc~&altZ4@AMPjn(EtDd literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$3.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaActivity$3.class new file mode 100644 index 0000000000000000000000000000000000000000..2e0296f8e5fce084f9083bbe917577a8c40ef82b GIT binary patch literal 1522 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 W)&5pfHIc?Va#SB~uM5%DT>KYk^;l;B literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaBridge.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaBridge.class new file mode 100644 index 0000000000000000000000000000000000000000..17f3eef1d0653cb539da50ad5d0b18bcb00efc61 GIT binary patch literal 5456 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 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaClientCertRequest.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaClientCertRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..46007d42e33e0dfb33d917b1f2948a2664c88eda GIT binary patch literal 1426 zcmb7DT~8B16g^W43(F#ifQq09qWywJ5R9qu!6rmPqeciZG0{w?V;QWwb=YF~Pd;d( znE2oi@JAW%?QQ^@C1{%7?d_a%=FT~@zkdJt31AubT?`^W02c)pMU=QKa9QNyb6MhY zm&>w)6$kemtO__*e`xFdNMN=qgSrh(-T$a-?@Z)ZnnnjvMce2_j42EBJv4!d9tq6n z&WGoB1hSQ|t_6mxCeTmY?`zs_%UYBE8Lfs&Hg}{o+$Vo#qg}Hvuuu(c!jIXHud55VN26) zs%=el=pQe$Ri+VymQL!lY^b!Z3p~!n z`<%uf$Vk&HD-nz2}xk`Y(aruwJS|PS^bkXDQ|^s ztMt0ze5TLxdyx(GFpSF{hH$~bnuiH)uHdSNNnGPe?CJQ6CU58+(aejJH}l>31Pf zA$Z^e_$b7zov05*sx5hTXLjc7%$%|R{QdPCz&`dZEMZfNr&SnuR)dA6i7gY)O|%%Q zGafaSNTyM0qQhXk&-M)VD2|01Mm$MG!q9i6nmGK7dx3B~seC!(&M;qJhdh##wLUjibSVto!Z+wlxcoXUhR{uv!@08Ct)q4|oc%P293^1GbGidNv$r;)-&<$I#FhI1!I0&e8Z(cr;FAb*`zqd6f6a4HIgMP?X^n zORs1ai_zUK7{Fj9fjoZ|36(M&wA{-Qj#EWF8WiSxKJ=Qza!X5VBGW}aE3J=Lp|#Wc zHQm7meYXZ^lu&9kG&=yTL=}D8C3@><(CKa34M{I+OQ(AQ*4ep0sq+KnZ<*sVNeu(+ z;tt7`dGKA_BTd6-NE#(NxjzRyBsdLdcfO-kVLwqR;}Wf!Avma^pCNAKzE~jIc!1UH oMjLB*m?ig!&`NlWC$v_uPQ}$|w?>f`X;nl2r1HnaHrj^u4>k)z(*OVf literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$2.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$2.class new file mode 100644 index 0000000000000000000000000000000000000000..c7f3d4afc7d00e12b5e339c6d0b5a3d1ea41886d GIT binary patch literal 1201 zcma)6ZEw>s5Psa0WbFbi0}2DiHVCXQqp6DEOA!+4hL{wX#Lzw|3(0qCMr!X<1Pu~mkR?NyX;-@yY1o`XjW zA1L7Y-4geIVis&?Ku77e?T z(}AIsj?|ZziO?Ctemyu(;waNprCx59=dEt2v+72chALacQ>%Zt2yKium(&MabXsjN zI4D%Bh97`NB8yIRfxZf=w0f2P`ZTwUrrA0JYwn(*(EJYT>(p?Kq=5mR;2O!=-1$0g z(9FOXNJeiBH|KzR1ZTEzo8M5d*bfvfoTHVeYfrI?Xa69&SRlH%g>^!*aGNj+xP!Yi b7O{bQ~1}q){?Z zHn3n|i6PzLZb1qE*bNL=49VA_%wX0%PpGQPeP8$tD-Eey7C+*4TUfSKP1)gAwL3p^ zxGP)!3*jCKRpRMKe@ab6(2!0Iwq zCq=#Ewy4wx79B^NSmajgkX@y;M~pN>dKu;hMwh`b7>DAtTN$fU2127SObk3P!ZVES z1l&H{;zzwg(>wB5+2XmQshIp%f0qwA)Snm!DxKKvz|6t;B}8jerA3q=M0 zp)W_xpnossBRVjo{I)#VbcLc0)QXMY>F)%Jc&kJ{OuZYWk8QlD$5cxO{d~rYdw)Y~ zqnZCOgIRhP3@{8Mmd)yp0W?$l=|{yp*Z4ai8ES{L!;(G zn+k^Tl#fgc5Ph4ZF-Z&w1qv-6Z6T%kC~>KJ3*usmh?F)JMLi%c8+)5gaxb{@w|*8UQ|#*-NJ^2mlhff zctnxHo_l<`}JFOAGmSsmx8HIEqzuJQ##wJ$?)FgY6v{fQ3) zvMlzM$Ae?8rO{``f+>Zeo%yC+D#cQv8%Xaf!$zaeLtiWDQ|rQ5gt3$MtVfDI;hyOB zOj1QZ=_JGYjs6S^7h~y-8CZ{4JW>3z-I;VWfsouTN3sfY-(Y}bs%D2$A zv4vMQZsU%PTd-|Z(Xrvc5SNwnU51*uzzKLbat6aw;n6s~W^it(yFN&J)Rz&pMQFwM z#%cA2{$P#1+#+b0kgL@UKLD*n7Jc10daJ0>>0R2nr00#L)xHF4ZCxVQ`honn#Bq_N zfdTe$kL1!U_&y$xW?&2?4HKO_oBfgc5Ph4ZF-Z&w1qv-6Z6T%kD0QjSQxKO>L?qKn1ad%JHqJKQ;(DvKlm0Fw zDg+0906z*bYbWZVNU|PiO-3@pYiHKp(ReJ33bME=V@su8^DR;W*`bP3VjiYxW zI2XE}0(1x}_GMJxV`yfLH9@arDC5@*UmBUCvO3OFYYrF+T{RL6Rab`MXmU0b`Xe6( zWLb8V$Abaa(&#f|!IZ+#&V17Wm13!|8%Xaf!&bxP;YcevqSl462xBMhS&tNb!adRH znWT!Nq>~Jr3;h|EE_~_v46H{i_SHmt;;l3ltp1Od-BUj0RPSNv1uBx^_`QgIHL}pQ zv4a;jZsL}W8?bFuv1`MDAucQD2MjfHffMj>>>LkIg-7G`lEGO}cl|i+kt-u=i_nze zHOp?+Eas!ToiTu+68Y+)tHKkh&lnCH?o|=}SW}lenHisry`eGRFtRjO@jRoI#^>wM z#%X;)f3QJcZV@z0$kl3wAAnXOi@xq0y;aoc^fv9fr00#L)xHF4?OY<)`honn#BrIV zfdTrsLvm#nd>8jfGcX2{hKWw@&j61I&H&o2@5trZPZaXFLMtZ-pHRUdLEK1vF-NrV s0ISK3HrDVkN$wG$(JYq!0pYnsBme*a literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$6.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$6.class new file mode 100644 index 0000000000000000000000000000000000000000..05530d9ef51e2110602d114251ca8fd0cf9a4cf4 GIT binary patch literal 1203 zcma)6-*3|}5dPehW^Ds40}2DiHYhA@M^o{zmm*%WAtnVTF*FI-i<@|Drp%t4wESI2 zOb8zM1Nfs5=l;-;hO{KgIX>TgzPs=2-+zAo0`LO8GOl6Gi1i9e*r=k6$2OkWXxezj zP?_+gsYNHYMd!P%2iXg}d;DpH1Cp!Cq=XFMDUFH|~G6Ylx5aVO@98m4bV zawc?h2GA#{Y!s)>9z!dyuW@=A%Q$<*aOCFp%4@g?t#!yy^i?DnYC$Z;yYcBj=ns65 zkY+hhAx{puj?H|oESgjpI=Oe+rc{=c^tlX0!q9XBE+ehth-xP@Av14Qv^|>WV;+jW z391xLE6K2Nr8zNopvF2BuVWMS%Kxb7p705$9Cu}ys5F+tw;~&<$VSUS8yyGNal^q9 z90xUQIe3mPk(HO{ZHBtpz)QFsdi#SD5mF0z)GAk`+T5SlC5Tfhh0p|aS=G%O$D(03 zb2>0o(~kH literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$7.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$7.class new file mode 100644 index 0000000000000000000000000000000000000000..5cd2cb8cc692e181f10cad3bcfe50819a249b907 GIT binary patch literal 1354 zcma)6-A)rh6#k}Ly0k2|)&hbkpjF!Pvxq;vDDkFZY%G$9;er^G>F&@jEIYWnl<+n_ z05>KQqZdAa4`n>F{V}M--DGFZnK|b>=X`T!e*FCQ9l$!OX{2yp4G%KVv8baoh78I& zDms>QtT1G{+%5VdIB`QACPV5?Br_Nd&l7&#$m{g@OEX9sgrBX(u_ez{GY?PYZvwi8s7`Ylz~tv3{ykT%kT{2 zJ0Z6YxA<|t(9DiJ@h$PfQB+L->wH%ac$X7#o1W#$!13B!BJ4<8$C`nMST}GDSp#W| z8_3}i!^EKWOQ8)s#uMs{xJ^}M$f>}l%e}U_-8v8!_3KlHl>z(}oD{d!AvB$Uco#ku z{D;08H-o{wSd8hwFcx&=Xfb5VxLQe#>9!098BLb< z{)SdYbN}H6^Yk+4U>HRrms4j3&`bwNuSbIZ9In%Do}@bI8qL|t(gj#$`2vZ`7iga% z!y7cF$Pjps0*#ZAa~2aMsV^HrGP0P$%|74SxOU literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$8.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$8.class new file mode 100644 index 0000000000000000000000000000000000000000..e57fded7469b1ad6db3356f1670c8f674e76f26c GIT binary patch literal 1506 zcma)6YflqF6g|@|U0PPCh}7Z((IRbmEWT0jSur%JV1!`ew`F&12bY~@cMEK`%@ zjDGM3_@j(>b}1NvxJ^29XZGGZ=bn3Je*OOO6Tl5T&7v1&HB{74%^{1)9Hua>teHOa z!_+aW$LFSS~j1rD^M9HqL^Xqzy1t8 zJ1t?i7+9U5w-ZnS)M|x))1scame({_Ltl7J)&5o4@ooNGs0xe6^>ao=5g&`5?aF|n zUhuFb9UXTJ+{K)ML7Xwr2gATAoHj6odphnLn8$*F2Y6`U5gwBUlFDa}A%6&TWn+`u zq|7G_W>>@~FjZQKS#5}bh~z$DKC&~D6h-$IOe72-CWDsTdFjioHgWyBe3a~Cb`mE4 zTb^23>7mf&;-3pm+M@d%_q$lG9Ec?(1w^-ANtfE*8_HM$3`690$oGLTvP~IwNf<7_ zIqITdjCNt1&=OpxmnsV)2UKRi}25 zs!s1htA0cJOXOXkF+<+K2b`mEct1lCBeYVvR9=!l&f~&<)+V$lYoYoTsXg@UA+t=T zmY)6&UBhAGesTmp64XzW_;YkXH4a7hfC4V!QUsuYQ7SPN6*h(|6szGX#ivlhIL&EX a!vykVjnJ2VS`B2>;~oEU^s3*=Wd8tx5tQQq literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$9.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$9.class new file mode 100644 index 0000000000000000000000000000000000000000..628d4627f22de43e9dbb9486fd231494d54198d2 GIT binary patch literal 1240 zcma)6+iuf95IviuHc1Q#1qv;fwvf_XN?iI@1@RIY_wMi9O-0M}qpu zUD4_3pbRf%l3{(WJ;TC@AGkgP>roXCfU|Fc3ZNY{vT-KWJGF0^ecF3cFz283)F16ER276B4wfzZ4P7o6< zLQ#b0H0`WW%vyIdqXY34`|{+qlE=e@;a%N1%i$nVL{jGhO-Atln=N10)h!NWG7E93 z{{B3)Hd>uS7}n@28=&q&u3FUv18An|(RI(!UqO|2uhObZa$akity8e()+ut$AIN`8 z4Hs$DFu-SAqj72Kd>uDP(l8p5x{G#hP677_P6Jxa@5trZPZaVvLo1~SUr@%^6me~0 wiy5MYTUbs{w6KEPX>fN4Er+|fM{@zIlw6rsE96-usbuJPYx0@cM8hcl1LiGDEdT%j literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$Result.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper$Result.class new file mode 100644 index 0000000000000000000000000000000000000000..c4dd999765e42e72699a8e022739d08743f6f015 GIT binary patch literal 277 zcma)1Jr4mv6rAVd&K(k!L@z;O6Rna6i9|x8(5>^bPByo)d;Bm%F#(-)#f=o_nqJj!IxB6%ytFGu_HHTaO)EX&xAv~-Rgq4BM<*d93X h1v`Ic2LwXF4+W@1D5B(90p-^X5POWhf)FAKq6aYEOa1@= literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaDialogsHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..fd8737660e496d33e795ba2ebf674b1ad01e1e54 GIT binary patch literal 3796 zcmbVPYgZFj6x~At1H%A<4;mk(Xw(phQGAQqDr!M_SU?b8?T`$~KuF?b0zPW()4sIT z+Q;wcS~aXyy86)%{nS5XSNENngn+O*X|mRwxp(e4ckgrdy?5rXe}4ZHKsSC-(22`+ z2;)5&qY8W&6PGKs7#DUzT&~Kv=9BzTWZY0tkDH?NmW=lmG&+qBWM~SSoyL@S91|hq zwa{fuD`>?{5dbn03bs1Kk}?bhJ8)CRjDj{{XBD)I`P-2aG3I2X73@YvMpnUI;WmQX zGE5mc8J2{a5j~er@kZ@Wr**S8rR8#ZPJ$fEq%Hjp9|Q)pbll7s@u=OEwxYexqaF#( z9B%dTc}kC;GqhADQ9fSFW}|0Px@kF&IKJkjkv6Q;61IodjoL9T!QY#S>k^sNZvo|b`3OiPVxrXkvHr{78%gxoQZF%wZOtHqK!v6}JByhg0Hbr9tG^i)+A!xND57=Q%*8`W#lEa6-B&G!o=`HD(103)V45G z+`)p1ySOLgzJv|M03$&HqefWK;!TG~;RO$fX+Bi(03TDYUcI_ie1gv_a5$*q3w)*G zYkZ^P0Ja453BgLB1%Up2!2#TYcct&1DQBwFXPAU5q5cy0;-TeiBKZmw9-a+Aq!!3EM*J>Vn(3DAJIg z(3XqD-G_Z*w->%;XYES0iW8LM#tofw99hOc&yJ|*^@K5Bfdq@nUA3wFFKyPu>{813 zSwgfJ*rWC&?DycYLMjp>|Lsy%-?9U69Z-B@4D&q}s6vZ4HSIf|9kkVu#OcWEVYV)C zL=~+PUW63xe1WQ8?XgFAZR9H_uoHglLLGuQ%GMTVG>+joTlBM|ON@2`J#NfDP(vSJ zYze-}@NcMEgnuZ~SwQtfq@|_+c_QL3pq33~3H6iVu0^N?G)zR6&}g@s3fLf8&33D$ zfQ=L3NCBH(VDmD%J;VgQ1gi*BcGIyM%KX#d#Zb*uhgmJ%*DUBMFQ+ zjkn23MIYY5Su&Q;TVnFJ%Ot)QlP#;5wAyIju$i<3max@sZ!2KC;IhMRz3DP*vs-Vi z%`D8Uf_PN)li5WwyF_LKWHv&qS22iNxQ-dbFk8khUSbz7v5S}3T`jRY$DBB|f5p#_ z8qSm~V|T(I@Y|JILc3eLohPchUZO5g-BrM@fIm=OKyV`9_lXh){Gx`tC&Pj2$RhR# z?(8D@y^~>fgar9;fYmP6&Ih5aef($w7SO=AvQ2y`YsWo)*4$?WA5fbgQA-cW@)3DH zMgmW4mZu%8C6>t&%Oq8N%GPDl=IdkJ>o#9MBfrakA64Ja8S5dvLZ^(2GE*usrGsuN zF477)G*PabUvf3j6wo2m<{);~!c%7K8P~;g8iz}skpbBN literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaHttpAuthHandler.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaHttpAuthHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..c912f928ac45d1b2a2632ac6138003c40a993030 GIT binary patch literal 821 zcma))QBT`26ot=COH)iXpo|U11}!{L+KC7r_QHgOkPt`_dtl<-O{~@slFCitcOfy5 z_P`I|MP~J}?MVJnBqK=0b z9c6yWPRuj4APr@FDvh>!G+EAidO&Cgsp=CvS}}(YgpD_Ejxh5K^RsiN!i>-wV?P?tL0JCx|3rf?MFo6l z{MIZhUzie)1*W+5SRKIO2N110P^wZIC>sI#-d8u(aLV;VE8*q5gg zr|}7lGQV?A{H@x$fpd$}bE3%I>&(;4)4ZZ?lt%UdM;QUHZC4jIqy6m`<-b$5m}xst XsTY+mnC6+&5(s?Ci3tm=94tNos=@}O+L5@=bn3R-riqc0qkL;gjxyfgmq(?wnyB`zO>H`rO$=QQ%g9kHUY zLaua2^;vj4U@OfNnMF;Ob+nQlcb!?0*)aBq;^307WyDB#AbQNw^oH?!!p=X$3yrzt zOM|dk4@MnXuNQv0jtCW%oeE=EA_)8S<{fihQZ}As_S>r z)q-_eN~MIl>*%#|E7M|1o@-qUdh#TAZk28e-IrWA2g_PK=EB&P&=1lWsWR{6&kW-+ zA49XntTVG-fp6#c&ngx?7qR5Ij1{LqSas(F G);<6Z^W2C4 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaInterfaceImpl$ActivityResultHolder.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaInterfaceImpl$ActivityResultHolder.class new file mode 100644 index 0000000000000000000000000000000000000000..8562638c1ce0e0cf801c84cddaf121cd8f1aa316 GIT binary patch literal 1064 zcmbtSU2D`p6g`uq**1-Kt*f@S)vBv*1Ddt3mO@z&1B-%6@pX1Gwo}riPO^*sCm$4C z1Rwh17x<&ZJChcC*kWN{?pN+T=giIh{pag3fKA++!wlApxna!B06x|mxZS`VhIuXD z4rN*Oic~VNgdxzf9A+m4U*(m|D~6>$&r@BfG!}&|#ff!~8T>7kt7@BJt&=2YwQcM& zcs0pFU*+=I@NgjYD?Z4GcClXwp6zn2Ony@Is(n>5w01a z8MdZbB}3DI#~IJ};^%_{Dd>3Ij`{uf&xwn5x>BD`*M(!0QREnz){|!P9_Rvaf$T-f zGWzb3Z$)3=MJr>t(drmZ^k5A3$xbbhy-KLSH|qROXg_H3Coba`npBPId0aw^GD5Pv z%tnUUv610+o3pq=ST%D@-gM1GpW%L>z=5IiZSmMbhjjz48E6__nmFv7Z+IEk3C_Iv aUuO34|IDOp#dfXIqd~u((K>En5y4*#gz?(| literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaInterfaceImpl.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaInterfaceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..718b00234d9a17e5e6a1640671c5e7caeb55a0f5 GIT binary patch literal 7378 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 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaPlugin.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaPlugin.class new file mode 100644 index 0000000000000000000000000000000000000000..b8f64c6da3eb9ae69d31991ad4974c678d750ada GIT binary patch literal 6873 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 BnyCN) literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaResourceApi$OpenForReadResult.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaResourceApi$OpenForReadResult.class new file mode 100644 index 0000000000000000000000000000000000000000..15ab1f62eb90d6e90214c792bcde28f0c9762a43 GIT binary patch literal 905 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 HPG$cKgVDSJ literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebView.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebView.class new file mode 100644 index 0000000000000000000000000000000000000000..feaba8cfdf6c01796c26c399f8d4cc0f0863c5b5 GIT binary patch literal 2239 zcmbVNYj+bx7=E{ugr-;N1rbH76%#I9ih^h=+HMP^rnINgcuv1?CYvD{x|zwDou%S8 z|CS&80sbhD&&+O{?O}`Phvdo3yw~Tw+k4(QcWZlw2-~JN7I3lv0>7*S(NZg)bMCrNMSsBUTrGf^VyJveeQ=! zcNMgQ6dTfT{ep$Oo*GSzi2SCAP5muO`yQ3RJkug>Aa%ha@f+`YbfH>1^r+n9rY-ofM~l^3lgX}DqU*oHjc>2P z;cTQ>_h%h}6qQOYRo~?L(55^Y8#Qb~9PB#>mWGhYCu)<0M;=weh%+5n%29}_)2VFn zq2?hoHm0iwi8Nxs+aea7h;K-#3^M{n^k^yPbfkj-r<~QND38*w5kv>RMyEb9J*)hHB;Hq=x9S^svQaqZJ~U ziMj0Vpc~^*iy@>J3kXa3>Z{{lcxRvW;NeDr)Zt;S19#cbMb>-=!Sx(l**N5G_Btb4M(tKLkEU!(gn{fHSGodXs{mT1u5kdo^lVsXq-rpAcWQ5T)^ ze9SvX!uZHJ=xa6LK_pO$l{f9W$Y%PY%SUfu7Tt=1s6>Z+V<PYa@ zfNvLjZ)EPzNW(%27O+B41Lzg(>5B7!5&YGS;Ea z9u^Em&Q;d&dGFa3hPmY$>amEx>-<>;S8cQ&EuY_H8P%X^lvrvSy>)+eZFQ|oO^?=2 zcI!KjfJfKgu2b^JqcQw3VsX+18V6p)X^cv=JPxMl5^g5kO$Fyknj!*D(~QGensfLb zU3NI1y)R_v1zLoyCFm1f!KVak?>ot>nZyT~#x+P<%OBE54zFkDk2ASXGF;B^Q~K;2 z%PaKxY0NiZ@e6n;j-g7o&w056FU2~m^o_%BsqS!{ ozH|79zIXToZ8+RS9yafQw!qIAZM*NsbPHHP9yQvbo27|=0IPy)O8@`> literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewEngine$Client.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewEngine$Client.class new file mode 100644 index 0000000000000000000000000000000000000000..deb6dfda96896cb9b474ef3391448dbfca1b954c GIT binary patch literal 549 zcma)3!A=4(6r3XN3W6wziFXs1#IT81PKuBai5fAOcq_XvOUcrbZdv26dGG`LC}Ve# zXaWZ>o!55eb>8&z>-_`3B~Dx%xj1I1D|sW51vkO;mfm_PNyBjA4Y>@p5}}_8diB>g zoz`&1Q|`xHM*g)@F>%>pXa=^>L&d`c6j*=f|LpBBFcj>E0#4E9jUr%i7fy~Y_Hrztoa6q_ XzJjV%6mXEQH8d=iZ71smb*JY literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewEngine$EngineView.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewEngine$EngineView.class new file mode 100644 index 0000000000000000000000000000000000000000..1149bf247468320f70575ad89d005aebfee41a23 GIT binary patch literal 308 zcma)2!3u&<5S%sBG=n;JFRDuqympj=Am|X(`Du$O@(eZmw+?+k9~D_%@>G|dU1oM> z*~jyC2jHS-qGO^<7=&DSX?9FYd0>AZ@s%*1&NgWl3VD{niA7M;qA6Pt>|J`v0$xQ4 z6NXKCslrI{JeH+2;Sk)PhV{m%hWZfudvMlDapom5&p9Xb-_|0LDim8k=Aa-<{>(54 c1g-i5KsuoXz3McyKh=O;p6DO!ttd_pyXq7skqhxq zp!;0sO4FgDF9IE<6|;WELu2zqj%50olGNDDjAhbq@FN}9era{(Ew!vMD_ssfo0`qT-9}N-cA;6B%!0sm63*Ub|g#j%n{Is;IYhD6o`MdH#L^ zkK(NcGUhHPzSYbqjLbgR zLSQW(o=BcXA$6YYmsaV#cT`_t)|F;7WE!6c%*6Fsz{Xy+!oL5=c=%~S()Q~y^KSUy zm0}T#`&ueW#u>;C*^i??vw$9L-gobRsx-os_aWsYaKicSzAU<`xk EH_%ud{Qv*} literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$1.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4cf05bbe572b737d9766a6d7c9d4c7017d700111 GIT binary patch literal 1660 zcma)7-)|d55dPLSIp=b%&82bqQOXq@;@Bm2S}1K3TEIBq){a}-NmSl8=f$~jy|wo4 zQvMJG65@w|2c9d@v;qm<`IC4k%sQ6R)JC!;@9fUbd^7va?B3r`fBzG}C2Sk0%whqn zdbngFhs!1y-bv%#G_II<4_6IbGck+HX`v6J=Mbo+R7q zk=zlx+n#t(zd!J`%eohM(G7<6!jwMaftR-#QdQX#44H-(h|T!^u25aR>yyTANSFKD zTzPsuQl@mG3|2h|gsS>H3$lPgqJOx!=i;-SR_)$gE5>xsl4uV>&;qgtLxO-?N#vl1@aLP^bf;oCiE~;vkG&SA^l` zvA?1*?hwJlX3L!jSo_iyLr@EM(I$Rm&=#)n4n(h}Q!vo6(8U(D;ZzjmR~fR$-F#Fx z;^glgYHMQFl*!Fzs z5NCEC5-L6DxPli6Rp(QLN#oZr@C{DmTiX4O^xva^AIR<}viy;r{GU<7FVEz>G0HiI v3f{sJp%w^b9*KX+Az@(IAYf*o1PXJJwi0+7DAWz_)uVULx%YWk1&SnAWq~`o3DJ1!}Xp-UyA$wIB+T>jF0lUHVk3`z0^d1gzP( z&SDOEL8KO1>nlnx8(;!MUhK=TCUs!eJDZjPE8tY4Na@*7Hk*peVs|L=6=KioRzz7a zxdqcq?g3Vf5~X#kk*NCI=e}wrK^)O#U@4LQXY;a=g6PcVItM6_TZ&uSSGNKKdGz1i zx@daN^5!BxjGIBUI4B{;ZLq;6Nu!B)dI=G2hffKtU+Yg+B zkB#XZZaKJ(Pi#~j+`*?dJO}ew;7q$3X}%&bxSMHl<+1V;PGEPd!xw?WyPL~vI^NtK z)|syIun#*-W-+lLl)y+~&j6MZ%@$2ROo_261A?#$cg*TggC|Kkh-EE(HajPMUp1Tg zOH<^o+bt1`{AfC!72~Ed`{X2PycpdJI0Gf?q~6{(cBVC5tYMP3&Oxw&um%SW(Ew_4E!Cu3 zs>wp$SsDIEag^3$d|TkUhkD#CwISSNZDiczZDidss}0Nj0X;8LpK;1w`T$QbK{=Af z8OJf4;EMi+<2)BQNi^HBe@B)NFylV(es$fK$b7kl-qPzQI51y&ef}3}ue5~&JP|*l zk1G2WMz&YEpU}^Vzl5~~=LN%9EN+OwhM34`Q^Yv0)+{A(7JZao)9NW(@r-BRa{oD@ zenUXt;R3$rm)L#-eS(&6<5XJE%uW%f8DRoFe=&TrN9v6#k|yT`7Yga#hp{MM@FM#XE?X3fcsa&{`Azm|;7%3(IaZ-9?|qcQB#R zs=@z0l<~~AToMCxlRf9m%(4$NS- zgOumnX?d>$_wm5MLj#WtJZ2c!7k0vSMe&`o^VXhpeXk&FUox;PL$^Nl8rzw&G6!NVw1P%qUBiL62oS)MVsuYq>i&b zwbx8^Yofpq$+$(TziZWU5iX*tna zUWs|CCaipiXi~@S%z47xT@#h2_gK#Ll_^&&9e?2eW=!j0P_E04X}eYG^_uj`ZqdLK zjs+}o3}BF>3*8)7(8F;Ry&Qe$=NQ5W$5SjBc*gM@FATio$lw*nGFA+{=6Hie8cItu zNz4;gPH^#ddqTsOb!2EqSDxnyAb=o~vii(4RbGVliQwvRX~d%@B;%TgAkA zGoqkUeH5mK_UPFOAFI*iO47@h3EssG*QINaOinbi^*zfbI6J1VlytoG@@HxKo~v?F z?OQ>BM9`)S^yrGoz)}O@bR&*ByP)wCl@8r3QaP`<=4DzARH?v=XWUSw6q++ZoF17@ zFkD7kcelnDK%5{Ja6(zY31|T)5Yl@UqJIe2$m%*td0Iz_$5WFvu+(r3q103j;nYy1 zhDfTft%kPLH$=Y%mcvA&WC_%9gJ^%?EsmR%iT>gm=yc9-8zV$@gbKnW0kf$CguY;q z82b*Rj!O(AhwEq$X@MOeMl3>qTOA!?=#XLPkUfYH{RsoVXnjae>F*#sZ#Zs-9}V=` aFc~FC3}Fm+h)3wXP2v_wF;eHm>H7z4C3{H# literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$EngineClient$1$1.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$EngineClient$1$1.class new file mode 100644 index 0000000000000000000000000000000000000000..1370f6695508fbf46ae8c09f4e2056318f93311d GIT binary patch literal 1256 zcmbVM+iuf95IviOI592_hNc&80bH7-&|CtSv=68qmV@o53^XpBOQ-nWw4pS z6CGP9YA9(aYuIK;heIc@>KdLh7zc9TNYQc~AwzPHq!fP3M+nztD@DaC% zqGEe~-#h1(R=l2wUe^(ykIqJ}b&^p?!>i(A6s0ahs^#?s!*ZK6z8jzQ zg#U^6TtdvYXLGm9eMk9IFr_xeu(wdXNOaO4ONL}o)z*)_v2Tk*N7Y;Xf6F_k{G5}v z18KWn;K)HoghQ`yU>zF<4BRweDr*N7169;C)D1jGgFy>Mjyh-BUl4jD4KEDr;w2sS zB4=&Y7;;KW#pQBPdEYw~Hnq~6K_ACb#>ZB_dI5&U)svK_c+ALXEYJ@%K+%|18Mfxj zrTt;i!Y2uZOCJE`_8XbPb~zr7CP1Iy*qz|n1xpx4ALLT{6`PrgF*^7dD-@^>V@ zL@_J$O;ZdKdF08?$5B|t8hI2Su`!CES)OveK~iNPU!H(Xkend(1J}&7seMD{WX7v2 uuEZKv66+DS5ob-glej}13Eag!T2pjg-N!On8^pduSJsUPBY>W4y!-_{QcRct literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$EngineClient$1.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl$EngineClient$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a93f93748c5805e737643c9e3c4f114072173835 GIT binary patch literal 1482 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 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CordovaWebViewImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..510092847e09b45db549d35676b77e219af3fb47 GIT binary patch literal 16111 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 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$1.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4ae5090e5b32b4002e4b7f017deb3230102e8a1d GIT binary patch literal 1027 zcmah|U2hUW6g>mT^0BpuwtiRIq5{=!sV^p&CJoU<1FaDSmul=1E^3DjV_$S(^Ya&gT|CJmgF887aW{)wSj*!cN*SzYu#v+i z$_DNmcwpcmLpm6`etCzX)Kc29_?X*6VcAL#)DgFuN{f9t(8?V&i2KZyZm`F&S-FT@ z?J}gAY9JVvTdoublTUr2-}1gkNU^1C?sd6#!*~j&!a^9#mr@Gd^tkT}3O6oDRIXE9 zNj;G?R>GvYj+$s&yl}%rg}M5-NBoFWHP5B(Dc_Y&TLeQjFiX$1WLmzF*}!2tHXoPi%I15`r=aONYu6?g4f=}ab=rJ?u6czE7e8vXIP}Z$kQ_%hWuFh zL0kAf2{SxhWXH^)*!4zr&a)|m5?zrj=)iy#3gPC{%}LO^gv*33)88J&A(E?YeFdw1 zN8(GwDbScE4)6|FXk3k1DB>DL#E;Y%F;-|U)@mXdtyrm@f}JAy11UNSmx}3cFnTlD lTqM;aq4$xr884bjCvlzR6S#q!^i9#tzKyFJa?4DGzyU(yudJkM~FgP_G35LnK zRN{N@vMJ0NZ^jgvuIrG;4Q{0Mhe5{{!r*^XN|;*AI~_sp`a43!D%F)XJw>);MZHtq zGod(=Rw)0f{+$bc&8eD06~?+FRqI%E+d6Ww=3^Z*KE{ys;n~{;iY_*7c#GyTdMw2% z$yn+j=BgF^XkLi0OD(>HPI^iW`d%GPMa74);HGAufWhsHWF-4wbuxyOZG-ifedxWtW6P0_gd!(Jea8h{T^Ae6*NG3p}u{sBt0r@jCH literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$3.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$3.class new file mode 100644 index 0000000000000000000000000000000000000000..5292b39edc22cd70736daafee01a74d8d11ee21d GIT binary patch literal 737 zcmah{T}$IY6g|_{#>S{!zrU?oK`U%T9~D80qEHo7>hm-i+L7#xOj5<4wV*7!5Bmdr z6#YBmowT42ek9~F=W^zpdvET;%fJ5sHn3bk4<=pYF;&1gru#612?w(d<{Zp3RE7QiEC{lj_QvwxYOVP2DryHi6ie z)~NWd{-2lpno~72d04=(hh7vsxc0P&B?o01$=4GpZ<2#m^&_sD z{z>Cf1POKbmO5=K)oFR|YbokGhy*tWGETI)WpHjpqb|h_&H9rG*#C3UA<+mHKGuIn zLWve350VBe7Hzk*9~t^w^ikHM(+=S@Q(3zQtNcOccgpFfXm0|K7@#=Ty*G#-gsg&9 zWAqMTxU035VxYfr2X=?-U*s6x5keV^k`<7ny`4ZYHDc66 G`n&?TG^j!V literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$4.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$4.class new file mode 100644 index 0000000000000000000000000000000000000000..8d97659d85ba563bc8d653122559a79c1f4f7ce1 GIT binary patch literal 748 zcmah{T}vB56g`uqS+iM9)P7jo+Nkj>g|3KiiXg$#Lad-Af^W0CLo&L~$m~Yx&nhTl zAN&FR5vBeS@y;fo4^?;B%bd%ZbMC!+|J?q*2C#yK5?zp0JbRFTm#S|jedR5IOQm|c91ywqkWG<75x zDlMtR_ug?J%nu&Klo@O3kjHIqq{V||!4|^ceN#%9X3UdB5S)3&sJ=>d~UQvJTCo|a-L2RuCbDw9;3pA62K2-;Gd(Yzm-g8fJP zeG-jf`v39|NZF7MP@|P7f(*c_RogdhN{&7kWy*SV+8~@|8lNt}8kflZ$~eOm?M>h> zMku}>+^b-ekX5j1jNUPf546@Z42(3+!OoGtLV;obUeC=m{$Ut5nWjg4VxzB_$4f#v Tydp24Kr1|fYUaeKi|n}r9Tllw literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$5.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid$5.class new file mode 100644 index 0000000000000000000000000000000000000000..caf3782420cbcfbb000b06999a384bd36f9c6caa GIT binary patch literal 1988 zcmah~T~`}b6x}zW%p?pnO$!#Q7}^w)@Db2bt5h_F0I?xKh*0YXUM81hXgU*TCjIcm z<(ogicCG#bpLJFIc<|8&f0E1P^4v)#geKCgWODDhd(Js~-+gEP`uF!g0K5rP!L<-x z#X=aDa6OE-aYMm7D&7ra5jR!5Cqql}@_q;P7=rea-1E{qRx zTY~Z`HdGYku&82F#YYOZ6l^o}yH&%9&oRXEmR(8nI@hZrty^~4dcf1mmMt=7*|v=G zB4KYDrr|CzTuHnPoZMmPTeixA;cVV8MWJzjU)UwSU!zDgZ|S_Y!)-&(Tfsir2!ob0 zO<^zBxZ?<#UVcfT_yYA6vdk@^3*!OhzLv=IX2V3nbcN{>3HpEJE_N;Cy!A!dYlr|g zU*Rs7?HzLBUgKsZz3tkDS)m$=m+g_uFxr*JFF*-RQz-6O7` z#1P)L8n!N04XI9~L-bkM2}zhW^_t~SCmX`8T4fC%gPI;YeaAGshSxQWVMoEPhCBF# z^z_AXMNQPJmiahc@<$uokQ}o5+b&hE3DC10oSk(T|*f{!GVSfs9l46DtLw$$ZGu_{2UW`=$bAVJIxd%6$!E!kMp+6QJ6*2$!ZGu< zcW&7hFYDZKTLvR_A}_jwVOX9Ezv|;-XfPqYHR5aT8?tEyqFWJe#?zMJLL%AAcKzb3 z2CvaU7*2F77xxc^?k*VYZDpEU zzSr71;?qONd~uC|84Qy>a(AbevM3M5{*ECY(&OZR4!JbYZWBZ&aJ)y^mdjco+8d&} zS!X3VoT#9 zMsI;j^iE)rh&;+P3eay1Z_r~tMx!N~%Sbpi^)mvgUl9C}W&w=TwVyCxW4KJ?ktPaP zaFu3+_p;G`VFHuQTr7ql`e^Ox^q=^C`Uri|{v#;Q@ZEG&JwoUizVQa(!pu(?@K(m7 zT6FMN45gkU@Em74@W0db=H*QqoB(I>y z>pBLBSDcDn#VDIVj7=iN5}0R6tg|U>v1xkF&7jWG_?pe(TQ-j;Y{AnZMGRwTAb})h zBd%>lo+5=QsTjqkF++OI(pW?AAFL}#PyUTK-7!b80Osi(4a&su7Dc6+jP}X<{0DzP B1=s)p literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/CoreAndroid.class new file mode 100644 index 0000000000000000000000000000000000000000..25811990ffac963f7ff51cce25f067549c97a0b6 GIT binary patch literal 8259 zcmb7K33yc3b^ecLM(=6#Kw`AOfB><{l14~2Hk()_AwZzbAi!V;{4{z<1EZN?76G>7 zB+k;-PMfAp>N>IA#Hk~n>uOZE@_jvOWMSCamat)n;FeW zW8?CD%zf`J=lu7a|D1E*g|Gemx#t0_k_Ws<;Hrkd@S+4)%Miw2dinDW_48L{_&C0) z<6AmD<;6Dqwd(w~j=xdU{RvKQaQ_jG*Pi+{jBs-N$xxv%K>Cmm0# z$A8vwQMLb~;|ps1U)9SGbUdfpf75YUwg0Z;J|+8y>gPwQ=f@ge^`Zg);l+RAzcl=} zg7g#B^FJE?*NYastmCH|e&$6RuIhMAwXf@VL$&{>a>THY2sCO;l|fVxh94tvsC|VO)9+DC6&Y}bIQdhRhm?L z(T|rksqtcvsHB!!Wv(Xk)VN=l`MNC7rB0WHs$-G*S*%OFSC+_9O_q6an0}Dux~$-% zG-z^@7eTzNR5Yr|O=3r?&c#g1J(YR$bb3xmjtug@%z;>gQH9`8G{f3yhvf z#EN%?%|yaV2+9Y0_wDHEKhodP*Ddh%9y2G*wy+r)ZQGlSha#gJ1hcxLkwnsrB=?)) zl%>lWforH^hhR?93R|(UXyo)BD`c)W0<1H;Fxpqg2_F%$_UH*$?g?5+P}4Zm_6kL*8BB(v5kY0l-d7JHhRks29s<#MFaG1c98NZC%$jxpY|kDZw*wMCp@FDlInsSPEjWDYo5Ml4EaaMCcO zekj=yi_xemXoqHIA|qtypY5SA4JuePBQYtLMUu`qjaQjqZn1;0&q+>H6&*gt+;l^t zZcy9RV&-W@GC^51vdu~)<57C7LP>SfRVL8O6_>}Y%$s*_G!+k8L_wBS<|T?&#VrF5 z;Qj2M;+f+Z1MkKA3|zs3242Mb4Qa>20vNJEHX8VpTH{WPMNb;CNj7V;#gMJi!Q@md z$xh{_<+o6ubZXLN$TsPw#|_yoI}F(=JqA9FCm4T0GZM7Iy-qM0c$&&_Q6bnRyA6B+ z&l`9SmkeB11NY(G2JXju6w6cwun7HIp0~4Y^(RF!EZ|!(Ki#88RgMG}&*+0l9-E&z6%P zc7`03Lx$WbcNy|7Ih=`NmMc4o4LKrrE92aqjb&B|70ZU0GHggt$d^3#I^YbZ-=kS& zb}{aZMw!gWeg}Zvr}#T+#SNU1QSy6ghsAP{A!Eu*AvvbWaYMo~eq-z1dgCd#2@W6V z*wf$BzoWfg#cRD2;q}|BqbBQbeWx{MPK2WI`jeq>xPI8G&tw9Ia%+A4(3n-P@`)4l z^_D7yxtXd=jw~_oq%wR>_E<3yvQD<`wocpeV@O1zg1d4M_D92vt^YrW31?j~08C`g zXo|_k>pYG`Ptq6OaVwH?pc@h+|K)^`QEru*G)Wkel$4+@i#&TE%FjE3rP<-!VX7^c z%=*j-4@nfcBr~ZsWaq3_=Swu7QMPEi$vievpN!TA$KaFIL4cymMNDPg|qbD<`w}Rc;XBI)pz;0Go z>qN>7t2&)uoie4+E;>PHvw{`H&Mp~K*x`573|cHI%Zgx~K8^buwUQk?=1qi>EE)3} zn{u_vjK$irBT8J+Qbd8dK9eIeSyQe|px{x0{VA`xXDyOfm? zkCTa%Eqa>r4hBv)q0EZLlImRPm`9=JyaLl^3`dSoTrPpRIgj;wQ_-CiapQ)W%GDm1 z7BlShW2arx^JVfRqA(xnzN4#qaHwaXUl4f5K$O~2nv?}yurl9x8Kca!Q>Mz$Tm|#9 zl$x=%srh;`n)N_6`7p)goCECgIPHt6cYvQ|s-)ah1l~*`YDb=k$?#;grIrHsWl!^^ zVJkA49J3EzJo}c?nPm91Ajw*Q6Dpl3>KToYmR)9o=bD0e%1$K-T$CkfD1tSA$2lJ9 zoNj-(GPDb9Vt3NWu2_ol*5%8~EY90|5##4HxEpsVn^eU3>B|UUWg3bzka@T}X$|jZ zFq~uhNmB z=q~!t)7WDlpsRRpo;g}c(>Z~Vt0~Jf4xdJ$f?3>2u`^@A9Bw2QO(b)N<^uC)oc#{X zUuKSssBEV`B2?1IeE16%5NkH6Wy|Q)t-##37$O(r)+or% zoSyqun2E(1rnNTYbMI|7Ul3_I`fYss)idSg%9_oLt?xLM6-IhCA{6sUuHBXu%U-?k zvLh9lX+(zXbeqpKV$*)q^Uf~8i^Wp-k-`K7C;3)_Q>eq~y!UbT@myk$@uR_R`Q5>TllXAJ z=g+;*pTvCu--78<>e5&^iQ#~6kv&pj%V+1}N%RGL^||FsCb22tTWY`GMv(49=Ucw1#kK>!<^>>iO zE9CVL$m*YRg}=Ju8k#gb+O6TSH>hh+ z!{hiJPIZ%vP5jFX0sgAM>9YHPnmqQjDE6!*d!`fiAygCbRP@y32+O;G3}L@TR0dJ6 z^|f9?8^iEs-z{mZqNi5*Zsku)8n^jY^C68j&tk1>vulmpwZ?M^>o|9PduhuRyu>-} z?V4+iUZeZ9G&VeeXZ%`?PWHB!`OAD8Z7R)b@iP!MZJxwO*|#~3EstQf-M4j(n~Y^= zM?t4&5~KEbXS>($eF>!f0lznmF5k8^x*tK6ztmsm_kIz4-F{#a?atti!a=^O!G+G? zPJ6I2yOOWl4}3tE$?H28K8}XwgYDYo=7k?jqsOn=v@U1sFMnYYUNW3p+fB3g25Q_j z9)IaY^m%X=E>d=mRMUjj;9xW%|Bp@JHvk;d73Le$I;K@9G>CDOqv9~fba3z=107% zd7bO8ic~nEJ34G5ank{_<$JrLk620tqh^3 z`Q!obi;4X#!{!{Vppv-L^Lh5DVAzjY*Qvft!!ryA4d+D|f@uvGxbPYp*jZhD4Hb-z zy1Lile;uCdWVJqH{-fYJ6+N9Ao-Hki9^P?L?^{JrzlxrLBGK~=>iKrj=;3|Y+Xx&~ z0&g!O@VgZFN>PElamxrCpdD4=tMaw__B@Ndif`J2i`eI)5wo>%HYb73*YIQJ#8+*R zPIarwIto?zV>&=pGv4WCgrDO&wX%=G_fvSlcfbx!pVCq}ug+F8iJJqyJM#Md+5UL} z-$A>-!k)j!=~u9vbiGtnJ|%f$C?URShK_#>Hl(0D&VI}ImHY4l=sji&G0(Y3%@JMgKXQnaC z^Gr~2VB|b3M-A@+`Cu`rj^-(hw+( z>x$#GMRtU5B8n~Cawn=}E2^afb<)L%-e#j|rXB{JT>uq!lv;?uppmnIl0;&s8-kp=!S3R7lpAZGW$ zzROwYJbkX1gx(zBsi=k3L+@{SapenVIa|X*)N@5Wmf5Xi`1$r(;xJR~5xW0w)XE4J z$Wg42(Yzfty@Zg!;d<)cSfZdFLlaY0GJB=astdk`XSo$wE;H`NpBtCe<$PzKk&5onZZ%v#i~?&XikS zhHYI1|NOO1I@!G9(as?%F`#BlO|9df=*|qeJ+P9pLbXb-j*^aI{a{ K``9^pIQa(1vv*Jc literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ICordovaClientCertRequest.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ICordovaClientCertRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..18ad39ecc082b2a95f340025cc21d070226af701 GIT binary patch literal 443 zcmZ{g%}N6?6opS}ozd3%TX*7m3SvZXA>COJi-KZB1XnS=jw!=rn#mOA)m-=hK9qQ8 zTB-}(P$zJsMNCtWz>OS$~!B7uoh z>xkRQoYh2Qfs1Hf=Qlr7p17C(qJ`y`Cg_Tg|~ z-Pq35ATgBsioK_4LAgJ!<`y`zE|w}&`i-QXqw-&m!1m9!ZeJ#(eIOvv;B^CGlQ)4T fz`BZ{)(~s8uA^0J8ymHD7ThMb*vYwkHn8&zI1hE^ literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ICordovaCookieManager.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ICordovaCookieManager.class new file mode 100644 index 0000000000000000000000000000000000000000..142b69c954bc0811883a6e2c143312b1ccf03a5c GIT binary patch literal 345 zcmZvY&rZTX5XQg3mdZb^S06yj#ZA0=B#@Y3JdkkkHZ0>(+;qvd@Ngb{03XV*Eh-1N z%rBYwzR5T9{qy++;1Owps|44Cn^LNgb04{sCH^uLETdoM*ncI3TliUj7_Ic#|((U*l ze&K?R_=h?iA#>g+-mqSY(g&G3t0$z#b6yu~(N&v3XocqhaTFpT0s>>S8z#7H*g>~p MuV!%cLv3NO2fR*NeENwbi=#0Pa=?1FlXYNCm;6;2zV^A3{<>+J|%S0emPi#lbyqWp*1FvNlA)92rn5pG zYb6Pb)4|xn^gMH}-FL3axGt2mn_-NwHnwEE<)V^Ie1hyxgE0RJTyBjNE+P;D{{Rq# RUKt_a?--FMUVh-1ya7mPJv#sZ literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/LOG.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/LOG.class new file mode 100644 index 0000000000000000000000000000000000000000..7a7e8ddf4256467c43ffe431161a18cceb8b3d9e GIT binary patch literal 3423 zcmbtVO?MMj7=EVtnuerFr+ii@L9wLeBj6_=5u1citDz|=6rq4llW96_$dq&n=vo)9 zbgQmdC>s}|=M;{3T*^7_bggUs6&{~EcbHC{98Y`9Irq(d@5l4J_kG@b=a;{K_zA#E z=)_QoV?QqRq7RcQsxeH(5y1r&7sY=~m}y}y#i8J`icB0cxDvy=Dh{d`R*_XPs^Y4O zYhuN$FxQ2-Auq~RZ><_3 zM%kkva;{vwJT9D&g7C!T`KsuL*}qb#O^SYmi^{cHwI-aX0<}^duasxX6$R0}**5L7 z3PRbD8Ez?A4YH;xX4{xty)|caF6nbEj%XFDuD53NjwyV1Fl;ZFD++d3tWGnhFYEOM zBUiUN4eO4cBgGj7+g1#_Vl^wq9iv6`?1UguTi(cyY-LgB>XzPa=BDkA*>0W@OSIrH zPd{zz^`#5?vP&N~SBTw|0SfGE%+ehNhq{0U@dQoC)|=eJGbjxlc5fDnPyV+^_DATeA-&=)Q$6|5Kd@) zOypQWT5mTxmf6Uy+GZ=q)Fp5f#}YV#0}A3LDIA9t?E1GT#Z|M_Fggl$mKG=#Wy(;* zOiSpRv8_x3^B~+j77{SAm_PwbF|-o6g*G>JuMcKA%Qlig9!m*~2~!lNBupNb7^5i& zQxv8o%rb8CEb9@<46&5;fF+81*f{CrAsMwIUx@40o*U%4(vgO zo`UD;_232i2YvpF^oM=^A^KULKSF=h=O0F|s6JwCCnk%LHb*bVe}(^%(MRZc=ujP} zjXHz-aDx4WT)=1gWqQ4M1+Q{MY@R~MnHw7X9w9CK1d*$c5Y=L9PzTr0yN38)<;B;Ijn3zFF`>5InXHE{nw|3&%1?i!zI#WAtaqb z80vPtpP(N<`lvLIO7o~RjN`5KTIeU$SddEAf=3m+>_3z0>DH+VK`L1e9#!z_|4ORg zwoX+HQpt+&sDcl{@1*);>r^F=>ZYsJfLjzESMXW*6B_>VaSeE44R~S=Y!pj_iV5$N dJ;eGDzo_#$6JJ-w`AW%e$1uIOIo5-B{sAE<8%+QJ literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$BridgeMode.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$BridgeMode.class new file mode 100644 index 0000000000000000000000000000000000000000..38bd83976b8de77a3c95ff630816ad9f6d1a4b83 GIT binary patch literal 814 zcmbV~-)j>=5XZlBxg_=)HBGAhDJb~RTIhj@FBQd>7FyBKu9*+6A+S)oahTUGOvW#Wz zZO^)Ktgcit;W)8wXiF8Js9cwPYLBvG&N4OTPX!nJ@(*T*ux`yv+Q(AqblT7M#@)d? z{$vl0&GqPOe{_%**@O_^2XO8Q^)J3l!qz=1io&Y8%Z8*t0--H7o86EU8=^Ek5(1P*NPq;eK+E22Zjuel?s9h* z0ciyaSfE8(K&f@a*3nE0mT4_1Q%0>-8>dngXM7aj<70e`qmF;cp!oal-A78cB{Sc> z=X;#-99(^G2r1Ns-!`6ZkyVTxv<@ZxDpdCBwg6yg5g5S zg|rJ97j`!Lt{st|nMF#YSNW$n%P-D%gBUCA!AB{)T3wcpsti{?50!Le- zR~JldkH+?uzKi zbTkq7VirE+#XYDY1H5rcNFF z4CzwGS>0x$sHGD<)?Te(PEOy@cVwc59;nHcc8`|Qn;L6s>(hx=!_amw&h+)^hN<|F zvQ^vc#AgNf73m7aaV!)d`BK2Kvu99`kj0~xtQI7wE@FFhAqws&*s+wd^fI|m%1r3j zbByfXon($Zg$2RnKJ=pLFYE3&0ZdqwSS%Z4=Esl_sS zXP;`9RJb)1dg3-cQPs=5MFupZl|VUoxJ~6TnbhNK-c^CNvC4%qn?1Iunm_3LJ+}dU z7Q3e9P)=}nbZ%X@v}=8Px8Sx-EvwGpoMdh^uEofu&Q)v&jCIwh>NQiy>aHq=O(DFh zz@`t1rnX2l#p#Ke{KVeP54a6JRmPNjs*?G3as*HdL6Fiep0M#<8GH>A8o{{Bus!%1 z?B5KAF2WI%izs=S+jfNboQ6_BbU36BF6oC)q9~U^Op|S><9>x@3bS!9XEcgAyju7x z0+;k9P>HUTm`5?R$~pvGLB7-^A4&xhv5pFk~=RI*0R!k`+_Q-^*oPR!Kz`5y9DpT z>6b8`8cmMMa)%>4Jsh5Y&?ZASuT`GUT0PH8ti0Th3G^w0M%jfX*@G6@iF*?3VwF=W?I|}Hv?;i13je40!lW7iR3~` zD)7@;BB`Lu;BFK*|NaZR$aMs+n@1L*#X=A#vYDM1d=(`l7|)l3Q8~ir)xt0)SW(U| zsSG>9*-c7>gWH55T!^wlr9w`?DNkXNoJ6&pLW7(hmG61kd{>jHt){mP@R)vE`L;tQ zF>m}1S>DO>4A;Rhu7wKuy~24ezndwm`AQCz+ZK-f9C40QK`J@z!-^L-F3HmxL z>3Gl=r=+%rF^OA`1br#Br8LL_wKN#?b>)__r#1$Ct+y;K3Hny6CDMbcq(@Ci(W4_c zo6wlZO`_IJQ;SP}lOaDFg4gs--Bc*vILi_83`z1VTIKUtB45BNIg1W?4(o};7Wopk z%9qh6UqM2KV8{#nmHi?P$TnU)~Yy?`lL!p>vIb6m6NM8vVwtP&-uzGO8CKgKmqbo=~%{|z>n>j>FY zl|6vv*?c`hHn9casA9(m{2|{;#%|Guv8q*4YC+X2C>zG)FT&{G>ubE-(^dB3-vOBMe;o?m$xw>-$zWYV28YeUGf9|5c?ta%T*kaADfshv?9#6 zuA?SW{I!M{R+zu*{8}y(>ZeRkRH!&HdW|!*_ z{z07RSi*6WxQANY>^ z6IbM4td@W0E2R<_vl*U?XZamb879DaCS1)jK{ejVaF^YnM|PFs2V}~WasNR%0b0vF Z8`hzLZ$G8G@Nv|$3HI~f>*Fm`{|}TYyIcSO literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$LoadUrlBridgeMode$1.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$LoadUrlBridgeMode$1.class new file mode 100644 index 0000000000000000000000000000000000000000..3eb921fcf9e026b04cc8ae311d0833fbdfea1136 GIT binary patch literal 1594 zcmbtVTW=CU6#fRVOX*f9R;sqvOVM(N*1NP;iZ!u;8g0es+ps%5A<%^1Q{hrpRlyquU*x-{PLp5j*y# zTNSR$8{(N1E;5XHO~Z{B6x?Q*s@PnA;h5`=p*KX;)(K60Vp+l|o7{DU%dk2+czgg& z(ybVl;XPp3OPmO4bmd~Q#tn6Dut=JkjYuqv9zW*^GW5TdD zI?14~@g?%s@3bu%6Ve3VEKhR6}~)B3K^JPOItr{`_U>ZPT4 z0-k?ZdO>EGv#o(BmO9)pdwjWLRAaZGk|P^P=Ctfq$mWlj>kPksMYDA+Bk3 zJ>!K!fuVT}n+Bs@Ob)Bwa<3h{6!n@R-fdV7x)1VJ@>WY&Izu)wXx5;m{c<72plAPy z@Zyk&45MRE%wC&ehz+58ovh(9^}$InoQ5wFkyQ-POeIad(noI$Gjw{6R%P1zX%45- z`(UZeK76S|_&;<7&(kXh%w2NJbJDG2aJ#PjHeVoB9af0Rolu zcP!AFeZr})7<+XHB^o@yc$(e=g#4c|;fJL2L()YNAi5NSEDe=qkYTyMsIz_QAg4NAN!~}^Zm<59ZhL1x#?pD_pyASnWX(AFe z@dx;$jCZ;#V74I;`eA17%)RH_(|c!r|M~F?z!Dy$(1R%hDNL)?OfP1U)iGxvf!hY| zAg80CqevJm`@-1`YL5fgsmM*=kpy$Y^JK7I6ZN{R6Oz)axE}B4%YIO?#G$aO(z5-) z@ms=LZ_lsf!JaEWJPBP_2zuw7Fn3PWhS!k6Yhg={NIrBuxABOuojWJuf1Yz3PoeXB zg!p=>tiQ}cwwmt_WUwO+YOE<;_H9wy6M?Jj&Stz(by@go6#SNGxGlNkKdW!bdRtq6y#Y@?L8Rx7Ma!h}78?5#p~X5sCMTicq|GUYvy?Y@0L9mP#c;^%9&B znl94;+DGOyUi!_zmQP*vug9acExZveVZub8i2>X-aSi=C7ED-Rgw=?ii^l2BH@m11 z7j-O|xQAsO_X#Ukz#}YQJo@a7GR_*YoGRvQ1XAZNowP2Yw;~&BHg}xc_(T}Z<;%iz z0^fD`8Xj8zPPoc%uU6Pgbd*YdC@Kp=U(ocPd%NyVHITv~jO5CywpLAe73)RQ^Hk%9 zt(=cgA6->U^8=RRS4~4&^$4%hszZ2=fw;VbJf_*&XO9@q{e@#_h2jyYFn@&D7v9ov zoyRod08JxKGf2@au2B|4yg$_r!!R;zF+fN|;Ytx{OfZ7c4$T%np&FlM3SSZX&S3b7 z#D1Z8jN~`yr)-Auq8x^)6tZO6Q70@J+`t%Upa6kG=P?%2gFMu`pI}>kDYob1slUB(sCEDV literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$NoOpBridgeMode.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$NoOpBridgeMode.class new file mode 100644 index 0000000000000000000000000000000000000000..c50880695f675c210c8b5eecf105b72743a661b9 GIT binary patch literal 712 zcmbV~QA+|r5Xb*}o?c$2Wu-~I1U+bh2T>3iK?y;jMkKzk=b{_et=)O|y?P3I=mYej zqS@02%NOflXLkNGzq#3EKfm5T034%YBZW;1+ZIX;nG5O5$t6RoTI(^GO*IezQaP_z>~ckBBiXnH&h1?A6MDi}I^ z%-xZ2Tonvd%$*LO$XImMUDy_3$cN$~5|KFg*{Z>?r~HM|tC&k~I#<2AeDj7rVfsb? zhvDcC9E1I+qQDh5Qs2ey!a&LF^(P+l989Dw>@b}D_s|R{%cJwxZqEm`rF&o>20aP= z8K5VCG}#PA4tYjCefS3UnxrkV87;ChR%oA_79dMI60wFnSq-1kGPL#^tR!G*nw)_e bEnuCjfsF(#VwHT6Vgp;SsV+snY-Ya!N-nnl literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$1.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$1.class new file mode 100644 index 0000000000000000000000000000000000000000..04fe4ea3721322c667819ede1645f8f15765edbb GIT binary patch literal 1407 zcmb_cZEw<06n-vrbaYjaDbr0ird5II3hbk1(G3>20Lyg2gfHe&Zc1luOLheB}HKc+qkRZ zo(e<7eTGyta6+S^;vqx+)N>tAG)BUU!h^u++oI+71%rO)UMsmQt+>an?vDixCqh91eH%tL$S4+BdaIg)#0aa(pT z_=q!P8lL6)q2t*t5e@vljw04{Xt=5)BefFBI(DRZgk2S;jtZ(YfVllP2qY_WFkSB1 z=4tOjSP^w_7Hp+8V4e+EmAk$f!`WejDajIpGALn?teLk8sG)xq&OBts_bL1L#zrO16Bq$@4gs{tX60j1T|- literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$2.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode$2.class new file mode 100644 index 0000000000000000000000000000000000000000..cc3af3137dde609701ff4aebfecd4078c4712fc8 GIT binary patch literal 1733 zcmb_d?M@Rx6g|_{u3Z*esiFb`YAxM@v=qOKM1hiMC@3X0;g1=%V_8^s>+ZJ3SMk3O zU?PhC@Bw@%nr$&(4bK4f~qQyN=cnk}@Go+4( zl*DtUZTj;Jjm+ucdPgYgRffo7P*!|}s$FgFZ3%aSZ&_66z=~sVtIAzd&O3_{DG|d` z?<8HSP8F!`u-mlBW@H}y6`vcsW!~s8sTHT`8e-X$xeOnFX45;o#Tnuy+prwZwCiQz zZ#y*&Ipj55z<>q~{Th-ORxqPcL(OWqi+dXG6P{x{)gb~ zHW^fI7<83Vg?xcw`2@^eq%3agM^I<;d4|#BFVB*&M4kK8BA?EHRzH1P|36LY`M+At z$f`)@K=TZ-f?%2bXg>`saG*h?`IVZeF!BI^2Px)()FWv zc!>T7LSGU2h%xe5_yFf#OXmR5_Mm*n`4A*gn1DgKMTlq}DytyLHjrl3 wfK+S4bx22oc$TJ3*U1fG6k{|-D3@_uByWhG#Ob4yAPHhLmp`3W9zY5PcKRoQa9X2wDhM7D?lQtxfy{#pF<3zP7rtkioG;bh5EeQn2Vt;qPc;DQe;ZHOM> zS(_{puOgXqlxUM`?^&-oh*d5XUzDtzJvB1Tc&tHGzo-;e;d#U2rCExkE>`_8-zc74IPhtKew=n Lb>GQXx7qpz-D{Sp literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/NativeToJsMessageQueue$OnlineEventsBridgeMode.class new file mode 100644 index 0000000000000000000000000000000000000000..d537202a21cb02d22fee6996c233cbc0217163ed GIT binary patch literal 2619 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 WIQDbg$}!Awz$5>m?rWl^GxC4L!YOqC literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/PluginEntry.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/PluginEntry.class new file mode 100644 index 0000000000000000000000000000000000000000..4adc8d0357d94dc5b42e292731a8f491ee52b471 GIT binary patch literal 1042 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 KeD2yh-~R#7Dj^2| literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/PluginResult$Status.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/PluginResult$Status.class new file mode 100644 index 0000000000000000000000000000000000000000..d9ff981f6bd34a59cbba1639acec70d350eb395f GIT binary patch literal 1651 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 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ResumeCallback.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/ResumeCallback.class new file mode 100644 index 0000000000000000000000000000000000000000..fc6a4d131b35eba004b1627ef38a0e7f29bb33dd GIT binary patch literal 2995 zcma)8>sJ(I82`PnyR$5V;^2+SToe@+a0&AgsEMS8axp>h(rwrsU~rk)W@kYx)2z(y z7rR-0&W{~EftJVW<6)eLU=2>n&GQkwfEN|K6hS49h4HeS z^)QCYXpxX+$uNvChQk<9FdBv_9mW)#Dnkn6(!f$+M-auaa-{K!0w;`21TM1jDcu^0_qmQ~jkF0=bl6tL)h%~GPh|~(@{Hk3mpneJ|Z?RASIJ{X{WKp@az zCmDWemuVS2+3_L6>DPx+e4=&P2|YESJEq*{9tPY|Gb6CR81@k(lN~oY^i*m{Pn_cE zDl>+a^p7mxrCfp9x?-M%Hf{1yg7H^-mSY*)iXZIj?b&xaVWeHtwg{~HT;)M)9*8Lr zG$ss-2Usy5wRdRDNVtU53L*WctdQrF4-;~7NmTk=XI(QD?=myey-ZK1{VW8c#g5Zq zJ4U;ebZj$8^Of_tol58V-Le3BXECgKbnPZwMW0K?yY;kJB?VIo&Up9X6g5vl3q<KKW)octmbf zZgf)5v_@6DfeR|$#03R!sdyU~nYTROtf2BmUglT6Z|*Xxcn6neRYq>zY(~Yqcu&Rq z_<*-gPe>th;dqqE%gZzJmis4Qedk4*m99X`QA^$?dH955=&ljY?#OSc?MB9lz zVY*XZdMQ`M4te;sMaV4_f`SiKe1cCUk)JVFk7rM!?T({QNu4UVtm1QgA@Fz+umXir z`2{-#U#j>DUrXdGD!##XcBf(hIpwg;xyEVUwaU3#=gIbu<@Lq>QOBP2Tg{G#>|Qx7 z4jMxPrZMStitsQyU}n@vvT2-P`>m7hBgEUtf(SGf0j^)vDRUC!MT(3VZnu%iumuY& zuUl+No3Ly9Ej?G}1ueR(m;GN%3T!G8dr@dFhthPGY_|r9;dG?*OvYfKlHNlC4{Yl>81lF0p>2z% zD(kysPTW%0Ohr$!+A9hf%=1N2MDLs8?AKQE;%6;n_4a9BQ0klu{3YN+~C(Xu({lwKbrXYLDK+W4E#9_zgVXcoS<|1Gf<+W=(6bI#?a}5$j4YSRHKe z7X%M!wKLf8E7rG$szW))>flXmoWZ8+2=FhCR;Jd>WaZq7UEbV_GdPP!_+CuvIX+E`10=PVgqA%~@cl-HdBZ7aUS;2u$1<(G4z`sNaDB$j(f;`ajBwEz|%2 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/Whitelist$URLPattern.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/Whitelist$URLPattern.class new file mode 100644 index 0000000000000000000000000000000000000000..db851963d7ee080ef019a96572302577ed5458b9 GIT binary patch literal 3129 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 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemExposedJsApi.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemExposedJsApi.class new file mode 100644 index 0000000000000000000000000000000000000000..8511795f9630335ceac358120f7b6c550fc4579c GIT binary patch literal 1433 zcmbVLZBNrs7(I7vtCUF*5S*ZnH{AxT3cdzIf&^lh0SO~~Ao0UpcPV#t?b3D=|CJ_+ zi68s{{wU+qmJEa;iCKEzcAn=s=REiR`u*c4fF-<9p`g%@G>R(bu@DZ6;ZRbbD|o8l z8AH0}$+{&NrYo*z>Ac0wBcYqFS9d#HUytW^5oU$ZZ>1xHRff6z&G5oLLvr1%Q*x~$ z9kJbR)`YjmYc`z>S6q|Z``nY^{_HRr97&&{)GN1eEXtu*Kly=ZZk)7SU)0O~T1yhG zq&N{K!-u?4X>g)#bH~!FfhQen<^N6!SHl=Gu~$`LdLm$827}@YuOrP!(3R5U7dHdx zIt(g_wQJlwHtG!h+_TzE;RK{r-8eBtD+KupmJ}>AWOv(6Ae&-e`jWg^a~wC|5rSd1 z!kxP3%DVnh)Q)AKmr1X0da@N5P9VHPZVEDF+!w(%#dO4;TlVAjZAG0(XG5%H6c|YqT#!a zUaszJcYSBboo6#_TUgv)Gfgt%0;De=nwINPu#fj4d2MSTb)fn1Ms9_X$ zqyIH3HXfDJaF13Y84X!lg%UK}r&S6Qv`!Oh5)be&T2td_CTlTuMyNt_7_CNxCQp$( z7pX=SN+d&%_~c?_myg=zqhgwvC8CN+%73}u4A~SL@cweW)Mf3d;ty%L_{{V0w53+D@(~4U;xVW7|1$V5t>tfMG z)kTdVcfiAn5z#P=8D^SXb&Zx?|4?-HWbAK7ual<@1}E;zsItaTZ)(%?`92T&!Vk3R z>I3cz)sss2tq)Nw2Jb|t(KmV^8le;_w!sgjlJO&kt?Id>&&0IUX2>*jS1=TsRQ=^} z&=KYh?}TJ2HFdzlHaF7VkBu4I1B3TMDPbBRk0L?W_47ii)TyOxPsgL-FqEr1&0S7o z2)XL{t=LG_+pzH5Xcz<{q9SaEVS;8oOt77DX2`c<9_(%L{bQ`TmL8fwJd?JY*|CFN zwP~pNrz!|_L^ZcW+}B+fD<1A))x!mN9+Y zD}va?I>YLiOpOsQo=6_*Ui4gq`@&RC#^szS{+P)BF^Q(G)n@cK6o%NkUHz9DM7*{X zha0DtF~)Kh)t6{f>8jn{^cgO+*FdZH(hP{%0at+t85YO%GHwc3pbydo!z5D0qTLQa zC#{M;+7$isn4;GLX$`uk=`7TikHBgxM@ZGaA^kaVERuA{5oqBe$#N20Kna)WMnOqR zA|9^L+bH2Koi<^4?j!QGFGzhw<`Z%wZNlbF!{#j^L-H-jHi6lu3_D4Ug;DgM8f8r5 sYJ#DR8O#!bIf~05HRX`!HPTbKjvI+>o*KVIT8V59o%T10B`iDH-w$dvssI20 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$2.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$2.class new file mode 100644 index 0000000000000000000000000000000000000000..8c8da1b9681ee9e253b0d7fc727dc0f95aedb583 GIT binary patch literal 1204 zcmb7DTTc@~6#k|yyR>X+ty%=UpjIgbSuVcS__Au06iuu_!`pN_Zl`Q#$nF;6Pw^M{ zY$BTY;1BRe8P9B~CQ?k;WY0Ns=3KsWnV-MD{{XOshk01IZOEMhY}_rNhI@wGx3O%a zZll3aIO1U~67euh80K4Cbt5gi?y=|`$i&@=U#C}11}o{wxVFKt+0s$q@4*NgN(c%c+3G0u;qlF4I+-TH;S&&9N|$B^@MS1^=Xl>Oy! z&=Jua-U&%lX=$H_dpwfne5%Zu8W@}xN{Pq|c^nHmZeJ8qZHr3E2Ra!whoM^EZ}mB~ zA>=A>+esu<&@}MucOZ4$$bRy(n$)q5EY7~a+YT@G5k zJt>ZxXU8!?bKbJA(5$j`GrzfWOlY$H7=-0><%^JEc|tXl`hX>Rk~SEoktvtWd;sD! zEPA#X`iq#Q+Y(70owLMCjnxyd#@Y!ojc>?)P7TXMEiweUxJ0y?I+swv6*`eq8j@BI zSLtpPuut3stS){;vGE0&ugHBuVI)nNxLKIE737EpM0*6LPZ7d2$I{6APmU_)a4p49 p#XJ@W!6NzPkeRi}@;b>G+`!FLcZ&+YOj3n(7IE`UV+E^L{x^?!Hr)UK literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$3.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$3.class new file mode 100644 index 0000000000000000000000000000000000000000..5a345dd52fd0db034a12f9217b62f22ececc2d3b GIT binary patch literal 1270 zcmb7D-A)rh6#k|yyR__}(x5cynKNh4`Oe=rKYo7u4qzR()39*Gh^racxRyZ?*NwPg zW6?&*MwubA%l%>?!hs(#%-6YU1zNV;J<;sS$bB3>3v{m^J&zqW7_6ux!{RE#T3rWi zm-o5X5w53$mfq#AP;IG%+jt#DqW4lXYaNOfHD3x9nczE8$>=Uaqjc)%e^j=##gMA$ zmSD)%sfH(mUQ+}wc+)3KzOFs)Z}C8y`_Py&oiI3$loCPB=V2)5T0L!H#VR$HZtLNQ z7^X|x^&L*b@VRQcjVO?+y#OA?4f@QAf9IR2++tW6fmAzW$34k?-3}iLzb}H~A)|;BM~XWl@+3YHb+tO;CquvV zH$#YjTT<+89N)%&Sx$ZlOSHmd$*gtmL`Pb?r`0PN^cbc}#}gX_%j3!uKEvXO5sVrh z7U)geU>HXtmorNR=%fwPyHC)60+aMLOInTYNjkIT<$bVnWgm(1S0q2jjyaMRIRbBR zmgICCoJAhz=|({@B=Hqf^z9I^I|MAue#B(?3lfzBq&^{I)B}te;3N!i9x0M+eHHM2#8Fp>n=Wb8ft_(YJz-Q8(;MTPhDeZl@DzFVPKUV2E&mZ!7$$>2>0XNwg?~dwojTu zQ@Y&W;i0G3Bc-8fwm!A)0r15dqZi756J!-;aEF@fyL zKv4$lMl#ej*x68gAB#v0F|!6kE=){^ij0>WWjOYKPAHp01BQjknLsG}N$3%zxot%S z+v5F%u8A8IU|YtaEADtYC&#DO=)yBT;FQA6!1ZP11>G&7da`5TCT=m<2dub-!#HB0 zfJF;Sa2O7cn~V4R_BdlEZd=&I9fl)QF);gT@?U<@t6~ z(o@6;*x4z-_M2De_N`LlKnCxemt9!_77zOiBWWRldnL=(4v&+UFtUb*AhC@%QzaqVC z{Eqn)bm%m6=mHGr=!=Xh#ZtJ!(g}?9VSovY8nOK(fmy?8nrVhLoI#2FEaEeKO22`# hq|G8dlXgs$X{SQ#6skB!qe0f^u|l&P&GIzT_ZGK0#v=d# literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$5.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient$5.class new file mode 100644 index 0000000000000000000000000000000000000000..461dd7028b15c10287d32a60aa86c060a342c8cc GIT binary patch literal 1782 zcmb7EZFdtz6n>^zvTeGMG*YBkO3)}t=yuCXRT@-a1&s#iX(b%x(_}LwL$^D1cak1{ zgTKaepn#s^5Aa8Mypxwo(}1TrCv#`++?VIheeVAK&mVsQxQY!Ml^JAl*(}Q$?pT_#9u%;!E7Hv2LTvFyG^0@u>{O2G^a$=V937!8XHE zoky)$$(FY#n%h!)4IXyI=$;(Yx+9a~D#Mk!irXIFR9dDG2B#K9BKAX`B!Z6Dj*F|fMs?*>bUVF;!9*b*_p-4ub4Jy9?WEd(8<5)l_3ZPwQd4!*@*v)ps=9lp0w zbMOOxv{83(9}kF^$An#6V<=4U@duRN2)jgShB*~&b=01DPJe)hbZ?zDc+7W*K-;B* zUJNIQ#-Jg^UUgi5c(TTC$A+hPBvrNi3qz_@ZrFIpusSxj|LaZ++~sj1MtpTk@22Y{ zdZqd9u83L;ZmB-r$7=bAYS>!h9qJ6jDHRR**uNk`za4p00?qW&Se&sYpg^DO9DT*7ayc_5 z07;q|qoMyi&VYu3c0Qd`B(s&vFELeFeu-4&6|CR;hG%I_lOdRc1=^qKJ7;kYi*zEV zen@%(oX65I;BOS}1l_rd?rWS_xAN&fVgLLJ)A^ZwWEQM_%} z{!5pKMd`AzSq>N39F|$WpZfYB=s{{17pO*p1{W7;XR31XF+QR6HaF5FN%LF5EqrCo{0ne&>U97B literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebChromeClient.class new file mode 100644 index 0000000000000000000000000000000000000000..f7fbd213c03ae866e68378704e2553e06fdf3090 GIT binary patch literal 11016 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 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebView.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebView.class new file mode 100644 index 0000000000000000000000000000000000000000..9dfe6ede52c6eab5f8ff5e4ee743fa4c55c59c1e GIT binary patch literal 2658 zcmb7FZBr9h6n<_JvSeL?gbMWqgsL?pku}sx+gKGNAQ)(CFx0+pl3UmscA3ov>(A(~ z=odebkHrK%mrh_ApQ-p9U$E?fg0g}Y1r-5x z%al)w4O3dKfL^klHQm@WYU@(3*-qWwGIVLJnU>VcPn)jXSe4aE+n^wz)z%$*L+%0O zj{;EaFky&I!y)gpo||KE@C^t+378683Ugod<5;j<>HKKaBw567n3n0@6gZbI8CKn~ z%{qlk3YM!E`Tp50Oi*%SMY}Eq`b(66<<>@3Ix9xCL6TI-t{IJr;h6jmgfVyBYzj<- zkqAqoPu=q-aQaXp0@H`HY+JQlv!Tzpu47hPt}IJGfF6S+#OdrC^e9ZuhQMn2sLX@Z zhp8XPHs`Ug>>9PlOU7o9sev`=28uyLQSH*9iR)G?D0n1rvMJrJMidy|Ptg-ueQdgV zmx5Q#cr9r2(RMaMb*a3*gU&`3xDe)|Q^j*K7J}WSMD*)sbJK8Z>-Xi;*)4DI&g^6J zJnDP@6ehkB=#jqCa2vW?MWa4IklSfy+k#<{c$4v^U$`WmZrZmxrn9H-YUL`j3BnXK4__}x={k51JSXX(3}!v%T|`D(a`OY~xx_i>p(7%Uxt zEf83g|I1`^yNJ9FrW4pz4{Xd=I{?P86UYRva{=rx6cxkfGr4U3E=q=LCT7$$O_5yu;?V#^h#KdnT_6fv2l^M^G=Bo#e7*s)I z;I=|c1TPdixipL9kxP@zWdA{Y8$B5cE4iQ4q?eRA^kN=;xYtpoWIKi=?UieUCwSR} z;i}t6FmC_rxFy0}BHZOeai=|8T2TRRi`a6RMmPb_aWeY{1|nF>y+Chn2dQW5X7Cv) z_!&u2DuD+`qKp()sB0@7Wf*CPz-20sizNDSgG%L>p%>zR3@f-v?^}cu!EJm=cZz-u Q;UQMz38MZG-^LTK0OH}4x&QzG literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewClient.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewClient.class new file mode 100644 index 0000000000000000000000000000000000000000..4ded57898c175d4258b79c9edd9f205eecdb41cc GIT binary patch literal 9561 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 literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewEngine$2.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewEngine$2.class new file mode 100644 index 0000000000000000000000000000000000000000..4cb98c491017fc9dcd2db3c34b7c5d8e79e71aa8 GIT binary patch literal 1050 zcmb7D&2G~`5dJnvW9%9d+5%}QkV2qI3K%MGK}Zl4sUq}1AU$vFm9voUB72*b$3mhY zao_=X41U0NdDdv4HFLxZ$CUx`z$iba2Z-gTbHh zaU&JRNEN3H>piZbM9U~R62o`W1p8vx&u=>nWiyg#;{ij^(@7lg_dFblAk;~uCp-`; zmP!Qu52+Cc1RO|lw3FE^^s!XZJYm>t&WZhBO05AysjDNwQ0Y@ z9rE#jC(`P zW-fNK`;JZB$()Z3!|IIN6i=;_8G@lULY|tuT?xaz zxmX#N?egR+HQh&sV$(KpZ5nTOWoZXuVcw)7c^cD9`X-^m8CIIDo^3}k<|+a#L9{`fn6ljbQQ_XLIZ7Zg8cju+@GlOym06*@0x z;0mf(B8@;9B_oeztmK3*NLoU-{RxH7DDD5H@-p~O%H~%_S3h+;qjPbILfCLFuAr7> Zwn|z7Yq(0XgmqlQMf&o{Yk?#^e*g)x6Sn{W literal 0 HcmV?d00001 diff --git a/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewEngine.class b/platforms/android/CordovaLib/build/intermediates/classes/debug/org/apache/cordova/engine/SystemWebViewEngine.class new file mode 100644 index 0000000000000000000000000000000000000000..b71c6d858d23089d31c2d34b82e5c2e7a282b6a9 GIT binary patch literal 11406 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 + \ No newline at end of file diff --git a/platforms/android/CordovaLib/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/platforms/android/CordovaLib/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml new file mode 100644 index 0000000..768ba50 --- /dev/null +++ b/platforms/android/CordovaLib/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/platforms/android/CordovaLib/build/intermediates/incremental/packageDebugResources/merger.xml b/platforms/android/CordovaLib/build/intermediates/incremental/packageDebugResources/merger.xml new file mode 100644 index 0000000..bea94be --- /dev/null +++ b/platforms/android/CordovaLib/build/intermediates/incremental/packageDebugResources/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/platforms/android/CordovaLib/build/outputs/aar/CordovaLib-debug.aar b/platforms/android/CordovaLib/build/outputs/aar/CordovaLib-debug.aar new file mode 100644 index 0000000000000000000000000000000000000000..f9abc66ab2c9b087d6e28bc44fabf5f821dd9756 GIT binary patch literal 115057 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

MLLYT`dd9MzKKq1u56?9? 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 ZVlF2M`s*J<5PzS0KmY*qzaIbq{vUopEFAy< literal 0 HcmV?d00001 diff --git a/platforms/android/android.json b/platforms/android/android.json index 69b5493..13ec78a 100644 --- a/platforms/android/android.json +++ b/platforms/android/android.json @@ -9,7 +9,59 @@ "parents": { "/*": [ { - "xml": "", + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", "count": 1 }, { @@ -21,31 +73,56 @@ }, "AndroidManifest.xml": { "parents": { - "/manifest/application": [ + "/manifest/application": [], + "/manifest": [ { - "xml": "", - "count": 1 - }, - { - "xml": "", - "count": 1 - }, - { - "xml": "", + "xml": "", "count": 1 } ], - "/manifest": [ + "/*": [ { - "xml": "", + "xml": "", + "count": 5 + }, + { + "xml": "", + "count": 2 + }, + { + "xml": "", "count": 1 }, { - "xml": "", + "xml": "", "count": 1 }, { - "xml": "", + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 2 + }, + { + "xml": "", + "count": 2 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", + "count": 1 + }, + { + "xml": "", "count": 1 } ] @@ -57,7 +134,49 @@ "cordova-plugin-compat": { "PACKAGE_NAME": "com.netsyms.SnipeITMobile" }, - "phonegap-plugin-barcodescanner": { + "cordova-plugin-dialogs": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-file": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-media": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-file-transfer": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-media-capture": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-device-orientation": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-device": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-battery-status": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-camera": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-contacts": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-device-motion": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-geolocation": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-vibration": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-network-information": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-console": { "PACKAGE_NAME": "com.netsyms.SnipeITMobile" }, "cordova-plugin-whitelist": { @@ -67,16 +186,454 @@ "dependent_plugins": {}, "modules": [ { - "file": "plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js", - "id": "phonegap-plugin-barcodescanner.BarcodeScanner", + "file": "plugins/cordova-plugin-dialogs/www/notification.js", + "id": "cordova-plugin-dialogs.notification", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-dialogs/www/android/notification.js", + "id": "cordova-plugin-dialogs.notification_android", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js", + "id": "cordova-plugin-file.DirectoryEntry", "clobbers": [ - "cordova.plugins.barcodeScanner" + "window.DirectoryEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryReader.js", + "id": "cordova-plugin-file.DirectoryReader", + "clobbers": [ + "window.DirectoryReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Entry.js", + "id": "cordova-plugin-file.Entry", + "clobbers": [ + "window.Entry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/File.js", + "id": "cordova-plugin-file.File", + "clobbers": [ + "window.File" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileEntry.js", + "id": "cordova-plugin-file.FileEntry", + "clobbers": [ + "window.FileEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileError.js", + "id": "cordova-plugin-file.FileError", + "clobbers": [ + "window.FileError" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileReader.js", + "id": "cordova-plugin-file.FileReader", + "clobbers": [ + "window.FileReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileSystem.js", + "id": "cordova-plugin-file.FileSystem", + "clobbers": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js", + "id": "cordova-plugin-file.FileUploadOptions", + "clobbers": [ + "window.FileUploadOptions" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadResult.js", + "id": "cordova-plugin-file.FileUploadResult", + "clobbers": [ + "window.FileUploadResult" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileWriter.js", + "id": "cordova-plugin-file.FileWriter", + "clobbers": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Flags.js", + "id": "cordova-plugin-file.Flags", + "clobbers": [ + "window.Flags" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js", + "id": "cordova-plugin-file.LocalFileSystem", + "clobbers": [ + "window.LocalFileSystem" + ], + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Metadata.js", + "id": "cordova-plugin-file.Metadata", + "clobbers": [ + "window.Metadata" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ProgressEvent.js", + "id": "cordova-plugin-file.ProgressEvent", + "clobbers": [ + "window.ProgressEvent" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems.js", + "id": "cordova-plugin-file.fileSystems" + }, + { + "file": "plugins/cordova-plugin-file/www/requestFileSystem.js", + "id": "cordova-plugin-file.requestFileSystem", + "clobbers": [ + "window.requestFileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js", + "id": "cordova-plugin-file.resolveLocalFileSystemURI", + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/browser/isChrome.js", + "id": "cordova-plugin-file.isChrome", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/android/FileSystem.js", + "id": "cordova-plugin-file.androidFileSystem", + "merges": [ + "FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems-roots.js", + "id": "cordova-plugin-file.fileSystems-roots", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js", + "id": "cordova-plugin-file.fileSystemPaths", + "merges": [ + "cordova" + ], + "runs": true + }, + { + "file": "plugins/cordova-plugin-media/www/MediaError.js", + "id": "cordova-plugin-media.MediaError", + "clobbers": [ + "window.MediaError" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/Media.js", + "id": "cordova-plugin-media.Media", + "clobbers": [ + "window.Media" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransferError.js", + "id": "cordova-plugin-file-transfer.FileTransferError", + "clobbers": [ + "window.FileTransferError" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransfer.js", + "id": "cordova-plugin-file-transfer.FileTransfer", + "clobbers": [ + "window.FileTransfer" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js", + "id": "cordova-plugin-media-capture.CaptureAudioOptions", + "clobbers": [ + "CaptureAudioOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js", + "id": "cordova-plugin-media-capture.CaptureImageOptions", + "clobbers": [ + "CaptureImageOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js", + "id": "cordova-plugin-media-capture.CaptureVideoOptions", + "clobbers": [ + "CaptureVideoOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureError.js", + "id": "cordova-plugin-media-capture.CaptureError", + "clobbers": [ + "CaptureError" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFileData.js", + "id": "cordova-plugin-media-capture.MediaFileData", + "clobbers": [ + "MediaFileData" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFile.js", + "id": "cordova-plugin-media-capture.MediaFile", + "clobbers": [ + "MediaFile" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/helpers.js", + "id": "cordova-plugin-media-capture.helpers", + "runs": true + }, + { + "file": "plugins/cordova-plugin-media-capture/www/capture.js", + "id": "cordova-plugin-media-capture.capture", + "clobbers": [ + "navigator.device.capture" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/android/init.js", + "id": "cordova-plugin-media-capture.init", + "runs": true + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassError.js", + "id": "cordova-plugin-device-orientation.CompassError", + "clobbers": [ + "CompassError" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassHeading.js", + "id": "cordova-plugin-device-orientation.CompassHeading", + "clobbers": [ + "CompassHeading" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/compass.js", + "id": "cordova-plugin-device-orientation.compass", + "clobbers": [ + "navigator.compass" + ] + }, + { + "file": "plugins/cordova-plugin-device/www/device.js", + "id": "cordova-plugin-device.device", + "clobbers": [ + "device" + ] + }, + { + "file": "plugins/cordova-plugin-battery-status/www/battery.js", + "id": "cordova-plugin-battery-status.battery", + "clobbers": [ + "navigator.battery" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraConstants.js", + "id": "cordova-plugin-camera.Camera", + "clobbers": [ + "Camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverOptions.js", + "id": "cordova-plugin-camera.CameraPopoverOptions", + "clobbers": [ + "CameraPopoverOptions" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/Camera.js", + "id": "cordova-plugin-camera.camera", + "clobbers": [ + "navigator.camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverHandle.js", + "id": "cordova-plugin-camera.CameraPopoverHandle", + "clobbers": [ + "CameraPopoverHandle" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/contacts.js", + "id": "cordova-plugin-contacts.contacts", + "clobbers": [ + "navigator.contacts" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/Contact.js", + "id": "cordova-plugin-contacts.Contact", + "clobbers": [ + "Contact" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/convertUtils.js", + "id": "cordova-plugin-contacts.convertUtils" + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactAddress.js", + "id": "cordova-plugin-contacts.ContactAddress", + "clobbers": [ + "ContactAddress" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactError.js", + "id": "cordova-plugin-contacts.ContactError", + "clobbers": [ + "ContactError" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactField.js", + "id": "cordova-plugin-contacts.ContactField", + "clobbers": [ + "ContactField" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFindOptions.js", + "id": "cordova-plugin-contacts.ContactFindOptions", + "clobbers": [ + "ContactFindOptions" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactName.js", + "id": "cordova-plugin-contacts.ContactName", + "clobbers": [ + "ContactName" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactOrganization.js", + "id": "cordova-plugin-contacts.ContactOrganization", + "clobbers": [ + "ContactOrganization" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFieldType.js", + "id": "cordova-plugin-contacts.ContactFieldType", + "merges": [ + "" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/Acceleration.js", + "id": "cordova-plugin-device-motion.Acceleration", + "clobbers": [ + "Acceleration" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/accelerometer.js", + "id": "cordova-plugin-device-motion.accelerometer", + "clobbers": [ + "navigator.accelerometer" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/android/geolocation.js", + "id": "cordova-plugin-geolocation.geolocation", + "clobbers": [ + "navigator.geolocation" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/PositionError.js", + "id": "cordova-plugin-geolocation.PositionError", + "runs": true + }, + { + "file": "plugins/cordova-plugin-vibration/www/vibration.js", + "id": "cordova-plugin-vibration.notification", + "merges": [ + "navigator.notification", + "navigator" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/network.js", + "id": "cordova-plugin-network-information.network", + "clobbers": [ + "navigator.connection", + "navigator.network.connection" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/Connection.js", + "id": "cordova-plugin-network-information.Connection", + "clobbers": [ + "Connection" ] } ], "plugin_metadata": { "cordova-plugin-compat": "1.0.0", - "phonegap-plugin-barcodescanner": "5.0.0", + "cordova-plugin-dialogs": "1.2.2-dev", + "cordova-plugin-file": "4.2.0", + "cordova-plugin-media": "2.3.1-dev", + "cordova-plugin-file-transfer": "1.5.2-dev", + "cordova-plugin-media-capture": "1.3.1-dev", + "cordova-plugin-device-orientation": "1.0.4-dev", + "cordova-plugin-device": "1.1.3-dev", + "cordova-plugin-battery-status": "1.1.3-dev", + "cordova-plugin-camera": "2.2.1-dev", + "cordova-plugin-contacts": "2.1.1-dev", + "cordova-plugin-device-motion": "1.2.2-dev", + "cordova-plugin-geolocation": "2.2.1-dev", + "cordova-plugin-vibration": "2.1.2-dev", + "cordova-plugin-network-information": "1.2.2-dev", + "cordova-plugin-console": "1.0.4-dev", "cordova-plugin-whitelist": "1.2.2" } } \ No newline at end of file diff --git a/platforms/android/assets/www/cordova_plugins.js b/platforms/android/assets/www/cordova_plugins.js index 41666c7..49f340e 100644 --- a/platforms/android/assets/www/cordova_plugins.js +++ b/platforms/android/assets/www/cordova_plugins.js @@ -1,10 +1,434 @@ cordova.define('cordova/plugin_list', function(require, exports, module) { module.exports = [ { - "file": "plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js", - "id": "phonegap-plugin-barcodescanner.BarcodeScanner", + "file": "plugins/cordova-plugin-dialogs/www/notification.js", + "id": "cordova-plugin-dialogs.notification", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-dialogs/www/android/notification.js", + "id": "cordova-plugin-dialogs.notification_android", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js", + "id": "cordova-plugin-file.DirectoryEntry", "clobbers": [ - "cordova.plugins.barcodeScanner" + "window.DirectoryEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryReader.js", + "id": "cordova-plugin-file.DirectoryReader", + "clobbers": [ + "window.DirectoryReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Entry.js", + "id": "cordova-plugin-file.Entry", + "clobbers": [ + "window.Entry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/File.js", + "id": "cordova-plugin-file.File", + "clobbers": [ + "window.File" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileEntry.js", + "id": "cordova-plugin-file.FileEntry", + "clobbers": [ + "window.FileEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileError.js", + "id": "cordova-plugin-file.FileError", + "clobbers": [ + "window.FileError" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileReader.js", + "id": "cordova-plugin-file.FileReader", + "clobbers": [ + "window.FileReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileSystem.js", + "id": "cordova-plugin-file.FileSystem", + "clobbers": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js", + "id": "cordova-plugin-file.FileUploadOptions", + "clobbers": [ + "window.FileUploadOptions" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadResult.js", + "id": "cordova-plugin-file.FileUploadResult", + "clobbers": [ + "window.FileUploadResult" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileWriter.js", + "id": "cordova-plugin-file.FileWriter", + "clobbers": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Flags.js", + "id": "cordova-plugin-file.Flags", + "clobbers": [ + "window.Flags" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js", + "id": "cordova-plugin-file.LocalFileSystem", + "clobbers": [ + "window.LocalFileSystem" + ], + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Metadata.js", + "id": "cordova-plugin-file.Metadata", + "clobbers": [ + "window.Metadata" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ProgressEvent.js", + "id": "cordova-plugin-file.ProgressEvent", + "clobbers": [ + "window.ProgressEvent" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems.js", + "id": "cordova-plugin-file.fileSystems" + }, + { + "file": "plugins/cordova-plugin-file/www/requestFileSystem.js", + "id": "cordova-plugin-file.requestFileSystem", + "clobbers": [ + "window.requestFileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js", + "id": "cordova-plugin-file.resolveLocalFileSystemURI", + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/browser/isChrome.js", + "id": "cordova-plugin-file.isChrome", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/android/FileSystem.js", + "id": "cordova-plugin-file.androidFileSystem", + "merges": [ + "FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems-roots.js", + "id": "cordova-plugin-file.fileSystems-roots", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js", + "id": "cordova-plugin-file.fileSystemPaths", + "merges": [ + "cordova" + ], + "runs": true + }, + { + "file": "plugins/cordova-plugin-media/www/MediaError.js", + "id": "cordova-plugin-media.MediaError", + "clobbers": [ + "window.MediaError" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/Media.js", + "id": "cordova-plugin-media.Media", + "clobbers": [ + "window.Media" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransferError.js", + "id": "cordova-plugin-file-transfer.FileTransferError", + "clobbers": [ + "window.FileTransferError" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransfer.js", + "id": "cordova-plugin-file-transfer.FileTransfer", + "clobbers": [ + "window.FileTransfer" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js", + "id": "cordova-plugin-media-capture.CaptureAudioOptions", + "clobbers": [ + "CaptureAudioOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js", + "id": "cordova-plugin-media-capture.CaptureImageOptions", + "clobbers": [ + "CaptureImageOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js", + "id": "cordova-plugin-media-capture.CaptureVideoOptions", + "clobbers": [ + "CaptureVideoOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureError.js", + "id": "cordova-plugin-media-capture.CaptureError", + "clobbers": [ + "CaptureError" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFileData.js", + "id": "cordova-plugin-media-capture.MediaFileData", + "clobbers": [ + "MediaFileData" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFile.js", + "id": "cordova-plugin-media-capture.MediaFile", + "clobbers": [ + "MediaFile" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/helpers.js", + "id": "cordova-plugin-media-capture.helpers", + "runs": true + }, + { + "file": "plugins/cordova-plugin-media-capture/www/capture.js", + "id": "cordova-plugin-media-capture.capture", + "clobbers": [ + "navigator.device.capture" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/android/init.js", + "id": "cordova-plugin-media-capture.init", + "runs": true + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassError.js", + "id": "cordova-plugin-device-orientation.CompassError", + "clobbers": [ + "CompassError" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassHeading.js", + "id": "cordova-plugin-device-orientation.CompassHeading", + "clobbers": [ + "CompassHeading" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/compass.js", + "id": "cordova-plugin-device-orientation.compass", + "clobbers": [ + "navigator.compass" + ] + }, + { + "file": "plugins/cordova-plugin-device/www/device.js", + "id": "cordova-plugin-device.device", + "clobbers": [ + "device" + ] + }, + { + "file": "plugins/cordova-plugin-battery-status/www/battery.js", + "id": "cordova-plugin-battery-status.battery", + "clobbers": [ + "navigator.battery" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraConstants.js", + "id": "cordova-plugin-camera.Camera", + "clobbers": [ + "Camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverOptions.js", + "id": "cordova-plugin-camera.CameraPopoverOptions", + "clobbers": [ + "CameraPopoverOptions" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/Camera.js", + "id": "cordova-plugin-camera.camera", + "clobbers": [ + "navigator.camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverHandle.js", + "id": "cordova-plugin-camera.CameraPopoverHandle", + "clobbers": [ + "CameraPopoverHandle" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/contacts.js", + "id": "cordova-plugin-contacts.contacts", + "clobbers": [ + "navigator.contacts" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/Contact.js", + "id": "cordova-plugin-contacts.Contact", + "clobbers": [ + "Contact" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/convertUtils.js", + "id": "cordova-plugin-contacts.convertUtils" + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactAddress.js", + "id": "cordova-plugin-contacts.ContactAddress", + "clobbers": [ + "ContactAddress" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactError.js", + "id": "cordova-plugin-contacts.ContactError", + "clobbers": [ + "ContactError" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactField.js", + "id": "cordova-plugin-contacts.ContactField", + "clobbers": [ + "ContactField" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFindOptions.js", + "id": "cordova-plugin-contacts.ContactFindOptions", + "clobbers": [ + "ContactFindOptions" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactName.js", + "id": "cordova-plugin-contacts.ContactName", + "clobbers": [ + "ContactName" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactOrganization.js", + "id": "cordova-plugin-contacts.ContactOrganization", + "clobbers": [ + "ContactOrganization" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFieldType.js", + "id": "cordova-plugin-contacts.ContactFieldType", + "merges": [ + "" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/Acceleration.js", + "id": "cordova-plugin-device-motion.Acceleration", + "clobbers": [ + "Acceleration" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/accelerometer.js", + "id": "cordova-plugin-device-motion.accelerometer", + "clobbers": [ + "navigator.accelerometer" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/android/geolocation.js", + "id": "cordova-plugin-geolocation.geolocation", + "clobbers": [ + "navigator.geolocation" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/PositionError.js", + "id": "cordova-plugin-geolocation.PositionError", + "runs": true + }, + { + "file": "plugins/cordova-plugin-vibration/www/vibration.js", + "id": "cordova-plugin-vibration.notification", + "merges": [ + "navigator.notification", + "navigator" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/network.js", + "id": "cordova-plugin-network-information.network", + "clobbers": [ + "navigator.connection", + "navigator.network.connection" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/Connection.js", + "id": "cordova-plugin-network-information.Connection", + "clobbers": [ + "Connection" ] } ]; @@ -12,7 +436,21 @@ module.exports.metadata = // TOP OF METADATA { "cordova-plugin-compat": "1.0.0", - "phonegap-plugin-barcodescanner": "5.0.0", + "cordova-plugin-dialogs": "1.2.2-dev", + "cordova-plugin-file": "4.2.0", + "cordova-plugin-media": "2.3.1-dev", + "cordova-plugin-file-transfer": "1.5.2-dev", + "cordova-plugin-media-capture": "1.3.1-dev", + "cordova-plugin-device-orientation": "1.0.4-dev", + "cordova-plugin-device": "1.1.3-dev", + "cordova-plugin-battery-status": "1.1.3-dev", + "cordova-plugin-camera": "2.2.1-dev", + "cordova-plugin-contacts": "2.1.1-dev", + "cordova-plugin-device-motion": "1.2.2-dev", + "cordova-plugin-geolocation": "2.2.1-dev", + "cordova-plugin-vibration": "2.1.2-dev", + "cordova-plugin-network-information": "1.2.2-dev", + "cordova-plugin-console": "1.0.4-dev", "cordova-plugin-whitelist": "1.2.2" }; // BOTTOM OF METADATA diff --git a/platforms/android/assets/www/css/main.css b/platforms/android/assets/www/css/main.css index 537f8ad..e69de29 100644 --- a/platforms/android/assets/www/css/main.css +++ b/platforms/android/assets/www/css/main.css @@ -1,17 +0,0 @@ -.brandlogo { - margin-top: 20px; - margin-left: auto; - margin-right: auto; - margin-bottom: 15px; -} - -.splashlogo { - margin-top: auto; - margin-left: auto; - margin-right: auto; - margin-bottom: auto; -} - -.btn-wide { - width: 98%; -} \ No newline at end of file diff --git a/platforms/android/assets/www/img/logo.png b/platforms/android/assets/www/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5b6fa82d14ad75b780455ca30c7a8a27e3ec40 GIT binary patch literal 16260 zcmd73bySsI@IU&1U|Hd=Y7BTx7Jmymf*=>=WF^%Rgb;ou zM9!XuADiy|`|yLvNkUHZEPQ#Lef}Q)f9{2>t`m&M;J*nZSQFjhLn>#f$Icq|X3lO; z9ZeB8H#ZJTJ8LJCr!P!7>>bS$SA=gM2pu9P`B2mSBW}#i{no&@rYR>ko!a&fvmC7- zn5v#WE51nCm$*<%^`2lyeEzocaR1wDvZDWtU7=&V9sM?v=q!;$z^`*FldsQL^6T2p z9W*{Mc&_lp>`&Lq;rQHMPfia;qNi05X5gX71q8YK?eUyya#QHpH+ij&)&xC__ibg zsNpRu{QC9^F$}(v2EYDq8r)=aX07+(8S0Ejmqq$rFCgNC9#iiqHm8F*v8bu|3=ZVY znahJO=aS5YP9t;#_jJF!B}C{Re8Al6DRrXl87=3wmHDeF&7-eIs-@<^veki0_t~qt zBgEA0dY8^p74aj|2*(;_$9^iRsQ1?0QK^^Pz;vOhTPd!RYMs1(DEQ@o>IQa-PD-)g zm60wLbn?lo#^;q;;l2U;;s+~llhDN(m&l9`ix2lr1lp8awd7nmubVr^L=3M~g@kO+ zzeqVvfy>LT_ffsv`PF4+FH&pNvY(}Wya&G3Ove$!p&gw&?Kx%C=Vc$0Aq@xUnn!1;QXHN!l_h;|z*L6Hbw|&Xu`Fu2vt?8RujMS~}G%;b$B5iB7h~4&FXjbtp z6tFg{j20crDmav!tM$z17+JW48=pc(9Q@wG=^60Z?O{5HDCfyKDqqMItdgiJ;@@lMS9tN0YE+0$gik_(qVqCHlMFInUsTi;_6JP19t z+54Jh_Q7A~u=WsB>)wU~mnU;G22}i4c^+J>K8|uKD>f^{v5J2O8?^oXv!`@}W+1NO z(qKJ>NKNPEd9+@!9m?)_`I+JVw*|c~K59`dl1hpcI|t>LRvgn(HXB3 zeamhiAILj@VkUGtT$L4RxTL3Bp;+&JLRPyomRA>6TkZ3X+57&(?hfzDR!nH%e5}xs z^la6Um$F&+QJ=lK(v08;m*3lm1c++`oLBW)Eh(?y z4Qn?H+fcLnA3IP?OB4%XrK?}4Psvh}At^CnMY+co`F{$MOof6N7b0}s=1X+zt=G#@ zRAbH$>l3|{pLZMA)v25x>@0zI&f?$k*=XY2+FReTZ5irVH9wXvy5~{Yit)dG88c3O zc|#zAdh4&?7&q=;;lv3Ly{U4k?uA)ml@V0Qb(wz^>RmOR&TLF;?BZgBGWF-PdN<5L>X9MV(KEDcI(O0wZ?Cr4;Tq&f@SkRI3I{&TS)mq0?6^ zK%95XDz)11)-bBX5TxvhrmEoE!%mHbgeo)5haz*_}<^v zq#nlU(XzSSfy?fH6YJ+oXIF<&1Vq<}ks*}URy(h0^F6f5a=487SkG@V_w0}r!K~kk z=K~Mte)jy%i6V2mVJkyG7(j^Fw4|5%|1T|=ydU#cU~|&nqn=meT-|{ zLvDhVlY`AwdoGrvO)3|s;wvn5aTWUBwJOIPSa!w(q8~}pO38vbN^_qrALrF%DfjPI zT+-52j=^TTIkQnuijg42@3Q|0e}2d7WZUv$pxU3;$eqL;1B>~;BIv)zwBQDL#Q znJ0ITJ@e|jBhtYuWR{K(8FzQQlk7Ob-QdgdI#2{>S-y9I{%Vm2n$W0E`Tud@@p znCrYfWRg?`u@dw`E6ER2+0H!Z(K`?Ln+WElc-3=W#YlqH5 zW@D$1l}2$Vm0ia^)xPa454#F0HLsFxF)&ZEksv9wzCy0xiKeUAxb1BnbsD{es55P!%~D@y zd{JpRW%tdIAazdA=&>j>(N`$~@%f{t+e!O&M-n4kUQT93!7;IV#hsWIEyGL*NMV7? z@l}iG#}0?3l$3Yu?}#Mis9mq$WV=3jnFNu*CAt_d1(J_mO}^{#dvoxqp~~}hI%D9O20f-*LK_!aN@7Mm5)+G<8zhbs6Yn{nW0cE=!C;hSs(mFSAl|Y3y+5J=5TdEa3o-;7PU$?lZ%IQJ6T`v}S69$!jv8$pw1$t&B1D~oM)RsF<(V$I`d}y>&?_t3H8s_46)P-A)Gb(UcJH zURRsPjGzeIg9!aphX?K4TYtvAXVx^twe{A?xY6bm>Y8$7kl+D>^mg@->xBjwMhA?xR($(8W>B_>AXR!6qZZ|*MFfLSYH^6yjYJAPo9TS?X`Y^(`g z`#p-@YQq(s65_8_pbrmWMPxlR%trIE%{RdOxT~ifo9Nk+lTKhpbWP%uv>O^Pt3syk zU7h--A{2?8YZv>)e*V}Bgg9M3pE zW`4L}`UCN3VLCW2a1ZU?d38+s^WE&;*pjd0++3j-TS+f9WPt#BoE+}z;L+`1TGYHx zwS6!~Qc-gzuW;M+Zqdb6k1y3`Tg9+9urxVK+eRyq2S*sN9cIpQ@$4PpZVZ$ugWIJ@?s*?ExNrUl7QLFm{-L=Tkj73n{NnSJzpB0y9xS~r6ME&0HVebGXF+kVb}6~(YyIXEOo%u?k1Q}7eJD`chFlxd4)x+?2ThAqx8a@?5v25QJl{_MGEl;@3@F5cdeOW?k`JD|{s|}7o@w9Y=ZsDR0zh=~qyAfzX zTl;Q{>n%)%6gN-d;++vLM!CkCkDtMRK(HH%YhyPUhIO8U0ZMfIa8_)M_i!)5I6Jq> zN<~f{`{6wRYi$&cGLp|mM7XX(NdK~@ZP=wVIlkYXz_ypbEyRpQ6DobKmae#ToNlc@ zi&c#qe8}o8HyShDXad27qTQ=yaRdPr*zC4`aU`co25}b03>GlX^qFtmyb~ zKxDs9$1RV;$XZCd6fPo3$3+`FqyZ$bx#CtdgzC-z810o5@!XRVvHf-dk>I?SklNSY zjfs9*wCLB>GK4BMY?kCnUA(b`!D9IG2Msk?tom=BVf+zL&zLl7@;as|(k}&as0nuY z)ePg!dL{nL`)@pcYYwCOGTsQ%7Ojug4K{}fg?e~&ksWPr)oyis3;<8|xV`sA61Rf0 z;!Xs9yWg3RC+ESDVUlXZ@_cDj#c*L-d>POvO-jbop=>v+{+Ye;+a&TahT?q>b z!Y+}b2K!m7CN-({$AzG$r}*U?VR<1(^>tp@=a|suCv5qV(V(Mq=ba7jvHcjAcIN|% zSnEUm0H)=D`iLGd&4LMT0-~$ji1>Nu_Qjl=t}h?2dhKwIZOux8`mwej&lDu_` zR^46onGjNxaSkZ^nE}2+og;E<&V1X)1(nk`Pev*2HI-%(3hIjNg4fGuZKRB>Qmf5k zsy%R!>n50%2e}6-S|2nPz=P7? zODHU}*f%p)=r`Y@z;s}|`|SHWw2bG+Q%^F8=+-LFU9m`S`$|x4@-wPB?@iBN^x>VdfIV%F9BmlpdqS0dZ5R_*EHA^I)^6t>PZq2F+-|hza{Kw@_1|?@ z8ty@w{0L5UVC>OJ;a@EscJ2>jX{%I&4wd_VRu>)amoaldQ!3=ix@D(C6}_-Q=vK%ZF0l6U?ZYGe0S48VaQ{0r+mOiosdHj3?dipV?$D+_Yj4-b5E-&>0RbG{nbl{ z_e#Fn1s-n>jBzlY8kHhI?*8YLJf3vNx_ESNMBk9>i?8Jvwo<#bYc5l`QPEFoJdtNV z=#9hfA^gSH=prT3`%)78%Ws~1tt*k<>Ize6Dl9NA|9i2v$Fjd#2~}X5KWw9PVmPuo zFnx0yi-&A@uLUqeJvLw6xcSGRk@4p1l}|oV=83|*KbE$Bh3Gps`JHV1K5RgxASs>G z%IU|o^SS`3BQh>pr($d!OZ%(+Y5Cs;vKP7}+MF$&)myW^sm;Ff;AVHtLU|u{*JHre zA%Etu((LQMA+401!{zAfh>1z3hb*_YcUG%L(ZF2$#Ew@!hFqkGq2^QSG4UG_+Vd9Y zND%DZXKC2H-G4-cR@IJt{@8ns{p~!DzwV7S$@yLJOz89mhG45d3tgOfTi}&<1y}4( z+%lP0|Gs|aUtu)VB7(e-x*M5hBHz{D=vkYUt{~04NzZrjuZL2+LokkVt>H3ePp1B5 z_$uvjBoCxVB4VqT>%z|SfM3*^%_6gq7~rjTn-{~Dkrmp)#W6C@-)(TcP|3K$gI;*) z!!IJd!B>#4Z)fW@d4>#ePxI8?YtDS3@C7nMOI{fi_}o)@l}xX?W9y5YCIqrNyEke~ zm5$^^?k~AQcq2i+@)nP&Dvi&)Oq$p^J)22BgzCFvT(~Q1fA=^5M>+HmzqQ=U-GlE| zlRi^%2zRe$0W!=Q&dbK4UWKP44NhF7eW`{jJ#Reg(xTd$*~sNesB@ZDKDqXpg`K6} z9Rzv@!p>qo|8|9AQauwK9pq94ILfmEB#2j3RAdpH#Xzm+;UiBM;eOYTp1i>d5qMspHfy){J~b78xK z45cf-7Wc2CO`Zse>K`X}?fHxyo0d;tQGL&L6l;7+%kLp#YRHq$2G>VhzBNZmp5(O8 zgxXvSa*T6W>gu{(FYr9I#65#lqN#fKNQ1{|U=BS~hD}R&xxe%=z_vwP7G55}`t$C) z509Wtc$PSgC$fo`{tTgBtscEdI@!boEMyX^czmJHFs4az3HabuAH+P#LW1Ob*bGwZ zY1H?+hM3{)d97o_rsZs{WKGw^HDHJ~Cqs-!P_KZ^Y)B}=C}MzjDhHb3xOPqV$iB(f zw&iSrWGxIm(OU}{U1!3?wXI(ZK0EjmlP*53=qKOwrd?*mKzU)E>e&Noxt@WV<+vwdl*{t2~#0yi;rqP55LB(S zZ9+%HimWN6iELv&X3r`1OeffbUf(T83nz_lcmZ7B*skDQI$|n<85v~={Op-ohD>}r zbAmBeZ6W$FG!y{8?E6}VQOEB7B|tWCl8n*>ew^b6D_Y*seql$va|7>u2g+hTVNq8} zu96N^=H}rA1v+RkMsHrN*On+?YeRA%Y&zg~!!RL{9dTBVX9x_ZhAj(w$$aiJ9FBb^_Z#)=0A^a4t zFik#XNOmDXl>)lgyU*@_26ubanpG#qAB2N=@jzIRpIMhPyQ`mmhZA@U{u9G}TJJB* z)FWKs&q2K%c;ZPVt>riYGR}B>SU{V+Z6-(xQ_~vn!e^*J5SCIC$oYd1UX`1n8D1cS zN_Tu3aErsBHEC&+yu$E^66z)jT24=eJ{@o1HzUsyBZUf^W5?JubcyukuHAARWoi$< zuMYLEJxct+h3)x%fk}Zx$1ok>wS{?YzN^$J12Sru-5qhgVEh$5{}P?%Z_SFl7)bEf z+HYKbVVvjud;Z%(2jOleU3o2vlNvHjPHjxluk7}Ta?lfyD>@>=Guql5eg2+w<9jQ{ z_^q^>&I~Y>0;g~6Rd?t;ay6V0rtI_|JEke6X7~s1K!Z>1F_O#SSr4FOf-Tv_N8t+kGc-K$q4@w9;6UN>x4Q~GYZD-k0BgiITk zM)?7r{Br6>r!hx%raXiT)lYhKlM-N8R?xzb=6Bb@q(O|g31GdP49`ff zk}6?a2%Xf|pI@*avk>wL`eoMYQ>zszt#zobTk?^d);Ol3)Td^oFM(&x$E9taL+)Sp zW~WByYtZ|97p&^Tphg1Mp>QdpZv-~+Z`@~R(ivuJ6=Kp&9#H}Q(>0*Zts?EnrTbU? z5^Mx6Y!(~0oml}9ZD{Up=CcU05iVd~?}bkRpvHFm{OlH4$3{g3iDR{rMj_Ddq0252 zG(#JvF0FU_6wW`s^^?=Ew9VNWpF~yWsvL{|kL5MlQC}*i{zeM%Q1OW5G%zG^VAWQ0 zHU0b(NgJuA(wo9MkQ3RoypWRS(Ga@6g1=7STnmS4W}dcLOkb^(`~XmLzOCIrY!#i% z=*R!%nE>QlkeXIL>zAziDilcn-?Y5z^>PtJZ z5iaa<3P;N@%8yZkz|UHFh3nzJp5%p8z-E_ViA_F?4dl9tPm86SU8AW78M68NPF`FG zIa-5eEuzn8{NW2Js8+Y^xiG>tnFhS0)k&8OQ2vcTQu3spzwjDZY`EBxTiE6WnEpO<+PPX%w_IMTtRT`( zd@;i1ub^@B9r@Mh7qPC8IXQW#{Ewf*Y_(2EonfBuln-zd;bpTUS0KZ~nUdl94VR9n z_U1eVvz#ImbQ7T2Df4T|5OYWw+7rjAIDg_*R(l8`L}Iqil0O&iP+Me@C8^H)1tV35 zs!GT6mnI6`P&SbZ0=HMDviiBtgL&{nzIn89IM4ZJ#@BB3o>C{ehi>d9t7Cs(;Ck)i zVoLOLVLj%HUscpdOR0(RZ+73(chvrV*Fz)0Fcnaz9r*12CTrf8i;Q_xKoVxolaKJ7 z!6$8n6SKDg3=W}QdHF8YhjGMqWEB~zD z8NZhjl2+B`I9hk)!6W9!9+m2W>iK4qq3%lcN8HM&AQnZMubbkND793$A;Fi_Zx-n3!2jy_;e{ zROwu*)ZkxUF9v^7Fe|Aa{@>m$aLJU^CPR?BWe%|pKbNB(GD zBuyvYmGHjYp(xX7dE`w?3yV?+u$JR;m7EV<<&))0J#!dqBx*N&(m)jj-^=JRU6;#%Z>$T9 z``oN!SfDU2HsDHzzcLYi<8g5zEAg(i;QR5FD#KEb`R%b}JTG7?sNyPLct2gYEo652 zSHMw+)~7rfWqTjdDLi8CM_YYH5SlG~F92`K3%85xGTjyPkP%N&Wca&CAq=_j_F#-x6^nYlaTeI@HF3dSRXGZWIsX1nZp3g1D>q zMeQDoh?occ$&UxjK?f8Brk>(R$#;Lzt`mYDpUu2!!m)95;(7>i2@{ z^y`0BaE)ZU^~;&gc-`b&{xHaK=`hsSCl81MmDu_`{(5h<6Wz_%029Y|v3}pj%FX}Y zChxm#!-^CG8<7eue}CwwB9El+ zfOX6!lw}s*?fK$M<=bBQNhARl^~y4~TU(WVpY_E~r08grHsudCmFp<{c480pi#QJT zgTutO%Ev?$NxcHxZl=-*)I#3y^93ngzF@Xn`P>1~;o9y~4Wq+9oN`A~_K&>3D!X|L z^tgt+jYw2a0nP`qDtsQ08@WtEjqMz9A-J^QnC9_kb9iwHwt=q?CZnjORXSg)PUIh8 z;XMbv?oaIaHi8TIo`}IDU7rZ^1ES|GjxJCsN%X=67Of7fS2HDt+|&-XuIquap|z0o zch=6rUsuOefNH-DG2dmF?IqsbsdRZmC{G-Hio+A+KQKEU_s!zQ#Ezr~_y&hi5&wWo zD)>C5eRt>~fjHf*9^1FT6;^q4;bk2-%2uk|UJDr^EM@Wj;_lmO{c2>9|0lld;1$jv zzbhbZuh28+I&g@c=JmN*Z>VIv6>ns;Tb5_?Zp{DYNv>^+EG6WUm2K>Jjj175D1|6i zQd67G)HoL2mO8NAsL1ooHsovxths-Q&)ux+(daIQM8;L@5!@ZX?U0MosWxjHrS{9} zC3ZzzlN;*2(l;yZ&KhtX@iA+mSwUeu$g|A}E8&-04-p%=h+Kh#!`AN}F1{?X}Hs#%IVLLaP!P6MyI29Vk=U|TJg?{2Q6RoExq zJ?zBXiNj15`->JJ5HL$1)U&bDHr}sGtw2sj0(+bSoG(znb&n=Iy%s(*Q)uZL*1wkW zH5h~p3w2_6TLy(=JvRdd=j$^iVnh(gUzORnFlfc|r)W(?QMC_FjY;$DVM&e0@_4t{ z$KLy|iU{poMep0b!~3zh?;^mV@hc5#BuB(#~@H_&fG@x z_jK!Jq4Q$^Z)n%#2D&|Tpm<~BPw3ZhryG}dN|1Ui&4htDm!X=sHe-?7iALS<>tLrv zD!*xS=e_Yoir%YZ${J9OhAkyRE$J5&xeD_iE0?z53@Q_`nb+;NwywJ+$WDIeV6dnN zRXn z)KDm#Y*JJNXHeCN@tix!Xnm(eKG4yZuXVCp?xn}X{Na?w+9J$SUHhJ>r$hdRD@6hG#Be-{76gt|qIdU~dE z{E5ux1N#x7+QnKgPSv9bS~Y{=FD~Ic)|IugbenOAu3<7y}`FHy3yZMDHC;IslcWODi4{QAMWBU%Zv0J_hv)Ekx6hLLB}| zDld}<6?)i|HeP8LZ7R&8jJuVGJuIIr$C)T}nX!-HEMm3uXWE;GPy}T+h>>%)`uqki zouk`-9$F-oSyXo|c|xuC6>s(WeVT(u5^#&yZ0&c%%f=gAJslrCA%%idZyj|Ql-7oB zLzybGj<}}yd}6!L_?)2K+0nOLSMi*)Pgi*HZmX1fn-ZIDVb zfX)SoX+a7#HSO3Ab*B2eP+lj&VsD*EO%x+_#h7KToAwyE##kEKQU;I7>;{23Nv zaQwZnUi2Nu1M78~Zfo(W6_6_w5|SPcoIlVl32B?k)x{GkMR1y>Fn)YU5S*?+hgPMxP=kl^aJ@rJ4dB3uL9g`HLC#;*{^hx0 z7+vKdM?Sts_|n{|5nK+ih&^dDzC9;=P(2b>F0WdSHrVP|$or~E9w6~R4e=v?A0LM= zCOMe};^W$!cVS-~|7C5%ujpZu0H8)L*!>{#Y7#*Z;U0lf$(C5A?TfF(??WfnS_hk{ zm_|#89h|)dAu-}--kY`nZsHw|5=nr*vB@030@eWB;rS5$`5g2c%p4dVBj_+f$Tjd4 zNzgTr+BSeQ8z}I#Lr^Aok~I=Rp42DqQM${nr+h?Mo8%Y^wyl$MAC8B1cHWQK*7v{8# zz+Dmd^D-Agkkt!Ozt_YZ>rN_=Np22k+5O+tq5FRm^#8L)VFYoX(aG(|(J%>+&iN^+ zB-C0Ko4$?eH*%zpY>oXG7tzXvieipeWJ$Xqw{Y*)vx2}p<;YtCq4)KsS-&fxdiQu0DF?&Y?g$H6E&1Q6cgsbQ2q zNYSpxe`EA{f*6tC8GkvCG1vEgLkhjVHUY9^{5dj4wmhzB(}L2{o^owpk}S{gw#`$| z%)fIVeK~cbbN5GCwNJ`DR>Y5*%#T(L(R&iv=H^D<(-Y~Gc5Ua8Z{kPU!^uVecus8B zRb~T1#Lq8R+p;<^Bjf{5bHqXmCuBv?#7%f7H~LFuhrR8bxZ^aJI3oVNQai?U02^Rz zWY{1^kI+5kk#r7N?j%)4ni|+-!|Xi1t@b8I{&~aRIZGMus7y;Z}#uwb+Ot-KezdCdYTBY|oI~ z2an=Di9chM=3!T$q)}|Tp|4j{>sPs>4II)7 z3^N_b?oTek(YWX%=Gd%Yu6ObeB)MY_eON4-i+%J zCeE^X^}~VYo>$Hl%vyX7{2>}oRzPVY6m$`WS-i7i`|`AH;!s~bmRd-GajZ$!f|RAt z!MU5UZ>eZtQQtx+^piUYBE}lc)8qR7%7TrMxZg+41<8@ydh{x63&Bcrr-aaJdM9YF z`Fvq*^@=|zPt}d{(tN&@29uOd8C+YmIxXzV1%sRXHgkVZ5hG$h2mH-H5Y$s!3yCX` zu`97i3FahWeI|yicrQfoWK_)z7AF);RL8$JO3pBK}nQqM>~Z=)+ECpecUH|Zn&6E6u4I%@_6(_*(w5MjEr;Wk(%wGsu2s%7H&gaHLu4B|} z>mD0&jtTRiD~dEd#(d<`G#}{SChf814eEtLj`bBekre{j2V4SOM^W_Gb>KPve7uTA zpId5XB(4klh~JSQkd;O8IKT<+>{!H-jp&X-ltkoemC(vuNimC!BlNT<=Wv@+W?Q7K z#bF3BB0hhSmsqgXc^iinw*PvrYo66)@l&3*r9{#E&+glPsw3@Wi*y>lm+WW#1^j-P zJEsI@9M|a`FfPCLfWu7X?I5%A?Hk{5*xOaP!4mhA|FRa#yt$=>|7kxowvlWeIZu0h zjhL<~?kcmo!y6o#5QJemXIJh$!67o;oAsHoNTp`@KO9OwTnNE4OPI1m?lUceQz;-$>{&9L#uX6?)`uH2Rm)~eSg;ZWs`S+A0R>s~5JgAC{BBb3Lh~z~gZ_zmr{< zI&%D5R;|2J7Bpg&JF`tT_`Xh&LvhI{hiEE)NlF)ht;!W-xAtGrcp}tnrYCwzoLE*< zx@(p+{d%MA+z<^3;+GLq_#VYaeQJlRjmb~-{m-6sOpZDK$U`*L?CC72?Sf7@jrnRA z5S|VF-fXeinzBM83qnQj$KTrG7l6WXPA2Vg1i9!vKg5a0;_36w0r(96>cVsOtj4>X z+odA+jL%(ZZTMOBRZzR?6YiEiG-=5S1|-m%-mwyD<}2R}jU^1{p=VwZRxPL-M!&HE zE}1SzGr?x-;(Y(fWp@&~XnCcKDe{rqe9*rU&Xaau@MrHO--4dr%dX=oQK8(`;5e|# ze^2?;A&jB7nT>HVRzlLHdi%|ZZTik%0^{DV6oIeC(LrOnc;ruYP0vJtt5eU6(#yyUU3f^)aQOx!)iY+Rj-N%<7FVZ@)!-q!;_r5LxMT@X6Hv8`Q=8-kPO#T|{#)zn9MB)ki|o zpTTqTK6|UOXKxF7*bwB};7a&iCbmLxSaSQhpUeB9YsfM=u5jFK!Do>w8rMKI3 z5CX1bWH!mQm9dDj;I<~0S#sTCJD1O0drVQVb`&9w7f+)g=o^abV5qByT)NX>!p%8E zMePa_QQ5WStyq7C$d500_rz?0Z$=WWi{uWJzKIa%>J~0;=fYO#)gJ5#FvE#SR2i8z zNeg~+MWKW2O-?sNgwXd)$hB<|AIOS%v98m^C zYz}0cvOgY?^d!yM{mhl78_BKhwfiX2#Q8<}9rVfj&kFdJznACcN2jNvohofun7$od zc%dcFIDKoi1=u9yTq;*upN%#I?%&`SZlA5DpOAFYV#@uRbR&$m1^3!WSy?7H<#h~UY)^ruG2 z$zUeMg<7WZ8S*0nS8ho=w78z0pqyFwt^;Dfx*ldFHbQmfE=tjz#4nwoUaQKST?+nm zkmy5TOZ;(*SqND&AzfyE_`bV~BVMTeQZkp2zlUn9jN~i^#Nt5-1V%{-utIoN?z5B( zFIeI3?L>m`nK&P#q(t~Uj=pOg%|Pe=o$u6>TY!-045shDu`w54i~DDch_#h#6h3+$ zQdWbzaF&KeF^s_O*Mb=?dbTMLzl*ukTIEswovxRNREEqD#`tnQo$3FcWIw!^JhuDx z2RYgkVQiHg=nLM!3$5~F6HQI4F;^lYjR&g) zsxq9)3Ixa%)`}c!|BP+46J4A{`OV3&IB;r*+H3{Ej3z<>rcR9BwnCCu-Z`EYZ_Cl1 zQ>;*t$G^i&etu)?BpzJ5z~2Rt=N&QVMj|!JPlVwapB)W85yM|=oF$w29E`g_{)1Ye zLg+8=soa~{M+JI8LZMy0wgDt*;a$kj2sY<~k6aZhXA#@!w=4T6>MSd_^b4qp?Dv}t z3KC28;!%~izEH_DbKPD>{>DXRpLXkRy#S}?K<0MDpM>Ob|J{A1@3X7W`!2zl!7}Ha z;w!W7yOb%6GY?+ceTstPQoR-Liss&J8FeT(^C?R@^=FTq>EYWg8l<(=?H~jU<{{|^ z1w@&Lrpn3l3}s6yVskr$oj^X)fxZLWjonq5r&UC2dolZtUE7!5-{hVs`X`V+pBq6z z4oTN4Ae~xCG%0(ps@*qm?%_4X_n!!Vx*mLlSqVr{o=8YXODApmb)V;Q|8Pv4|HS&y zxuP2))s=sgA8-&*n%kX6!E)asZrGX^Ln8*=OD%hM703e`FDs|lSst@KA{f$>HAmov zMe0o`zI#5E7W#^L-fzjUhrdx zn%Wk?8wLYMl~1;lxIiz(Qi2d`;ZJ$7?~K=En4`Io>1&AJ^FN_>n6J+4kBi`UaqXM}!Q;NjHzZm$gG+RQ&2L>#H#i(^;P1yjA1y362>Q!^r+l(D zE0FN$8$rKwJ}n+p?JWVWv@n@BDfhaA7qdvR(~n#@n>?G6oM2A-UoC@8< zOn6mHAA8Jw`(0Lv{7`yJ<)`!jFZ$cx^)|@0SAQqfvVY8}B7CH#{|$aMrHY`RJ-4zo zKO23zQ7M80k6rx)Mo$&Tzn8r2cn+@S6H0*ob$Nwj?O-%DrtNE(=@9peaI{QLaH zW$`FhByo!7Uk%YU(Bt3MTp@UI@!z+pM3>Ru1(C#{J8c*I@XnmDaVnxB3xtR$vLX5R zlh<$gcM6KH{K{%xtlzR4Ga?x}jX#<9tX&rx$Zs)l1lxpuBBj8q-@oyur$!vX&<$=W z4*b2nHa=AGoym_`mCW#8T{g$v7@;D3Pgu+wly?5#wIV)XyRHa#AUvL&#_qHm2C8a^l*u-lmb_u(^EME}K&$0Y6ws1ErNsz?I- zjx??R+>y((nLA4fRyY~=fVhDeCiwQOLk7)2bUqeAKY#vbxGVeue);CAN4=P5RhU&Z z1pWI*k`7~MWd9Q(1^VFOOYk>h)sTwzMJ5*xik8HYlkxv7i&9Jtt{6pV|!n54$Sj8cp_GDCmTM5Va zr%228+vO8qP344ii$9lrU7slzGO$!nsW6+}nmu$kW9hS5U!8nlHuEy%BaeAwec$Dx zKZ5srXuGVQ^Ciy(_`1nCGN!-xIplYX=3q04s#i|-Ic(yVQg;nLzKT`_hsR#HZpB8w zg`*oFmnOUSUS@{)YW(+$z7*Nw>ZzqutCV}kbCQnHwi#rtfdUb$Cp0&Y4HNc-J7Rqf mD=OMvSVFe?|Ln_;_DHNMz?RwXuSy?&COIi($wG-Ium2BbwnH}n literal 0 HcmV?d00001 diff --git a/platforms/android/assets/www/img/logo.svg b/platforms/android/assets/www/img/logo.svg new file mode 100644 index 0000000..385770d --- /dev/null +++ b/platforms/android/assets/www/img/logo.svg @@ -0,0 +1,114 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platforms/android/assets/www/index.html b/platforms/android/assets/www/index.html index 1ca76ca..68dfb42 100644 --- a/platforms/android/assets/www/index.html +++ b/platforms/android/assets/www/index.html @@ -9,11 +9,10 @@ - ... + Snipe IT App - diff --git a/platforms/android/assets/www/js/main.js b/platforms/android/assets/www/js/main.js index ae2d54b..13679be 100644 --- a/platforms/android/assets/www/js/main.js +++ b/platforms/android/assets/www/js/main.js @@ -7,9 +7,8 @@ /** * API base URL */ -APIURL = ""; +APIURL = "http://localhost:8000/"; username = ""; -password = ""; /** * Get the full URL to call for API things. @@ -17,7 +16,7 @@ password = ""; * @returns {String} The fully-qualified URL for that API request */ function mkApiUrl(basename) { - return APIURL + basename + ".php" + URLAPPEND; + return APIURL + basename + ".php"; } /* @@ -36,26 +35,36 @@ function dologin() { $('#errormsg').text("Error: Missing username."); $('#errorbase').css('display', 'block'); } - $.post(mkApiUrl("authuser"), - {username: $('#usernameBox').val(), password: $('#passwordBox').val(), merchant: MERCHANTID}, - function (data) { - if (data.status === 'OK') { - username = $('#usernameBox').val(); - password = $('#passwordBox').val(); - localStorage.setItem("username", username); - openscreen("home"); - } else { - $('#loginBtn').html(' Login'); - $('#loginBtn').attr('disabled', false); - $('#errormsg').text("Error: " + data.message); - $('#errorbase').css('display', 'block'); - } - }, "json").fail(function () { - $('#loginBtn').html(' Login'); - $('#loginBtn').attr('disabled', false); - $('#errormsg').text("Error: Network failure."); - $('#errorbase').css('display', 'block'); - }); + $.ajax({ + type: "POST", + url: mkApiUrl("login"), + data: {user: $('#usernameBox').val(), pass: $('#passwordBox').val()}, + cache: false, + crossDomain: true, + dataType: 'json', + xhrFields: { + withCredentials: true + }, + success: function (data) { + if (data.status === 'OK') { + username = $('#usernameBox').val(); + localStorage.setItem("username", username); + openscreen("home"); + } else { + $('#loginBtn').html(' Login'); + $('#loginBtn').attr('disabled', false); + $('#errormsg').text("Error: " + data.message); + $('#errorbase').css('display', 'block'); + } + }, + error: function () { + $('#loginBtn').html(' Login'); + $('#loginBtn').attr('disabled', false); + $('#errormsg').text("Error: Network failure."); + $('#errorbase').css('display', 'block'); + } + } + ); } /** @@ -80,97 +89,4 @@ function openscreen(screenname, effect) { } else { $('#content-zone').load("screens/" + screenname + ".html"); } -} - -function scanCode() { - try { - cordova.plugins.barcodeScanner.scan( - function (result) { - if (!result.cancelled) { - if (result.format.toString().toUpperCase() === "QR_CODE") { - startTransaction(result.text); - } else { - navigator.notification.alert("Please scan a valid QR code.", null, "Error", 'Dismiss'); - } - } - }, - function (error) { - navigator.notification.alert("Scanning failed: " + error, null, "Error", 'Dismiss'); - } - ); - /*cordova.plugins.barcodeScanner.scan( - function (result) { - alert("We got a barcode\n" + - "Result: " + result.text + "\n" + - "Format: " + result.format + "\n" + - "Cancelled: " + result.cancelled); - }, - function (error) { - alert("Scanning failed: " + error); - } - );*/ - } catch (ex) { - alert(ex.message); - } -} - -function startTransaction(qrcodestring) { - if (/^http:\/\/noidpay\.net\/#[0-9\.]+\|[0-9]+$/.test(qrcodestring)) { - transdata = qrcodestring.replace("http://noidpay.net/#", "").split("|"); - transactionamt = transdata[0]; - transactionid = transdata[1]; - openscreen("pay"); - } else { - navigator.notification.alert("This isn't a valid payment code!", null, "Error", 'Dismiss'); - } -} - -function cancelTransaction() { - transactionamt = 0; - transactionid = 0; - openscreen("home"); -} - -function finishTransaction() { - $.post(mkApiUrl("transaction"), - {username: username, password: password, type: BALANCETYPE, transid: transactionid}, - function (data) { - if (data.status === 'OK') { - transactionamt = 0; - transactionid = 0; - openscreen("paymentsent", "FADE"); - } else { - navigator.notification.alert("Error: " + data.message, function () { - transactionamt = 0; - transactionid = 0; - openscreen("home"); - }, "Failed", 'Dismiss'); - } - }, "json").fail(function () { - navigator.notification.alert("Error: Network failure.", function () { - cancelTransaction(); - }, "Error", 'Dismiss'); - }); -} - -function sendMoneyToPeer() { - if (/^[0-9\.]+$/.test($('#payAmt').val())) { - $.post(mkApiUrl("peertransfer"), - {username: username, password: password, type: BALANCETYPE, merchant: MERCHANTID, amt: $('#payAmt').val(), sendto: $('#recuser').val()}, - function (data) { - if (data.status === 'OK') { - openscreen("peersent", "FADE"); - } else { - navigator.notification.alert("Error: " + data.message, function () { - openscreen("peerpay"); - }, "Failed", 'Dismiss'); - } - }, "json").fail(function () { - navigator.notification.alert("Error: Network failure.", null, "Error", 'Dismiss'); - }); - } else { - navigator.notification.alert("Error: Please enter a number.", function () { - $('#payAmt').val(""); - }, "Error", 'Dismiss'); - } } \ No newline at end of file diff --git a/platforms/android/assets/www/plugins/cordova-plugin-battery-status/www/battery.js b/platforms/android/assets/www/plugins/cordova-plugin-battery-status/www/battery.js new file mode 100644 index 0000000..5394ef8 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-battery-status/www/battery.js @@ -0,0 +1,113 @@ +cordova.define("cordova-plugin-battery-status.battery", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * This class contains information about the current battery status. + * @constructor + */ +var cordova = require('cordova'), + exec = require('cordova/exec'); + +var STATUS_CRITICAL = 5; +var STATUS_LOW = 20; + +var Battery = function() { + this._level = null; + this._isPlugged = null; + // Create new event handlers on the window (returns a channel instance) + this.channels = { + batterystatus:cordova.addWindowEventHandler("batterystatus"), + batterylow:cordova.addWindowEventHandler("batterylow"), + batterycritical:cordova.addWindowEventHandler("batterycritical") + }; + for (var key in this.channels) { + this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; + } +}; + +function handlers() { + return battery.channels.batterystatus.numHandlers + + battery.channels.batterylow.numHandlers + + battery.channels.batterycritical.numHandlers; +} + +/** + * Event handlers for when callbacks get registered for the battery. + * Keep track of how many handlers we have so we can start and stop the native battery listener + * appropriately (and hopefully save on battery life!). + */ +Battery.onHasSubscribersChange = function() { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(battery._status, battery._error, "Battery", "start", []); + } else if (handlers() === 0) { + exec(null, null, "Battery", "stop", []); + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function (info) { + + if (info) { + if (battery._level !== info.level || battery._isPlugged !== info.isPlugged) { + + if(info.level === null && battery._level !== null) { + return; // special case where callback is called because we stopped listening to the native side. + } + + // Something changed. Fire batterystatus event + cordova.fireWindowEvent("batterystatus", info); + + if (!info.isPlugged) { // do not fire low/critical if we are charging. issue: CB-4520 + // note the following are NOT exact checks, as we want to catch a transition from + // above the threshold to below. issue: CB-4519 + if (battery._level > STATUS_CRITICAL && info.level <= STATUS_CRITICAL) { + // Fire critical battery event + cordova.fireWindowEvent("batterycritical", info); + } + else if (battery._level > STATUS_LOW && info.level <= STATUS_LOW) { + // Fire low battery event + cordova.fireWindowEvent("batterylow", info); + } + } + battery._level = info.level; + battery._isPlugged = info.isPlugged; + } + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +var battery = new Battery(); // jshint ignore:line + +module.exports = battery; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-camera/www/Camera.js b/platforms/android/assets/www/plugins/cordova-plugin-camera/www/Camera.js new file mode 100644 index 0000000..df633a2 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-camera/www/Camera.js @@ -0,0 +1,194 @@ +cordova.define("cordova-plugin-camera.camera", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + Camera = require('./Camera'); + // XXX: commented out + //CameraPopoverHandle = require('./CameraPopoverHandle'); + +/** + * @namespace navigator + */ + +/** + * @exports camera + */ +var cameraExport = {}; + +// Tack on the Camera Constants to the base camera plugin. +for (var key in Camera) { + cameraExport[key] = Camera[key]; +} + +/** + * Callback function that provides an error message. + * @callback module:camera.onError + * @param {string} message - The message is provided by the device's native code. + */ + +/** + * Callback function that provides the image data. + * @callback module:camera.onSuccess + * @param {string} imageData - Base64 encoding of the image data, _or_ the image file URI, depending on [`cameraOptions`]{@link module:camera.CameraOptions} in effect. + * @example + * // Show image + * // + * function cameraCallback(imageData) { + * var image = document.getElementById('myImage'); + * image.src = "data:image/jpeg;base64," + imageData; + * } + */ + +/** + * Optional parameters to customize the camera settings. + * * [Quirks](#CameraOptions-quirks) + * @typedef module:camera.CameraOptions + * @type {Object} + * @property {number} [quality=50] - Quality of the saved image, expressed as a range of 0-100, where 100 is typically full resolution with no loss from file compression. (Note that information about the camera's resolution is unavailable.) + * @property {module:Camera.DestinationType} [destinationType=FILE_URI] - Choose the format of the return value. + * @property {module:Camera.PictureSourceType} [sourceType=CAMERA] - Set the source of the picture. + * @property {Boolean} [allowEdit=true] - Allow simple editing of image before selection. + * @property {module:Camera.EncodingType} [encodingType=JPEG] - Choose the returned image file's encoding. + * @property {number} [targetWidth] - Width in pixels to scale image. Must be used with `targetHeight`. Aspect ratio remains constant. + * @property {number} [targetHeight] - Height in pixels to scale image. Must be used with `targetWidth`. Aspect ratio remains constant. + * @property {module:Camera.MediaType} [mediaType=PICTURE] - Set the type of media to select from. Only works when `PictureSourceType` is `PHOTOLIBRARY` or `SAVEDPHOTOALBUM`. + * @property {Boolean} [correctOrientation] - Rotate the image to correct for the orientation of the device during capture. + * @property {Boolean} [saveToPhotoAlbum] - Save the image to the photo album on the device after capture. + * @property {module:CameraPopoverOptions} [popoverOptions] - iOS-only options that specify popover location in iPad. + * @property {module:Camera.Direction} [cameraDirection=BACK] - Choose the camera to use (front- or back-facing). + */ + +/** + * @description Takes a photo using the camera, or retrieves a photo from the device's + * image gallery. The image is passed to the success callback as a + * Base64-encoded `String`, or as the URI for the image file. + * + * The `camera.getPicture` function opens the device's default camera + * application that allows users to snap pictures by default - this behavior occurs, + * when `Camera.sourceType` equals [`Camera.PictureSourceType.CAMERA`]{@link module:Camera.PictureSourceType}. + * Once the user snaps the photo, the camera application closes and the application is restored. + * + * If `Camera.sourceType` is `Camera.PictureSourceType.PHOTOLIBRARY` or + * `Camera.PictureSourceType.SAVEDPHOTOALBUM`, then a dialog displays + * that allows users to select an existing image. The + * `camera.getPicture` function returns a [`CameraPopoverHandle`]{@link module:CameraPopoverHandle} object, + * which can be used to reposition the image selection dialog, for + * example, when the device orientation changes. + * + * The return value is sent to the [`cameraSuccess`]{@link module:camera.onSuccess} callback function, in + * one of the following formats, depending on the specified + * `cameraOptions`: + * + * - A `String` containing the Base64-encoded photo image. + * + * - A `String` representing the image file location on local storage (default). + * + * You can do whatever you want with the encoded image or URI, for + * example: + * + * - Render the image in an `` tag, as in the example below + * + * - Save the data locally (`LocalStorage`, [Lawnchair](http://brianleroux.github.com/lawnchair/), etc.) + * + * - Post the data to a remote server + * + * __NOTE__: Photo resolution on newer devices is quite good. Photos + * selected from the device's gallery are not downscaled to a lower + * quality, even if a `quality` parameter is specified. To avoid common + * memory problems, set `Camera.destinationType` to `FILE_URI` rather + * than `DATA_URL`. + * + * __Supported Platforms__ + * + * - Android + * - BlackBerry + * - Browser + * - Firefox + * - FireOS + * - iOS + * - Windows + * - WP8 + * - Ubuntu + * + * More examples [here](#camera-getPicture-examples). Quirks [here](#camera-getPicture-quirks). + * + * @example + * navigator.camera.getPicture(cameraSuccess, cameraError, cameraOptions); + * @param {module:camera.onSuccess} successCallback + * @param {module:camera.onError} errorCallback + * @param {module:camera.CameraOptions} options CameraOptions + */ +cameraExport.getPicture = function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); + options = options || {}; + var getValue = argscheck.getValue; + + var quality = getValue(options.quality, 50); + var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); + var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); + var targetWidth = getValue(options.targetWidth, -1); + var targetHeight = getValue(options.targetHeight, -1); + var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); + var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); + var allowEdit = !!options.allowEdit; + var correctOrientation = !!options.correctOrientation; + var saveToPhotoAlbum = !!options.saveToPhotoAlbum; + var popoverOptions = getValue(options.popoverOptions, null); + var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); + + var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, + mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; + + exec(successCallback, errorCallback, "Camera", "takePicture", args); + // XXX: commented out + //return new CameraPopoverHandle(); +}; + +/** + * Removes intermediate image files that are kept in temporary storage + * after calling [`camera.getPicture`]{@link module:camera.getPicture}. Applies only when the value of + * `Camera.sourceType` equals `Camera.PictureSourceType.CAMERA` and the + * `Camera.destinationType` equals `Camera.DestinationType.FILE_URI`. + * + * __Supported Platforms__ + * + * - iOS + * + * @example + * navigator.camera.cleanup(onSuccess, onFail); + * + * function onSuccess() { + * console.log("Camera cleanup success.") + * } + * + * function onFail(message) { + * alert('Failed because: ' + message); + * } + */ +cameraExport.cleanup = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, "Camera", "cleanup", []); +}; + +module.exports = cameraExport; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraConstants.js b/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraConstants.js new file mode 100644 index 0000000..1a786df --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraConstants.js @@ -0,0 +1,91 @@ +cordova.define("cordova-plugin-camera.Camera", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * @module Camera + */ +module.exports = { + /** + * @enum {number} + */ + DestinationType:{ + /** Return base64 encoded string. DATA_URL can be very memory intensive and cause app crashes or out of memory errors. Use FILE_URI or NATIVE_URI if possible */ + DATA_URL: 0, + /** Return file uri (content://media/external/images/media/2 for Android) */ + FILE_URI: 1, + /** Return native uri (eg. asset-library://... for iOS) */ + NATIVE_URI: 2 + }, + /** + * @enum {number} + */ + EncodingType:{ + /** Return JPEG encoded image */ + JPEG: 0, + /** Return PNG encoded image */ + PNG: 1 + }, + /** + * @enum {number} + */ + MediaType:{ + /** Allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType */ + PICTURE: 0, + /** Allow selection of video only, ONLY RETURNS URL */ + VIDEO: 1, + /** Allow selection from all media types */ + ALLMEDIA : 2 + }, + /** + * @enum {number} + */ + PictureSourceType:{ + /** Choose image from picture library (same as SAVEDPHOTOALBUM for Android) */ + PHOTOLIBRARY : 0, + /** Take picture from camera */ + CAMERA : 1, + /** Choose image from picture library (same as PHOTOLIBRARY for Android) */ + SAVEDPHOTOALBUM : 2 + }, + /** + * Matches iOS UIPopoverArrowDirection constants to specify arrow location on popover. + * @enum {number} + */ + PopoverArrowDirection:{ + ARROW_UP : 1, + ARROW_DOWN : 2, + ARROW_LEFT : 4, + ARROW_RIGHT : 8, + ARROW_ANY : 15 + }, + /** + * @enum {number} + */ + Direction:{ + /** Use the back-facing camera */ + BACK: 0, + /** Use the front-facing camera */ + FRONT: 1 + } +}; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js b/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js new file mode 100644 index 0000000..a65ac7e --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js @@ -0,0 +1,35 @@ +cordova.define("cordova-plugin-camera.CameraPopoverHandle", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * @ignore in favour of iOS' one + * A handle to an image picker popover. + */ +var CameraPopoverHandle = function() { + this.setPosition = function(popoverOptions) { + console.log('CameraPopoverHandle.setPosition is only supported on iOS.'); + }; +}; + +module.exports = CameraPopoverHandle; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js b/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js new file mode 100644 index 0000000..f6a1e8f --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js @@ -0,0 +1,55 @@ +cordova.define("cordova-plugin-camera.CameraPopoverOptions", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Camera = require('./Camera'); + +/** + * @namespace navigator + */ + +/** + * iOS-only parameters that specify the anchor element location and arrow + * direction of the popover when selecting images from an iPad's library + * or album. + * Note that the size of the popover may change to adjust to the + * direction of the arrow and orientation of the screen. Make sure to + * account for orientation changes when specifying the anchor element + * location. + * @module CameraPopoverOptions + * @param {Number} [x=0] - x pixel coordinate of screen element onto which to anchor the popover. + * @param {Number} [y=32] - y pixel coordinate of screen element onto which to anchor the popover. + * @param {Number} [width=320] - width, in pixels, of the screen element onto which to anchor the popover. + * @param {Number} [height=480] - height, in pixels, of the screen element onto which to anchor the popover. + * @param {module:Camera.PopoverArrowDirection} [arrowDir=ARROW_ANY] - Direction the arrow on the popover should point. + */ +var CameraPopoverOptions = function (x, y, width, height, arrowDir) { + // information of rectangle that popover should be anchored to + this.x = x || 0; + this.y = y || 32; + this.width = width || 320; + this.height = height || 480; + this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; +}; + +module.exports = CameraPopoverOptions; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/Contact.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/Contact.js new file mode 100644 index 0000000..22c3d0c --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/Contact.js @@ -0,0 +1,143 @@ +cordova.define("cordova-plugin-contacts.Contact", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + utils = require('cordova/utils'), + convertUtils = require('./convertUtils'); + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + 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.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "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 = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('./contacts').create(result); + successCB(convertUtils.toCordovaFormat(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertUtils.toNativeFormat(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactAddress.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactAddress.js new file mode 100644 index 0000000..c6c163e --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactAddress.js @@ -0,0 +1,49 @@ +cordova.define("cordova-plugin-contacts.ContactAddress", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactError.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactError.js new file mode 100644 index 0000000..f7a7671 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactError.js @@ -0,0 +1,46 @@ +cordova.define("cordova-plugin-contacts.ContactError", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.OPERATION_CANCELLED_ERROR = 6; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactField.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactField.js new file mode 100644 index 0000000..de72ed4 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactField.js @@ -0,0 +1,40 @@ +cordova.define("cordova-plugin-contacts.ContactField", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactFieldType.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactFieldType.js new file mode 100644 index 0000000..9f61cfd --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactFieldType.js @@ -0,0 +1,58 @@ +cordova.define("cordova-plugin-contacts.ContactFieldType", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + // Possible field names for various platforms. + // Some field names are platform specific + + var fieldType = { + addresses: "addresses", + birthday: "birthday", + categories: "categories", + country: "country", + department: "department", + displayName: "displayName", + emails: "emails", + familyName: "familyName", + formatted: "formatted", + givenName: "givenName", + honorificPrefix: "honorificPrefix", + honorificSuffix: "honorificSuffix", + id: "id", + ims: "ims", + locality: "locality", + middleName: "middleName", + name: "name", + nickname: "nickname", + note: "note", + organizations: "organizations", + phoneNumbers: "phoneNumbers", + photos: "photos", + postalCode: "postalCode", + region: "region", + streetAddress: "streetAddress", + title: "title", + urls: "urls" + }; + + module.exports = fieldType; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js new file mode 100644 index 0000000..92b9f49 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js @@ -0,0 +1,41 @@ +cordova.define("cordova-plugin-contacts.ContactFindOptions", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + * @param desiredFields + * @param hasPhoneNumber boolean used to filter the search and only return contacts that have a phone number informed + */ + +var ContactFindOptions = function(filter, multiple, desiredFields, hasPhoneNumber) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); + this.desiredFields = typeof desiredFields != 'undefined' ? desiredFields : []; + this.hasPhoneNumber = typeof hasPhoneNumber != 'undefined' ? hasPhoneNumber : false; +}; + +module.exports = ContactFindOptions; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactName.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactName.js new file mode 100644 index 0000000..f18a28a --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactName.js @@ -0,0 +1,44 @@ +cordova.define("cordova-plugin-contacts.ContactName", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactOrganization.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactOrganization.js new file mode 100644 index 0000000..bb79853 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/ContactOrganization.js @@ -0,0 +1,44 @@ +cordova.define("cordova-plugin-contacts.ContactOrganization", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact organization. +* @constructor +* @param pref +* @param type +* @param name +* @param dept +* @param title +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/contacts.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/contacts.js new file mode 100644 index 0000000..6546d85 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/contacts.js @@ -0,0 +1,102 @@ +cordova.define("cordova-plugin-contacts.contacts", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + Contact = require('./Contact'), + fieldType = require('./ContactFieldType'), + convertUtils = require('./convertUtils'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + fieldType: fieldType, + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find: function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + if (errorCB) { + errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } + } else { + // missing 'options' param means return all contacts + options = options || { filter: '', multiple: true }; + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(convertUtils.toCordovaFormat(contacts.create(result[i]))); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function picks contact from phone using contact picker UI + * @returns new Contact object + */ + pickContact: function (successCB, errorCB) { + + argscheck.checkArgs('fF', 'contacts.pick', arguments); + + var win = function (result) { + // if Contacts.pickContact return instance of Contact object + // don't create new Contact object, use current + var contact = result instanceof Contact ? result : contacts.create(result); + successCB(convertUtils.toCordovaFormat(contact)); + }; + exec(win, errorCB, "Contacts", "pickContact", []); + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create: function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/convertUtils.js b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/convertUtils.js new file mode 100644 index 0000000..01588fc --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-contacts/www/convertUtils.js @@ -0,0 +1,73 @@ +cordova.define("cordova-plugin-contacts.convertUtils", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var utils = require('cordova/utils'); + +module.exports = { + /** + * Converts primitives into Complex Object + * Currently only used for Date fields + */ + toCordovaFormat: function (contact) { + var value = contact.birthday; + if (value !== null) { + try { + contact.birthday = new Date(parseFloat(value)); + + //we might get 'Invalid Date' which does not throw an error + //and is an instance of Date. + if (isNaN(contact.birthday.getTime())) { + contact.birthday = null; + } + + } catch (exception){ + console.log("Cordova Contact toCordovaFormat error: exception creating date."); + } + } + return contact; + }, + + /** + * Converts Complex objects into primitives + * Only conversion at present is for Dates. + **/ + toNativeFormat: function (contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; + } +}; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-device-motion/www/Acceleration.js b/platforms/android/assets/www/plugins/cordova-plugin-device-motion/www/Acceleration.js new file mode 100644 index 0000000..794476b --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-device-motion/www/Acceleration.js @@ -0,0 +1,32 @@ +cordova.define("cordova-plugin-device-motion.Acceleration", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Acceleration = function(x, y, z, timestamp) { + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); +}; + +module.exports = Acceleration; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-device-motion/www/accelerometer.js b/platforms/android/assets/www/plugins/cordova-plugin-device-motion/www/accelerometer.js new file mode 100644 index 0000000..b2d01f7 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-device-motion/www/accelerometer.js @@ -0,0 +1,205 @@ +cordova.define("cordova-plugin-device-motion.accelerometer", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * This class provides access to device accelerometer data. + * @constructor + */ +var argscheck = require('cordova/argscheck'), + utils = require("cordova/utils"), + exec = require("cordova/exec"), + Acceleration = require('./Acceleration'); + +// Is the accel sensor running? +var running = false; + +// Keeps reference to watchAcceleration calls. +var timers = {}; + +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Timer used when faking up devicemotion events +var eventTimerId = null; + +// Tells native to start. +function start() { + exec(function (a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function (e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + accel = null; + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return { win: win, fail: fail }; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + +var accelerometer = { + /** + * Asynchronously acquires the current acceleration. + * + * @param {Function} successCallback The function to call when the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + */ + getCurrentAcceleration: function (successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); + + if (cordova.platformId === "windowsphone") { + exec(function (a) { + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + successCallback(accel); + }, function (e) { + errorCallback(e); + }, "Accelerometer", "getCurrentAcceleration", []); + + return; + } + + var p; + var win = function (a) { + removeListeners(p); + successCallback(a); + }; + var fail = function (e) { + removeListeners(p); + if (errorCallback) { + errorCallback(e); + } + }; + + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } + }, + + /** + * Asynchronously acquires the acceleration repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchAcceleration: function (successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); + // Default interval (10 sec) + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; + + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); + + var p = createCallbackPair(function () { }, function (e) { + removeListeners(p); + if (errorCallback) { + errorCallback(e); + } + }); + listeners.push(p); + + timers[id] = { + timer: window.setInterval(function () { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners: p + }; + + if (running) { + // If we're already running then immediately invoke the success callback + // but only if we have retrieved a value, sample code does not check for null ... + if (accel) { + successCallback(accel); + } + } else { + start(); + } + + if (cordova.platformId === "browser" && !eventTimerId) { + // Start firing devicemotion events if we haven't already + var devicemotionEvent = new Event('devicemotion'); + eventTimerId = window.setInterval(function() { + window.dispatchEvent(devicemotionEvent); + }, 200); + } + + return id; + }, + + /** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ + clearWatch: function (id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); + delete timers[id]; + + if (eventTimerId && Object.keys(timers).length === 0) { + // No more watchers, so stop firing 'devicemotion' events + window.clearInterval(eventTimerId); + eventTimerId = null; + } + } + } +}; +module.exports = accelerometer; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/CompassError.js b/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/CompassError.js new file mode 100644 index 0000000..0055b9a --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/CompassError.js @@ -0,0 +1,37 @@ +cordova.define("cordova-plugin-device-orientation.CompassError", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * CompassError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var CompassError = function(err) { + this.code = (err !== undefined ? err : null); +}; + +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +module.exports = CompassError; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js b/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js new file mode 100644 index 0000000..4ebb4aa --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js @@ -0,0 +1,32 @@ +cordova.define("cordova-plugin-device-orientation.CompassHeading", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { + this.magneticHeading = magneticHeading; + this.trueHeading = trueHeading; + this.headingAccuracy = headingAccuracy; + this.timestamp = timestamp || new Date().getTime(); +}; + +module.exports = CompassHeading; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/compass.js b/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/compass.js new file mode 100644 index 0000000..48ee5f6 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-device-orientation/www/compass.js @@ -0,0 +1,121 @@ +cordova.define("cordova-plugin-device-orientation.compass", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + utils = require('cordova/utils'), + CompassHeading = require('./CompassHeading'), + CompassError = require('./CompassError'), + + timers = {}, + eventTimerId = null, + compass = { + /** + * Asynchronously acquires 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. + * @param {CompassOptions} options The options for getting the heading data (not used). + */ + getCurrentHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); + + var win = function(result) { + var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); + successCallback(ch); + }; + var fail = errorCallback && function(code) { + var ce = new CompassError(code); + errorCallback(ce); + }; + + // Get heading + exec(win, fail, "Compass", "getHeading", [options]); + }, + + /** + * Asynchronously acquires 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. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. For iOS, filter parameter + * specifies to watch via a distance filter rather than time. + */ + watchHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); + // Default interval (100 msec) + var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; + var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; + + var id = utils.createUUID(); + if (filter > 0) { + // is an iOS request for watch by filter, no timer needed + timers[id] = "iOS"; + compass.getCurrentHeading(successCallback, errorCallback, options); + } else { + // Start watch timer to get headings + timers[id] = window.setInterval(function() { + compass.getCurrentHeading(successCallback, errorCallback); + }, frequency); + } + + if (cordova.platformId === 'browser' && !eventTimerId) { + // Start firing deviceorientation events if haven't already + var deviceorientationEvent = new Event('deviceorientation'); + eventTimerId = window.setInterval(function() { + window.dispatchEvent(deviceorientationEvent); + }, 200); + } + + return id; + }, + + /** + * Clears the specified heading watch. + * @param {String} id The ID of the watch returned from #watchHeading. + */ + clearWatch:function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + if (timers[id] != "iOS") { + clearInterval(timers[id]); + } else { + // is iOS watch by filter so call into device to stop + exec(null, null, "Compass", "stopHeading", []); + } + delete timers[id]; + + if (eventTimerId && Object.keys(timers).length === 0) { + // No more watchers, so stop firing 'deviceorientation' events + window.clearInterval(eventTimerId); + eventTimerId = null; + } + } + } + }; + +module.exports = compass; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-device/www/device.js b/platforms/android/assets/www/plugins/cordova-plugin-device/www/device.js new file mode 100644 index 0000000..977dfc0 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-device/www/device.js @@ -0,0 +1,86 @@ +cordova.define("cordova-plugin-device.device", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + cordova = require('cordova'); + +channel.createSticky('onCordovaInfoReady'); +// Tell cordova channel to wait on the CordovaInfoReady event +channel.waitForInitialization('onCordovaInfoReady'); + +/** + * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +function Device() { + this.available = false; + this.platform = null; + this.version = null; + this.uuid = null; + this.cordova = null; + this.model = null; + this.manufacturer = null; + this.isVirtual = null; + this.serial = null; + + var me = this; + + channel.onCordovaReady.subscribe(function() { + me.getInfo(function(info) { + //ignoring info.cordova returning from native, we should use value from cordova.version defined in cordova.js + //TODO: CB-5105 native implementations should not return info.cordova + var buildLabel = cordova.version; + me.available = true; + me.platform = info.platform; + me.version = info.version; + me.uuid = info.uuid; + me.cordova = buildLabel; + me.model = info.model; + me.isVirtual = info.isVirtual; + me.manufacturer = info.manufacturer || 'unknown'; + me.serial = info.serial || 'unknown'; + channel.onCordovaInfoReady.fire(); + },function(e) { + me.available = false; + utils.alert("[ERROR] Error initializing Cordova: " + e); + }); + }); +} + +/** + * Get device info + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + */ +Device.prototype.getInfo = function(successCallback, errorCallback) { + argscheck.checkArgs('fF', 'Device.getInfo', arguments); + exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); +}; + +module.exports = new Device(); + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-dialogs/www/android/notification.js b/platforms/android/assets/www/plugins/cordova-plugin-dialogs/www/android/notification.js new file mode 100644 index 0000000..69cb5a4 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-dialogs/www/android/notification.js @@ -0,0 +1,77 @@ +cordova.define("cordova-plugin-dialogs.notification_android", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); + +/** + * Provides Android enhanced notification API. + */ +module.exports = { + activityStart : function(title, message) { + // If title and message not specified then mimic Android behavior of + // using default strings. + if (typeof title === "undefined" && typeof message == "undefined") { + title = "Busy"; + message = 'Please wait...'; + } + + exec(null, null, 'Notification', 'activityStart', [ title, message ]); + }, + + /** + * Close an activity dialog + */ + activityStop : function() { + exec(null, null, 'Notification', 'activityStop', []); + }, + + /** + * Display a progress dialog with progress bar that goes from 0 to 100. + * + * @param {String} + * title Title of the progress dialog. + * @param {String} + * message Message to display in the dialog. + */ + progressStart : function(title, message) { + exec(null, null, 'Notification', 'progressStart', [ title, message ]); + }, + + /** + * Close the progress dialog. + */ + progressStop : function() { + exec(null, null, 'Notification', 'progressStop', []); + }, + + /** + * Set the progress dialog value. + * + * @param {Number} + * value 0-100 + */ + progressValue : function(value) { + exec(null, null, 'Notification', 'progressValue', [ value ]); + } +}; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-dialogs/www/notification.js b/platforms/android/assets/www/plugins/cordova-plugin-dialogs/www/notification.js new file mode 100644 index 0000000..6558ea0 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-dialogs/www/notification.js @@ -0,0 +1,130 @@ +cordova.define("cordova-plugin-dialogs.notification", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); +var platform = require('cordova/platform'); + +/** + * Provides access to notifications on the device. + */ + +module.exports = { + + /** + * Open a native alert dialog, with a customizable title and button text. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} completeCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Alert) + * @param {String} buttonLabel Label of the close button (default: OK) + */ + alert: function(message, completeCallback, title, buttonLabel) { + var _title = (typeof title === "string" ? title : "Alert"); + var _buttonLabel = (buttonLabel || "OK"); + exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]); + }, + + /** + * Open a native confirm dialog, with a customizable title and button text. + * The result that the user selects is returned to the result callback. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Confirm) + * @param {Array} buttonLabels Array of the labels of the buttons (default: ['OK', 'Cancel']) + */ + confirm: function(message, resultCallback, title, buttonLabels) { + var _title = (typeof title === "string" ? title : "Confirm"); + var _buttonLabels = (buttonLabels || ["OK", "Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.confirm(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + + exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]); + }, + + /** + * Open a native prompt dialog, with a customizable title and button text. + * The following results are returned to the result callback: + * buttonIndex Index number of the button selected. + * input1 The text entered in the prompt dialog box. + * + * @param {String} message Dialog message to display (default: "Prompt message") + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the dialog (default: "Prompt") + * @param {Array} buttonLabels Array of strings for the button labels (default: ["OK","Cancel"]) + * @param {String} defaultText Textbox input value (default: empty string) + */ + prompt: function(message, resultCallback, title, buttonLabels, defaultText) { + var _message = (typeof message === "string" ? message : "Prompt message"); + var _title = (typeof title === "string" ? title : "Prompt"); + var _buttonLabels = (buttonLabels || ["OK","Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.prompt(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + + var _defaultText = (defaultText || ""); + exec(resultCallback, null, "Notification", "prompt", [_message, _title, _buttonLabels, _defaultText]); + }, + + /** + * Causes the device to beep. + * On Android, the default notification ringtone is played "count" times. + * + * @param {Integer} count The number of beeps. + */ + beep: function(count) { + var defaultedCount = count || 1; + exec(null, null, "Notification", "beep", [ defaultedCount ]); + } +}; + +function convertButtonLabels(buttonLabels) { + + // Some platforms take an array of button label names. + // Other platforms take a comma separated list. + // For compatibility, we convert to the desired type based on the platform. + if (platform.id == "amazon-fireos" || platform.id == "android" || platform.id == "ios" || + platform.id == "windowsphone" || platform.id == "firefoxos" || platform.id == "ubuntu" || + platform.id == "windows8" || platform.id == "windows") { + + if (typeof buttonLabels === 'string') { + buttonLabels = buttonLabels.split(","); // not crazy about changing the var type here + } + } else { + if (Array.isArray(buttonLabels)) { + var buttonLabelArray = buttonLabels; + buttonLabels = buttonLabelArray.toString(); + } + } + + return buttonLabels; +} +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js b/platforms/android/assets/www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js new file mode 100644 index 0000000..3019d5e --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js @@ -0,0 +1,242 @@ +cordova.define("cordova-plugin-file-transfer.FileTransfer", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* global cordova, FileSystem */ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + FileTransferError = require('./FileTransferError'), + ProgressEvent = require('cordova-plugin-file.ProgressEvent'); + +function newProgressEvent(result) { + var pe = new ProgressEvent(); + pe.lengthComputable = result.lengthComputable; + pe.loaded = result.loaded; + pe.total = result.total; + return pe; +} + +function getUrlCredentials(urlString) { + var credentialsPattern = /^https?\:\/\/(?:(?:(([^:@\/]*)(?::([^@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?).*$/, + credentials = credentialsPattern.exec(urlString); + + return credentials && credentials[1]; +} + +function getBasicAuthHeader(urlString) { + var header = null; + + + // This is changed due to MS Windows doesn't support credentials in http uris + // so we detect them by regexp and strip off from result url + // Proof: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/a327cf3c-f033-4a54-8b7f-03c56ba3203f/windows-foundation-uri-security-problem + + if (window.btoa) { + var credentials = getUrlCredentials(urlString); + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; +} + +function convertHeadersToArray(headers) { + var result = []; + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + var headerValue = headers[header]; + result.push({ + name: header, + value: headerValue.toString() + }); + } + } + return result; +} + +var idCounter = 0; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** +* 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 +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + var headers = null; + var httpMethod = null; + var basicAuthHeader = getBasicAuthHeader(server); + if (basicAuthHeader) { + server = server.replace(getUrlCredentials(server) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + httpMethod = options.httpMethod || "POST"; + if (httpMethod.toUpperCase() == "PUT"){ + httpMethod = "PUT"; + } else { + httpMethod = "POST"; + } + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + if (cordova.platformId === "windowsphone") { + headers = headers && convertHeadersToArray(headers); + params = params && convertHeadersToArray(params); + } + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body, e.exception); + errorCallback(error); + }; + + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + self.onprogress(newProgressEvent(result)); + } + } else { + if (successCallback) { + successCallback(result); + } + } + }; + exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + * @param options {FileDownloadOptions} Optional parameters such as headers + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + var self = this; + + var basicAuthHeader = getBasicAuthHeader(source); + if (basicAuthHeader) { + source = source.replace(getUrlCredentials(source) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var headers = null; + if (options) { + headers = options.headers || null; + } + + if (cordova.platformId === "windowsphone" && headers) { + headers = convertHeadersToArray(headers); + } + + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + return self.onprogress(newProgressEvent(result)); + } + } else if (successCallback) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova-plugin-file.DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova-plugin-file.FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + entry.filesystem = new FileSystem(result.filesystemName || (result.filesystem == window.PERSISTENT ? 'persistent' : 'temporary')); + entry.nativeURL = result.nativeURL; + successCallback(entry); + } + }; + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body, e.exception); + errorCallback(error); + }; + + exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); +}; + +/** + * Aborts the ongoing file transfer on this object. The original error + * callback for the file transfer will be called if necessary. + */ +FileTransfer.prototype.abort = function() { + exec(null, null, 'FileTransfer', 'abort', [this._id]); +}; + +module.exports = FileTransfer; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js b/platforms/android/assets/www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js new file mode 100644 index 0000000..18fb64c --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js @@ -0,0 +1,44 @@ +cordova.define("cordova-plugin-file-transfer.FileTransferError", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * FileTransferError + * @constructor + */ +var FileTransferError = function(code, source, target, status, body, exception) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; + this.exception = exception || null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; +FileTransferError.ABORT_ERR = 4; +FileTransferError.NOT_MODIFIED_ERR = 5; + +module.exports = FileTransferError; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-file/www/DirectoryEntry.js b/platforms/android/assets/www/plugins/cordova-plugin-file/www/DirectoryEntry.js new file mode 100644 index 0000000..36c6e28 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-file/www/DirectoryEntry.js @@ -0,0 +1,120 @@ +cordova.define("cordova-plugin-file.DirectoryEntry", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('./Entry'), + FileError = require('./FileError'), + DirectoryReader = require('./DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) { + + // add trailing slash if it is missing + if ((fullPath) && !/\/$/.test(fullPath)) { + fullPath += "/"; + } + // add trailing slash if it is missing + if (nativeURL && !/\/$/.test(nativeURL)) { + nativeURL += "/"; + } + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, fileSystem, nativeURL); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.toInternalURL()); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getDirectory", [this.toInternalURL(), path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.toInternalURL()]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var FileEntry = require('./FileEntry'); + var entry = new FileEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.toInternalURL(), path, options]); +}; + +module.exports = DirectoryEntry; + +}); diff --git a/platforms/android/assets/www/plugins/cordova-plugin-file/www/DirectoryReader.js b/platforms/android/assets/www/plugins/cordova-plugin-file/www/DirectoryReader.js new file mode 100644 index 0000000..2b3ada2 --- /dev/null +++ b/platforms/android/assets/www/plugins/cordova-plugin-file/www/DirectoryReader.js @@ -0,0 +1,76 @@ +cordova.define("cordova-plugin-file.DirectoryReader", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'), + FileError = require('./FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(localURL) { + this.localURL = localURL || null; + this.hasReadEntries = false; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + // If we've already read and passed on this directory's entries, return an empty list. + if (this.hasReadEntries) { + successCallback([]); + return; + } + var reader = this; + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i or + *

-
-

Balance:

-

...

+

Search for Items:

+
+
+
+
-
- -

- -

-
\ No newline at end of file diff --git a/platforms/android/assets/www/screens/login.html b/platforms/android/assets/www/screens/login.html index 20432db..8e9514d 100644 --- a/platforms/android/assets/www/screens/login.html +++ b/platforms/android/assets/www/screens/login.html @@ -1,5 +1,3 @@ - -
@@ -12,29 +10,36 @@
- +

-
\ No newline at end of file diff --git a/platforms/android/assets/www/screens/pay.html b/platforms/android/assets/www/screens/pay.html deleted file mode 100644 index df059c7..0000000 --- a/platforms/android/assets/www/screens/pay.html +++ /dev/null @@ -1,18 +0,0 @@ - - -
-
-

Pay $some money?

-
- -

- -
-
- \ No newline at end of file diff --git a/platforms/android/assets/www/screens/paymentsent.html b/platforms/android/assets/www/screens/paymentsent.html deleted file mode 100644 index 0ef3e9d..0000000 --- a/platforms/android/assets/www/screens/paymentsent.html +++ /dev/null @@ -1,13 +0,0 @@ - - -
-
-

Transaction complete!

-
- -
- -
-
\ No newline at end of file diff --git a/platforms/android/assets/www/screens/peerpay.html b/platforms/android/assets/www/screens/peerpay.html deleted file mode 100644 index 811f7a2..0000000 --- a/platforms/android/assets/www/screens/peerpay.html +++ /dev/null @@ -1,20 +0,0 @@ - - -
-
-
-

Send:

- -

To:

- -
-
- -

- -
-
\ No newline at end of file diff --git a/platforms/android/assets/www/screens/peersent.html b/platforms/android/assets/www/screens/peersent.html deleted file mode 100644 index 08171e7..0000000 --- a/platforms/android/assets/www/screens/peersent.html +++ /dev/null @@ -1,13 +0,0 @@ - - -
-
-

Gift Sent!

-
- -
- -
-
\ No newline at end of file diff --git a/platforms/android/assets/www/screens/signup.html b/platforms/android/assets/www/screens/signup.html deleted file mode 100644 index cca3c41..0000000 --- a/platforms/android/assets/www/screens/signup.html +++ /dev/null @@ -1,42 +0,0 @@ - - -
-
-
-
- Create Account -
-
- -
- - -
-
-
- - -
-
-
- - -
-
-
- - -
-
- -
-
-
- \ No newline at end of file diff --git a/platforms/android/build.gradle b/platforms/android/build.gradle index 15d4a52..f7dae9f 100644 --- a/platforms/android/build.gradle +++ b/platforms/android/build.gradle @@ -86,7 +86,6 @@ ext { } // PLUGIN GRADLE EXTENSIONS START -apply from: "phonegap-plugin-barcodescanner/SnipeITMobile-barcodescanner.gradle" // PLUGIN GRADLE EXTENSIONS END def hasBuildExtras = file('build-extras.gradle').exists() diff --git a/platforms/android/libs/barcodescanner.aar b/platforms/android/libs/barcodescanner.aar deleted file mode 100644 index abea644457ab2d6e70631c8b4acf2b2794320cff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 988915 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≶@uLBy0e~Z^Mu*7WQA5W|*y;NWzWB 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

>8PKpJ+FCe*+uaRbjagT)4f0Q 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
tJBIBcfQJ595HcH8m*>OfJdreNb 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

Jkc1$B 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 e+oKy?lIK)vf>jHN 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

FAw$#C7ZxmC}6>%Mkgq0$b2an$UM$64S-ZMco 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
nBqFx?LpFh)M>0KE)+Ml7Y{)t(pewcE0WuCc zTAz%`EfLn+0nTpRwIjHpGnwLc2=#W1qyys1k-<+op+EBL!CUqSk5}+7Uqt_3A|JtO z0;hF>26fA!VrkfTs_BOg`SkY29KVnUSAu~rsC}ZXcx81QC`wkzBQP!Wjk>dRsjwu# z)pAM6fE$IOXRAU)9_mFdVoZVtA%I7`L;j)EPFk+7CG<;}R4V5gvAfNPv5NGc1&Km^ zIqE@NyhE^j4uWKhVj)YfKsJGl?gG|uC9or=lu;a~aFTUlDC={C7~9lzGMgeOKT=_Z)L#@9vVA4RPsXsf8(3WkYMY9@^#$hLyP6 zU9?3CJP~PjG#%3KR;FdDrra}tPk0VIc)`_P$W;6=P~Op!YvZXmkv`h_F`?JSa?LUk z+8N;2$l;K&=HufS{kfNCia`K59xZL&EJo0hoFCCp%!yfl@WnM)`#auDNuIp};6>R3 zdqtBv5)?}DG)sblC*~)U_kNhYBQbT|l5H+kWC={Es&wjQQhPB<g2Udbq?0rO^s~o}>#< zWWQN{@h@6Hcw@lTXkI<&%|Byy=TO)*`SKzE|BWGk`v>cjL4klIq5fxqz5iiIIeQaV z8&_uu@&9FtFfWfIf%-Gn{kmnw)Nh5{L|#&fVuN9mq>#j#5+W>X0VhrzE6f%0a%;q{ z>rH1Y5%Rk6TTm|E+mf#5B)LLd613(0n^^TLtitBY(ydEd01-9Pv+4QNch`G28{_}` zm97uGBghrUzY|-C^Y+d-9UhN1Gm13E``a-eUKA9{Y1C2uR|r>kho1VK6i_GM*?g;n`U$bpFmsp1QaA`mwS|+(lIlF#K~^EcC!s5&e77F z5g>izg0VcOTz9qZ)T!2#&2Q^F!R>mMaM=FbFfeBmYiY9=j#jDdT3yn$OHK2@?pD+7 zz8gusT@pq{bXm3XV{Gcro6P6=hYU^kgxpGRyUmcb->%v08fF}K{vz-$SFzI#T`}ue zJ1?`_RPPxn@bp#COL55Q<5LG-JnI*R*|gKtmf0=%MS6)*n}p~Wi7OVm{mWe4AwRdM zy=l1)d)le?Tiq)aqZ)1(FNYh)$VZp_e6QNJ!&X~7ogxo9O7O1|SXM1ztUUx_MY|)c zG(wc(RyVKC45qE-41b~ybI3bj4yWhj2BYVWQ(ev7G;7r@9=f~3R4X>^b`3iymTQ*l zZdGm8YFj)Y;F;bull)zGyX%|jY|YX>%Y?5!9|sb-L-Ox@TschIpUAlpu3cUnW9!QD zb(tkm;Q?N*$(NzJF0hxvHVpTX@k&-jI{XMYARZt`EIk8yr*20`TYg2HvJ8LVlgvvz z!LpPFOl=`>rhj26DdE#2l()5v&8#zjJ>2ByDYNsnU)xSnoHRN7Ch`b+&`}VKt&>*v z#82R-#F1@kNA;2WL6NY|6@-t`Bsiw#l_)+Fi>R7Z2I0~l`C^YV3LT+7W{3fsHsv31 zx1D!>At!f`G7_uogZ0R)PIbsR+l#XygR4i)cc9D8>=kQ9V8WJIk|Xg<(DauMGz3-0 z`~+}de!>vFic@k*YeKzH{vlTwQt5b%A}3N506##$zZa$5L%yik3k%@(wsLs(xPPu3 zv-#_pvYl_qh!;K^lk)4T$eG5WEFLBKE+2_|J=00%9j0`Q};$*cIO2Kfvz+ z2!3LsOsO-o0i(xJ$#@SMT@hj@w8$7E#w?~!phqas+k|7%5J!>&oK8s(YJ|Sg!d#+S zU+B!Qw-~KYS49dRNJP@z=#?6wi<4;jRPs<_{#md{6(I0Ss0etGO-=5Re2K z5D@GCuMwwUZ{zvDOeu{}t~eZyRs}I5jVQuOe=Kpf%39!#717Zp zVQM&DIjIa7%^Rr*u*{Iu&1hBU{J)a@JS)Li{)^Z$!)Qh$jf>+K$pfg$p7;| zwRp`vvZlCzR8qKdp684I{r+|D`~9-_bNejC4M6wVjdYE$mgH0n>i9FAfI90(p(M$( zIn9|knqgswC^LSOfhdCz(TT&hLz>4CeF{_5DMs6)%BtUT#Lnc@?ZHLqrH|ap5WR9;IUVK01UQPSb-ExX>korA)XzE5_yoZ=wiT& zO<*T29;TJeU=xLTAUYz+hILSOD@uwpUFL4HUoe0Mz!VW#bXbWnUxJo?b)jysjTtM> zbOWPvm0@WwZ|>6%+#19JJJDV2SWL#lV^vbW3}%W`aU&b@s?nDh8|~&g$Brsn%FGk> zX-|}sG_S12NDy82{C)4z9&8Hb865+3(i+`5VH- z>s!fSUD(9nkxk{#^CfWgy)Ibpf}TQXE)8M8<#kunjFNeM!`P~<~rQG#i# zh`FddV1a0LadXjjv4}t#BklRX@aE>pkh(AwHzhE2STwN-8oV)X>0%wwUYKtv!MHQO zkI5Vyib<1Qw6|olgT2Z;$8_u}xK$SIX=?C4P^9Z=E5&Ipl`_s9P(?S|wf(=T1R3UbGhgtifExag19*TB1^n#dXB{HP}*`3J2oDpvbE7R(ZiQ~K3(!Yg>%?? zyFC6}mH~KsDt=ym@(|=bD?`IFM`9UtqJ$T9seA~E6m(dB-PKGmyNlmU z0xgSLqPehh>_1JuF%vic89Smim@zpcs6W_ZybPCFQp$y5AcdVK=v{jZDzurbhbd=& z$2YZ7igqwrN^8U^XAiHeF1gY3$3DJ^HOAu;kyW7cn$)Q(rp}muCXgvDfKr?dP6Q14 z{lTRPIsWsd6`2|TOw;^?VHAKn-RQkwx`ENgCU?lfRobn3qoM(~Pq~i^sb*&Rri;iM zcIxw8;5KM@=?Az%>-DeKiUYVmhDv|#2Cb0fZpAjr4Bj9(e{AusgaU5VR2pgnp&4*1 zMxEXppv?z^o3VztyL{=ju!M1T_hr|;&)-*fxPo9D`1;$DG~x;AT9^}_8o**Lis-^b z5wn0dQ4lGcCl@HBk@}tTF|#><6A8(RvYw0Am1VF#42?hq4SUpuY`3{AY!~x zEhni#xQUR^g*J}=iY+0j`w2aGkY{&(fYhNoyG4d!bNP+^$eiA^W4tLt&HUS*`FDb> zq!(BQ5NgF`Fv{d;_RY(5T9%D=sVuQ+#w-D3qVse#mKZEPS8*?Slo{_X9aeoW6&atn zbV$wF(_^a8lfSyf#i%9|`c1R894%d!S-nuTXl;$kWM3*e6IGL$IB)N)6<54g*l8O} z9_3uRS}!-W6SO31*?Y#H{jp7-spg7m9zlMneg!P^QcQ|=>M1qFSDX7NBioDH1k9+$OAMp4CxMp1`e@vY>AJ|N-6xJJni58W~t z;ZZzdNy0@N;J)RCxgwbpb5cuL9C{D)#WxK#Z~&~wJU=KPv3B&Wub@tYJ4`9yTPp_b z5;st%0Pf9MFsH->Hj9S}^!C)u^ET-3;LhTEsP9oBU`K+)F+%&`g4Zb-k0VoB9K>XN zSMU>xD4;h3ux(1iy>RN02J~XtEzo5eDOV|$XIN!snb$a^YaGc$M-X?Q+>S)Ty_nsO zP=)=d?DrnHc9{hMnah^sG9F8@QCIR6_COJ&OOciZ*_12~$Mi`PyAxHtxx7#oo&~bE z+e6P?9plt{Z-eTlZ2@7lz_Z_F4HA1o1TT4D7w!ys@L!{XdBa(~QP#Bi!A9w+bG(ov zz>p)yK}Wd54iAI<_bB4G8RQTf8ks7wzE`yRFOZOf({ZMJ*QXTc(_G5uNz~N$i*h~A zDe}x!+btUNj#+aEYrFW#9=d~dEKxVvu>+6jDVvv#-R#W<%^kF`OxYoQ_*$x1ss41=N*~%_RL}y7AZb)nUl#mi_G$YnZ|eD(-;k79IvIuDxs-d=D+T(vV1^&WS$V%D}aNQzsTw>U5sdwn{% zx_+RC{{egciZK63JfDt#&v>NP{6aM!s9J5vn|9nhSH%IlOM)-;8+H5}ecWW2mW8s_ zA^p?7pwtYjLkF(sg?(c7*P6=(&strN0solzVCgBpM(ZOmRY~wM!sW{woAb;p7Jd@P z-Pr|A26TMneR%^dMQK?RGcv>^6B7KXdq=GZZ3$b0O`}D+9-U?E|jyn{M)( zXDxbPx#V}i>p`Mw4ClM}N`56t;K@FoBl^-1ak#h1Dh5SN*J{jGHbO|N#d)0>{nN|} z2AF1VFGnT=4RxmX8@diIr$Tj`krpgnxE5BxWt2f*+^bL|4oBHFjcPiU5f5@pw z?+diGx(nhUmD-4{6y-0$aoYZ0m0!;%_?hCw}OuFUT8k z^uKV>W7`;}r6Ac=C7*W5tvb?~bV+I!9h5yMKU|xWKA&D~xV3{+>^gOR(OM<5cD1}9 z8OfR<)5ButXaE1ZFh=zMiR=GmEoSfZf5>8k3Gk}E@IXKa*g!xG|C0uy|6TmI7n!=Z zkIJ~~kJ%gltD~tJGDhRT7Sk9Zop4iwrZVu5FhX-&f{7F)XymALw8-6R!&WIb@y0p$Xa83Xu=5}N-9*>=JH(+T@YMa$EyG6?X-%CBR;6F3B7oZ0i zR<^ZV7W26r=hK|KoJ`-NLymc%4z%Ax5zPFT1Lt=X0=to7Ki)8bmxCuxT7mfNcNPL! zpTQ9f-+Sr7`6DQ*_Yzc}sd$0$jBlUG5eQ$(!Daq$u)M^4N2+_%$*-uL=bFg=XQzE< zrzdr?m!6V7@=B6NXB9xa)Cb1#Ykl^67{a)tuwC8)JG<{49hHMp^+%z7Fv9)_6-s&Q zmjJleTTuX>ZJqtb-ooDQp5pe};;z>A;^M*@?cXgdvb<0yw}eQw z;9}WUTUXj=*e%`S>Fq4sA`b@*96zveZ?a1h8_4Za69BlD9_@_il#Odr^y%I}o_H7O z3X8D3f@&29=RBqqk87T#)uulgNn>**8@uLOrt}jWIrZ(vJ;^s!CkkU%sYz6j!;R-{rPX4#1qo-!M4|KNhyeb`yCMs|s(P8#qOmb4%IXmAm#SK387T zO2$0=M{{c>cTj@>ukU~wooe%rv>6L4P$rfoCwS!qcG5W-4`dIYqMIyDj^_)^E~`2% zW>6(*>q%HeVFg9zjk(9QQiU5(y$N~)YPM*Q=p~1(*d}pvX~$9x+{e<-5kL}VSswaetjbkYk~*1KQs+1 z*u6Mn3R`}@Dg4!DuAhASl^7x^<*6g0Fm(>r=cJGlomC|kx4D)pX$I8GR`BF*NhG|L zfrmjPue9^9<;2)eQN@yPD}BlK5I5YsJ>F?4ncui2J(dqs>9cI-*!Wx1X3LdaTzNyiTQxX2oS?+E_^z7U#$bdHJ3> z(BkF0bv|P2?lmfN&05P6IK5JUYqWlS=Gqi3N|~RF2`A2U0r=v$^! zozS;-^WR*biZb3jJ@&PgF~`9&-A#VOW8dAV-%xMLh~+6=2pePFiL>;FyRq0K!e)ZgJv=v(x? zt~hk1L!{R>8&rv?Ohh#)1jmy1nI3F=tP1~eYwFj0ho5U&)%1{K)*lxSWb0S|O}y-v zxt>L}x8=s;A*9(D!tq!Z#)X2}AJ)DGL;ry`r~78>vp=xEZ;N!N{ifSX%_q=!C-O5n zxVvu)?H|tuk@3Sor>ha~3`HQaH7qRwXS8^j6}L+L_QCY0zRlm>$ULi_m^%>MDYeiQ9t-_dk&rRrZOxEeCY{b!xMx?;VnJ4#mk?U1H=+;VaOS z@%eM!`=^q0@k9w*;)T`7WrkSUUaF zIP-MG?{+cCDno#bi{?+taz(EUm0eC$D{_GdEeVHp!Z?+!ifMKFqi}(*JMA2~Y5LqM z1p)(`U3oI@<7maJ`;;$VjYh2s6_kz|n3HKc3uA&c>bLw&K~m2yUOHjLKSA?jPN-r>Uw&ExOkRhLo&qm2L&`Pl;%oUA5X~-SntDR)?JB5Cljnh*czVDzTieySO1n0Pe zvDh3o#HJ@93gKRHdTw>%9jQUhg% zX6sc2ZXkIiJ0(=c>rd@S3&L#f%L+K?1$fbmfjAAR51VDU9dzcP?nW#H6_mG10M&zk z7De6M#jRkoF4IG^D{Im>?#{k}+)*j^#Xfemxz>2pJcl4@*&9|x$zdfTAlr+jhYi7s z2I1tR&Rshy*JQuD%J*)$0rt_|V|a@@NPI1ioZrTr&CDj&C=FGy1qXWnus?&t28qnB z;)gNElT%83KBQ0~RkDSiNb8b;wJ0h*K^RCBZlJtcR?QVLu~SDJQ2_<#3UUj^30RPm zi9I4HlyzA7KBgnJ@$zw2NWHukIU_z8ZFEXu#6lwFJ__*Th6GU-Tvhi9vz+LlaL!rQ zr=7{}Df7pN{APd710i~O{cyn~2?KUDBKV27h?L$KG5(DFMQnT}8X}oRH0>afnbW&I z>PNyIps2V=zW&Z1lDN0@NulT^&>tDUM^zu+oQyX@WjGYl^MrWt#U0}DkUZ&(O>-}T zB^ZE^dI;yZB{H2DsOA+>WS*}v?kRn|E-JS#%BFN*-d}HwP7$x~55{yqhXz|~@!>f! zy;UC;kRlQ}USa?pbkPeUa=-^8_nIS-{ltx$A1uY7;|eEM$H(lPAbmu8W+_ttT%QEF zU%ziAECSV&qA_yZpSHN7=I4)y_K9NT1zze|dOGWkPr@EYc9*O8p2373J}Hb!EnK}J zv18)@$d@R`qgOJLzA*kDDz6A@|u$$7rxsAYDna_Du^%jmEPk`UnvWVoVfZ#*v=-a}1&KrGQK!Hpa zILymwJ%;(53(B{;_9F4C#E*zzkKvuIvc>1bkjQ6YNc)4qt+Q{oKy0tm`{dg4tpI4`< z7E1AQNKScJ~wORD_FQpED!alS!MZ3M|ozmeiqO8)N zYEtvT5b;CvW7ETk5z!!_sMYs53m6UE#geTk=NvTeXVsRxC|^%s%Lk50d1c9@1>&*F zI+cDmDR+>54Ec8ME}-|)Uwh|uZW?-d{?O}Ca{RsQ4lP~jo|@VSYu6s=^YF;pjfOog zWrt&YrmBG9N^W_$FJnJrkf|SSXtE_z#{9-%?n-4s@w3q3dg5dgBog70IGFF@Bwid}b$0y)TDX7h&c=c#envxWdlqL^}xanSMf257t;P?Boa}!$!EF_jg&AjlH9NeFIZP>fxQQB()bs z@kyK_V*cL5EUT1yhJKR8R84Dm%s$pDGnC+wc)#hj(R-_2A2vck*m~0uHjTus~?{%S%j-9J!xFUvs@ciJV&Lv+%YXce8HQi_d;tTNg?mEM?s-<6E458ahm zAd-Rar8uoDudsf}b%ZXQ*lQy&Bt)Sg z=YEX20tF|%Dt@Viw)&UKEU@W~2K2T5&jyqbhb;KB**76~njQH>qM-4!vpZhI&YFp& zI%+`@h~$Jt$t~q4w?e`YT4q}?{n_+;tJZhQuTFU`Wo$)qj=pdw;FOQu{f}+!NL5H@ z7EqpMvd{njb|?C;ne4yY6aDvm_W$_TH7z3zd?^C4sl)KFX=xn-2}DGJQA8qoGR8|B zMQ>m&%127?g}M!%hGpBjYV>=ZctutJRg9DTXs?3eiIkqN5D~A@;l`b%MmNNH|BGOL zHnrSf1XcLWxf}Jb*hJIq$;hwCrtvM zA%J_|D4z&o65SjdGfOkR>Rg>jUV*w= zZkGg8wZme*y$B=Q+pPBe&&H{F93ZwPro7E{^r1K9WtVdou##S;_g%;{oq{1t9(`V9*1HW|Ej|ZCkW;Lef8x1|3}DJI{o`)=l@(hiQOSQ zbwqpi>=pX6XT1N5csq$Si1m5u@jR z^~csbb>UBud@WknOG3-UNU_>*VF7Soy!!~}UV&k}VmvTer+KeQ;>Uiw4e|K#5@|^d zYX#pADx4_Ht zy?t0=n`Ok zdowm4E|ApDn06s)O@ZTkUomI$e^7YZHV|EeR7lI1n&*4#b%LyGx-7(Yks0~R6hYqo zi+dA1AE|0uR*alU2E+u4Bs(L=r|$z5c+yP;=RPvEGEaVuWtdaty#T`aTQGzL{q(r5 z{LR$f0@W&*wSHhnT;|S_DP5*_MYfKU$z#2H;X34g=W?&Vs1mlm_&vq!i@a)s4wI8( z0R9@o!B z8H}@b=}c_6^!>ESv*mD_t{BD|b=gvrrWUY!)!FSP-?8VWo1+x?J3g#SARPT zh<-GBRowJvuCy>$K)7aJ9=7EmT)>M<>bc15Yx)=5{L)W@sg;X2yx(1RU z4sp`sPTQ;#`vkome=<7fL=c|~T0LJXChWXs2+odm%Fn68*0-rw`ExL5J5~AajW6+B zF+9RS3Oy1su&Bs-iL>*wA`jVi@jnU%2znV)@s$30PX&YPf1kZt&R+kfZcKuP20nnG zcPzu!mN|d?3sVZsmub&J?T{cMOm2Se&fq&{>Pn}~I&)Gs3Le$ZB!Ub_F)H;Ab9Sid zBwZLMi47XF^jx(r&+Nn@eCB?sDTL|OH>vC8{L-n6GzI4Le z&2Fau(aQAFT`xV`TJVmv-V71Dh>JUgN`aI0bwlG-D9_Zqr8s4?PDZ$O=GXg@M%}tr z`eKkZ1NFf^G-YQXfR*%2FB9wYl4`FJbQV;vTYv6cmnF~MZXDpTb9LXcT&Ot)C1%q= zk2;z``+Sn}@lx+)y(x0Zvf%ZkfdlVK&A!_Hw=Y8w3vp1HVe;&7^7B!`fWGRPrZYV? z`S}o?(n-mbByIfkjh7_+i=1!g%Q%KeH91)O-`}vbP@l88XFT{OzNySxykNP)SFmc< zFzweXRf9?r_hF3>Niv$D`?@N1+&!ke@cpUY=5+cOagFkt?lk-xAAie| z_aeviq4`s=7%%XX@dmF`UM zq};1_FXdZz?FS{oMyYW5uYb^EK-6{2i+rP9gnkK-XWAFbx#s>N`ZXozk-lNO*XFp_ zhqkN{5$cIIDZzqvAKht$xguijLUi5pJ{ASEy+^kJu<3UnrzIh1IeMwJuCI*lXLMva zh`WOq-?AaO<^T2K&)-#Sbk%bN<%QNRy>;r{w{brsIOU^gFJ^(zVB7DxX*wp87 zDHOjyAGTHBhbnOyd@(d5{eJVuox+p(uBL#p6BIlHNezD{> z>Xzf?i#(s5rFu4VD*7Bnh!m=i$IWP_BTrzzRQT4)0<%bTBQo?ue@p1|{@-sC$YX{+_ST#sY}J(?AoCh9@I6?I}3GSEAt zbo2Y(AHiFTT35;@7tP#?+w`VLbYbd!B%%|CpM8dZSXJStVCpQGNBm{)Um|s1v?|Z7 zcU-^|8(l{Gs$39Qn6q0{iVvAN#7Im}YOid6M1 z`L%qNYkQ%z-FFjTR2S$EYB@?YvSimibN`-yA^4o-9E2`OLSr&!Xg47X#{S=5_C zRjWcDv-6*eGQx$Xq{bp6V1ws4d)u|4)CD!VpCT$|FtPC_Mmy9WqdyU$R4Ik-vCC~3 z=1mYP<~#qieMO2>-Tpr`n!7|1QPGpE7e)Ku#i^{VqotGEQ<%E_*IgQ*ra}fF5Od}k zO#Q(B?%=wfNVT9>iU3s8P)UGV`9=9E@ia|5Z8(uGa6DOJAZA>1H&3F2ihc!YrTwz{ zDepIy{EmcLeEe^(sXDL)lwB$`Wl^HYQ$Db{>AP0!e^Tq%E4-0Z5JLg%a5Sh1_r+bR zadsvYov8H|wQFeBs+*KDf1=vuW!7{m)PHE%ud%r1vyltcekc4U&uUy}>GzN2$6vdn z5cxupK*Ix1x_ekXixU!Jz0TNgxo8uem3iAF{^f|W#rp-a22X%KF z_k53lShY-0r+k=PVNpfwV7{%V+NexCg!`N2{?R8q)M39M>XtARHfPu1%zD1yL$!Id zO)48Z(@ZZ#G=1tAou(Rj!5QvItl>3$2Air35X~>84sEz>>bF+?0y9COkCjvz+f>}i zO{dJ~fh$O~g9n|4PaSHs>kO~|M0B__2nnh_WGZD3(k*sdNF<78D2?JIdhrapS=m33 z{-4)fS&_~WZ1C)va{jYtZ2ybv{_kw=-)o+fj?q9QSM~6_*?L>#gkrK~lkOV|*E4iF z*0)JU1hdiKW#qq?e4%M(d5`%e^%+`3!}?JZ3xg(}-t*_&!3|~|p~3GXzNL;&Ki*;L zw)$PKG(YZqFFM*QN`Gi7MrM61=X|*NyUz42mZ?o&yhxv1r!AFG0RlCIKv<0dehvi5oGXTR=1Qk+(x+ei<%1p#Im8j7#3nI=y$4j|6msvfFR=XU*O1TJoL8H%VAUi6&tTOjVsS?yB<0;VplGTd zZ;HMhv+GZbpv<^Inbgd&U72WO$?M|fMsKY8(l>BmW|ZHn+jnh-r>zj;))^jRMy@Hp zv^{%|J)UJh`^lorC}c!c3X@^vWDL_ao+Ue=32#e0ucTB1^3>d-TiRZ$BdSk4Ne%B; zA{py$5XnC$IUJSr%3hYa;U{r6kcFJspUm;F5@)6EiM5zx9q;z29-9_qrP}^Z0J&3l zfKW@QC5cgo={w$`x_5eUv>CY^Xr)JOaA!xIp3aT*9(k+A?#z>;mKYDb86E3&9sYz3 z(1j^MNQbHa?lZfm^^t#}><4ZCY}{207J9CKPif@8v$}{^FVx`ClTX{{HXLeA;XSd8 zv*F2MWbA(ZripQ4OU_H9pf~C$Tas0NbpoXsJDSo@kTTqK5^EyNT5o4vuFe{ttRfMs zAxy{bd)Qo$?owB#i3PtvC38$FlwGw2Z>j+crgP)eb&c!q-0el!7QX67_5`jk+t0W} z3pOe-hFScxaL>2A( zyRz+=qx%zz**em-BAb*fJFl3;xVs`-m>jyGSjf2BCUgC)6cNf6(iUJ7GM>>tmP9)Lb&BzaA7z%zyRii^Y*w@q+EBy>hut0jM_xf91GWba3v`2)UycD6ntAGSc;gT*=-ALauqWI zBG*0h8z<78*|)38eNws1(J8kv_|T?-T1bys#KKWt0e**H}cVXpFr~U zD3pTh0QrM8$nLtXd@%Y=3iUhvV8Olgjxq#Xpr;Dm|r%$s&k9quyH$+~+EG=9;{2A8_ zDeCv>WU!(cO+jeQN^{d4Kfj9QBY6MR<%)!rd2^rcfim+p-CDX&!~!ylT$J>(Unp_J$Z7z8`6$_JUbTizrq*D=vDajbnok zjTmY|KzVx*-)=pY)mL8Y^&U5$-3N z)0DTzFPn5;a(#cM66r-c7P~sHn%ycp4&4=3yEbaVf8scWznt)vsuX`~4LQM2gW=T_ ztqM%!jf;IbQazaTP1hwvCI4J#<`ltVWo86C5aJd2APsW~opH1Bbn%^W19`f*JmJ&B z>eJoZz6|cbgrhg-B&v`Z-_Z$`1~H{z(i`!}RH8W#NW#ur<-8W!(HY<2p)pOpakTC`2;uu$+=siWfj&2Jv`e0eB_i!wec*Kqf&#Go7$ zy;GRXxYp-3G?ZwyA@oV*gV@$!#c5{M8QrY+XdqtPDS0hDc`=RChLE$|Qs0JdPrgmx zT#TRyZzZ5f@MLJ~=Y|4#2$}aWc=8n8xG^)t8?79quD;SC#TMTGK{RC*5bh-8Mk@z# zaoHbl{mcX%oD&XZQAl!?{UdXL4&3@cxAl@A8zx*cv?egR@um0R`$`DQsiwCT$Ly=n`Cb@B6h-5NVH@QYI28EOB%`P*#) zU}pW;2gC9cxcTU+A9>RlaD2b}S^lx>8H0Hhd7=n+TJ$ju_DXo zNw|XA`Fk4`QM+}(mwuZjcGu#_MH?XdDMd`74|8dGnr0tgtStGchz?e9zUJ zQ&fX9)W%a(QY31##AoY|ic!RK=Q~R2%oaVb9qtGcOi?{Q4#bdbXhoanfnr?6ntplr zJTFx!Ca5Q=_pMPLft>vMsiC_0sZtjGvnX7dcf?5m!;Cy6UQW$HCYrSy0*w0-#$%S{c*>oc*sM(4c^ zNf&=qZfj)x&xP0dx4m97Uy_t&*obw77V&(1yY~Wo7*MsR^MpJOsQDjBp5BB_{x?@s zYA6yjVjj!gUwS6sMGqWZLY(@s4b|E+gf1sO)C5H!CqB~T^M{=H*u|G8geab90?xRW zWPmoBAu`!{`K0oQGju>5-WFD#1ML%IppfJ!i}=Qb^VX8$A6hD}gmy?EPgF6r?3 zpEk#YX6UoXfxY7->Bj23*vq|)W$d)&*!-d5A6orTce{l!7!-A^>+j{7FuUGN2s6su ztG#jR^wY!W+GVW&1m<3sI2h+rhJ~LdXcvC6Qd|+uYakd|E3OOoxMc2 z(=htZhv(qKJ?P$bVMt42!4W5MmU@?V_Eq zvDV$SV%JDTn2IU?Y_}apSaT!g(e}!mtP|YgcROv4;CC{S`J>~3 z9ktCq^(%k;#>&JPn5>fnO}Xw`^D9^uT{nxr;97HHjegiMgTLNCoX$;ImzQu`@yT-N zvHQQ&-hWeBu}@USx(LP7D1qMpP>$dJn<{vs%$s~Zi7rQvjH)^WTbm>*!V<@b1Joh1 zx7q%bH|$1LdwvPN9XRevf6A5q#55fC9E!wt{&p8k=Zt)Kx>XF;X59oTC&km4h|9ol~VQba@-9KrD53c*^nyIwDB&?q= zno5q3Pek-~$}VD=4}Lr4`xofV*VEAMlggc!8$;8!4G$WdKelYoeEkD*4|e(-6Mbai zE^^&DyM(dWh$Fz$l%-<&0*#E+JF)oFi+pD=VacZpwWAO+$6!Bm@lwG?_HA=8ZT>kP zlE;M>t=0ArYUA9~7JVgvPbTL-a<65TxS24o=p`aJBHy&w=%hOykSJpPVp*`!+vz8g zi;7WjG9XoB9o-#@i?y3V-NvE8)N{4)T(V{UonTKlWXB9G67hoZ*zmz=NzyE^^YgN# zdSIu|qNKXhdq#+9%V+nyFKBgdHn27~d7=g56QNwjUr*_x|LGCU3O(g{(ts^*Hk3#- zx*E{?5}!I<|CNPL)NDt?S5kAq!KZAM-wRao4eHPNqTou@M%UWDaokBe7{Mv@TA^yr zBw>Y&>)}gvMOw*X@F{U-*oeh4Wb?+V$_cG6W3cI$Rlk9E+Kd)l;L|lv=?L8#)SIpM z#OdHtV&;WW3Mmci_aK3Nj-Ow15j&$0`y$_ zx0rNc-4V3k`H62RRMBaip11FW1k%;4E57XG6nY0cW!zXJ3F_v)$&R~I*`ti@7t9Rf z6k>(|A!wB-^_(978K-j{K8sRALEVVC;8X0gK;Ax)0p!#9q4>RO{`EWnGNUrb-g{&O z3zZBD?380>u^1RMdB09)LLnxth{GW4(c|hB{e&!eDe~M&mqn zU>=)sQ#CRBB-ZavgU0JE@ZDNtGQG1SF=EI)gO+8A!qmu~x~*NDxI1-|D}yflo@^9> z4$QDUT&>{zb@{gRk{lUXV>J$ZSq)0ln%>6ep9<~l%EXR`lSj~7 z?1X2A(bH{*lZQOvTQFEOUu9tMG@65&v7c8sdx9o^gOr`;KaLz(ElPHP6j2aTp2IFN z(j>mO*5H&=aTRB=}nKVhert z<}WvBm#=wBVmuJ6mong8TCJ@oG@o3jJ=-#$G<$^x^{ETBE|156l6r@UlJs|2WXEjG z8`UuIx)A4uIXS{9h8C0Yk_e6vp7+={Oo^=__DiYgUk z+8%L-JoBtNVrEdE36L!dQ2iPpZ_J+CoO#6R4x{bvo5)hVR&N@6ue>|+a~hL7y^)Ou zUx61gG5qV72VVYaoO~x$%$Ey9ur?z2IU;z;J2vJqSOhL~bthDZv=cZM^1OXQyDRp! z`DwUeS9MSJ#C@h?Nyn)FD0W~+Tfjg{Ku1czfRk8%py*hY#DCC4%?q{Iua=NVe>v6Z zg{*2l>iVJv7!a3S(oYjO`ZlO@Kd=KFH~XM7a6_6uTTBe{FdQJdG4f6AlSwpErR>*ReS0*MR(4L z`3-(ssRyDu@J-NJ^cqeUw|~`ROfQ1$08D7_LMQ<{&lhXIMhjeo-589WR+p`Nfx6*h zG?rI{X%+!inmLgAovmsgLqFq{Y{+aq2PYLYhjxr7r1DPajBSeKsbP+A``LAx-tRqa3X;7!5FxSH8gv0}?XF-Lh+ZZW4qg@+t-H;imUcS)9FI~}Q>;P4;s zkdtb2{g@p2aZT~DC(<`d<-qIB(pblV#nj-F?aLW}?{X9r+-__L2wQCQ_7Ce9h;HxlCi65gt;b4qj4m^G zC(Az|S?=2vmY?Om#eMPvA|^bd#d~(05y?Ro1?8thWp|-|X;Ax?>*wf4mIaI_tjF~I z8t)ms+&DBWF2s?a$w!?UmaQe?%@?rhoxI`eE=SuP*`cQ#>bpvFhwG_MmhQyX9;{Eo zt1iX*KVa`85ce;fd(Wipt#td%;+Es%H-%q&nl)XYoT;nU<15$*?zFt_b8}1}zv3YA zs#Hoi>|ZQVM6mz7Bhm`QD&?=)o=jIc_+ZS30o(ANAV($dkBY4(cAfi2ve39G*13r5 zx`_*~x(bH>M5ClQ*_FK3A04jDObeM$GW6+>V$(Md++tU~liQw+_-yzR7NJ>x5-T5i z8>=RiG_mM{e6r8$7vFTwCCRvmJdev_+wpQ3G9@{-P{ZkVVtm~kIg!P7#egnw>OeU5 zAJ9E@5dIem&f%^FNP*+~ByThXcN}+dy$|Awe8Rq$W!$d+-VOzUM)f)FQP%n@TY$<4`4D?IAXXYPcE=>&^U8 zXAL&p-%p0*aO^6How@U@)HjtJ&F$ZbK;zk+L{XUUzvzPjOLbn$2d+w9Q@0!=sFz3ckQMCfdK2`wUfwZ9v*E!G*A zy{dqA@P$gOan%ppsb@YqTU`vDD=aFRzPvjt8s7H}^wF`>Nq!aZdO)Y&`)wZ#)oYr& z%qd429*Bh$x7-k{h#{Nnv#d#(NSC#LTbe(&u;{Z0ef}ZAc4?H=gyHY^yOl+sJ)WouU7iqdt-DewMt?6*4N<}4 zq%D&X?Y&!}zr(&Vr>hS7rql+Fl9$F5?Nx7X(_FZPUkfbP(lASpf?&1Lj9E& z$>_7_n_%^!Iw+yOl+o=!#FmTIBV9T9C_KD7h_Bxf-HFzQ|6e0!%kH1CA%F@X-Pn#8 z60mzJoL^7R!srfstK3L9O%(gEH@03YEt*oTQasxRLUa`!8pIH1UkYeHQT(2&LVk}IJ0y8Px-1jOhjc6>!d@( z8a`UiqLJF!wNx53$=37G>UBBvZ&!}?K}2&f6uL=oSx12f^re()s#=3VvXjygRDD%c zTtTz-4DRmk?hZi)hv4q+!QEkSw*;4@Xdcd?3>TNFxM0JCFqF;DRh<~zZ}zd-uwlQW!s zALa=(lhEqVeNSXpI{zxJ9NWGfbQgaNkQ?`}TE9SLsOono3I4|k{lW%Ed>s3#i2Fv`#&0W)^d_Y{I2WXV_5*^z5Fo=hU5k8vfeWnZaVfoyVO&B}}4 z$Ex!Xu2M)5_$xzA%T*Xr6|lsu^?iyl+j=ACF(+#^JKFZkRfCm_f=4Pi3vY)vODd!0 zAG4llc?;7grzNhb3+v;TSpedcS)HqZr19ByW-7R&88qr>QrcN*`aOMAn%j3G&aBso zpGFE|GYY>hhI4RuWUkqu)UhLV7+K3GqxAa9>?q1gj8>IO;J%jb;d4fjZlBxSjV3uNxLkFGAnJrYU!rX-ZbVK(E`5T`?FYizWCFa1ap zOAEs;-DXBlO+&|lXrEfX_D#<&S?{=3^K4ub8*?%@(DkxT+!gR~gM{|mEJ!%d66|6+ z8&PgqwS!Q;z8=>z#AteMynP2i<$ z{$_JuE*oMuP>Y*bxYe#?g&z6y$9efaBWx@9aNwJm*m)gaVM&P2Lj`=Uls@Me%y2?B zG!`&kWUwgVu!-(NfU}enlTFaV*JoSxB6;>ti|AQ}AA7i*gDPFhtciv5THSj{s=->> zJ7g){A8t^dK9e|`WP$Ns^YJe}lNmw3MuM*6EpO8;9dh9&CqoM11c@|CUame#S&> zKyine>X03(+Tw;=Ti!9I)j&xC40hns?U6e#SOP`8ZJ)`68TgDoYA2*bec~D~Yp(bu zzQ1s?OS)B4WpKKE+dczKaewf8eK(7F7e4t8i=Y{X|9n6B@!NF|hr!3eF;TwmLLWRL zFMMnlENpqT4|>u073!i}X&1@<4uOP_qar!9=%z8s$LC29{n!P5)K|iw7@NPyX!j~R zJr={Me6BWCmS6c`v(cb4J2?+aP*frU+)t^XtV)^*7qw9&28^= zcDoQro7UHtP<~4z`V2pbUe5x!qGX=wPUjmkL*G_+*xCaFg=*;JmTad6nggPD#D8sG zlvyS;&2QH+xhE;Mc53NNB#Rm}m81ZInH5{&L1XS6USJr)jKmKHO!klM*iBFk0Y-!y zhYY4BAj(cPrKO-JzKb(5L^~Vyba{&XQ8;IkKX7*JtZI&E0i-ee^4=dt}l} z52ek>;8N_=RCB;lcwE@eyPABW)B8Ug6<5$zc(U5+n1(oNwE=#U%o`OIwH$}+B5qLk zH4O@EG_h2zSuvDQ}{jn=p@E&BUoNX_}-M`Z_g+nty zuFsz|AyuA(;qZR>68%SQ9WNlcI+K>U@z0wpO-tV3J>(ZY-H01VWCjm#) z#U_pkrmh zpQVZ7`~Gf;o}V5G*8{9`M8KI~iu^P8*X`h$UFR7oB8**eA?jnELD&HTI07T@UvKfg zoF-M+Pg{DN3+Q3}#asjF&SQr*Ldj=mmJ#l8T2Yh&6tVo#EGCQra<|radiOSG_OtvN zo6M_07shvnt-Rg8lujhRgzem?b*8U{yF_yvzl$9-Al|8A&`bme4o@av2te{l2Gq{$ zeK$BWrEnp&Mb+9e-8YMVqmc^!mN2y5JTP3t+8j)wbu+Gce?D2;Fh)!AW>g8JJ*f_C zm@Fp~7AWWLUe2cMF#H2&1PLT=ATkx<`aAw+?KIiBoT1PA6#fe%tf=c>(O;-&&BMh7 zubutvJ?8`Hwtbo0fPmwKKeFTnrum@<`9hi%SPN?{EifyZFxkb5nFHx@kzy%@|KLiO z;7hfa2jbptxI{BSiCrS7OztjkW*3erbfy%FIQIhk0;r(joq4Sdr)-m&w;WA6tJ%WO zYV^&SWYq&Aw|}+>=N;e4(ht{;J>|G!`3PBlo62Be2~C#uK`T&8(I^|2ZsH=Mya0c@ zLuY@#uY74wGU&jp5Qsl~nYSgzHt$Md?z8j>O4rZTKOiq|@xLu~;%0~W6Xf}=sRZ%_ z{QGXP+XvqF2Rh$Bp#GxUe0wlUmRZz=u-`EMWB#9Bwt;IeoLRqh^Wl3yzcq*_G5j7C+ zhlId|-+`XfkJBxkvBpfEjLyGiP9scBEWp|HP1ftJ2i%%Es5(D*NYnS!{}tZg zDKCk^Kvxwad(3c#sFOec!IZ5w1rm9!d$uU+ZpEMXWznce;0~*_A|)A5)Oh{rqNWt> z&&+=I@Dm{-ve{RP%>!-(&@<{hnf%z!!k3UMvY7InopXCy6>-gSYTIqrU8Xv%x?|j- zVb8xo!Qb<6^Biy6y{T&QH^JG)%OL#Zs zaOVcu>9({);KU*S1-|5l5yL;xnnQ}B=TNV#EZ_bsz39dkKC%KN@KuYpw!eIGWBFB; zjqT2Zf@#3r8+(Tct>_L%m-4ZjVlpnKvTmsw{f$$#hB3vl+bi`AWk;{vx8&s?1Fp&G zEK)gh_1Dln2G6&avQ7arh+vt9{QlU)K7d7)9hz!o&A~!X9PPfun zc54XJ6$-KG6|4@bQslH#XclWQGV4>8sQchnf9WYuqsa+e&?wc<`kfv)#qp&W9Hb%R zR~71f1aNYx_SAj0CwBMvnWmk+w(|?kmD%v?E#btX{9!QO3c;$^<8;74z!?(3cQ0H1 zs#t?+Uv<&Hwu`oPaj^2U7R+~Zk0(MNbNoUhUhjn+Xl~L_tti+>@i3;gZP~CJRpNDYBPFm=a#(QZ`@lddyohrG^tC_P9_`bDPdq{o znPv#lW<^Xp_Jm|->3sW8%u4_EZ=ihhXf_MrpZr-BsrFjsyDaho6i5}bukdE^%f3gr ze%SsIP;R$mpS)4>P1_3z*-+PKUVHJM(L+EWj)w&Mg=(%ASlLSXJPTXE(TIC2nwRuI$1~~uriO28qYR^=w>7-cmqEsC? z_oKr(G!ya2ya-wrff*OL!HjuTwPVW6)>);X7gYk0RUt-)9FT@rOKE7Y)C`uYTWmfZsx{fkGb*LrdUop2u5-}Msyx- zDMUSoGAgnbbU|k;NtkIn7)=3nM5bQUsE6T6oSw(_=#u+)+N?1$qoHeIn%PzO|r z;3%GhD~pdp*}&eHFJx5_cEwEpnC8SU?{JOTI7@$!WDOoizdO@$`HIRAxk_m{A{-TGs9s2(p~};G zbFdr}PY}&*;O*|Yk@xI8XX9`h{IdKMm ziYss0{KYS%j=U-m{bH-6GOMvGn$q3^CTo~q(A8&n3^oEAU$-X5U8~O^@#i?bFcOpb*PJ*4jDV9mNu?8_W z3w$)3XkzM_@|c4c#vvUoBXP7QH}w6}?$KBfCzpV61}Z5Gd~7_54oxbZ(^hPJyo1UV zB6sw46r9)}X3wT_J0VDZ4yGvH3O`FP^6iDxxB@QN5#^QR6e*R|5DB^@Ad*CeJA7kk zDwH#xZb8sN*obOA#EnTD3ci%A^3)S)UK@M-4D|&NX&6|4~EvQcy&P1Ise$B3wH(H%Ktw0#YyOrY!H2s*vk&=9P%< z%Z(w?EQ)_*L_j42%*&FukCQcM45s;hpAfXXX*Sq2yDu)fJR*g!Jo-eU?2(ENb*$;W zwZB8vgS1>L?{))!o4mb6M7LB~hqD!-Jvqen=f`|r>d+;`^nBi2DK*khh_+yXIBnrS zC!i%r=r3DJ5DjRijE20V;1W{U@L!Aj%L0B_p+Y`f4cHfXW9SYVXEgl_Ob|!aINzu~ zy0YQkgu9_Q6tyS8Fxf;Ezpjz=&J!8))GL*^M2r4?;lztTLI|K+0Ma-B8&B?45 z^2EzY%36x$Jm6QGLi5@~n(f#Y8kp{bSE2x@*M9+yk7aMeLPRw`S2N~?ZrIBE?%-Mq z>gU=henT2vodvr0)T?#*m|1B_|1${~u!QZvc&*^M&`eiRFtXNege+}V1^(3&<1Q(0 zMvy%)!Y!UKdl$;qdY5A-)u2|(InbOL{_j`^lE1TKJJ`;Jp*xt2|3yFF!0;6L}T0}3cPPN_ZH^XB6 zf>QZn*eGO^(ej*=-x<>)m)$P!yGw3XGNbfbv~{Hm#QDnSESQ`PE60R_!bM-$Dru{}F|cepf=e`=gisK&i-6MkO@qPg zstV@H=r*K;7K!&P;4iAe7|hIJr-KF~=A}K1ivBB%uY9E4`N3BzoFO4_b}36_ul5dw zo|cQ~_?>zeTH<&Z$>+ARpA^@p!j?xj)i*dzZfHBFW14*&=X%{z;RfXjc2Ck7lxs13 zPF{w}!Emcg(!p=MN|(be&KZf907<)3%}OdtZSo5)`*JWWN`5#f$lht%2Ot;qhI-!py`$e}9r_>6^VerPI#Y%in3rLoONjFC$Q zRnBGw9%=?IJbPPu_-EW1?JAT^7sk`#mN*o_iv-O@4KXN&KS3xKk~P*u-e&>OAMeh{ z=;TOnhIQ+btEyUg1vg@j&t1t)tFTRz6L>AjMW#0xEd%y$gs7yW(HL4n815fSUc&5k zBjogO{E=9&DV^|e(9VW_u+55eNQPhMhe#!&Aje8G1A>CrbO=>Eta_|5 zBX4b_TRsW4ej=MUor(v7k8j}!!rGx@x-A^1IW}wBIELnd{ON1*LRDKn-czm4cQ>=X zF%mjvTG2vBgQ#PHxCS*k1{jp-3!Zxpv)XFc7}jpuKd-RHmIFoJtmB3vis*gI?Vg6~ zg(EIIi#eX=Zl`&OweCB|;(my4Z!T8rTs=EIYANb4ar$ZoYHD}|I~()^GZ6rGn+w&BF_%W3ESdcq66epHa)!_h}5OgP*blSkw$PVYB;4(T{osqm*JfKhw}mp1P=_jm#KZJ$-|!FLww3xqcafZ4PoWcd zVTVkyf2WnPfbEBU!6`j^%hS-YiI|_Ps}Q>*UC)<(7jWf^lzq=|w_zkL#cY0t&GLhr zx#tgl(!rq26D$8y|HrG$NK%I;rm#ydpF7kh|85;0EB}3VGTA)6*5QQA zlkRTh+ z+b$Rs`+^4LEIugtR}(UJ*;t!EJcB~E(k;$rtg*LbRt~&qry;Lic}_C8ZLye6^hE6h)x^^o!!GOG(98* zE>@9tQ(qZAgLLB|aJv_Oyh5iIb7FnyCR4*qhuJPB5|&Q+ORn{~hEsDz5^z!I5*|{w zY)gA3wj=Wj!sWOE)NLywj7beM><^dj(dSTr{(EDh4oZsg{$goutZu1hb+x*+;u!%KAiozwt1`LZTf_}m!^ll5Z*@^8+!RiFd zUkyWrKsAGUg4T-jYzsv@@^#y(xx9nhdQbfIkdO%w2O;`cdXt z&2WhXO-ixSxM`o^{Cit$q5tux;q zBL`{C^6--PC&Uiv20AX;USchCvpbU{55vt3^fM>ir)NQDu*y$5Y=@|xE)ZxahA&dZHx@%sq zFY;JWe65Rkc5t+Ot`2}!nPun75TfWj!95rrB)c^_87bi3si?3mgyGUWa_mQLay-c( z2q+3VF#3qCN*+=WFG2(PQg9vzdfic8P9t{mqXr;EvKL@f1)_!WIVYG#vNoj7yGRx5 zK?!PsKb(`F#uvcHn<^q5=5T~=@rPrH{-`rLAk-e@3ks0`cDQt*>&D-Zad2#Jf>#oUHNS^nZeAaltuAKF+aYLxD8 zASf)UtTMpqCn-k7I!zl~4M#c{2ykdp61y{s-_67vArgg?`LMrvYER_VtD>87RRKh`I6;F) zw948&HlWm{J`K99&kJ&qUk%x+*5{pHBmd>R6yNm}M!G_x9_F%+TU_TjM(Uhmc8^GK z$Wwoyiy$YXZ45pLXNh@>%_yF9D-QyX4NZ z;wEO++$W1vJZU(y%vX*SM;!>VMDwD*-1B?cads<=#Ttnrm_U&}k|9@f=PQJ2dz8QDzOzRsx6{s-xSsq0ThSLx;E zb+ooCUe<-@Fz|bZiVZjUO}A$|Y2eqrC>NV{mfgFwCc=l2^e>}1wV_Q`o?kRc+U4T| zoIQ zvs^w8lO{akMruI^v|)YMPtu-3mi>{ubr~G3g$;T&2Yac@BV1)zBLz^EQ_jFikWzgm z`-y%vSZWHdE+|%CnXmI+FfP73E!7P(!wS4Tp`x-QC^TXfr>C03CXKuO8E%V1B#Z9>})~8wFo&K(Y8X0@8kPHfm1;A43 z=*05)<-;N0|Dojud%3YyS>wp5*FsRoQLvLlWzvnHU0F|i+{z&-Fh*I9NTaw3R9Pen zhs;&iHBwzxQ#_2hI3XkH~G zWMzLjw%y*WTkYD7iYB?MsmwcXB(oV};bb8XK!29)?R@$Q3HDdKHXW~J>J>^=Qp(|kByr5`GkmBN; zo{#1AYeR~HjTBkMf&8A{WeTCy(;ymQKzmUkZxa%0Ry_))HWHO+vq~wrnsYv$_P6FR zMg#X0W>$G`HwyhW_d@$S45j_&A;@e_*FK zsT9tER~SKh(&9u?|Sc zKA97-kk~1|-!wT=ADV5v7g}PE5w0#nvXpSS|&6NaK*B{JXLA8Lxe>V8Cz}9z?a1+n6IHNdO=U`?xH2s<6wH7P zYzVjHrP2cUvol;1k(#h=1PXencWHd0R#3!~m*b+0nLN0M?tE>KHp!Ym8y9_J0tsCr zYxzTns=S^nxzJmHdr)dz_UQCh3))O+55zS2Vm>ka^qByfbz$F5aGQ(8mZn4-#7ntdgL#$}9Vi+)ZW?MIZ18=wn^uUaAU3E=HiQQNwCLr(&L!$7RqO^+! z%SG%iOZm+uZ$R1KZPdYxnX3&IRvfQ*Z$4e{)d#k>$#iK}Qde@^?;G%`Jx0?D-Sp}u#XGTiY+I6(?J$wL43FreiQ@DsYCB;K4SUUj1_??W*S3XfUhU66LQ=?}$L0*&HnjI*BT-q57!A#@y{Xeu8 z%3L&^HiZ!9JI;~_!oei-xTVr6h`Tx_)|J0>(ksL^Mhn4FV`eHAY)FruHg%DR8NtF) zBhi(ov}O+yCC=|aZ%CInVL!?r*p0-&tmKtTE;;%9V!iES%^sIG0CgDksT*(2-s@mD zBOYS|#Z05tkUnb6zL!7175r&fS6+Fl0FIePx*`4BjA`)y@)?PVChrO)Y0W;G|`{C$7-M zpOm`tSHJ%Yr0xIc{ORI&VoKE?ikl+SYx35qCnT!{yPtQ&WlAmFUf>9O` z?gl^ceNM_}SjC@{MAnUPbeQ}VE$%ob?>X}`LqQv%$7uip81*3|3LW@pK-?~9SWTcyPK;2Mc%}R zuhsLLV*;rw1`#6`q-xv6l5vddW5y)bPZ_Gte*hl zBvKpEm{>(rAraw*tdR#=6|;vcSpI$39J)BLbjAjhg6(tY3;)USIRU8a{+ghm@&8@A zs|kRnugJf#bf=``r`Lry!WXAaOscMZ+fTqXT;Vs=cI zi}J@sJN%Yy?DPW$3@GF6VGpVxHt1MVGwY)(2jtE%jSG1Q*-2F{0`5wS692_K^8m*> z!;3L+I4AHmQ!ovUMgd6YntQvf)L?$0IKe&5Oo)2ct6bUa177cUmY3wIDu$> zm^_GR|HEH4h)5HPM;n;a{QGB%%~jQPU#L?ROmNBSG5hZ%w;%^dA5B8}7wTqX5fvc> z3kE1m1$HvY>0Nc@phC0^`mAHW9p_*C^f$hcxR~7wt?~=4STge#-=47KyG4yTE_3Ct z#_#{&Y-`i!xX{E|9@_Z?47CLddwfYiY!;Ddbv*?0^LeLi9j+jDB-Ur<%dC(VuffA+ z;#(8v*>H>Raa@0PpSi1zs%do^O-wc_92!5<^qYF zqT#2aiD#nKFgpJjLm1Ri@kuQlr znli)HdTB+TIA{EtjX9NDvM&5A-6|2A66~V)aub^6iL_-*Nv5U=UydG_o62Kq9RAW5 zb#&*#lwa+QxEfE#IBV{IefG!gUn6wqA+uDLrvl3$6*$Cl!bUdPX=Egpq5eaRhG#}& z1(%ZU*r671MkeAT#X85{n2h?)*s@PP8c!6Y^G&4es>-sX4`l4B!UY1jmF4MxJ__vY z01LRkc3JMG**1CO_Du|khxsT`Q}i^CqD2ts#hfrR=n{w9P^L5k68w=xWPjXD$u>+X zGQ;IL(dOuB^hG=1DC7?y3m88=0!(=Z`UxT*zcm3ryBbT_HZkB2t1Ehcpelx<_ur6- zDcPeDgF@wf(Y7V(KvY0<9|W-Vkmfu>#vs|BDD7YwREk?S$Qfvf;aed3q%n+y8276G z;RsX#vYrN-`L__bMS4UExfz#2_c7oN_HH4B+o+SnApJ4UgAvEa zqv=&f4d*roVNZ{n8XNmzqcJopuq$xPr?=Qe5%YD_#vSx|l|>bAU;N5nh#xt5w@ljvwAx$lcGeyLmduzIUGmNYjg=^=uW*diX=cMH|u>1PM3!_Yxp3ed6;<_Uq| z!PnV*jNn0lB!I!`pC#}akUVn47p~6_UIByw#T>qXc)_Xwa$cxBY!Ev*(HDu0DmYJ} z7ph`>JZ9`y-UdDe1;2JY8JzH36zz}$@iC4lnVbX$+#d_WY^2MMo*3N-4oNK!s`4yj zUmY)J#Dg-=$S9d2(N2_O{*&p`hEbHW6B=z49>cXCu7AIfM#`eliE2V-Anf9jiBCZ! zc7tCrcR9%zgZxN#4^oIj675l4xQ8)6pVCTb4&>n@GVyzi;Xu(1Xna)jC&iBY`h|SW zX+1!l4JaP6mCzg^QA4yC3f~72& zVhk%ei+p%m1$+T_e)d%E37c+J|3j3_{9;7eDfSSW`Pjpp2 z%l3_%%jZ0QkU`t^y(Lu`IfO23gcaJ9c7-|~J7y_hx1Y`il zviGzFeS?{XGZq9X{{nmi#&Y&lhY$d!G02b_Q5eWU-ksBEhhtFX93TVmbQ-)m3b-7Q z@5obn4{(GC?OM*81*k*8`B#CsVXWcMo^^v5V3aY*ZgZgLVe_CthhGpG_(9N}(`JW^ zu;n};fAF*xiaHQ{{AuD#sRLjFAhzkDoB?2f4DBM%(*<(D!1;@V!U9`~Y(6DJdEtNt zh;;3_?Lsk^o~KN*C1X6L_(}3)`ubu@l?|-bvC)W_nj@KsSx}`=EH^%Pb9+uWX)hE#JX(p()o}~6yR_% zFaye5GSMiAi7R%I1%=}l2YjlYI4{}+*@|EepZH5Od;>et9*F~WIGhYOgbAXKYIwRG zqHajk17ewQmnP8ylWz(~YoQRi4fXjltMFD~Um+SMHfeQh$z;f5^ zL7)S$f9fPXOrIT`3-}HQUGo8V12G^%^+~~VfDxeBIZsbtiPsSAwZJY}8j&$Bhyt9L z1?L3Zq6a5dAYUT(a019Z(YB1hUf#rKiHv~Xq+~E;yP5!fXfFb?-8Nu0lne}-%Oda` zGV}yFNS_AW3E1`#C*vjD!T_~wpba-d@S&hp^Fp~;0UbV7g#NPthJ30dkT(-=34E%U z4I=~j5Yeh1@LUqy4QjtD9TB?m53IS~>DPX3RU^LAjmy8?{`qKn8dEYRih9$p1U*(! z7SBwqWrzA2w+JQ8#rKG-)c*A$N%0J_S_;|;O zKnD4)>Ar=79z8DH4#|pMy#|tn&sSZNkh_3KBC=8(zyQGV*rZuB1xN>ABPJ^q1#H7- zO)T_%4~d?FcAWWki8B!fxp#;o=!>4W+pEV#`#CgJn(2!B^V)&PhCo(|2=E7nANQ7s zdBwn3BeG$Tl^OwjfJloWs9~2los}`f<67Yl)>4n^bdZj-S=lXpxoz5irdo-2YeZ$t zso;bW|1bwW8p9PpM9zql;m}2JjL`nk1a#~pHEFEkpU2e~ETeFTH?dgo{ zpD*ek7$|ER=W4X+80WSCJ^z%<+PONPT+PcE$nb^4pE|4m`SEr$>E-+NNh&Qwu>PSU zAJI*z!Ct0Cm=|i+;sEVpL7SZwgIyzSqabxF(P?UT?@!>$a*&x1f83CV%ue?uo{C~2WM$lt109ICJ% zULWsfev8a6*x7_mnP}_HmU@`$@2W-pkej%lvW8C!5ZGb78W?ckweTnY`x0>zXktHD z9gU!G=gqC`KA$|M%2|#v>}9^eWqH9~VWE{9 zmp^J%h?6)DR9*Q+^1`Lr@u`hjsV`#K(4yBqbLdkHCjjA>tWV?+?8amAEsEF6xsWOr({4gL_=ky>rM`tE8wqzF?L zArS#xLP=SsS*OY+`yhx*fBj@NXAlwNyHpYgXW*5T+$S$xT5DUMSxde=HwK;cnlMv*y*qwvjizI$%RaZX5}tZ5~Hykx)cji6@z zA6A;+U3sSuuH%fX>&PPaUL3#Sa%#Z`*SA%VxnDl2BbBYF%(bNJ`q?ih!Dlx=a&Puh zbhx#C9Hp&yE^GfHG8p`atT2U5-_& zAO4*r+Otwz1=?4qz2a4ANZ;G!E7t;N5xqO^M53cQ2S3t%zwzvqJ-I{h~pSOk{eRWnf-#^fd^|T_gpee(3DRTNCL`ll)PxPW5mtpW^o5ou6 z?VtC$D;RJ24vNjGtv=BemPDBl){&D)292Yq6FdkuH00^RGn}gDR)(fPDLrOHuH#v zr(NRbv6VWb55nb=-8M>X!r!$qrmhzc+TM=c-G{2$;s4}LaEsK%V$v9_4J1%5S0>I+ z$uQx0ZRiKsj_8dZaPyzo)e|j(?|nZ09luqkCOhst(AF5K>pt(FE}o^8&ylR04gL8j zzx*}Td|T=(avoUvOV(3n-QaD<{rBJ3b?(h(qgcaWze&dRzedr=H?6va(! zP}}maZANb@Fi3u^Svh`{A71xtp>v%G;J3D+>##}kv$j=p(xr4>rf_}?Q1<0Bb5!?G z^iDE7-p8HowU|6lG4DKTEvl&Xt)TYG@HmhWA$*Z-yLV{v=4FP~TOLwsav-?Y+qHLm z_&g6ZKu$z~J#AK@yRGWX>8#8QX8wA}=^}}++f$Wl6-oDvwZFSTQ;x$CuHpEF8{_$5 zbe;_!IyH-@8PPJRxS*P6f|t2NvS?#L<^=#T7C|p z`mY%Ov3dDH`rMJ&x%;@2*QApi)s`4d^LocJ zhlu^;gHi5kn4N@rd`~Y&8c9||`>pQh1z%1YpBcw0o51R_@6~>yFsrxg0adbg)$pEw zvIlPpJr72BvPRsOcV`c~mvr$naDBfSMWt3U){L(cM>6W-`k!FpHFpno^-U2r{Uj1z z)Tc+2k&%*Wq$MiVADY8%#d-Ez-ZR880qt15HZE{7cTVI0n@SE@@0FnMJYXi^xv4Cr z&u;dy&eUFWP`g+L%S7=j9db@dFrvtt{{78+zgJaeXBt_U>2O=izoFRcKHH>D@cDN| z8SwFPbTwT^^{-T4Iq2U;W_UU0jrDa<^d0Ad0FPK>xb1>FIz3*}q~T=3fjM*47~>BM z*vYYPI?Xv>yRivG6_4<2rUpPq4f92FHgV+Y3zaK;U%ph!Tt%|P$7va@ZTV{lEudIY zt-7oHT8O0nDxhhY^MF^Rby1}!YcCjFntKvs5*@w|6mY0U#cOQQI7O%6}B@7qMUB7Olq+4+v75EXq zJ0Fy8L)oO%_X!DGTlwhwF|x=$M;5IY9`L`#S$O9_?I};8VzT1<3BDA=zf|%|jKe6h zJ|nnF$q|mzKHGJ^UmtbUDh;=YT@zLf_RCMndcz;QIFxtn`x19UZun1Q7%6AHeZ|2$ zH%-gNX>6R(!>aXZn-icnHj44BRy3Uy8TVKFuoHWOd`NXgrF4Q`G=w&*2*Qm&Ue3^i&H$67&KpO^913p*o-+ezXwNLxT*UD|w;gT=1^?tD< z?P`G$`Y&L z``IAp#UE6enX|MlORfE372C_K3iMRi{(Ae->eX|tYJA_nF;=Q%(QN!$@qK?1QxEd# zV>=&@TzB`CuL!xQhx45k{kBX_Bp#1{WQ`POLW+FVNfYV2AAGKd)@LM*8S~k977k%Z!r1~w? z5AEMFs5|me{)fzkHCaqAn4AWD$FaheYVC>xr3{Zr{tnl%gcf?J@oz8d*=|jQ2A1eU z9$ktTcvk0B$~-z$Y0^(?bZ=$c6DxORoD=k)eMpiMj#J>XPu9{nPp)$gx||Q>TT6Bn z-JzF4yO0Z}F}|5Zv)laI{eJ*EK*YZx4QBfw5k-y}6b|HMbi-8+9zKk)qIIRoa@{Fp zO}a^m`&FPApI@dHPHU-v`sK0%jl6q1SIW9tqYR-&85-JEIr+ zd7U-TaVOx=X~#T5G33FIyRvEu+uBDPf6vnK@kDH22|PI+{yEOEbk2%Zp6JN%x_wuB zUP+K@vPYD_D&vJVijA$=(blMnp0(2zs#PCx-qxq4=#5-3hYGa&|L(j?o=HBz(Hf7j zkm4t%idx6C+wL$H(|jr{)Qddg+Kikdq;M5F5WL(cM{!gz*GqA$kAvb`XGo4D%^szM z_OdXkb=M%<#I2pk2>B?hSF+T5J`8p^L&+&EyFgM?42^L~)4lmKo8cv&$ye^%mqrXK zyKTEjsXY5sQ_}o?bTrvChoB^-n(3N(qtrVp!}z+(ahJ*uMBk+_hBkPfd?(U)c3v&@ znmOMu1M^RI+~u3x??f_w&3~hrf598s@JI0c_+2|qF-pbh*5qGv(+b+E-xN&GKZ&(8 z;xiF)BJgA)el}5izHz#CbVOGwiG#U(?)F2Tpwk|U;g`y3odjMJmfX>fXz)ymb0U5x z@(bgkc;V^@6D@ln^E;|mED`b8nZ!rYjdg7&To%bK%mNh5y6EmY2_{_#uW~3Izr4UI zK|V}Z+Lm!^F0YTy-yru{?IcIH&CAllPLA;F#ih%}1(-=CtvGdaliBFXKTH-TpFaP* z%UaT6nK?(Wr$M~bP~NuE^o_nLcHTzx%7f7=qvDTA?-&Hd21G34*@gb*5_IFur81W& z1*VJ+u$Nd~X5>9M>qQm6b-BWfT7lZYSXXhpaamyFPy5WIf0?c3c-0$BQ>+bUbo7aZ z@$o4O(%hFNbEM1MqV1}93dTbUR|68i%*za51RN5cJ|=XCRH#k1Aa~GwpEr7AkCXCr zNh_fhzKfni-YRn$CsAUG?bX*Q+tD>q66|G`wpo{?#Ye}6it5TWYqvbdjc5wImlX`m zJZ{*`tI@ok_s@-UTK+!oD1Fs~)VN^2>Eb+{lZBa!b$*%jyV}uvUv7@^Jg+g8a2}>( zZ>TYywi|Z*RH|C?MmtYL%gaua%)?HTTi=e&*r@4SN{UrPm1C5*gUr{w(OAAGV>irA z8%Od|s`<-|Bos_Jnrlp#ZVl5NJyYX3b1`VNv@zR(sEm zUAZPlnHddg||1p{_?MKMxsRrvAP z)jP7uf~=!s-bHn?Nsc`4_Z%3q)mA5pYDDvg{pGpK5*1AKe;#6@Zx@#_+G#>`U-oHTj$C7Uermey&t6DP7yd|@ju#CSO-PnD7TWHnjbMbap< zbarXH;XHyCTvF6xA)Oy(EahBK%Rk!`+kSm%y0Y}TDoe$x`z>F8dWcVsl=pT;b6`#6 z)7e!Y9Z3)6X4G!fa%b_hQ2+Rl)qFExww1JYSH$(t)xnUK_8)FtYQz?2$lc4ZKL?b` z!?K76AMVqB98tMiO5I~L(D^eF7n)USvX3o_5=qt&$_Ni9YrVPaAU?>Wl9l*ZevV+s z@m6{K!?y4YmKH(M-0;?RYpV6QGqpTDw`mmWYmfeX?Dw8wdc!ULUT2-}j2M@i}J=E<^46)WEL zl9)+#a`>8cajzSF{Hw}ec)&99u9IV-o_fx^&^t2ZkwOTcwtF3SU@R+9lD?t-nUL6z zT?L9x7{4IL%|SgDt=_qpmBj(%UBX`;NRx2rb=ohCpGgU%x6_MI+L3RkffN{+J5RKMAQ)PQG;JeRI!6ic~jbp7H! z*n4HrVVzUgnm-@t^2^@cqA7XRV<7)d{>}MRhcmO--%M_5)Bd@_TkJFjZ8tyM^^N1< zm|Zz!oQ;Y#cRF}Td0*KPo4K=i&9^$60Y|OGaq1M&)mu*8b^TP`~qF&#_ijmLROK-{0o1F=c8%qg^<~GQsEb!_a z^mFMB>BuSQ6ViI0lDlHxwd8TO;7axyj>LiA{~Y0y&X5gN18m%x<7anUNM|e`Gu^-(Y4@}*@hg;uijtM2c5IZ75i8@`Ct1?|MQDe#*vptW|SvR z{AE3HLi+#vi>``@0%;_wAe&|2O@AzB#=~eCz3G?a_c-znt*%2s!4EP7Mm8016en zFlOR7TZLE5IusobQqFuhk^6yFlbx6UE1RBEEykPcZdZ}a~#6{=*6x55s71&?W}+`iKVRHJxc@9{uCY3Tw6JG+ABLzxDtagYNKl zZrPB(bAc^CAA~HFopL!Zz0;h$#Dr;Ccq=zLqc3|Pptb62ELh&Smi!}LgvYqFxY(iG zYJ&5zzr3TSag7*tY|mJf-^RqvGkYO93sPT2gM?!pXgWVoQ%fC#4I_9M9mq$QFF&DHK|S3Mfv-8 zy&0z4Z`Q$DQpPCVRzH;x)>(^ZuW1~RRzH3=CW?MvQY-Z}qtq)V^eZu( z(y~7vxx{Z``slwkNvhX-dAs~1O0{fcp_tbDHr?iTG)0g%cb9&5>uGthg_4(_ZU0yl zuFhRKQ|8k`?*t_aPgnw;*;K;WiL2fI?_K7i|5W^3`9)USec56t(uT)uN502EYKrCXGyf-1GY9s>@ElC~Y&)_B^Gel7KdOAojsZn@Y5ciL!DUp^Dfc3-!!7rE7G^V?d|kE6@d?ytL<6>k-vbEdA1nXJ#ReSy;P$VM5rtJJXp z8R2q{W;_X6bn#PdW#Zk1N;1lUU&c3mvADKgRt;PDH~f7)3ZZUnK89eaO?dECU4m~L z<()fL`o>n;X1+IXuyth&Ju#1&U+Sg)%vRlt{d8h8P9cN!d@7T*^BuvxZoVcf>G{#_ zrBup|eKx}(=`dviyW{q!{o>o|bmf~1{((IL3*rJ)Dthiy` zPWge?;?91aiJD3JpyhF&W~%<9ZH);=X3o8FC%oz<6Rm;3EB*~vaI&m|X;dcCb?@p- zHAB^~1Y3Q()8Ego+`4}C$-?lMZI0UYfxCrI4unaR%4&pLP5`(@SS2?rvC0 ztEuhy#MVcbmWiee7uUryjdo9vjNZ4-HgQj2$fdg?Gs8B_%KT&UZgXFP2$R8{v&g?H z*{z;+v67cJ+&I)TwjPE^)wy2$NtbrFd)RS@4^Q%vAr0)bYJLS|4s#pVAJlJIu!nwC^&erYJ z%N*GWEsS3hQNQG)G(yi%Jbubtv6oqy*C_RTF%1`vOMEDiNBqy^jpb_`?Tj~u6fsxa zZ9T^Z2^W9#zO1Dree1z6&@(aE;q!FxmAuA+{lBwQ`{%wZ%bnED6UGM89X+^5G&6r5 zS0rPnrTn~K_eYjD6rBDQ_zr;(WCPxOW2UHO&F=wd#`TE!r< ze)I5#Pp`!KTk^++Ph|fT%G`eWb!3}4(`fE0X7Odeog`%TPgV5==DW#F z4P427b?n4Y!}k6OMduT0H@EsdPN{#rVlYQLZToN_D1&T^$YM^{^2p}l z9PzKqsnfm`0UMOAUG?r9ZSewgQs4hv^^xha81(G*Y20JTT51=V-}faI!20Z*oarIo z;5Z-(>DK=0-p0wb^W1iRiK0V*l}12SD431PS8)YLze{BKnq_Sn@ zo=R?u!*WmWvV&QXI{D(44@;Lf^&FWRKi2-x^ZiHqw2|6UZHIGD{EyC$r8n^`7Q0M! zHql#ziJ!j4@T9bRdQn+e+8oz08ZXe9x)M)5vzVH@k)qLC%h0I9qmT1QnA$m2KYn}4 z!FF}W_UMAf9f3@GX;MwC+(+#iAKpunhUem4%vNLiL7kWod~y8e*H3(}{M|CEErH#^qGV`alJ zcz$9Re?wvTqN@2opxafMLFv**Kb=2a?D%*&;I7%Txj?)pD!=Or@kO_2_qv8d^vsiA z?>3zB`?t0iY@s2ueReARU|l0G_v3kYQs(xLt2%RT{)FzKKks?3hp#c5`eGjYyh{6x zFuQABW}rgaR8##&eP@5?wWA%|=LNGI;a#(Wt&VQ~Z))GZcdCsLoZja6^WdpqRjAKT zdwW{dE*0ZJxgi~XEnX@beo8T;xai;Rn9K9Z(XTJ}`1Iay6ECL<*Gf;I-Sa!-nU4fE&7ui(3V&^U-s+DusaGGQWRE6SwU9T@Xe zCE??fqAS^z8q|GwH!m+%X>h-`-cjGgG25q(YsY|t< zPs};%KX_hv9JgqBlbKv4SDLxxJN?vQY3Z}|4|IO=V|{T|TEYB$f09d6jcvnQ#_xsyQyS#r@v!r9`CH@pP^k|xE zCe2p+HQcnjL{;{Yx85YjBwohogJEtfgTvVS0ba*VKc4EH8qcXd37X-W-H*E5)vulI zc{KMK{K53&E{-|4RX$j+y7Hn=isW&?>7Pav67d%(RD?hMy7ujcu+-$$xaw+sZDvKO zE)DkNwx^W4o|r6scRRfsvb4WX5E~~v{igSR+0DkN=75k+@|%zU zP4xS)OD8U@j))h0R2)`l82H;zGMxEj(y{3q)y$GbN9;S!D^vJs8F}8C3%Cke> z=)D@K<#o2jx{SQI_z|IktxzvVIRdTNoz zJ^t#NY{KpzRo**l7Tn`D&jU}>^pl$KWGlu^Jrr#uPVHZEr|QjqY({$~z&-j`w|v5S zikZg^*RF*FSvDW6)E@$A9zv6~HCw@{ZoT^t-nzTLPSdnYt<7ek38?+~4Bv0!nr1@c zT0#FrF14th5W}sxrnCf4jW$Y|v{#ds*t`yfePqM7Q zIU#o7#M3>jKHCGBpg6TNRu zV~rNFpr!g_H}-FT8Dk~iJe4TxccS^bQ$yA??ziXDT^vyxFZrCjAFZ<8`=%8hhh&*w z4I^xMFCQKD@Ru+-SgXr*@W1PSwtqV?DKi$+V-qtFk^7E{k-o9hX5(P4W4tWx-sMc` zUkB%23Qw!^yK2mTv`+9^HC3OZ`|)%|=7vEZR=XGe@m6xJ%tYn`*5Tt1?>nsu9)T%3AdhTP!ymt57dkf@Z)))&{q?(i=1=pGJn4b%t? zcwPVeUhbiXd~V773uiT=|T65->Lu`Mo2 z|JLu@TOkwK%y*ts0enf09)Y*6CipF3cc!8}4!#lfZh0hp35(jkR&v}Uv>Q#-leR>Ng3C;ZSFgm2Tko>Jp)7`>T=i6$d1w-W27`t})Hs+Icd-PuY5WYhF zPI*y@S@&7$LZNT+wutzY{hJGKwoTKVQ}Ns#Jr_yGn&%BBJlArK9*UTr8*{3DqssG^%9P91-mP9+irmNXFK@b)nvH>=^^Egq zg!B&|yC5-=RjvNLrYoZ=n&MaW&XaXpmGFz6QV1-Qq7|?2wJLG=#W(nDi(%RMpLd2% zYH~SU57#D%Ro``Q;Sbt_$~y*iYea6IS}EyHVT6zAHGDS7J2Fz%#0xP?rMC_os=3m1 zB_3SJXrIjDu!#N={QjnjPe$eCv^VZ2{ue3l7+qP|ZR@7u72CFLCskRoZQHhOn-$xx z*iOZ^E4Gtc``dT#d%y3X?X%BpZMAp(d4H_-jL~~vW4?2uio2&Zrz&7e^F2{eY)_JG zK@r9r-ehrUCCoH#^}(9IIYuwjm_JEMFJc&`wm=`Q8Pd(C<_rGSbH7&KL)6in@h`e zYozNGWjkqSdxLe%*@|Ub7%k6^mTpZaGOI%}N6p!Bzsm z7p609QV~xwl_1A*N&;A8G=fW*bC@QmNG3TjP-U4INa47k)29JW3ruPOd}4RZbg{6V z@_j6AO6G?vo8)_9dNnzSszLL#Cdf5c!tw@ z$6XorOQnC0apb%iXv^r@qIbmeIslxf*zMij!rc%u%_Y~O_eppXatk2r?i1%Be{k`i zL?pCBp*p30ne_T-x=KA#pOn6ID(Ss$q5jzoPx^xT=b z#hUADAvG<{&2I(l#m66l0AkpP-p;QrpQlZ)?XKfZH$tedr-eq4)Ch1yS<$%2N`7%6 zITG1E4#X@glpAvGtl%^IE-20&pu}5)@k^v}yTs5Gfq9!KN2{kju5H>BKEXyrZN)j;(L+xtMNQz*0lmQc0C0DS{-?Or&zX~Rm@JoB`9V5l`5+(>4x1rp`@RNa%vgIr zmy|*K$05z~tvs1=4U+xA0S63~NfB(3Y6uBXM$Ib<+3LDASYoU!67qc)=toC3;!t4N z62b$4AyZ)&BR77B?W>hhy2vyURy{fMqU^dx7ORB&J1e>lJd+*!QAvp3jnLxo zKDuyrd6PN1*F+4r$-5J|MNoC#x4nwY4r0h8mRa9Jsho^*IqS2R9L)%zcGDR-pN_5U ztu^H4j(7IG8o6f`y>RPM4l3AU)kS(|ZVIw1+tQlZ=+j?Aj8>BVy(*V4S`36O-~=E< z(Q>UerXOs{Xn&Vu;tcaE>&Z6T1p5sR$`e*t~ zt`x2eZJcdv88mAx$~3o3%De-Fj8ii_?V9zO+V_NKjzNf~7=~Eq(5eB(9bE$G5vQV3 zfi-kkEOcT(*Zu66O$1zP=*%8m?v#ZoJG>~D&H#;ag}d;8n}g6$6pn8H1Py|vJ4CG| zQ=PD5XUQ%rS4@VFXn5%zFnES(twuY%F_*paP=H)h-XnSN{ens@Bk zi~Ai+;PKm$n@{Jk1U!NZPyNu#zEF$|m*w?}}35~$qHS;HJo&I>Z z6s*83Q}CAs*JLh;2}}SY#1Y<^B)U3Rj#W%JUt*o57RTHh>f4B^fWwBg%tBSTt7sr8 z=JXF~6C2=8;&jcUg7n=8v&s)6KCwdehEf-aYfCO3e1c|jUZ}hAY?7cGq~+=dkL9$Q z+myvrFYF9zCj!<>1&u^XMx>bZPx+!d?Vt>?nR1-7wM6aQnf4Lst__3eCf0_BQVkNzsq>aI-l9Y1XYR!=*eP`fwsXWKgxGo#N?2*7J{TYpfaV>)`J>BS7 zPQ#vaQqPigQr&b>*vL@iaqspl@?{Oekl}1PGF{ZLVbMC$Oom9Ob1++V0Oywa3#p4R z3byy>R52Z+d80^{6of1mB4Uq=?ZusNy_NTwP4sl$4hG?r6nYHzK00TLtiijo;o*^D z@pfEA6iX;4cLxiP1&SyODO5(nMPr(FM@`?a?kz9Z=4DR?V>#396O*|Bd>zuF2&*$d zs*F7i?#14g7Dnx!sk=|N=BY{EjMkF8hE`+u`1(mT3Rlh4wgjUqgfTw4_TsF;kHDq< zpkq&0pCCIM4X{S>msb@Rm#s|4OYcmb)Is>F>W>44B-xa5A}Qt6!nf2O`JoBu0zsBG0HEMZXry)tVJdL{w> zd!|Enbgjy}dWw{{qGA}UuSwDT{k(Su4h7fhK0|2YuC$HDbnq<28TA-Rit1<=uM-We z2@_s*gLfm)xoUvs=-`H+rtV<2*^-fN=j>j&F7YVHqos=Fd0{#}1<+$Vr!iMYe`F4U zcmB=7;{(YfNL+mxaU@CpF+SBFrR8=O9!;oEkY-sw~u#cuJS=-S80G|-K(CIx3b-Z#&TYboCo%-y!O8cGrxNE5!&pSOY zW>Gxt5K{~-E8npztI-Y(Psq1Vx9w3_Mu_p~@TrgAf6#DZh0aWvkdNIfLAmN2cuCac z;@C|%R#XaicTc=%nAFu|cz7UCBp4U1TQt7qYivyI!)1$cnVj*8XbG7vU7SNXIUlomIRxi0WA{gmP3b=m!ETo-%;S&1d0G^--w) zx#~~XQi+`)`8eGtk{zY3%xt)LuLLjFeEpLEv*4Qz7h>AJ_q{%T%@9Oe%7U(TFn${r zVm@|Ue;nm(ps;VACCu2;K>8QAipy)8Ws_Agz-M?TG}xxL+IDQwKqFZzbI z%uyHOa;IGyERmMTC}r&`L}IxiPxPrgBBc<&U99jX^=p{lMLVMkqpe6|+qujuuyKJk z;a6j%mF~D52-p$MvenaP1N}4{tBWsC`52whE+A346EnEIdy(EI5($dE!x>lViU&0M zg?|`yHX-6_PNu!AbvMgtg>z8*a>S3C@Hmnb6qAo^RujG*ptaNAjxs5@UHNOtZ4hAg z-N^pR%E4>z7LR;l!=z3gj*B8}McGL0x_LF#fyW>}mEg@klju0!dUj09MI*~9phRfo z4ie3*k>I$1&ML6#BQZg0KXd+bDW>btP)H>zH;d}FOE+DjZWX17FKXeLdASu5;(?Z9 zDkXjK-IuYc%2>Ae{%1a=%(=k3t{lwzhsGGnI>N-)6RJip21!8{!S*kz|_t6f_ zQ5&Nna*gpyjiKq~GYP~Nj$3BMRrexJ-EUrCe`MLwtY&Sly1LK!K zz*}9M<|FC{4g_OsXFV;8&&6=+|kXeK7t?d$rbn1 zMtm=J?R0=+v{bR!#WkrKbwHXs7!G~&{g^9y$i8yL5)l>riwTA`v`!s5%nW)W*xo15 zqn|xkxgmns7^Z%QluNM0MVA&AK)?{^J+^ur$g5PffosCR|02yHrFww;D4EL#A(=2C ztWWFYw(GpfZH6g3tMhV8hJ?fG;2lTfyy(NJ{fk-3Z4)BJL&E{B-4ktgpG;c!Xgo*! zVEk9uH;L6g8|;t-G2o8UxH1If(wJKt6jXd9riVdSaE5!v@}6-2G5VHNEsJ;U4USh% ztVdG$34KX^YX;o5fvx*8O!drGC_0NeKQ>Tz2=4s&WCffS-#eEd%7sk}NxrOn45l;b zb(+$=r*~({w7;VtCO4;HBTT|kOJJKO_~Jg~GDV~<39qp84@G3y{DLKJe91DQtHH1p@Md^k0ecYK|7p{}JV@)xO-&7SX>tjor)| zd0$`(!2t{+#H&9PgKecmj3l)6naS$<^nXiItd5!5yPC1`Mn$Y?(l&25E%`Q?RLFg{<`XR6U=+N%=%dNtMvxg=M(@K zKq(Tl^+6keT0kTTrxQQhcRVb!q*39QV$M`GV|%uj#s}IlUQz8=q4HkH4EIh&^+3lV)9oUh{kFaWGQ3 zGY3~c2PpTD6%*39YxKo||B2&I4kr|JakMA$wWM-jVIV>QZT4~HxcZ~vrrrtzWCyzk zfIntv%wHgv+1lV@TtBQ*2O+#pRWZwtMq^Jq_)Hd*ly4I(R~u|HAGTH9wU({) z<(x{dyRNbDVNR zaecKOVIDr5eT`uaB}dXqNlhl^EoJpha=BMyRbhgED#}SgOM|x3SyYQqER|+g+pcF* zGIhLLZSXqnd#ZNEe)7gQ%y!gpYYMxx4Ab^`cUbe%MSBlE#$}n;*rexje(nDX@Q;*L z#FnTqGL8VwjbhT3Ow2|)NGWG-ePhj{Z9{~ma_ys+AYU8}j7;2C0ytN-`&~s_(QzSq zOvolD3Y^0uq_FB`IF7&WB(v7SrE$>7l@-sv8#8@}o6If}u*OEcRNzn9`_>j^b<S zFh>$ljUHUPQwrld+%HD?-L(&!6Cr)hZ+}muQ7N%xOQ|zjr%JbBsapc(N}Lsmm66Shn!!juw_XXOt8~Nj2(!`7cjyUQBFY5Oa(}uS zp3`hfLhemEl34l*Nf_?-V;IJk%;py|dQUHIgNM?P)^l-hOA)gQ(``*cWRWxh1!I)d z54Y%WtMvqLU~3hF-J-|pdnBjOQ0?qQNQ$x!gk9w`JOkBpb>#N$6U|oNFPcyPC*^mA z3dRa|!ZfsZiNFUl^banPaFurm(SToSM8oSRII#8!i0Em|m3v^5G;IZYG=I~#nzuOB zQjt=@YXaYIc634`+5FvM*C3-(jb!Kt7{=l@^=`Ecjlsj*b!vam+3_nl!k%%4=foXJ zi2+`dqkWc{&gG{ff7c{K3cbUrRt9rtWm#5TO8zt>07~1FX}4 zKjHA}Qc7sk%0gyaN{~#oPirQ|hjb779~R*l%A_EcM`M;PH$G;r-cGH?%sT}Q#V?J# z1JUIv>rY`LQ*8J<`S{#FO~O^JwcnIAL=~q;ud4b00Rx*0LwiCw& z>Egp;=p$!JJNq_CmK#?45lw)WNYr$0^@&aO!Ge|Fb=4!g!uQGJ+O_GWW=sZ;=|F95 z-z@h&6mq+}8Kupbl{TSFV`tkvyF;n$cv4m^0{AqqrH#zaU5c0{H664+2XwACPCii2 z34>p_v!PUPuD-fzKZAPEg1sYFTovcXbnBkP7{7O3Wq9Y>^eWjFk_ypd?+ARpgBV0OJQbq9B86Bje&Hm)UgP`}j4 zeG=s_rgh19agE3fasRR8VqMn#@xZ;H8)8>9=7$|%g`bw+88fBmfZmrdQDy;yj(kZa zLSLY&+0+@Df8>Q<9cA;!d|vT~&ww*Bd}f^D>MIJ)FHlKoi^nhgx2%t}x=XOC+J0{H z!vNI~lFRg=9G!3Ft99<412LyZ>2q7sQ5x3gFdR@3$t9C}HBq|mC=~WR3wDcmQd~nn7N#|2xTkvoJ#at=a`xZ*-1UhOi#~+c2n)2sg!WT+T4sLN5D{}Q zlAPD2K_Zfn>0K#SsED>(;y-*vW7L;VET6wY^{dT_AaLkeQJlMtyf;J*f@by%33B5o zHTf??T_w8PL@Zj*1vVgBuxA=t5YwAa?d7VcfA7J_m42yCm$b>JV`XiLwP$d~Uhnu* zVf3JBQzcxv40?=Q8_RBKStVh$@P3SJ^Qb^{mUq_`5_-f_En)S$U$ZUz!VDKeYJm8lVEGa!6I{{fWKR`UsIp7(u0-Q>+-7 zpA0ri#v!XAP`fT-xEhy|xYa(C@F95m=G}jXkWd=qjyOWBu^I@==acMYzN!Et2r`}qsxe?2fH`ro7lW0QYB<@m3I zL#VPrE=2$cNEk8*2>X9wzlepijDfSGg}c0gqtkyLk5sj>S3X4dwSC;`dUHTcCF4YL zeNhzPz$MCWQ-#ilPEH0V(MM|PH+4(07Iz((q5#)SSWCvBZJCRuH>4euRnp9fC3Xv_F{w2w5Y@&)+<@?sD(=ja@!nmM>rk=tD@9;58VKypSU zlTh0kED*x8$z@t&J7WnTK98iki4$5`d|+&=<&Jo)G@aU)Vx6aUyQN#2Lt%5;t*2fc zelEg9{z6f8<5^5@>0oWI3ar4D!>>zhSMH!lNu9265cS|V$lgqDx~K zVaPZ!msH2j_!VW@O+R0)KU9>8!C-;LNxya~XTmeD0Yz0DyK^y0nfQi_qSIoT6|4&p z5aToEoYn@^MWA7-b|!HNT8Fs|mqmD-`mMKq3bX(ZsXk2MLbX$Xebh} z|A$)JJLPbWfp$470q_$~4f)&!=okY^zpsrt-dc=HIh=$5S&%#Ff?q&X9<#K#sDjKT z*C-t|M6-LTKP{;cgH!Ek&(E3Ej_^nN$g=?rrb!x_vCC}(M2{vxj*YD2i8fs3&m^Rp zYqQWok_=3IOoX?9jY5)M)y~hiU*`EKmzSqI)uM*syOS-=P0pq57}AgGsytbGepE9| zx3eLa7km}_@v#FuEh{6uHc5O65mJJ2>}?6vz^Bnf$8bSIl$C_D`ovQi?1<6ZGZGsO zuL4d3eF0adTsZGmg(J9l-QPP$6Y^B*3_Nak0tglLxNr5NI-@~k1O761eGnQI9rx**}dDMno zT#r##$=bE;8#g+psY7?+#J*(cI+D0=zZOGSGWP@fY)X-6)KPK*J1SQN<~1BKYwD{4 zUpb>Og|_5Dw&rP0e@5(9Z3`pQ<^zk!lFCfII>@K)k>gWkhe{$O){{~?Gm*HWN^dz9 zB!*KspNx4Fvub8uLpb+ODXt3bJ6Y4@oTbZ@1ZpnEi*9YC&r)Nh)6Tq5Q}5by$DZ^= z%MWP8L=&@JXPTP5Ov$|n{q7uKk6Rs`v%A7RI#)cX7D=fzQ2`ld$l>mBWi!G(ATww6 ze+n305ADr%r6 zNo(e4b>Y0*KEpC7AMCIi^pvJvFRkCpL?cKDe(!S7>ED*?pk zgG`y$7z89+#Odk=q}|9SZBqm;i4fQp?%8g&bz*~10)qj`~DGPMKfUTL(o_9m>4 zn2spw#VUzNjf%L!Ox}>dDn;DT+C+n0JPAgwow_USn4&P(ZqW7Frs^~v8e%%637xo?UvkAZbqp^Zb*I}R*0RIO zA6Pk#75FB^(WcXOEr1pF-Ix}`7QwH$_CW6Hvcc9Qm>aaGGKl$0Cl178<75+J9&;?zyqTUm(%1NzGbl zznEErlRsFOu-8e4GU&gma?0=jQN+%`OJl$mUZs(V@#3cPn`)JO8uZC++eSr9r#X}S z4d+WpIi)}91-bRPlTK-y9$Jpj%hFXUPsdV{fD>$rb7LsiIY>7P`CGj_L%5O51Oqk3 ztgb^aKi#*P@v_y9{yaM{Z$fO}mlf$YN7$p-_Vv{V&Bv0mwiNk;oKETc2jn_xiJA|c zENl&2?4fiX))~f|q)(auB{PuDJ~LfFs%YlggnI%Dn`ll@h}~D51qypWkR+Ym|mK<-~+9S`BM;fNN5me;VfwTz5#~J^JPiN3K)0oRiB774rtRWxzek%y;Gy z|BnY^Pv7=6$JWS|wP}wO%I#$0!$D23W|p;Sltz|k#&?y;#+c`pDF^vcM^d4IZ4I$w zCQ#64T5=MyX0$6qQ~@c%f#)Fn7n-j2Q6Ao?+X-_8{K9^z8Ql_2t#o#`**VYgmy^S& z$t9YlC6{|QTCs1uo~nIVg`NYxQ!UJ&E^IWnHK%Pec$#UsfviRMZ*eflvgJr9>A@=H`*>#w}*X3)#e<==#DeOV>k1ALW|2h^~devEWe{I zFI0l#5C%RI@bCHY3y9M0+5GZFG*^QkHS94P@f(04v?X4PCUtkLVW~&A5N&NqLZK%1 z_n?X`N-e?_OjWL97;Nl@9ucykBMfh!B(tF^pq$Oh%@khma9xL;%%F=4$OP;|zC2lO z5Vt@L)^>HBAeirZZ5@6)%mn=-?H%#{A&Sus>G1T(!MR>^wv_SP_wK?k>R#3y_PVjq zf^h9C$1}0Qvw*vc0zj4`o$3mmC7MTXsNvJUhP>2RY>O2L5Rg4s5D>=yLP+~z;A|jb zZD(ZlAMs4aT3H3{({|f=tCQ2NWPS+>PF(cIDIpq+K=a{9%X^c&rmy8s<@~tQLg|d@ z-YjatKjV{ilDf1q7JN;{95q(y9=EYy$upk5=NH7Ow2q)0WYjrDQdX5@yF zmV7#K7b8j~z+XK&+Gv@~cVpN`G==yP=AYm$l6Kz;1I|f4KemBEP{I4EW#tJ0ib5j4 zlp*bR>2Kc7oxG$#-5)+|Z3z9l=Z+cVEL*xOGi+@L&N zjk*=>C4RyLe{@CgU6@GL9yx&Hf5c1qd*}~M8wq@LS@puykY!>HrNb4uc}XQI$o)91 z(ub2aDP@hj@ECobHmamPtc8n(raA|Tw+al2cKGzp!9|Abja~4_hA`1tm)qj0sNkAI zoHDYrGF1)GU0R>Jy@d5I8c`pd^@F<8@MW0QA7G^%u)%utgiHA~Qu#A(oO1Q@y^4|= z1NAb-i^5765f8KlmqiLE^7@^pEIJ}rv9o0>IrehRFy$ro76_i2EXncFc@R!djKW>2 zmg|KVb;-3%YE-K`LZ_^6Y%y5nbx3*F_~Nl2P`6@>tY=Opqm~hVnd!i$a9RI^V}?B( z&kyl!0#qfp!c(UapNSWD5_2x@A;!eIpKd(f0j`>=AYiZd!b1wVObvt#EsyYRU>Vlv z@Y1Bnb$6US4Qt+>nXF<^jlXGNs<-}bKvn0L3-291K1E4Eqo~T3$WY=rkl}40-N!r( ztITss=2x4Uatzq5%pKwL?wAs(SOLyUt5k7yn|0YIC<+d&Xjwy71-;XPNy-yf#+Jfp zxNm?R)MF6oC;cHUc3`aRf>ii*P9te~Rx9$RDU3<2?tdnwt=8K+q1=HIHKw89Zvfcy z=aFC)$tn7Y5?qHi0b|<43oS`GXx5zMf(q>&aP5-(sPp~$t>YDNqLYcL&Ke-EWYO6~ zjfE)7({U7h9$y`2V8Le|hLZ)yi^NHx562bYEgmiRVE|>@YYk%=D=SS!km(FJ#cVUr zG5nhVan;mFN!^KVJu(b{JD}MfmIHmE?rPi{p;(){Jmiw@<2o4Yi`g+e7T;R-R@yoC zpvhOpt{cE{8hoOl|C`x*-$@zS6m4Zr{e&cNpXqjZ;dvpallVM-LGUC!Q>o52%cyKV z8(QX?c_KVkyvb&9ZP#1f`eaPZ{H&(IYk~ui- z4bR!lZY(zZb3LKgUkNCxP+VpWR7j5WRdux+4ob^lktu$~^&K0nB?80E=xD-6B$i26h_xavGf*I@k8)O3e6C-PlHAsbLu&E=X3x?K)Sy}Okcr_9Zfq^SL6=* ztu&v$N3CLb&u{s7RN5%MC=A+b8aa~!#4~h8nvU6m1CoZKo6JA79-1+htDt;~`Kk1E z>fZi5RVLnPk+2K+Nj78+=hF}G1sjx_v!m`%v!pF7N6aVD>o%`AMt2*%jP~v4|52E#=;*olmm1*d!%DRRtep|Pg;SArm!3StQg-?x=VI{E0D#QhYDdggisO@Rj#D_hE1vNGBL)zzhbr6E) z)@Z5P*;r))BQsPi8eu?LQH^n>%ox;vy%S!ye|<}YX@&HK z`OhX{q~BOm`PUrI|9+VMizXps;ABO{{O>Li6DaYtKwkWGMg5p&fENs69A&|@_xs(wni0kyOecA`;$JQWji-jRwP8KV7PP3uDN@k!x9Qru2-P5K?suOQZReUEZ#Qxbz4a0z` zsX38~w5a{F*lX?5Nfq7Tosj`2@ON)(X3cJPSgI1DO)D7Z&k6a9f}MZ4VFJ94{Yw7^ z0)hhu0>blu^27h*3lkI5|7(;AW45TmNIvYWk6c@OSfIwlV*x=%q8Y;Z;-gd|ERn`z z)8w$olsx;X7L2S0!$4I8Z)m|@a!lC-uIq2!Xp%1Lp?Hq=bBb;%T@{|q_jx@%zF_Vl zQ*_o6^p5 zG#;b0*w{sYBqz;-A*Vw_kbRYtdS@mwaaJ+yyE$*h z$PHq%R0szFbGTHK+P`#eR1OkEGzBMuml3hE%Y&N`9FA1$gT^a@h`jXEpU;Ch!9)A!eS7MtSBHW zimIr95{pW9NK6!DS?)#81?UIm5Df+*o+8#648TN)3i`)Yc$(dsW9k$&vpMM<=Qvg9c%zv9%P=8NIgH&tb|l{hK6=01^D7>^B=F* z_9YYXmDeOk1J`JG`qdPMQlA1O*EDdXI!&xj6)yYzj}?tfc=d*vw4-BWwpr7#S&xSM@q31r?}(cqA1SfHJk> zoXi?s2X3|kmi_qx0`!B@E1304UF2WrJB3JY6vP(=QBA3)muDMJm)hG~I@=&C{kVu6 zOMG1Jrv;aL=s%x@$t~X#^r3M10~_-m$qmY@QC<$6-KiRD_n3|*9eHDZY@lY$-O!yz z$0^HF5r)^FgufTHuaZ4ilO?SB(%ou1I+WrU57@_-1gVD#&Zw|J`xzrw2K$uDU?53ycIyy3rLR#bW&fb#ULFX4b!<=0<$K)a!uO<>a3t zdC@q9S0<3WiW|zfRuEFqWAA_b;>$v!TLYTY32|(L;`Ua)8C>w8 zYcw+m`2eN6LRD#2%91#5Xm&1V{`TS1ZKl+l{i`?QxWs00N3ZT5sHu$Ljx+yfUyn(G{X@sc2Gh+qo(^}2AstZAgwc@Eh>^OeU~+bHtz|Cl@Bt+~)Asnw>3up?#6l|F0^Z-7yTxbb%uDH&br8E@Ic2OlO=rvli)|XA}8(*P?I`=awG_FXaXZoKQ`mH_V{>&00mdL|4>g^BYU&-Bc4< zoYV@-^Y{9+z@E7lDQXhs*o0TxG#K97tn!O#J2PEl^(Y}7_dT{B;;Tj@Q?Dnes%es= zCblJ}hKYrR+Aj9JSJ*(cKjS4hDJg}`!eHFZzpFRrFmqXJf|Sp{sQ1Ty=X&;E$^`#i z%FImv+R$-a!9~H>G;tUhbkf201*+oc=oQH@)QTsek)pp&ccT0K>-#vUL@XDtPX3|Z z<*)+zgeniyWIuJB6PA`Hee#^HatH-`1VP*b7E!F}Qg-xL2O`7Fg8Qw|E4|b7-*Cgg zOH-W54Jrx^UoLOY#Y?V+6b5rODFLF+REotHKj+8dRDkK;w2t+R4fCdj!c?vM>Lu0U z#u*1Yu9VW#fx3zJB-q+df5n?&E?(oWc$2^b7tj29&ygZ&=0nd>w0kzUo`r~pN~ey4 z<+(>i-8&ekWf%!^Q9=E@YmQV?!yp*Zd^^KnHB)YiNaL z1};jMp~b2E$6pO+IEDhmtuT0DNUtg-^^7{16HHheqDZAL;+A9hefwwT4%>xKwSSp& z{r8#wXJ^Yu;VPi8YsKX$u$54vr+kK&A^3axQE;shAlf6_7FAlSVu3 zug?GK72Fw)q3sJ1%N0A85j^^M&ir&h^wXel7HJ3&E&Q=NJY_g2f1XzvU~o`*5@C~o zw_L$4(n1i*vSk@XmXNJ&1FkS)C#q0M|B-i0WBo$u&`aa1WQqF5xCv`#z68KdF(=9j zR&LkTdzbx-efn73YC<+Ge*Ge1$6d>LN}NFe<^A?LvDu}o*+rL}?n4T*Z#_nKU&vSK zmDrK7{E*avqCuRvx>llp{L5O73UM7+1}Df-@&5H6Vs4^r^22%_-P7M?CO0H{n8Gu{ z&D-n^{W_i%t`G~?ISg!R?|fqyIMz;8{7cYwho{y4oVT#Jo$m;|rtNm^TIH3$)?4&| z*_JJms?N+oAnxgW74MsqdXGZB%=mY~3n8zV>LVEy0wF&_?*_eVn&f`85}Ebr@~_^? z0CM`qVd#ATzox()+&`BAfM6EC?r$0J{I|>C|MT)GNn8ai{_RP!q*w_VCH(5lKmDR` z#YytWgCv2)Na402<}u^!OK{LvQMF9pXVEWo~zun zW?tJljj(OgZ|g*=P)c#(0+H@U>fXsKjcvO9T94M!_8d@W7^qFc zq9-Hx4Ydu6Z5e;yPb^M9^LG=df~cjl>fK8GLes#MG)xniV=0@P3@-`(xej!gMg8;s z)&a?XzYhLW4y5F86wp4WCwt|C0~woy2w^eBqrohU=2oy!Wl&L^gB)gMyzp&zK&MaO zu=WZBizJdRI~?XyB4GW5{FLXN7@yVK^1H^mj$eF^9sIu9+aazoYUk?|qz8n@{+5B1 z$ZZhJf_<32+EN@~T6ZNiSX&9=*528Zq>$8sMSn(w^?qna{fFebQYq_sMLJU}W9XjH z;D=|I>?m8H5YP(@c_cANOGc3IfyZD4Tl~tgDlpcK;IHFbN&R(vgs#VM)2w*KdJf~P z_%b$}vpndcXO8Db=+!0p=MOLkQ%{GR$Q>2aT9xgkea(FwgMB^uU}su9(eC%Md&ma2 zpHsPQNZ4fY3o|Ucn_tl~Ws@+Z%4T-B?4RyXuPb%VX+&+-iz_6lWB>MtZ74G&xh3X_ zH}@th!^;~>FT)biS`cnM3$T}4?ay~4 z)9DYfL`T<<>)+fYMT?0{LknTP$z&uIc{G`G@f$)#tRv zNZ#pTgMJp6pi1gw(D`NCI`Hbn+*qU^(UT>Tby1nU{x4OT$ z^{UhKUBP>oi-lNTMo3 z{P4^XPwZr5OKfE1OYG6&-uVX7dzqn4gKq5EY0tTlVW2mbziirRV`nckbplo@cClRw z-^!F};O`?Ty@mqX_r}`y{A;-KX%S8$6-%pCmuLwWXQATJzvxSG!0L ztTJh9J-!7+KGjb-n@#UAwJ+Ny(68%mUTb^l>GM3v@k43mxbBWtXs66Z;D1)UuikfA zc-{LPqG<-4q;58>>HM0<5I@N^5U9ZY^+87BsupT$0|<6pwEP6KJ$4=OF}KmGS>&)_ zPOChcNie1*@Hk3Nex&RI#rvGf>_(#m|uHX13kr%Fm#Ir{*9-}f=}rAISJ!hcXdCqV0*(sG0N4GF3<9Y+$8Sz_Olbm6w+@b(*=gP)U*Gi;F&Y#O{!ISs12r z0Xu)-5qJNPMxl%V?4dCOJEfDq&})e9IRCln?Fx=Na}hy6Rtf(XZ(;k_rvJxkEMnoT zvLW4CkOB`^>%(FSn54z@HmC~)owjtQ`HuxB_|i z7+GF3a}tb%?*aJ_a^>^#R1TaX`A+);@YFVr`LB1W5oLEQ9$um~z2|x{7q0Wl6Buc1 zr5#Gq+%z3#XfC7orfDv-1CHVNYMr_AB4FM7f-oJnf4BsvOT{%6ET;5T}MKNJZCB%o@G44z87Z|=&8W={6u&u+3PMIZAE{f740_K zsfBQ?#LeVT;cT&iXIoyrtk_iE+#rc}5UUni8qQp_Qmx)voKu}gF-J#wz^jY_?nUU6 z%@V*NX7J&N^tLmg0mv)BtwTgFKp)r4?hcOSL~+RElE1~vX#Fxy?H;cD+kHK*pPR+SYv?kW9%N?SSK!_WTnhZKn^BvfW# zeH(V=!Oap(Kp4zbS$j>oD=P+~C~3;F4p#V3LH(LJovABj+t0oYvrt;xNAM?ziBOcE z_Nz-f`X;l@id;-cF=Wj#>{&NI?E@v(pqe5lYP`->6>Hqil|bg(p5@gxq@mqA3cn`| zmgpbohc~`{*H?W)dWa&kd<&}Ack7RCPLB|x|6pr2L`}Udo7}ooc}NhlV}vhG<2@ab zj~8RCkA{b8Zx_JhcnjS9qrUwcWCr&9iUSIrMsmIe48U4rSOV-_G3(9hUWdpiumU-oxs)qK^z%4~~&t)tQd-h@?wChzd7X3yq0+^rCjvf3vJ}qHXZa@#` zH6mnp<=ISHxzTu~16VDfO-sZlLEn%HIFBU^2;D)4bX(Hy&UnslGt``T|YIGF4p zUu&5|>)_Tj9Ql>4&u5E(^e1;|Azc`}khxKeygL;&GPPNB?|V?tta|@B;71vnXh~^O zqg8kY7Afk*g~?IlWa+{-O7wYqfp09kx)V7TgurW72HQnN!co;4l~vH=KKo(<2tbuK zEu%?E=Nsxwjq(dqIUA7Z%v%m+ygi9Qa`<)St8`T}>bU(ygM=WN;%-zpCQr+|W!A5?^Pk`1hmlXP}*lE$uPCkcRg4x*8)Fm-1KPp#lw2iKx z>U;(=zm{CWk~YIeQ0j?`BrQG1r0$#p@Mj^sPAH%Wuo0zASwH&gfgyhG@7FrAKuM#zj?k^2*uOJ7jD_>lTb*lA}1zX1S`p zy*I>*^#mhNN!&^DeWkN(kf*k8AD&SlP%vM5_Zo(h+W)4S1MM2>(elFig4P^Zr2u@XL;!?TdtDnA@-{=(PH*1Srm+3LHGlhj#Fi4FZj z^}{-jM#{apRKBa0kX@5hpZjYKWVoQ;I;vFT{ zWTOp^uporAfAf)0Lwt4mLL&8>6;z&D4%(>{rbZ=>J8U|7(!vlm4{eP3ZS}AK+s7$z z(27SBjL%leW&g-?G4ltbnI-{!-oX~T$W3pr{+_=p`TD2i;(<=1t)ZLOMWiP_P9x=J zwP|)=pD=4bMOl-5BE;34x!D7J#*I7CB0rrBe!?SY)*zD?8JCdYp^U56{E9xJ%T4i_ z;h}pmXdgBQsZWG&Kw$rx+x*n3jG8JdZ5O}kigbGO*bFE-o|2u@NHvkX6n@Aof@X*gYkrnGd@RKmwY z==eL$sJd^sFK7J}3j-zKE9=kfL5xp`Iif(QkQJJ9GlQ%6O1VCTT`pL&un)9o7&Bmd zg2E*Vx~*3Gh#g_j1Xt)}lD(R7tYPT3ZFHX#P6m30FZ(kWL%H77{_kxKQv3A@{=(<( z*G%R>6V1Tn5&dl7qeqWUM_bQE+hiNiL6$y+H2t_W4=CHde9RxS0n@tuk=Sg8hFFQt zDkg88qkH+V{*gg$G^#|XAyE4Py%0Z;=7Q4*tmpJut9+a$5N^>Gnsox!Ys9>W#T&)E zn9pn|RH+ockd8J2KWuv%@7Z903AGeQ#S!U(nN2`qrrT+&LhzAl$Z10ZvHET1P~7)v zvwHCzVk|>6gdV3MsZ3VYXoLEh>vma#vHAN2#d@74!*5-s-Y+CUpl}d~V0|O<>b>&n zgF@<(U+9jafUb6otoDL{Et^4(&-IWCrrGFkO*^(td#&}T11G&BzayX=C<%t%m;$%^ zle9fRg|mNfPTP+}oeWi;47mM{yD~uB$`2+a?ziHjVPT@;Ym=H3mZtlmT_qy25lM{P zyIDZ+6n?=aU44aq(I)4-2SyT(_-}W-y&QUC`n2f6dQwS7zq*q;^!51QMF4pS`sU z49;exv&&K%!UQwRzN1jT>5CECi1Wv7*Qa54wgL8+OWlAas zPZK%^7n%*e5eVqrKXSNQ9!C?7oloeu^=|M&!?&27O87fxsq`S78U4-W*vC-cnA}af1`+G>ROTi{yU6xpu>bufx_AR8U`MB}#lahFyTdO)4-w z6Aa;%+5!K7$=pGy+$_qrOK2&_Gx-o2XYkD=VD;RU1p{+D-?262cv$<_Wi{O#abBh*op%)1|Qxh?lk0RX|7i^Zx#Zag^5)LL9 zh`*4fnO-5MD^iC%($VhN?S03w8hEIN=RXPAFF+379t5Az@Q?L_PePj{>1zT_!j@1m zY-OB;ra;yf{B=S3ZXBQ6m6^WD4fw%~{K1+RsQO`*hs`JXIE~x^*SBVvdthjI@(peC zNj?8zR(U`#y;?mBty9^kN_nM|{(_kQAn(4rW_`L$I!iZpMfv_*m?M-g6vz?w=M42@ z4fXS&ewt+ccwa4=O;2;Zj>1wfnirPrfLWMl;5@B#*qDINS8{;k?_D%UyQE3{^-zlC z|L2KJpHp5yNk_{Nsds^?x{{H#7LR=)z*UQ*s>4a${C9W|XPpxbJF5C(K1xnL>Vbg;CuF-fdu*@4>Xa+% zjr(2a5qGjfM@l3Wr^r8_6eoIFWv868-W$>@mHe_5B%77-##Mngh)Wh3ms;%e2V&XE zt7ErQhyl-lVw?x=pFa!({Z31~{iy14AHH58@%%J|8H3o`&0Fmh4JYr#X*^>ydfqw3 z>Z&tyQ9ns$-NRMq8kRL`wLMb>YV|@Mbxu6_8{+_;At?%T`FdonNwhx#VLBMod#GO#LI}?cBm~ykftE*qF;~Ywa&qS$1X%LQ9CN1NJX)4kBW zJD;ykEANq&M9i1>kzYI|hQwnc+YXQOI194iAp-Z$PzoY>uBqwk=nW9Oj# ztGSG_o%SY+2(@r&Tl>^Ee4_06ycP;wEeN8iOqy;z7O+=^ZHbIy*-B^G-|auw z`^|V)gnT3tGfE!*PDx0luoCRlHB z>pqmWAe^Th1H!s8m&ojiTqkv;_!_fVRaO$bOzAAss!4K*KmqGcpcN^&QqD)@3%Xhg z+$whD)5$uLzKww{X7U~1+m6pmxe1+Jz~rx`cxUo^zjnFq$!hSAuSPIQVC%AL3{y4OT0r^y~!8YTD1-K zny3r`pu8aABKP;H?mtpKQ^PU(_Rv5;(U?F$bpP$R|KC8rS>sy=Z57=we0$w6T!_(Z zj?Hff3tck-rlUE!KZKz~Opy_c6uPz(G_JAJ#GNTi^HFI5VEJgcz{+$|+%LLWYDp&7 z7d7nD^kV6M>p%B1$FJb8@c1UV>us(lbZ1z24(fe6lk5CXgwJ=&XMR$*N-qyoK9KKH zJ&X(=@8yU#>T$E+Dn98oi}yAbqSx4njo0O8p^1f``-fuTbM@){77 zl({L8goLXqn&V4ddUZ-mMM-mWv%?W>wsGGio}G$!rJ$tHTwKUs*HPOoi}J%B7$Tk-DuMI>FT)!%Sf_K5&O{nV{m! z+Euj|`9Amw|2UjC9Ly!G?a~?g=^z zIa89yytjg*yKVB>Z=5PaUPCc7u+vTSG6JdK@%*GWIH4rDMv)_zKc=)rvLbro(t|+R ztW0+Ch~xw6#dH&0iEci{K!bf=HossoR%+OCnC|%bk<@2!+Hf!7Qi_%Pv$$s46uHdz zFyBfPiCSq+GGz_-G=$yjf_P4;%d5Sd(^WtTje-LW4oN_J`|aU#Mk4~_!TEJgoa_{` zf%xDj>1ohW&@k!!0Q>F`{QYG(;_xy1L4mu6#Lzas@zUYGfKegn4~qgtIIH(rkmpa0 z-hvpEU`?X~8SW)sLTC+wG&PU<&k&UW&wWHm8DCj$>Slv)rL~E}e)y}_%O{~|_-Sp` zu+c#eHhr6h!_^`9JM-ng@AF#nI#xcy@$;?AbQ@RVx2{ zATRvk6XPxFT)a&v`}wQH@CF~Nx4~r(5^+gaNR=iVYGf#rGoU3q?Sni@?uS!%tidfH zBZhkxm^@mi)R(Uud85*NL9peZ|#l0|h)_?y$} zu2?pUVN_fiHhDQ^1{pW?BUQ;`#(c^HAlCGuHe4ivOk?U#DGNBqd~)=R7c8p{hQU zAA@<1E~jFkN)|8noO6gaz@7yK^TNWErSAO=;cw7ZJ2z-S!iIQ-Hz!A-zDQwFp?G_g zuIc)!;=2HR(lyGIHyP{ebX2P!%Z^-YpNa8}U{jrD_)m_VI;_5MB@O%;2wzMK0 z9Rse&&wIh>DRjqdKMjS|J0;BIcCqHvxGkcCCUMv%z9A7a!kr9-fnJt=J;9DJ;zQ1kL{+5r!QZV&x|W!T)8Em=Lj zeJv7m_?%^y>)5q^Ey#8Q326^7No>t))@q{@z^;sa)}7vf)!gjud{BflVV0#rt}vK4 z3^Mxw%Xk7Wj$0xejy7wP)mqKGZKLt4y!=u|SWDHN(-N~3+87s{z!h(S8wXz-KD*BzW*y}lJAg@LrBRq>emMi}@D|PUD&zDj)6g^5h4+wZk zkC<6MmU;(Bs9B*FV+^tO3xX$lEvEW4J~d$39|0SW;oa$6c^$mE!%Xv)NTqm427E@0DF9G1VL(tMUTKyp|>6~G2AGf%=1>$jg zq*^QT4?l92crZ=+S!bf>i8~#Mc?9 zzPXNje%JI49DbXd9m884L z@A*AQxCH24iRYAz$#vr1M>J6|UxuIJJVY1?zvE1jkGq~;y;3{L<$M6V(7Al9qyxkj z>Gv4OfC;`B{#Vb95{L(%4-^Qf7~;Q|o&S$kplnIBo z+v}&>YfcWKfPgQ!12BhCf+JNNQw$B3q61ePfoy$-$t*gC3QX+?@?cZcw_~HZhoia} z;UyRPcXeHbWaA7?M*1&wvKS2b*0ib)yJdFgSq{3gEbj~K8&HGtbg=>kft30T`r30`ubCC-<|A(~{zS`E1|=8x zZTic+VOHSut24G_-@o^Y>B(uv?xf>nG?=|0;YT>t^-2@MK(9?B$(2)DwDg)Wskxt0-DG2QzlomV*L z9iyTneM9q1nL#1`FHoG?V1#W+8Xugv!UCdLG5BE40-{i0XoFdWV*5dzB4cZSa(s`Of<5yNvQMgUl^87rPQcLB@Dr;5vXP*YovQryh zUtgm-)HdAI2d`IdqRfXU#_wf57cI&~sanKe+n8rRf)rXRqf0F3V2D6#=?4u-_$8Bv zNC+YW$c=GHClosYPr!w@P`yOa;$+0@>3}z5PJ*HMU!>}X&|II$iMI({{7p1JU{bae zFcgl`Z9nGDv7mVwHi-f^} z3$&FUNmWg~0clZ^feZDX1Z=yxe4RwxGg>ubc$ZY_d58`fd!lbQcNq6h2X|O^%=YCP zfzIrr!T{;(0%s=4QzDrv<0fx+%Q}&M8;NqEmEzw2U`?vwEAgxUqmUSIKtLS-4W$&f zcd|8fk+L)UAOC;U@?VWiU3XSd!yE0T;ArQNvd`WmvrSGBW8VydFTk)_?~wjw8;}y0 zh&^EIwF$8xYNsNqDvFVg*$U~J;rQF3-_b)5!%!D1*U{&$|9;)Sk0Re^9=qws?=^%K z)Krlr*?H#HdB&crclUPZ^KjQ-2jq@Y{2QuZHy#-7qhMc(pyd(iaj{-xP#)g#xTL+E zD@+6~+*7iCf*xKD#|?G~k^BYjIR;=n7##VesNiJo^-2JYj9Pv}b7UT6*28IaVnzp! zRe=hnMsQ1bCi8>{IE);c>Fxwe@%@yfTf@bbDoqCUA@A;{;Lo^`i-m(~^Z3)>cpbE@ zQEyA5GKKNrco~t3dKP02vp7F4Y{+ab7LPxDLQx!kEo- zY>uEb)(vt|YQwLyMZ9Mh+Z?;FBryRJ=)rCeKPw-v^%B9AMxu<#U^2B;ZfUMXFXZk> z%|mi`1{#b_yS8Y?l$P&c1`|$vuaHt0keHu)GmT;X@dp((O%4N$x28c8*Hkd$i4fHy zY2=29tUgfTrw+@ij0$z-?Q5k2e9f!UrqRL-0X}n<6SGXbupMPCq`?<|uA-Ru=j3!jQ;QOhN7+;+ z)j9|m<$I;8$I6saY;ete@ChxE zS>@>WRgqGD_!d_z$e)*>kh$PKWS?^7=o%hSV{ z7|8WLO0z)0|<@ll^CY$;r1)C$JJjGEkTmotyK_(rk`knZiR}bAilimY_95( zR;7R)Q-X=GKyAevDW}3blMbkw!5reOOHRufSZ$31bD&x9?qL=>k4oHxWY;E(o==+Uug+EaN4wEB@oM_S{0F{&@zHBV6eZ$s z^kE3|X9ubY^`_LKCMsN*-Cua^(5@EKhG*?IJMC7k?GudWC> z59nadKu-M;yPP2?d6H0#-v?^42W-+)my`)Jv^%6Vtqw4^oR%B%@Le!WqEuY^jdS93 zdNR}PXwcQgBg>rd$E0~wWJ*McmzKvxobq$wU1?Bd&SXtol@a7;W&2D-0loF2BC+Ki za<|h0NI#%?R@`r#+%nB^3$$<0R=p6%PVKg;kUf_}<&&VtBRc`Hu#}w)+a*43z@}bT z^J>a|LGq9K0et>}R?n0=T#l`o&gfWNe1O3Q;IJcLaK?099}jksqKXsn%Oc1pl!Y|29QFr=SU_e zpHAYFi8^MBt3f=hxFuQ?uo3e$!_G5M%SR;jah*iQ5CDaxXFF*@czh}zy1651{;8=bUzq83s2j( z;2APguO+3 z26cY6%2Z&iD4{7KDxo@>5N8OF3ln4GWJsSHXU+l(17Y@ zRaec`z$Ou4WfSM48knY^BSQ~BfdRQ+e?RvyUNEl6FFeu?=OqI{k%ao?mTu*(ENu4NVwgiVfu1%FSSxD||>E_*si1m8Jbz7cU z&9N$K)T@<4v(`~by+~5ordFTOfzeK@IMO<90SV35wxHtg%xFS`qvy!Zy6w^1a69{j z631$LB&A4gkx!SF`}A^BsWQD$MRsGcpkt=je|&d^|Jj32v;JhXTJrA~%ZNWaajAljA!Jf3MhILAG<58MJ@**UP1o8^@5)H}(0Mu8e#_Yu8j& zj;Fv=t0m+Fu8bf62gC2V!DqY%l_TSMSZ`Q*!K%7_Xw);pP_3oP)4Y=M;U)SSd7mcW z&p}i^Y(WGMjPUdu>>kJs1Y?*okU1lYARHmsT=*hz2-qd2jbOb{e^F2M&>kySQ4m&8Nu{bTi(%g$3yvO%LiFBqGKAeQx zGQ}US(ec%ccZp63TBXL;7V%fyXZP-fn>)W^st(3A6KnJgoASCTDG_M(tJqRel^09H*AFh zUWrNT^7uC8JEnF8BfX{GfauyE&!#cG;zd+n=v!-#5Wh*DkMuE6S32F1@}YGqr~Q3$ zRSz-U`NBNRJF!{bU<|$^Pl#{FK^2NBkdtF$`I@P+;C84w3QL+f$ISgryk+q;0v~E$ zUBf9y**2!X=ObN<-`!1>1wXJ!{3O!}%%ssSu}xPO)d>%PpiVy-_x!%UXV7rUG*p5x zNgI;aq{&M{7d}rgkWLH^cN!bz%yrJyuvm+%G~AOhCtA6*G|st>yCy@eiG4UpYrl2L zbcgvWo?Ehbp5>JxEhH{?Gt_YfsAU)G^X}YbHPIMZpYX!@&zZh=1vN%{L)VSn9v24{ z>fCuhK$~_F!(;d2oLK|N*iX5m^MWIBIj4;92I-y}v4|5KTSz6psUV6DEDod1*|JcK z?iOQ)qERK0Z3~-EE+Xf23VQ-8un}dX$11GIPl-I2V?ID6@&*|CiwU5!Ae2}H*K8&|NbMxMCUr)? zLF~~z7!OlDs)jm!y>mWEu@d%}YV4|Eja9I+vE>egB45wEW2U(`=;!qpTPL@WP6A^p zWZ+e-@Hm?J5H2jTMHMn`+h1kcLeAI`!4$#FN+^ zvm&&oE^-~H&m5&m^>?$w*tsdbaXqZ4P{!jTjzM|D&nPf>aUON&6d!u@RlH?kzLVv5 z3%q@O4X6Kw`bd@W;nd!`%uZWv0Dt`ZAB60T)ECvQe|h*k|BaLS|ExIsZ>C1h)Wz_> z7~1~^7Rqw=i-JhL);#jYDAMneM0B=;p{(K=EvkHIj+V9MMSBK3DRtOOnz1o{{N9bQ>L=^SZN5|z6=_XNa@egPUK!AXl{u`iCH+6FUC;lWA6A}Km;fT_t^q?Rb zUot>Wr+E3puM=r03c|6Xt)3b!iasT1(vo>7C8M8J?LK=83Zp-ia8Kb42=gbzgMupP zKp4~cHkai!$J^}W{_qF5kJ}7(>^CbSs4;a+b_OfcaDt-=PYkwZYT@cJQ=O!S?%0?u zlL^Q7TzqS}WrMa}B@5O?LZRlPNW(6_ZNymw2Z*pV+xcC=42i*YX905l8=&Y`y#>44 z3M;A{;7#;C z(}Lk_kj4u-Q^vB15GYAH)=;Vh!csMzaSh*CMcq8}fv)M2;ob(Mhb%~aV-DQ}>m#-L zFKO>z;T6W5A>=0&bqzK~p`H^w#|8HXbuR=r4|H@W%QXWkR zjc+;rywH*W0bz=>sOXFr%R=x_7#fy5BOxG5P%;MB+lyL6WU+=X7Dt2r3q+tl78f%M zid>w@u`nzY_V0jz1KAF>7Zed~j@-7_mh%i>Yo+(??Wi7*29xPP-!VPFK@3g|b(=Di zl?E4!MbQ*%&yLRKj>2%sV*7YLhp+<|&L)s(TCd#-8_Qhr)Y=(tMHuO>{Dh|l!=6cY z%fMw&t`j>mGz5&oqOc&Lxblj@hC} zIjl#FVXw87075{$zx|R|+wp?`+5|&n^hoXc%1mh7~!iKwn3y*AQBU34H(8LPw8 z*7kZ_xqb1IF@3OR?6{S8o{@$tThpC@2jhd$kSLZOmfVYOZA@#7#Qb*>fZLW-r1y8T zZ@AO#(rP;{ON?tD@u!^qFS#`9eRaXR1OEXgF~psMTOlEFtRgLOkD~HJuJvdOnUDnGN1`JX z?Cc`WMVi~fE-q4q@#(sxIc`ZwsLV5O5I?DPswh*}u)PaqS9kU9TGQrz4XjGD=5t&x zqPkl_Z^lPqBr%rnvqgH02{ z>k^1Apr;vuk1wk?}mbZiIs_&@3hWG1^ zue5}FGmYi5C{#j7LVb*>&TkteWm;M!U}}l}I4!AYO-;9ZtI&S=M+b)sas(;7Q^SRj z3`HI?`Izgw@&-qqX<712S)N>3vk!@%ae?ouT=Gn*4U>(zTQ2uz?$_!Yv4@!V?NQHf z{@ztCjh+1O_go!O7mjb^2)DV@;3Y{0hkJ1PnNUh8gQEi(BC8?>=X+xNH|YrdqPnnh zK?B(R`%7|P5>X}Zw@LEcSKo)1>&>tIY@!d`4~*MK+hqC>O8MRWgH$9vz-^YxIG~s9 zT#f(M+9&h&KF|M@#Op>c;*mi__XB)rT0rp21m|FvAME~CDMG;QT@p4wtlS%~sEpts z4>+PhgNR%J)bXhdN#PrEsGU&6=Y18)-iPpDf-54Qg2?aw*N{KG;Fn!~d}UB?h~yVU z(ItL_H-jKAN*L!Fq@xXnks;&|EOza=X>w0pqP>YnnRsG@F1;SsOzFw#;v)|D9dmX* zSKQ{>(bx~DF{*d|8XGfjgY{8lLw7MMjv79WNS*Q`aI6tuO(5#E<_wL zIxd6M=b2)9H~RO~xzRwHwH+A@rHz9Ye$)mT!>l7Mvh*rjwe#P4#^EFUeL367IOjgX zu~s82?M?7bjBL5XxYoP^$rJLWFxWr3UY2RUST~xojtjc=d9wm%wyWyv41lcBJOjdgo#|mi+j|Voa6B+OU>eLrE<|Yi6127HjEdDV%Ky#IL}?m>#A_+<%$f$vo)S; z?FfXM&zuz<6+mv?Oc^5-xUv{h$R#L?4Cf&|1oHS(A&whrc?M$8VBQBDdK4vR(U_94 z+FXY*QjMYgXz6&~`qh^$;3;3wAIg}0?7*VBp*$w0aGu>_Yex3TV{#Y(=4=;u0%_c- z7qg{vzO>nLvn7o@FwU@Bpd@AH3lz~W0ee>m+U34Dp%b=`l6Ru!{?QK!7dGL?5R2w&Tp3Ja)`36Y+99=zu~7JhmSFeza^q@0pHST*9CBV9!ngBuvFz1z zoH(}nwsuxcj_4w7PPfkYh`LwNbIwm%s*Pk%k>|!^+OZon6}o{I=>1BS9l)}TIR<0s*TkJPYO+$MPLq%o0_Esfx#RcOfvfu2X0#jzvXP`$ zy7awhCKhh1xhwiP8kNYjtqw-!?X(eH5ALzC_qoCn?IK^0r;Eei=UnrfqKg?GlS@+~ zhZU-BM0}2-#heT&lYr6;>|n?a_10cv>#|M<_KiT5l0XuCVnTPRJe)RdUeMuZF;ZI7w$-zk055~k5A@0!o7l&C_yt}MgWi^FcwTEY$4(Sei#oZ&^Ht`>!-ZmT& z@nR+u_N-P2(4PL^yjY03faX{;UQR}|sLR+wYZE8rh)+a9KHl_0 zhOqb-5d=jrC)kzl@E}&nWfz9wGk)p0?M{eO6%^$yk^o&$t~dJ0l>^4)xd4j$ zg5q`{wfgOpdICD^QmTqx;eOJ~4$=K=wA>E)<=b8{HYs0qhYfDkL+N@+ELo;ITCM7e z6qoo&vC0ARpk__|qu06FKG&_v?Gx|5*6w4vMms$KU0c%={DmXmJ3dS+<0Ip!!pJi& z8t&8Rw;bkmE8@`i=FCTejDR(Bk4&K1j*QNN6_gipgm1tT=pTp(=;|F=*d;0R^7K4$ zAAw-jPtFhiNYW2h>5)HkuUta)_#I?(&O!hw1~VSAg&|R4{!pG7UimWce8e1c(Z+Wr zySx#-)ZcN5e`igsvR-hk-O+;ZDv#ALhPSM#h@Td&E7%d%=!j1=l- zM}ufRVlTY2HGi*+g1iLB3lx$CK<3f5wtTkbYSS-}`o~=Q{;Ui2+RsJcdbHBj=2KvB z=$GpAUjD%>NA-Qy(qyyCp*Uo#yhI;_gNyzI^;!7?0rzqEhx_PQ->kl1Cj{!q+E^=i z_wr>!ZK_RFPLYB4k|jfFfu45~&aw9>{5wLU2=jL)LtmId5rkLb%07u-Ku_Gm3w+9D zy5Z;}rNM59dk^@ge!=Oz4}vYjJegOh{;<%wH)o%2sejSxxxpFyetx)N8#G#fZ%8xz zRK1GFFvG+lMab;$73H4y^Hbs%N0(u|e1Jl~z^mc50<3_OLQP?xE!^|w@r{=L;ZM9# zmb$^TW%JjZdn?rN{0p9cx?678D^|fJCn8@tEh3! z7M89}mwb)U#RygJ-|e}Scx+UQ7IIQwJQ+92561Qet$7L}4stZ#taLKukGFRIFo1&a zN|`u;M_rMEvfY*1Q$rfgceVO|trExoz|tjDS)ic0RH0yKSC}7dFzNiSRW^!GiL}<# zKg{j?z*70@T7==yjZysY4@tOcpKm22I6Gq!_mHJHGB?<1-r{&!5N)NhZl>YYm4n=! zTOyMta#5A=PR3JwO|sd=)kvs4CZ$A>m>34P2TB5)mp4ku&7NBIUgPvhIAr+AewJBh z$_m>AEr5Clc34Rm4u?>0lTdtpIVu<)pJx4+We7F{(_Gs2GAqOImt`k~;Vm~HFnBKa zxhjQ~9<`O8v)b-{?&H)Is*TlgZl?7Yt4fYBJ`yJd^PN8hbNr;1yHm}C4ny?@vHN1+ z5=$GT44q1D?b_v};0@@bM^cwdn(i)o{Fb)=gh0@^PV0hoLg`~1>*46%I^W8M*a_2a ztwsKSWU~^yS2{Zf67≪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
  • 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

    pB?aas7AoDBv9M>NpQ{6FPKvaNo@mj&qNv8 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

    XK&+LwYL;v%S)S<(?a+no};VMFd=?>B)Xh0?9 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 p5Kcrjbt&dAM-ABZW9&X! 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 Y#K3iC+ji9dJcB=lc5t)v26dn1|I{2Q-v9sr diff --git a/platforms/android/phonegap-plugin-barcodescanner/SnipeITMobile-barcodescanner.gradle b/platforms/android/phonegap-plugin-barcodescanner/SnipeITMobile-barcodescanner.gradle deleted file mode 100644 index ff2b44d..0000000 --- a/platforms/android/phonegap-plugin-barcodescanner/SnipeITMobile-barcodescanner.gradle +++ /dev/null @@ -1,20 +0,0 @@ -ext.cdvMinSdkVersion = 15 - -repositories{ - jcenter() - flatDir{ - dirs 'libs' - } -} - -dependencies { - compile 'com.android.support:support-v4:+' - compile(name:'barcodescanner', ext:'aar') -} - -android { - packagingOptions { - exclude 'META-INF/NOTICE' - exclude 'META-INF/LICENSE' - } -} \ No newline at end of file diff --git a/platforms/android/platform_www/cordova_plugins.js b/platforms/android/platform_www/cordova_plugins.js index 41666c7..49f340e 100644 --- a/platforms/android/platform_www/cordova_plugins.js +++ b/platforms/android/platform_www/cordova_plugins.js @@ -1,10 +1,434 @@ cordova.define('cordova/plugin_list', function(require, exports, module) { module.exports = [ { - "file": "plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js", - "id": "phonegap-plugin-barcodescanner.BarcodeScanner", + "file": "plugins/cordova-plugin-dialogs/www/notification.js", + "id": "cordova-plugin-dialogs.notification", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-dialogs/www/android/notification.js", + "id": "cordova-plugin-dialogs.notification_android", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js", + "id": "cordova-plugin-file.DirectoryEntry", "clobbers": [ - "cordova.plugins.barcodeScanner" + "window.DirectoryEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryReader.js", + "id": "cordova-plugin-file.DirectoryReader", + "clobbers": [ + "window.DirectoryReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Entry.js", + "id": "cordova-plugin-file.Entry", + "clobbers": [ + "window.Entry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/File.js", + "id": "cordova-plugin-file.File", + "clobbers": [ + "window.File" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileEntry.js", + "id": "cordova-plugin-file.FileEntry", + "clobbers": [ + "window.FileEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileError.js", + "id": "cordova-plugin-file.FileError", + "clobbers": [ + "window.FileError" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileReader.js", + "id": "cordova-plugin-file.FileReader", + "clobbers": [ + "window.FileReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileSystem.js", + "id": "cordova-plugin-file.FileSystem", + "clobbers": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js", + "id": "cordova-plugin-file.FileUploadOptions", + "clobbers": [ + "window.FileUploadOptions" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadResult.js", + "id": "cordova-plugin-file.FileUploadResult", + "clobbers": [ + "window.FileUploadResult" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileWriter.js", + "id": "cordova-plugin-file.FileWriter", + "clobbers": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Flags.js", + "id": "cordova-plugin-file.Flags", + "clobbers": [ + "window.Flags" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js", + "id": "cordova-plugin-file.LocalFileSystem", + "clobbers": [ + "window.LocalFileSystem" + ], + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Metadata.js", + "id": "cordova-plugin-file.Metadata", + "clobbers": [ + "window.Metadata" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ProgressEvent.js", + "id": "cordova-plugin-file.ProgressEvent", + "clobbers": [ + "window.ProgressEvent" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems.js", + "id": "cordova-plugin-file.fileSystems" + }, + { + "file": "plugins/cordova-plugin-file/www/requestFileSystem.js", + "id": "cordova-plugin-file.requestFileSystem", + "clobbers": [ + "window.requestFileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js", + "id": "cordova-plugin-file.resolveLocalFileSystemURI", + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/browser/isChrome.js", + "id": "cordova-plugin-file.isChrome", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/android/FileSystem.js", + "id": "cordova-plugin-file.androidFileSystem", + "merges": [ + "FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems-roots.js", + "id": "cordova-plugin-file.fileSystems-roots", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js", + "id": "cordova-plugin-file.fileSystemPaths", + "merges": [ + "cordova" + ], + "runs": true + }, + { + "file": "plugins/cordova-plugin-media/www/MediaError.js", + "id": "cordova-plugin-media.MediaError", + "clobbers": [ + "window.MediaError" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/Media.js", + "id": "cordova-plugin-media.Media", + "clobbers": [ + "window.Media" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransferError.js", + "id": "cordova-plugin-file-transfer.FileTransferError", + "clobbers": [ + "window.FileTransferError" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransfer.js", + "id": "cordova-plugin-file-transfer.FileTransfer", + "clobbers": [ + "window.FileTransfer" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js", + "id": "cordova-plugin-media-capture.CaptureAudioOptions", + "clobbers": [ + "CaptureAudioOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js", + "id": "cordova-plugin-media-capture.CaptureImageOptions", + "clobbers": [ + "CaptureImageOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js", + "id": "cordova-plugin-media-capture.CaptureVideoOptions", + "clobbers": [ + "CaptureVideoOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureError.js", + "id": "cordova-plugin-media-capture.CaptureError", + "clobbers": [ + "CaptureError" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFileData.js", + "id": "cordova-plugin-media-capture.MediaFileData", + "clobbers": [ + "MediaFileData" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFile.js", + "id": "cordova-plugin-media-capture.MediaFile", + "clobbers": [ + "MediaFile" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/helpers.js", + "id": "cordova-plugin-media-capture.helpers", + "runs": true + }, + { + "file": "plugins/cordova-plugin-media-capture/www/capture.js", + "id": "cordova-plugin-media-capture.capture", + "clobbers": [ + "navigator.device.capture" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/android/init.js", + "id": "cordova-plugin-media-capture.init", + "runs": true + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassError.js", + "id": "cordova-plugin-device-orientation.CompassError", + "clobbers": [ + "CompassError" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassHeading.js", + "id": "cordova-plugin-device-orientation.CompassHeading", + "clobbers": [ + "CompassHeading" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/compass.js", + "id": "cordova-plugin-device-orientation.compass", + "clobbers": [ + "navigator.compass" + ] + }, + { + "file": "plugins/cordova-plugin-device/www/device.js", + "id": "cordova-plugin-device.device", + "clobbers": [ + "device" + ] + }, + { + "file": "plugins/cordova-plugin-battery-status/www/battery.js", + "id": "cordova-plugin-battery-status.battery", + "clobbers": [ + "navigator.battery" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraConstants.js", + "id": "cordova-plugin-camera.Camera", + "clobbers": [ + "Camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverOptions.js", + "id": "cordova-plugin-camera.CameraPopoverOptions", + "clobbers": [ + "CameraPopoverOptions" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/Camera.js", + "id": "cordova-plugin-camera.camera", + "clobbers": [ + "navigator.camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverHandle.js", + "id": "cordova-plugin-camera.CameraPopoverHandle", + "clobbers": [ + "CameraPopoverHandle" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/contacts.js", + "id": "cordova-plugin-contacts.contacts", + "clobbers": [ + "navigator.contacts" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/Contact.js", + "id": "cordova-plugin-contacts.Contact", + "clobbers": [ + "Contact" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/convertUtils.js", + "id": "cordova-plugin-contacts.convertUtils" + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactAddress.js", + "id": "cordova-plugin-contacts.ContactAddress", + "clobbers": [ + "ContactAddress" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactError.js", + "id": "cordova-plugin-contacts.ContactError", + "clobbers": [ + "ContactError" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactField.js", + "id": "cordova-plugin-contacts.ContactField", + "clobbers": [ + "ContactField" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFindOptions.js", + "id": "cordova-plugin-contacts.ContactFindOptions", + "clobbers": [ + "ContactFindOptions" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactName.js", + "id": "cordova-plugin-contacts.ContactName", + "clobbers": [ + "ContactName" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactOrganization.js", + "id": "cordova-plugin-contacts.ContactOrganization", + "clobbers": [ + "ContactOrganization" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFieldType.js", + "id": "cordova-plugin-contacts.ContactFieldType", + "merges": [ + "" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/Acceleration.js", + "id": "cordova-plugin-device-motion.Acceleration", + "clobbers": [ + "Acceleration" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/accelerometer.js", + "id": "cordova-plugin-device-motion.accelerometer", + "clobbers": [ + "navigator.accelerometer" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/android/geolocation.js", + "id": "cordova-plugin-geolocation.geolocation", + "clobbers": [ + "navigator.geolocation" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/PositionError.js", + "id": "cordova-plugin-geolocation.PositionError", + "runs": true + }, + { + "file": "plugins/cordova-plugin-vibration/www/vibration.js", + "id": "cordova-plugin-vibration.notification", + "merges": [ + "navigator.notification", + "navigator" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/network.js", + "id": "cordova-plugin-network-information.network", + "clobbers": [ + "navigator.connection", + "navigator.network.connection" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/Connection.js", + "id": "cordova-plugin-network-information.Connection", + "clobbers": [ + "Connection" ] } ]; @@ -12,7 +436,21 @@ module.exports.metadata = // TOP OF METADATA { "cordova-plugin-compat": "1.0.0", - "phonegap-plugin-barcodescanner": "5.0.0", + "cordova-plugin-dialogs": "1.2.2-dev", + "cordova-plugin-file": "4.2.0", + "cordova-plugin-media": "2.3.1-dev", + "cordova-plugin-file-transfer": "1.5.2-dev", + "cordova-plugin-media-capture": "1.3.1-dev", + "cordova-plugin-device-orientation": "1.0.4-dev", + "cordova-plugin-device": "1.1.3-dev", + "cordova-plugin-battery-status": "1.1.3-dev", + "cordova-plugin-camera": "2.2.1-dev", + "cordova-plugin-contacts": "2.1.1-dev", + "cordova-plugin-device-motion": "1.2.2-dev", + "cordova-plugin-geolocation": "2.2.1-dev", + "cordova-plugin-vibration": "2.1.2-dev", + "cordova-plugin-network-information": "1.2.2-dev", + "cordova-plugin-console": "1.0.4-dev", "cordova-plugin-whitelist": "1.2.2" }; // BOTTOM OF METADATA diff --git a/platforms/android/platform_www/plugins/cordova-plugin-battery-status/www/battery.js b/platforms/android/platform_www/plugins/cordova-plugin-battery-status/www/battery.js new file mode 100644 index 0000000..5394ef8 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-battery-status/www/battery.js @@ -0,0 +1,113 @@ +cordova.define("cordova-plugin-battery-status.battery", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * This class contains information about the current battery status. + * @constructor + */ +var cordova = require('cordova'), + exec = require('cordova/exec'); + +var STATUS_CRITICAL = 5; +var STATUS_LOW = 20; + +var Battery = function() { + this._level = null; + this._isPlugged = null; + // Create new event handlers on the window (returns a channel instance) + this.channels = { + batterystatus:cordova.addWindowEventHandler("batterystatus"), + batterylow:cordova.addWindowEventHandler("batterylow"), + batterycritical:cordova.addWindowEventHandler("batterycritical") + }; + for (var key in this.channels) { + this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; + } +}; + +function handlers() { + return battery.channels.batterystatus.numHandlers + + battery.channels.batterylow.numHandlers + + battery.channels.batterycritical.numHandlers; +} + +/** + * Event handlers for when callbacks get registered for the battery. + * Keep track of how many handlers we have so we can start and stop the native battery listener + * appropriately (and hopefully save on battery life!). + */ +Battery.onHasSubscribersChange = function() { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(battery._status, battery._error, "Battery", "start", []); + } else if (handlers() === 0) { + exec(null, null, "Battery", "stop", []); + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function (info) { + + if (info) { + if (battery._level !== info.level || battery._isPlugged !== info.isPlugged) { + + if(info.level === null && battery._level !== null) { + return; // special case where callback is called because we stopped listening to the native side. + } + + // Something changed. Fire batterystatus event + cordova.fireWindowEvent("batterystatus", info); + + if (!info.isPlugged) { // do not fire low/critical if we are charging. issue: CB-4520 + // note the following are NOT exact checks, as we want to catch a transition from + // above the threshold to below. issue: CB-4519 + if (battery._level > STATUS_CRITICAL && info.level <= STATUS_CRITICAL) { + // Fire critical battery event + cordova.fireWindowEvent("batterycritical", info); + } + else if (battery._level > STATUS_LOW && info.level <= STATUS_LOW) { + // Fire low battery event + cordova.fireWindowEvent("batterylow", info); + } + } + battery._level = info.level; + battery._isPlugged = info.isPlugged; + } + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +var battery = new Battery(); // jshint ignore:line + +module.exports = battery; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-camera/www/Camera.js b/platforms/android/platform_www/plugins/cordova-plugin-camera/www/Camera.js new file mode 100644 index 0000000..df633a2 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-camera/www/Camera.js @@ -0,0 +1,194 @@ +cordova.define("cordova-plugin-camera.camera", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + Camera = require('./Camera'); + // XXX: commented out + //CameraPopoverHandle = require('./CameraPopoverHandle'); + +/** + * @namespace navigator + */ + +/** + * @exports camera + */ +var cameraExport = {}; + +// Tack on the Camera Constants to the base camera plugin. +for (var key in Camera) { + cameraExport[key] = Camera[key]; +} + +/** + * Callback function that provides an error message. + * @callback module:camera.onError + * @param {string} message - The message is provided by the device's native code. + */ + +/** + * Callback function that provides the image data. + * @callback module:camera.onSuccess + * @param {string} imageData - Base64 encoding of the image data, _or_ the image file URI, depending on [`cameraOptions`]{@link module:camera.CameraOptions} in effect. + * @example + * // Show image + * // + * function cameraCallback(imageData) { + * var image = document.getElementById('myImage'); + * image.src = "data:image/jpeg;base64," + imageData; + * } + */ + +/** + * Optional parameters to customize the camera settings. + * * [Quirks](#CameraOptions-quirks) + * @typedef module:camera.CameraOptions + * @type {Object} + * @property {number} [quality=50] - Quality of the saved image, expressed as a range of 0-100, where 100 is typically full resolution with no loss from file compression. (Note that information about the camera's resolution is unavailable.) + * @property {module:Camera.DestinationType} [destinationType=FILE_URI] - Choose the format of the return value. + * @property {module:Camera.PictureSourceType} [sourceType=CAMERA] - Set the source of the picture. + * @property {Boolean} [allowEdit=true] - Allow simple editing of image before selection. + * @property {module:Camera.EncodingType} [encodingType=JPEG] - Choose the returned image file's encoding. + * @property {number} [targetWidth] - Width in pixels to scale image. Must be used with `targetHeight`. Aspect ratio remains constant. + * @property {number} [targetHeight] - Height in pixels to scale image. Must be used with `targetWidth`. Aspect ratio remains constant. + * @property {module:Camera.MediaType} [mediaType=PICTURE] - Set the type of media to select from. Only works when `PictureSourceType` is `PHOTOLIBRARY` or `SAVEDPHOTOALBUM`. + * @property {Boolean} [correctOrientation] - Rotate the image to correct for the orientation of the device during capture. + * @property {Boolean} [saveToPhotoAlbum] - Save the image to the photo album on the device after capture. + * @property {module:CameraPopoverOptions} [popoverOptions] - iOS-only options that specify popover location in iPad. + * @property {module:Camera.Direction} [cameraDirection=BACK] - Choose the camera to use (front- or back-facing). + */ + +/** + * @description Takes a photo using the camera, or retrieves a photo from the device's + * image gallery. The image is passed to the success callback as a + * Base64-encoded `String`, or as the URI for the image file. + * + * The `camera.getPicture` function opens the device's default camera + * application that allows users to snap pictures by default - this behavior occurs, + * when `Camera.sourceType` equals [`Camera.PictureSourceType.CAMERA`]{@link module:Camera.PictureSourceType}. + * Once the user snaps the photo, the camera application closes and the application is restored. + * + * If `Camera.sourceType` is `Camera.PictureSourceType.PHOTOLIBRARY` or + * `Camera.PictureSourceType.SAVEDPHOTOALBUM`, then a dialog displays + * that allows users to select an existing image. The + * `camera.getPicture` function returns a [`CameraPopoverHandle`]{@link module:CameraPopoverHandle} object, + * which can be used to reposition the image selection dialog, for + * example, when the device orientation changes. + * + * The return value is sent to the [`cameraSuccess`]{@link module:camera.onSuccess} callback function, in + * one of the following formats, depending on the specified + * `cameraOptions`: + * + * - A `String` containing the Base64-encoded photo image. + * + * - A `String` representing the image file location on local storage (default). + * + * You can do whatever you want with the encoded image or URI, for + * example: + * + * - Render the image in an `` tag, as in the example below + * + * - Save the data locally (`LocalStorage`, [Lawnchair](http://brianleroux.github.com/lawnchair/), etc.) + * + * - Post the data to a remote server + * + * __NOTE__: Photo resolution on newer devices is quite good. Photos + * selected from the device's gallery are not downscaled to a lower + * quality, even if a `quality` parameter is specified. To avoid common + * memory problems, set `Camera.destinationType` to `FILE_URI` rather + * than `DATA_URL`. + * + * __Supported Platforms__ + * + * - Android + * - BlackBerry + * - Browser + * - Firefox + * - FireOS + * - iOS + * - Windows + * - WP8 + * - Ubuntu + * + * More examples [here](#camera-getPicture-examples). Quirks [here](#camera-getPicture-quirks). + * + * @example + * navigator.camera.getPicture(cameraSuccess, cameraError, cameraOptions); + * @param {module:camera.onSuccess} successCallback + * @param {module:camera.onError} errorCallback + * @param {module:camera.CameraOptions} options CameraOptions + */ +cameraExport.getPicture = function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); + options = options || {}; + var getValue = argscheck.getValue; + + var quality = getValue(options.quality, 50); + var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); + var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); + var targetWidth = getValue(options.targetWidth, -1); + var targetHeight = getValue(options.targetHeight, -1); + var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); + var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); + var allowEdit = !!options.allowEdit; + var correctOrientation = !!options.correctOrientation; + var saveToPhotoAlbum = !!options.saveToPhotoAlbum; + var popoverOptions = getValue(options.popoverOptions, null); + var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); + + var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, + mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; + + exec(successCallback, errorCallback, "Camera", "takePicture", args); + // XXX: commented out + //return new CameraPopoverHandle(); +}; + +/** + * Removes intermediate image files that are kept in temporary storage + * after calling [`camera.getPicture`]{@link module:camera.getPicture}. Applies only when the value of + * `Camera.sourceType` equals `Camera.PictureSourceType.CAMERA` and the + * `Camera.destinationType` equals `Camera.DestinationType.FILE_URI`. + * + * __Supported Platforms__ + * + * - iOS + * + * @example + * navigator.camera.cleanup(onSuccess, onFail); + * + * function onSuccess() { + * console.log("Camera cleanup success.") + * } + * + * function onFail(message) { + * alert('Failed because: ' + message); + * } + */ +cameraExport.cleanup = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, "Camera", "cleanup", []); +}; + +module.exports = cameraExport; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js b/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js new file mode 100644 index 0000000..1a786df --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js @@ -0,0 +1,91 @@ +cordova.define("cordova-plugin-camera.Camera", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * @module Camera + */ +module.exports = { + /** + * @enum {number} + */ + DestinationType:{ + /** Return base64 encoded string. DATA_URL can be very memory intensive and cause app crashes or out of memory errors. Use FILE_URI or NATIVE_URI if possible */ + DATA_URL: 0, + /** Return file uri (content://media/external/images/media/2 for Android) */ + FILE_URI: 1, + /** Return native uri (eg. asset-library://... for iOS) */ + NATIVE_URI: 2 + }, + /** + * @enum {number} + */ + EncodingType:{ + /** Return JPEG encoded image */ + JPEG: 0, + /** Return PNG encoded image */ + PNG: 1 + }, + /** + * @enum {number} + */ + MediaType:{ + /** Allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType */ + PICTURE: 0, + /** Allow selection of video only, ONLY RETURNS URL */ + VIDEO: 1, + /** Allow selection from all media types */ + ALLMEDIA : 2 + }, + /** + * @enum {number} + */ + PictureSourceType:{ + /** Choose image from picture library (same as SAVEDPHOTOALBUM for Android) */ + PHOTOLIBRARY : 0, + /** Take picture from camera */ + CAMERA : 1, + /** Choose image from picture library (same as PHOTOLIBRARY for Android) */ + SAVEDPHOTOALBUM : 2 + }, + /** + * Matches iOS UIPopoverArrowDirection constants to specify arrow location on popover. + * @enum {number} + */ + PopoverArrowDirection:{ + ARROW_UP : 1, + ARROW_DOWN : 2, + ARROW_LEFT : 4, + ARROW_RIGHT : 8, + ARROW_ANY : 15 + }, + /** + * @enum {number} + */ + Direction:{ + /** Use the back-facing camera */ + BACK: 0, + /** Use the front-facing camera */ + FRONT: 1 + } +}; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js b/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js new file mode 100644 index 0000000..a65ac7e --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js @@ -0,0 +1,35 @@ +cordova.define("cordova-plugin-camera.CameraPopoverHandle", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * @ignore in favour of iOS' one + * A handle to an image picker popover. + */ +var CameraPopoverHandle = function() { + this.setPosition = function(popoverOptions) { + console.log('CameraPopoverHandle.setPosition is only supported on iOS.'); + }; +}; + +module.exports = CameraPopoverHandle; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js b/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js new file mode 100644 index 0000000..f6a1e8f --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js @@ -0,0 +1,55 @@ +cordova.define("cordova-plugin-camera.CameraPopoverOptions", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Camera = require('./Camera'); + +/** + * @namespace navigator + */ + +/** + * iOS-only parameters that specify the anchor element location and arrow + * direction of the popover when selecting images from an iPad's library + * or album. + * Note that the size of the popover may change to adjust to the + * direction of the arrow and orientation of the screen. Make sure to + * account for orientation changes when specifying the anchor element + * location. + * @module CameraPopoverOptions + * @param {Number} [x=0] - x pixel coordinate of screen element onto which to anchor the popover. + * @param {Number} [y=32] - y pixel coordinate of screen element onto which to anchor the popover. + * @param {Number} [width=320] - width, in pixels, of the screen element onto which to anchor the popover. + * @param {Number} [height=480] - height, in pixels, of the screen element onto which to anchor the popover. + * @param {module:Camera.PopoverArrowDirection} [arrowDir=ARROW_ANY] - Direction the arrow on the popover should point. + */ +var CameraPopoverOptions = function (x, y, width, height, arrowDir) { + // information of rectangle that popover should be anchored to + this.x = x || 0; + this.y = y || 32; + this.width = width || 320; + this.height = height || 480; + this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; +}; + +module.exports = CameraPopoverOptions; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/Contact.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/Contact.js new file mode 100644 index 0000000..22c3d0c --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/Contact.js @@ -0,0 +1,143 @@ +cordova.define("cordova-plugin-contacts.Contact", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + utils = require('cordova/utils'), + convertUtils = require('./convertUtils'); + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + 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.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "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 = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('./contacts').create(result); + successCB(convertUtils.toCordovaFormat(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertUtils.toNativeFormat(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js new file mode 100644 index 0000000..c6c163e --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js @@ -0,0 +1,49 @@ +cordova.define("cordova-plugin-contacts.ContactAddress", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js new file mode 100644 index 0000000..f7a7671 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js @@ -0,0 +1,46 @@ +cordova.define("cordova-plugin-contacts.ContactError", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.OPERATION_CANCELLED_ERROR = 6; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js new file mode 100644 index 0000000..de72ed4 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js @@ -0,0 +1,40 @@ +cordova.define("cordova-plugin-contacts.ContactField", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js new file mode 100644 index 0000000..9f61cfd --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js @@ -0,0 +1,58 @@ +cordova.define("cordova-plugin-contacts.ContactFieldType", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + // Possible field names for various platforms. + // Some field names are platform specific + + var fieldType = { + addresses: "addresses", + birthday: "birthday", + categories: "categories", + country: "country", + department: "department", + displayName: "displayName", + emails: "emails", + familyName: "familyName", + formatted: "formatted", + givenName: "givenName", + honorificPrefix: "honorificPrefix", + honorificSuffix: "honorificSuffix", + id: "id", + ims: "ims", + locality: "locality", + middleName: "middleName", + name: "name", + nickname: "nickname", + note: "note", + organizations: "organizations", + phoneNumbers: "phoneNumbers", + photos: "photos", + postalCode: "postalCode", + region: "region", + streetAddress: "streetAddress", + title: "title", + urls: "urls" + }; + + module.exports = fieldType; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js new file mode 100644 index 0000000..92b9f49 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js @@ -0,0 +1,41 @@ +cordova.define("cordova-plugin-contacts.ContactFindOptions", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + * @param desiredFields + * @param hasPhoneNumber boolean used to filter the search and only return contacts that have a phone number informed + */ + +var ContactFindOptions = function(filter, multiple, desiredFields, hasPhoneNumber) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); + this.desiredFields = typeof desiredFields != 'undefined' ? desiredFields : []; + this.hasPhoneNumber = typeof hasPhoneNumber != 'undefined' ? hasPhoneNumber : false; +}; + +module.exports = ContactFindOptions; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js new file mode 100644 index 0000000..f18a28a --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js @@ -0,0 +1,44 @@ +cordova.define("cordova-plugin-contacts.ContactName", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js new file mode 100644 index 0000000..bb79853 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js @@ -0,0 +1,44 @@ +cordova.define("cordova-plugin-contacts.ContactOrganization", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact organization. +* @constructor +* @param pref +* @param type +* @param name +* @param dept +* @param title +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/contacts.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/contacts.js new file mode 100644 index 0000000..6546d85 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/contacts.js @@ -0,0 +1,102 @@ +cordova.define("cordova-plugin-contacts.contacts", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + Contact = require('./Contact'), + fieldType = require('./ContactFieldType'), + convertUtils = require('./convertUtils'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + fieldType: fieldType, + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find: function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + if (errorCB) { + errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } + } else { + // missing 'options' param means return all contacts + options = options || { filter: '', multiple: true }; + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(convertUtils.toCordovaFormat(contacts.create(result[i]))); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function picks contact from phone using contact picker UI + * @returns new Contact object + */ + pickContact: function (successCB, errorCB) { + + argscheck.checkArgs('fF', 'contacts.pick', arguments); + + var win = function (result) { + // if Contacts.pickContact return instance of Contact object + // don't create new Contact object, use current + var contact = result instanceof Contact ? result : contacts.create(result); + successCB(convertUtils.toCordovaFormat(contact)); + }; + exec(win, errorCB, "Contacts", "pickContact", []); + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create: function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js new file mode 100644 index 0000000..01588fc --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js @@ -0,0 +1,73 @@ +cordova.define("cordova-plugin-contacts.convertUtils", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var utils = require('cordova/utils'); + +module.exports = { + /** + * Converts primitives into Complex Object + * Currently only used for Date fields + */ + toCordovaFormat: function (contact) { + var value = contact.birthday; + if (value !== null) { + try { + contact.birthday = new Date(parseFloat(value)); + + //we might get 'Invalid Date' which does not throw an error + //and is an instance of Date. + if (isNaN(contact.birthday.getTime())) { + contact.birthday = null; + } + + } catch (exception){ + console.log("Cordova Contact toCordovaFormat error: exception creating date."); + } + } + return contact; + }, + + /** + * Converts Complex objects into primitives + * Only conversion at present is for Dates. + **/ + toNativeFormat: function (contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; + } +}; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js b/platforms/android/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js new file mode 100644 index 0000000..794476b --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js @@ -0,0 +1,32 @@ +cordova.define("cordova-plugin-device-motion.Acceleration", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Acceleration = function(x, y, z, timestamp) { + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); +}; + +module.exports = Acceleration; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js b/platforms/android/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js new file mode 100644 index 0000000..b2d01f7 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js @@ -0,0 +1,205 @@ +cordova.define("cordova-plugin-device-motion.accelerometer", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * This class provides access to device accelerometer data. + * @constructor + */ +var argscheck = require('cordova/argscheck'), + utils = require("cordova/utils"), + exec = require("cordova/exec"), + Acceleration = require('./Acceleration'); + +// Is the accel sensor running? +var running = false; + +// Keeps reference to watchAcceleration calls. +var timers = {}; + +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Timer used when faking up devicemotion events +var eventTimerId = null; + +// Tells native to start. +function start() { + exec(function (a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function (e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + accel = null; + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return { win: win, fail: fail }; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + +var accelerometer = { + /** + * Asynchronously acquires the current acceleration. + * + * @param {Function} successCallback The function to call when the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + */ + getCurrentAcceleration: function (successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); + + if (cordova.platformId === "windowsphone") { + exec(function (a) { + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + successCallback(accel); + }, function (e) { + errorCallback(e); + }, "Accelerometer", "getCurrentAcceleration", []); + + return; + } + + var p; + var win = function (a) { + removeListeners(p); + successCallback(a); + }; + var fail = function (e) { + removeListeners(p); + if (errorCallback) { + errorCallback(e); + } + }; + + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } + }, + + /** + * Asynchronously acquires the acceleration repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchAcceleration: function (successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); + // Default interval (10 sec) + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; + + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); + + var p = createCallbackPair(function () { }, function (e) { + removeListeners(p); + if (errorCallback) { + errorCallback(e); + } + }); + listeners.push(p); + + timers[id] = { + timer: window.setInterval(function () { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners: p + }; + + if (running) { + // If we're already running then immediately invoke the success callback + // but only if we have retrieved a value, sample code does not check for null ... + if (accel) { + successCallback(accel); + } + } else { + start(); + } + + if (cordova.platformId === "browser" && !eventTimerId) { + // Start firing devicemotion events if we haven't already + var devicemotionEvent = new Event('devicemotion'); + eventTimerId = window.setInterval(function() { + window.dispatchEvent(devicemotionEvent); + }, 200); + } + + return id; + }, + + /** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ + clearWatch: function (id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); + delete timers[id]; + + if (eventTimerId && Object.keys(timers).length === 0) { + // No more watchers, so stop firing 'devicemotion' events + window.clearInterval(eventTimerId); + eventTimerId = null; + } + } + } +}; +module.exports = accelerometer; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js b/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js new file mode 100644 index 0000000..0055b9a --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js @@ -0,0 +1,37 @@ +cordova.define("cordova-plugin-device-orientation.CompassError", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * CompassError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var CompassError = function(err) { + this.code = (err !== undefined ? err : null); +}; + +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +module.exports = CompassError; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js b/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js new file mode 100644 index 0000000..4ebb4aa --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js @@ -0,0 +1,32 @@ +cordova.define("cordova-plugin-device-orientation.CompassHeading", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { + this.magneticHeading = magneticHeading; + this.trueHeading = trueHeading; + this.headingAccuracy = headingAccuracy; + this.timestamp = timestamp || new Date().getTime(); +}; + +module.exports = CompassHeading; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js b/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js new file mode 100644 index 0000000..48ee5f6 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js @@ -0,0 +1,121 @@ +cordova.define("cordova-plugin-device-orientation.compass", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + utils = require('cordova/utils'), + CompassHeading = require('./CompassHeading'), + CompassError = require('./CompassError'), + + timers = {}, + eventTimerId = null, + compass = { + /** + * Asynchronously acquires 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. + * @param {CompassOptions} options The options for getting the heading data (not used). + */ + getCurrentHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); + + var win = function(result) { + var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); + successCallback(ch); + }; + var fail = errorCallback && function(code) { + var ce = new CompassError(code); + errorCallback(ce); + }; + + // Get heading + exec(win, fail, "Compass", "getHeading", [options]); + }, + + /** + * Asynchronously acquires 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. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. For iOS, filter parameter + * specifies to watch via a distance filter rather than time. + */ + watchHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); + // Default interval (100 msec) + var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; + var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; + + var id = utils.createUUID(); + if (filter > 0) { + // is an iOS request for watch by filter, no timer needed + timers[id] = "iOS"; + compass.getCurrentHeading(successCallback, errorCallback, options); + } else { + // Start watch timer to get headings + timers[id] = window.setInterval(function() { + compass.getCurrentHeading(successCallback, errorCallback); + }, frequency); + } + + if (cordova.platformId === 'browser' && !eventTimerId) { + // Start firing deviceorientation events if haven't already + var deviceorientationEvent = new Event('deviceorientation'); + eventTimerId = window.setInterval(function() { + window.dispatchEvent(deviceorientationEvent); + }, 200); + } + + return id; + }, + + /** + * Clears the specified heading watch. + * @param {String} id The ID of the watch returned from #watchHeading. + */ + clearWatch:function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + if (timers[id] != "iOS") { + clearInterval(timers[id]); + } else { + // is iOS watch by filter so call into device to stop + exec(null, null, "Compass", "stopHeading", []); + } + delete timers[id]; + + if (eventTimerId && Object.keys(timers).length === 0) { + // No more watchers, so stop firing 'deviceorientation' events + window.clearInterval(eventTimerId); + eventTimerId = null; + } + } + } + }; + +module.exports = compass; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-device/www/device.js b/platforms/android/platform_www/plugins/cordova-plugin-device/www/device.js new file mode 100644 index 0000000..977dfc0 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-device/www/device.js @@ -0,0 +1,86 @@ +cordova.define("cordova-plugin-device.device", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + cordova = require('cordova'); + +channel.createSticky('onCordovaInfoReady'); +// Tell cordova channel to wait on the CordovaInfoReady event +channel.waitForInitialization('onCordovaInfoReady'); + +/** + * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +function Device() { + this.available = false; + this.platform = null; + this.version = null; + this.uuid = null; + this.cordova = null; + this.model = null; + this.manufacturer = null; + this.isVirtual = null; + this.serial = null; + + var me = this; + + channel.onCordovaReady.subscribe(function() { + me.getInfo(function(info) { + //ignoring info.cordova returning from native, we should use value from cordova.version defined in cordova.js + //TODO: CB-5105 native implementations should not return info.cordova + var buildLabel = cordova.version; + me.available = true; + me.platform = info.platform; + me.version = info.version; + me.uuid = info.uuid; + me.cordova = buildLabel; + me.model = info.model; + me.isVirtual = info.isVirtual; + me.manufacturer = info.manufacturer || 'unknown'; + me.serial = info.serial || 'unknown'; + channel.onCordovaInfoReady.fire(); + },function(e) { + me.available = false; + utils.alert("[ERROR] Error initializing Cordova: " + e); + }); + }); +} + +/** + * Get device info + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + */ +Device.prototype.getInfo = function(successCallback, errorCallback) { + argscheck.checkArgs('fF', 'Device.getInfo', arguments); + exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); +}; + +module.exports = new Device(); + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-dialogs/www/android/notification.js b/platforms/android/platform_www/plugins/cordova-plugin-dialogs/www/android/notification.js new file mode 100644 index 0000000..69cb5a4 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-dialogs/www/android/notification.js @@ -0,0 +1,77 @@ +cordova.define("cordova-plugin-dialogs.notification_android", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); + +/** + * Provides Android enhanced notification API. + */ +module.exports = { + activityStart : function(title, message) { + // If title and message not specified then mimic Android behavior of + // using default strings. + if (typeof title === "undefined" && typeof message == "undefined") { + title = "Busy"; + message = 'Please wait...'; + } + + exec(null, null, 'Notification', 'activityStart', [ title, message ]); + }, + + /** + * Close an activity dialog + */ + activityStop : function() { + exec(null, null, 'Notification', 'activityStop', []); + }, + + /** + * Display a progress dialog with progress bar that goes from 0 to 100. + * + * @param {String} + * title Title of the progress dialog. + * @param {String} + * message Message to display in the dialog. + */ + progressStart : function(title, message) { + exec(null, null, 'Notification', 'progressStart', [ title, message ]); + }, + + /** + * Close the progress dialog. + */ + progressStop : function() { + exec(null, null, 'Notification', 'progressStop', []); + }, + + /** + * Set the progress dialog value. + * + * @param {Number} + * value 0-100 + */ + progressValue : function(value) { + exec(null, null, 'Notification', 'progressValue', [ value ]); + } +}; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-dialogs/www/notification.js b/platforms/android/platform_www/plugins/cordova-plugin-dialogs/www/notification.js new file mode 100644 index 0000000..6558ea0 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-dialogs/www/notification.js @@ -0,0 +1,130 @@ +cordova.define("cordova-plugin-dialogs.notification", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); +var platform = require('cordova/platform'); + +/** + * Provides access to notifications on the device. + */ + +module.exports = { + + /** + * Open a native alert dialog, with a customizable title and button text. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} completeCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Alert) + * @param {String} buttonLabel Label of the close button (default: OK) + */ + alert: function(message, completeCallback, title, buttonLabel) { + var _title = (typeof title === "string" ? title : "Alert"); + var _buttonLabel = (buttonLabel || "OK"); + exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]); + }, + + /** + * Open a native confirm dialog, with a customizable title and button text. + * The result that the user selects is returned to the result callback. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Confirm) + * @param {Array} buttonLabels Array of the labels of the buttons (default: ['OK', 'Cancel']) + */ + confirm: function(message, resultCallback, title, buttonLabels) { + var _title = (typeof title === "string" ? title : "Confirm"); + var _buttonLabels = (buttonLabels || ["OK", "Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.confirm(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + + exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]); + }, + + /** + * Open a native prompt dialog, with a customizable title and button text. + * The following results are returned to the result callback: + * buttonIndex Index number of the button selected. + * input1 The text entered in the prompt dialog box. + * + * @param {String} message Dialog message to display (default: "Prompt message") + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the dialog (default: "Prompt") + * @param {Array} buttonLabels Array of strings for the button labels (default: ["OK","Cancel"]) + * @param {String} defaultText Textbox input value (default: empty string) + */ + prompt: function(message, resultCallback, title, buttonLabels, defaultText) { + var _message = (typeof message === "string" ? message : "Prompt message"); + var _title = (typeof title === "string" ? title : "Prompt"); + var _buttonLabels = (buttonLabels || ["OK","Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.prompt(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + + var _defaultText = (defaultText || ""); + exec(resultCallback, null, "Notification", "prompt", [_message, _title, _buttonLabels, _defaultText]); + }, + + /** + * Causes the device to beep. + * On Android, the default notification ringtone is played "count" times. + * + * @param {Integer} count The number of beeps. + */ + beep: function(count) { + var defaultedCount = count || 1; + exec(null, null, "Notification", "beep", [ defaultedCount ]); + } +}; + +function convertButtonLabels(buttonLabels) { + + // Some platforms take an array of button label names. + // Other platforms take a comma separated list. + // For compatibility, we convert to the desired type based on the platform. + if (platform.id == "amazon-fireos" || platform.id == "android" || platform.id == "ios" || + platform.id == "windowsphone" || platform.id == "firefoxos" || platform.id == "ubuntu" || + platform.id == "windows8" || platform.id == "windows") { + + if (typeof buttonLabels === 'string') { + buttonLabels = buttonLabels.split(","); // not crazy about changing the var type here + } + } else { + if (Array.isArray(buttonLabels)) { + var buttonLabelArray = buttonLabels; + buttonLabels = buttonLabelArray.toString(); + } + } + + return buttonLabels; +} +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js b/platforms/android/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js new file mode 100644 index 0000000..3019d5e --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js @@ -0,0 +1,242 @@ +cordova.define("cordova-plugin-file-transfer.FileTransfer", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* global cordova, FileSystem */ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + FileTransferError = require('./FileTransferError'), + ProgressEvent = require('cordova-plugin-file.ProgressEvent'); + +function newProgressEvent(result) { + var pe = new ProgressEvent(); + pe.lengthComputable = result.lengthComputable; + pe.loaded = result.loaded; + pe.total = result.total; + return pe; +} + +function getUrlCredentials(urlString) { + var credentialsPattern = /^https?\:\/\/(?:(?:(([^:@\/]*)(?::([^@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?).*$/, + credentials = credentialsPattern.exec(urlString); + + return credentials && credentials[1]; +} + +function getBasicAuthHeader(urlString) { + var header = null; + + + // This is changed due to MS Windows doesn't support credentials in http uris + // so we detect them by regexp and strip off from result url + // Proof: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/a327cf3c-f033-4a54-8b7f-03c56ba3203f/windows-foundation-uri-security-problem + + if (window.btoa) { + var credentials = getUrlCredentials(urlString); + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; +} + +function convertHeadersToArray(headers) { + var result = []; + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + var headerValue = headers[header]; + result.push({ + name: header, + value: headerValue.toString() + }); + } + } + return result; +} + +var idCounter = 0; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** +* 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 +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + var headers = null; + var httpMethod = null; + var basicAuthHeader = getBasicAuthHeader(server); + if (basicAuthHeader) { + server = server.replace(getUrlCredentials(server) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + httpMethod = options.httpMethod || "POST"; + if (httpMethod.toUpperCase() == "PUT"){ + httpMethod = "PUT"; + } else { + httpMethod = "POST"; + } + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + if (cordova.platformId === "windowsphone") { + headers = headers && convertHeadersToArray(headers); + params = params && convertHeadersToArray(params); + } + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body, e.exception); + errorCallback(error); + }; + + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + self.onprogress(newProgressEvent(result)); + } + } else { + if (successCallback) { + successCallback(result); + } + } + }; + exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + * @param options {FileDownloadOptions} Optional parameters such as headers + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + var self = this; + + var basicAuthHeader = getBasicAuthHeader(source); + if (basicAuthHeader) { + source = source.replace(getUrlCredentials(source) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var headers = null; + if (options) { + headers = options.headers || null; + } + + if (cordova.platformId === "windowsphone" && headers) { + headers = convertHeadersToArray(headers); + } + + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + return self.onprogress(newProgressEvent(result)); + } + } else if (successCallback) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova-plugin-file.DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova-plugin-file.FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + entry.filesystem = new FileSystem(result.filesystemName || (result.filesystem == window.PERSISTENT ? 'persistent' : 'temporary')); + entry.nativeURL = result.nativeURL; + successCallback(entry); + } + }; + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body, e.exception); + errorCallback(error); + }; + + exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); +}; + +/** + * Aborts the ongoing file transfer on this object. The original error + * callback for the file transfer will be called if necessary. + */ +FileTransfer.prototype.abort = function() { + exec(null, null, 'FileTransfer', 'abort', [this._id]); +}; + +module.exports = FileTransfer; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js b/platforms/android/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js new file mode 100644 index 0000000..18fb64c --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js @@ -0,0 +1,44 @@ +cordova.define("cordova-plugin-file-transfer.FileTransferError", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * FileTransferError + * @constructor + */ +var FileTransferError = function(code, source, target, status, body, exception) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; + this.exception = exception || null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; +FileTransferError.ABORT_ERR = 4; +FileTransferError.NOT_MODIFIED_ERR = 5; + +module.exports = FileTransferError; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js b/platforms/android/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js new file mode 100644 index 0000000..36c6e28 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js @@ -0,0 +1,120 @@ +cordova.define("cordova-plugin-file.DirectoryEntry", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('./Entry'), + FileError = require('./FileError'), + DirectoryReader = require('./DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) { + + // add trailing slash if it is missing + if ((fullPath) && !/\/$/.test(fullPath)) { + fullPath += "/"; + } + // add trailing slash if it is missing + if (nativeURL && !/\/$/.test(nativeURL)) { + nativeURL += "/"; + } + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, fileSystem, nativeURL); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.toInternalURL()); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getDirectory", [this.toInternalURL(), path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.toInternalURL()]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var FileEntry = require('./FileEntry'); + var entry = new FileEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.toInternalURL(), path, options]); +}; + +module.exports = DirectoryEntry; + +}); diff --git a/platforms/android/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js b/platforms/android/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js new file mode 100644 index 0000000..2b3ada2 --- /dev/null +++ b/platforms/android/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js @@ -0,0 +1,76 @@ +cordova.define("cordova-plugin-file.DirectoryReader", function(require, exports, module) { +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'), + FileError = require('./FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(localURL) { + this.localURL = localURL || null; + this.hasReadEntries = false; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + // If we've already read and passed on this directory's entries, return an empty list. + if (this.hasReadEntries) { + successCallback([]); + return; + } + var reader = this; + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i or + *

    + * This implementation has several advantages: + *

      + *
    • It sees contacts from multiple accounts. + *
    • It works with aggregated contacts. So for example, if the contact is the result + * of aggregation of two raw contacts from different accounts, it may return the name from + * one and the phone number from the other. + *
    • It is efficient because it uses the more efficient current API. + *
    • Not obvious in this particular example, but it has access to new kinds + * of data available exclusively through the new APIs. Exercise for the reader: add support + * for nickname (see {@link android.provider.ContactsContract.CommonDataKinds.Nickname}) or + * social status updates (see {@link android.provider.ContactsContract.StatusUpdates}). + *
    + */ + +public class ContactAccessorSdk5 extends ContactAccessor { + + /** + * Keep the photo size under the 1 MB blog limit. + */ + private static final long MAX_PHOTO_SIZE = 1048576; + + private static final String EMAIL_REGEXP = ".+@.+\\.+.+"; /* @.*/ + + private static final String ASSET_URL_PREFIX = "file:///android_asset/"; + + /** + * A static map that converts the JavaScript property name to Android database column name. + */ + private static final Map dbMap = new HashMap(); + + static { + dbMap.put("id", ContactsContract.Data.CONTACT_ID); + dbMap.put("displayName", ContactsContract.Contacts.DISPLAY_NAME); + dbMap.put("name", CommonDataKinds.StructuredName.DISPLAY_NAME); + dbMap.put("name.formatted", CommonDataKinds.StructuredName.DISPLAY_NAME); + dbMap.put("name.familyName", CommonDataKinds.StructuredName.FAMILY_NAME); + dbMap.put("name.givenName", CommonDataKinds.StructuredName.GIVEN_NAME); + dbMap.put("name.middleName", CommonDataKinds.StructuredName.MIDDLE_NAME); + dbMap.put("name.honorificPrefix", CommonDataKinds.StructuredName.PREFIX); + dbMap.put("name.honorificSuffix", CommonDataKinds.StructuredName.SUFFIX); + dbMap.put("nickname", CommonDataKinds.Nickname.NAME); + dbMap.put("phoneNumbers", CommonDataKinds.Phone.NUMBER); + dbMap.put("phoneNumbers.value", CommonDataKinds.Phone.NUMBER); + dbMap.put("emails", CommonDataKinds.Email.DATA); + dbMap.put("emails.value", CommonDataKinds.Email.DATA); + dbMap.put("addresses", CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + dbMap.put("addresses.formatted", CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + dbMap.put("addresses.streetAddress", CommonDataKinds.StructuredPostal.STREET); + dbMap.put("addresses.locality", CommonDataKinds.StructuredPostal.CITY); + dbMap.put("addresses.region", CommonDataKinds.StructuredPostal.REGION); + dbMap.put("addresses.postalCode", CommonDataKinds.StructuredPostal.POSTCODE); + dbMap.put("addresses.country", CommonDataKinds.StructuredPostal.COUNTRY); + dbMap.put("ims", CommonDataKinds.Im.DATA); + dbMap.put("ims.value", CommonDataKinds.Im.DATA); + dbMap.put("organizations", CommonDataKinds.Organization.COMPANY); + dbMap.put("organizations.name", CommonDataKinds.Organization.COMPANY); + dbMap.put("organizations.department", CommonDataKinds.Organization.DEPARTMENT); + dbMap.put("organizations.title", CommonDataKinds.Organization.TITLE); + dbMap.put("birthday", CommonDataKinds.Event.CONTENT_ITEM_TYPE); + dbMap.put("note", CommonDataKinds.Note.NOTE); + dbMap.put("photos.value", CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + //dbMap.put("categories.value", null); + dbMap.put("urls", CommonDataKinds.Website.URL); + dbMap.put("urls.value", CommonDataKinds.Website.URL); + } + + /** + * Create an contact accessor. + */ + public ContactAccessorSdk5(CordovaInterface context) { + mApp = context; + } + + /** + * This method takes the fields required and search options in order to produce an + * array of contacts that matches the criteria provided. + * @param fields an array of items to be used as search criteria + * @param options that can be applied to contact searching + * @return an array of contacts + */ + @Override + public JSONArray search(JSONArray fields, JSONObject options) { + // Get the find options + String searchTerm = ""; + int limit = Integer.MAX_VALUE; + boolean multiple = true; + boolean hasPhoneNumber = false; + + if (options != null) { + searchTerm = options.optString("filter"); + if (searchTerm.length() == 0) { + searchTerm = "%"; + } + else { + searchTerm = "%" + searchTerm + "%"; + } + + try { + multiple = options.getBoolean("multiple"); + if (!multiple) { + limit = 1; + } + } catch (JSONException e) { + // Multiple was not specified so we assume the default is true. + Log.e(LOG_TAG, e.getMessage(), e); + } + + try { + hasPhoneNumber = options.getBoolean("hasPhoneNumber"); + } catch (JSONException e) { + // hasPhoneNumber was not specified so we assume the default is false. + } + } + else { + searchTerm = "%"; + } + + // Loop through the fields the user provided to see what data should be returned. + HashMap populate = buildPopulationSet(options); + + // Build the ugly where clause and where arguments for one big query. + WhereOptions whereOptions = buildWhereClause(fields, searchTerm, hasPhoneNumber); + + // Get all the id's where the search term matches the fields passed in. + Cursor idCursor = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, + new String[] { ContactsContract.Data.CONTACT_ID }, + whereOptions.getWhere(), + whereOptions.getWhereArgs(), + ContactsContract.Data.CONTACT_ID + " ASC"); + + // Create a set of unique ids + Set contactIds = new HashSet(); + int idColumn = -1; + while (idCursor.moveToNext()) { + if (idColumn < 0) { + idColumn = idCursor.getColumnIndex(ContactsContract.Data.CONTACT_ID); + } + contactIds.add(idCursor.getString(idColumn)); + } + idCursor.close(); + + // Build a query that only looks at ids + WhereOptions idOptions = buildIdClause(contactIds, searchTerm, hasPhoneNumber); + + // Determine which columns we should be fetching. + HashSet columnsToFetch = new HashSet(); + columnsToFetch.add(ContactsContract.Data.CONTACT_ID); + columnsToFetch.add(ContactsContract.Data.RAW_CONTACT_ID); + columnsToFetch.add(ContactsContract.Data.MIMETYPE); + + if (isRequired("displayName", populate)) { + columnsToFetch.add(CommonDataKinds.StructuredName.DISPLAY_NAME); + } + if (isRequired("name", populate)) { + columnsToFetch.add(CommonDataKinds.StructuredName.FAMILY_NAME); + columnsToFetch.add(CommonDataKinds.StructuredName.GIVEN_NAME); + columnsToFetch.add(CommonDataKinds.StructuredName.MIDDLE_NAME); + columnsToFetch.add(CommonDataKinds.StructuredName.PREFIX); + columnsToFetch.add(CommonDataKinds.StructuredName.SUFFIX); + } + if (isRequired("phoneNumbers", populate)) { + columnsToFetch.add(CommonDataKinds.Phone._ID); + columnsToFetch.add(CommonDataKinds.Phone.NUMBER); + columnsToFetch.add(CommonDataKinds.Phone.TYPE); + } + if (isRequired("emails", populate)) { + columnsToFetch.add(CommonDataKinds.Email._ID); + columnsToFetch.add(CommonDataKinds.Email.DATA); + columnsToFetch.add(CommonDataKinds.Email.TYPE); + } + if (isRequired("addresses", populate)) { + columnsToFetch.add(CommonDataKinds.StructuredPostal._ID); + columnsToFetch.add(CommonDataKinds.Organization.TYPE); + columnsToFetch.add(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS); + columnsToFetch.add(CommonDataKinds.StructuredPostal.STREET); + columnsToFetch.add(CommonDataKinds.StructuredPostal.CITY); + columnsToFetch.add(CommonDataKinds.StructuredPostal.REGION); + columnsToFetch.add(CommonDataKinds.StructuredPostal.POSTCODE); + columnsToFetch.add(CommonDataKinds.StructuredPostal.COUNTRY); + } + if (isRequired("organizations", populate)) { + columnsToFetch.add(CommonDataKinds.Organization._ID); + columnsToFetch.add(CommonDataKinds.Organization.TYPE); + columnsToFetch.add(CommonDataKinds.Organization.DEPARTMENT); + columnsToFetch.add(CommonDataKinds.Organization.COMPANY); + columnsToFetch.add(CommonDataKinds.Organization.TITLE); + } + if (isRequired("ims", populate)) { + columnsToFetch.add(CommonDataKinds.Im._ID); + columnsToFetch.add(CommonDataKinds.Im.DATA); + columnsToFetch.add(CommonDataKinds.Im.TYPE); + } + if (isRequired("note", populate)) { + columnsToFetch.add(CommonDataKinds.Note.NOTE); + } + if (isRequired("nickname", populate)) { + columnsToFetch.add(CommonDataKinds.Nickname.NAME); + } + if (isRequired("urls", populate)) { + columnsToFetch.add(CommonDataKinds.Website._ID); + columnsToFetch.add(CommonDataKinds.Website.URL); + columnsToFetch.add(CommonDataKinds.Website.TYPE); + } + if (isRequired("birthday", populate)) { + columnsToFetch.add(CommonDataKinds.Event.START_DATE); + columnsToFetch.add(CommonDataKinds.Event.TYPE); + } + if (isRequired("photos", populate)) { + columnsToFetch.add(CommonDataKinds.Photo._ID); + } + + // Do the id query + Cursor c = mApp.getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, + columnsToFetch.toArray(new String[] {}), + idOptions.getWhere(), + idOptions.getWhereArgs(), + ContactsContract.Data.CONTACT_ID + " ASC"); + + JSONArray contacts = populateContactArray(limit, populate, c); + + if (!c.isClosed()) { + c.close(); + } + return contacts; + } + + /** + * A special search that finds one contact by id + * + * @param id contact to find by id + * @return a JSONObject representing the contact + * @throws JSONException + */ + public JSONObject getContactById(String id) throws JSONException { + // Call overloaded version with no desiredFields + return getContactById(id, null); + } + + @Override + public JSONObject getContactById(String id, JSONArray desiredFields) throws JSONException { + // Do the id query + Cursor c = mApp.getActivity().getContentResolver().query( + ContactsContract.Data.CONTENT_URI, + null, + ContactsContract.Data.RAW_CONTACT_ID + " = ? ", + new String[] { id }, + ContactsContract.Data.RAW_CONTACT_ID + " ASC"); + + HashMap populate = buildPopulationSet( + new JSONObject().put("desiredFields", desiredFields) + ); + + JSONArray contacts = populateContactArray(1, populate, c); + + if (!c.isClosed()) { + c.close(); + } + + if (contacts.length() == 1) { + return contacts.getJSONObject(0); + } else { + return null; + } + } + + /** + * Creates an array of contacts from the cursor you pass in + * + * @param limit max number of contacts for the array + * @param populate whether or not you should populate a certain value + * @param c the cursor + * @return a JSONArray of contacts + */ + private JSONArray populateContactArray(int limit, + HashMap populate, Cursor c) { + + String contactId = ""; + String rawId = ""; + String oldContactId = ""; + boolean newContact = true; + String mimetype = ""; + + JSONArray contacts = new JSONArray(); + JSONObject contact = new JSONObject(); + JSONArray organizations = new JSONArray(); + JSONArray addresses = new JSONArray(); + JSONArray phones = new JSONArray(); + JSONArray emails = new JSONArray(); + JSONArray ims = new JSONArray(); + JSONArray websites = new JSONArray(); + JSONArray photos = new JSONArray(); + + // Column indices + int colContactId = c.getColumnIndex(ContactsContract.Data.CONTACT_ID); + int colRawContactId = c.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID); + int colMimetype = c.getColumnIndex(ContactsContract.Data.MIMETYPE); + int colDisplayName = c.getColumnIndex(CommonDataKinds.StructuredName.DISPLAY_NAME); + int colNote = c.getColumnIndex(CommonDataKinds.Note.NOTE); + int colNickname = c.getColumnIndex(CommonDataKinds.Nickname.NAME); + int colEventType = c.getColumnIndex(CommonDataKinds.Event.TYPE); + + if (c.getCount() > 0) { + while (c.moveToNext() && (contacts.length() <= (limit - 1))) { + try { + contactId = c.getString(colContactId); + rawId = c.getString(colRawContactId); + + // If we are in the first row set the oldContactId + if (c.getPosition() == 0) { + oldContactId = contactId; + } + + // When the contact ID changes we need to push the Contact object + // to the array of contacts and create new objects. + if (!oldContactId.equals(contactId)) { + // Populate the Contact object with it's arrays + // and push the contact into the contacts array + contacts.put(populateContact(contact, organizations, addresses, phones, + emails, ims, websites, photos)); + + // Clean up the objects + contact = new JSONObject(); + organizations = new JSONArray(); + addresses = new JSONArray(); + phones = new JSONArray(); + emails = new JSONArray(); + ims = new JSONArray(); + websites = new JSONArray(); + photos = new JSONArray(); + + // Set newContact to true as we are starting to populate a new contact + newContact = true; + } + + // When we detect a new contact set the ID and display name. + // These fields are available in every row in the result set returned. + if (newContact) { + newContact = false; + contact.put("id", contactId); + contact.put("rawId", rawId); + } + + // Grab the mimetype of the current row as it will be used in a lot of comparisons + mimetype = c.getString(colMimetype); + + if (mimetype.equals(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) && isRequired("name", populate)) { + contact.put("displayName", c.getString(colDisplayName)); + } + + if (mimetype.equals(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + && isRequired("name", populate)) { + contact.put("name", nameQuery(c)); + } + else if (mimetype.equals(CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + && isRequired("phoneNumbers", populate)) { + phones.put(phoneQuery(c)); + } + else if (mimetype.equals(CommonDataKinds.Email.CONTENT_ITEM_TYPE) + && isRequired("emails", populate)) { + emails.put(emailQuery(c)); + } + else if (mimetype.equals(CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + && isRequired("addresses", populate)) { + addresses.put(addressQuery(c)); + } + else if (mimetype.equals(CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + && isRequired("organizations", populate)) { + organizations.put(organizationQuery(c)); + } + else if (mimetype.equals(CommonDataKinds.Im.CONTENT_ITEM_TYPE) + && isRequired("ims", populate)) { + ims.put(imQuery(c)); + } + else if (mimetype.equals(CommonDataKinds.Note.CONTENT_ITEM_TYPE) + && isRequired("note", populate)) { + contact.put("note", c.getString(colNote)); + } + else if (mimetype.equals(CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + && isRequired("nickname", populate)) { + contact.put("nickname", c.getString(colNickname)); + } + else if (mimetype.equals(CommonDataKinds.Website.CONTENT_ITEM_TYPE) + && isRequired("urls", populate)) { + websites.put(websiteQuery(c)); + } + else if (mimetype.equals(CommonDataKinds.Event.CONTENT_ITEM_TYPE)) { + if (isRequired("birthday", populate) && + CommonDataKinds.Event.TYPE_BIRTHDAY == c.getInt(colEventType)) { + + Date birthday = getBirthday(c); + if (birthday != null) { + contact.put("birthday", birthday.getTime()); + } + } + } + else if (mimetype.equals(CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + && isRequired("photos", populate)) { + JSONObject photo = photoQuery(c, contactId); + if (photo != null) { + photos.put(photo); + } + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + + // Set the old contact ID + oldContactId = contactId; + + } + + // Push the last contact into the contacts array + if (contacts.length() < limit) { + contacts.put(populateContact(contact, organizations, addresses, phones, + emails, ims, websites, photos)); + } + } + c.close(); + return contacts; + } + + /** + * Builds a where clause all all the ids passed into the method + * @param contactIds a set of unique contact ids + * @param searchTerm what to search for + * @return an object containing the selection and selection args + */ + private WhereOptions buildIdClause(Set contactIds, String searchTerm, boolean hasPhoneNumber) { + WhereOptions options = new WhereOptions(); + + // If the user is searching for every contact then short circuit the method + // and return a shorter where clause to be searched. + if (searchTerm.equals("%") && !hasPhoneNumber) { + options.setWhere("(" + ContactsContract.Data.CONTACT_ID + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + } + + // This clause means that there are specific ID's to be populated + Iterator it = contactIds.iterator(); + StringBuffer buffer = new StringBuffer("("); + + while (it.hasNext()) { + buffer.append("'" + it.next() + "'"); + if (it.hasNext()) { + buffer.append(","); + } + } + buffer.append(")"); + + options.setWhere(ContactsContract.Data.CONTACT_ID + " IN " + buffer.toString()); + options.setWhereArgs(null); + + return options; + } + + /** + * Create a new contact using a JSONObject to hold all the data. + * @param contact + * @param organizations array of organizations + * @param addresses array of addresses + * @param phones array of phones + * @param emails array of emails + * @param ims array of instant messenger addresses + * @param websites array of websites + * @param photos + * @return + */ + private JSONObject populateContact(JSONObject contact, JSONArray organizations, + JSONArray addresses, JSONArray phones, JSONArray emails, + JSONArray ims, JSONArray websites, JSONArray photos) { + try { + // Only return the array if it has at least one entry + if (organizations.length() > 0) { + contact.put("organizations", organizations); + } + if (addresses.length() > 0) { + contact.put("addresses", addresses); + } + if (phones.length() > 0) { + contact.put("phoneNumbers", phones); + } + if (emails.length() > 0) { + contact.put("emails", emails); + } + if (ims.length() > 0) { + contact.put("ims", ims); + } + if (websites.length() > 0) { + contact.put("urls", websites); + } + if (photos.length() > 0) { + contact.put("photos", photos); + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return contact; + } + + /** + * Take the search criteria passed into the method and create a SQL WHERE clause. + * @param fields the properties to search against + * @param searchTerm the string to search for + * @return an object containing the selection and selection args + */ + private WhereOptions buildWhereClause(JSONArray fields, String searchTerm, boolean hasPhoneNumber) { + + ArrayList where = new ArrayList(); + ArrayList whereArgs = new ArrayList(); + + WhereOptions options = new WhereOptions(); + + /* + * Special case where the user wants all fields returned + */ + if (isWildCardSearch(fields)) { + // Get all contacts with all properties + if ("%".equals(searchTerm) && !hasPhoneNumber) { + options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + } else { + // Get all contacts that match the filter but return all properties + where.add("(" + dbMap.get("displayName") + " LIKE ? )"); + whereArgs.add(searchTerm); + where.add("(" + dbMap.get("name") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("nickname") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("phoneNumbers") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("emails") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Email.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("addresses") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("ims") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Im.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("organizations") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("note") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Note.CONTENT_ITEM_TYPE); + where.add("(" + dbMap.get("urls") + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Website.CONTENT_ITEM_TYPE); + } + } + + /* + * Special case for when the user wants all the contacts but + */ + if ("%".equals(searchTerm) && !hasPhoneNumber) { + options.setWhere("(" + ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? )"); + options.setWhereArgs(new String[] { searchTerm }); + return options; + }else if(!("%".equals(searchTerm))){ + String key; + try { + //Log.d(LOG_TAG, "How many fields do we have = " + fields.length()); + for (int i = 0; i < fields.length(); i++) { + key = fields.getString(i); + + if (key.equals("id")) { + where.add("(" + dbMap.get(key) + " = ? )"); + whereArgs.add(searchTerm.substring(1, searchTerm.length() - 1)); + } + else if (key.startsWith("displayName")) { + where.add("(" + dbMap.get(key) + " LIKE ? )"); + whereArgs.add(searchTerm); + } + else if (key.startsWith("name")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("nickname")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("phoneNumbers")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("emails")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Email.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("addresses")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("ims")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Im.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("organizations")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + } + // else if (key.startsWith("birthday")) { + // where.add("(" + dbMap.get(key) + " LIKE ? AND " + // + ContactsContract.Data.MIMETYPE + " = ? )"); + // } + else if (key.startsWith("note")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Note.CONTENT_ITEM_TYPE); + } + else if (key.startsWith("urls")) { + where.add("(" + dbMap.get(key) + " LIKE ? AND " + + ContactsContract.Data.MIMETYPE + " = ? )"); + whereArgs.add(searchTerm); + whereArgs.add(CommonDataKinds.Website.CONTENT_ITEM_TYPE); + } + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + } + + // Creating the where string + StringBuffer selection = new StringBuffer(); + for (int i = 0; i < where.size(); i++) { + selection.append(where.get(i)); + if (i != (where.size() - 1)) { + selection.append(" OR "); + } + } + + //Only contacts with phone number informed + if(hasPhoneNumber){ + if(where.size()>0){ + selection.insert(0,"("); + selection.append(") AND (" + ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?)"); + whereArgs.add("1"); + }else{ + selection.append("(" + ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?)"); + whereArgs.add("1"); + } + } + + options.setWhere(selection.toString()); + + // Creating the where args array + String[] selectionArgs = new String[whereArgs.size()]; + for (int i = 0; i < whereArgs.size(); i++) { + selectionArgs[i] = whereArgs.get(i); + } + options.setWhereArgs(selectionArgs); + + return options; + } + + /** + * If the user passes in the '*' wildcard character for search then they want all fields for each contact + * + * @param fields + * @return true if wildcard search requested, false otherwise + */ + private boolean isWildCardSearch(JSONArray fields) { + // Only do a wildcard search if we are passed ["*"] + if (fields.length() == 1) { + try { + if ("*".equals(fields.getString(0))) { + return true; + } + } catch (JSONException e) { + return false; + } + } + return false; + } + + /** + * Create a ContactOrganization JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactOrganization + */ + private JSONObject organizationQuery(Cursor cursor) { + JSONObject organization = new JSONObject(); + try { + organization.put("id", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Organization._ID))); + organization.put("pref", false); // Android does not store pref attribute + organization.put("type", getOrgType(cursor.getInt(cursor.getColumnIndex(CommonDataKinds.Organization.TYPE)))); + organization.put("department", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Organization.DEPARTMENT))); + organization.put("name", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Organization.COMPANY))); + organization.put("title", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Organization.TITLE))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return organization; + } + + /** + * Create a ContactAddress JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactAddress + */ + private JSONObject addressQuery(Cursor cursor) { + JSONObject address = new JSONObject(); + try { + address.put("id", cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredPostal._ID))); + address.put("pref", false); // Android does not store pref attribute + address.put("type", getAddressType(cursor.getInt(cursor.getColumnIndex(CommonDataKinds.Organization.TYPE)))); + address.put("formatted", cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS))); + address.put("streetAddress", cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredPostal.STREET))); + address.put("locality", cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredPostal.CITY))); + address.put("region", cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredPostal.REGION))); + address.put("postalCode", cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredPostal.POSTCODE))); + address.put("country", cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredPostal.COUNTRY))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return address; + } + + /** + * Create a ContactName JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactName + */ + private JSONObject nameQuery(Cursor cursor) { + JSONObject contactName = new JSONObject(); + try { + String familyName = cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredName.FAMILY_NAME)); + String givenName = cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredName.GIVEN_NAME)); + String middleName = cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredName.MIDDLE_NAME)); + String honorificPrefix = cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredName.PREFIX)); + String honorificSuffix = cursor.getString(cursor.getColumnIndex(CommonDataKinds.StructuredName.SUFFIX)); + + // Create the formatted name + StringBuffer formatted = new StringBuffer(""); + if (!TextUtils.isEmpty(honorificPrefix)) { + formatted.append(honorificPrefix + " "); + } + if (!TextUtils.isEmpty(givenName)) { + formatted.append(givenName + " "); + } + if (!TextUtils.isEmpty(middleName)) { + formatted.append(middleName + " "); + } + if (!TextUtils.isEmpty(familyName)) { + formatted.append(familyName); + } + if (!TextUtils.isEmpty(honorificSuffix)) { + formatted.append(" " + honorificSuffix); + } + if (TextUtils.isEmpty(formatted)) { + formatted = null; + } + + contactName.put("familyName", familyName); + contactName.put("givenName", givenName); + contactName.put("middleName", middleName); + contactName.put("honorificPrefix", honorificPrefix); + contactName.put("honorificSuffix", honorificSuffix); + contactName.put("formatted", formatted); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return contactName; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject phoneQuery(Cursor cursor) { + JSONObject phoneNumber = new JSONObject(); + try { + phoneNumber.put("id", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Phone._ID))); + phoneNumber.put("pref", false); // Android does not store pref attribute + phoneNumber.put("value", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER))); + phoneNumber.put("type", getPhoneType(cursor.getInt(cursor.getColumnIndex(CommonDataKinds.Phone.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (Exception excp) { + Log.e(LOG_TAG, excp.getMessage(), excp); + } + return phoneNumber; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject emailQuery(Cursor cursor) { + JSONObject email = new JSONObject(); + try { + email.put("id", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Email._ID))); + email.put("pref", false); // Android does not store pref attribute + email.put("value", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Email.DATA))); + email.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(CommonDataKinds.Email.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return email; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject imQuery(Cursor cursor) { + JSONObject im = new JSONObject(); + try { + im.put("id", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Im._ID))); + im.put("pref", false); // Android does not store pref attribute + im.put("value", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Im.DATA))); + im.put("type", getImType(Integer.parseInt(cursor.getString(cursor.getColumnIndex(CommonDataKinds.Im.PROTOCOL))))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return im; + } + + /** + * Create a ContactField JSONObject + * @param cursor the current database row + * @return a JSONObject representing a ContactField + */ + private JSONObject websiteQuery(Cursor cursor) { + JSONObject website = new JSONObject(); + try { + website.put("id", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Website._ID))); + website.put("pref", false); // Android does not store pref attribute + website.put("value", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Website.URL))); + website.put("type", getContactType(cursor.getInt(cursor.getColumnIndex(CommonDataKinds.Website.TYPE)))); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return website; + } + + /** + * Create a ContactField JSONObject + * @param contactId + * @return a JSONObject representing a ContactField + */ + private JSONObject photoQuery(Cursor cursor, String contactId) { + JSONObject photo = new JSONObject(); + Cursor photoCursor = null; + try { + photo.put("id", cursor.getString(cursor.getColumnIndex(CommonDataKinds.Photo._ID))); + photo.put("pref", false); + photo.put("type", "url"); + Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (Long.valueOf(contactId))); + Uri photoUri = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); + photo.put("value", photoUri.toString()); + + // Query photo existance + photoCursor = mApp.getActivity().getContentResolver().query(photoUri, new String[] {ContactsContract.Contacts.Photo.PHOTO}, null, null, null); + if (photoCursor == null) return null; + if (!photoCursor.moveToFirst()) { + photoCursor.close(); + return null; + } + photoCursor.close(); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (SQLiteException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } finally { + if(photoCursor != null && !photoCursor.isClosed()) { + photoCursor.close(); + } + } + return photo; + } + + @Override + /** + * This method will save a contact object into the devices contacts database. + * + * @param contact the contact to be saved. + * @returns the id if the contact is successfully saved, null otherwise. + */ + public String save(JSONObject contact) { + AccountManager mgr = AccountManager.get(mApp.getActivity()); + Account[] accounts = mgr.getAccounts(); + String accountName = null; + String accountType = null; + + if (accounts.length == 1) { + accountName = accounts[0].name; + accountType = accounts[0].type; + } + else if (accounts.length > 1) { + for (Account a : accounts) { + if (a.type.contains("eas") && a.name.matches(EMAIL_REGEXP)) /*Exchange ActiveSync*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + if (accountName == null) { + for (Account a : accounts) { + if (a.type.contains("com.google") && a.name.matches(EMAIL_REGEXP)) /*Google sync provider*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + } + if (accountName == null) { + for (Account a : accounts) { + if (a.name.matches(EMAIL_REGEXP)) /*Last resort, just look for an email address...*/{ + accountName = a.name; + accountType = a.type; + break; + } + } + } + } + + String id = getJsonString(contact, "id"); + if (id == null) { + // Create new contact + return createNewContact(contact, accountType, accountName); + } else { + // Modify existing contact + return modifyContact(id, contact, accountType, accountName); + } + } + + /** + * Creates a new contact and stores it in the database + * + * @param id the raw contact id which is required for linking items to the contact + * @param contact the contact to be saved + * @param account the account to be saved under + */ + private String modifyContact(String id, JSONObject contact, String accountType, String accountName) { + // Get the RAW_CONTACT_ID which is needed to insert new values in an already existing contact. + // But not needed to update existing values. + String rawId = getJsonString(contact, "rawId"); + + // Create a list of attributes to add to the contact database + ArrayList ops = new ArrayList(); + + //Add contact type + ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) + .build()); + + // Modify name + JSONObject name; + try { + String displayName = getJsonString(contact, "displayName"); + name = contact.getJSONObject("name"); + if (displayName != null || name != null) { + ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE }); + + if (displayName != null) { + builder.withValue(CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); + } + + String familyName = getJsonString(name, "familyName"); + if (familyName != null) { + builder.withValue(CommonDataKinds.StructuredName.FAMILY_NAME, familyName); + } + String middleName = getJsonString(name, "middleName"); + if (middleName != null) { + builder.withValue(CommonDataKinds.StructuredName.MIDDLE_NAME, middleName); + } + String givenName = getJsonString(name, "givenName"); + if (givenName != null) { + builder.withValue(CommonDataKinds.StructuredName.GIVEN_NAME, givenName); + } + String honorificPrefix = getJsonString(name, "honorificPrefix"); + if (honorificPrefix != null) { + builder.withValue(CommonDataKinds.StructuredName.PREFIX, honorificPrefix); + } + String honorificSuffix = getJsonString(name, "honorificSuffix"); + if (honorificSuffix != null) { + builder.withValue(CommonDataKinds.StructuredName.SUFFIX, honorificSuffix); + } + + ops.add(builder.build()); + } + } catch (JSONException e1) { + Log.d(LOG_TAG, "Could not get name"); + } + + // Modify phone numbers + JSONArray phones = null; + try { + phones = contact.getJSONArray("phoneNumbers"); + if (phones != null) { + // Delete all the phones + if (phones.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a phone + else { + for (int i = 0; i < phones.length(); i++) { + JSONObject phone = (JSONObject) phones.get(i); + String phoneId = getJsonString(phone, "id"); + // This is a new phone so do a DB insert + if (phoneId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + contentValues.put(CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")); + contentValues.put(CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing phone so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(CommonDataKinds.Phone._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { phoneId, CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) + .withValue(CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) + .withValue(CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get phone numbers"); + } + + // Modify emails + JSONArray emails = null; + try { + emails = contact.getJSONArray("emails"); + if (emails != null) { + // Delete all the emails + if (emails.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a email + else { + for (int i = 0; i < emails.length(); i++) { + JSONObject email = (JSONObject) emails.get(i); + String emailId = getJsonString(email, "id"); + // This is a new email so do a DB insert + if (emailId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE); + contentValues.put(CommonDataKinds.Email.DATA, getJsonString(email, "value")); + contentValues.put(CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing email so do a DB update + else { + String emailValue=getJsonString(email, "value"); + if(!emailValue.isEmpty()) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(CommonDataKinds.Email._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { emailId, CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .withValue(CommonDataKinds.Email.DATA, getJsonString(email, "value")) + .withValue(CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) + .build()); + } else { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(CommonDataKinds.Email._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { emailId, CommonDataKinds.Email.CONTENT_ITEM_TYPE }) + .build()); + } + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Modify addresses + JSONArray addresses = null; + try { + addresses = contact.getJSONArray("addresses"); + if (addresses != null) { + // Delete all the addresses + if (addresses.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a address + else { + for (int i = 0; i < addresses.length(); i++) { + JSONObject address = (JSONObject) addresses.get(i); + String addressId = getJsonString(address, "id"); + // This is a new address so do a DB insert + if (addressId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); + contentValues.put(CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))); + contentValues.put(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")); + contentValues.put(CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")); + contentValues.put(CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")); + contentValues.put(CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")); + contentValues.put(CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")); + contentValues.put(CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing address so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(CommonDataKinds.StructuredPostal._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { addressId, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }) + .withValue(CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) + .withValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) + .withValue(CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) + .withValue(CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) + .withValue(CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) + .withValue(CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) + .withValue(CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get addresses"); + } + + // Modify organizations + JSONArray organizations = null; + try { + organizations = contact.getJSONArray("organizations"); + if (organizations != null) { + // Delete all the organizations + if (organizations.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a organization + else { + for (int i = 0; i < organizations.length(); i++) { + JSONObject org = (JSONObject) organizations.get(i); + String orgId = getJsonString(org, "id"); + // This is a new organization so do a DB insert + if (orgId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE); + contentValues.put(CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))); + contentValues.put(CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")); + contentValues.put(CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")); + contentValues.put(CommonDataKinds.Organization.TITLE, getJsonString(org, "title")); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing organization so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(CommonDataKinds.Organization._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { orgId, CommonDataKinds.Organization.CONTENT_ITEM_TYPE }) + .withValue(CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) + .withValue(CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) + .withValue(CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) + .withValue(CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get organizations"); + } + + // Modify IMs + JSONArray ims = null; + try { + ims = contact.getJSONArray("ims"); + if (ims != null) { + // Delete all the ims + if (ims.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, CommonDataKinds.Im.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a im + else { + for (int i = 0; i < ims.length(); i++) { + JSONObject im = (JSONObject) ims.get(i); + String imId = getJsonString(im, "id"); + // This is a new IM so do a DB insert + if (imId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Im.CONTENT_ITEM_TYPE); + contentValues.put(CommonDataKinds.Im.DATA, getJsonString(im, "value")); + contentValues.put(CommonDataKinds.Im.TYPE, getImType(getJsonString(im, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing IM so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(CommonDataKinds.Im._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { imId, CommonDataKinds.Im.CONTENT_ITEM_TYPE }) + .withValue(CommonDataKinds.Im.DATA, getJsonString(im, "value")) + .withValue(CommonDataKinds.Im.TYPE, getContactType(getJsonString(im, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Modify note + String note = getJsonString(contact, "note"); + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, CommonDataKinds.Note.CONTENT_ITEM_TYPE }) + .withValue(CommonDataKinds.Note.NOTE, note) + .build()); + + // Modify nickname + String nickname = getJsonString(contact, "nickname"); + if (nickname != null) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { id, CommonDataKinds.Nickname.CONTENT_ITEM_TYPE }) + .withValue(CommonDataKinds.Nickname.NAME, nickname) + .build()); + } + + // Modify urls + JSONArray websites = null; + try { + websites = contact.getJSONArray("urls"); + if (websites != null) { + // Delete all the websites + if (websites.length() == 0) { + Log.d(LOG_TAG, "This means we should be deleting all the phone numbers."); + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, CommonDataKinds.Website.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a website + else { + for (int i = 0; i < websites.length(); i++) { + JSONObject website = (JSONObject) websites.get(i); + String websiteId = getJsonString(website, "id"); + // This is a new website so do a DB insert + if (websiteId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Website.CONTENT_ITEM_TYPE); + contentValues.put(CommonDataKinds.Website.DATA, getJsonString(website, "value")); + contentValues.put(CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing website so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(CommonDataKinds.Website._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { websiteId, CommonDataKinds.Website.CONTENT_ITEM_TYPE }) + .withValue(CommonDataKinds.Website.DATA, getJsonString(website, "value")) + .withValue(CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get websites"); + } + + // Modify birthday + Date birthday = getBirthday(contact); + if (birthday != null) { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=? AND " + + CommonDataKinds.Event.TYPE + "=?", + new String[]{id, CommonDataKinds.Event.CONTENT_ITEM_TYPE, "" + CommonDataKinds.Event.TYPE_BIRTHDAY}) + .withValue(CommonDataKinds.Event.TYPE, CommonDataKinds.Event.TYPE_BIRTHDAY) + .withValue(CommonDataKinds.Event.START_DATE, birthday.toString()) + .build()); + } + + // Modify photos + JSONArray photos = null; + try { + photos = contact.getJSONArray("photos"); + if (photos != null) { + // Delete all the photos + if (photos.length() == 0) { + ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) + .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { "" + rawId, CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) + .build()); + } + // Modify or add a photo + else { + for (int i = 0; i < photos.length(); i++) { + JSONObject photo = (JSONObject) photos.get(i); + String photoId = getJsonString(photo, "id"); + byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); + // This is a new photo so do a DB insert + if (photoId == null) { + ContentValues contentValues = new ContentValues(); + contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawId); + contentValues.put(ContactsContract.Data.MIMETYPE, CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + contentValues.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); + contentValues.put(CommonDataKinds.Photo.PHOTO, bytes); + + ops.add(ContentProviderOperation.newInsert( + ContactsContract.Data.CONTENT_URI).withValues(contentValues).build()); + } + // This is an existing photo so do a DB update + else { + ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection(CommonDataKinds.Photo._ID + "=? AND " + + ContactsContract.Data.MIMETYPE + "=?", + new String[] { photoId, CommonDataKinds.Photo.CONTENT_ITEM_TYPE }) + .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) + .withValue(CommonDataKinds.Photo.PHOTO, bytes) + .build()); + } + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get photos"); + } + + boolean retVal = true; + + //Modify contact + try { + mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); + } catch (RemoteException e) { + Log.e(LOG_TAG, e.getMessage(), e); + Log.e(LOG_TAG, Log.getStackTraceString(e), e); + retVal = false; + } catch (OperationApplicationException e) { + Log.e(LOG_TAG, e.getMessage(), e); + Log.e(LOG_TAG, Log.getStackTraceString(e), e); + retVal = false; + } + + // if the save was a success return the contact ID + if (retVal) { + return rawId; + } else { + return null; + } + } + + /** + * Add a website to a list of database actions to be performed + * + * @param ops the list of database actions + * @param website the item to be inserted + */ + private void insertWebsite(ArrayList ops, + JSONObject website) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Website.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Website.DATA, getJsonString(website, "value")) + .withValue(CommonDataKinds.Website.TYPE, getContactType(getJsonString(website, "type"))) + .build()); + } + + /** + * Add an im to a list of database actions to be performed + * + * @param ops the list of database actions + * @param im the item to be inserted + */ + private void insertIm(ArrayList ops, JSONObject im) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Im.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Im.DATA, getJsonString(im, "value")) + .withValue(CommonDataKinds.Im.PROTOCOL, getImType(getJsonString(im, "type"))) + .build()); + } + + /** + * Add an organization to a list of database actions to be performed + * + * @param ops the list of database actions + * @param org the item to be inserted + */ + private void insertOrganization(ArrayList ops, + JSONObject org) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Organization.TYPE, getOrgType(getJsonString(org, "type"))) + .withValue(CommonDataKinds.Organization.DEPARTMENT, getJsonString(org, "department")) + .withValue(CommonDataKinds.Organization.COMPANY, getJsonString(org, "name")) + .withValue(CommonDataKinds.Organization.TITLE, getJsonString(org, "title")) + .build()); + } + + /** + * Add an address to a list of database actions to be performed + * + * @param ops the list of database actions + * @param address the item to be inserted + */ + private void insertAddress(ArrayList ops, + JSONObject address) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.StructuredPostal.TYPE, getAddressType(getJsonString(address, "type"))) + .withValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, getJsonString(address, "formatted")) + .withValue(CommonDataKinds.StructuredPostal.STREET, getJsonString(address, "streetAddress")) + .withValue(CommonDataKinds.StructuredPostal.CITY, getJsonString(address, "locality")) + .withValue(CommonDataKinds.StructuredPostal.REGION, getJsonString(address, "region")) + .withValue(CommonDataKinds.StructuredPostal.POSTCODE, getJsonString(address, "postalCode")) + .withValue(CommonDataKinds.StructuredPostal.COUNTRY, getJsonString(address, "country")) + .build()); + } + + /** + * Add an email to a list of database actions to be performed + * + * @param ops the list of database actions + * @param email the item to be inserted + */ + private void insertEmail(ArrayList ops, + JSONObject email) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Email.DATA, getJsonString(email, "value")) + .withValue(CommonDataKinds.Email.TYPE, getContactType(getJsonString(email, "type"))) + .build()); + } + + /** + * Add a phone to a list of database actions to be performed + * + * @param ops the list of database actions + * @param phone the item to be inserted + */ + private void insertPhone(ArrayList ops, + JSONObject phone) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Phone.NUMBER, getJsonString(phone, "value")) + .withValue(CommonDataKinds.Phone.TYPE, getPhoneType(getJsonString(phone, "type"))) + .build()); + } + + /** + * Add a phone to a list of database actions to be performed + * + * @param ops the list of database actions + * @param phone the item to be inserted + */ + private void insertPhoto(ArrayList ops, + JSONObject photo) { + byte[] bytes = getPhotoBytes(getJsonString(photo, "value")); + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.IS_SUPER_PRIMARY, 1) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Photo.PHOTO, bytes) + .build()); + } + + /** + * Gets the raw bytes from the supplied filename + * + * @param filename the file to read the bytes from + * @return a byte array + * @throws IOException + */ + private byte[] getPhotoBytes(String filename) { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + try { + int bytesRead = 0; + long totalBytesRead = 0; + byte[] data = new byte[8192]; + InputStream in = getPathFromUri(filename); + + while ((bytesRead = in.read(data, 0, data.length)) != -1 && totalBytesRead <= MAX_PHOTO_SIZE) { + buffer.write(data, 0, bytesRead); + totalBytesRead += bytesRead; + } + + in.close(); + buffer.flush(); + } catch (FileNotFoundException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (IOException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return buffer.toByteArray(); + } + + /** + * Get an input stream based on file path or uri content://, http://, file:// + * + * @param path path to file + * @return an input stream + * @throws IOException + */ + private InputStream getPathFromUri(String path) throws IOException { + if (path.startsWith("content:")) { + Uri uri = Uri.parse(path); + return mApp.getActivity().getContentResolver().openInputStream(uri); + } + + if (path.startsWith(ASSET_URL_PREFIX)) { + String assetRelativePath = path.replace(ASSET_URL_PREFIX, ""); + return mApp.getActivity().getAssets().open(assetRelativePath); + } + + if (path.startsWith("http:") || path.startsWith("https:") || path.startsWith("file:")) { + URL url = new URL(path); + return url.openStream(); + } + + return new FileInputStream(path); + } + + /** + * Creates a new contact and stores it in the database + * + * @param contact the contact to be saved + * @param account the account to be saved under + */ + private String createNewContact(JSONObject contact, String accountType, String accountName) { + // Create a list of attributes to add to the contact database + ArrayList ops = new ArrayList(); + + //Add contact type + ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) + .build()); + + // Add name + JSONObject name = contact.optJSONObject("name"); + String displayName = getJsonString(contact, "displayName"); + if (displayName != null || name != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.StructuredName.DISPLAY_NAME, displayName) + .withValue(CommonDataKinds.StructuredName.FAMILY_NAME, getJsonString(name, "familyName")) + .withValue(CommonDataKinds.StructuredName.MIDDLE_NAME, getJsonString(name, "middleName")) + .withValue(CommonDataKinds.StructuredName.GIVEN_NAME, getJsonString(name, "givenName")) + .withValue(CommonDataKinds.StructuredName.PREFIX, getJsonString(name, "honorificPrefix")) + .withValue(CommonDataKinds.StructuredName.SUFFIX, getJsonString(name, "honorificSuffix")) + .build()); + } else { + Log.d(LOG_TAG, "Both \"name\" and \"displayName\" properties are empty"); + } + + //Add phone numbers + JSONArray phones = null; + try { + phones = contact.getJSONArray("phoneNumbers"); + if (phones != null) { + for (int i = 0; i < phones.length(); i++) { + if(!phones.isNull(i)){ + JSONObject phone = (JSONObject) phones.get(i); + insertPhone(ops, phone); + } + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get phone numbers"); + } + + // Add emails + JSONArray emails = null; + try { + emails = contact.getJSONArray("emails"); + if (emails != null) { + for (int i = 0; i < emails.length(); i++) { + JSONObject email = (JSONObject) emails.get(i); + insertEmail(ops, email); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Add addresses + JSONArray addresses = null; + try { + addresses = contact.getJSONArray("addresses"); + if (addresses != null) { + for (int i = 0; i < addresses.length(); i++) { + JSONObject address = (JSONObject) addresses.get(i); + insertAddress(ops, address); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get addresses"); + } + + // Add organizations + JSONArray organizations = null; + try { + organizations = contact.getJSONArray("organizations"); + if (organizations != null) { + for (int i = 0; i < organizations.length(); i++) { + JSONObject org = (JSONObject) organizations.get(i); + insertOrganization(ops, org); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get organizations"); + } + + // Add IMs + JSONArray ims = null; + try { + ims = contact.getJSONArray("ims"); + if (ims != null) { + for (int i = 0; i < ims.length(); i++) { + JSONObject im = (JSONObject) ims.get(i); + insertIm(ops, im); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get emails"); + } + + // Add note + String note = getJsonString(contact, "note"); + if (note != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Note.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Note.NOTE, note) + .build()); + } + + // Add nickname + String nickname = getJsonString(contact, "nickname"); + if (nickname != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Nickname.NAME, nickname) + .build()); + } + + // Add urls + JSONArray websites = null; + try { + websites = contact.getJSONArray("urls"); + if (websites != null) { + for (int i = 0; i < websites.length(); i++) { + JSONObject website = (JSONObject) websites.get(i); + insertWebsite(ops, website); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get websites"); + } + + // Add birthday + Date birthday = getBirthday(contact); + if (birthday != null) { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Event.CONTENT_ITEM_TYPE) + .withValue(CommonDataKinds.Event.TYPE, CommonDataKinds.Event.TYPE_BIRTHDAY) + .withValue(CommonDataKinds.Event.START_DATE, birthday.toString()) + .build()); + } + + // Add photos + JSONArray photos = null; + try { + photos = contact.getJSONArray("photos"); + if (photos != null) { + for (int i = 0; i < photos.length(); i++) { + JSONObject photo = (JSONObject) photos.get(i); + insertPhoto(ops, photo); + } + } + } catch (JSONException e) { + Log.d(LOG_TAG, "Could not get photos"); + } + + String newId = null; + //Add contact + try { + ContentProviderResult[] cpResults = mApp.getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); + if (cpResults.length >= 0) { + newId = cpResults[0].uri.getLastPathSegment(); + } + } catch (RemoteException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } catch (OperationApplicationException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return newId; + } + + @Override + /** + * This method will remove a Contact from the database based on ID. + * @param id the unique ID of the contact to remove + */ + public boolean remove(String id) { + int result = 0; + Cursor cursor = mApp.getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, + null, + ContactsContract.Contacts._ID + " = ?", + new String[] { id }, null); + + if (cursor.getCount() == 1) { + cursor.moveToFirst(); + String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); + Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); + result = mApp.getActivity().getContentResolver().delete(uri, null, null); + } else { + Log.d(LOG_TAG, "Could not find contact with ID"); + } + + return (result > 0) ? true : false; + } + + /** + * Gets birthday date from contact JSON object + * @param contact an object to get birthday from + * @return birthday or null, if the field isn't present or + * is malformed in the contact + */ + private Date getBirthday(JSONObject contact) { + try { + Long timestamp = contact.getLong("birthday"); + return new Date(timestamp); + } catch (JSONException e) { + Log.e(LOG_TAG, "Could not get birthday from JSON object", e); + return null; + } + } + + /** + * Gets birthday from contacts database cursor object + * @param c cursor for the contact + * @return birthday or null, if birthday column is empty or + * the value can't be parsed into valid date object + */ + private Date getBirthday(Cursor c) { + int colBirthday = c.getColumnIndex(CommonDataKinds.Event.START_DATE); + + try { + return Date.valueOf(c.getString(colBirthday)); + } catch (IllegalArgumentException e) { + Log.e(LOG_TAG, "Failed to get birthday for contact from cursor", e); + return null; + } + } + + /************************************************************************** + * + * All methods below this comment are used to convert from JavaScript + * text types to Android integer types and vice versa. + * + *************************************************************************/ + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getPhoneType(String string) { + + int type = Phone.TYPE_OTHER; + + if (string != null) { + String lowerType = string.toLowerCase(Locale.getDefault()); + + if ("home".equals(lowerType)) { + return Phone.TYPE_HOME; + } + else if ("mobile".equals(lowerType)) { + return Phone.TYPE_MOBILE; + } + else if ("work".equals(lowerType)) { + return Phone.TYPE_WORK; + } + else if ("work fax".equals(lowerType)) { + return Phone.TYPE_FAX_WORK; + } + else if ("home fax".equals(lowerType)) { + return Phone.TYPE_FAX_HOME; + } + else if ("fax".equals(lowerType)) { + return Phone.TYPE_FAX_WORK; + } + else if ("pager".equals(lowerType)) { + return Phone.TYPE_PAGER; + } + else if ("other".equals(lowerType)) { + return Phone.TYPE_OTHER; + } + else if ("car".equals(lowerType)) { + return Phone.TYPE_CAR; + } + else if ("company main".equals(lowerType)) { + return Phone.TYPE_COMPANY_MAIN; + } + else if ("isdn".equals(lowerType)) { + return Phone.TYPE_ISDN; + } + else if ("main".equals(lowerType)) { + return Phone.TYPE_MAIN; + } + else if ("other fax".equals(lowerType)) { + return Phone.TYPE_OTHER_FAX; + } + else if ("radio".equals(lowerType)) { + return Phone.TYPE_RADIO; + } + else if ("telex".equals(lowerType)) { + return Phone.TYPE_TELEX; + } + else if ("work mobile".equals(lowerType)) { + return Phone.TYPE_WORK_MOBILE; + } + else if ("work pager".equals(lowerType)) { + return Phone.TYPE_WORK_PAGER; + } + else if ("assistant".equals(lowerType)) { + return Phone.TYPE_ASSISTANT; + } + else if ("mms".equals(lowerType)) { + return Phone.TYPE_MMS; + } + else if ("callback".equals(lowerType)) { + return Phone.TYPE_CALLBACK; + } + else if ("tty ttd".equals(lowerType)) { + return Phone.TYPE_TTY_TDD; + } + else if ("custom".equals(lowerType)) { + return Phone.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getPhoneType(int type) { + String stringType; + + switch (type) { + case Phone.TYPE_CUSTOM: + stringType = "custom"; + break; + case Phone.TYPE_FAX_HOME: + stringType = "home fax"; + break; + case Phone.TYPE_FAX_WORK: + stringType = "work fax"; + break; + case Phone.TYPE_HOME: + stringType = "home"; + break; + case Phone.TYPE_MOBILE: + stringType = "mobile"; + break; + case Phone.TYPE_PAGER: + stringType = "pager"; + break; + case Phone.TYPE_WORK: + stringType = "work"; + break; + case Phone.TYPE_CALLBACK: + stringType = "callback"; + break; + case Phone.TYPE_CAR: + stringType = "car"; + break; + case Phone.TYPE_COMPANY_MAIN: + stringType = "company main"; + break; + case Phone.TYPE_OTHER_FAX: + stringType = "other fax"; + break; + case Phone.TYPE_RADIO: + stringType = "radio"; + break; + case Phone.TYPE_TELEX: + stringType = "telex"; + break; + case Phone.TYPE_TTY_TDD: + stringType = "tty tdd"; + break; + case Phone.TYPE_WORK_MOBILE: + stringType = "work mobile"; + break; + case Phone.TYPE_WORK_PAGER: + stringType = "work pager"; + break; + case Phone.TYPE_ASSISTANT: + stringType = "assistant"; + break; + case Phone.TYPE_MMS: + stringType = "mms"; + break; + case Phone.TYPE_ISDN: + stringType = "isdn"; + break; + case Phone.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getContactType(String string) { + int type = CommonDataKinds.Email.TYPE_OTHER; + if (string != null) { + + String lowerType = string.toLowerCase(Locale.getDefault()); + + if ("home".equals(lowerType)) { + return CommonDataKinds.Email.TYPE_HOME; + } + else if ("work".equals(lowerType)) { + return CommonDataKinds.Email.TYPE_WORK; + } + else if ("other".equals(lowerType)) { + return CommonDataKinds.Email.TYPE_OTHER; + } + else if ("mobile".equals(lowerType)) { + return CommonDataKinds.Email.TYPE_MOBILE; + } + else if ("custom".equals(lowerType)) { + return CommonDataKinds.Email.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getContactType(int type) { + String stringType; + switch (type) { + case CommonDataKinds.Email.TYPE_CUSTOM: + stringType = "custom"; + break; + case CommonDataKinds.Email.TYPE_HOME: + stringType = "home"; + break; + case CommonDataKinds.Email.TYPE_WORK: + stringType = "work"; + break; + case CommonDataKinds.Email.TYPE_MOBILE: + stringType = "mobile"; + break; + case CommonDataKinds.Email.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getOrgType(String string) { + int type = CommonDataKinds.Organization.TYPE_OTHER; + if (string != null) { + String lowerType = string.toLowerCase(Locale.getDefault()); + if ("work".equals(lowerType)) { + return CommonDataKinds.Organization.TYPE_WORK; + } + else if ("other".equals(lowerType)) { + return CommonDataKinds.Organization.TYPE_OTHER; + } + else if ("custom".equals(lowerType)) { + return CommonDataKinds.Organization.TYPE_CUSTOM; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getOrgType(int type) { + String stringType; + switch (type) { + case CommonDataKinds.Organization.TYPE_CUSTOM: + stringType = "custom"; + break; + case CommonDataKinds.Organization.TYPE_WORK: + stringType = "work"; + break; + case CommonDataKinds.Organization.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getAddressType(String string) { + int type = CommonDataKinds.StructuredPostal.TYPE_OTHER; + if (string != null) { + String lowerType = string.toLowerCase(Locale.getDefault()); + + if ("work".equals(lowerType)) { + return CommonDataKinds.StructuredPostal.TYPE_WORK; + } + else if ("other".equals(lowerType)) { + return CommonDataKinds.StructuredPostal.TYPE_OTHER; + } + else if ("home".equals(lowerType)) { + return CommonDataKinds.StructuredPostal.TYPE_HOME; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + private String getAddressType(int type) { + String stringType; + switch (type) { + case CommonDataKinds.StructuredPostal.TYPE_HOME: + stringType = "home"; + break; + case CommonDataKinds.StructuredPostal.TYPE_WORK: + stringType = "work"; + break; + case CommonDataKinds.StructuredPostal.TYPE_OTHER: + default: + stringType = "other"; + break; + } + return stringType; + } + + /** + * Converts a string from the W3C Contact API to it's Android int value. + * @param string + * @return Android int value + */ + private int getImType(String string) { + int type = CommonDataKinds.Im.PROTOCOL_CUSTOM; + if (string != null) { + String lowerType = string.toLowerCase(Locale.getDefault()); + + if ("aim".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_AIM; + } + else if ("google talk".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK; + } + else if ("icq".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_ICQ; + } + else if ("jabber".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_JABBER; + } + else if ("msn".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_MSN; + } + else if ("netmeeting".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_NETMEETING; + } + else if ("qq".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_QQ; + } + else if ("skype".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_SKYPE; + } + else if ("yahoo".equals(lowerType)) { + return CommonDataKinds.Im.PROTOCOL_YAHOO; + } + } + return type; + } + + /** + * getPhoneType converts an Android phone type into a string + * @param type + * @return phone type as string. + */ + @SuppressWarnings("unused") + private String getImType(int type) { + String stringType; + switch (type) { + case CommonDataKinds.Im.PROTOCOL_AIM: + stringType = "AIM"; + break; + case CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK: + stringType = "Google Talk"; + break; + case CommonDataKinds.Im.PROTOCOL_ICQ: + stringType = "ICQ"; + break; + case CommonDataKinds.Im.PROTOCOL_JABBER: + stringType = "Jabber"; + break; + case CommonDataKinds.Im.PROTOCOL_MSN: + stringType = "MSN"; + break; + case CommonDataKinds.Im.PROTOCOL_NETMEETING: + stringType = "NetMeeting"; + break; + case CommonDataKinds.Im.PROTOCOL_QQ: + stringType = "QQ"; + break; + case CommonDataKinds.Im.PROTOCOL_SKYPE: + stringType = "Skype"; + break; + case CommonDataKinds.Im.PROTOCOL_YAHOO: + stringType = "Yahoo"; + break; + default: + stringType = "custom"; + break; + } + return stringType; + } + +} diff --git a/platforms/android/src/org/apache/cordova/contacts/ContactInfoDTO.java b/platforms/android/src/org/apache/cordova/contacts/ContactInfoDTO.java new file mode 100644 index 0000000..a61b6e7 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/contacts/ContactInfoDTO.java @@ -0,0 +1,59 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.contacts; + +import java.util.HashMap; + +import org.json.JSONArray; +import org.json.JSONObject; + +public class ContactInfoDTO { + + String displayName; + JSONObject name; + JSONArray organizations; + JSONArray addresses; + JSONArray phones; + JSONArray emails; + JSONArray ims; + JSONArray websites; + JSONArray photos; + String note; + String nickname; + String birthday; + HashMap desiredFieldsWithVals; + + public ContactInfoDTO() { + + displayName = ""; + name = new JSONObject(); + organizations = new JSONArray(); + addresses = new JSONArray(); + phones = new JSONArray(); + emails = new JSONArray(); + ims = new JSONArray(); + websites = new JSONArray(); + photos = new JSONArray(); + note = ""; + nickname = ""; + desiredFieldsWithVals = new HashMap(); + } + +} diff --git a/platforms/android/src/org/apache/cordova/contacts/ContactManager.java b/platforms/android/src/org/apache/cordova/contacts/ContactManager.java new file mode 100644 index 0000000..268b8ea --- /dev/null +++ b/platforms/android/src/org/apache/cordova/contacts/ContactManager.java @@ -0,0 +1,307 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.contacts; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaActivity; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PermissionHelper; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.os.Build; +import android.os.Bundle; +import android.provider.ContactsContract.Contacts; +import android.provider.ContactsContract.RawContacts; +import android.util.Log; + +import java.lang.reflect.Method; + +public class ContactManager extends CordovaPlugin { + + private ContactAccessor contactAccessor; + private CallbackContext callbackContext; // The callback context from which we were invoked. + private JSONArray executeArgs; + + private static final String LOG_TAG = "Contact Query"; + + public static final int UNKNOWN_ERROR = 0; + public static final int INVALID_ARGUMENT_ERROR = 1; + public static final int TIMEOUT_ERROR = 2; + public static final int PENDING_OPERATION_ERROR = 3; + public static final int IO_ERROR = 4; + public static final int NOT_SUPPORTED_ERROR = 5; + public static final int OPERATION_CANCELLED_ERROR = 6; + public static final int PERMISSION_DENIED_ERROR = 20; + private static final int CONTACT_PICKER_RESULT = 1000; + public static String [] permissions; + + + //Request code for the permissions picker (Pick is async and uses intents) + public static final int SEARCH_REQ_CODE = 0; + public static final int SAVE_REQ_CODE = 1; + public static final int REMOVE_REQ_CODE = 2; + public static final int PICK_REQ_CODE = 3; + + public static final String READ = Manifest.permission.READ_CONTACTS; + public static final String WRITE = Manifest.permission.WRITE_CONTACTS; + + + /** + * Constructor. + */ + public ContactManager() { + + } + + + protected void getReadPermission(int requestCode) + { + PermissionHelper.requestPermission(this, requestCode, READ); + } + + + protected void getWritePermission(int requestCode) + { + PermissionHelper.requestPermission(this, requestCode, WRITE); + } + + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArray of arguments for the plugin. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return True if the action was valid, false otherwise. + */ + public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { + + this.callbackContext = callbackContext; + this.executeArgs = args; + + /** + * Check to see if we are on an Android 1.X device. If we are return an error as we + * do not support this as of Cordova 1.0. + */ + if (android.os.Build.VERSION.RELEASE.startsWith("1.")) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, ContactManager.NOT_SUPPORTED_ERROR)); + return true; + } + + /** + * Only create the contactAccessor after we check the Android version or the program will crash + * older phones. + */ + if (this.contactAccessor == null) { + this.contactAccessor = new ContactAccessorSdk5(this.cordova); + } + + if (action.equals("search")) { + if(PermissionHelper.hasPermission(this, READ)) { + search(executeArgs); + } + else + { + getReadPermission(SEARCH_REQ_CODE); + } + } + else if (action.equals("save")) { + if(PermissionHelper.hasPermission(this, WRITE)) + { + save(executeArgs); + } + else + { + getWritePermission(SAVE_REQ_CODE); + } + } + else if (action.equals("remove")) { + if(PermissionHelper.hasPermission(this, WRITE)) + { + remove(executeArgs); + } + else + { + getWritePermission(REMOVE_REQ_CODE); + } + } + else if (action.equals("pickContact")) { + if(PermissionHelper.hasPermission(this, READ)) + { + pickContactAsync(); + } + else + { + getReadPermission(PICK_REQ_CODE); + } + } + else { + return false; + } + return true; + } + + private void remove(JSONArray args) throws JSONException { + final String contactId = args.getString(0); + this.cordova.getThreadPool().execute(new Runnable() { + public void run() { + if (contactAccessor.remove(contactId)) { + callbackContext.success(); + } else { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); + } + } + }); + } + + private void save(JSONArray args) throws JSONException { + final JSONObject contact = args.getJSONObject(0); + this.cordova.getThreadPool().execute(new Runnable(){ + public void run() { + JSONObject res = null; + String id = contactAccessor.save(contact); + if (id != null) { + try { + res = contactAccessor.getContactById(id); + } catch (JSONException e) { + Log.e(LOG_TAG, "JSON fail.", e); + } + } + if (res != null) { + callbackContext.success(res); + } else { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); + } + } + }); + } + + private void search(JSONArray args) throws JSONException + { + final JSONArray filter = args.getJSONArray(0); + final JSONObject options = args.get(1) == null ? null : args.getJSONObject(1); + this.cordova.getThreadPool().execute(new Runnable() { + public void run() { + JSONArray res = contactAccessor.search(filter, options); + callbackContext.success(res); + } + }); + } + + + /** + * Launches the Contact Picker to select a single contact. + */ + private void pickContactAsync() { + final CordovaPlugin plugin = (CordovaPlugin) this; + Runnable worker = new Runnable() { + public void run() { + Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); + plugin.cordova.startActivityForResult(plugin, contactPickerIntent, CONTACT_PICKER_RESULT); + } + }; + this.cordova.getThreadPool().execute(worker); + } + + /** + * Called when user picks contact. + * @param requestCode The request code originally supplied to startActivityForResult(), + * allowing you to identify who this result came from. + * @param resultCode The integer result code returned by the child activity through its setResult(). + * @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras"). + * @throws JSONException + */ + public void onActivityResult(int requestCode, int resultCode, final Intent intent) { + if (requestCode == CONTACT_PICKER_RESULT) { + if (resultCode == Activity.RESULT_OK) { + String contactId = intent.getData().getLastPathSegment(); + // to populate contact data we require Raw Contact ID + // so we do look up for contact raw id first + Cursor c = this.cordova.getActivity().getContentResolver().query(RawContacts.CONTENT_URI, + new String[] {RawContacts._ID}, RawContacts.CONTACT_ID + " = " + contactId, null, null); + if (!c.moveToFirst()) { + this.callbackContext.error("Error occured while retrieving contact raw id"); + return; + } + String id = c.getString(c.getColumnIndex(RawContacts._ID)); + c.close(); + + try { + JSONObject contact = contactAccessor.getContactById(id); + this.callbackContext.success(contact); + return; + } catch (JSONException e) { + Log.e(LOG_TAG, "JSON fail.", e); + } + } else if (resultCode == Activity.RESULT_CANCELED) { + callbackContext.error(OPERATION_CANCELLED_ERROR); + return; + } + + this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR)); + } + } + + public void onRequestPermissionResult(int requestCode, String[] permissions, + int[] grantResults) throws JSONException + { + for(int r:grantResults) + { + if(r == PackageManager.PERMISSION_DENIED) + { + this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, PERMISSION_DENIED_ERROR)); + return; + } + } + switch(requestCode) + { + case SEARCH_REQ_CODE: + search(executeArgs); + break; + case SAVE_REQ_CODE: + save(executeArgs); + break; + case REMOVE_REQ_CODE: + remove(executeArgs); + break; + case PICK_REQ_CODE: + pickContactAsync(); + break; + } + } + + /** + * This plugin launches an external Activity when a contact is picked, so we + * need to implement the save/restore API in case the Activity gets killed + * by the OS while it's in the background. We don't actually save anything + * because picking a contact doesn't take in any arguments. + */ + public void onRestoreStateForActivityResult(Bundle state, CallbackContext callbackContext) { + this.callbackContext = callbackContext; + this.contactAccessor = new ContactAccessorSdk5(this.cordova); + } +} diff --git a/platforms/android/src/org/apache/cordova/device/Device.java b/platforms/android/src/org/apache/cordova/device/Device.java new file mode 100644 index 0000000..e9efcb4 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/device/Device.java @@ -0,0 +1,174 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.device; + +import java.util.TimeZone; + +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaInterface; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.provider.Settings; + +public class Device extends CordovaPlugin { + public static final String TAG = "Device"; + + public static String platform; // Device OS + public static String uuid; // Device UUID + + private static final String ANDROID_PLATFORM = "Android"; + private static final String AMAZON_PLATFORM = "amazon-fireos"; + private static final String AMAZON_DEVICE = "Amazon"; + + /** + * Constructor. + */ + public Device() { + } + + /** + * Sets the context of the Command. This can then be used to do things like + * get file paths associated with the Activity. + * + * @param cordova The context of the main Activity. + * @param webView The CordovaWebView Cordova is running in. + */ + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + super.initialize(cordova, webView); + Device.uuid = getUuid(); + } + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArry of arguments for the plugin. + * @param callbackContext The callback id used when calling back into JavaScript. + * @return True if the action was valid, false if not. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + if ("getDeviceInfo".equals(action)) { + JSONObject r = new JSONObject(); + r.put("uuid", Device.uuid); + r.put("version", this.getOSVersion()); + r.put("platform", this.getPlatform()); + r.put("model", this.getModel()); + r.put("manufacturer", this.getManufacturer()); + r.put("isVirtual", this.isVirtual()); + r.put("serial", this.getSerialNumber()); + callbackContext.success(r); + } + else { + return false; + } + return true; + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + + /** + * Get the OS name. + * + * @return + */ + public String getPlatform() { + String platform; + if (isAmazonDevice()) { + platform = AMAZON_PLATFORM; + } else { + platform = ANDROID_PLATFORM; + } + return platform; + } + + /** + * Get the device's Universally Unique Identifier (UUID). + * + * @return + */ + public String getUuid() { + String uuid = Settings.Secure.getString(this.cordova.getActivity().getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); + return uuid; + } + + public String getModel() { + String model = android.os.Build.MODEL; + return model; + } + + public String getProductName() { + String productname = android.os.Build.PRODUCT; + return productname; + } + + public String getManufacturer() { + String manufacturer = android.os.Build.MANUFACTURER; + return manufacturer; + } + + public String getSerialNumber() { + String serial = android.os.Build.SERIAL; + return serial; + } + + /** + * Get the OS version. + * + * @return + */ + public String getOSVersion() { + String osversion = android.os.Build.VERSION.RELEASE; + return osversion; + } + + public String getSDKVersion() { + @SuppressWarnings("deprecation") + String sdkversion = android.os.Build.VERSION.SDK; + return sdkversion; + } + + public String getTimeZoneID() { + TimeZone tz = TimeZone.getDefault(); + return (tz.getID()); + } + + /** + * Function to check if the device is manufactured by Amazon + * + * @return + */ + public boolean isAmazonDevice() { + if (android.os.Build.MANUFACTURER.equals(AMAZON_DEVICE)) { + return true; + } + return false; + } + + public boolean isVirtual() { + return android.os.Build.FINGERPRINT.contains("generic") || + android.os.Build.PRODUCT.contains("sdk"); + } + +} diff --git a/platforms/android/src/org/apache/cordova/devicemotion/AccelListener.java b/platforms/android/src/org/apache/cordova/devicemotion/AccelListener.java new file mode 100755 index 0000000..e36f0db --- /dev/null +++ b/platforms/android/src/org/apache/cordova/devicemotion/AccelListener.java @@ -0,0 +1,306 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.devicemotion; + +import java.util.List; + +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; + +import android.os.Handler; +import android.os.Looper; + +/** + * This class listens to the accelerometer sensor and stores the latest + * acceleration values x,y,z. + */ +public class AccelListener extends CordovaPlugin implements SensorEventListener { + + public static int STOPPED = 0; + public static int STARTING = 1; + public static int RUNNING = 2; + public static int ERROR_FAILED_TO_START = 3; + + private float x,y,z; // most recent acceleration values + private long timestamp; // time of most recent value + private int status; // status of listener + private int accuracy = SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM; + + private SensorManager sensorManager; // Sensor manager + private Sensor mSensor; // Acceleration sensor returned by sensor manager + + private CallbackContext callbackContext; // Keeps track of the JS callback context. + + private Handler mainHandler=null; + private Runnable mainRunnable =new Runnable() { + public void run() { + AccelListener.this.timeout(); + } + }; + + /** + * Create an accelerometer listener. + */ + public AccelListener() { + this.x = 0; + this.y = 0; + this.z = 0; + this.timestamp = 0; + this.setStatus(AccelListener.STOPPED); + } + + /** + * Sets the context of the Command. This can then be used to do things like + * get file paths associated with the Activity. + * + * @param cordova The context of the main Activity. + * @param webView The associated CordovaWebView. + */ + @Override + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + super.initialize(cordova, webView); + this.sensorManager = (SensorManager) cordova.getActivity().getSystemService(Context.SENSOR_SERVICE); + } + + /** + * Executes the request. + * + * @param action The action to execute. + * @param args The exec() arguments. + * @param callbackId The callback id used when calling back into JavaScript. + * @return Whether the action was valid. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) { + if (action.equals("start")) { + this.callbackContext = callbackContext; + if (this.status != AccelListener.RUNNING) { + // If not running, then this is an async call, so don't worry about waiting + // We drop the callback onto our stack, call start, and let start and the sensor callback fire off the callback down the road + this.start(); + } + } + else if (action.equals("stop")) { + if (this.status == AccelListener.RUNNING) { + this.stop(); + } + } else { + // Unsupported action + return false; + } + + PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT, ""); + result.setKeepCallback(true); + callbackContext.sendPluginResult(result); + return true; + } + + /** + * Called by AccelBroker when listener is to be shut down. + * Stop listener. + */ + public void onDestroy() { + this.stop(); + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + // + /** + * Start listening for acceleration sensor. + * + * @return status of listener + */ + private int start() { + // If already starting or running, then restart timeout and return + if ((this.status == AccelListener.RUNNING) || (this.status == AccelListener.STARTING)) { + startTimeout(); + return this.status; + } + + this.setStatus(AccelListener.STARTING); + + // Get accelerometer from sensor manager + List list = this.sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); + + // If found, then register as listener + if ((list != null) && (list.size() > 0)) { + this.mSensor = list.get(0); + if (this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_UI)) { + this.setStatus(AccelListener.STARTING); + } else { + this.setStatus(AccelListener.ERROR_FAILED_TO_START); + this.fail(AccelListener.ERROR_FAILED_TO_START, "Device sensor returned an error."); + return this.status; + }; + + } else { + this.setStatus(AccelListener.ERROR_FAILED_TO_START); + this.fail(AccelListener.ERROR_FAILED_TO_START, "No sensors found to register accelerometer listening to."); + return this.status; + } + + startTimeout(); + + return this.status; + } + private void startTimeout() { + // Set a timeout callback on the main thread. + stopTimeout(); + mainHandler = new Handler(Looper.getMainLooper()); + mainHandler.postDelayed(mainRunnable, 2000); + } + private void stopTimeout() { + if(mainHandler!=null){ + mainHandler.removeCallbacks(mainRunnable); + } + } + /** + * Stop listening to acceleration sensor. + */ + private void stop() { + stopTimeout(); + if (this.status != AccelListener.STOPPED) { + this.sensorManager.unregisterListener(this); + } + this.setStatus(AccelListener.STOPPED); + this.accuracy = SensorManager.SENSOR_STATUS_UNRELIABLE; + } + + /** + * Returns latest cached position if the sensor hasn't returned newer value. + * + * Called two seconds after starting the listener. + */ + private void timeout() { + if (this.status == AccelListener.STARTING) { + // call win with latest cached position + this.timestamp = System.currentTimeMillis(); + this.win(); + } + } + + /** + * Called when the accuracy of the sensor has changed. + * + * @param sensor + * @param accuracy + */ + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // Only look at accelerometer events + if (sensor.getType() != Sensor.TYPE_ACCELEROMETER) { + return; + } + + // If not running, then just return + if (this.status == AccelListener.STOPPED) { + return; + } + this.accuracy = accuracy; + } + + /** + * Sensor listener event. + * + * @param SensorEvent event + */ + public void onSensorChanged(SensorEvent event) { + // Only look at accelerometer events + if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) { + return; + } + + // If not running, then just return + if (this.status == AccelListener.STOPPED) { + return; + } + this.setStatus(AccelListener.RUNNING); + + if (this.accuracy >= SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM) { + + // Save time that event was received + this.timestamp = System.currentTimeMillis(); + this.x = event.values[0]; + this.y = event.values[1]; + this.z = event.values[2]; + + this.win(); + } + } + + /** + * Called when the view navigates. + */ + @Override + public void onReset() { + if (this.status == AccelListener.RUNNING) { + this.stop(); + } + } + + // Sends an error back to JS + private void fail(int code, String message) { + // Error object + JSONObject errorObj = new JSONObject(); + try { + errorObj.put("code", code); + errorObj.put("message", message); + } catch (JSONException e) { + e.printStackTrace(); + } + PluginResult err = new PluginResult(PluginResult.Status.ERROR, errorObj); + err.setKeepCallback(true); + callbackContext.sendPluginResult(err); + } + + private void win() { + // Success return object + PluginResult result = new PluginResult(PluginResult.Status.OK, this.getAccelerationJSON()); + result.setKeepCallback(true); + callbackContext.sendPluginResult(result); + } + + private void setStatus(int status) { + this.status = status; + } + private JSONObject getAccelerationJSON() { + JSONObject r = new JSONObject(); + try { + r.put("x", this.x); + r.put("y", this.y); + r.put("z", this.z); + r.put("timestamp", this.timestamp); + } catch (JSONException e) { + e.printStackTrace(); + } + return r; + } +} diff --git a/platforms/android/src/org/apache/cordova/deviceorientation/CompassListener.java b/platforms/android/src/org/apache/cordova/deviceorientation/CompassListener.java new file mode 100755 index 0000000..194db0d --- /dev/null +++ b/platforms/android/src/org/apache/cordova/deviceorientation/CompassListener.java @@ -0,0 +1,296 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.deviceorientation; + +import java.util.List; + +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.content.Context; + +import android.os.Handler; +import android.os.Looper; + +/** + * This class listens to the compass sensor and stores the latest heading value. + */ +public class CompassListener extends CordovaPlugin implements SensorEventListener { + + public static int STOPPED = 0; + public static int STARTING = 1; + public static int RUNNING = 2; + public static int ERROR_FAILED_TO_START = 3; + + public long TIMEOUT = 30000; // Timeout in msec to shut off listener + + int status; // status of listener + float heading; // most recent heading value + long timeStamp; // time of most recent value + long lastAccessTime; // time the value was last retrieved + int accuracy; // accuracy of the sensor + + private SensorManager sensorManager;// Sensor manager + Sensor mSensor; // Compass sensor returned by sensor manager + + private CallbackContext callbackContext; + + /** + * Constructor. + */ + public CompassListener() { + this.heading = 0; + this.timeStamp = 0; + this.setStatus(CompassListener.STOPPED); + } + + /** + * Sets the context of the Command. This can then be used to do things like + * get file paths associated with the Activity. + * + * @param cordova The context of the main Activity. + * @param webView The CordovaWebView Cordova is running in. + */ + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + super.initialize(cordova, webView); + this.sensorManager = (SensorManager) cordova.getActivity().getSystemService(Context.SENSOR_SERVICE); + } + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArry of arguments for the plugin. + * @param callbackS=Context The callback id used when calling back into JavaScript. + * @return True if the action was valid. + * @throws JSONException + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + if (action.equals("start")) { + this.start(); + } + else if (action.equals("stop")) { + this.stop(); + } + else if (action.equals("getStatus")) { + int i = this.getStatus(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, i)); + } + else if (action.equals("getHeading")) { + // If not running, then this is an async call, so don't worry about waiting + if (this.status != CompassListener.RUNNING) { + int r = this.start(); + if (r == CompassListener.ERROR_FAILED_TO_START) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, CompassListener.ERROR_FAILED_TO_START)); + return true; + } + // Set a timeout callback on the main thread. + Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(new Runnable() { + public void run() { + CompassListener.this.timeout(); + } + }, 2000); + } + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, getCompassHeading())); + } + else if (action.equals("setTimeout")) { + this.setTimeout(args.getLong(0)); + } + else if (action.equals("getTimeout")) { + long l = this.getTimeout(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, l)); + } else { + // Unsupported action + return false; + } + return true; + } + + /** + * Called when listener is to be shut down and object is being destroyed. + */ + public void onDestroy() { + this.stop(); + } + + /** + * Called when app has navigated and JS listeners have been destroyed. + */ + public void onReset() { + this.stop(); + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + + /** + * Start listening for compass sensor. + * + * @return status of listener + */ + public int start() { + + // If already starting or running, then just return + if ((this.status == CompassListener.RUNNING) || (this.status == CompassListener.STARTING)) { + return this.status; + } + + // Get compass sensor from sensor manager + @SuppressWarnings("deprecation") + List list = this.sensorManager.getSensorList(Sensor.TYPE_ORIENTATION); + + // If found, then register as listener + if (list != null && list.size() > 0) { + this.mSensor = list.get(0); + this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_NORMAL); + this.lastAccessTime = System.currentTimeMillis(); + this.setStatus(CompassListener.STARTING); + } + + // If error, then set status to error + else { + this.setStatus(CompassListener.ERROR_FAILED_TO_START); + } + + return this.status; + } + + /** + * Stop listening to compass sensor. + */ + public void stop() { + if (this.status != CompassListener.STOPPED) { + this.sensorManager.unregisterListener(this); + } + this.setStatus(CompassListener.STOPPED); + } + + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // TODO Auto-generated method stub + } + + /** + * Called after a delay to time out if the listener has not attached fast enough. + */ + private void timeout() { + if (this.status == CompassListener.STARTING) { + this.setStatus(CompassListener.ERROR_FAILED_TO_START); + if (this.callbackContext != null) { + this.callbackContext.error("Compass listener failed to start."); + } + } + } + + /** + * Sensor listener event. + * + * @param SensorEvent event + */ + public void onSensorChanged(SensorEvent event) { + + // We only care about the orientation as far as it refers to Magnetic North + float heading = event.values[0]; + + // Save heading + this.timeStamp = System.currentTimeMillis(); + this.heading = heading; + this.setStatus(CompassListener.RUNNING); + + // If heading hasn't been read for TIMEOUT time, then turn off compass sensor to save power + if ((this.timeStamp - this.lastAccessTime) > this.TIMEOUT) { + this.stop(); + } + } + + /** + * Get status of compass sensor. + * + * @return status + */ + public int getStatus() { + return this.status; + } + + /** + * Get the most recent compass heading. + * + * @return heading + */ + public float getHeading() { + this.lastAccessTime = System.currentTimeMillis(); + return this.heading; + } + + /** + * Set the timeout to turn off compass sensor if getHeading() hasn't been called. + * + * @param timeout Timeout in msec. + */ + public void setTimeout(long timeout) { + this.TIMEOUT = timeout; + } + + /** + * Get the timeout to turn off compass sensor if getHeading() hasn't been called. + * + * @return timeout in msec + */ + public long getTimeout() { + return this.TIMEOUT; + } + + /** + * Set the status and send it to JavaScript. + * @param status + */ + private void setStatus(int status) { + this.status = status; + } + + /** + * Create the CompassHeading JSON object to be returned to JavaScript + * + * @return a compass heading + */ + private JSONObject getCompassHeading() throws JSONException { + JSONObject obj = new JSONObject(); + + obj.put("magneticHeading", this.getHeading()); + obj.put("trueHeading", this.getHeading()); + // Since the magnetic and true heading are always the same our and accuracy + // is defined as the difference between true and magnetic always return zero + obj.put("headingAccuracy", 0); + obj.put("timestamp", this.timeStamp); + + return obj; + } + +} diff --git a/platforms/android/src/org/apache/cordova/dialogs/Notification.java b/platforms/android/src/org/apache/cordova/dialogs/Notification.java new file mode 100644 index 0000000..9be56c0 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/dialogs/Notification.java @@ -0,0 +1,505 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.dialogs; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.LOG; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; +import android.widget.EditText; +import android.widget.TextView; + + +/** + * This class provides access to notifications on the device. + * + * Be aware that this implementation gets called on + * navigator.notification.{alert|confirm|prompt}, and that there is a separate + * implementation in org.apache.cordova.CordovaChromeClient that gets + * called on a simple window.{alert|confirm|prompt}. + */ +public class Notification extends CordovaPlugin { + + private static final String LOG_TAG = "Notification"; + + public int confirmResult = -1; + public ProgressDialog spinnerDialog = null; + public ProgressDialog progressDialog = null; + + /** + * Constructor. + */ + public Notification() { + } + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArray of arguments for the plugin. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return True when the action was valid, false otherwise. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + /* + * Don't run any of these if the current activity is finishing + * in order to avoid android.view.WindowManager$BadTokenException + * crashing the app. Just return true here since false should only + * be returned in the event of an invalid action. + */ + if(this.cordova.getActivity().isFinishing()) return true; + + if (action.equals("beep")) { + this.beep(args.getLong(0)); + } + else if (action.equals("alert")) { + this.alert(args.getString(0), args.getString(1), args.getString(2), callbackContext); + return true; + } + else if (action.equals("confirm")) { + this.confirm(args.getString(0), args.getString(1), args.getJSONArray(2), callbackContext); + return true; + } + else if (action.equals("prompt")) { + this.prompt(args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), callbackContext); + return true; + } + else if (action.equals("activityStart")) { + this.activityStart(args.getString(0), args.getString(1)); + } + else if (action.equals("activityStop")) { + this.activityStop(); + } + else if (action.equals("progressStart")) { + this.progressStart(args.getString(0), args.getString(1)); + } + else if (action.equals("progressValue")) { + this.progressValue(args.getInt(0)); + } + else if (action.equals("progressStop")) { + this.progressStop(); + } + else { + return false; + } + + // Only alert and confirm are async. + callbackContext.success(); + return true; + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + + /** + * Beep plays the default notification ringtone. + * + * @param count Number of times to play notification + */ + public void beep(final long count) { + cordova.getThreadPool().execute(new Runnable() { + public void run() { + Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + Ringtone notification = RingtoneManager.getRingtone(cordova.getActivity().getBaseContext(), ringtone); + + // If phone is not set to silent mode + if (notification != null) { + for (long i = 0; i < count; ++i) { + notification.play(); + long timeout = 5000; + while (notification.isPlaying() && (timeout > 0)) { + timeout = timeout - 100; + try { + Thread.sleep(100); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + } + } + }); + } + + /** + * Builds and shows a native Android alert with given Strings + * @param message The message the alert should display + * @param title The title of the alert + * @param buttonLabel The label of the button + * @param callbackContext The callback context + */ + public synchronized void alert(final String message, final String title, final String buttonLabel, final CallbackContext callbackContext) { + final CordovaInterface cordova = this.cordova; + + Runnable runnable = new Runnable() { + public void run() { + + AlertDialog.Builder dlg = createDialog(cordova); // new AlertDialog.Builder(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); + dlg.setMessage(message); + dlg.setTitle(title); + dlg.setCancelable(true); + dlg.setPositiveButton(buttonLabel, + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 0)); + } + }); + dlg.setOnCancelListener(new AlertDialog.OnCancelListener() { + public void onCancel(DialogInterface dialog) + { + dialog.dismiss(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 0)); + } + }); + + changeTextDirection(dlg); + }; + }; + this.cordova.getActivity().runOnUiThread(runnable); + } + + /** + * Builds and shows a native Android confirm dialog with given title, message, buttons. + * This dialog only shows up to 3 buttons. Any labels after that will be ignored. + * The index of the button pressed will be returned to the JavaScript callback identified by callbackId. + * + * @param message The message the dialog should display + * @param title The title of the dialog + * @param buttonLabels A comma separated list of button labels (Up to 3 buttons) + * @param callbackContext The callback context. + */ + public synchronized void confirm(final String message, final String title, final JSONArray buttonLabels, final CallbackContext callbackContext) { + final CordovaInterface cordova = this.cordova; + + Runnable runnable = new Runnable() { + public void run() { + AlertDialog.Builder dlg = createDialog(cordova); // new AlertDialog.Builder(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); + dlg.setMessage(message); + dlg.setTitle(title); + dlg.setCancelable(true); + + // First button + if (buttonLabels.length() > 0) { + try { + dlg.setNegativeButton(buttonLabels.getString(0), + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 1)); + } + }); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on first button."); + } + } + + // Second button + if (buttonLabels.length() > 1) { + try { + dlg.setNeutralButton(buttonLabels.getString(1), + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 2)); + } + }); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on second button."); + } + } + + // Third button + if (buttonLabels.length() > 2) { + try { + dlg.setPositiveButton(buttonLabels.getString(2), + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 3)); + } + }); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on third button."); + } + } + dlg.setOnCancelListener(new AlertDialog.OnCancelListener() { + public void onCancel(DialogInterface dialog) + { + dialog.dismiss(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 0)); + } + }); + + changeTextDirection(dlg); + }; + }; + this.cordova.getActivity().runOnUiThread(runnable); + } + + /** + * Builds and shows a native Android prompt dialog with given title, message, buttons. + * This dialog only shows up to 3 buttons. Any labels after that will be ignored. + * The following results are returned to the JavaScript callback identified by callbackId: + * buttonIndex Index number of the button selected + * input1 The text entered in the prompt dialog box + * + * @param message The message the dialog should display + * @param title The title of the dialog + * @param buttonLabels A comma separated list of button labels (Up to 3 buttons) + * @param callbackContext The callback context. + */ + public synchronized void prompt(final String message, final String title, final JSONArray buttonLabels, final String defaultText, final CallbackContext callbackContext) { + + final CordovaInterface cordova = this.cordova; + + Runnable runnable = new Runnable() { + public void run() { + final EditText promptInput = new EditText(cordova.getActivity()); + promptInput.setHint(defaultText); + AlertDialog.Builder dlg = createDialog(cordova); // new AlertDialog.Builder(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); + dlg.setMessage(message); + dlg.setTitle(title); + dlg.setCancelable(true); + + dlg.setView(promptInput); + + final JSONObject result = new JSONObject(); + + // First button + if (buttonLabels.length() > 0) { + try { + dlg.setNegativeButton(buttonLabels.getString(0), + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + try { + result.put("buttonIndex",1); + result.put("input1", promptInput.getText().toString().trim().length()==0 ? defaultText : promptInput.getText()); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on first button.", e); + } + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); + } + }); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on first button."); + } + } + + // Second button + if (buttonLabels.length() > 1) { + try { + dlg.setNeutralButton(buttonLabels.getString(1), + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + try { + result.put("buttonIndex",2); + result.put("input1", promptInput.getText().toString().trim().length()==0 ? defaultText : promptInput.getText()); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on second button.", e); + } + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); + } + }); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on second button."); + } + } + + // Third button + if (buttonLabels.length() > 2) { + try { + dlg.setPositiveButton(buttonLabels.getString(2), + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + try { + result.put("buttonIndex",3); + result.put("input1", promptInput.getText().toString().trim().length()==0 ? defaultText : promptInput.getText()); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on third button.", e); + } + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); + } + }); + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on third button."); + } + } + dlg.setOnCancelListener(new AlertDialog.OnCancelListener() { + public void onCancel(DialogInterface dialog){ + dialog.dismiss(); + try { + result.put("buttonIndex",0); + result.put("input1", promptInput.getText().toString().trim().length()==0 ? defaultText : promptInput.getText()); + } catch (JSONException e) { e.printStackTrace(); } + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); + } + }); + + changeTextDirection(dlg); + }; + }; + this.cordova.getActivity().runOnUiThread(runnable); + } + + /** + * Show the spinner. + * + * @param title Title of the dialog + * @param message The message of the dialog + */ + public synchronized void activityStart(final String title, final String message) { + if (this.spinnerDialog != null) { + this.spinnerDialog.dismiss(); + this.spinnerDialog = null; + } + final Notification notification = this; + final CordovaInterface cordova = this.cordova; + Runnable runnable = new Runnable() { + public void run() { + notification.spinnerDialog = createProgressDialog(cordova); // new ProgressDialog(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); + notification.spinnerDialog.setTitle(title); + notification.spinnerDialog.setMessage(message); + notification.spinnerDialog.setCancelable(true); + notification.spinnerDialog.setIndeterminate(true); + notification.spinnerDialog.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + notification.spinnerDialog = null; + } + }); + notification.spinnerDialog.show(); + } + }; + this.cordova.getActivity().runOnUiThread(runnable); + } + + /** + * Stop spinner. + */ + public synchronized void activityStop() { + if (this.spinnerDialog != null) { + this.spinnerDialog.dismiss(); + this.spinnerDialog = null; + } + } + + /** + * Show the progress dialog. + * + * @param title Title of the dialog + * @param message The message of the dialog + */ + public synchronized void progressStart(final String title, final String message) { + if (this.progressDialog != null) { + this.progressDialog.dismiss(); + this.progressDialog = null; + } + final Notification notification = this; + final CordovaInterface cordova = this.cordova; + Runnable runnable = new Runnable() { + public void run() { + notification.progressDialog = createProgressDialog(cordova); // new ProgressDialog(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); + notification.progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + notification.progressDialog.setTitle(title); + notification.progressDialog.setMessage(message); + notification.progressDialog.setCancelable(true); + notification.progressDialog.setMax(100); + notification.progressDialog.setProgress(0); + notification.progressDialog.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + notification.progressDialog = null; + } + }); + notification.progressDialog.show(); + } + }; + this.cordova.getActivity().runOnUiThread(runnable); + } + + /** + * Set value of progress bar. + * + * @param value 0-100 + */ + public synchronized void progressValue(int value) { + if (this.progressDialog != null) { + this.progressDialog.setProgress(value); + } + } + + /** + * Stop progress dialog. + */ + public synchronized void progressStop() { + if (this.progressDialog != null) { + this.progressDialog.dismiss(); + this.progressDialog = null; + } + } + + @SuppressLint("NewApi") + private AlertDialog.Builder createDialog(CordovaInterface cordova) { + int currentapiVersion = android.os.Build.VERSION.SDK_INT; + if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { + return new AlertDialog.Builder(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); + } else { + return new AlertDialog.Builder(cordova.getActivity()); + } + } + + @SuppressLint("InlinedApi") + private ProgressDialog createProgressDialog(CordovaInterface cordova) { + int currentapiVersion = android.os.Build.VERSION.SDK_INT; + if (currentapiVersion >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return new ProgressDialog(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); + } else { + return new ProgressDialog(cordova.getActivity()); + } + } + + @SuppressLint("NewApi") + private void changeTextDirection(Builder dlg){ + int currentapiVersion = android.os.Build.VERSION.SDK_INT; + dlg.create(); + AlertDialog dialog = dlg.show(); + if (currentapiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { + TextView messageview = (TextView)dialog.findViewById(android.R.id.message); + messageview.setTextDirection(android.view.View.TEXT_DIRECTION_LOCALE); + } + } +} diff --git a/platforms/android/src/org/apache/cordova/file/AssetFilesystem.java b/platforms/android/src/org/apache/cordova/file/AssetFilesystem.java new file mode 100644 index 0000000..d6ce6ae --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/AssetFilesystem.java @@ -0,0 +1,286 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.cordova.file; + +import android.content.res.AssetManager; +import android.net.Uri; +import android.util.Log; + +import org.apache.cordova.CordovaResourceApi; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.util.HashMap; +import java.util.Map; + +public class AssetFilesystem extends Filesystem { + + private final AssetManager assetManager; + + // A custom gradle hook creates the cdvasset.manifest file, which speeds up asset listing a tonne. + // See: http://stackoverflow.com/questions/16911558/android-assetmanager-list-incredibly-slow + private static Object listCacheLock = new Object(); + private static boolean listCacheFromFile; + private static Map listCache; + private static Map lengthCache; + + private void lazyInitCaches() { + synchronized (listCacheLock) { + if (listCache == null) { + ObjectInputStream ois = null; + try { + ois = new ObjectInputStream(assetManager.open("cdvasset.manifest")); + listCache = (Map) ois.readObject(); + lengthCache = (Map) ois.readObject(); + listCacheFromFile = true; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + // Asset manifest won't exist if the gradle hook isn't set up correctly. + } finally { + if (ois != null) { + try { + ois.close(); + } catch (IOException e) { + } + } + } + if (listCache == null) { + Log.w("AssetFilesystem", "Asset manifest not found. Recursive copies and directory listing will be slow."); + listCache = new HashMap(); + } + } + } + } + + private String[] listAssets(String assetPath) throws IOException { + if (assetPath.startsWith("/")) { + assetPath = assetPath.substring(1); + } + if (assetPath.endsWith("/")) { + assetPath = assetPath.substring(0, assetPath.length() - 1); + } + lazyInitCaches(); + String[] ret = listCache.get(assetPath); + if (ret == null) { + if (listCacheFromFile) { + ret = new String[0]; + } else { + ret = assetManager.list(assetPath); + listCache.put(assetPath, ret); + } + } + return ret; + } + + private long getAssetSize(String assetPath) throws FileNotFoundException { + if (assetPath.startsWith("/")) { + assetPath = assetPath.substring(1); + } + lazyInitCaches(); + if (lengthCache != null) { + Long ret = lengthCache.get(assetPath); + if (ret == null) { + throw new FileNotFoundException("Asset not found: " + assetPath); + } + return ret; + } + CordovaResourceApi.OpenForReadResult offr = null; + try { + offr = resourceApi.openForRead(nativeUriForFullPath(assetPath)); + long length = offr.length; + if (length < 0) { + // available() doesn't always yield the file size, but for assets it does. + length = offr.inputStream.available(); + } + return length; + } catch (IOException e) { + throw new FileNotFoundException("File not found: " + assetPath); + } finally { + if (offr != null) { + try { + offr.inputStream.close(); + } catch (IOException e) { + } + } + } + } + + public AssetFilesystem(AssetManager assetManager, CordovaResourceApi resourceApi) { + super(Uri.parse("file:///android_asset/"), "assets", resourceApi); + this.assetManager = assetManager; + } + + @Override + public Uri toNativeUri(LocalFilesystemURL inputURL) { + return nativeUriForFullPath(inputURL.path); + } + + @Override + public LocalFilesystemURL toLocalUri(Uri inputURL) { + if (!"file".equals(inputURL.getScheme())) { + return null; + } + File f = new File(inputURL.getPath()); + // Removes and duplicate /s (e.g. file:///a//b/c) + Uri resolvedUri = Uri.fromFile(f); + String rootUriNoTrailingSlash = rootUri.getEncodedPath(); + rootUriNoTrailingSlash = rootUriNoTrailingSlash.substring(0, rootUriNoTrailingSlash.length() - 1); + if (!resolvedUri.getEncodedPath().startsWith(rootUriNoTrailingSlash)) { + return null; + } + String subPath = resolvedUri.getEncodedPath().substring(rootUriNoTrailingSlash.length()); + // Strip leading slash + if (!subPath.isEmpty()) { + subPath = subPath.substring(1); + } + Uri.Builder b = new Uri.Builder() + .scheme(LocalFilesystemURL.FILESYSTEM_PROTOCOL) + .authority("localhost") + .path(name); + if (!subPath.isEmpty()) { + b.appendEncodedPath(subPath); + } + if (isDirectory(subPath) || inputURL.getPath().endsWith("/")) { + // Add trailing / for directories. + b.appendEncodedPath(""); + } + return LocalFilesystemURL.parse(b.build()); + } + + private boolean isDirectory(String assetPath) { + try { + return listAssets(assetPath).length != 0; + } catch (IOException e) { + return false; + } + } + + @Override + public LocalFilesystemURL[] listChildren(LocalFilesystemURL inputURL) throws FileNotFoundException { + String pathNoSlashes = inputURL.path.substring(1); + if (pathNoSlashes.endsWith("/")) { + pathNoSlashes = pathNoSlashes.substring(0, pathNoSlashes.length() - 1); + } + + String[] files; + try { + files = listAssets(pathNoSlashes); + } catch (IOException e) { + throw new FileNotFoundException(); + } + + LocalFilesystemURL[] entries = new LocalFilesystemURL[files.length]; + for (int i = 0; i < files.length; ++i) { + entries[i] = localUrlforFullPath(new File(inputURL.path, files[i]).getPath()); + } + return entries; + } + + @Override + public JSONObject getFileForLocalURL(LocalFilesystemURL inputURL, + String path, JSONObject options, boolean directory) + throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException { + if (options != null && options.optBoolean("create")) { + throw new UnsupportedOperationException("Assets are read-only"); + } + + // Check whether the supplied path is absolute or relative + if (directory && !path.endsWith("/")) { + path += "/"; + } + + LocalFilesystemURL requestedURL; + if (path.startsWith("/")) { + requestedURL = localUrlforFullPath(normalizePath(path)); + } else { + requestedURL = localUrlforFullPath(normalizePath(inputURL.path + "/" + path)); + } + + // Throws a FileNotFoundException if it doesn't exist. + getFileMetadataForLocalURL(requestedURL); + + boolean isDir = isDirectory(requestedURL.path); + if (directory && !isDir) { + throw new TypeMismatchException("path doesn't exist or is file"); + } else if (!directory && isDir) { + throw new TypeMismatchException("path doesn't exist or is directory"); + } + + // Return the directory + return makeEntryForURL(requestedURL); + } + + @Override + public JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException { + JSONObject metadata = new JSONObject(); + long size = inputURL.isDirectory ? 0 : getAssetSize(inputURL.path); + try { + metadata.put("size", size); + metadata.put("type", inputURL.isDirectory ? "text/directory" : resourceApi.getMimeType(toNativeUri(inputURL))); + metadata.put("name", new File(inputURL.path).getName()); + metadata.put("fullPath", inputURL.path); + metadata.put("lastModifiedDate", 0); + } catch (JSONException e) { + return null; + } + return metadata; + } + + @Override + public boolean canRemoveFileAtLocalURL(LocalFilesystemURL inputURL) { + return false; + } + + @Override + long writeToFileAtURL(LocalFilesystemURL inputURL, String data, int offset, boolean isBinary) throws NoModificationAllowedException, IOException { + throw new NoModificationAllowedException("Assets are read-only"); + } + + @Override + long truncateFileAtURL(LocalFilesystemURL inputURL, long size) throws IOException, NoModificationAllowedException { + throw new NoModificationAllowedException("Assets are read-only"); + } + + @Override + String filesystemPathForURL(LocalFilesystemURL url) { + return null; + } + + @Override + LocalFilesystemURL URLforFilesystemPath(String path) { + return null; + } + + @Override + boolean removeFileAtLocalURL(LocalFilesystemURL inputURL) throws InvalidModificationException, NoModificationAllowedException { + throw new NoModificationAllowedException("Assets are read-only"); + } + + @Override + boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL) throws NoModificationAllowedException { + throw new NoModificationAllowedException("Assets are read-only"); + } + +} diff --git a/platforms/android/src/org/apache/cordova/file/ContentFilesystem.java b/platforms/android/src/org/apache/cordova/file/ContentFilesystem.java new file mode 100644 index 0000000..dfc5588 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/ContentFilesystem.java @@ -0,0 +1,216 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.cordova.file; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.DocumentsContract; +import android.provider.MediaStore; +import android.provider.OpenableColumns; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import org.apache.cordova.CordovaResourceApi; +import org.json.JSONException; +import org.json.JSONObject; + +public class ContentFilesystem extends Filesystem { + + private final Context context; + + public ContentFilesystem(Context context, CordovaResourceApi resourceApi) { + super(Uri.parse("content://"), "content", resourceApi); + this.context = context; + } + + @Override + public Uri toNativeUri(LocalFilesystemURL inputURL) { + String authorityAndPath = inputURL.uri.getEncodedPath().substring(this.name.length() + 2); + if (authorityAndPath.length() < 2) { + return null; + } + String ret = "content://" + authorityAndPath; + String query = inputURL.uri.getEncodedQuery(); + if (query != null) { + ret += '?' + query; + } + String frag = inputURL.uri.getEncodedFragment(); + if (frag != null) { + ret += '#' + frag; + } + return Uri.parse(ret); + } + + @Override + public LocalFilesystemURL toLocalUri(Uri inputURL) { + if (!"content".equals(inputURL.getScheme())) { + return null; + } + String subPath = inputURL.getEncodedPath(); + if (subPath.length() > 0) { + subPath = subPath.substring(1); + } + Uri.Builder b = new Uri.Builder() + .scheme(LocalFilesystemURL.FILESYSTEM_PROTOCOL) + .authority("localhost") + .path(name) + .appendPath(inputURL.getAuthority()); + if (subPath.length() > 0) { + b.appendEncodedPath(subPath); + } + Uri localUri = b.encodedQuery(inputURL.getEncodedQuery()) + .encodedFragment(inputURL.getEncodedFragment()) + .build(); + return LocalFilesystemURL.parse(localUri); + } + + @Override + public JSONObject getFileForLocalURL(LocalFilesystemURL inputURL, + String fileName, JSONObject options, boolean directory) throws IOException, TypeMismatchException, JSONException { + throw new UnsupportedOperationException("getFile() not supported for content:. Use resolveLocalFileSystemURL instead."); + } + + @Override + public boolean removeFileAtLocalURL(LocalFilesystemURL inputURL) + throws NoModificationAllowedException { + Uri contentUri = toNativeUri(inputURL); + try { + context.getContentResolver().delete(contentUri, null, null); + } catch (UnsupportedOperationException t) { + // Was seeing this on the File mobile-spec tests on 4.0.3 x86 emulator. + // The ContentResolver applies only when the file was registered in the + // first case, which is generally only the case with images. + throw new NoModificationAllowedException("Deleting not supported for content uri: " + contentUri); + } + return true; + } + + @Override + public boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL) + throws NoModificationAllowedException { + throw new NoModificationAllowedException("Cannot remove content url"); + } + + @Override + public LocalFilesystemURL[] listChildren(LocalFilesystemURL inputURL) throws FileNotFoundException { + throw new UnsupportedOperationException("readEntriesAtLocalURL() not supported for content:. Use resolveLocalFileSystemURL instead."); + } + + @Override + public JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException { + long size = -1; + long lastModified = 0; + Uri nativeUri = toNativeUri(inputURL); + String mimeType = resourceApi.getMimeType(nativeUri); + Cursor cursor = openCursorForURL(nativeUri); + try { + if (cursor != null && cursor.moveToFirst()) { + size = resourceSizeForCursor(cursor); + Long modified = lastModifiedDateForCursor(cursor); + if (modified != null) + lastModified = modified.longValue(); + } else { + // Some content providers don't support cursors at all! + CordovaResourceApi.OpenForReadResult offr = resourceApi.openForRead(nativeUri); + size = offr.length; + } + } catch (IOException e) { + throw new FileNotFoundException(); + } finally { + if (cursor != null) + cursor.close(); + } + + JSONObject metadata = new JSONObject(); + try { + metadata.put("size", size); + metadata.put("type", mimeType); + metadata.put("name", name); + metadata.put("fullPath", inputURL.path); + metadata.put("lastModifiedDate", lastModified); + } catch (JSONException e) { + return null; + } + return metadata; + } + + @Override + public long writeToFileAtURL(LocalFilesystemURL inputURL, String data, + int offset, boolean isBinary) throws NoModificationAllowedException { + throw new NoModificationAllowedException("Couldn't write to file given its content URI"); + } + @Override + public long truncateFileAtURL(LocalFilesystemURL inputURL, long size) + throws NoModificationAllowedException { + throw new NoModificationAllowedException("Couldn't truncate file given its content URI"); + } + + protected Cursor openCursorForURL(Uri nativeUri) { + ContentResolver contentResolver = context.getContentResolver(); + try { + return contentResolver.query(nativeUri, null, null, null, null); + } catch (UnsupportedOperationException e) { + return null; + } + } + + private Long resourceSizeForCursor(Cursor cursor) { + int columnIndex = cursor.getColumnIndex(OpenableColumns.SIZE); + if (columnIndex != -1) { + String sizeStr = cursor.getString(columnIndex); + if (sizeStr != null) { + return Long.parseLong(sizeStr); + } + } + return null; + } + + protected Long lastModifiedDateForCursor(Cursor cursor) { + int columnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED); + if (columnIndex == -1) { + columnIndex = cursor.getColumnIndex(DocumentsContract.Document.COLUMN_LAST_MODIFIED); + } + if (columnIndex != -1) { + String dateStr = cursor.getString(columnIndex); + if (dateStr != null) { + return Long.parseLong(dateStr); + } + } + return null; + } + + @Override + public String filesystemPathForURL(LocalFilesystemURL url) { + File f = resourceApi.mapUriToFile(toNativeUri(url)); + return f == null ? null : f.getAbsolutePath(); + } + + @Override + public LocalFilesystemURL URLforFilesystemPath(String path) { + // Returns null as we don't support reverse mapping back to content:// URLs + return null; + } + + @Override + public boolean canRemoveFileAtLocalURL(LocalFilesystemURL inputURL) { + return true; + } +} diff --git a/platforms/android/src/org/apache/cordova/file/DirectoryManager.java b/platforms/android/src/org/apache/cordova/file/DirectoryManager.java new file mode 100644 index 0000000..07af5ea --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/DirectoryManager.java @@ -0,0 +1,134 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.file; + +import android.os.Environment; +import android.os.StatFs; + +import java.io.File; + +/** + * This class provides file directory utilities. + * All file operations are performed on the SD card. + * + * It is used by the FileUtils class. + */ +public class DirectoryManager { + + @SuppressWarnings("unused") + private static final String LOG_TAG = "DirectoryManager"; + + /** + * Determine if a file or directory exists. + * @param name The name of the file to check. + * @return T=exists, F=not found + */ + public static boolean testFileExists(String name) { + boolean status; + + // If SD card exists + if ((testSaveLocationExists()) && (!name.equals(""))) { + File path = Environment.getExternalStorageDirectory(); + File newPath = constructFilePaths(path.toString(), name); + status = newPath.exists(); + } + // If no SD card + else { + status = false; + } + return status; + } + + /** + * Get the free space in external storage + * + * @return Size in KB or -1 if not available + */ + public static long getFreeExternalStorageSpace() { + String status = Environment.getExternalStorageState(); + long freeSpaceInBytes = 0; + + // Check if external storage exists + if (status.equals(Environment.MEDIA_MOUNTED)) { + freeSpaceInBytes = getFreeSpaceInBytes(Environment.getExternalStorageDirectory().getPath()); + } else { + // If no external storage then return -1 + return -1; + } + + return freeSpaceInBytes / 1024; + } + + /** + * Given a path return the number of free bytes in the filesystem containing the path. + * + * @param path to the file system + * @return free space in bytes + */ + public static long getFreeSpaceInBytes(String path) { + try { + StatFs stat = new StatFs(path); + long blockSize = stat.getBlockSize(); + long availableBlocks = stat.getAvailableBlocks(); + return availableBlocks * blockSize; + } catch (IllegalArgumentException e) { + // The path was invalid. Just return 0 free bytes. + return 0; + } + } + + /** + * Determine if SD card exists. + * + * @return T=exists, F=not found + */ + public static boolean testSaveLocationExists() { + String sDCardStatus = Environment.getExternalStorageState(); + boolean status; + + // If SD card is mounted + if (sDCardStatus.equals(Environment.MEDIA_MOUNTED)) { + status = true; + } + + // If no SD card + else { + status = false; + } + return status; + } + + /** + * Create a new file object from two file paths. + * + * @param file1 Base file path + * @param file2 Remaining file path + * @return File object + */ + private static File constructFilePaths (String file1, String file2) { + File newPath; + if (file2.startsWith(file1)) { + newPath = new File(file2); + } + else { + newPath = new File(file1 + "/" + file2); + } + return newPath; + } +} diff --git a/platforms/android/src/org/apache/cordova/file/EncodingException.java b/platforms/android/src/org/apache/cordova/file/EncodingException.java new file mode 100644 index 0000000..e9e1653 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/EncodingException.java @@ -0,0 +1,29 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.file; + +@SuppressWarnings("serial") +public class EncodingException extends Exception { + + public EncodingException(String message) { + super(message); + } + +} diff --git a/platforms/android/src/org/apache/cordova/file/FileExistsException.java b/platforms/android/src/org/apache/cordova/file/FileExistsException.java new file mode 100644 index 0000000..5c4d83d --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/FileExistsException.java @@ -0,0 +1,29 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.file; + +@SuppressWarnings("serial") +public class FileExistsException extends Exception { + + public FileExistsException(String msg) { + super(msg); + } + +} diff --git a/platforms/android/src/org/apache/cordova/file/FileUtils.java b/platforms/android/src/org/apache/cordova/file/FileUtils.java new file mode 100644 index 0000000..c5a99bd --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/FileUtils.java @@ -0,0 +1,1196 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.cordova.file; + +import android.Manifest; +import android.app.Activity; +import android.content.Context; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.util.Base64; +import android.util.Log; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.PermissionHelper; +import org.apache.cordova.PluginResult; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.security.Permission; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +/** + * This class provides file and directory services to JavaScript. + */ +public class FileUtils extends CordovaPlugin { + private static final String LOG_TAG = "FileUtils"; + + public static int NOT_FOUND_ERR = 1; + public static int SECURITY_ERR = 2; + public static int ABORT_ERR = 3; + + public static int NOT_READABLE_ERR = 4; + public static int ENCODING_ERR = 5; + public static int NO_MODIFICATION_ALLOWED_ERR = 6; + public static int INVALID_STATE_ERR = 7; + public static int SYNTAX_ERR = 8; + public static int INVALID_MODIFICATION_ERR = 9; + public static int QUOTA_EXCEEDED_ERR = 10; + public static int TYPE_MISMATCH_ERR = 11; + public static int PATH_EXISTS_ERR = 12; + + /* + * Permission callback codes + */ + + public static final int ACTION_GET_FILE = 0; + public static final int ACTION_WRITE = 1; + public static final int ACTION_GET_DIRECTORY = 2; + + public static final int WRITE = 3; + public static final int READ = 4; + + public static int UNKNOWN_ERR = 1000; + + private boolean configured = false; + + private PendingRequests pendingRequests; + + + + /* + * We need both read and write when accessing the storage, I think. + */ + + private String [] permissions = { + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE }; + + // This field exists only to support getEntry, below, which has been deprecated + private static FileUtils filePlugin; + + private interface FileOp { + void run(JSONArray args) throws Exception; + } + + private ArrayList filesystems; + + public void registerFilesystem(Filesystem fs) { + if (fs != null && filesystemForName(fs.name)== null) { + this.filesystems.add(fs); + } + } + + private Filesystem filesystemForName(String name) { + for (Filesystem fs:filesystems) { + if (fs != null && fs.name != null && fs.name.equals(name)) { + return fs; + } + } + return null; + } + + protected String[] getExtraFileSystemsPreference(Activity activity) { + String fileSystemsStr = preferences.getString("androidextrafilesystems", "files,files-external,documents,sdcard,cache,cache-external,root"); + return fileSystemsStr.split(","); + } + + protected void registerExtraFileSystems(String[] filesystems, HashMap availableFileSystems) { + HashSet installedFileSystems = new HashSet(); + + /* Register filesystems in order */ + for (String fsName : filesystems) { + if (!installedFileSystems.contains(fsName)) { + String fsRoot = availableFileSystems.get(fsName); + if (fsRoot != null) { + File newRoot = new File(fsRoot); + if (newRoot.mkdirs() || newRoot.isDirectory()) { + registerFilesystem(new LocalFilesystem(fsName, webView.getContext(), webView.getResourceApi(), newRoot)); + installedFileSystems.add(fsName); + } else { + Log.d(LOG_TAG, "Unable to create root dir for filesystem \"" + fsName + "\", skipping"); + } + } else { + Log.d(LOG_TAG, "Unrecognized extra filesystem identifier: " + fsName); + } + } + } + } + + protected HashMap getAvailableFileSystems(Activity activity) { + Context context = activity.getApplicationContext(); + HashMap availableFileSystems = new HashMap(); + + availableFileSystems.put("files", context.getFilesDir().getAbsolutePath()); + availableFileSystems.put("documents", new File(context.getFilesDir(), "Documents").getAbsolutePath()); + availableFileSystems.put("cache", context.getCacheDir().getAbsolutePath()); + availableFileSystems.put("root", "/"); + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + try { + availableFileSystems.put("files-external", context.getExternalFilesDir(null).getAbsolutePath()); + availableFileSystems.put("sdcard", Environment.getExternalStorageDirectory().getAbsolutePath()); + availableFileSystems.put("cache-external", context.getExternalCacheDir().getAbsolutePath()); + } + catch(NullPointerException e) { + Log.d(LOG_TAG, "External storage unavailable, check to see if USB Mass Storage Mode is on"); + } + } + + return availableFileSystems; + } + + @Override + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + super.initialize(cordova, webView); + this.filesystems = new ArrayList(); + this.pendingRequests = new PendingRequests(); + + String tempRoot = null; + String persistentRoot = null; + + Activity activity = cordova.getActivity(); + String packageName = activity.getPackageName(); + + String location = preferences.getString("androidpersistentfilelocation", "internal"); + + tempRoot = activity.getCacheDir().getAbsolutePath(); + if ("internal".equalsIgnoreCase(location)) { + persistentRoot = activity.getFilesDir().getAbsolutePath() + "/files/"; + this.configured = true; + } else if ("compatibility".equalsIgnoreCase(location)) { + /* + * Fall-back to compatibility mode -- this is the logic implemented in + * earlier versions of this plugin, and should be maintained here so + * that apps which were originally deployed with older versions of the + * plugin can continue to provide access to files stored under those + * versions. + */ + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + persistentRoot = Environment.getExternalStorageDirectory().getAbsolutePath(); + tempRoot = Environment.getExternalStorageDirectory().getAbsolutePath() + + "/Android/data/" + packageName + "/cache/"; + } else { + persistentRoot = "/data/data/" + packageName; + } + this.configured = true; + } + + if (this.configured) { + // Create the directories if they don't exist. + File tmpRootFile = new File(tempRoot); + File persistentRootFile = new File(persistentRoot); + tmpRootFile.mkdirs(); + persistentRootFile.mkdirs(); + + // Register initial filesystems + // Note: The temporary and persistent filesystems need to be the first two + // registered, so that they will match window.TEMPORARY and window.PERSISTENT, + // per spec. + this.registerFilesystem(new LocalFilesystem("temporary", webView.getContext(), webView.getResourceApi(), tmpRootFile)); + this.registerFilesystem(new LocalFilesystem("persistent", webView.getContext(), webView.getResourceApi(), persistentRootFile)); + this.registerFilesystem(new ContentFilesystem(webView.getContext(), webView.getResourceApi())); + this.registerFilesystem(new AssetFilesystem(webView.getContext().getAssets(), webView.getResourceApi())); + + registerExtraFileSystems(getExtraFileSystemsPreference(activity), getAvailableFileSystems(activity)); + + // Initialize static plugin reference for deprecated getEntry method + if (filePlugin == null) { + FileUtils.filePlugin = this; + } + } else { + Log.e(LOG_TAG, "File plugin configuration error: Please set AndroidPersistentFileLocation in config.xml to one of \"internal\" (for new applications) or \"compatibility\" (for compatibility with previous versions)"); + activity.finish(); + } + } + + public static FileUtils getFilePlugin() { + return filePlugin; + } + + private Filesystem filesystemForURL(LocalFilesystemURL localURL) { + if (localURL == null) return null; + return filesystemForName(localURL.fsName); + } + + @Override + public Uri remapUri(Uri uri) { + // Remap only cdvfile: URLs (not content:). + if (!LocalFilesystemURL.FILESYSTEM_PROTOCOL.equals(uri.getScheme())) { + return null; + } + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(uri); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + return null; + } + String path = fs.filesystemPathForURL(inputURL); + if (path != null) { + return Uri.parse("file://" + fs.filesystemPathForURL(inputURL)); + } + return null; + } catch (IllegalArgumentException e) { + return null; + } + } + + public boolean execute(String action, final String rawArgs, final CallbackContext callbackContext) { + if (!configured) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, "File plugin is not configured. Please see the README.md file for details on how to update config.xml")); + return true; + } + if (action.equals("testSaveLocationExists")) { + threadhelper(new FileOp() { + public void run(JSONArray args) { + boolean b = DirectoryManager.testSaveLocationExists(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, b)); + } + }, rawArgs, callbackContext); + } + else if (action.equals("getFreeDiskSpace")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) { + // The getFreeDiskSpace plugin API is not documented, but some apps call it anyway via exec(). + // For compatibility it always returns free space in the primary external storage, and + // does NOT fallback to internal store if external storage is unavailable. + long l = DirectoryManager.getFreeExternalStorageSpace(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, l)); + } + }, rawArgs, callbackContext); + } + else if (action.equals("testFileExists")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException { + String fname=args.getString(0); + boolean b = DirectoryManager.testFileExists(fname); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, b)); + } + }, rawArgs, callbackContext); + } + else if (action.equals("testDirectoryExists")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException { + String fname=args.getString(0); + boolean b = DirectoryManager.testFileExists(fname); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, b)); + } + }, rawArgs, callbackContext); + } + else if (action.equals("readAsText")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, MalformedURLException { + String encoding = args.getString(1); + int start = args.getInt(2); + int end = args.getInt(3); + String fname=args.getString(0); + readFileAs(fname, start, end, callbackContext, encoding, PluginResult.MESSAGE_TYPE_STRING); + } + }, rawArgs, callbackContext); + } + else if (action.equals("readAsDataURL")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, MalformedURLException { + int start = args.getInt(1); + int end = args.getInt(2); + String fname=args.getString(0); + readFileAs(fname, start, end, callbackContext, null, -1); + } + }, rawArgs, callbackContext); + } + else if (action.equals("readAsArrayBuffer")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, MalformedURLException { + int start = args.getInt(1); + int end = args.getInt(2); + String fname=args.getString(0); + readFileAs(fname, start, end, callbackContext, null, PluginResult.MESSAGE_TYPE_ARRAYBUFFER); + } + }, rawArgs, callbackContext); + } + else if (action.equals("readAsBinaryString")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, MalformedURLException { + int start = args.getInt(1); + int end = args.getInt(2); + String fname=args.getString(0); + readFileAs(fname, start, end, callbackContext, null, PluginResult.MESSAGE_TYPE_BINARYSTRING); + } + }, rawArgs, callbackContext); + } + else if (action.equals("write")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, FileNotFoundException, IOException, NoModificationAllowedException { + String fname=args.getString(0); + String nativeURL = resolveLocalFileSystemURI(fname).getString("nativeURL"); + String data=args.getString(1); + int offset=args.getInt(2); + Boolean isBinary=args.getBoolean(3); + + if(needPermission(nativeURL, WRITE)) { + getWritePermission(rawArgs, ACTION_WRITE, callbackContext); + } + else { + long fileSize = write(fname, data, offset, isBinary); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, fileSize)); + } + + } + }, rawArgs, callbackContext); + } + else if (action.equals("truncate")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, FileNotFoundException, IOException, NoModificationAllowedException { + String fname=args.getString(0); + int offset=args.getInt(1); + long fileSize = truncateFile(fname, offset); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, fileSize)); + } + }, rawArgs, callbackContext); + } + else if (action.equals("requestAllFileSystems")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws IOException, JSONException { + callbackContext.success(requestAllFileSystems()); + } + }, rawArgs, callbackContext); + } else if (action.equals("requestAllPaths")) { + cordova.getThreadPool().execute( + new Runnable() { + public void run() { + try { + callbackContext.success(requestAllPaths()); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + ); + } else if (action.equals("requestFileSystem")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException { + int fstype = args.getInt(0); + long requiredSize = args.optLong(1); + requestFileSystem(fstype, requiredSize, callbackContext); + } + }, rawArgs, callbackContext); + } + else if (action.equals("resolveLocalFileSystemURI")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws IOException, JSONException { + String fname=args.getString(0); + JSONObject obj = resolveLocalFileSystemURI(fname); + callbackContext.success(obj); + } + }, rawArgs, callbackContext); + } + else if (action.equals("getFileMetadata")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws FileNotFoundException, JSONException, MalformedURLException { + String fname=args.getString(0); + JSONObject obj = getFileMetadata(fname); + callbackContext.success(obj); + } + }, rawArgs, callbackContext); + } + else if (action.equals("getParent")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, IOException { + String fname=args.getString(0); + JSONObject obj = getParent(fname); + callbackContext.success(obj); + } + }, rawArgs, callbackContext); + } + else if (action.equals("getDirectory")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException { + String dirname = args.getString(0); + String path = args.getString(1); + String nativeURL = resolveLocalFileSystemURI(dirname).getString("nativeURL"); + boolean containsCreate = (args.isNull(2)) ? false : args.getJSONObject(2).optBoolean("create", false); + + if(containsCreate && needPermission(nativeURL, WRITE)) { + getWritePermission(rawArgs, ACTION_GET_DIRECTORY, callbackContext); + } + else if(!containsCreate && needPermission(nativeURL, READ)) { + getReadPermission(rawArgs, ACTION_GET_DIRECTORY, callbackContext); + } + else { + JSONObject obj = getFile(dirname, path, args.optJSONObject(2), true); + callbackContext.success(obj); + } + } + }, rawArgs, callbackContext); + } + else if (action.equals("getFile")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException { + String dirname = args.getString(0); + String path = args.getString(1); + String nativeURL = resolveLocalFileSystemURI(dirname).getString("nativeURL"); + boolean containsCreate = (args.isNull(2)) ? false : args.getJSONObject(2).optBoolean("create", false); + + if(containsCreate && needPermission(nativeURL, WRITE)) { + getWritePermission(rawArgs, ACTION_GET_FILE, callbackContext); + } + else if(!containsCreate && needPermission(nativeURL, READ)) { + getReadPermission(rawArgs, ACTION_GET_FILE, callbackContext); + } + else { + JSONObject obj = getFile(dirname, path, args.optJSONObject(2), false); + callbackContext.success(obj); + } + } + }, rawArgs, callbackContext); + } + else if (action.equals("remove")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, NoModificationAllowedException, InvalidModificationException, MalformedURLException { + String fname=args.getString(0); + boolean success = remove(fname); + if (success) { + callbackContext.success(); + } else { + callbackContext.error(FileUtils.NO_MODIFICATION_ALLOWED_ERR); + } + } + }, rawArgs, callbackContext); + } + else if (action.equals("removeRecursively")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, FileExistsException, MalformedURLException, NoModificationAllowedException { + String fname=args.getString(0); + boolean success = removeRecursively(fname); + if (success) { + callbackContext.success(); + } else { + callbackContext.error(FileUtils.NO_MODIFICATION_ALLOWED_ERR); + } + } + }, rawArgs, callbackContext); + } + else if (action.equals("moveTo")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException { + String fname=args.getString(0); + String newParent=args.getString(1); + String newName=args.getString(2); + JSONObject entry = transferTo(fname, newParent, newName, true); + callbackContext.success(entry); + } + }, rawArgs, callbackContext); + } + else if (action.equals("copyTo")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException { + String fname=args.getString(0); + String newParent=args.getString(1); + String newName=args.getString(2); + JSONObject entry = transferTo(fname, newParent, newName, false); + callbackContext.success(entry); + } + }, rawArgs, callbackContext); + } + else if (action.equals("readEntries")) { + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws FileNotFoundException, JSONException, MalformedURLException { + String fname=args.getString(0); + JSONArray entries = readEntries(fname); + callbackContext.success(entries); + } + }, rawArgs, callbackContext); + } + else if (action.equals("_getLocalFilesystemPath")) { + // Internal method for testing: Get the on-disk location of a local filesystem url. + // [Currently used for testing file-transfer] + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws FileNotFoundException, JSONException, MalformedURLException { + String localURLstr = args.getString(0); + String fname = filesystemPathForURL(localURLstr); + callbackContext.success(fname); + } + }, rawArgs, callbackContext); + } + else { + return false; + } + return true; + } + + private void getReadPermission(String rawArgs, int action, CallbackContext callbackContext) { + int requestCode = pendingRequests.createRequest(rawArgs, action, callbackContext); + PermissionHelper.requestPermission(this, requestCode, Manifest.permission.READ_EXTERNAL_STORAGE); + } + + private void getWritePermission(String rawArgs, int action, CallbackContext callbackContext) { + int requestCode = pendingRequests.createRequest(rawArgs, action, callbackContext); + PermissionHelper.requestPermission(this, requestCode, Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + private boolean hasReadPermission() { + return PermissionHelper.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); + } + + private boolean hasWritePermission() { + return PermissionHelper.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + private boolean needPermission(String nativeURL, int permissionType) throws JSONException { + JSONObject j = requestAllPaths(); + String[] allowedStorageDirectories = {j.getString("applicationStorageDirectory"), j.getString("externalApplicationStorageDirectory")}; + + if(permissionType == READ && hasReadPermission()) { + return false; + } + else if(permissionType == WRITE && hasWritePermission()) { + return false; + } + + // Permission required if the native url lies outside the allowed storage directories + for(String directory : allowedStorageDirectories) { + if(nativeURL.startsWith(directory)) { + return false; + } + } + return true; + } + + + public LocalFilesystemURL resolveNativeUri(Uri nativeUri) { + LocalFilesystemURL localURL = null; + + // Try all installed filesystems. Return the best matching URL + // (determined by the shortest resulting URL) + for (Filesystem fs : filesystems) { + LocalFilesystemURL url = fs.toLocalUri(nativeUri); + if (url != null) { + // A shorter fullPath implies that the filesystem is a better + // match for the local path than the previous best. + if (localURL == null || (url.uri.toString().length() < localURL.toString().length())) { + localURL = url; + } + } + } + return localURL; + } + + /* + * These two native-only methods can be used by other plugins to translate between + * device file system paths and URLs. By design, there is no direct JavaScript + * interface to these methods. + */ + + public String filesystemPathForURL(String localURLstr) throws MalformedURLException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(localURLstr); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + return fs.filesystemPathForURL(inputURL); + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + } + + public LocalFilesystemURL filesystemURLforLocalPath(String localPath) { + LocalFilesystemURL localURL = null; + int shortestFullPath = 0; + + // Try all installed filesystems. Return the best matching URL + // (determined by the shortest resulting URL) + for (Filesystem fs: filesystems) { + LocalFilesystemURL url = fs.URLforFilesystemPath(localPath); + if (url != null) { + // A shorter fullPath implies that the filesystem is a better + // match for the local path than the previous best. + if (localURL == null || (url.path.length() < shortestFullPath)) { + localURL = url; + shortestFullPath = url.path.length(); + } + } + } + return localURL; + } + + + /* helper to execute functions async and handle the result codes + * + */ + private void threadhelper(final FileOp f, final String rawArgs, final CallbackContext callbackContext){ + cordova.getThreadPool().execute(new Runnable() { + public void run() { + try { + JSONArray args = new JSONArray(rawArgs); + f.run(args); + } catch ( Exception e) { + if( e instanceof EncodingException){ + callbackContext.error(FileUtils.ENCODING_ERR); + } else if(e instanceof FileNotFoundException) { + callbackContext.error(FileUtils.NOT_FOUND_ERR); + } else if(e instanceof FileExistsException) { + callbackContext.error(FileUtils.PATH_EXISTS_ERR); + } else if(e instanceof NoModificationAllowedException ) { + callbackContext.error(FileUtils.NO_MODIFICATION_ALLOWED_ERR); + } else if(e instanceof InvalidModificationException ) { + callbackContext.error(FileUtils.INVALID_MODIFICATION_ERR); + } else if(e instanceof MalformedURLException ) { + callbackContext.error(FileUtils.ENCODING_ERR); + } else if(e instanceof IOException ) { + callbackContext.error(FileUtils.INVALID_MODIFICATION_ERR); + } else if(e instanceof EncodingException ) { + callbackContext.error(FileUtils.ENCODING_ERR); + } else if(e instanceof TypeMismatchException ) { + callbackContext.error(FileUtils.TYPE_MISMATCH_ERR); + } else if(e instanceof JSONException ) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + } else { + e.printStackTrace(); + callbackContext.error(FileUtils.UNKNOWN_ERR); + } + } + } + }); + } + + /** + * Allows the user to look up the Entry for a file or directory referred to by a local URI. + * + * @param uriString of the file/directory to look up + * @return a JSONObject representing a Entry from the filesystem + * @throws MalformedURLException if the url is not valid + * @throws FileNotFoundException if the file does not exist + * @throws IOException if the user can't read the file + * @throws JSONException + */ + private JSONObject resolveLocalFileSystemURI(String uriString) throws IOException, JSONException { + if (uriString == null) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + Uri uri = Uri.parse(uriString); + boolean isNativeUri = false; + + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(uri); + if (inputURL == null) { + /* Check for file://, content:// urls */ + inputURL = resolveNativeUri(uri); + isNativeUri = true; + } + + try { + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + if (fs.exists(inputURL)) { + if (!isNativeUri) { + // If not already resolved as native URI, resolve to a native URI and back to + // fix the terminating slash based on whether the entry is a directory or file. + inputURL = fs.toLocalUri(fs.toNativeUri(inputURL)); + } + + return fs.getEntryForLocalURL(inputURL); + } + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + throw new FileNotFoundException(); + } + + /** + * Read the list of files from this directory. + * + * @return a JSONArray containing JSONObjects that represent Entry objects. + * @throws FileNotFoundException if the directory is not found. + * @throws JSONException + * @throws MalformedURLException + */ + private JSONArray readEntries(String baseURLstr) throws FileNotFoundException, JSONException, MalformedURLException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + return fs.readEntriesAtLocalURL(inputURL); + + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + } + + /** + * A setup method that handles the move/copy of files/directories + * + * @param newName for the file directory to be called, if null use existing file name + * @param move if false do a copy, if true do a move + * @return a Entry object + * @throws NoModificationAllowedException + * @throws IOException + * @throws InvalidModificationException + * @throws EncodingException + * @throws JSONException + * @throws FileExistsException + */ + private JSONObject transferTo(String srcURLstr, String destURLstr, String newName, boolean move) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException { + if (srcURLstr == null || destURLstr == null) { + // either no source or no destination provided + throw new FileNotFoundException(); + } + + LocalFilesystemURL srcURL = LocalFilesystemURL.parse(srcURLstr); + LocalFilesystemURL destURL = LocalFilesystemURL.parse(destURLstr); + + Filesystem srcFs = this.filesystemForURL(srcURL); + Filesystem destFs = this.filesystemForURL(destURL); + + // Check for invalid file name + if (newName != null && newName.contains(":")) { + throw new EncodingException("Bad file name"); + } + + return destFs.copyFileToURL(destURL, newName, srcFs, srcURL, move); + } + + /** + * Deletes a directory and all of its contents, if any. In the event of an error + * [e.g. trying to delete a directory that contains a file that cannot be removed], + * some of the contents of the directory may be deleted. + * It is an error to attempt to delete the root directory of a filesystem. + * + * @return a boolean representing success of failure + * @throws FileExistsException + * @throws NoModificationAllowedException + * @throws MalformedURLException + */ + private boolean removeRecursively(String baseURLstr) throws FileExistsException, NoModificationAllowedException, MalformedURLException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr); + // You can't delete the root directory. + if ("".equals(inputURL.path) || "/".equals(inputURL.path)) { + throw new NoModificationAllowedException("You can't delete the root directory"); + } + + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + return fs.recursiveRemoveFileAtLocalURL(inputURL); + + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + } + + + /** + * Deletes a file or directory. It is an error to attempt to delete a directory that is not empty. + * It is an error to attempt to delete the root directory of a filesystem. + * + * @return a boolean representing success of failure + * @throws NoModificationAllowedException + * @throws InvalidModificationException + * @throws MalformedURLException + */ + private boolean remove(String baseURLstr) throws NoModificationAllowedException, InvalidModificationException, MalformedURLException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr); + // You can't delete the root directory. + if ("".equals(inputURL.path) || "/".equals(inputURL.path)) { + + throw new NoModificationAllowedException("You can't delete the root directory"); + } + + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + return fs.removeFileAtLocalURL(inputURL); + + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + } + + /** + * Creates or looks up a file. + * + * @param baseURLstr base directory + * @param path file/directory to lookup or create + * @param options specify whether to create or not + * @param directory if true look up directory, if false look up file + * @return a Entry object + * @throws FileExistsException + * @throws IOException + * @throws TypeMismatchException + * @throws EncodingException + * @throws JSONException + */ + private JSONObject getFile(String baseURLstr, String path, JSONObject options, boolean directory) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + return fs.getFileForLocalURL(inputURL, path, options, directory); + + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + + } + + /** + * Look up the parent DirectoryEntry containing this Entry. + * If this Entry is the root of its filesystem, its parent is itself. + */ + private JSONObject getParent(String baseURLstr) throws JSONException, IOException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + return fs.getParentForLocalURL(inputURL); + + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + } + + /** + * Returns a File that represents the current state of the file that this FileEntry represents. + * + * @return returns a JSONObject represent a W3C File object + */ + private JSONObject getFileMetadata(String baseURLstr) throws FileNotFoundException, JSONException, MalformedURLException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + return fs.getFileMetadataForLocalURL(inputURL); + + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + } + + /** + * Requests a filesystem in which to store application data. + * + * @param type of file system requested + * @param requiredSize required free space in the file system in bytes + * @param callbackContext context for returning the result or error + * @throws JSONException + */ + private void requestFileSystem(int type, long requiredSize, final CallbackContext callbackContext) throws JSONException { + Filesystem rootFs = null; + try { + rootFs = this.filesystems.get(type); + } catch (ArrayIndexOutOfBoundsException e) { + // Pass null through + } + if (rootFs == null) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, FileUtils.NOT_FOUND_ERR)); + } else { + // If a nonzero required size was specified, check that the retrieved filesystem has enough free space. + long availableSize = 0; + if (requiredSize > 0) { + availableSize = rootFs.getFreeSpaceInBytes(); + } + + if (availableSize < requiredSize) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, FileUtils.QUOTA_EXCEEDED_ERR)); + } else { + JSONObject fs = new JSONObject(); + fs.put("name", rootFs.name); + fs.put("root", rootFs.getRootEntry()); + callbackContext.success(fs); + } + } + } + + /** + * Requests a filesystem in which to store application data. + * + * @return a JSONObject representing the file system + */ + private JSONArray requestAllFileSystems() throws IOException, JSONException { + JSONArray ret = new JSONArray(); + for (Filesystem fs : filesystems) { + ret.put(fs.getRootEntry()); + } + return ret; + } + + private static String toDirUrl(File f) { + return Uri.fromFile(f).toString() + '/'; + } + + private JSONObject requestAllPaths() throws JSONException { + Context context = cordova.getActivity(); + JSONObject ret = new JSONObject(); + ret.put("applicationDirectory", "file:///android_asset/"); + ret.put("applicationStorageDirectory", toDirUrl(context.getFilesDir().getParentFile())); + ret.put("dataDirectory", toDirUrl(context.getFilesDir())); + ret.put("cacheDirectory", toDirUrl(context.getCacheDir())); + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + try { + ret.put("externalApplicationStorageDirectory", toDirUrl(context.getExternalFilesDir(null).getParentFile())); + ret.put("externalDataDirectory", toDirUrl(context.getExternalFilesDir(null))); + ret.put("externalCacheDirectory", toDirUrl(context.getExternalCacheDir())); + ret.put("externalRootDirectory", toDirUrl(Environment.getExternalStorageDirectory())); + } + catch(NullPointerException e) { + /* If external storage is unavailable, context.getExternal* returns null */ + Log.d(LOG_TAG, "Unable to access these paths, most liklely due to USB storage"); + } + } + return ret; + } + + /** + * Returns a JSON object representing the given File. Internal APIs should be modified + * to use URLs instead of raw FS paths wherever possible, when interfacing with this plugin. + * + * @param file the File to convert + * @return a JSON representation of the given File + * @throws JSONException + */ + public JSONObject getEntryForFile(File file) throws JSONException { + JSONObject entry; + + for (Filesystem fs : filesystems) { + entry = fs.makeEntryForFile(file); + if (entry != null) { + return entry; + } + } + return null; + } + + /** + * Returns a JSON object representing the given File. Deprecated, as this is only used by + * FileTransfer, and because it is a static method that should really be an instance method, + * since it depends on the actual filesystem roots in use. Internal APIs should be modified + * to use URLs instead of raw FS paths wherever possible, when interfacing with this plugin. + * + * @param file the File to convert + * @return a JSON representation of the given File + * @throws JSONException + */ + @Deprecated + public static JSONObject getEntry(File file) throws JSONException { + if (getFilePlugin() != null) { + return getFilePlugin().getEntryForFile(file); + } + return null; + } + + /** + * Read the contents of a file. + * This is done in a background thread; the result is sent to the callback. + * + * @param start Start position in the file. + * @param end End position to stop at (exclusive). + * @param callbackContext The context through which to send the result. + * @param encoding The encoding to return contents as. Typical value is UTF-8. (see http://www.iana.org/assignments/character-sets) + * @param resultType The desired type of data to send to the callback. + * @return Contents of file. + */ + public void readFileAs(final String srcURLstr, final int start, final int end, final CallbackContext callbackContext, final String encoding, final int resultType) throws MalformedURLException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(srcURLstr); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + + fs.readFileAtURL(inputURL, start, end, new Filesystem.ReadFileCallback() { + public void handleData(InputStream inputStream, String contentType) { + try { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + final int BUFFER_SIZE = 8192; + byte[] buffer = new byte[BUFFER_SIZE]; + + for (;;) { + int bytesRead = inputStream.read(buffer, 0, BUFFER_SIZE); + + if (bytesRead <= 0) { + break; + } + os.write(buffer, 0, bytesRead); + } + + PluginResult result; + switch (resultType) { + case PluginResult.MESSAGE_TYPE_STRING: + result = new PluginResult(PluginResult.Status.OK, os.toString(encoding)); + break; + case PluginResult.MESSAGE_TYPE_ARRAYBUFFER: + result = new PluginResult(PluginResult.Status.OK, os.toByteArray()); + break; + case PluginResult.MESSAGE_TYPE_BINARYSTRING: + result = new PluginResult(PluginResult.Status.OK, os.toByteArray(), true); + break; + default: // Base64. + byte[] base64 = Base64.encode(os.toByteArray(), Base64.NO_WRAP); + String s = "data:" + contentType + ";base64," + new String(base64, "US-ASCII"); + result = new PluginResult(PluginResult.Status.OK, s); + } + + callbackContext.sendPluginResult(result); + } catch (IOException e) { + Log.d(LOG_TAG, e.getLocalizedMessage()); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, NOT_READABLE_ERR)); + } + } + }); + + + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } catch (FileNotFoundException e) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, NOT_FOUND_ERR)); + } catch (IOException e) { + Log.d(LOG_TAG, e.getLocalizedMessage()); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, NOT_READABLE_ERR)); + } + } + + + /** + * Write contents of file. + * + * @param data The contents of the file. + * @param offset The position to begin writing the file. + * @param isBinary True if the file contents are base64-encoded binary data + */ + /**/ + public long write(String srcURLstr, String data, int offset, boolean isBinary) throws FileNotFoundException, IOException, NoModificationAllowedException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(srcURLstr); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + + long x = fs.writeToFileAtURL(inputURL, data, offset, isBinary); Log.d("TEST",srcURLstr + ": "+x); return x; + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + + } + + /** + * Truncate the file to size + */ + private long truncateFile(String srcURLstr, long size) throws FileNotFoundException, IOException, NoModificationAllowedException { + try { + LocalFilesystemURL inputURL = LocalFilesystemURL.parse(srcURLstr); + Filesystem fs = this.filesystemForURL(inputURL); + if (fs == null) { + throw new MalformedURLException("No installed handlers for this URL"); + } + + return fs.truncateFileAtURL(inputURL, size); + } catch (IllegalArgumentException e) { + throw new MalformedURLException("Unrecognized filesystem URL"); + } + } + + + /* + * Handle the response + */ + + public void onRequestPermissionResult(int requestCode, String[] permissions, + int[] grantResults) throws JSONException { + + final PendingRequests.Request req = pendingRequests.getAndRemove(requestCode); + if (req != null) { + for(int r:grantResults) + { + if(r == PackageManager.PERMISSION_DENIED) + { + req.getCallbackContext().sendPluginResult(new PluginResult(PluginResult.Status.ERROR, SECURITY_ERR)); + return; + } + } + switch(req.getAction()) + { + case ACTION_GET_FILE: + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException { + String dirname = args.getString(0); + + String path = args.getString(1); + JSONObject obj = getFile(dirname, path, args.optJSONObject(2), false); + req.getCallbackContext().success(obj); + } + }, req.getRawArgs(), req.getCallbackContext()); + break; + case ACTION_GET_DIRECTORY: + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException { + String dirname = args.getString(0); + + String path = args.getString(1); + JSONObject obj = getFile(dirname, path, args.optJSONObject(2), true); + req.getCallbackContext().success(obj); + } + }, req.getRawArgs(), req.getCallbackContext()); + break; + case ACTION_WRITE: + threadhelper( new FileOp( ){ + public void run(JSONArray args) throws JSONException, FileNotFoundException, IOException, NoModificationAllowedException { + String fname=args.getString(0); + String data=args.getString(1); + int offset=args.getInt(2); + Boolean isBinary=args.getBoolean(3); + long fileSize = write(fname, data, offset, isBinary); + req.getCallbackContext().sendPluginResult(new PluginResult(PluginResult.Status.OK, fileSize)); + } + }, req.getRawArgs(), req.getCallbackContext()); + break; + } + } else { + Log.d(LOG_TAG, "Received permission callback for unknown request code"); + } + } +} diff --git a/platforms/android/src/org/apache/cordova/file/Filesystem.java b/platforms/android/src/org/apache/cordova/file/Filesystem.java new file mode 100644 index 0000000..c69d3bd --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/Filesystem.java @@ -0,0 +1,331 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.cordova.file; + +import android.net.Uri; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; + +import org.apache.cordova.CordovaResourceApi; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public abstract class Filesystem { + + protected final Uri rootUri; + protected final CordovaResourceApi resourceApi; + public final String name; + private JSONObject rootEntry; + + public Filesystem(Uri rootUri, String name, CordovaResourceApi resourceApi) { + this.rootUri = rootUri; + this.name = name; + this.resourceApi = resourceApi; + } + + public interface ReadFileCallback { + public void handleData(InputStream inputStream, String contentType) throws IOException; + } + + public static JSONObject makeEntryForURL(LocalFilesystemURL inputURL, Uri nativeURL) { + try { + String path = inputURL.path; + int end = path.endsWith("/") ? 1 : 0; + String[] parts = path.substring(0, path.length() - end).split("/+"); + String fileName = parts[parts.length - 1]; + + JSONObject entry = new JSONObject(); + entry.put("isFile", !inputURL.isDirectory); + entry.put("isDirectory", inputURL.isDirectory); + entry.put("name", fileName); + entry.put("fullPath", path); + // The file system can't be specified, as it would lead to an infinite loop, + // but the filesystem name can be. + entry.put("filesystemName", inputURL.fsName); + // Backwards compatibility + entry.put("filesystem", "temporary".equals(inputURL.fsName) ? 0 : 1); + + String nativeUrlStr = nativeURL.toString(); + if (inputURL.isDirectory && !nativeUrlStr.endsWith("/")) { + nativeUrlStr += "/"; + } + entry.put("nativeURL", nativeUrlStr); + return entry; + } catch (JSONException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public JSONObject makeEntryForURL(LocalFilesystemURL inputURL) { + Uri nativeUri = toNativeUri(inputURL); + return nativeUri == null ? null : makeEntryForURL(inputURL, nativeUri); + } + + public JSONObject makeEntryForNativeUri(Uri nativeUri) { + LocalFilesystemURL inputUrl = toLocalUri(nativeUri); + return inputUrl == null ? null : makeEntryForURL(inputUrl, nativeUri); + } + + public JSONObject getEntryForLocalURL(LocalFilesystemURL inputURL) throws IOException { + return makeEntryForURL(inputURL); + } + + public JSONObject makeEntryForFile(File file) { + return makeEntryForNativeUri(Uri.fromFile(file)); + } + + abstract JSONObject getFileForLocalURL(LocalFilesystemURL inputURL, String path, + JSONObject options, boolean directory) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException; + + abstract boolean removeFileAtLocalURL(LocalFilesystemURL inputURL) throws InvalidModificationException, NoModificationAllowedException; + + abstract boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL) throws FileExistsException, NoModificationAllowedException; + + abstract LocalFilesystemURL[] listChildren(LocalFilesystemURL inputURL) throws FileNotFoundException; + + public final JSONArray readEntriesAtLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException { + LocalFilesystemURL[] children = listChildren(inputURL); + JSONArray entries = new JSONArray(); + if (children != null) { + for (LocalFilesystemURL url : children) { + entries.put(makeEntryForURL(url)); + } + } + return entries; + } + + abstract JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException; + + public Uri getRootUri() { + return rootUri; + } + + public boolean exists(LocalFilesystemURL inputURL) { + try { + getFileMetadataForLocalURL(inputURL); + } catch (FileNotFoundException e) { + return false; + } + return true; + } + + public Uri nativeUriForFullPath(String fullPath) { + Uri ret = null; + if (fullPath != null) { + String encodedPath = Uri.fromFile(new File(fullPath)).getEncodedPath(); + if (encodedPath.startsWith("/")) { + encodedPath = encodedPath.substring(1); + } + ret = rootUri.buildUpon().appendEncodedPath(encodedPath).build(); + } + return ret; + } + + public LocalFilesystemURL localUrlforFullPath(String fullPath) { + Uri nativeUri = nativeUriForFullPath(fullPath); + if (nativeUri != null) { + return toLocalUri(nativeUri); + } + return null; + } + + /** + * Removes multiple repeated //s, and collapses processes ../s. + */ + protected static String normalizePath(String rawPath) { + // If this is an absolute path, trim the leading "/" and replace it later + boolean isAbsolutePath = rawPath.startsWith("/"); + if (isAbsolutePath) { + rawPath = rawPath.replaceFirst("/+", ""); + } + ArrayList components = new ArrayList(Arrays.asList(rawPath.split("/+"))); + for (int index = 0; index < components.size(); ++index) { + if (components.get(index).equals("..")) { + components.remove(index); + if (index > 0) { + components.remove(index-1); + --index; + } + } + } + StringBuilder normalizedPath = new StringBuilder(); + for(String component: components) { + normalizedPath.append("/"); + normalizedPath.append(component); + } + if (isAbsolutePath) { + return normalizedPath.toString(); + } else { + return normalizedPath.toString().substring(1); + } + } + + /** + * Gets the free space in bytes available on this filesystem. + * Subclasses may override this method to return nonzero free space. + */ + public long getFreeSpaceInBytes() { + return 0; + } + + public abstract Uri toNativeUri(LocalFilesystemURL inputURL); + public abstract LocalFilesystemURL toLocalUri(Uri inputURL); + + public JSONObject getRootEntry() { + if (rootEntry == null) { + rootEntry = makeEntryForNativeUri(rootUri); + } + return rootEntry; + } + + public JSONObject getParentForLocalURL(LocalFilesystemURL inputURL) throws IOException { + Uri parentUri = inputURL.uri; + String parentPath = new File(inputURL.uri.getPath()).getParent(); + if (!"/".equals(parentPath)) { + parentUri = inputURL.uri.buildUpon().path(parentPath + '/').build(); + } + return getEntryForLocalURL(LocalFilesystemURL.parse(parentUri)); + } + + protected LocalFilesystemURL makeDestinationURL(String newName, LocalFilesystemURL srcURL, LocalFilesystemURL destURL, boolean isDirectory) { + // I know this looks weird but it is to work around a JSON bug. + if ("null".equals(newName) || "".equals(newName)) { + newName = srcURL.uri.getLastPathSegment();; + } + + String newDest = destURL.uri.toString(); + if (newDest.endsWith("/")) { + newDest = newDest + newName; + } else { + newDest = newDest + "/" + newName; + } + if (isDirectory) { + newDest += '/'; + } + return LocalFilesystemURL.parse(newDest); + } + + /* Read a source URL (possibly from a different filesystem, srcFs,) and copy it to + * the destination URL on this filesystem, optionally with a new filename. + * If move is true, then this method should either perform an atomic move operation + * or remove the source file when finished. + */ + public JSONObject copyFileToURL(LocalFilesystemURL destURL, String newName, + Filesystem srcFs, LocalFilesystemURL srcURL, boolean move) throws IOException, InvalidModificationException, JSONException, NoModificationAllowedException, FileExistsException { + // First, check to see that we can do it + if (move && !srcFs.canRemoveFileAtLocalURL(srcURL)) { + throw new NoModificationAllowedException("Cannot move file at source URL"); + } + final LocalFilesystemURL destination = makeDestinationURL(newName, srcURL, destURL, srcURL.isDirectory); + + Uri srcNativeUri = srcFs.toNativeUri(srcURL); + + CordovaResourceApi.OpenForReadResult ofrr = resourceApi.openForRead(srcNativeUri); + OutputStream os = null; + try { + os = getOutputStreamForURL(destination); + } catch (IOException e) { + ofrr.inputStream.close(); + throw e; + } + // Closes streams. + resourceApi.copyResource(ofrr, os); + + if (move) { + srcFs.removeFileAtLocalURL(srcURL); + } + return getEntryForLocalURL(destination); + } + + public OutputStream getOutputStreamForURL(LocalFilesystemURL inputURL) throws IOException { + return resourceApi.openOutputStream(toNativeUri(inputURL)); + } + + public void readFileAtURL(LocalFilesystemURL inputURL, long start, long end, + ReadFileCallback readFileCallback) throws IOException { + CordovaResourceApi.OpenForReadResult ofrr = resourceApi.openForRead(toNativeUri(inputURL)); + if (end < 0) { + end = ofrr.length; + } + long numBytesToRead = end - start; + try { + if (start > 0) { + ofrr.inputStream.skip(start); + } + InputStream inputStream = ofrr.inputStream; + if (end < ofrr.length) { + inputStream = new LimitedInputStream(inputStream, numBytesToRead); + } + readFileCallback.handleData(inputStream, ofrr.mimeType); + } finally { + ofrr.inputStream.close(); + } + } + + abstract long writeToFileAtURL(LocalFilesystemURL inputURL, String data, int offset, + boolean isBinary) throws NoModificationAllowedException, IOException; + + abstract long truncateFileAtURL(LocalFilesystemURL inputURL, long size) + throws IOException, NoModificationAllowedException; + + // This method should return null if filesystem urls cannot be mapped to paths + abstract String filesystemPathForURL(LocalFilesystemURL url); + + abstract LocalFilesystemURL URLforFilesystemPath(String path); + + abstract boolean canRemoveFileAtLocalURL(LocalFilesystemURL inputURL); + + protected class LimitedInputStream extends FilterInputStream { + long numBytesToRead; + public LimitedInputStream(InputStream in, long numBytesToRead) { + super(in); + this.numBytesToRead = numBytesToRead; + } + @Override + public int read() throws IOException { + if (numBytesToRead <= 0) { + return -1; + } + numBytesToRead--; + return in.read(); + } + @Override + public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException { + if (numBytesToRead <= 0) { + return -1; + } + int bytesToRead = byteCount; + if (byteCount > numBytesToRead) { + bytesToRead = (int)numBytesToRead; // Cast okay; long is less than int here. + } + int numBytesRead = in.read(buffer, byteOffset, bytesToRead); + numBytesToRead -= numBytesRead; + return numBytesRead; + } + } +} diff --git a/platforms/android/src/org/apache/cordova/file/InvalidModificationException.java b/platforms/android/src/org/apache/cordova/file/InvalidModificationException.java new file mode 100644 index 0000000..8f6bec5 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/InvalidModificationException.java @@ -0,0 +1,30 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + + +package org.apache.cordova.file; + +@SuppressWarnings("serial") +public class InvalidModificationException extends Exception { + + public InvalidModificationException(String message) { + super(message); + } + +} diff --git a/platforms/android/src/org/apache/cordova/file/LocalFilesystem.java b/platforms/android/src/org/apache/cordova/file/LocalFilesystem.java new file mode 100644 index 0000000..9325fab --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/LocalFilesystem.java @@ -0,0 +1,510 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.cordova.file; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.nio.channels.FileChannel; +import org.apache.cordova.CordovaResourceApi; +import org.json.JSONException; +import org.json.JSONObject; + +import android.os.Build; +import android.os.Environment; +import android.util.Base64; +import android.net.Uri; +import android.content.Context; +import android.content.Intent; + +public class LocalFilesystem extends Filesystem { + private final Context context; + + public LocalFilesystem(String name, Context context, CordovaResourceApi resourceApi, File fsRoot) { + super(Uri.fromFile(fsRoot).buildUpon().appendEncodedPath("").build(), name, resourceApi); + this.context = context; + } + + public String filesystemPathForFullPath(String fullPath) { + return new File(rootUri.getPath(), fullPath).toString(); + } + + @Override + public String filesystemPathForURL(LocalFilesystemURL url) { + return filesystemPathForFullPath(url.path); + } + + private String fullPathForFilesystemPath(String absolutePath) { + if (absolutePath != null && absolutePath.startsWith(rootUri.getPath())) { + return absolutePath.substring(rootUri.getPath().length() - 1); + } + return null; + } + + @Override + public Uri toNativeUri(LocalFilesystemURL inputURL) { + return nativeUriForFullPath(inputURL.path); + } + + @Override + public LocalFilesystemURL toLocalUri(Uri inputURL) { + if (!"file".equals(inputURL.getScheme())) { + return null; + } + File f = new File(inputURL.getPath()); + // Removes and duplicate /s (e.g. file:///a//b/c) + Uri resolvedUri = Uri.fromFile(f); + String rootUriNoTrailingSlash = rootUri.getEncodedPath(); + rootUriNoTrailingSlash = rootUriNoTrailingSlash.substring(0, rootUriNoTrailingSlash.length() - 1); + if (!resolvedUri.getEncodedPath().startsWith(rootUriNoTrailingSlash)) { + return null; + } + String subPath = resolvedUri.getEncodedPath().substring(rootUriNoTrailingSlash.length()); + // Strip leading slash + if (!subPath.isEmpty()) { + subPath = subPath.substring(1); + } + Uri.Builder b = new Uri.Builder() + .scheme(LocalFilesystemURL.FILESYSTEM_PROTOCOL) + .authority("localhost") + .path(name); + if (!subPath.isEmpty()) { + b.appendEncodedPath(subPath); + } + if (f.isDirectory()) { + // Add trailing / for directories. + b.appendEncodedPath(""); + } + return LocalFilesystemURL.parse(b.build()); + } + + @Override + public LocalFilesystemURL URLforFilesystemPath(String path) { + return localUrlforFullPath(fullPathForFilesystemPath(path)); + } + + @Override + public JSONObject getFileForLocalURL(LocalFilesystemURL inputURL, + String path, JSONObject options, boolean directory) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException { + boolean create = false; + boolean exclusive = false; + + if (options != null) { + create = options.optBoolean("create"); + if (create) { + exclusive = options.optBoolean("exclusive"); + } + } + + // Check for a ":" character in the file to line up with BB and iOS + if (path.contains(":")) { + throw new EncodingException("This path has an invalid \":\" in it."); + } + + LocalFilesystemURL requestedURL; + + // Check whether the supplied path is absolute or relative + if (directory && !path.endsWith("/")) { + path += "/"; + } + if (path.startsWith("/")) { + requestedURL = localUrlforFullPath(normalizePath(path)); + } else { + requestedURL = localUrlforFullPath(normalizePath(inputURL.path + "/" + path)); + } + + File fp = new File(this.filesystemPathForURL(requestedURL)); + + if (create) { + if (exclusive && fp.exists()) { + throw new FileExistsException("create/exclusive fails"); + } + if (directory) { + fp.mkdir(); + } else { + fp.createNewFile(); + } + if (!fp.exists()) { + throw new FileExistsException("create fails"); + } + } + else { + if (!fp.exists()) { + throw new FileNotFoundException("path does not exist"); + } + if (directory) { + if (fp.isFile()) { + throw new TypeMismatchException("path doesn't exist or is file"); + } + } else { + if (fp.isDirectory()) { + throw new TypeMismatchException("path doesn't exist or is directory"); + } + } + } + + // Return the directory + return makeEntryForURL(requestedURL); + } + + @Override + public boolean removeFileAtLocalURL(LocalFilesystemURL inputURL) throws InvalidModificationException { + + File fp = new File(filesystemPathForURL(inputURL)); + + // You can't delete a directory that is not empty + if (fp.isDirectory() && fp.list().length > 0) { + throw new InvalidModificationException("You can't delete a directory that is not empty."); + } + + return fp.delete(); + } + + @Override + public boolean exists(LocalFilesystemURL inputURL) { + File fp = new File(filesystemPathForURL(inputURL)); + return fp.exists(); + } + + @Override + public long getFreeSpaceInBytes() { + return DirectoryManager.getFreeSpaceInBytes(rootUri.getPath()); + } + + @Override + public boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL) throws FileExistsException { + File directory = new File(filesystemPathForURL(inputURL)); + return removeDirRecursively(directory); + } + + protected boolean removeDirRecursively(File directory) throws FileExistsException { + if (directory.isDirectory()) { + for (File file : directory.listFiles()) { + removeDirRecursively(file); + } + } + + if (!directory.delete()) { + throw new FileExistsException("could not delete: " + directory.getName()); + } else { + return true; + } + } + + @Override + public LocalFilesystemURL[] listChildren(LocalFilesystemURL inputURL) throws FileNotFoundException { + File fp = new File(filesystemPathForURL(inputURL)); + + if (!fp.exists()) { + // The directory we are listing doesn't exist so we should fail. + throw new FileNotFoundException(); + } + + File[] files = fp.listFiles(); + if (files == null) { + // inputURL is a directory + return null; + } + LocalFilesystemURL[] entries = new LocalFilesystemURL[files.length]; + for (int i = 0; i < files.length; i++) { + entries[i] = URLforFilesystemPath(files[i].getPath()); + } + + return entries; + } + + @Override + public JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException { + File file = new File(filesystemPathForURL(inputURL)); + + if (!file.exists()) { + throw new FileNotFoundException("File at " + inputURL.uri + " does not exist."); + } + + JSONObject metadata = new JSONObject(); + try { + // Ensure that directories report a size of 0 + metadata.put("size", file.isDirectory() ? 0 : file.length()); + metadata.put("type", resourceApi.getMimeType(Uri.fromFile(file))); + metadata.put("name", file.getName()); + metadata.put("fullPath", inputURL.path); + metadata.put("lastModifiedDate", file.lastModified()); + } catch (JSONException e) { + return null; + } + return metadata; + } + + private void copyFile(Filesystem srcFs, LocalFilesystemURL srcURL, File destFile, boolean move) throws IOException, InvalidModificationException, NoModificationAllowedException { + if (move) { + String realSrcPath = srcFs.filesystemPathForURL(srcURL); + if (realSrcPath != null) { + File srcFile = new File(realSrcPath); + if (srcFile.renameTo(destFile)) { + return; + } + // Trying to rename the file failed. Possibly because we moved across file system on the device. + } + } + + CordovaResourceApi.OpenForReadResult offr = resourceApi.openForRead(srcFs.toNativeUri(srcURL)); + copyResource(offr, new FileOutputStream(destFile)); + + if (move) { + srcFs.removeFileAtLocalURL(srcURL); + } + } + + private void copyDirectory(Filesystem srcFs, LocalFilesystemURL srcURL, File dstDir, boolean move) throws IOException, NoModificationAllowedException, InvalidModificationException, FileExistsException { + if (move) { + String realSrcPath = srcFs.filesystemPathForURL(srcURL); + if (realSrcPath != null) { + File srcDir = new File(realSrcPath); + // If the destination directory already exists and is empty then delete it. This is according to spec. + if (dstDir.exists()) { + if (dstDir.list().length > 0) { + throw new InvalidModificationException("directory is not empty"); + } + dstDir.delete(); + } + // Try to rename the directory + if (srcDir.renameTo(dstDir)) { + return; + } + // Trying to rename the file failed. Possibly because we moved across file system on the device. + } + } + + if (dstDir.exists()) { + if (dstDir.list().length > 0) { + throw new InvalidModificationException("directory is not empty"); + } + } else { + if (!dstDir.mkdir()) { + // If we can't create the directory then fail + throw new NoModificationAllowedException("Couldn't create the destination directory"); + } + } + + LocalFilesystemURL[] children = srcFs.listChildren(srcURL); + for (LocalFilesystemURL childLocalUrl : children) { + File target = new File(dstDir, new File(childLocalUrl.path).getName()); + if (childLocalUrl.isDirectory) { + copyDirectory(srcFs, childLocalUrl, target, false); + } else { + copyFile(srcFs, childLocalUrl, target, false); + } + } + + if (move) { + srcFs.recursiveRemoveFileAtLocalURL(srcURL); + } + } + + @Override + public JSONObject copyFileToURL(LocalFilesystemURL destURL, String newName, + Filesystem srcFs, LocalFilesystemURL srcURL, boolean move) throws IOException, InvalidModificationException, JSONException, NoModificationAllowedException, FileExistsException { + + // Check to see if the destination directory exists + String newParent = this.filesystemPathForURL(destURL); + File destinationDir = new File(newParent); + if (!destinationDir.exists()) { + // The destination does not exist so we should fail. + throw new FileNotFoundException("The source does not exist"); + } + + // Figure out where we should be copying to + final LocalFilesystemURL destinationURL = makeDestinationURL(newName, srcURL, destURL, srcURL.isDirectory); + + Uri dstNativeUri = toNativeUri(destinationURL); + Uri srcNativeUri = srcFs.toNativeUri(srcURL); + // Check to see if source and destination are the same file + if (dstNativeUri.equals(srcNativeUri)) { + throw new InvalidModificationException("Can't copy onto itself"); + } + + if (move && !srcFs.canRemoveFileAtLocalURL(srcURL)) { + throw new InvalidModificationException("Source URL is read-only (cannot move)"); + } + + File destFile = new File(dstNativeUri.getPath()); + if (destFile.exists()) { + if (!srcURL.isDirectory && destFile.isDirectory()) { + throw new InvalidModificationException("Can't copy/move a file to an existing directory"); + } else if (srcURL.isDirectory && destFile.isFile()) { + throw new InvalidModificationException("Can't copy/move a directory to an existing file"); + } + } + + if (srcURL.isDirectory) { + // E.g. Copy /sdcard/myDir to /sdcard/myDir/backup + if (dstNativeUri.toString().startsWith(srcNativeUri.toString() + '/')) { + throw new InvalidModificationException("Can't copy directory into itself"); + } + copyDirectory(srcFs, srcURL, destFile, move); + } else { + copyFile(srcFs, srcURL, destFile, move); + } + return makeEntryForURL(destinationURL); + } + + @Override + public long writeToFileAtURL(LocalFilesystemURL inputURL, String data, + int offset, boolean isBinary) throws IOException, NoModificationAllowedException { + + boolean append = false; + if (offset > 0) { + this.truncateFileAtURL(inputURL, offset); + append = true; + } + + byte[] rawData; + if (isBinary) { + rawData = Base64.decode(data, Base64.DEFAULT); + } else { + rawData = data.getBytes(); + } + ByteArrayInputStream in = new ByteArrayInputStream(rawData); + try + { + byte buff[] = new byte[rawData.length]; + String absolutePath = filesystemPathForURL(inputURL); + FileOutputStream out = new FileOutputStream(absolutePath, append); + try { + in.read(buff, 0, buff.length); + out.write(buff, 0, rawData.length); + out.flush(); + } finally { + // Always close the output + out.close(); + } + if (isPublicDirectory(absolutePath)) { + broadcastNewFile(Uri.fromFile(new File(absolutePath))); + } + } + catch (NullPointerException e) + { + // This is a bug in the Android implementation of the Java Stack + NoModificationAllowedException realException = new NoModificationAllowedException(inputURL.toString()); + throw realException; + } + + return rawData.length; + } + + private boolean isPublicDirectory(String absolutePath) { + // TODO: should expose a way to scan app's private files (maybe via a flag). + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + // Lollipop has a bug where SD cards are null. + for (File f : context.getExternalMediaDirs()) { + if(f != null && absolutePath.startsWith(f.getAbsolutePath())) { + return true; + } + } + } + + String extPath = Environment.getExternalStorageDirectory().getAbsolutePath(); + return absolutePath.startsWith(extPath); + } + + /** + * Send broadcast of new file so files appear over MTP + */ + private void broadcastNewFile(Uri nativeUri) { + Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, nativeUri); + context.sendBroadcast(intent); + } + + @Override + public long truncateFileAtURL(LocalFilesystemURL inputURL, long size) throws IOException { + File file = new File(filesystemPathForURL(inputURL)); + + if (!file.exists()) { + throw new FileNotFoundException("File at " + inputURL.uri + " does not exist."); + } + + RandomAccessFile raf = new RandomAccessFile(filesystemPathForURL(inputURL), "rw"); + try { + if (raf.length() >= size) { + FileChannel channel = raf.getChannel(); + channel.truncate(size); + return size; + } + + return raf.length(); + } finally { + raf.close(); + } + + + } + + @Override + public boolean canRemoveFileAtLocalURL(LocalFilesystemURL inputURL) { + String path = filesystemPathForURL(inputURL); + File file = new File(path); + return file.exists(); + } + + // This is a copy & paste from CordovaResource API that is required since CordovaResourceApi + // has a bug pre-4.0.0. + // TODO: Once cordova-android@4.0.0 is released, delete this copy and make the plugin depend on + // 4.0.0 with an engine tag. + private static void copyResource(CordovaResourceApi.OpenForReadResult input, OutputStream outputStream) throws IOException { + try { + InputStream inputStream = input.inputStream; + if (inputStream instanceof FileInputStream && outputStream instanceof FileOutputStream) { + FileChannel inChannel = ((FileInputStream)input.inputStream).getChannel(); + FileChannel outChannel = ((FileOutputStream)outputStream).getChannel(); + long offset = 0; + long length = input.length; + if (input.assetFd != null) { + offset = input.assetFd.getStartOffset(); + } + // transferFrom()'s 2nd arg is a relative position. Need to set the absolute + // position first. + inChannel.position(offset); + outChannel.transferFrom(inChannel, 0, length); + } else { + final int BUFFER_SIZE = 8192; + byte[] buffer = new byte[BUFFER_SIZE]; + + for (;;) { + int bytesRead = inputStream.read(buffer, 0, BUFFER_SIZE); + + if (bytesRead <= 0) { + break; + } + outputStream.write(buffer, 0, bytesRead); + } + } + } finally { + input.inputStream.close(); + if (outputStream != null) { + outputStream.close(); + } + } + } +} diff --git a/platforms/android/src/org/apache/cordova/file/LocalFilesystemURL.java b/platforms/android/src/org/apache/cordova/file/LocalFilesystemURL.java new file mode 100644 index 0000000..b96b6ee --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/LocalFilesystemURL.java @@ -0,0 +1,64 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.cordova.file; + +import android.net.Uri; + +public class LocalFilesystemURL { + + public static final String FILESYSTEM_PROTOCOL = "cdvfile"; + + public final Uri uri; + public final String fsName; + public final String path; + public final boolean isDirectory; + + private LocalFilesystemURL(Uri uri, String fsName, String fsPath, boolean isDirectory) { + this.uri = uri; + this.fsName = fsName; + this.path = fsPath; + this.isDirectory = isDirectory; + } + + public static LocalFilesystemURL parse(Uri uri) { + if (!FILESYSTEM_PROTOCOL.equals(uri.getScheme())) { + return null; + } + String path = uri.getPath(); + if (path.length() < 1) { + return null; + } + int firstSlashIdx = path.indexOf('/', 1); + if (firstSlashIdx < 0) { + return null; + } + String fsName = path.substring(1, firstSlashIdx); + path = path.substring(firstSlashIdx); + boolean isDirectory = path.charAt(path.length() - 1) == '/'; + return new LocalFilesystemURL(uri, fsName, path, isDirectory); + } + + public static LocalFilesystemURL parse(String uri) { + return parse(Uri.parse(uri)); + } + + public String toString() { + return uri.toString(); + } +} diff --git a/platforms/android/src/org/apache/cordova/file/NoModificationAllowedException.java b/platforms/android/src/org/apache/cordova/file/NoModificationAllowedException.java new file mode 100644 index 0000000..627eafb --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/NoModificationAllowedException.java @@ -0,0 +1,29 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.file; + +@SuppressWarnings("serial") +public class NoModificationAllowedException extends Exception { + + public NoModificationAllowedException(String message) { + super(message); + } + +} diff --git a/platforms/android/src/org/apache/cordova/file/PendingRequests.java b/platforms/android/src/org/apache/cordova/file/PendingRequests.java new file mode 100644 index 0000000..4c75f42 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/PendingRequests.java @@ -0,0 +1,94 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.file; + +import android.util.SparseArray; + +import org.apache.cordova.CallbackContext; + +/** + * Holds pending runtime permission requests + */ +class PendingRequests { + private int currentReqId = 0; + private SparseArray requests = new SparseArray(); + + /** + * Creates a request and adds it to the array of pending requests. Each created request gets a + * unique result code for use with requestPermission() + * @param rawArgs The raw arguments passed to the plugin + * @param action The action this request corresponds to (get file, etc.) + * @param callbackContext The CallbackContext for this plugin call + * @return The request code that can be used to retrieve the Request object + */ + public synchronized int createRequest(String rawArgs, int action, CallbackContext callbackContext) { + Request req = new Request(rawArgs, action, callbackContext); + requests.put(req.requestCode, req); + return req.requestCode; + } + + /** + * Gets the request corresponding to this request code and removes it from the pending requests + * @param requestCode The request code for the desired request + * @return The request corresponding to the given request code or null if such a + * request is not found + */ + public synchronized Request getAndRemove(int requestCode) { + Request result = requests.get(requestCode); + requests.remove(requestCode); + return result; + } + + /** + * Holds the options and CallbackContext for a call made to the plugin. + */ + public class Request { + + // Unique int used to identify this request in any Android permission callback + private int requestCode; + + // Action to be performed after permission request result + private int action; + + // Raw arguments passed to plugin + private String rawArgs; + + // The callback context for this plugin request + private CallbackContext callbackContext; + + private Request(String rawArgs, int action, CallbackContext callbackContext) { + this.rawArgs = rawArgs; + this.action = action; + this.callbackContext = callbackContext; + this.requestCode = currentReqId ++; + } + + public int getAction() { + return this.action; + } + + public String getRawArgs() { + return rawArgs; + } + + public CallbackContext getCallbackContext() { + return callbackContext; + } + } +} diff --git a/platforms/android/src/org/apache/cordova/file/TypeMismatchException.java b/platforms/android/src/org/apache/cordova/file/TypeMismatchException.java new file mode 100644 index 0000000..1315f9a --- /dev/null +++ b/platforms/android/src/org/apache/cordova/file/TypeMismatchException.java @@ -0,0 +1,30 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + + +package org.apache.cordova.file; + +@SuppressWarnings("serial") +public class TypeMismatchException extends Exception { + + public TypeMismatchException(String message) { + super(message); + } + +} diff --git a/platforms/android/src/org/apache/cordova/filetransfer/FileProgressResult.java b/platforms/android/src/org/apache/cordova/filetransfer/FileProgressResult.java new file mode 100644 index 0000000..76a7b13 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/filetransfer/FileProgressResult.java @@ -0,0 +1,63 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.filetransfer; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Encapsulates in-progress status of uploading or downloading a file to a remote server. + */ +public class FileProgressResult { + + private boolean lengthComputable = false; // declares whether total is known + private long loaded = 0; // bytes sent so far + private long total = 0; // bytes total, if known + + public boolean getLengthComputable() { + return lengthComputable; + } + + public void setLengthComputable(boolean computable) { + this.lengthComputable = computable; + } + + public long getLoaded() { + return loaded; + } + + public void setLoaded(long bytes) { + this.loaded = bytes; + } + + public long getTotal() { + return total; + } + + public void setTotal(long bytes) { + this.total = bytes; + } + + public JSONObject toJSONObject() throws JSONException { + return new JSONObject( + "{loaded:" + loaded + + ",total:" + total + + ",lengthComputable:" + (lengthComputable ? "true" : "false") + "}"); + } +} diff --git a/platforms/android/src/org/apache/cordova/filetransfer/FileTransfer.java b/platforms/android/src/org/apache/cordova/filetransfer/FileTransfer.java new file mode 100644 index 0000000..b9b99dc --- /dev/null +++ b/platforms/android/src/org/apache/cordova/filetransfer/FileTransfer.java @@ -0,0 +1,1024 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.filetransfer; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.HttpURLConnection; +import java.net.URLConnection; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.HashMap; +import java.util.Iterator; +import java.util.zip.GZIPInputStream; +import java.util.zip.Inflater; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.apache.cordova.Config; +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaResourceApi; +import org.apache.cordova.CordovaResourceApi.OpenForReadResult; +import org.apache.cordova.PluginManager; +import org.apache.cordova.PluginResult; +import org.apache.cordova.Whitelist; +import org.apache.cordova.file.FileUtils; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.net.Uri; +import android.os.Build; +import android.util.Log; +import android.webkit.CookieManager; + +public class FileTransfer extends CordovaPlugin { + + private static final String LOG_TAG = "FileTransfer"; + private static final String LINE_START = "--"; + private static final String LINE_END = "\r\n"; + private static final String BOUNDARY = "+++++"; + + public static int FILE_NOT_FOUND_ERR = 1; + public static int INVALID_URL_ERR = 2; + public static int CONNECTION_ERR = 3; + public static int ABORTED_ERR = 4; + public static int NOT_MODIFIED_ERR = 5; + + private static HashMap activeRequests = new HashMap(); + private static final int MAX_BUFFER_SIZE = 16 * 1024; + + private static final class RequestContext { + String source; + String target; + File targetFile; + CallbackContext callbackContext; + HttpURLConnection connection; + boolean aborted; + RequestContext(String source, String target, CallbackContext callbackContext) { + this.source = source; + this.target = target; + this.callbackContext = callbackContext; + } + void sendPluginResult(PluginResult pluginResult) { + synchronized (this) { + if (!aborted) { + callbackContext.sendPluginResult(pluginResult); + } + } + } + } + + /** + * Adds an interface method to an InputStream to return the number of bytes + * read from the raw stream. This is used to track total progress against + * the HTTP Content-Length header value from the server. + */ + private static abstract class TrackingInputStream extends FilterInputStream { + public TrackingInputStream(final InputStream in) { + super(in); + } + public abstract long getTotalRawBytesRead(); + } + + private static class ExposedGZIPInputStream extends GZIPInputStream { + public ExposedGZIPInputStream(final InputStream in) throws IOException { + super(in); + } + public Inflater getInflater() { + return inf; + } + } + + /** + * Provides raw bytes-read tracking for a GZIP input stream. Reports the + * total number of compressed bytes read from the input, rather than the + * number of uncompressed bytes. + */ + private static class TrackingGZIPInputStream extends TrackingInputStream { + private ExposedGZIPInputStream gzin; + public TrackingGZIPInputStream(final ExposedGZIPInputStream gzin) throws IOException { + super(gzin); + this.gzin = gzin; + } + public long getTotalRawBytesRead() { + return gzin.getInflater().getBytesRead(); + } + } + + /** + * Provides simple total-bytes-read tracking for an existing InputStream + */ + private static class SimpleTrackingInputStream extends TrackingInputStream { + private long bytesRead = 0; + public SimpleTrackingInputStream(InputStream stream) { + super(stream); + } + + private int updateBytesRead(int newBytesRead) { + if (newBytesRead != -1) { + bytesRead += newBytesRead; + } + return newBytesRead; + } + + @Override + public int read() throws IOException { + return updateBytesRead(super.read()); + } + + // Note: FilterInputStream delegates read(byte[] bytes) to the below method, + // so we don't override it or else double count (CB-5631). + @Override + public int read(byte[] bytes, int offset, int count) throws IOException { + return updateBytesRead(super.read(bytes, offset, count)); + } + + public long getTotalRawBytesRead() { + return bytesRead; + } + } + + @Override + public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { + if (action.equals("upload") || action.equals("download")) { + String source = args.getString(0); + String target = args.getString(1); + + if (action.equals("upload")) { + upload(source, target, args, callbackContext); + } else { + download(source, target, args, callbackContext); + } + return true; + } else if (action.equals("abort")) { + String objectId = args.getString(0); + abort(objectId); + callbackContext.success(); + return true; + } + return false; + } + + private static void addHeadersToRequest(URLConnection connection, JSONObject headers) { + try { + for (Iterator iter = headers.keys(); iter.hasNext(); ) { + /* RFC 2616 says that non-ASCII characters and control + * characters are not allowed in header names or values. + * Additionally, spaces are not allowed in header names. + * RFC 2046 Quoted-printable encoding may be used to encode + * arbitrary characters, but we donon- not do that encoding here. + */ + String headerKey = iter.next().toString(); + String cleanHeaderKey = headerKey.replaceAll("\\n","") + .replaceAll("\\s+","") + .replaceAll(":", "") + .replaceAll("[^\\x20-\\x7E]+", ""); + + JSONArray headerValues = headers.optJSONArray(headerKey); + if (headerValues == null) { + headerValues = new JSONArray(); + + /* RFC 2616 also says that any amount of consecutive linear + * whitespace within a header value can be replaced with a + * single space character, without affecting the meaning of + * that value. + */ + + String headerValue = headers.getString(headerKey); + String finalValue = headerValue.replaceAll("\\s+", " ").replaceAll("\\n"," ").replaceAll("[^\\x20-\\x7E]+", " "); + headerValues.put(finalValue); + } + + //Use the clean header key, not the one that we passed in + connection.setRequestProperty(cleanHeaderKey, headerValues.getString(0)); + for (int i = 1; i < headerValues.length(); ++i) { + connection.addRequestProperty(headerKey, headerValues.getString(i)); + } + } + } catch (JSONException e1) { + // No headers to be manipulated! + } + } + + private String getCookies(final String target) { + boolean gotCookie = false; + String cookie = null; + Class webViewClass = webView.getClass(); + try { + Method gcmMethod = webViewClass.getMethod("getCookieManager"); + Class iccmClass = gcmMethod.getReturnType(); + Method gcMethod = iccmClass.getMethod("getCookie", String.class); + + cookie = (String)gcMethod.invoke( + iccmClass.cast( + gcmMethod.invoke(webView) + ), target); + + gotCookie = true; + } catch (NoSuchMethodException e) { + } catch (IllegalAccessException e) { + } catch (InvocationTargetException e) { + } catch (ClassCastException e) { + } + + if (!gotCookie && CookieManager.getInstance() != null) { + cookie = CookieManager.getInstance().getCookie(target); + } + + return cookie; + } + + /** + * Uploads the specified file to the server URL provided using an HTTP multipart request. + * @param source Full path of the file on the file system + * @param target URL of the server to receive the file + * @param args JSON Array of args + * @param callbackContext callback id for optional progress reports + * + * args[2] fileKey Name of file request parameter + * args[3] fileName File name to be used on server + * args[4] mimeType Describes file content type + * args[5] params key:value pairs of user-defined parameters + * @return FileUploadResult containing result of upload request + */ + private void upload(final String source, final String target, JSONArray args, CallbackContext callbackContext) throws JSONException { + Log.d(LOG_TAG, "upload " + source + " to " + target); + + // Setup the options + final String fileKey = getArgument(args, 2, "file"); + final String fileName = getArgument(args, 3, "image.jpg"); + final String mimeType = getArgument(args, 4, "image/jpeg"); + final JSONObject params = args.optJSONObject(5) == null ? new JSONObject() : args.optJSONObject(5); + final boolean trustEveryone = args.optBoolean(6); + // Always use chunked mode unless set to false as per API + final boolean chunkedMode = args.optBoolean(7) || args.isNull(7); + // Look for headers on the params map for backwards compatibility with older Cordova versions. + final JSONObject headers = args.optJSONObject(8) == null ? params.optJSONObject("headers") : args.optJSONObject(8); + final String objectId = args.getString(9); + final String httpMethod = getArgument(args, 10, "POST"); + + final CordovaResourceApi resourceApi = webView.getResourceApi(); + + Log.d(LOG_TAG, "fileKey: " + fileKey); + Log.d(LOG_TAG, "fileName: " + fileName); + Log.d(LOG_TAG, "mimeType: " + mimeType); + Log.d(LOG_TAG, "params: " + params); + Log.d(LOG_TAG, "trustEveryone: " + trustEveryone); + Log.d(LOG_TAG, "chunkedMode: " + chunkedMode); + Log.d(LOG_TAG, "headers: " + headers); + Log.d(LOG_TAG, "objectId: " + objectId); + Log.d(LOG_TAG, "httpMethod: " + httpMethod); + + final Uri targetUri = resourceApi.remapUri(Uri.parse(target)); + // Accept a path or a URI for the source. + Uri tmpSrc = Uri.parse(source); + final Uri sourceUri = resourceApi.remapUri( + tmpSrc.getScheme() != null ? tmpSrc : Uri.fromFile(new File(source))); + + int uriType = CordovaResourceApi.getUriType(targetUri); + final boolean useHttps = uriType == CordovaResourceApi.URI_TYPE_HTTPS; + if (uriType != CordovaResourceApi.URI_TYPE_HTTP && !useHttps) { + JSONObject error = createFileTransferError(INVALID_URL_ERR, source, target, null, 0, null); + Log.e(LOG_TAG, "Unsupported URI: " + targetUri); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, error)); + return; + } + + final RequestContext context = new RequestContext(source, target, callbackContext); + synchronized (activeRequests) { + activeRequests.put(objectId, context); + } + + cordova.getThreadPool().execute(new Runnable() { + public void run() { + if (context.aborted) { + return; + } + HttpURLConnection conn = null; + HostnameVerifier oldHostnameVerifier = null; + SSLSocketFactory oldSocketFactory = null; + int totalBytes = 0; + int fixedLength = -1; + try { + // Create return object + FileUploadResult result = new FileUploadResult(); + FileProgressResult progress = new FileProgressResult(); + + //------------------ CLIENT REQUEST + // Open a HTTP connection to the URL based on protocol + conn = resourceApi.createHttpConnection(targetUri); + if (useHttps && trustEveryone) { + // Setup the HTTPS connection class to trust everyone + HttpsURLConnection https = (HttpsURLConnection)conn; + oldSocketFactory = trustAllHosts(https); + // Save the current hostnameVerifier + oldHostnameVerifier = https.getHostnameVerifier(); + // Setup the connection not to verify hostnames + https.setHostnameVerifier(DO_NOT_VERIFY); + } + + // Allow Inputs + conn.setDoInput(true); + + // Allow Outputs + conn.setDoOutput(true); + + // Don't use a cached copy. + conn.setUseCaches(false); + + // Use a post method. + conn.setRequestMethod(httpMethod); + + // if we specified a Content-Type header, don't do multipart form upload + boolean multipartFormUpload = (headers == null) || !headers.has("Content-Type"); + if (multipartFormUpload) { + conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); + } + + // Set the cookies on the response + String cookie = getCookies(target); + + if (cookie != null) { + conn.setRequestProperty("Cookie", cookie); + } + + // Handle the other headers + if (headers != null) { + addHeadersToRequest(conn, headers); + } + + /* + * Store the non-file portions of the multipart data as a string, so that we can add it + * to the contentSize, since it is part of the body of the HTTP request. + */ + StringBuilder beforeData = new StringBuilder(); + try { + for (Iterator iter = params.keys(); iter.hasNext();) { + Object key = iter.next(); + if(!String.valueOf(key).equals("headers")) + { + beforeData.append(LINE_START).append(BOUNDARY).append(LINE_END); + beforeData.append("Content-Disposition: form-data; name=\"").append(key.toString()).append('"'); + beforeData.append(LINE_END).append(LINE_END); + beforeData.append(params.getString(key.toString())); + beforeData.append(LINE_END); + } + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + + beforeData.append(LINE_START).append(BOUNDARY).append(LINE_END); + beforeData.append("Content-Disposition: form-data; name=\"").append(fileKey).append("\";"); + beforeData.append(" filename=\"").append(fileName).append('"').append(LINE_END); + beforeData.append("Content-Type: ").append(mimeType).append(LINE_END).append(LINE_END); + byte[] beforeDataBytes = beforeData.toString().getBytes("UTF-8"); + byte[] tailParamsBytes = (LINE_END + LINE_START + BOUNDARY + LINE_START + LINE_END).getBytes("UTF-8"); + + + // Get a input stream of the file on the phone + OpenForReadResult readResult = resourceApi.openForRead(sourceUri); + + int stringLength = beforeDataBytes.length + tailParamsBytes.length; + if (readResult.length >= 0) { + fixedLength = (int)readResult.length; + if (multipartFormUpload) + fixedLength += stringLength; + progress.setLengthComputable(true); + progress.setTotal(fixedLength); + } + Log.d(LOG_TAG, "Content Length: " + fixedLength); + // setFixedLengthStreamingMode causes and OutOfMemoryException on pre-Froyo devices. + // http://code.google.com/p/android/issues/detail?id=3164 + // It also causes OOM if HTTPS is used, even on newer devices. + boolean useChunkedMode = chunkedMode && (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO || useHttps); + useChunkedMode = useChunkedMode || (fixedLength == -1); + + if (useChunkedMode) { + conn.setChunkedStreamingMode(MAX_BUFFER_SIZE); + // Although setChunkedStreamingMode sets this header, setting it explicitly here works + // around an OutOfMemoryException when using https. + conn.setRequestProperty("Transfer-Encoding", "chunked"); + } else { + conn.setFixedLengthStreamingMode(fixedLength); + } + + conn.connect(); + + OutputStream sendStream = null; + try { + sendStream = conn.getOutputStream(); + synchronized (context) { + if (context.aborted) { + return; + } + context.connection = conn; + } + + if (multipartFormUpload) { + //We don't want to change encoding, we just want this to write for all Unicode. + sendStream.write(beforeDataBytes); + totalBytes += beforeDataBytes.length; + } + + // create a buffer of maximum size + int bytesAvailable = readResult.inputStream.available(); + int bufferSize = Math.min(bytesAvailable, MAX_BUFFER_SIZE); + byte[] buffer = new byte[bufferSize]; + + // read file and write it into form... + int bytesRead = readResult.inputStream.read(buffer, 0, bufferSize); + + long prevBytesRead = 0; + while (bytesRead > 0) { + totalBytes += bytesRead; + result.setBytesSent(totalBytes); + sendStream.write(buffer, 0, bytesRead); + if (totalBytes > prevBytesRead + 102400) { + prevBytesRead = totalBytes; + Log.d(LOG_TAG, "Uploaded " + totalBytes + " of " + fixedLength + " bytes"); + } + bytesAvailable = readResult.inputStream.available(); + bufferSize = Math.min(bytesAvailable, MAX_BUFFER_SIZE); + bytesRead = readResult.inputStream.read(buffer, 0, bufferSize); + + // Send a progress event. + progress.setLoaded(totalBytes); + PluginResult progressResult = new PluginResult(PluginResult.Status.OK, progress.toJSONObject()); + progressResult.setKeepCallback(true); + context.sendPluginResult(progressResult); + } + + if (multipartFormUpload) { + // send multipart form data necessary after file data... + sendStream.write(tailParamsBytes); + totalBytes += tailParamsBytes.length; + } + sendStream.flush(); + } finally { + safeClose(readResult.inputStream); + safeClose(sendStream); + } + synchronized (context) { + context.connection = null; + } + Log.d(LOG_TAG, "Sent " + totalBytes + " of " + fixedLength); + + //------------------ read the SERVER RESPONSE + String responseString; + int responseCode = conn.getResponseCode(); + Log.d(LOG_TAG, "response code: " + responseCode); + Log.d(LOG_TAG, "response headers: " + conn.getHeaderFields()); + TrackingInputStream inStream = null; + try { + inStream = getInputStream(conn); + synchronized (context) { + if (context.aborted) { + return; + } + context.connection = conn; + } + + ByteArrayOutputStream out = new ByteArrayOutputStream(Math.max(1024, conn.getContentLength())); + byte[] buffer = new byte[1024]; + int bytesRead = 0; + // write bytes to file + while ((bytesRead = inStream.read(buffer)) > 0) { + out.write(buffer, 0, bytesRead); + } + responseString = out.toString("UTF-8"); + } finally { + synchronized (context) { + context.connection = null; + } + safeClose(inStream); + } + + Log.d(LOG_TAG, "got response from server"); + Log.d(LOG_TAG, responseString.substring(0, Math.min(256, responseString.length()))); + + // send request and retrieve response + result.setResponseCode(responseCode); + result.setResponse(responseString); + + context.sendPluginResult(new PluginResult(PluginResult.Status.OK, result.toJSONObject())); + } catch (FileNotFoundException e) { + JSONObject error = createFileTransferError(FILE_NOT_FOUND_ERR, source, target, conn, e); + Log.e(LOG_TAG, error.toString(), e); + context.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, error)); + } catch (IOException e) { + JSONObject error = createFileTransferError(CONNECTION_ERR, source, target, conn, e); + Log.e(LOG_TAG, error.toString(), e); + Log.e(LOG_TAG, "Failed after uploading " + totalBytes + " of " + fixedLength + " bytes."); + context.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, error)); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + context.sendPluginResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + } catch (Throwable t) { + // Shouldn't happen, but will + JSONObject error = createFileTransferError(CONNECTION_ERR, source, target, conn, t); + Log.e(LOG_TAG, error.toString(), t); + context.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, error)); + } finally { + synchronized (activeRequests) { + activeRequests.remove(objectId); + } + + if (conn != null) { + // Revert back to the proper verifier and socket factories + // Revert back to the proper verifier and socket factories + if (trustEveryone && useHttps) { + HttpsURLConnection https = (HttpsURLConnection) conn; + https.setHostnameVerifier(oldHostnameVerifier); + https.setSSLSocketFactory(oldSocketFactory); + } + } + } + } + }); + } + + private static void safeClose(Closeable stream) { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + } + } + } + + private static TrackingInputStream getInputStream(URLConnection conn) throws IOException { + String encoding = conn.getContentEncoding(); + if (encoding != null && encoding.equalsIgnoreCase("gzip")) { + return new TrackingGZIPInputStream(new ExposedGZIPInputStream(conn.getInputStream())); + } + return new SimpleTrackingInputStream(conn.getInputStream()); + } + + // always verify the host - don't check for certificate + private static final HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + // Create a trust manager that does not validate certificate chains + private static final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[] {}; + } + + public void checkClientTrusted(X509Certificate[] chain, + String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, + String authType) throws CertificateException { + } + } }; + + /** + * This function will install a trust manager that will blindly trust all SSL + * certificates. The reason this code is being added is to enable developers + * to do development using self signed SSL certificates on their web server. + * + * The standard HttpsURLConnection class will throw an exception on self + * signed certificates if this code is not run. + */ + private static SSLSocketFactory trustAllHosts(HttpsURLConnection connection) { + // Install the all-trusting trust manager + SSLSocketFactory oldFactory = connection.getSSLSocketFactory(); + try { + // Install our all trusting manager + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + SSLSocketFactory newFactory = sc.getSocketFactory(); + connection.setSSLSocketFactory(newFactory); + } catch (Exception e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return oldFactory; + } + + private static JSONObject createFileTransferError(int errorCode, String source, String target, URLConnection connection, Throwable throwable) { + + int httpStatus = 0; + StringBuilder bodyBuilder = new StringBuilder(); + String body = null; + if (connection != null) { + try { + if (connection instanceof HttpURLConnection) { + httpStatus = ((HttpURLConnection)connection).getResponseCode(); + InputStream err = ((HttpURLConnection) connection).getErrorStream(); + if(err != null) + { + BufferedReader reader = new BufferedReader(new InputStreamReader(err, "UTF-8")); + try { + String line = reader.readLine(); + while(line != null) { + bodyBuilder.append(line); + line = reader.readLine(); + if(line != null) { + bodyBuilder.append('\n'); + } + } + body = bodyBuilder.toString(); + } finally { + reader.close(); + } + } + } + // IOException can leave connection object in a bad state, so catch all exceptions. + } catch (Throwable e) { + Log.w(LOG_TAG, "Error getting HTTP status code from connection.", e); + } + } + + return createFileTransferError(errorCode, source, target, body, httpStatus, throwable); + } + + /** + * Create an error object based on the passed in errorCode + * @param errorCode the error + * @return JSONObject containing the error + */ + private static JSONObject createFileTransferError(int errorCode, String source, String target, String body, Integer httpStatus, Throwable throwable) { + JSONObject error = null; + try { + error = new JSONObject(); + error.put("code", errorCode); + error.put("source", source); + error.put("target", target); + if(body != null) + { + error.put("body", body); + } + if (httpStatus != null) { + error.put("http_status", httpStatus); + } + if (throwable != null) { + String msg = throwable.getMessage(); + if (msg == null || "".equals(msg)) { + msg = throwable.toString(); + } + error.put("exception", msg); + } + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + } + return error; + } + + /** + * Convenience method to read a parameter from the list of JSON args. + * @param args the args passed to the Plugin + * @param position the position to retrieve the arg from + * @param defaultString the default to be used if the arg does not exist + * @return String with the retrieved value + */ + private static String getArgument(JSONArray args, int position, String defaultString) { + String arg = defaultString; + if (args.length() > position) { + arg = args.optString(position); + if (arg == null || "null".equals(arg)) { + arg = defaultString; + } + } + return arg; + } + + /** + * Downloads a file form a given URL and saves it to the specified directory. + * + * @param source URL of the server to receive the file + * @param target Full path of the file on the file system + */ + private void download(final String source, final String target, JSONArray args, CallbackContext callbackContext) throws JSONException { + Log.d(LOG_TAG, "download " + source + " to " + target); + + final CordovaResourceApi resourceApi = webView.getResourceApi(); + + final boolean trustEveryone = args.optBoolean(2); + final String objectId = args.getString(3); + final JSONObject headers = args.optJSONObject(4); + + final Uri sourceUri = resourceApi.remapUri(Uri.parse(source)); + // Accept a path or a URI for the source. + Uri tmpTarget = Uri.parse(target); + final Uri targetUri = resourceApi.remapUri( + tmpTarget.getScheme() != null ? tmpTarget : Uri.fromFile(new File(target))); + + int uriType = CordovaResourceApi.getUriType(sourceUri); + final boolean useHttps = uriType == CordovaResourceApi.URI_TYPE_HTTPS; + final boolean isLocalTransfer = !useHttps && uriType != CordovaResourceApi.URI_TYPE_HTTP; + if (uriType == CordovaResourceApi.URI_TYPE_UNKNOWN) { + JSONObject error = createFileTransferError(INVALID_URL_ERR, source, target, null, 0, null); + Log.e(LOG_TAG, "Unsupported URI: " + sourceUri); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, error)); + return; + } + + /* This code exists for compatibility between 3.x and 4.x versions of Cordova. + * Previously the CordovaWebView class had a method, getWhitelist, which would + * return a Whitelist object. Since the fixed whitelist is removed in Cordova 4.x, + * the correct call now is to shouldAllowRequest from the plugin manager. + */ + Boolean shouldAllowRequest = null; + if (isLocalTransfer) { + shouldAllowRequest = true; + } + if (shouldAllowRequest == null) { + try { + Method gwl = webView.getClass().getMethod("getWhitelist"); + Whitelist whitelist = (Whitelist)gwl.invoke(webView); + shouldAllowRequest = whitelist.isUrlWhiteListed(source); + } catch (NoSuchMethodException e) { + } catch (IllegalAccessException e) { + } catch (InvocationTargetException e) { + } + } + if (shouldAllowRequest == null) { + try { + Method gpm = webView.getClass().getMethod("getPluginManager"); + PluginManager pm = (PluginManager)gpm.invoke(webView); + Method san = pm.getClass().getMethod("shouldAllowRequest", String.class); + shouldAllowRequest = (Boolean)san.invoke(pm, source); + } catch (NoSuchMethodException e) { + } catch (IllegalAccessException e) { + } catch (InvocationTargetException e) { + } + } + + if (!Boolean.TRUE.equals(shouldAllowRequest)) { + Log.w(LOG_TAG, "Source URL is not in white list: '" + source + "'"); + JSONObject error = createFileTransferError(CONNECTION_ERR, source, target, null, 401, null); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, error)); + return; + } + + + final RequestContext context = new RequestContext(source, target, callbackContext); + synchronized (activeRequests) { + activeRequests.put(objectId, context); + } + + cordova.getThreadPool().execute(new Runnable() { + public void run() { + if (context.aborted) { + return; + } + HttpURLConnection connection = null; + HostnameVerifier oldHostnameVerifier = null; + SSLSocketFactory oldSocketFactory = null; + File file = null; + PluginResult result = null; + TrackingInputStream inputStream = null; + boolean cached = false; + + OutputStream outputStream = null; + try { + OpenForReadResult readResult = null; + + file = resourceApi.mapUriToFile(targetUri); + context.targetFile = file; + + Log.d(LOG_TAG, "Download file:" + sourceUri); + + FileProgressResult progress = new FileProgressResult(); + + if (isLocalTransfer) { + readResult = resourceApi.openForRead(sourceUri); + if (readResult.length != -1) { + progress.setLengthComputable(true); + progress.setTotal(readResult.length); + } + inputStream = new SimpleTrackingInputStream(readResult.inputStream); + } else { + // connect to server + // Open a HTTP connection to the URL based on protocol + connection = resourceApi.createHttpConnection(sourceUri); + if (useHttps && trustEveryone) { + // Setup the HTTPS connection class to trust everyone + HttpsURLConnection https = (HttpsURLConnection)connection; + oldSocketFactory = trustAllHosts(https); + // Save the current hostnameVerifier + oldHostnameVerifier = https.getHostnameVerifier(); + // Setup the connection not to verify hostnames + https.setHostnameVerifier(DO_NOT_VERIFY); + } + + connection.setRequestMethod("GET"); + + // TODO: Make OkHttp use this CookieManager by default. + String cookie = getCookies(sourceUri.toString()); + + if(cookie != null) + { + connection.setRequestProperty("cookie", cookie); + } + + // This must be explicitly set for gzip progress tracking to work. + connection.setRequestProperty("Accept-Encoding", "gzip"); + + // Handle the other headers + if (headers != null) { + addHeadersToRequest(connection, headers); + } + + connection.connect(); + if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) { + cached = true; + connection.disconnect(); + Log.d(LOG_TAG, "Resource not modified: " + source); + JSONObject error = createFileTransferError(NOT_MODIFIED_ERR, source, target, connection, null); + result = new PluginResult(PluginResult.Status.ERROR, error); + } else { + if (connection.getContentEncoding() == null || connection.getContentEncoding().equalsIgnoreCase("gzip")) { + // Only trust content-length header if we understand + // the encoding -- identity or gzip + if (connection.getContentLength() != -1) { + progress.setLengthComputable(true); + progress.setTotal(connection.getContentLength()); + } + } + inputStream = getInputStream(connection); + } + } + + if (!cached) { + try { + synchronized (context) { + if (context.aborted) { + return; + } + context.connection = connection; + } + + // write bytes to file + byte[] buffer = new byte[MAX_BUFFER_SIZE]; + int bytesRead = 0; + outputStream = resourceApi.openOutputStream(targetUri); + while ((bytesRead = inputStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, bytesRead); + // Send a progress event. + progress.setLoaded(inputStream.getTotalRawBytesRead()); + PluginResult progressResult = new PluginResult(PluginResult.Status.OK, progress.toJSONObject()); + progressResult.setKeepCallback(true); + context.sendPluginResult(progressResult); + } + } finally { + synchronized (context) { + context.connection = null; + } + safeClose(inputStream); + safeClose(outputStream); + } + + Log.d(LOG_TAG, "Saved file: " + target); + + + // create FileEntry object + Class webViewClass = webView.getClass(); + PluginManager pm = null; + try { + Method gpm = webViewClass.getMethod("getPluginManager"); + pm = (PluginManager) gpm.invoke(webView); + } catch (NoSuchMethodException e) { + } catch (IllegalAccessException e) { + } catch (InvocationTargetException e) { + } + if (pm == null) { + try { + Field pmf = webViewClass.getField("pluginManager"); + pm = (PluginManager)pmf.get(webView); + } catch (NoSuchFieldException e) { + } catch (IllegalAccessException e) { + } + } + file = resourceApi.mapUriToFile(targetUri); + context.targetFile = file; + FileUtils filePlugin = (FileUtils) pm.getPlugin("File"); + if (filePlugin != null) { + JSONObject fileEntry = filePlugin.getEntryForFile(file); + if (fileEntry != null) { + result = new PluginResult(PluginResult.Status.OK, fileEntry); + } else { + JSONObject error = createFileTransferError(CONNECTION_ERR, source, target, connection, null); + Log.e(LOG_TAG, "File plugin cannot represent download path"); + result = new PluginResult(PluginResult.Status.IO_EXCEPTION, error); + } + } else { + Log.e(LOG_TAG, "File plugin not found; cannot save downloaded file"); + result = new PluginResult(PluginResult.Status.ERROR, "File plugin not found; cannot save downloaded file"); + } + } + } catch (FileNotFoundException e) { + JSONObject error = createFileTransferError(FILE_NOT_FOUND_ERR, source, target, connection, e); + Log.e(LOG_TAG, error.toString(), e); + result = new PluginResult(PluginResult.Status.IO_EXCEPTION, error); + } catch (IOException e) { + JSONObject error = createFileTransferError(CONNECTION_ERR, source, target, connection, e); + Log.e(LOG_TAG, error.toString(), e); + result = new PluginResult(PluginResult.Status.IO_EXCEPTION, error); + } catch (JSONException e) { + Log.e(LOG_TAG, e.getMessage(), e); + result = new PluginResult(PluginResult.Status.JSON_EXCEPTION); + } catch (Throwable e) { + JSONObject error = createFileTransferError(CONNECTION_ERR, source, target, connection, e); + Log.e(LOG_TAG, error.toString(), e); + result = new PluginResult(PluginResult.Status.IO_EXCEPTION, error); + } finally { + synchronized (activeRequests) { + activeRequests.remove(objectId); + } + + if (connection != null) { + // Revert back to the proper verifier and socket factories + if (trustEveryone && useHttps) { + HttpsURLConnection https = (HttpsURLConnection) connection; + https.setHostnameVerifier(oldHostnameVerifier); + https.setSSLSocketFactory(oldSocketFactory); + } + } + + if (result == null) { + result = new PluginResult(PluginResult.Status.ERROR, createFileTransferError(CONNECTION_ERR, source, target, connection, null)); + } + // Remove incomplete download. + if (!cached && result.getStatus() != PluginResult.Status.OK.ordinal() && file != null) { + file.delete(); + } + context.sendPluginResult(result); + } + } + }); + } + + /** + * Abort an ongoing upload or download. + */ + private void abort(String objectId) { + final RequestContext context; + synchronized (activeRequests) { + context = activeRequests.remove(objectId); + } + if (context != null) { + // Closing the streams can block, so execute on a background thread. + cordova.getThreadPool().execute(new Runnable() { + public void run() { + synchronized (context) { + File file = context.targetFile; + if (file != null) { + file.delete(); + } + // Trigger the abort callback immediately to minimize latency between it and abort() being called. + JSONObject error = createFileTransferError(ABORTED_ERR, context.source, context.target, null, -1, null); + context.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, error)); + context.aborted = true; + if (context.connection != null) { + try { + context.connection.disconnect(); + } catch (Exception e) { + Log.e(LOG_TAG, "CB-8431 Catch workaround for fatal exception", e); + } + } + } + } + }); + } + } +} diff --git a/platforms/android/src/org/apache/cordova/filetransfer/FileUploadResult.java b/platforms/android/src/org/apache/cordova/filetransfer/FileUploadResult.java new file mode 100644 index 0000000..c24ea78 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/filetransfer/FileUploadResult.java @@ -0,0 +1,73 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.filetransfer; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Encapsulates the result and/or status of uploading a file to a remote server. + */ +public class FileUploadResult { + + private long bytesSent = 0; // bytes sent + private int responseCode = -1; // HTTP response code + private String response = null; // HTTP response + private String objectId = null; // FileTransfer object id + + public long getBytesSent() { + return bytesSent; + } + + public void setBytesSent(long bytes) { + this.bytesSent = bytes; + } + + public int getResponseCode() { + return responseCode; + } + + public void setResponseCode(int responseCode) { + this.responseCode = responseCode; + } + + public String getResponse() { + return response; + } + + public void setResponse(String response) { + this.response = response; + } + + public String getObjectId() { + return objectId; + } + + public void setObjectId(String objectId) { + this.objectId = objectId; + } + + public JSONObject toJSONObject() throws JSONException { + return new JSONObject( + "{bytesSent:" + bytesSent + + ",responseCode:" + responseCode + + ",response:" + JSONObject.quote(response) + + ",objectId:" + JSONObject.quote(objectId) + "}"); + } +} diff --git a/platforms/android/src/org/apache/cordova/geolocation/Geolocation.java b/platforms/android/src/org/apache/cordova/geolocation/Geolocation.java new file mode 100644 index 0000000..3e0bd8a --- /dev/null +++ b/platforms/android/src/org/apache/cordova/geolocation/Geolocation.java @@ -0,0 +1,108 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + + +package org.apache.cordova.geolocation; + +import android.content.pm.PackageManager; +import android.Manifest; +import android.os.Build; +import android.util.Log; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaArgs; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PermissionHelper; +import org.apache.cordova.PluginResult; +import org.apache.cordova.LOG; +import org.json.JSONArray; +import org.json.JSONException; + +import javax.security.auth.callback.Callback; + +public class Geolocation extends CordovaPlugin { + + String TAG = "GeolocationPlugin"; + CallbackContext context; + + String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; + + + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + Log.d(TAG, "We are entering execute"); + context = callbackContext; + if(action.equals("getPermission")) + { + if(hasPermisssion()) + { + PluginResult r = new PluginResult(PluginResult.Status.OK); + context.sendPluginResult(r); + return true; + } + else { + PermissionHelper.requestPermissions(this, 0, permissions); + } + return true; + } + return false; + } + + + public void onRequestPermissionResult(int requestCode, String[] permissions, + int[] grantResults) throws JSONException + { + PluginResult result; + //This is important if we're using Cordova without using Cordova, but we have the geolocation plugin installed + if(context != null) { + for (int r : grantResults) { + if (r == PackageManager.PERMISSION_DENIED) { + LOG.d(TAG, "Permission Denied!"); + result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION); + context.sendPluginResult(result); + return; + } + + } + result = new PluginResult(PluginResult.Status.OK); + context.sendPluginResult(result); + } + } + + public boolean hasPermisssion() { + for(String p : permissions) + { + if(!PermissionHelper.hasPermission(this, p)) + { + return false; + } + } + return true; + } + + /* + * We override this so that we can access the permissions variable, which no longer exists in + * the parent class, since we can't initialize it reliably in the constructor! + */ + + public void requestPermissions(int requestCode) + { + PermissionHelper.requestPermissions(this, requestCode, permissions); + } + + + +} diff --git a/platforms/android/src/org/apache/cordova/media/AudioHandler.java b/platforms/android/src/org/apache/cordova/media/AudioHandler.java new file mode 100644 index 0000000..5f5659c --- /dev/null +++ b/platforms/android/src/org/apache/cordova/media/AudioHandler.java @@ -0,0 +1,562 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.media; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaResourceApi; +import org.apache.cordova.PermissionHelper; + +import android.Manifest; +import android.content.Context; +import android.content.pm.PackageManager; +import android.media.AudioManager; +import android.media.AudioManager.OnAudioFocusChangeListener; +import android.net.Uri; +import android.os.Build; +import android.util.Log; + +import java.security.Permission; +import java.util.ArrayList; + +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.HashMap; + +/** + * This class called by CordovaActivity to play and record audio. + * The file can be local or over a network using http. + * + * Audio formats supported (tested): + * .mp3, .wav + * + * Local audio files must reside in one of two places: + * android_asset: file name must start with /android_asset/sound.mp3 + * sdcard: file name is just sound.mp3 + */ +public class AudioHandler extends CordovaPlugin { + + public static String TAG = "AudioHandler"; + HashMap players; // Audio player object + ArrayList pausedForPhone; // Audio players that were paused when phone call came in + ArrayList pausedForFocus; // Audio players that were paused when focus was lost + private int origVolumeStream = -1; + private CallbackContext messageChannel; + + + public static String [] permissions = { Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static int RECORD_AUDIO = 0; + public static int WRITE_EXTERNAL_STORAGE = 1; + + public static final int PERMISSION_DENIED_ERROR = 20; + + private String recordId; + private String fileUriStr; + + /** + * Constructor. + */ + public AudioHandler() { + this.players = new HashMap(); + this.pausedForPhone = new ArrayList(); + this.pausedForFocus = new ArrayList(); + } + + + protected void getWritePermission(int requestCode) + { + PermissionHelper.requestPermission(this, requestCode, permissions[WRITE_EXTERNAL_STORAGE]); + } + + + protected void getMicPermission(int requestCode) + { + PermissionHelper.requestPermission(this, requestCode, permissions[RECORD_AUDIO]); + } + + + /** + * Executes the request and returns PluginResult. + * @param action The action to execute. + * @param args JSONArry of arguments for the plugin. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return A PluginResult object with a status and message. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + CordovaResourceApi resourceApi = webView.getResourceApi(); + PluginResult.Status status = PluginResult.Status.OK; + String result = ""; + + if (action.equals("startRecordingAudio")) { + recordId = args.getString(0); + String target = args.getString(1); + try { + Uri targetUri = resourceApi.remapUri(Uri.parse(target)); + fileUriStr = targetUri.toString(); + } catch (IllegalArgumentException e) { + fileUriStr = target; + } + promptForRecord(); + } + else if (action.equals("stopRecordingAudio")) { + this.stopRecordingAudio(args.getString(0), true); + } + else if (action.equals("pauseRecordingAudio")) { + this.stopRecordingAudio(args.getString(0), false); + } + else if (action.equals("resumeRecordingAudio")) { + this.resumeRecordingAudio(args.getString(0)); + } + else if (action.equals("startPlayingAudio")) { + String target = args.getString(1); + String fileUriStr; + try { + Uri targetUri = resourceApi.remapUri(Uri.parse(target)); + fileUriStr = targetUri.toString(); + } catch (IllegalArgumentException e) { + fileUriStr = target; + } + this.startPlayingAudio(args.getString(0), FileHelper.stripFileProtocol(fileUriStr)); + } + else if (action.equals("seekToAudio")) { + this.seekToAudio(args.getString(0), args.getInt(1)); + } + else if (action.equals("pausePlayingAudio")) { + this.pausePlayingAudio(args.getString(0)); + } + else if (action.equals("stopPlayingAudio")) { + this.stopPlayingAudio(args.getString(0)); + } else if (action.equals("setVolume")) { + try { + this.setVolume(args.getString(0), Float.parseFloat(args.getString(1))); + } catch (NumberFormatException nfe) { + //no-op + } + } else if (action.equals("getCurrentPositionAudio")) { + float f = this.getCurrentPositionAudio(args.getString(0)); + callbackContext.sendPluginResult(new PluginResult(status, f)); + return true; + } + else if (action.equals("getDurationAudio")) { + float f = this.getDurationAudio(args.getString(0), args.getString(1)); + callbackContext.sendPluginResult(new PluginResult(status, f)); + return true; + } + else if (action.equals("create")) { + String id = args.getString(0); + String src = FileHelper.stripFileProtocol(args.getString(1)); + getOrCreatePlayer(id, src); + } + else if (action.equals("release")) { + boolean b = this.release(args.getString(0)); + callbackContext.sendPluginResult(new PluginResult(status, b)); + return true; + } + else if (action.equals("messageChannel")) { + messageChannel = callbackContext; + return true; + } else if (action.equals("getCurrentAmplitudeAudio")) { + float f = this.getCurrentAmplitudeAudio(args.getString(0)); + callbackContext.sendPluginResult(new PluginResult(status, f)); + return true; + } + else { // Unrecognized action. + return false; + } + + callbackContext.sendPluginResult(new PluginResult(status, result)); + + return true; + } + + /** + * Stop all audio players and recorders. + */ + public void onDestroy() { + if (!players.isEmpty()) { + onLastPlayerReleased(); + } + for (AudioPlayer audio : this.players.values()) { + audio.destroy(); + } + this.players.clear(); + } + + /** + * Stop all audio players and recorders on navigate. + */ + @Override + public void onReset() { + onDestroy(); + } + + /** + * Called when a message is sent to plugin. + * + * @param id The message id + * @param data The message data + * @return Object to stop propagation or null + */ + public Object onMessage(String id, Object data) { + + // If phone message + if (id.equals("telephone")) { + + // If phone ringing, then pause playing + if ("ringing".equals(data) || "offhook".equals(data)) { + + // Get all audio players and pause them + for (AudioPlayer audio : this.players.values()) { + if (audio.getState() == AudioPlayer.STATE.MEDIA_RUNNING.ordinal()) { + this.pausedForPhone.add(audio); + audio.pausePlaying(); + } + } + + } + + // If phone idle, then resume playing those players we paused + else if ("idle".equals(data)) { + for (AudioPlayer audio : this.pausedForPhone) { + audio.startPlaying(null); + } + this.pausedForPhone.clear(); + } + } + return null; + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + + private AudioPlayer getOrCreatePlayer(String id, String file) { + AudioPlayer ret = players.get(id); + if (ret == null) { + if (players.isEmpty()) { + onFirstPlayerCreated(); + } + ret = new AudioPlayer(this, id, file); + players.put(id, ret); + } + return ret; + } + + /** + * Release the audio player instance to save memory. + * @param id The id of the audio player + */ + private boolean release(String id) { + AudioPlayer audio = players.remove(id); + if (audio == null) { + return false; + } + if (players.isEmpty()) { + onLastPlayerReleased(); + } + audio.destroy(); + return true; + } + + /** + * Start recording and save the specified file. + * @param id The id of the audio player + * @param file The name of the file + */ + public void startRecordingAudio(String id, String file) { + AudioPlayer audio = getOrCreatePlayer(id, file); + audio.startRecording(file); + } + + /** + * Stop/Pause recording and save to the file specified when recording started. + * @param id The id of the audio player + * @param stop If true stop recording, if false pause recording + */ + public void stopRecordingAudio(String id, boolean stop) { + AudioPlayer audio = this.players.get(id); + if (audio != null) { + audio.stopRecording(stop); + } + } + + /** + * Resume recording + * @param id The id of the audio player + */ + public void resumeRecordingAudio(String id) { + AudioPlayer audio = players.get(id); + if (audio != null) { + audio.resumeRecording(); + } + } + + /** + * Start or resume playing audio file. + * @param id The id of the audio player + * @param file The name of the audio file. + */ + public void startPlayingAudio(String id, String file) { + AudioPlayer audio = getOrCreatePlayer(id, file); + audio.startPlaying(file); + getAudioFocus(); + } + + /** + * Seek to a location. + * @param id The id of the audio player + * @param milliseconds int: number of milliseconds to skip 1000 = 1 second + */ + public void seekToAudio(String id, int milliseconds) { + AudioPlayer audio = this.players.get(id); + if (audio != null) { + audio.seekToPlaying(milliseconds); + } + } + + /** + * Pause playing. + * @param id The id of the audio player + */ + public void pausePlayingAudio(String id) { + AudioPlayer audio = this.players.get(id); + if (audio != null) { + audio.pausePlaying(); + } + } + + /** + * Stop playing the audio file. + * @param id The id of the audio player + */ + public void stopPlayingAudio(String id) { + AudioPlayer audio = this.players.get(id); + if (audio != null) { + audio.stopPlaying(); + } + } + + /** + * Get current position of playback. + * @param id The id of the audio player + * @return position in msec + */ + public float getCurrentPositionAudio(String id) { + AudioPlayer audio = this.players.get(id); + if (audio != null) { + return (audio.getCurrentPosition() / 1000.0f); + } + return -1; + } + + /** + * Get the duration of the audio file. + * @param id The id of the audio player + * @param file The name of the audio file. + * @return The duration in msec. + */ + public float getDurationAudio(String id, String file) { + AudioPlayer audio = getOrCreatePlayer(id, file); + return audio.getDuration(file); + } + + /** + * Set the audio device to be used for playback. + * + * @param output 1=earpiece, 2=speaker + */ + @SuppressWarnings("deprecation") + public void setAudioOutputDevice(int output) { + AudioManager audiMgr = (AudioManager) this.cordova.getActivity().getSystemService(Context.AUDIO_SERVICE); + if (output == 2) { + audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL); + } + else if (output == 1) { + audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL); + } + else { + System.out.println("AudioHandler.setAudioOutputDevice() Error: Unknown output device."); + } + } + + public void pauseAllLostFocus() { + for (AudioPlayer audio : this.players.values()) { + if (audio.getState() == AudioPlayer.STATE.MEDIA_RUNNING.ordinal()) { + this.pausedForFocus.add(audio); + audio.pausePlaying(); + } + } + } + + public void resumeAllGainedFocus() { + for (AudioPlayer audio : this.pausedForFocus) { + audio.startPlaying(null); + } + this.pausedForFocus.clear(); + } + + /** + * Get the the audio focus + */ + private OnAudioFocusChangeListener focusChangeListener = new OnAudioFocusChangeListener() { + public void onAudioFocusChange(int focusChange) { + switch (focusChange) { + case (AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) : + case (AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) : + case (AudioManager.AUDIOFOCUS_LOSS) : + pauseAllLostFocus(); + break; + case (AudioManager.AUDIOFOCUS_GAIN): + resumeAllGainedFocus(); + break; + default: + break; + } + } + }; + + public void getAudioFocus() { + AudioManager am = (AudioManager) this.cordova.getActivity().getSystemService(Context.AUDIO_SERVICE); + int result = am.requestAudioFocus(focusChangeListener, + AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN); + + if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + System.out.println("AudioHandler.getAudioFocus() Error: Got " + result + " instead of " + AudioManager.AUDIOFOCUS_REQUEST_GRANTED); + } + + } + + + /** + * Get the audio device to be used for playback. + * + * @return 1=earpiece, 2=speaker + */ + @SuppressWarnings("deprecation") + public int getAudioOutputDevice() { + AudioManager audiMgr = (AudioManager) this.cordova.getActivity().getSystemService(Context.AUDIO_SERVICE); + if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_EARPIECE) { + return 1; + } + else if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_SPEAKER) { + return 2; + } + else { + return -1; + } + } + + /** + * Set the volume for an audio device + * + * @param id The id of the audio player + * @param volume Volume to adjust to 0.0f - 1.0f + */ + public void setVolume(String id, float volume) { + AudioPlayer audio = this.players.get(id); + if (audio != null) { + audio.setVolume(volume); + } else { + System.out.println("AudioHandler.setVolume() Error: Unknown Audio Player " + id); + } + } + + private void onFirstPlayerCreated() { + origVolumeStream = cordova.getActivity().getVolumeControlStream(); + cordova.getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC); + } + + private void onLastPlayerReleased() { + if (origVolumeStream != -1) { + cordova.getActivity().setVolumeControlStream(origVolumeStream); + origVolumeStream = -1; + } + } + + void sendEventMessage(String action, JSONObject actionData) { + JSONObject message = new JSONObject(); + try { + message.put("action", action); + if (actionData != null) { + message.put(action, actionData); + } + } catch (JSONException e) { + Log.e(TAG, "Failed to create event message", e); + } + + PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, message); + pluginResult.setKeepCallback(true); + if (messageChannel != null) { + messageChannel.sendPluginResult(pluginResult); + } + } + + public void onRequestPermissionResult(int requestCode, String[] permissions, + int[] grantResults) throws JSONException + { + for(int r:grantResults) + { + if(r == PackageManager.PERMISSION_DENIED) + { + this.messageChannel.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, PERMISSION_DENIED_ERROR)); + return; + } + } + promptForRecord(); + } + + /* + * This little utility method catch-all work great for multi-permission stuff. + * + */ + + private void promptForRecord() + { + if(PermissionHelper.hasPermission(this, permissions[WRITE_EXTERNAL_STORAGE]) && + PermissionHelper.hasPermission(this, permissions[RECORD_AUDIO])) { + this.startRecordingAudio(recordId, FileHelper.stripFileProtocol(fileUriStr)); + } + else if(PermissionHelper.hasPermission(this, permissions[RECORD_AUDIO])) + { + getWritePermission(WRITE_EXTERNAL_STORAGE); + } + else + { + getMicPermission(RECORD_AUDIO); + } + + } + + /** + * Get current amplitude of recording. + * @param id The id of the audio player + * @return amplitude + */ + public float getCurrentAmplitudeAudio(String id) { + AudioPlayer audio = this.players.get(id); + if (audio != null) { + return (audio.getCurrentAmplitude()); + } + return 0; + } +} diff --git a/platforms/android/src/org/apache/cordova/media/AudioPlayer.java b/platforms/android/src/org/apache/cordova/media/AudioPlayer.java new file mode 100644 index 0000000..2cac5e0 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/media/AudioPlayer.java @@ -0,0 +1,701 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.media; + +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.media.MediaPlayer.OnCompletionListener; +import android.media.MediaPlayer.OnErrorListener; +import android.media.MediaPlayer.OnPreparedListener; +import android.media.MediaRecorder; +import android.os.Environment; +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; +import java.util.LinkedList; + +/** + * This class implements the audio playback and recording capabilities used by Cordova. + * It is called by the AudioHandler Cordova class. + * Only one file can be played or recorded per class instance. + * + * Local audio files must reside in one of two places: + * android_asset: file name must start with /android_asset/sound.mp3 + * sdcard: file name is just sound.mp3 + */ +public class AudioPlayer implements OnCompletionListener, OnPreparedListener, OnErrorListener { + + // AudioPlayer modes + public enum MODE { NONE, PLAY, RECORD }; + + // AudioPlayer states + public enum STATE { MEDIA_NONE, + MEDIA_STARTING, + MEDIA_RUNNING, + MEDIA_PAUSED, + MEDIA_STOPPED, + MEDIA_LOADING + }; + + private static final String LOG_TAG = "AudioPlayer"; + + // AudioPlayer message ids + private static int MEDIA_STATE = 1; + private static int MEDIA_DURATION = 2; + private static int MEDIA_POSITION = 3; + private static int MEDIA_ERROR = 9; + + // Media error codes + private static int MEDIA_ERR_NONE_ACTIVE = 0; + private static int MEDIA_ERR_ABORTED = 1; +// private static int MEDIA_ERR_NETWORK = 2; +// private static int MEDIA_ERR_DECODE = 3; +// private static int MEDIA_ERR_NONE_SUPPORTED = 4; + + private AudioHandler handler; // The AudioHandler object + private String id; // The id of this player (used to identify Media object in JavaScript) + private MODE mode = MODE.NONE; // Playback or Recording mode + private STATE state = STATE.MEDIA_NONE; // State of recording or playback + + private String audioFile = null; // File name to play or record to + private float duration = -1; // Duration of audio + + private MediaRecorder recorder = null; // Audio recording object + private LinkedList tempFiles = null; // Temporary recording file name + private String tempFile = null; + + private MediaPlayer player = null; // Audio player object + private boolean prepareOnly = true; // playback after file prepare flag + private int seekOnPrepared = 0; // seek to this location once media is prepared + + /** + * Constructor. + * + * @param handler The audio handler object + * @param id The id of this audio player + */ + public AudioPlayer(AudioHandler handler, String id, String file) { + this.handler = handler; + this.id = id; + this.audioFile = file; + this.recorder = new MediaRecorder(); + this.tempFiles = new LinkedList(); + } + + private String generateTempFile() { + String tempFileName = null; + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + tempFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tmprecording-" + System.currentTimeMillis() + ".3gp"; + } else { + tempFileName = "/data/data/" + handler.cordova.getActivity().getPackageName() + "/cache/tmprecording-" + System.currentTimeMillis() + ".3gp"; + } + return tempFileName; + } + + /** + * Destroy player and stop audio playing or recording. + */ + public void destroy() { + // Stop any play or record + if (this.player != null) { + if ((this.state == STATE.MEDIA_RUNNING) || (this.state == STATE.MEDIA_PAUSED)) { + this.player.stop(); + this.setState(STATE.MEDIA_STOPPED); + } + this.player.release(); + this.player = null; + } + if (this.recorder != null) { + this.stopRecording(true); + this.recorder.release(); + this.recorder = null; + } + } + + /** + * Start recording the specified file. + * + * @param file The name of the file + */ + public void startRecording(String file) { + switch (this.mode) { + case PLAY: + Log.d(LOG_TAG, "AudioPlayer Error: Can't record in play mode."); + sendErrorStatus(MEDIA_ERR_ABORTED); + break; + case NONE: + this.audioFile = file; + this.recorder.setAudioSource(MediaRecorder.AudioSource.MIC); + this.recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); // THREE_GPP); + this.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //AMR_NB); + this.tempFile = generateTempFile(); + this.recorder.setOutputFile(this.tempFile); + try { + this.recorder.prepare(); + this.recorder.start(); + this.setState(STATE.MEDIA_RUNNING); + return; + } catch (IllegalStateException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + sendErrorStatus(MEDIA_ERR_ABORTED); + break; + case RECORD: + Log.d(LOG_TAG, "AudioPlayer Error: Already recording."); + sendErrorStatus(MEDIA_ERR_ABORTED); + } + } + + /** + * Save temporary recorded file to specified name + * + * @param file + */ + public void moveFile(String file) { + /* this is a hack to save the file as the specified name */ + + if (!file.startsWith("/")) { + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + file = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + file; + } else { + file = "/data/data/" + handler.cordova.getActivity().getPackageName() + "/cache/" + file; + } + } + + int size = this.tempFiles.size(); + Log.d(LOG_TAG, "size = " + size); + + // only one file so just copy it + if (size == 1) { + String logMsg = "renaming " + this.tempFile + " to " + file; + Log.d(LOG_TAG, logMsg); + File f = new File(this.tempFile); + if (!f.renameTo(new File(file))) Log.e(LOG_TAG, "FAILED " + logMsg); + } + // more than one file so the user must have pause recording. We'll need to concat files. + else { + FileOutputStream outputStream = null; + try { + outputStream = new FileOutputStream(new File(file)); + FileInputStream inputStream = null; + File inputFile = null; + for (int i = 0; i < size; i++) { + try { + inputFile = new File(this.tempFiles.get(i)); + inputStream = new FileInputStream(inputFile); + copy(inputStream, outputStream, (i>0)); + } catch(Exception e) { + Log.e(LOG_TAG, e.getLocalizedMessage(), e); + } finally { + if (inputStream != null) try { + inputStream.close(); + inputFile.delete(); + inputFile = null; + } catch (Exception e) { + Log.e(LOG_TAG, e.getLocalizedMessage(), e); + } + } + } + } catch(Exception e) { + e.printStackTrace(); + } finally { + if (outputStream != null) try { + outputStream.close(); + } catch (Exception e) { + Log.e(LOG_TAG, e.getLocalizedMessage(), e); + } + } + } + } + + private static long copy(InputStream from, OutputStream to, boolean skipHeader) + throws IOException { + byte[] buf = new byte[8096]; + long total = 0; + if (skipHeader) { + from.skip(6); + } + while (true) { + int r = from.read(buf); + if (r == -1) { + break; + } + to.write(buf, 0, r); + total += r; + } + return total; + } + + /** + * Stop/Pause recording and save to the file specified when recording started. + */ + public void stopRecording(boolean stop) { + if (this.recorder != null) { + try{ + if (this.state == STATE.MEDIA_RUNNING) { + this.recorder.stop(); + } + this.recorder.reset(); + this.tempFiles.add(this.tempFile); + if (stop) { + Log.d(LOG_TAG, "stopping recording"); + this.setState(STATE.MEDIA_STOPPED); + this.moveFile(this.audioFile); + } else { + Log.d(LOG_TAG, "pause recording"); + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * Resume recording and save to the file specified when recording started. + */ + public void resumeRecording() { + startRecording(this.audioFile); + } + + //========================================================================== + // Playback + //========================================================================== + + /** + * Start or resume playing audio file. + * + * @param file The name of the audio file. + */ + public void startPlaying(String file) { + if (this.readyPlayer(file) && this.player != null) { + this.player.start(); + this.setState(STATE.MEDIA_RUNNING); + this.seekOnPrepared = 0; //insures this is always reset + } else { + this.prepareOnly = false; + } + } + + /** + * Seek or jump to a new time in the track. + */ + public void seekToPlaying(int milliseconds) { + if (this.readyPlayer(this.audioFile)) { + this.player.seekTo(milliseconds); + Log.d(LOG_TAG, "Send a onStatus update for the new seek"); + sendStatusChange(MEDIA_POSITION, null, (milliseconds / 1000.0f)); + } + else { + this.seekOnPrepared = milliseconds; + } + } + + /** + * Pause playing. + */ + public void pausePlaying() { + + // If playing, then pause + if (this.state == STATE.MEDIA_RUNNING && this.player != null) { + this.player.pause(); + this.setState(STATE.MEDIA_PAUSED); + } + else { + Log.d(LOG_TAG, "AudioPlayer Error: pausePlaying() called during invalid state: " + this.state.ordinal()); + sendErrorStatus(MEDIA_ERR_NONE_ACTIVE); + } + } + + /** + * Stop playing the audio file. + */ + public void stopPlaying() { + if ((this.state == STATE.MEDIA_RUNNING) || (this.state == STATE.MEDIA_PAUSED)) { + this.player.pause(); + this.player.seekTo(0); + Log.d(LOG_TAG, "stopPlaying is calling stopped"); + this.setState(STATE.MEDIA_STOPPED); + } + else { + Log.d(LOG_TAG, "AudioPlayer Error: stopPlaying() called during invalid state: " + this.state.ordinal()); + sendErrorStatus(MEDIA_ERR_NONE_ACTIVE); + } + } + + /** + * Callback to be invoked when playback of a media source has completed. + * + * @param player The MediaPlayer that reached the end of the file + */ + public void onCompletion(MediaPlayer player) { + Log.d(LOG_TAG, "on completion is calling stopped"); + this.setState(STATE.MEDIA_STOPPED); + } + + /** + * Get current position of playback. + * + * @return position in msec or -1 if not playing + */ + public long getCurrentPosition() { + if ((this.state == STATE.MEDIA_RUNNING) || (this.state == STATE.MEDIA_PAUSED)) { + int curPos = this.player.getCurrentPosition(); + sendStatusChange(MEDIA_POSITION, null, (curPos / 1000.0f)); + return curPos; + } + else { + return -1; + } + } + + /** + * Determine if playback file is streaming or local. + * It is streaming if file name starts with "http://" + * + * @param file The file name + * @return T=streaming, F=local + */ + public boolean isStreaming(String file) { + if (file.contains("http://") || file.contains("https://") || file.contains("rtsp://")) { + return true; + } + else { + return false; + } + } + + /** + * Get the duration of the audio file. + * + * @param file The name of the audio file. + * @return The duration in msec. + * -1=can't be determined + * -2=not allowed + */ + public float getDuration(String file) { + + // Can't get duration of recording + if (this.recorder != null) { + return (-2); // not allowed + } + + // If audio file already loaded and started, then return duration + if (this.player != null) { + return this.duration; + } + + // If no player yet, then create one + else { + this.prepareOnly = true; + this.startPlaying(file); + + // This will only return value for local, since streaming + // file hasn't been read yet. + return this.duration; + } + } + + /** + * Callback to be invoked when the media source is ready for playback. + * + * @param player The MediaPlayer that is ready for playback + */ + public void onPrepared(MediaPlayer player) { + // Listen for playback completion + this.player.setOnCompletionListener(this); + // seek to any location received while not prepared + this.seekToPlaying(this.seekOnPrepared); + // If start playing after prepared + if (!this.prepareOnly) { + this.player.start(); + this.setState(STATE.MEDIA_RUNNING); + this.seekOnPrepared = 0; //reset only when played + } else { + this.setState(STATE.MEDIA_STARTING); + } + // Save off duration + this.duration = getDurationInSeconds(); + // reset prepare only flag + this.prepareOnly = true; + + // Send status notification to JavaScript + sendStatusChange(MEDIA_DURATION, null, this.duration); + } + + /** + * By default Android returns the length of audio in mills but we want seconds + * + * @return length of clip in seconds + */ + private float getDurationInSeconds() { + return (this.player.getDuration() / 1000.0f); + } + + /** + * Callback to be invoked when there has been an error during an asynchronous operation + * (other errors will throw exceptions at method call time). + * + * @param player the MediaPlayer the error pertains to + * @param arg1 the type of error that has occurred: (MEDIA_ERROR_UNKNOWN, MEDIA_ERROR_SERVER_DIED) + * @param arg2 an extra code, specific to the error. + */ + public boolean onError(MediaPlayer player, int arg1, int arg2) { + Log.d(LOG_TAG, "AudioPlayer.onError(" + arg1 + ", " + arg2 + ")"); + + // TODO: Not sure if this needs to be sent? + this.player.stop(); + this.player.release(); + + // Send error notification to JavaScript + sendErrorStatus(arg1); + return false; + } + + /** + * Set the state and send it to JavaScript. + * + * @param state + */ + private void setState(STATE state) { + if (this.state != state) { + sendStatusChange(MEDIA_STATE, null, (float)state.ordinal()); + } + this.state = state; + } + + /** + * Set the mode and send it to JavaScript. + * + * @param mode + */ + private void setMode(MODE mode) { + if (this.mode != mode) { + //mode is not part of the expected behavior, so no notification + //this.handler.webView.sendJavascript("cordova.require('cordova-plugin-media.Media').onStatus('" + this.id + "', " + MEDIA_STATE + ", " + mode + ");"); + } + this.mode = mode; + } + + /** + * Get the audio state. + * + * @return int + */ + public int getState() { + return this.state.ordinal(); + } + + /** + * Set the volume for audio player + * + * @param volume + */ + public void setVolume(float volume) { + this.player.setVolume(volume, volume); + } + + /** + * attempts to put the player in play mode + * @return true if in playmode, false otherwise + */ + private boolean playMode() { + switch(this.mode) { + case NONE: + this.setMode(MODE.PLAY); + break; + case PLAY: + break; + case RECORD: + Log.d(LOG_TAG, "AudioPlayer Error: Can't play in record mode."); + sendErrorStatus(MEDIA_ERR_ABORTED); + return false; //player is not ready + } + return true; + } + + /** + * attempts to initialize the media player for playback + * @param file the file to play + * @return false if player not ready, reports if in wrong mode or state + */ + private boolean readyPlayer(String file) { + if (playMode()) { + switch (this.state) { + case MEDIA_NONE: + if (this.player == null) { + this.player = new MediaPlayer(); + } + try { + this.loadAudioFile(file); + } catch (Exception e) { + sendErrorStatus(MEDIA_ERR_ABORTED); + } + return false; + case MEDIA_LOADING: + //cordova js is not aware of MEDIA_LOADING, so we send MEDIA_STARTING instead + Log.d(LOG_TAG, "AudioPlayer Loading: startPlaying() called during media preparation: " + STATE.MEDIA_STARTING.ordinal()); + this.prepareOnly = false; + return false; + case MEDIA_STARTING: + case MEDIA_RUNNING: + case MEDIA_PAUSED: + return true; + case MEDIA_STOPPED: + //if we are readying the same file + if (this.audioFile.compareTo(file) == 0) { + //maybe it was recording? + if(this.recorder!=null && player==null) { + this.player = new MediaPlayer(); + this.prepareOnly = false; + + try { + this.loadAudioFile(file); + } catch (Exception e) { + sendErrorStatus(MEDIA_ERR_ABORTED); + } + return false;//we´re not ready yet + } + else { + //reset the audio file + player.seekTo(0); + player.pause(); + return true; + } + } else { + //reset the player + this.player.reset(); + try { + this.loadAudioFile(file); + } catch (Exception e) { + sendErrorStatus(MEDIA_ERR_ABORTED); + } + //if we had to prepare the file, we won't be in the correct state for playback + return false; + } + default: + Log.d(LOG_TAG, "AudioPlayer Error: startPlaying() called during invalid state: " + this.state); + sendErrorStatus(MEDIA_ERR_ABORTED); + } + } + return false; + } + + /** + * load audio file + * @throws IOException + * @throws IllegalStateException + * @throws SecurityException + * @throws IllegalArgumentException + */ + private void loadAudioFile(String file) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException { + if (this.isStreaming(file)) { + this.player.setDataSource(file); + this.player.setAudioStreamType(AudioManager.STREAM_MUSIC); + //if it's a streaming file, play mode is implied + this.setMode(MODE.PLAY); + this.setState(STATE.MEDIA_STARTING); + this.player.setOnPreparedListener(this); + this.player.prepareAsync(); + } + else { + if (file.startsWith("/android_asset/")) { + String f = file.substring(15); + android.content.res.AssetFileDescriptor fd = this.handler.cordova.getActivity().getAssets().openFd(f); + this.player.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength()); + } + else { + File fp = new File(file); + if (fp.exists()) { + FileInputStream fileInputStream = new FileInputStream(file); + this.player.setDataSource(fileInputStream.getFD()); + fileInputStream.close(); + } + else { + this.player.setDataSource(Environment.getExternalStorageDirectory().getPath() + "/" + file); + } + } + this.setState(STATE.MEDIA_STARTING); + this.player.setOnPreparedListener(this); + this.player.prepare(); + + // Get duration + this.duration = getDurationInSeconds(); + } + } + + private void sendErrorStatus(int errorCode) { + sendStatusChange(MEDIA_ERROR, errorCode, null); + } + + private void sendStatusChange(int messageType, Integer additionalCode, Float value) { + + if (additionalCode != null && value != null) { + throw new IllegalArgumentException("Only one of additionalCode or value can be specified, not both"); + } + + JSONObject statusDetails = new JSONObject(); + try { + statusDetails.put("id", this.id); + statusDetails.put("msgType", messageType); + if (additionalCode != null) { + JSONObject code = new JSONObject(); + code.put("code", additionalCode.intValue()); + statusDetails.put("value", code); + } + else if (value != null) { + statusDetails.put("value", value.floatValue()); + } + } catch (JSONException e) { + Log.e(LOG_TAG, "Failed to create status details", e); + } + + this.handler.sendEventMessage("status", statusDetails); + } + + /** + * Get current amplitude of recording. + * + * @return amplitude or 0 if not recording + */ + public float getCurrentAmplitude() { + if (this.recorder != null) { + try{ + if (this.state == STATE.MEDIA_RUNNING) { + return (float) this.recorder.getMaxAmplitude() / 32762; + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + return 0; + } +} diff --git a/platforms/android/src/org/apache/cordova/media/FileHelper.java b/platforms/android/src/org/apache/cordova/media/FileHelper.java new file mode 100644 index 0000000..e20752c --- /dev/null +++ b/platforms/android/src/org/apache/cordova/media/FileHelper.java @@ -0,0 +1,38 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.cordova.media; + +import android.net.Uri; + +public class FileHelper { + + /** + * Removes the "file://" prefix from the given URI string, if applicable. + * If the given URI string doesn't have a "file://" prefix, it is returned unchanged. + * + * @param uriString the URI string to operate on + * @return a path without the "file://" prefix + */ + public static String stripFileProtocol(String uriString) { + if (uriString.startsWith("file://")) { + return Uri.parse(uriString).getPath(); + } + return uriString; + } +} diff --git a/platforms/android/src/org/apache/cordova/mediacapture/Capture.java b/platforms/android/src/org/apache/cordova/mediacapture/Capture.java new file mode 100644 index 0000000..befca96 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/mediacapture/Capture.java @@ -0,0 +1,615 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.mediacapture; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import android.os.Build; +import android.os.Bundle; + +import org.apache.cordova.file.FileUtils; +import org.apache.cordova.file.LocalFilesystemURL; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.LOG; +import org.apache.cordova.PermissionHelper; +import org.apache.cordova.PluginManager; +import org.apache.cordova.mediacapture.PendingRequests.Request; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.Manifest; +import android.app.Activity; +import android.content.ContentValues; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.database.Cursor; +import android.graphics.BitmapFactory; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Environment; +import android.provider.MediaStore; +import android.util.Log; + +public class Capture extends CordovaPlugin { + + private static final String VIDEO_3GPP = "video/3gpp"; + private static final String VIDEO_MP4 = "video/mp4"; + private static final String AUDIO_3GPP = "audio/3gpp"; + private static final String IMAGE_JPEG = "image/jpeg"; + + private static final int CAPTURE_AUDIO = 0; // Constant for capture audio + private static final int CAPTURE_IMAGE = 1; // Constant for capture image + private static final int CAPTURE_VIDEO = 2; // Constant for capture video + private static final String LOG_TAG = "Capture"; + + private static final int CAPTURE_INTERNAL_ERR = 0; +// private static final int CAPTURE_APPLICATION_BUSY = 1; +// private static final int CAPTURE_INVALID_ARGUMENT = 2; + private static final int CAPTURE_NO_MEDIA_FILES = 3; + private static final int CAPTURE_PERMISSION_DENIED = 4; + + private boolean cameraPermissionInManifest; // Whether or not the CAMERA permission is declared in AndroidManifest.xml + + private final PendingRequests pendingRequests = new PendingRequests(); + + private int numPics; // Number of pictures before capture activity + +// public void setContext(Context mCtx) +// { +// if (CordovaInterface.class.isInstance(mCtx)) +// cordova = (CordovaInterface) mCtx; +// else +// LOG.d(LOG_TAG, "ERROR: You must use the CordovaInterface for this to work correctly. Please implement it in your activity"); +// } + + @Override + protected void pluginInitialize() { + super.pluginInitialize(); + + // CB-10670: The CAMERA permission does not need to be requested unless it is declared + // in AndroidManifest.xml. This plugin does not declare it, but others may and so we must + // check the package info to determine if the permission is present. + + cameraPermissionInManifest = false; + try { + PackageManager packageManager = this.cordova.getActivity().getPackageManager(); + String[] permissionsInPackage = packageManager.getPackageInfo(this.cordova.getActivity().getPackageName(), PackageManager.GET_PERMISSIONS).requestedPermissions; + if (permissionsInPackage != null) { + for (String permission : permissionsInPackage) { + if (permission.equals(Manifest.permission.CAMERA)) { + cameraPermissionInManifest = true; + break; + } + } + } + } catch (NameNotFoundException e) { + // We are requesting the info for our package, so this should + // never be caught + LOG.e(LOG_TAG, "Failed checking for CAMERA permission in manifest", e); + } + } + + @Override + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + if (action.equals("getFormatData")) { + JSONObject obj = getFormatData(args.getString(0), args.getString(1)); + callbackContext.success(obj); + return true; + } + + JSONObject options = args.optJSONObject(0); + + if (action.equals("captureAudio")) { + this.captureAudio(pendingRequests.createRequest(CAPTURE_AUDIO, options, callbackContext)); + } + else if (action.equals("captureImage")) { + this.captureImage(pendingRequests.createRequest(CAPTURE_IMAGE, options, callbackContext)); + } + else if (action.equals("captureVideo")) { + this.captureVideo(pendingRequests.createRequest(CAPTURE_VIDEO, options, callbackContext)); + } + else { + return false; + } + + return true; + } + + /** + * Provides the media data file data depending on it's mime type + * + * @param filePath path to the file + * @param mimeType of the file + * @return a MediaFileData object + */ + private JSONObject getFormatData(String filePath, String mimeType) throws JSONException { + Uri fileUrl = filePath.startsWith("file:") ? Uri.parse(filePath) : Uri.fromFile(new File(filePath)); + JSONObject obj = new JSONObject(); + // setup defaults + obj.put("height", 0); + obj.put("width", 0); + obj.put("bitrate", 0); + obj.put("duration", 0); + obj.put("codecs", ""); + + // If the mimeType isn't set the rest will fail + // so let's see if we can determine it. + if (mimeType == null || mimeType.equals("") || "null".equals(mimeType)) { + mimeType = FileHelper.getMimeType(fileUrl, cordova); + } + Log.d(LOG_TAG, "Mime type = " + mimeType); + + if (mimeType.equals(IMAGE_JPEG) || filePath.endsWith(".jpg")) { + obj = getImageData(fileUrl, obj); + } + else if (mimeType.endsWith(AUDIO_3GPP)) { + obj = getAudioVideoData(filePath, obj, false); + } + else if (mimeType.equals(VIDEO_3GPP) || mimeType.equals(VIDEO_MP4)) { + obj = getAudioVideoData(filePath, obj, true); + } + return obj; + } + + /** + * Get the Image specific attributes + * + * @param filePath path to the file + * @param obj represents the Media File Data + * @return a JSONObject that represents the Media File Data + * @throws JSONException + */ + private JSONObject getImageData(Uri fileUrl, JSONObject obj) throws JSONException { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(fileUrl.getPath(), options); + obj.put("height", options.outHeight); + obj.put("width", options.outWidth); + return obj; + } + + /** + * Get the Image specific attributes + * + * @param filePath path to the file + * @param obj represents the Media File Data + * @param video if true get video attributes as well + * @return a JSONObject that represents the Media File Data + * @throws JSONException + */ + private JSONObject getAudioVideoData(String filePath, JSONObject obj, boolean video) throws JSONException { + MediaPlayer player = new MediaPlayer(); + try { + player.setDataSource(filePath); + player.prepare(); + obj.put("duration", player.getDuration() / 1000); + if (video) { + obj.put("height", player.getVideoHeight()); + obj.put("width", player.getVideoWidth()); + } + } catch (IOException e) { + Log.d(LOG_TAG, "Error: loading video file"); + } + return obj; + } + + /** + * Sets up an intent to capture audio. Result handled by onActivityResult() + */ + private void captureAudio(Request req) { + Intent intent = new Intent(android.provider.MediaStore.Audio.Media.RECORD_SOUND_ACTION); + + this.cordova.startActivityForResult((CordovaPlugin) this, intent, req.requestCode); + } + + private String getTempDirectoryPath() { + File cache = null; + + // Use internal storage + cache = cordova.getActivity().getCacheDir(); + + // Create the cache directory if it doesn't exist + cache.mkdirs(); + return cache.getAbsolutePath(); + } + + /** + * Sets up an intent to capture images. Result handled by onActivityResult() + */ + private void captureImage(Request req) { + boolean needExternalStoragePermission = + !PermissionHelper.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); + + boolean needCameraPermission = cameraPermissionInManifest && + !PermissionHelper.hasPermission(this, Manifest.permission.CAMERA); + + if (needExternalStoragePermission || needCameraPermission) { + if (needExternalStoragePermission && needCameraPermission) { + PermissionHelper.requestPermissions(this, req.requestCode, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}); + } else if (needExternalStoragePermission) { + PermissionHelper.requestPermission(this, req.requestCode, Manifest.permission.READ_EXTERNAL_STORAGE); + } else { + PermissionHelper.requestPermission(this, req.requestCode, Manifest.permission.CAMERA); + } + } else { + // Save the number of images currently on disk for later + this.numPics = queryImgDB(whichContentStore()).getCount(); + + Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); + + // Specify file so that large image is captured and returned + File photo = new File(getTempDirectoryPath(), "Capture.jpg"); + try { + // the ACTION_IMAGE_CAPTURE is run under different credentials and has to be granted write permissions + createWritableFile(photo); + } catch (IOException ex) { + pendingRequests.resolveWithFailure(req, createErrorObject(CAPTURE_INTERNAL_ERR, ex.toString())); + return; + } + intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); + + this.cordova.startActivityForResult((CordovaPlugin) this, intent, req.requestCode); + } + } + + private static void createWritableFile(File file) throws IOException { + file.createNewFile(); + file.setWritable(true, false); + } + + /** + * Sets up an intent to capture video. Result handled by onActivityResult() + */ + private void captureVideo(Request req) { + if(cameraPermissionInManifest && !PermissionHelper.hasPermission(this, Manifest.permission.CAMERA)) { + PermissionHelper.requestPermission(this, req.requestCode, Manifest.permission.CAMERA); + } else { + Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE); + + if(Build.VERSION.SDK_INT > 7){ + intent.putExtra("android.intent.extra.durationLimit", req.duration); + intent.putExtra("android.intent.extra.videoQuality", req.quality); + } + this.cordova.startActivityForResult((CordovaPlugin) this, intent, req.requestCode); + } + } + + /** + * Called when the video view exits. + * + * @param requestCode The request code originally supplied to startActivityForResult(), + * allowing you to identify who this result came from. + * @param resultCode The integer result code returned by the child activity through its setResult(). + * @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras"). + * @throws JSONException + */ + public void onActivityResult(int requestCode, int resultCode, final Intent intent) { + final Request req = pendingRequests.get(requestCode); + + // Result received okay + if (resultCode == Activity.RESULT_OK) { + Runnable processActivityResult = new Runnable() { + @Override + public void run() { + switch(req.action) { + case CAPTURE_AUDIO: + onAudioActivityResult(req, intent); + break; + case CAPTURE_IMAGE: + onImageActivityResult(req); + break; + case CAPTURE_VIDEO: + onVideoActivityResult(req, intent); + break; + } + } + }; + + this.cordova.getThreadPool().execute(processActivityResult); + } + // If canceled + else if (resultCode == Activity.RESULT_CANCELED) { + // If we have partial results send them back to the user + if (req.results.length() > 0) { + pendingRequests.resolveWithSuccess(req); + } + // user canceled the action + else { + pendingRequests.resolveWithFailure(req, createErrorObject(CAPTURE_NO_MEDIA_FILES, "Canceled.")); + } + } + // If something else + else { + // If we have partial results send them back to the user + if (req.results.length() > 0) { + pendingRequests.resolveWithSuccess(req); + } + // something bad happened + else { + pendingRequests.resolveWithFailure(req, createErrorObject(CAPTURE_NO_MEDIA_FILES, "Did not complete!")); + } + } + } + + + public void onAudioActivityResult(Request req, Intent intent) { + // Get the uri of the audio clip + Uri data = intent.getData(); + // create a file object from the uri + req.results.put(createMediaFile(data)); + + if (req.results.length() >= req.limit) { + // Send Uri back to JavaScript for listening to audio + pendingRequests.resolveWithSuccess(req); + } else { + // still need to capture more audio clips + captureAudio(req); + } + } + + public void onImageActivityResult(Request req) { + // For some reason if I try to do: + // Uri data = intent.getData(); + // It crashes in the emulator and on my phone with a null pointer exception + // To work around it I had to grab the code from CameraLauncher.java + try { + // Create entry in media store for image + // (Don't use insertImage() because it uses default compression setting of 50 - no way to change it) + ContentValues values = new ContentValues(); + values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, IMAGE_JPEG); + Uri uri = null; + try { + uri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); + } catch (UnsupportedOperationException e) { + LOG.d(LOG_TAG, "Can't write to external media storage."); + try { + uri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values); + } catch (UnsupportedOperationException ex) { + LOG.d(LOG_TAG, "Can't write to internal media storage."); + pendingRequests.resolveWithFailure(req, createErrorObject(CAPTURE_INTERNAL_ERR, "Error capturing image - no media storage found.")); + return; + } + } + FileInputStream fis = new FileInputStream(getTempDirectoryPath() + "/Capture.jpg"); + OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri); + byte[] buffer = new byte[4096]; + int len; + while ((len = fis.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + os.flush(); + os.close(); + fis.close(); + + // Add image to results + req.results.put(createMediaFile(uri)); + + checkForDuplicateImage(); + + if (req.results.length() >= req.limit) { + // Send Uri back to JavaScript for viewing image + pendingRequests.resolveWithSuccess(req); + } else { + // still need to capture more images + captureImage(req); + } + } catch (IOException e) { + e.printStackTrace(); + pendingRequests.resolveWithFailure(req, createErrorObject(CAPTURE_INTERNAL_ERR, "Error capturing image.")); + } + } + + public void onVideoActivityResult(Request req, Intent intent) { + Uri data = null; + + if (intent != null){ + // Get the uri of the video clip + data = intent.getData(); + } + + if( data == null){ + File movie = new File(getTempDirectoryPath(), "Capture.avi"); + data = Uri.fromFile(movie); + } + + // create a file object from the uri + if(data == null) { + pendingRequests.resolveWithFailure(req, createErrorObject(CAPTURE_NO_MEDIA_FILES, "Error: data is null")); + } + else { + req.results.put(createMediaFile(data)); + + if (req.results.length() >= req.limit) { + // Send Uri back to JavaScript for viewing video + pendingRequests.resolveWithSuccess(req); + } else { + // still need to capture more video clips + captureVideo(req); + } + } + } + + /** + * Creates a JSONObject that represents a File from the Uri + * + * @param data the Uri of the audio/image/video + * @return a JSONObject that represents a File + * @throws IOException + */ + private JSONObject createMediaFile(Uri data) { + File fp = webView.getResourceApi().mapUriToFile(data); + JSONObject obj = new JSONObject(); + + Class webViewClass = webView.getClass(); + PluginManager pm = null; + try { + Method gpm = webViewClass.getMethod("getPluginManager"); + pm = (PluginManager) gpm.invoke(webView); + } catch (NoSuchMethodException e) { + } catch (IllegalAccessException e) { + } catch (InvocationTargetException e) { + } + if (pm == null) { + try { + Field pmf = webViewClass.getField("pluginManager"); + pm = (PluginManager)pmf.get(webView); + } catch (NoSuchFieldException e) { + } catch (IllegalAccessException e) { + } + } + FileUtils filePlugin = (FileUtils) pm.getPlugin("File"); + LocalFilesystemURL url = filePlugin.filesystemURLforLocalPath(fp.getAbsolutePath()); + + try { + // File properties + obj.put("name", fp.getName()); + obj.put("fullPath", fp.toURI().toString()); + if (url != null) { + obj.put("localURL", url.toString()); + } + // Because of an issue with MimeTypeMap.getMimeTypeFromExtension() all .3gpp files + // are reported as video/3gpp. I'm doing this hacky check of the URI to see if it + // is stored in the audio or video content store. + if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) { + if (data.toString().contains("/audio/")) { + obj.put("type", AUDIO_3GPP); + } else { + obj.put("type", VIDEO_3GPP); + } + } else { + obj.put("type", FileHelper.getMimeType(Uri.fromFile(fp), cordova)); + } + + obj.put("lastModifiedDate", fp.lastModified()); + obj.put("size", fp.length()); + } catch (JSONException e) { + // this will never happen + e.printStackTrace(); + } + return obj; + } + + private JSONObject createErrorObject(int code, String message) { + JSONObject obj = new JSONObject(); + try { + obj.put("code", code); + obj.put("message", message); + } catch (JSONException e) { + // This will never happen + } + return obj; + } + + /** + * Creates a cursor that can be used to determine how many images we have. + * + * @return a cursor + */ + private Cursor queryImgDB(Uri contentStore) { + return this.cordova.getActivity().getContentResolver().query( + contentStore, + new String[] { MediaStore.Images.Media._ID }, + null, + null, + null); + } + + /** + * Used to find out if we are in a situation where the Camera Intent adds to images + * to the content store. + */ + private void checkForDuplicateImage() { + Uri contentStore = whichContentStore(); + Cursor cursor = queryImgDB(contentStore); + int currentNumOfImages = cursor.getCount(); + + // delete the duplicate file if the difference is 2 + if ((currentNumOfImages - numPics) == 2) { + cursor.moveToLast(); + int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))) - 1; + Uri uri = Uri.parse(contentStore + "/" + id); + this.cordova.getActivity().getContentResolver().delete(uri, null, null); + } + } + + /** + * Determine if we are storing the images in internal or external storage + * @return Uri + */ + private Uri whichContentStore() { + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + return android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else { + return android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI; + } + } + + private void executeRequest(Request req) { + switch (req.action) { + case CAPTURE_AUDIO: + this.captureAudio(req); + break; + case CAPTURE_IMAGE: + this.captureImage(req); + break; + case CAPTURE_VIDEO: + this.captureVideo(req); + break; + } + } + + public void onRequestPermissionResult(int requestCode, String[] permissions, + int[] grantResults) throws JSONException { + Request req = pendingRequests.get(requestCode); + + if (req != null) { + boolean success = true; + for(int r:grantResults) { + if (r == PackageManager.PERMISSION_DENIED) { + success = false; + break; + } + } + + if (success) { + executeRequest(req); + } else { + pendingRequests.resolveWithFailure(req, createErrorObject(CAPTURE_PERMISSION_DENIED, "Permission denied.")); + } + } + } + + public Bundle onSaveInstanceState() { + return pendingRequests.toBundle(); + } + + public void onRestoreStateForActivityResult(Bundle state, CallbackContext callbackContext) { + pendingRequests.setLastSavedState(state, callbackContext); + } +} diff --git a/platforms/android/src/org/apache/cordova/mediacapture/FileHelper.java b/platforms/android/src/org/apache/cordova/mediacapture/FileHelper.java new file mode 100644 index 0000000..267ad53 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/mediacapture/FileHelper.java @@ -0,0 +1,60 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ +package org.apache.cordova.mediacapture; + +import android.net.Uri; +import android.webkit.MimeTypeMap; + +import org.apache.cordova.CordovaInterface; + +import java.util.Locale; + +// TODO: Replace with CordovaResourceApi.getMimeType() post 3.1. +public class FileHelper { + public static String getMimeTypeForExtension(String path) { + String extension = path; + int lastDot = extension.lastIndexOf('.'); + if (lastDot != -1) { + extension = extension.substring(lastDot + 1); + } + // Convert the URI string to lower case to ensure compatibility with MimeTypeMap (see CB-2185). + extension = extension.toLowerCase(Locale.getDefault()); + if (extension.equals("3ga")) { + return "audio/3gpp"; + } + return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + } + + /** + * Returns the mime type of the data specified by the given URI string. + * + * @param uriString the URI string of the data + * @return the mime type of the specified data + */ + public static String getMimeType(Uri uri, CordovaInterface cordova) { + String mimeType = null; + if ("content".equals(uri.getScheme())) { + mimeType = cordova.getActivity().getContentResolver().getType(uri); + } else { + mimeType = getMimeTypeForExtension(uri.getPath()); + } + + return mimeType; + } +} diff --git a/platforms/android/src/org/apache/cordova/mediacapture/PendingRequests.java b/platforms/android/src/org/apache/cordova/mediacapture/PendingRequests.java new file mode 100644 index 0000000..e4a0d60 --- /dev/null +++ b/platforms/android/src/org/apache/cordova/mediacapture/PendingRequests.java @@ -0,0 +1,228 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ + +package org.apache.cordova.mediacapture; + +import android.os.Bundle; +import android.util.SparseArray; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.LOG; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Holds the pending javascript requests for the plugin + */ +public class PendingRequests { + private static final String LOG_TAG = "PendingCaptureRequests"; + + private static final String CURRENT_ID_KEY = "currentReqId"; + private static final String REQUEST_KEY_PREFIX = "request_"; + + private int currentReqId = 0; + private SparseArray requests = new SparseArray(); + + private Bundle lastSavedState; + private CallbackContext resumeContext; + + /** + * Creates a request and adds it to the array of pending requests. Each created request gets a + * unique result code for use with startActivityForResult() and requestPermission() + * @param action The action this request corresponds to (capture image, capture audio, etc.) + * @param options The options for this request passed from the javascript + * @param callbackContext The CallbackContext to return the result to + * @return The newly created Request object with a unique result code + * @throws JSONException + */ + public synchronized Request createRequest(int action, JSONObject options, CallbackContext callbackContext) throws JSONException { + Request req = new Request(action, options, callbackContext); + requests.put(req.requestCode, req); + return req; + } + + /** + * Gets the request corresponding to this request code + * @param requestCode The request code for the desired request + * @return The request corresponding to the given request code or null if such a + * request is not found + */ + public synchronized Request get(int requestCode) { + // Check to see if this request was saved + if (lastSavedState != null && lastSavedState.containsKey(REQUEST_KEY_PREFIX + requestCode)) { + Request r = new Request(lastSavedState.getBundle(REQUEST_KEY_PREFIX + requestCode), this.resumeContext, requestCode); + requests.put(requestCode, r); + + // Only one of the saved requests will get restored, because that's all cordova-android + // supports. Having more than one is an extremely unlikely scenario anyway + this.lastSavedState = null; + this.resumeContext = null; + + return r; + } + + return requests.get(requestCode); + } + + /** + * Removes the request from the array of pending requests and sends an error plugin result + * to the CallbackContext that contains the given error object + * @param req The request to be resolved + * @param error The error to be returned to the CallbackContext + */ + public synchronized void resolveWithFailure(Request req, JSONObject error) { + req.callbackContext.error(error); + requests.remove(req.requestCode); + } + + /** + * Removes the request from the array of pending requests and sends a successful plugin result + * to the CallbackContext that contains the result of the request + * @param req The request to be resolved + */ + public synchronized void resolveWithSuccess(Request req) { + req.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, req.results)); + requests.remove(req.requestCode); + } + + + /** + * Each request gets a unique ID that represents its request code when calls are made to + * Activities and for permission requests + * @return A unique request code + */ + private synchronized int incrementCurrentReqId() { + return currentReqId ++; + } + + /** + * Restore state saved by calling toBundle along with a callbackContext to be used in + * delivering the results of a pending callback + * + * @param lastSavedState The bundle received from toBundle() + * @param resumeContext The callbackContext to return results to + */ + public synchronized void setLastSavedState(Bundle lastSavedState, CallbackContext resumeContext) { + this.lastSavedState = lastSavedState; + this.resumeContext = resumeContext; + this.currentReqId = lastSavedState.getInt(CURRENT_ID_KEY); + } + + /** + * Save the current pending requests to a bundle for saving when the Activity gets destroyed. + * + * @return A Bundle that can be used to restore state using setLastSavedState() + */ + public synchronized Bundle toBundle() { + Bundle bundle = new Bundle(); + bundle.putInt(CURRENT_ID_KEY, currentReqId); + + for (int i = 0; i < requests.size(); i++) { + Request r = requests.valueAt(i); + int requestCode = requests.keyAt(i); + bundle.putBundle(REQUEST_KEY_PREFIX + requestCode, r.toBundle()); + } + + if (requests.size() > 1) { + // This scenario is hopefully very unlikely because there isn't much that can be + // done about it. Should only occur if an external Activity is launched while + // there is a pending permission request and the device is on low memory + LOG.w(LOG_TAG, "More than one media capture request pending on Activity destruction. Some requests will be dropped!"); + } + + return bundle; + } + + /** + * Holds the options and CallbackContext for a capture request made to the plugin. + */ + public class Request { + + // Keys for use in saving requests to a bundle + private static final String ACTION_KEY = "action"; + private static final String LIMIT_KEY = "limit"; + private static final String DURATION_KEY = "duration"; + private static final String QUALITY_KEY = "quality"; + private static final String RESULTS_KEY = "results"; + + // Unique int used to identify this request in any Android Permission or Activity callbacks + public int requestCode; + + // The action that this request is performing + public int action; + + // The number of pics/vids/audio clips to take (CAPTURE_IMAGE, CAPTURE_VIDEO, CAPTURE_AUDIO) + public long limit = 1; + + // Optional max duration of recording in seconds (CAPTURE_VIDEO only) + public int duration = 0; + + // Quality level for video capture 0 low, 1 high (CAPTURE_VIDEO only) + public int quality = 1; + + // The array of results to be returned to the javascript callback on success + public JSONArray results = new JSONArray(); + + // The callback context for this plugin request + private CallbackContext callbackContext; + + private Request(int action, JSONObject options, CallbackContext callbackContext) throws JSONException { + this.callbackContext = callbackContext; + this.action = action; + + if (options != null) { + this.limit = options.optLong("limit", 1); + this.duration = options.optInt("duration", 0); + this.quality = options.optInt("quality", 1); + } + + this.requestCode = incrementCurrentReqId(); + } + + private Request(Bundle bundle, CallbackContext callbackContext, int requestCode) { + this.callbackContext = callbackContext; + this.requestCode = requestCode; + this.action = bundle.getInt(ACTION_KEY); + this.limit = bundle.getLong(LIMIT_KEY); + this.duration = bundle.getInt(DURATION_KEY); + this.quality = bundle.getInt(QUALITY_KEY); + + try { + this.results = new JSONArray(bundle.getString(RESULTS_KEY)); + } catch(JSONException e) { + // This should never be caught + LOG.e(LOG_TAG, "Error parsing results for request from saved bundle", e); + } + } + + private Bundle toBundle() { + Bundle bundle = new Bundle(); + + bundle.putInt(ACTION_KEY, this.action); + bundle.putLong(LIMIT_KEY, this.limit); + bundle.putInt(DURATION_KEY, this.duration); + bundle.putInt(QUALITY_KEY, this.quality); + bundle.putString(RESULTS_KEY, this.results.toString()); + + return bundle; + } + } +} diff --git a/platforms/android/src/org/apache/cordova/networkinformation/NetworkManager.java b/platforms/android/src/org/apache/cordova/networkinformation/NetworkManager.java new file mode 100755 index 0000000..59965bd --- /dev/null +++ b/platforms/android/src/org/apache/cordova/networkinformation/NetworkManager.java @@ -0,0 +1,274 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.networkinformation; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.apache.cordova.CordovaWebView; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.util.Log; + +import java.util.Locale; + +public class NetworkManager extends CordovaPlugin { + + public static int NOT_REACHABLE = 0; + public static int REACHABLE_VIA_CARRIER_DATA_NETWORK = 1; + public static int REACHABLE_VIA_WIFI_NETWORK = 2; + + public static final String WIFI = "wifi"; + public static final String WIMAX = "wimax"; + // mobile + public static final String MOBILE = "mobile"; + + // Android L calls this Cellular, because I have no idea! + public static final String CELLULAR = "cellular"; + // 2G network types + public static final String GSM = "gsm"; + public static final String GPRS = "gprs"; + public static final String EDGE = "edge"; + // 3G network types + public static final String CDMA = "cdma"; + public static final String UMTS = "umts"; + public static final String HSPA = "hspa"; + public static final String HSUPA = "hsupa"; + public static final String HSDPA = "hsdpa"; + public static final String ONEXRTT = "1xrtt"; + public static final String EHRPD = "ehrpd"; + // 4G network types + public static final String LTE = "lte"; + public static final String UMB = "umb"; + public static final String HSPA_PLUS = "hspa+"; + // return type + public static final String TYPE_UNKNOWN = "unknown"; + public static final String TYPE_ETHERNET = "ethernet"; + public static final String TYPE_WIFI = "wifi"; + public static final String TYPE_2G = "2g"; + public static final String TYPE_3G = "3g"; + public static final String TYPE_4G = "4g"; + public static final String TYPE_NONE = "none"; + + private static final String LOG_TAG = "NetworkManager"; + + private CallbackContext connectionCallbackContext; + + ConnectivityManager sockMan; + BroadcastReceiver receiver; + private JSONObject lastInfo = null; + + /** + * Sets the context of the Command. This can then be used to do things like + * get file paths associated with the Activity. + * + * @param cordova The context of the main Activity. + * @param webView The CordovaWebView Cordova is running in. + */ + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + super.initialize(cordova, webView); + this.sockMan = (ConnectivityManager) cordova.getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); + this.connectionCallbackContext = null; + + // We need to listen to connectivity events to update navigator.connection + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + if (this.receiver == null) { + this.receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // (The null check is for the ARM Emulator, please use Intel Emulator for better results) + if(NetworkManager.this.webView != null) + updateConnectionInfo(sockMan.getActiveNetworkInfo()); + } + }; + webView.getContext().registerReceiver(this.receiver, intentFilter); + } + + } + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArry of arguments for the plugin. + * @param callbackContext The callback id used when calling back into JavaScript. + * @return True if the action was valid, false otherwise. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) { + if (action.equals("getConnectionInfo")) { + this.connectionCallbackContext = callbackContext; + NetworkInfo info = sockMan.getActiveNetworkInfo(); + String connectionType = ""; + try { + connectionType = this.getConnectionInfo(info).get("type").toString(); + } catch (JSONException e) { } + + PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, connectionType); + pluginResult.setKeepCallback(true); + callbackContext.sendPluginResult(pluginResult); + return true; + } + return false; + } + + /** + * Stop network receiver. + */ + public void onDestroy() { + if (this.receiver != null) { + try { + webView.getContext().unregisterReceiver(this.receiver); + } catch (Exception e) { + Log.e(LOG_TAG, "Error unregistering network receiver: " + e.getMessage(), e); + } finally { + receiver = null; + } + } + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + + /** + * Updates the JavaScript side whenever the connection changes + * + * @param info the current active network info + * @return + */ + private void updateConnectionInfo(NetworkInfo info) { + // send update to javascript "navigator.network.connection" + // Jellybean sends its own info + JSONObject thisInfo = this.getConnectionInfo(info); + if(!thisInfo.equals(lastInfo)) + { + String connectionType = ""; + try { + connectionType = thisInfo.get("type").toString(); + } catch (JSONException e) { } + + sendUpdate(connectionType); + lastInfo = thisInfo; + } + } + + /** + * Get the latest network connection information + * + * @param info the current active network info + * @return a JSONObject that represents the network info + */ + private JSONObject getConnectionInfo(NetworkInfo info) { + String type = TYPE_NONE; + String extraInfo = ""; + if (info != null) { + // If we are not connected to any network set type to none + if (!info.isConnected()) { + type = TYPE_NONE; + } + else { + type = getType(info); + } + extraInfo = info.getExtraInfo(); + } + + Log.d("CordovaNetworkManager", "Connection Type: " + type); + Log.d("CordovaNetworkManager", "Connection Extra Info: " + extraInfo); + + JSONObject connectionInfo = new JSONObject(); + + try { + connectionInfo.put("type", type); + connectionInfo.put("extraInfo", extraInfo); + } catch (JSONException e) { } + + return connectionInfo; + } + + /** + * Create a new plugin result and send it back to JavaScript + * + * @param connection the network info to set as navigator.connection + */ + private void sendUpdate(String type) { + if (connectionCallbackContext != null) { + PluginResult result = new PluginResult(PluginResult.Status.OK, type); + result.setKeepCallback(true); + connectionCallbackContext.sendPluginResult(result); + } + webView.postMessage("networkconnection", type); + } + + /** + * Determine the type of connection + * + * @param info the network info so we can determine connection type. + * @return the type of mobile network we are on + */ + private String getType(NetworkInfo info) { + if (info != null) { + String type = info.getTypeName().toLowerCase(Locale.US); + + Log.d("CordovaNetworkManager", "toLower : " + type.toLowerCase()); + Log.d("CordovaNetworkManager", "wifi : " + WIFI); + if (type.equals(WIFI)) { + return TYPE_WIFI; + } + else if (type.toLowerCase().equals(TYPE_ETHERNET)) { + return TYPE_ETHERNET; + } + else if (type.equals(MOBILE) || type.equals(CELLULAR)) { + type = info.getSubtypeName().toLowerCase(Locale.US); + if (type.equals(GSM) || + type.equals(GPRS) || + type.equals(EDGE)) { + return TYPE_2G; + } + else if (type.startsWith(CDMA) || + type.equals(UMTS) || + type.equals(ONEXRTT) || + type.equals(EHRPD) || + type.equals(HSUPA) || + type.equals(HSDPA) || + type.equals(HSPA)) { + return TYPE_3G; + } + else if (type.equals(LTE) || + type.equals(UMB) || + type.equals(HSPA_PLUS)) { + return TYPE_4G; + } + } + } + else { + return TYPE_NONE; + } + return TYPE_UNKNOWN; + } +} diff --git a/platforms/android/src/org/apache/cordova/vibration/Vibration.java b/platforms/android/src/org/apache/cordova/vibration/Vibration.java new file mode 100644 index 0000000..7a2537f --- /dev/null +++ b/platforms/android/src/org/apache/cordova/vibration/Vibration.java @@ -0,0 +1,133 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +*/ +package org.apache.cordova.vibration; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.json.JSONArray; +import org.json.JSONException; +import android.content.Context; +import android.os.Vibrator; +import android.media.AudioManager; + +/** + * This class provides access to vibration on the device. + */ +public class Vibration extends CordovaPlugin { + + /** + * Constructor. + */ + public Vibration() { + } + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArray of arguments for the plugin. + * @param callbackContext The callback context used when calling back into JavaScript. + * @return True when the action was valid, false otherwise. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + if (action.equals("vibrate")) { + this.vibrate(args.getLong(0)); + } + else if (action.equals("vibrateWithPattern")) { + JSONArray pattern = args.getJSONArray(0); + int repeat = args.getInt(1); + //add a 0 at the beginning of pattern to align with w3c + long[] patternArray = new long[pattern.length()+1]; + patternArray[0] = 0; + for (int i = 0; i < pattern.length(); i++) { + patternArray[i+1] = pattern.getLong(i); + } + this.vibrateWithPattern(patternArray, repeat); + } + else if (action.equals("cancelVibration")) { + this.cancelVibration(); + } + else { + return false; + } + + // Only alert and confirm are async. + callbackContext.success(); + + return true; + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + + /** + * Vibrates the device for a given amount of time. + * + * @param time Time to vibrate in ms. + */ + public void vibrate(long time) { + // Start the vibration, 0 defaults to half a second. + if (time == 0) { + time = 500; + } + AudioManager manager = (AudioManager) this.cordova.getActivity().getSystemService(Context.AUDIO_SERVICE); + if (manager.getRingerMode() != AudioManager.RINGER_MODE_SILENT) { + Vibrator vibrator = (Vibrator) this.cordova.getActivity().getSystemService(Context.VIBRATOR_SERVICE); + vibrator.vibrate(time); + } + } + + /** + * Vibrates the device with a given pattern. + * + * @param pattern Pattern with which to vibrate the device. + * Pass in an array of longs that + * are the durations for which to + * turn on or off the vibrator in + * milliseconds. The first value + * indicates the number of milliseconds + * to wait before turning the vibrator + * on. The next value indicates the + * number of milliseconds for which + * to keep the vibrator on before + * turning it off. Subsequent values + * alternate between durations in + * milliseconds to turn the vibrator + * off or to turn the vibrator on. + * + * @param repeat Optional index into the pattern array at which + * to start repeating, or -1 for no repetition (default). + */ + public void vibrateWithPattern(long[] pattern, int repeat) { + AudioManager manager = (AudioManager) this.cordova.getActivity().getSystemService(Context.AUDIO_SERVICE); + if (manager.getRingerMode() != AudioManager.RINGER_MODE_SILENT) { + Vibrator vibrator = (Vibrator) this.cordova.getActivity().getSystemService(Context.VIBRATOR_SERVICE); + vibrator.vibrate(pattern, repeat); + } + } + + /** + * Immediately cancels any currently running vibration. + */ + public void cancelVibration() { + Vibrator vibrator = (Vibrator) this.cordova.getActivity().getSystemService(Context.VIBRATOR_SERVICE); + vibrator.cancel(); + } +} diff --git a/platforms/browser/browser.json b/platforms/browser/browser.json index ff3827b..64ec261 100644 --- a/platforms/browser/browser.json +++ b/platforms/browser/browser.json @@ -9,7 +9,11 @@ "parents": { "/*": [ { - "xml": "", + "xml": "", + "count": 1 + }, + { + "xml": "", "count": 1 } ] @@ -21,33 +25,614 @@ "cordova-plugin-compat": { "PACKAGE_NAME": "com.netsyms.SnipeITMobile" }, - "cordova-plugin-whitelist": { + "cordova-plugin-dialogs": { "PACKAGE_NAME": "com.netsyms.SnipeITMobile" }, - "phonegap-plugin-barcodescanner": { + "cordova-plugin-file": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-media": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-file-transfer": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-media-capture": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-device-orientation": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-device": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-battery-status": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-camera": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-contacts": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-device-motion": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-geolocation": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-vibration": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-network-information": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-console": { + "PACKAGE_NAME": "com.netsyms.SnipeITMobile" + }, + "cordova-plugin-whitelist": { "PACKAGE_NAME": "com.netsyms.SnipeITMobile" } }, "dependent_plugins": {}, "modules": [ { - "file": "plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js", - "id": "phonegap-plugin-barcodescanner.BarcodeScanner", - "pluginId": "phonegap-plugin-barcodescanner", - "clobbers": [ - "cordova.plugins.barcodeScanner" + "file": "plugins/cordova-plugin-dialogs/www/notification.js", + "id": "cordova-plugin-dialogs.notification", + "pluginId": "cordova-plugin-dialogs", + "merges": [ + "navigator.notification" ] }, { - "file": "plugins/phonegap-plugin-barcodescanner/src/browser/BarcodeScannerProxy.js", - "id": "phonegap-plugin-barcodescanner.BarcodeScannerProxy", - "pluginId": "phonegap-plugin-barcodescanner", + "file": "plugins/cordova-plugin-dialogs/www/browser/notification.js", + "id": "cordova-plugin-dialogs.notification_browser", + "pluginId": "cordova-plugin-dialogs", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js", + "id": "cordova-plugin-file.DirectoryEntry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.DirectoryEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryReader.js", + "id": "cordova-plugin-file.DirectoryReader", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.DirectoryReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Entry.js", + "id": "cordova-plugin-file.Entry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Entry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/File.js", + "id": "cordova-plugin-file.File", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.File" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileEntry.js", + "id": "cordova-plugin-file.FileEntry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileError.js", + "id": "cordova-plugin-file.FileError", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileError" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileReader.js", + "id": "cordova-plugin-file.FileReader", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileSystem.js", + "id": "cordova-plugin-file.FileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js", + "id": "cordova-plugin-file.FileUploadOptions", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileUploadOptions" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadResult.js", + "id": "cordova-plugin-file.FileUploadResult", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileUploadResult" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileWriter.js", + "id": "cordova-plugin-file.FileWriter", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Flags.js", + "id": "cordova-plugin-file.Flags", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Flags" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js", + "id": "cordova-plugin-file.LocalFileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.LocalFileSystem" + ], + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Metadata.js", + "id": "cordova-plugin-file.Metadata", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Metadata" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ProgressEvent.js", + "id": "cordova-plugin-file.ProgressEvent", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.ProgressEvent" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems.js", + "id": "cordova-plugin-file.fileSystems", + "pluginId": "cordova-plugin-file" + }, + { + "file": "plugins/cordova-plugin-file/www/requestFileSystem.js", + "id": "cordova-plugin-file.requestFileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.requestFileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js", + "id": "cordova-plugin-file.resolveLocalFileSystemURI", + "pluginId": "cordova-plugin-file", + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/browser/isChrome.js", + "id": "cordova-plugin-file.isChrome", + "pluginId": "cordova-plugin-file", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/browser/Preparing.js", + "id": "cordova-plugin-file.Preparing", + "pluginId": "cordova-plugin-file", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/src/browser/FileProxy.js", + "id": "cordova-plugin-file.browserFileProxy", + "pluginId": "cordova-plugin-file", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js", + "id": "cordova-plugin-file.fileSystemPaths", + "pluginId": "cordova-plugin-file", + "merges": [ + "cordova" + ], + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/browser/FileSystem.js", + "id": "cordova-plugin-file.firefoxFileSystem", + "pluginId": "cordova-plugin-file", + "merges": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/MediaError.js", + "id": "cordova-plugin-media.MediaError", + "pluginId": "cordova-plugin-media", + "clobbers": [ + "window.MediaError" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/Media.js", + "id": "cordova-plugin-media.Media", + "pluginId": "cordova-plugin-media", + "clobbers": [ + "window.Media" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/browser/Media.js", + "id": "cordova-plugin-media.BrowserMedia", + "pluginId": "cordova-plugin-media", + "clobbers": [ + "window.Media" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransferError.js", + "id": "cordova-plugin-file-transfer.FileTransferError", + "pluginId": "cordova-plugin-file-transfer", + "clobbers": [ + "window.FileTransferError" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransfer.js", + "id": "cordova-plugin-file-transfer.FileTransfer", + "pluginId": "cordova-plugin-file-transfer", + "clobbers": [ + "window.FileTransfer" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/browser/FileTransfer.js", + "id": "cordova-plugin-file-transfer.BrowserFileTransfer", + "pluginId": "cordova-plugin-file-transfer", + "clobbers": [ + "window.FileTransfer" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js", + "id": "cordova-plugin-media-capture.CaptureAudioOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureAudioOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js", + "id": "cordova-plugin-media-capture.CaptureImageOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureImageOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js", + "id": "cordova-plugin-media-capture.CaptureVideoOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureVideoOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureError.js", + "id": "cordova-plugin-media-capture.CaptureError", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureError" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFileData.js", + "id": "cordova-plugin-media-capture.MediaFileData", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "MediaFileData" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFile.js", + "id": "cordova-plugin-media-capture.MediaFile", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "MediaFile" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/helpers.js", + "id": "cordova-plugin-media-capture.helpers", + "pluginId": "cordova-plugin-media-capture", + "runs": true + }, + { + "file": "plugins/cordova-plugin-media-capture/www/capture.js", + "id": "cordova-plugin-media-capture.capture", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "navigator.device.capture" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/src/browser/CaptureProxy.js", + "id": "cordova-plugin-media-capture.CaptureProxy", + "pluginId": "cordova-plugin-media-capture", + "runs": true + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassError.js", + "id": "cordova-plugin-device-orientation.CompassError", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "CompassError" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassHeading.js", + "id": "cordova-plugin-device-orientation.CompassHeading", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "CompassHeading" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/compass.js", + "id": "cordova-plugin-device-orientation.compass", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "navigator.compass" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/src/browser/CompassProxy.js", + "id": "cordova-plugin-device-orientation.CompassProxy", + "pluginId": "cordova-plugin-device-orientation", + "runs": true + }, + { + "file": "plugins/cordova-plugin-device/www/device.js", + "id": "cordova-plugin-device.device", + "pluginId": "cordova-plugin-device", + "clobbers": [ + "device" + ] + }, + { + "file": "plugins/cordova-plugin-device/src/browser/DeviceProxy.js", + "id": "cordova-plugin-device.DeviceProxy", + "pluginId": "cordova-plugin-device", + "runs": true + }, + { + "file": "plugins/cordova-plugin-battery-status/www/battery.js", + "id": "cordova-plugin-battery-status.battery", + "pluginId": "cordova-plugin-battery-status", + "clobbers": [ + "navigator.battery" + ] + }, + { + "file": "plugins/cordova-plugin-battery-status/src/browser/BatteryProxy.js", + "id": "cordova-plugin-battery-status.Battery", + "pluginId": "cordova-plugin-battery-status", + "runs": true + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraConstants.js", + "id": "cordova-plugin-camera.Camera", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "Camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverOptions.js", + "id": "cordova-plugin-camera.CameraPopoverOptions", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "CameraPopoverOptions" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/Camera.js", + "id": "cordova-plugin-camera.camera", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "navigator.camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/src/browser/CameraProxy.js", + "id": "cordova-plugin-camera.CameraProxy", + "pluginId": "cordova-plugin-camera", + "runs": true + }, + { + "file": "plugins/cordova-plugin-contacts/www/contacts.js", + "id": "cordova-plugin-contacts.contacts", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "navigator.contacts" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/Contact.js", + "id": "cordova-plugin-contacts.Contact", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "Contact" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/convertUtils.js", + "id": "cordova-plugin-contacts.convertUtils", + "pluginId": "cordova-plugin-contacts" + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactAddress.js", + "id": "cordova-plugin-contacts.ContactAddress", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactAddress" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactError.js", + "id": "cordova-plugin-contacts.ContactError", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactError" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactField.js", + "id": "cordova-plugin-contacts.ContactField", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactField" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFindOptions.js", + "id": "cordova-plugin-contacts.ContactFindOptions", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactFindOptions" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactName.js", + "id": "cordova-plugin-contacts.ContactName", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactName" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactOrganization.js", + "id": "cordova-plugin-contacts.ContactOrganization", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactOrganization" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFieldType.js", + "id": "cordova-plugin-contacts.ContactFieldType", + "pluginId": "cordova-plugin-contacts", + "merges": [ + "" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/Acceleration.js", + "id": "cordova-plugin-device-motion.Acceleration", + "pluginId": "cordova-plugin-device-motion", + "clobbers": [ + "Acceleration" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/accelerometer.js", + "id": "cordova-plugin-device-motion.accelerometer", + "pluginId": "cordova-plugin-device-motion", + "clobbers": [ + "navigator.accelerometer" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/src/browser/AccelerometerProxy.js", + "id": "cordova-plugin-device-motion.AccelerometerProxy", + "pluginId": "cordova-plugin-device-motion", + "runs": true + }, + { + "file": "plugins/cordova-plugin-vibration/www/vibration.js", + "id": "cordova-plugin-vibration.notification", + "pluginId": "cordova-plugin-vibration", + "merges": [ + "navigator.notification", + "navigator" + ] + }, + { + "file": "plugins/cordova-plugin-vibration/src/browser/Vibration.js", + "id": "cordova-plugin-vibration.Vibration", + "pluginId": "cordova-plugin-vibration", + "merges": [ + "navigator.notification", + "navigator" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/network.js", + "id": "cordova-plugin-network-information.network", + "pluginId": "cordova-plugin-network-information", + "clobbers": [ + "navigator.connection", + "navigator.network.connection" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/Connection.js", + "id": "cordova-plugin-network-information.Connection", + "pluginId": "cordova-plugin-network-information", + "clobbers": [ + "Connection" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/src/browser/network.js", + "id": "cordova-plugin-network-information.NetworkInfoProxy", + "pluginId": "cordova-plugin-network-information", "runs": true } ], "plugin_metadata": { "cordova-plugin-compat": "1.0.0", - "cordova-plugin-whitelist": "1.2.2", - "phonegap-plugin-barcodescanner": "5.0.0" + "cordova-plugin-dialogs": "1.2.2-dev", + "cordova-plugin-file": "4.2.0", + "cordova-plugin-media": "2.3.1-dev", + "cordova-plugin-file-transfer": "1.5.2-dev", + "cordova-plugin-media-capture": "1.3.1-dev", + "cordova-plugin-device-orientation": "1.0.4-dev", + "cordova-plugin-device": "1.1.3-dev", + "cordova-plugin-battery-status": "1.1.3-dev", + "cordova-plugin-camera": "2.2.1-dev", + "cordova-plugin-contacts": "2.1.1-dev", + "cordova-plugin-device-motion": "1.2.2-dev", + "cordova-plugin-geolocation": "2.2.1-dev", + "cordova-plugin-vibration": "2.1.2-dev", + "cordova-plugin-network-information": "1.2.2-dev", + "cordova-plugin-console": "1.0.4-dev", + "cordova-plugin-whitelist": "1.2.2" } } \ No newline at end of file diff --git a/platforms/browser/config.xml b/platforms/browser/config.xml index 98845e5..443ddba 100644 --- a/platforms/browser/config.xml +++ b/platforms/browser/config.xml @@ -1,7 +1,10 @@ - - + + + + + Snipe IT Mobile diff --git a/platforms/browser/platform_www/cordova_plugins.js b/platforms/browser/platform_www/cordova_plugins.js index aba7768..6e5c3ca 100644 --- a/platforms/browser/platform_www/cordova_plugins.js +++ b/platforms/browser/platform_www/cordova_plugins.js @@ -1,17 +1,542 @@ cordova.define('cordova/plugin_list', function(require, exports, module) { module.exports = [ { - "file": "plugins/phonegap-plugin-barcodescanner/www/barcodescanner.js", - "id": "phonegap-plugin-barcodescanner.BarcodeScanner", - "pluginId": "phonegap-plugin-barcodescanner", - "clobbers": [ - "cordova.plugins.barcodeScanner" + "file": "plugins/cordova-plugin-dialogs/www/notification.js", + "id": "cordova-plugin-dialogs.notification", + "pluginId": "cordova-plugin-dialogs", + "merges": [ + "navigator.notification" ] }, { - "file": "plugins/phonegap-plugin-barcodescanner/src/browser/BarcodeScannerProxy.js", - "id": "phonegap-plugin-barcodescanner.BarcodeScannerProxy", - "pluginId": "phonegap-plugin-barcodescanner", + "file": "plugins/cordova-plugin-dialogs/www/browser/notification.js", + "id": "cordova-plugin-dialogs.notification_browser", + "pluginId": "cordova-plugin-dialogs", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js", + "id": "cordova-plugin-file.DirectoryEntry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.DirectoryEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryReader.js", + "id": "cordova-plugin-file.DirectoryReader", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.DirectoryReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Entry.js", + "id": "cordova-plugin-file.Entry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Entry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/File.js", + "id": "cordova-plugin-file.File", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.File" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileEntry.js", + "id": "cordova-plugin-file.FileEntry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileError.js", + "id": "cordova-plugin-file.FileError", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileError" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileReader.js", + "id": "cordova-plugin-file.FileReader", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileSystem.js", + "id": "cordova-plugin-file.FileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js", + "id": "cordova-plugin-file.FileUploadOptions", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileUploadOptions" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadResult.js", + "id": "cordova-plugin-file.FileUploadResult", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileUploadResult" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileWriter.js", + "id": "cordova-plugin-file.FileWriter", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Flags.js", + "id": "cordova-plugin-file.Flags", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Flags" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js", + "id": "cordova-plugin-file.LocalFileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.LocalFileSystem" + ], + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Metadata.js", + "id": "cordova-plugin-file.Metadata", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Metadata" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ProgressEvent.js", + "id": "cordova-plugin-file.ProgressEvent", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.ProgressEvent" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems.js", + "id": "cordova-plugin-file.fileSystems", + "pluginId": "cordova-plugin-file" + }, + { + "file": "plugins/cordova-plugin-file/www/requestFileSystem.js", + "id": "cordova-plugin-file.requestFileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.requestFileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js", + "id": "cordova-plugin-file.resolveLocalFileSystemURI", + "pluginId": "cordova-plugin-file", + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/browser/isChrome.js", + "id": "cordova-plugin-file.isChrome", + "pluginId": "cordova-plugin-file", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/browser/Preparing.js", + "id": "cordova-plugin-file.Preparing", + "pluginId": "cordova-plugin-file", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/src/browser/FileProxy.js", + "id": "cordova-plugin-file.browserFileProxy", + "pluginId": "cordova-plugin-file", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js", + "id": "cordova-plugin-file.fileSystemPaths", + "pluginId": "cordova-plugin-file", + "merges": [ + "cordova" + ], + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/browser/FileSystem.js", + "id": "cordova-plugin-file.firefoxFileSystem", + "pluginId": "cordova-plugin-file", + "merges": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/MediaError.js", + "id": "cordova-plugin-media.MediaError", + "pluginId": "cordova-plugin-media", + "clobbers": [ + "window.MediaError" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/Media.js", + "id": "cordova-plugin-media.Media", + "pluginId": "cordova-plugin-media", + "clobbers": [ + "window.Media" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/browser/Media.js", + "id": "cordova-plugin-media.BrowserMedia", + "pluginId": "cordova-plugin-media", + "clobbers": [ + "window.Media" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransferError.js", + "id": "cordova-plugin-file-transfer.FileTransferError", + "pluginId": "cordova-plugin-file-transfer", + "clobbers": [ + "window.FileTransferError" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransfer.js", + "id": "cordova-plugin-file-transfer.FileTransfer", + "pluginId": "cordova-plugin-file-transfer", + "clobbers": [ + "window.FileTransfer" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/browser/FileTransfer.js", + "id": "cordova-plugin-file-transfer.BrowserFileTransfer", + "pluginId": "cordova-plugin-file-transfer", + "clobbers": [ + "window.FileTransfer" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js", + "id": "cordova-plugin-media-capture.CaptureAudioOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureAudioOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js", + "id": "cordova-plugin-media-capture.CaptureImageOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureImageOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js", + "id": "cordova-plugin-media-capture.CaptureVideoOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureVideoOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureError.js", + "id": "cordova-plugin-media-capture.CaptureError", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureError" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFileData.js", + "id": "cordova-plugin-media-capture.MediaFileData", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "MediaFileData" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFile.js", + "id": "cordova-plugin-media-capture.MediaFile", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "MediaFile" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/helpers.js", + "id": "cordova-plugin-media-capture.helpers", + "pluginId": "cordova-plugin-media-capture", + "runs": true + }, + { + "file": "plugins/cordova-plugin-media-capture/www/capture.js", + "id": "cordova-plugin-media-capture.capture", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "navigator.device.capture" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/src/browser/CaptureProxy.js", + "id": "cordova-plugin-media-capture.CaptureProxy", + "pluginId": "cordova-plugin-media-capture", + "runs": true + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassError.js", + "id": "cordova-plugin-device-orientation.CompassError", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "CompassError" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassHeading.js", + "id": "cordova-plugin-device-orientation.CompassHeading", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "CompassHeading" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/compass.js", + "id": "cordova-plugin-device-orientation.compass", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "navigator.compass" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/src/browser/CompassProxy.js", + "id": "cordova-plugin-device-orientation.CompassProxy", + "pluginId": "cordova-plugin-device-orientation", + "runs": true + }, + { + "file": "plugins/cordova-plugin-device/www/device.js", + "id": "cordova-plugin-device.device", + "pluginId": "cordova-plugin-device", + "clobbers": [ + "device" + ] + }, + { + "file": "plugins/cordova-plugin-device/src/browser/DeviceProxy.js", + "id": "cordova-plugin-device.DeviceProxy", + "pluginId": "cordova-plugin-device", + "runs": true + }, + { + "file": "plugins/cordova-plugin-battery-status/www/battery.js", + "id": "cordova-plugin-battery-status.battery", + "pluginId": "cordova-plugin-battery-status", + "clobbers": [ + "navigator.battery" + ] + }, + { + "file": "plugins/cordova-plugin-battery-status/src/browser/BatteryProxy.js", + "id": "cordova-plugin-battery-status.Battery", + "pluginId": "cordova-plugin-battery-status", + "runs": true + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraConstants.js", + "id": "cordova-plugin-camera.Camera", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "Camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverOptions.js", + "id": "cordova-plugin-camera.CameraPopoverOptions", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "CameraPopoverOptions" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/Camera.js", + "id": "cordova-plugin-camera.camera", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "navigator.camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/src/browser/CameraProxy.js", + "id": "cordova-plugin-camera.CameraProxy", + "pluginId": "cordova-plugin-camera", + "runs": true + }, + { + "file": "plugins/cordova-plugin-contacts/www/contacts.js", + "id": "cordova-plugin-contacts.contacts", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "navigator.contacts" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/Contact.js", + "id": "cordova-plugin-contacts.Contact", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "Contact" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/convertUtils.js", + "id": "cordova-plugin-contacts.convertUtils", + "pluginId": "cordova-plugin-contacts" + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactAddress.js", + "id": "cordova-plugin-contacts.ContactAddress", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactAddress" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactError.js", + "id": "cordova-plugin-contacts.ContactError", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactError" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactField.js", + "id": "cordova-plugin-contacts.ContactField", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactField" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFindOptions.js", + "id": "cordova-plugin-contacts.ContactFindOptions", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactFindOptions" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactName.js", + "id": "cordova-plugin-contacts.ContactName", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactName" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactOrganization.js", + "id": "cordova-plugin-contacts.ContactOrganization", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactOrganization" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFieldType.js", + "id": "cordova-plugin-contacts.ContactFieldType", + "pluginId": "cordova-plugin-contacts", + "merges": [ + "" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/Acceleration.js", + "id": "cordova-plugin-device-motion.Acceleration", + "pluginId": "cordova-plugin-device-motion", + "clobbers": [ + "Acceleration" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/accelerometer.js", + "id": "cordova-plugin-device-motion.accelerometer", + "pluginId": "cordova-plugin-device-motion", + "clobbers": [ + "navigator.accelerometer" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/src/browser/AccelerometerProxy.js", + "id": "cordova-plugin-device-motion.AccelerometerProxy", + "pluginId": "cordova-plugin-device-motion", + "runs": true + }, + { + "file": "plugins/cordova-plugin-vibration/www/vibration.js", + "id": "cordova-plugin-vibration.notification", + "pluginId": "cordova-plugin-vibration", + "merges": [ + "navigator.notification", + "navigator" + ] + }, + { + "file": "plugins/cordova-plugin-vibration/src/browser/Vibration.js", + "id": "cordova-plugin-vibration.Vibration", + "pluginId": "cordova-plugin-vibration", + "merges": [ + "navigator.notification", + "navigator" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/network.js", + "id": "cordova-plugin-network-information.network", + "pluginId": "cordova-plugin-network-information", + "clobbers": [ + "navigator.connection", + "navigator.network.connection" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/Connection.js", + "id": "cordova-plugin-network-information.Connection", + "pluginId": "cordova-plugin-network-information", + "clobbers": [ + "Connection" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/src/browser/network.js", + "id": "cordova-plugin-network-information.NetworkInfoProxy", + "pluginId": "cordova-plugin-network-information", "runs": true } ]; @@ -19,8 +544,22 @@ module.exports.metadata = // TOP OF METADATA { "cordova-plugin-compat": "1.0.0", - "cordova-plugin-whitelist": "1.2.2", - "phonegap-plugin-barcodescanner": "5.0.0" + "cordova-plugin-dialogs": "1.2.2-dev", + "cordova-plugin-file": "4.2.0", + "cordova-plugin-media": "2.3.1-dev", + "cordova-plugin-file-transfer": "1.5.2-dev", + "cordova-plugin-media-capture": "1.3.1-dev", + "cordova-plugin-device-orientation": "1.0.4-dev", + "cordova-plugin-device": "1.1.3-dev", + "cordova-plugin-battery-status": "1.1.3-dev", + "cordova-plugin-camera": "2.2.1-dev", + "cordova-plugin-contacts": "2.1.1-dev", + "cordova-plugin-device-motion": "1.2.2-dev", + "cordova-plugin-geolocation": "2.2.1-dev", + "cordova-plugin-vibration": "2.1.2-dev", + "cordova-plugin-network-information": "1.2.2-dev", + "cordova-plugin-console": "1.0.4-dev", + "cordova-plugin-whitelist": "1.2.2" } // BOTTOM OF METADATA }); \ No newline at end of file diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-battery-status/src/browser/BatteryProxy.js b/platforms/browser/platform_www/plugins/cordova-plugin-battery-status/src/browser/BatteryProxy.js new file mode 100644 index 0000000..0fc6f34 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-battery-status/src/browser/BatteryProxy.js @@ -0,0 +1,82 @@ +cordova.define("cordova-plugin-battery-status.Battery", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +var w3cBattery; +var winCallBack; + +function success() { + winCallBack({ level: w3cBattery.level * 100, isPlugged: w3cBattery.charging }); +} + +var Battery = { + start: function(win, fail, args, env) { + try { + var subscribe = function(battery) { + w3cBattery = battery; + winCallBack = win; + + success(); + + if (typeof w3cBattery.addEventListener === 'function') { + w3cBattery.addEventListener('levelchange', success, false); + w3cBattery.addEventListener('chargingchange', success, false); + } else { + w3cBattery.onlevelchange = success; + w3cBattery.onchargingchange = success; + } + }; + + if (typeof navigator.getBattery === 'function') { + navigator.getBattery().then(function(battery) { + subscribe(battery); + }); + } else { + var origBattery = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.battery'); + + if (origBattery) { + subscribe(origBattery); + } else { + fail('Not supported'); + } + } + } catch(e) { + fail(e); + } + }, + + stop: function() { + try { + if (typeof w3cBattery.removeEventListener === 'function') { + w3cBattery.removeEventListener('levelchange', success, false); + w3cBattery.removeEventListener('chargingchange', success, false); + } else { + w3cBattery.onlevelchange = null; + w3cBattery.onchargingchange = null; + } + } catch(e) { + console.warn('Error occured while trying to stop battery: ' + JSON.stringify(e)); + } + } +}; + +require("cordova/exec/proxy").add("Battery", Battery); + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-battery-status/www/battery.js b/platforms/browser/platform_www/plugins/cordova-plugin-battery-status/www/battery.js new file mode 100644 index 0000000..9a1671b --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-battery-status/www/battery.js @@ -0,0 +1,112 @@ +cordova.define("cordova-plugin-battery-status.battery", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * This class contains information about the current battery status. + * @constructor + */ +var cordova = require('cordova'), + exec = require('cordova/exec'); + +var STATUS_CRITICAL = 5; +var STATUS_LOW = 20; + +var Battery = function() { + this._level = null; + this._isPlugged = null; + // Create new event handlers on the window (returns a channel instance) + this.channels = { + batterystatus:cordova.addWindowEventHandler("batterystatus"), + batterylow:cordova.addWindowEventHandler("batterylow"), + batterycritical:cordova.addWindowEventHandler("batterycritical") + }; + for (var key in this.channels) { + this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; + } +}; + +function handlers() { + return battery.channels.batterystatus.numHandlers + + battery.channels.batterylow.numHandlers + + battery.channels.batterycritical.numHandlers; +} + +/** + * Event handlers for when callbacks get registered for the battery. + * Keep track of how many handlers we have so we can start and stop the native battery listener + * appropriately (and hopefully save on battery life!). + */ +Battery.onHasSubscribersChange = function() { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(battery._status, battery._error, "Battery", "start", []); + } else if (handlers() === 0) { + exec(null, null, "Battery", "stop", []); + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function (info) { + + if (info) { + if (battery._level !== info.level || battery._isPlugged !== info.isPlugged) { + + if(info.level === null && battery._level !== null) { + return; // special case where callback is called because we stopped listening to the native side. + } + + // Something changed. Fire batterystatus event + cordova.fireWindowEvent("batterystatus", info); + + if (!info.isPlugged) { // do not fire low/critical if we are charging. issue: CB-4520 + // note the following are NOT exact checks, as we want to catch a transition from + // above the threshold to below. issue: CB-4519 + if (battery._level > STATUS_CRITICAL && info.level <= STATUS_CRITICAL) { + // Fire critical battery event + cordova.fireWindowEvent("batterycritical", info); + } + else if (battery._level > STATUS_LOW && info.level <= STATUS_LOW) { + // Fire low battery event + cordova.fireWindowEvent("batterylow", info); + } + } + battery._level = info.level; + battery._isPlugged = info.isPlugged; + } + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +var battery = new Battery(); // jshint ignore:line + +module.exports = battery; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-camera/src/browser/CameraProxy.js b/platforms/browser/platform_www/plugins/cordova-plugin-camera/src/browser/CameraProxy.js new file mode 100644 index 0000000..0218706 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-camera/src/browser/CameraProxy.js @@ -0,0 +1,125 @@ +cordova.define("cordova-plugin-camera.CameraProxy", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +var HIGHEST_POSSIBLE_Z_INDEX = 2147483647; + +function takePicture(success, error, opts) { + if (opts && opts[2] === 1) { + capture(success, error, opts); + } else { + var input = document.createElement('input'); + input.style.position = 'relative'; + input.style.zIndex = HIGHEST_POSSIBLE_Z_INDEX; + input.className = 'cordova-camera-select'; + input.type = 'file'; + input.name = 'files[]'; + + input.onchange = function(inputEvent) { + var reader = new FileReader(); + reader.onload = function(readerEvent) { + input.parentNode.removeChild(input); + + var imageData = readerEvent.target.result; + + return success(imageData.substr(imageData.indexOf(',') + 1)); + }; + + reader.readAsDataURL(inputEvent.target.files[0]); + }; + + document.body.appendChild(input); + } +} + +function capture(success, errorCallback, opts) { + var localMediaStream; + var targetWidth = opts[3]; + var targetHeight = opts[4]; + + targetWidth = targetWidth == -1?320:targetWidth; + targetHeight = targetHeight == -1?240:targetHeight; + + var video = document.createElement('video'); + var button = document.createElement('button'); + var parent = document.createElement('div'); + parent.style.position = 'relative'; + parent.style.zIndex = HIGHEST_POSSIBLE_Z_INDEX; + parent.className = 'cordova-camera-capture'; + parent.appendChild(video); + parent.appendChild(button); + + video.width = targetWidth; + video.height = targetHeight; + button.innerHTML = 'Capture!'; + + button.onclick = function() { + // create a canvas and capture a frame from video stream + var canvas = document.createElement('canvas'); + canvas.width = targetWidth; + canvas.height = targetHeight; + canvas.getContext('2d').drawImage(video, 0, 0, targetWidth, targetHeight); + + // convert image stored in canvas to base64 encoded image + var imageData = canvas.toDataURL('image/png'); + imageData = imageData.replace('data:image/png;base64,', ''); + + // stop video stream, remove video and button. + // Note that MediaStream.stop() is deprecated as of Chrome 47. + if (localMediaStream.stop) { + localMediaStream.stop(); + } else { + localMediaStream.getTracks().forEach(function (track) { + track.stop(); + }); + } + parent.parentNode.removeChild(parent); + + return success(imageData); + }; + + navigator.getUserMedia = navigator.getUserMedia || + navigator.webkitGetUserMedia || + navigator.mozGetUserMedia || + navigator.msGetUserMedia; + + var successCallback = function(stream) { + localMediaStream = stream; + video.src = window.URL.createObjectURL(localMediaStream); + video.play(); + + document.body.appendChild(parent); + }; + + if (navigator.getUserMedia) { + navigator.getUserMedia({video: true, audio: true}, successCallback, errorCallback); + } else { + alert('Browser does not support camera :('); + } +} + +module.exports = { + takePicture: takePicture, + cleanup: function(){} +}; + +require("cordova/exec/proxy").add("Camera",module.exports); + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/Camera.js b/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/Camera.js new file mode 100644 index 0000000..e69b18a --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/Camera.js @@ -0,0 +1,193 @@ +cordova.define("cordova-plugin-camera.camera", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + Camera = require('./Camera'); + // XXX: commented out + //CameraPopoverHandle = require('./CameraPopoverHandle'); + +/** + * @namespace navigator + */ + +/** + * @exports camera + */ +var cameraExport = {}; + +// Tack on the Camera Constants to the base camera plugin. +for (var key in Camera) { + cameraExport[key] = Camera[key]; +} + +/** + * Callback function that provides an error message. + * @callback module:camera.onError + * @param {string} message - The message is provided by the device's native code. + */ + +/** + * Callback function that provides the image data. + * @callback module:camera.onSuccess + * @param {string} imageData - Base64 encoding of the image data, _or_ the image file URI, depending on [`cameraOptions`]{@link module:camera.CameraOptions} in effect. + * @example + * // Show image + * // + * function cameraCallback(imageData) { + * var image = document.getElementById('myImage'); + * image.src = "data:image/jpeg;base64," + imageData; + * } + */ + +/** + * Optional parameters to customize the camera settings. + * * [Quirks](#CameraOptions-quirks) + * @typedef module:camera.CameraOptions + * @type {Object} + * @property {number} [quality=50] - Quality of the saved image, expressed as a range of 0-100, where 100 is typically full resolution with no loss from file compression. (Note that information about the camera's resolution is unavailable.) + * @property {module:Camera.DestinationType} [destinationType=FILE_URI] - Choose the format of the return value. + * @property {module:Camera.PictureSourceType} [sourceType=CAMERA] - Set the source of the picture. + * @property {Boolean} [allowEdit=true] - Allow simple editing of image before selection. + * @property {module:Camera.EncodingType} [encodingType=JPEG] - Choose the returned image file's encoding. + * @property {number} [targetWidth] - Width in pixels to scale image. Must be used with `targetHeight`. Aspect ratio remains constant. + * @property {number} [targetHeight] - Height in pixels to scale image. Must be used with `targetWidth`. Aspect ratio remains constant. + * @property {module:Camera.MediaType} [mediaType=PICTURE] - Set the type of media to select from. Only works when `PictureSourceType` is `PHOTOLIBRARY` or `SAVEDPHOTOALBUM`. + * @property {Boolean} [correctOrientation] - Rotate the image to correct for the orientation of the device during capture. + * @property {Boolean} [saveToPhotoAlbum] - Save the image to the photo album on the device after capture. + * @property {module:CameraPopoverOptions} [popoverOptions] - iOS-only options that specify popover location in iPad. + * @property {module:Camera.Direction} [cameraDirection=BACK] - Choose the camera to use (front- or back-facing). + */ + +/** + * @description Takes a photo using the camera, or retrieves a photo from the device's + * image gallery. The image is passed to the success callback as a + * Base64-encoded `String`, or as the URI for the image file. + * + * The `camera.getPicture` function opens the device's default camera + * application that allows users to snap pictures by default - this behavior occurs, + * when `Camera.sourceType` equals [`Camera.PictureSourceType.CAMERA`]{@link module:Camera.PictureSourceType}. + * Once the user snaps the photo, the camera application closes and the application is restored. + * + * If `Camera.sourceType` is `Camera.PictureSourceType.PHOTOLIBRARY` or + * `Camera.PictureSourceType.SAVEDPHOTOALBUM`, then a dialog displays + * that allows users to select an existing image. The + * `camera.getPicture` function returns a [`CameraPopoverHandle`]{@link module:CameraPopoverHandle} object, + * which can be used to reposition the image selection dialog, for + * example, when the device orientation changes. + * + * The return value is sent to the [`cameraSuccess`]{@link module:camera.onSuccess} callback function, in + * one of the following formats, depending on the specified + * `cameraOptions`: + * + * - A `String` containing the Base64-encoded photo image. + * + * - A `String` representing the image file location on local storage (default). + * + * You can do whatever you want with the encoded image or URI, for + * example: + * + * - Render the image in an `` tag, as in the example below + * + * - Save the data locally (`LocalStorage`, [Lawnchair](http://brianleroux.github.com/lawnchair/), etc.) + * + * - Post the data to a remote server + * + * __NOTE__: Photo resolution on newer devices is quite good. Photos + * selected from the device's gallery are not downscaled to a lower + * quality, even if a `quality` parameter is specified. To avoid common + * memory problems, set `Camera.destinationType` to `FILE_URI` rather + * than `DATA_URL`. + * + * __Supported Platforms__ + * + * - Android + * - BlackBerry + * - Browser + * - Firefox + * - FireOS + * - iOS + * - Windows + * - WP8 + * - Ubuntu + * + * More examples [here](#camera-getPicture-examples). Quirks [here](#camera-getPicture-quirks). + * + * @example + * navigator.camera.getPicture(cameraSuccess, cameraError, cameraOptions); + * @param {module:camera.onSuccess} successCallback + * @param {module:camera.onError} errorCallback + * @param {module:camera.CameraOptions} options CameraOptions + */ +cameraExport.getPicture = function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); + options = options || {}; + var getValue = argscheck.getValue; + + var quality = getValue(options.quality, 50); + var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); + var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); + var targetWidth = getValue(options.targetWidth, -1); + var targetHeight = getValue(options.targetHeight, -1); + var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); + var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); + var allowEdit = !!options.allowEdit; + var correctOrientation = !!options.correctOrientation; + var saveToPhotoAlbum = !!options.saveToPhotoAlbum; + var popoverOptions = getValue(options.popoverOptions, null); + var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); + + var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, + mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; + + exec(successCallback, errorCallback, "Camera", "takePicture", args); + // XXX: commented out + //return new CameraPopoverHandle(); +}; + +/** + * Removes intermediate image files that are kept in temporary storage + * after calling [`camera.getPicture`]{@link module:camera.getPicture}. Applies only when the value of + * `Camera.sourceType` equals `Camera.PictureSourceType.CAMERA` and the + * `Camera.destinationType` equals `Camera.DestinationType.FILE_URI`. + * + * __Supported Platforms__ + * + * - iOS + * + * @example + * navigator.camera.cleanup(onSuccess, onFail); + * + * function onSuccess() { + * console.log("Camera cleanup success.") + * } + * + * function onFail(message) { + * alert('Failed because: ' + message); + * } + */ +cameraExport.cleanup = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, "Camera", "cleanup", []); +}; + +module.exports = cameraExport; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js b/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js new file mode 100644 index 0000000..df6cce4 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js @@ -0,0 +1,90 @@ +cordova.define("cordova-plugin-camera.Camera", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * @module Camera + */ +module.exports = { + /** + * @enum {number} + */ + DestinationType:{ + /** Return base64 encoded string. DATA_URL can be very memory intensive and cause app crashes or out of memory errors. Use FILE_URI or NATIVE_URI if possible */ + DATA_URL: 0, + /** Return file uri (content://media/external/images/media/2 for Android) */ + FILE_URI: 1, + /** Return native uri (eg. asset-library://... for iOS) */ + NATIVE_URI: 2 + }, + /** + * @enum {number} + */ + EncodingType:{ + /** Return JPEG encoded image */ + JPEG: 0, + /** Return PNG encoded image */ + PNG: 1 + }, + /** + * @enum {number} + */ + MediaType:{ + /** Allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType */ + PICTURE: 0, + /** Allow selection of video only, ONLY RETURNS URL */ + VIDEO: 1, + /** Allow selection from all media types */ + ALLMEDIA : 2 + }, + /** + * @enum {number} + */ + PictureSourceType:{ + /** Choose image from picture library (same as SAVEDPHOTOALBUM for Android) */ + PHOTOLIBRARY : 0, + /** Take picture from camera */ + CAMERA : 1, + /** Choose image from picture library (same as PHOTOLIBRARY for Android) */ + SAVEDPHOTOALBUM : 2 + }, + /** + * Matches iOS UIPopoverArrowDirection constants to specify arrow location on popover. + * @enum {number} + */ + PopoverArrowDirection:{ + ARROW_UP : 1, + ARROW_DOWN : 2, + ARROW_LEFT : 4, + ARROW_RIGHT : 8, + ARROW_ANY : 15 + }, + /** + * @enum {number} + */ + Direction:{ + /** Use the back-facing camera */ + BACK: 0, + /** Use the front-facing camera */ + FRONT: 1 + } +}; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js b/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js new file mode 100644 index 0000000..08d20d3 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js @@ -0,0 +1,54 @@ +cordova.define("cordova-plugin-camera.CameraPopoverOptions", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Camera = require('./Camera'); + +/** + * @namespace navigator + */ + +/** + * iOS-only parameters that specify the anchor element location and arrow + * direction of the popover when selecting images from an iPad's library + * or album. + * Note that the size of the popover may change to adjust to the + * direction of the arrow and orientation of the screen. Make sure to + * account for orientation changes when specifying the anchor element + * location. + * @module CameraPopoverOptions + * @param {Number} [x=0] - x pixel coordinate of screen element onto which to anchor the popover. + * @param {Number} [y=32] - y pixel coordinate of screen element onto which to anchor the popover. + * @param {Number} [width=320] - width, in pixels, of the screen element onto which to anchor the popover. + * @param {Number} [height=480] - height, in pixels, of the screen element onto which to anchor the popover. + * @param {module:Camera.PopoverArrowDirection} [arrowDir=ARROW_ANY] - Direction the arrow on the popover should point. + */ +var CameraPopoverOptions = function (x, y, width, height, arrowDir) { + // information of rectangle that popover should be anchored to + this.x = x || 0; + this.y = y || 32; + this.width = width || 320; + this.height = height || 480; + this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; +}; + +module.exports = CameraPopoverOptions; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/Contact.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/Contact.js new file mode 100644 index 0000000..39fd02f --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/Contact.js @@ -0,0 +1,142 @@ +cordova.define("cordova-plugin-contacts.Contact", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + utils = require('cordova/utils'), + convertUtils = require('./convertUtils'); + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + 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.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "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 = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('./contacts').create(result); + successCB(convertUtils.toCordovaFormat(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertUtils.toNativeFormat(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js new file mode 100644 index 0000000..a6246de --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js @@ -0,0 +1,48 @@ +cordova.define("cordova-plugin-contacts.ContactAddress", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js new file mode 100644 index 0000000..ee9715a --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js @@ -0,0 +1,45 @@ +cordova.define("cordova-plugin-contacts.ContactError", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.OPERATION_CANCELLED_ERROR = 6; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js new file mode 100644 index 0000000..589f585 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js @@ -0,0 +1,39 @@ +cordova.define("cordova-plugin-contacts.ContactField", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js new file mode 100644 index 0000000..c364ed6 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js @@ -0,0 +1,57 @@ +cordova.define("cordova-plugin-contacts.ContactFieldType", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + // Possible field names for various platforms. + // Some field names are platform specific + + var fieldType = { + addresses: "addresses", + birthday: "birthday", + categories: "categories", + country: "country", + department: "department", + displayName: "displayName", + emails: "emails", + familyName: "familyName", + formatted: "formatted", + givenName: "givenName", + honorificPrefix: "honorificPrefix", + honorificSuffix: "honorificSuffix", + id: "id", + ims: "ims", + locality: "locality", + middleName: "middleName", + name: "name", + nickname: "nickname", + note: "note", + organizations: "organizations", + phoneNumbers: "phoneNumbers", + photos: "photos", + postalCode: "postalCode", + region: "region", + streetAddress: "streetAddress", + title: "title", + urls: "urls" + }; + + module.exports = fieldType; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js new file mode 100644 index 0000000..2fa2c67 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js @@ -0,0 +1,40 @@ +cordova.define("cordova-plugin-contacts.ContactFindOptions", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + * @param desiredFields + * @param hasPhoneNumber boolean used to filter the search and only return contacts that have a phone number informed + */ + +var ContactFindOptions = function(filter, multiple, desiredFields, hasPhoneNumber) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); + this.desiredFields = typeof desiredFields != 'undefined' ? desiredFields : []; + this.hasPhoneNumber = typeof hasPhoneNumber != 'undefined' ? hasPhoneNumber : false; +}; + +module.exports = ContactFindOptions; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js new file mode 100644 index 0000000..41b5e6d --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js @@ -0,0 +1,43 @@ +cordova.define("cordova-plugin-contacts.ContactName", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js new file mode 100644 index 0000000..8e1302e --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js @@ -0,0 +1,43 @@ +cordova.define("cordova-plugin-contacts.ContactOrganization", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact organization. +* @constructor +* @param pref +* @param type +* @param name +* @param dept +* @param title +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/contacts.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/contacts.js new file mode 100644 index 0000000..f90121a --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/contacts.js @@ -0,0 +1,101 @@ +cordova.define("cordova-plugin-contacts.contacts", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + Contact = require('./Contact'), + fieldType = require('./ContactFieldType'), + convertUtils = require('./convertUtils'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + fieldType: fieldType, + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find: function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + if (errorCB) { + errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } + } else { + // missing 'options' param means return all contacts + options = options || { filter: '', multiple: true }; + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(convertUtils.toCordovaFormat(contacts.create(result[i]))); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function picks contact from phone using contact picker UI + * @returns new Contact object + */ + pickContact: function (successCB, errorCB) { + + argscheck.checkArgs('fF', 'contacts.pick', arguments); + + var win = function (result) { + // if Contacts.pickContact return instance of Contact object + // don't create new Contact object, use current + var contact = result instanceof Contact ? result : contacts.create(result); + successCB(convertUtils.toCordovaFormat(contact)); + }; + exec(win, errorCB, "Contacts", "pickContact", []); + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create: function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js new file mode 100644 index 0000000..9295eaf --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js @@ -0,0 +1,72 @@ +cordova.define("cordova-plugin-contacts.convertUtils", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var utils = require('cordova/utils'); + +module.exports = { + /** + * Converts primitives into Complex Object + * Currently only used for Date fields + */ + toCordovaFormat: function (contact) { + var value = contact.birthday; + if (value !== null) { + try { + contact.birthday = new Date(parseFloat(value)); + + //we might get 'Invalid Date' which does not throw an error + //and is an instance of Date. + if (isNaN(contact.birthday.getTime())) { + contact.birthday = null; + } + + } catch (exception){ + console.log("Cordova Contact toCordovaFormat error: exception creating date."); + } + } + return contact; + }, + + /** + * Converts Complex objects into primitives + * Only conversion at present is for Dates. + **/ + toNativeFormat: function (contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; + } +}; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/src/browser/AccelerometerProxy.js b/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/src/browser/AccelerometerProxy.js new file mode 100644 index 0000000..fbca986 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/src/browser/AccelerometerProxy.js @@ -0,0 +1,47 @@ +cordova.define("cordova-plugin-device-motion.AccelerometerProxy", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + +function listener(success) { + var accel = {}; + + accel.x = (Math.round(((Math.random() * 2) - 1) * 100) / 100); + accel.y = (Math.round(((Math.random() * 2) - 1) * 100) / 100); + accel.z = (Math.round(((Math.random() * 2) - 1) * 100) / 100); + accel.timestamp = new Date().getTime(); + + success(accel); + + window.removeEventListener('devicemotion', listener, false); +} + +var Accelerometer = { + start: function start(success, error) { + return window.addEventListener('devicemotion', function(){ + listener(success); + }, false); + } +}; + +module.exports = Accelerometer; +require('cordova/exec/proxy').add('Accelerometer', Accelerometer); + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js b/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js new file mode 100644 index 0000000..fd4ea4e --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js @@ -0,0 +1,31 @@ +cordova.define("cordova-plugin-device-motion.Acceleration", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Acceleration = function(x, y, z, timestamp) { + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); +}; + +module.exports = Acceleration; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js b/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js new file mode 100644 index 0000000..6cf3d9b --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js @@ -0,0 +1,204 @@ +cordova.define("cordova-plugin-device-motion.accelerometer", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * This class provides access to device accelerometer data. + * @constructor + */ +var argscheck = require('cordova/argscheck'), + utils = require("cordova/utils"), + exec = require("cordova/exec"), + Acceleration = require('./Acceleration'); + +// Is the accel sensor running? +var running = false; + +// Keeps reference to watchAcceleration calls. +var timers = {}; + +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Timer used when faking up devicemotion events +var eventTimerId = null; + +// Tells native to start. +function start() { + exec(function (a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function (e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + accel = null; + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return { win: win, fail: fail }; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + +var accelerometer = { + /** + * Asynchronously acquires the current acceleration. + * + * @param {Function} successCallback The function to call when the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + */ + getCurrentAcceleration: function (successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); + + if (cordova.platformId === "windowsphone") { + exec(function (a) { + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + successCallback(accel); + }, function (e) { + errorCallback(e); + }, "Accelerometer", "getCurrentAcceleration", []); + + return; + } + + var p; + var win = function (a) { + removeListeners(p); + successCallback(a); + }; + var fail = function (e) { + removeListeners(p); + if (errorCallback) { + errorCallback(e); + } + }; + + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } + }, + + /** + * Asynchronously acquires the acceleration repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchAcceleration: function (successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); + // Default interval (10 sec) + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; + + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); + + var p = createCallbackPair(function () { }, function (e) { + removeListeners(p); + if (errorCallback) { + errorCallback(e); + } + }); + listeners.push(p); + + timers[id] = { + timer: window.setInterval(function () { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners: p + }; + + if (running) { + // If we're already running then immediately invoke the success callback + // but only if we have retrieved a value, sample code does not check for null ... + if (accel) { + successCallback(accel); + } + } else { + start(); + } + + if (cordova.platformId === "browser" && !eventTimerId) { + // Start firing devicemotion events if we haven't already + var devicemotionEvent = new Event('devicemotion'); + eventTimerId = window.setInterval(function() { + window.dispatchEvent(devicemotionEvent); + }, 200); + } + + return id; + }, + + /** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ + clearWatch: function (id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); + delete timers[id]; + + if (eventTimerId && Object.keys(timers).length === 0) { + // No more watchers, so stop firing 'devicemotion' events + window.clearInterval(eventTimerId); + eventTimerId = null; + } + } + } +}; +module.exports = accelerometer; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/src/browser/CompassProxy.js b/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/src/browser/CompassProxy.js new file mode 100644 index 0000000..f24a4b8 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/src/browser/CompassProxy.js @@ -0,0 +1,45 @@ +cordova.define("cordova-plugin-device-orientation.CompassProxy", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Compass = { + getHeading: function(success, error) { + var listener = function() { + var orient = {}; + var heading = (Math.round((Math.random() * 360) * 100) / 100); + + orient.trueHeading = heading; + orient.magneticHeading = heading; + orient.headingAccuracy = 0; + orient.timestamp = new Date().getTime(); + + success(orient); + + window.removeEventListener('deviceorientation', listener, false); + }; + + return window.addEventListener('deviceorientation', listener, false); + } +}; + +module.exports = Compass; +require('cordova/exec/proxy').add('Compass', Compass); + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js b/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js new file mode 100644 index 0000000..7f9d177 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js @@ -0,0 +1,36 @@ +cordova.define("cordova-plugin-device-orientation.CompassError", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * CompassError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var CompassError = function(err) { + this.code = (err !== undefined ? err : null); +}; + +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +module.exports = CompassError; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js b/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js new file mode 100644 index 0000000..32bc9b5 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js @@ -0,0 +1,31 @@ +cordova.define("cordova-plugin-device-orientation.CompassHeading", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { + this.magneticHeading = magneticHeading; + this.trueHeading = trueHeading; + this.headingAccuracy = headingAccuracy; + this.timestamp = timestamp || new Date().getTime(); +}; + +module.exports = CompassHeading; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js b/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js new file mode 100644 index 0000000..c1b7ae6 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js @@ -0,0 +1,120 @@ +cordova.define("cordova-plugin-device-orientation.compass", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + utils = require('cordova/utils'), + CompassHeading = require('./CompassHeading'), + CompassError = require('./CompassError'), + + timers = {}, + eventTimerId = null, + compass = { + /** + * Asynchronously acquires 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. + * @param {CompassOptions} options The options for getting the heading data (not used). + */ + getCurrentHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); + + var win = function(result) { + var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); + successCallback(ch); + }; + var fail = errorCallback && function(code) { + var ce = new CompassError(code); + errorCallback(ce); + }; + + // Get heading + exec(win, fail, "Compass", "getHeading", [options]); + }, + + /** + * Asynchronously acquires 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. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. For iOS, filter parameter + * specifies to watch via a distance filter rather than time. + */ + watchHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); + // Default interval (100 msec) + var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; + var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; + + var id = utils.createUUID(); + if (filter > 0) { + // is an iOS request for watch by filter, no timer needed + timers[id] = "iOS"; + compass.getCurrentHeading(successCallback, errorCallback, options); + } else { + // Start watch timer to get headings + timers[id] = window.setInterval(function() { + compass.getCurrentHeading(successCallback, errorCallback); + }, frequency); + } + + if (cordova.platformId === 'browser' && !eventTimerId) { + // Start firing deviceorientation events if haven't already + var deviceorientationEvent = new Event('deviceorientation'); + eventTimerId = window.setInterval(function() { + window.dispatchEvent(deviceorientationEvent); + }, 200); + } + + return id; + }, + + /** + * Clears the specified heading watch. + * @param {String} id The ID of the watch returned from #watchHeading. + */ + clearWatch:function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + if (timers[id] != "iOS") { + clearInterval(timers[id]); + } else { + // is iOS watch by filter so call into device to stop + exec(null, null, "Compass", "stopHeading", []); + } + delete timers[id]; + + if (eventTimerId && Object.keys(timers).length === 0) { + // No more watchers, so stop firing 'deviceorientation' events + window.clearInterval(eventTimerId); + eventTimerId = null; + } + } + } + }; + +module.exports = compass; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device/src/browser/DeviceProxy.js b/platforms/browser/platform_www/plugins/cordova-plugin-device/src/browser/DeviceProxy.js new file mode 100644 index 0000000..f62801d --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device/src/browser/DeviceProxy.js @@ -0,0 +1,84 @@ +cordova.define("cordova-plugin-device.DeviceProxy", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +var browser = require('cordova/platform'); + +function getPlatform() { + return "browser"; +} + +function getModel() { + return getBrowserInfo(true); +} + +function getVersion() { + return getBrowserInfo(false); +} + +function getBrowserInfo(getModel) { + var userAgent = navigator.userAgent; + var returnVal = ''; + var offset; + + if ((offset = userAgent.indexOf('Chrome')) !== -1) { + returnVal = (getModel) ? 'Chrome' : userAgent.substring(offset + 7); + } else if ((offset = userAgent.indexOf('Safari')) !== -1) { + if (getModel) { + returnVal = 'Safari'; + } else { + returnVal = userAgent.substring(offset + 7); + + if ((offset = userAgent.indexOf('Version')) !== -1) { + returnVal = userAgent.substring(offset + 8); + } + } + } else if ((offset = userAgent.indexOf('Firefox')) !== -1) { + returnVal = (getModel) ? 'Firefox' : userAgent.substring(offset + 8); + } else if ((offset = userAgent.indexOf('MSIE')) !== -1) { + returnVal = (getModel) ? 'MSIE' : userAgent.substring(offset + 5); + } else if ((offset = userAgent.indexOf('Trident')) !== -1) { + returnVal = (getModel) ? 'MSIE' : '11'; + } + + if ((offset = returnVal.indexOf(';')) !== -1 || (offset = returnVal.indexOf(' ')) !== -1) { + returnVal = returnVal.substring(0, offset); + } + + return returnVal; +} + + +module.exports = { + getDeviceInfo: function (success, error) { + setTimeout(function () { + success({ + cordova: browser.cordovaVersion, + platform: getPlatform(), + model: getModel(), + version: getVersion(), + uuid: null + }); + }, 0); + } +}; + +require("cordova/exec/proxy").add("Device", module.exports); + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-device/www/device.js b/platforms/browser/platform_www/plugins/cordova-plugin-device/www/device.js new file mode 100644 index 0000000..ff0c5b4 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-device/www/device.js @@ -0,0 +1,85 @@ +cordova.define("cordova-plugin-device.device", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + cordova = require('cordova'); + +channel.createSticky('onCordovaInfoReady'); +// Tell cordova channel to wait on the CordovaInfoReady event +channel.waitForInitialization('onCordovaInfoReady'); + +/** + * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +function Device() { + this.available = false; + this.platform = null; + this.version = null; + this.uuid = null; + this.cordova = null; + this.model = null; + this.manufacturer = null; + this.isVirtual = null; + this.serial = null; + + var me = this; + + channel.onCordovaReady.subscribe(function() { + me.getInfo(function(info) { + //ignoring info.cordova returning from native, we should use value from cordova.version defined in cordova.js + //TODO: CB-5105 native implementations should not return info.cordova + var buildLabel = cordova.version; + me.available = true; + me.platform = info.platform; + me.version = info.version; + me.uuid = info.uuid; + me.cordova = buildLabel; + me.model = info.model; + me.isVirtual = info.isVirtual; + me.manufacturer = info.manufacturer || 'unknown'; + me.serial = info.serial || 'unknown'; + channel.onCordovaInfoReady.fire(); + },function(e) { + me.available = false; + utils.alert("[ERROR] Error initializing Cordova: " + e); + }); + }); +} + +/** + * Get device info + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + */ +Device.prototype.getInfo = function(successCallback, errorCallback) { + argscheck.checkArgs('fF', 'Device.getInfo', arguments); + exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); +}; + +module.exports = new Device(); + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-dialogs/www/browser/notification.js b/platforms/browser/platform_www/plugins/cordova-plugin-dialogs/www/browser/notification.js new file mode 100644 index 0000000..b66573e --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-dialogs/www/browser/notification.js @@ -0,0 +1,117 @@ +cordova.define("cordova-plugin-dialogs.notification_browser", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +// Platform: browser +window.navigator.notification = window.navigator.notification || {}; + +module.exports.alert = window.navigator.notification.alert = function(message, callback) { + // `notification.alert` executes asynchronously + setTimeout(function() { + window.alert(message); + if (callback) { + callback(); + } + }, 0); +}; + + +module.exports.confirm = window.navigator.notification.confirm = function(message, callback) { + // `notification.confirm` executes asynchronously + setTimeout(function() { + var result = window.confirm(message); + if (callback) { + if (result) { + callback(1); // OK + } + else { + callback(2); // Cancel + } + } + }, 0); +}; + + +module.exports.prompt = window.navigator.notification.prompt = function(message, callback, title, buttonLabels, defaultText) { + // `notification.prompt` executes asynchronously + setTimeout(function() { + var result = window.prompt(message, defaultText || ''); + if (callback) { + if (result === null) { + callback({ buttonIndex: 2, input1: '' }); // Cancel + } + else { + callback({ buttonIndex: 1, input1: result }); // OK + } + } + }, 0); +}; + + +var audioContext = (function() { + // Determine if the Audio API is supported by this browser + var AudioApi = window.AudioContext; + if (!AudioApi) { + AudioApi = window.webkitAudioContext; + } + + if (AudioApi) { + // The Audio API is supported, so create a singleton instance of the AudioContext + return new AudioApi(); + } + + return undefined; +}()); + +module.exports.beep = window.navigator.notification.beep = function(times) { + if (times > 0) { + var BEEP_DURATION = 700; + var BEEP_INTERVAL = 300; + + if (audioContext) { + // Start a beep, using the Audio API + var osc = audioContext.createOscillator(); + osc.type = 0; // sounds like a "beep" + osc.connect(audioContext.destination); + osc.start(0); + + setTimeout(function() { + // Stop the beep after the BEEP_DURATION + osc.stop(0); + + if (--times > 0) { + // Beep again, after a pause + setTimeout(function() { + navigator.notification.beep(times); + }, BEEP_INTERVAL); + } + + }, BEEP_DURATION); + } + else if (typeof(console) !== 'undefined' && typeof(console.log) === 'function') { + // Audio API isn't supported, so just write `beep` to the console + for (var i = 0; i < times; i++) { + console.log('Beep!'); + } + } + } +}; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-dialogs/www/notification.js b/platforms/browser/platform_www/plugins/cordova-plugin-dialogs/www/notification.js new file mode 100644 index 0000000..b5e758d --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-dialogs/www/notification.js @@ -0,0 +1,129 @@ +cordova.define("cordova-plugin-dialogs.notification", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); +var platform = require('cordova/platform'); + +/** + * Provides access to notifications on the device. + */ + +module.exports = { + + /** + * Open a native alert dialog, with a customizable title and button text. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} completeCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Alert) + * @param {String} buttonLabel Label of the close button (default: OK) + */ + alert: function(message, completeCallback, title, buttonLabel) { + var _title = (typeof title === "string" ? title : "Alert"); + var _buttonLabel = (buttonLabel || "OK"); + exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]); + }, + + /** + * Open a native confirm dialog, with a customizable title and button text. + * The result that the user selects is returned to the result callback. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Confirm) + * @param {Array} buttonLabels Array of the labels of the buttons (default: ['OK', 'Cancel']) + */ + confirm: function(message, resultCallback, title, buttonLabels) { + var _title = (typeof title === "string" ? title : "Confirm"); + var _buttonLabels = (buttonLabels || ["OK", "Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.confirm(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + + exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]); + }, + + /** + * Open a native prompt dialog, with a customizable title and button text. + * The following results are returned to the result callback: + * buttonIndex Index number of the button selected. + * input1 The text entered in the prompt dialog box. + * + * @param {String} message Dialog message to display (default: "Prompt message") + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the dialog (default: "Prompt") + * @param {Array} buttonLabels Array of strings for the button labels (default: ["OK","Cancel"]) + * @param {String} defaultText Textbox input value (default: empty string) + */ + prompt: function(message, resultCallback, title, buttonLabels, defaultText) { + var _message = (typeof message === "string" ? message : "Prompt message"); + var _title = (typeof title === "string" ? title : "Prompt"); + var _buttonLabels = (buttonLabels || ["OK","Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.prompt(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + + var _defaultText = (defaultText || ""); + exec(resultCallback, null, "Notification", "prompt", [_message, _title, _buttonLabels, _defaultText]); + }, + + /** + * Causes the device to beep. + * On Android, the default notification ringtone is played "count" times. + * + * @param {Integer} count The number of beeps. + */ + beep: function(count) { + var defaultedCount = count || 1; + exec(null, null, "Notification", "beep", [ defaultedCount ]); + } +}; + +function convertButtonLabels(buttonLabels) { + + // Some platforms take an array of button label names. + // Other platforms take a comma separated list. + // For compatibility, we convert to the desired type based on the platform. + if (platform.id == "amazon-fireos" || platform.id == "android" || platform.id == "ios" || + platform.id == "windowsphone" || platform.id == "firefoxos" || platform.id == "ubuntu" || + platform.id == "windows8" || platform.id == "windows") { + + if (typeof buttonLabels === 'string') { + buttonLabels = buttonLabels.split(","); // not crazy about changing the var type here + } + } else { + if (Array.isArray(buttonLabels)) { + var buttonLabelArray = buttonLabels; + buttonLabels = buttonLabelArray.toString(); + } + } + + return buttonLabels; +} +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js b/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js new file mode 100644 index 0000000..dd5a2a2 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js @@ -0,0 +1,241 @@ +cordova.define("cordova-plugin-file-transfer.FileTransfer", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* global cordova, FileSystem */ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + FileTransferError = require('./FileTransferError'), + ProgressEvent = require('cordova-plugin-file.ProgressEvent'); + +function newProgressEvent(result) { + var pe = new ProgressEvent(); + pe.lengthComputable = result.lengthComputable; + pe.loaded = result.loaded; + pe.total = result.total; + return pe; +} + +function getUrlCredentials(urlString) { + var credentialsPattern = /^https?\:\/\/(?:(?:(([^:@\/]*)(?::([^@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?).*$/, + credentials = credentialsPattern.exec(urlString); + + return credentials && credentials[1]; +} + +function getBasicAuthHeader(urlString) { + var header = null; + + + // This is changed due to MS Windows doesn't support credentials in http uris + // so we detect them by regexp and strip off from result url + // Proof: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/a327cf3c-f033-4a54-8b7f-03c56ba3203f/windows-foundation-uri-security-problem + + if (window.btoa) { + var credentials = getUrlCredentials(urlString); + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; +} + +function convertHeadersToArray(headers) { + var result = []; + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + var headerValue = headers[header]; + result.push({ + name: header, + value: headerValue.toString() + }); + } + } + return result; +} + +var idCounter = 0; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** +* 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 +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + var headers = null; + var httpMethod = null; + var basicAuthHeader = getBasicAuthHeader(server); + if (basicAuthHeader) { + server = server.replace(getUrlCredentials(server) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + httpMethod = options.httpMethod || "POST"; + if (httpMethod.toUpperCase() == "PUT"){ + httpMethod = "PUT"; + } else { + httpMethod = "POST"; + } + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + if (cordova.platformId === "windowsphone") { + headers = headers && convertHeadersToArray(headers); + params = params && convertHeadersToArray(params); + } + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body, e.exception); + errorCallback(error); + }; + + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + self.onprogress(newProgressEvent(result)); + } + } else { + if (successCallback) { + successCallback(result); + } + } + }; + exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + * @param options {FileDownloadOptions} Optional parameters such as headers + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + var self = this; + + var basicAuthHeader = getBasicAuthHeader(source); + if (basicAuthHeader) { + source = source.replace(getUrlCredentials(source) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var headers = null; + if (options) { + headers = options.headers || null; + } + + if (cordova.platformId === "windowsphone" && headers) { + headers = convertHeadersToArray(headers); + } + + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + return self.onprogress(newProgressEvent(result)); + } + } else if (successCallback) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova-plugin-file.DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova-plugin-file.FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + entry.filesystem = new FileSystem(result.filesystemName || (result.filesystem == window.PERSISTENT ? 'persistent' : 'temporary')); + entry.nativeURL = result.nativeURL; + successCallback(entry); + } + }; + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body, e.exception); + errorCallback(error); + }; + + exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); +}; + +/** + * Aborts the ongoing file transfer on this object. The original error + * callback for the file transfer will be called if necessary. + */ +FileTransfer.prototype.abort = function() { + exec(null, null, 'FileTransfer', 'abort', [this._id]); +}; + +module.exports = FileTransfer; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js b/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js new file mode 100644 index 0000000..8339c2b --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js @@ -0,0 +1,43 @@ +cordova.define("cordova-plugin-file-transfer.FileTransferError", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * FileTransferError + * @constructor + */ +var FileTransferError = function(code, source, target, status, body, exception) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; + this.exception = exception || null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; +FileTransferError.ABORT_ERR = 4; +FileTransferError.NOT_MODIFIED_ERR = 5; + +module.exports = FileTransferError; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/browser/FileTransfer.js b/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/browser/FileTransfer.js new file mode 100644 index 0000000..041e478 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-file-transfer/www/browser/FileTransfer.js @@ -0,0 +1,346 @@ +cordova.define("cordova-plugin-file-transfer.BrowserFileTransfer", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/*global module, require*/ + +var argscheck = require('cordova/argscheck'), + FileTransferError = require('./FileTransferError'); + +function getParentPath(filePath) { + var pos = filePath.lastIndexOf('/'); + return filePath.substring(0, pos + 1); +} + +function getFileName(filePath) { + var pos = filePath.lastIndexOf('/'); + return filePath.substring(pos + 1); +} + +function getUrlCredentials(urlString) { + var credentialsPattern = /^https?\:\/\/(?:(?:(([^:@\/]*)(?::([^@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?).*$/, + credentials = credentialsPattern.exec(urlString); + + return credentials && credentials[1]; +} + +function getBasicAuthHeader(urlString) { + var header = null; + + + // This is changed due to MS Windows doesn't support credentials in http uris + // so we detect them by regexp and strip off from result url + // Proof: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/a327cf3c-f033-4a54-8b7f-03c56ba3203f/windows-foundation-uri-security-problem + + if (window.btoa) { + var credentials = getUrlCredentials(urlString); + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; +} + +function checkURL(url) { + return url.indexOf(' ') === -1 ? true : false; +} + +var idCounter = 0; + +var transfers = {}; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** + * 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 + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + */ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options) { + // check for arguments + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + + // Check if target URL doesn't contain spaces. If contains, it should be escaped first + // (see https://github.com/apache/cordova-plugin-file-transfer/blob/master/doc/index.md#upload) + if (!checkURL(server)) { + if (errorCallback) { + errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR, filePath, server)); + } + return; + } + + options = options || {}; + + var fileKey = options.fileKey || "file"; + var fileName = options.fileName || "image.jpg"; + var mimeType = options.mimeType || "image/jpeg"; + var params = options.params || {}; + var withCredentials = options.withCredentials || false; + // var chunkedMode = !!options.chunkedMode; // Not supported + var headers = options.headers || {}; + var httpMethod = options.httpMethod && options.httpMethod.toUpperCase() === "PUT" ? "PUT" : "POST"; + + var basicAuthHeader = getBasicAuthHeader(server); + if (basicAuthHeader) { + server = server.replace(getUrlCredentials(server) + '@', ''); + headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var that = this; + var xhr = transfers[this._id] = new XMLHttpRequest(); + xhr.withCredentials = withCredentials; + + var fail = errorCallback && function(code, status, response) { + if (transfers[this._id]) { + delete transfers[this._id]; + } + var error = new FileTransferError(code, filePath, server, status, response); + if (errorCallback) { + errorCallback(error); + } + }; + + window.resolveLocalFileSystemURL(filePath, function(entry) { + entry.file(function(file) { + var reader = new FileReader(); + reader.onloadend = function() { + var blob = new Blob([this.result], {type: mimeType}); + + // Prepare form data to send to server + var fd = new FormData(); + fd.append(fileKey, blob, fileName); + for (var prop in params) { + if (params.hasOwnProperty(prop)) { + fd.append(prop, params[prop]); + } + } + + xhr.open(httpMethod, server); + + // Fill XHR headers + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + xhr.setRequestHeader(header, headers[header]); + } + } + + xhr.onload = function() { + if (this.status === 200) { + var result = new FileUploadResult(); // jshint ignore:line + result.bytesSent = blob.size; + result.responseCode = this.status; + result.response = this.response; + delete transfers[that._id]; + successCallback(result); + } else if (this.status === 404) { + fail(FileTransferError.INVALID_URL_ERR, this.status, this.response); + } else { + fail(FileTransferError.CONNECTION_ERR, this.status, this.response); + } + }; + + xhr.ontimeout = function() { + fail(FileTransferError.CONNECTION_ERR, this.status, this.response); + }; + + xhr.onerror = function() { + fail(FileTransferError.CONNECTION_ERR, this.status, this.response); + }; + + xhr.onabort = function () { + fail(FileTransferError.ABORT_ERR, this.status, this.response); + }; + + xhr.upload.onprogress = function (e) { + if (that.onprogress) { + that.onprogress(e); + } + }; + + xhr.send(fd); + // Special case when transfer already aborted, but XHR isn't sent. + // In this case XHR won't fire an abort event, so we need to check if transfers record + // isn't deleted by filetransfer.abort and if so, call XHR's abort method again + if (!transfers[that._id]) { + xhr.abort(); + } + }; + reader.readAsArrayBuffer(file); + }, function() { + fail(FileTransferError.FILE_NOT_FOUND_ERR); + }); + }, function() { + fail(FileTransferError.FILE_NOT_FOUND_ERR); + }); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + * @param options {FileDownloadOptions} Optional parameters such as headers + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + + // Check if target URL doesn't contain spaces. If contains, it should be escaped first + // (see https://github.com/apache/cordova-plugin-file-transfer/blob/master/doc/index.md#download) + if (!checkURL(source)) { + if (errorCallback) { + errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR, source, target)); + } + return; + } + + options = options || {}; + + var headers = options.headers || {}; + var withCredentials = options.withCredentials || false; + + var basicAuthHeader = getBasicAuthHeader(source); + if (basicAuthHeader) { + source = source.replace(getUrlCredentials(source) + '@', ''); + headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var that = this; + var xhr = transfers[this._id] = new XMLHttpRequest(); + xhr.withCredentials = withCredentials; + var fail = errorCallback && function(code, status, response) { + if (transfers[that._id]) { + delete transfers[that._id]; + } + // In XHR GET reqests we're setting response type to Blob + // but in case of error we need to raise event with plain text response + if (response instanceof Blob) { + var reader = new FileReader(); + reader.readAsText(response); + reader.onloadend = function(e) { + var error = new FileTransferError(code, source, target, status, e.target.result); + errorCallback(error); + }; + } else { + var error = new FileTransferError(code, source, target, status, response); + errorCallback(error); + } + }; + + xhr.onload = function (e) { + + var fileNotFound = function () { + fail(FileTransferError.FILE_NOT_FOUND_ERR); + }; + + var req = e.target; + // req.status === 0 is special case for local files with file:// URI scheme + if ((req.status === 200 || req.status === 0) && req.response) { + window.resolveLocalFileSystemURL(getParentPath(target), function (dir) { + dir.getFile(getFileName(target), {create: true}, function writeFile(entry) { + entry.createWriter(function (fileWriter) { + fileWriter.onwriteend = function (evt) { + if (!evt.target.error) { + entry.filesystemName = entry.filesystem.name; + delete transfers[that._id]; + if (successCallback) { + successCallback(entry); + } + } else { + fail(FileTransferError.FILE_NOT_FOUND_ERR); + } + }; + fileWriter.onerror = function () { + fail(FileTransferError.FILE_NOT_FOUND_ERR); + }; + fileWriter.write(req.response); + }, fileNotFound); + }, fileNotFound); + }, fileNotFound); + } else if (req.status === 404) { + fail(FileTransferError.INVALID_URL_ERR, req.status, req.response); + } else { + fail(FileTransferError.CONNECTION_ERR, req.status, req.response); + } + }; + + xhr.onprogress = function (e) { + if (that.onprogress) { + that.onprogress(e); + } + }; + + xhr.onerror = function () { + fail(FileTransferError.CONNECTION_ERR, this.status, this.response); + }; + + xhr.onabort = function () { + fail(FileTransferError.ABORT_ERR, this.status, this.response); + }; + + xhr.open("GET", source, true); + + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + xhr.setRequestHeader(header, headers[header]); + } + } + + xhr.responseType = "blob"; + + xhr.send(); +}; + +/** + * Aborts the ongoing file transfer on this object. The original error + * callback for the file transfer will be called if necessary. + */ +FileTransfer.prototype.abort = function() { + if (this instanceof FileTransfer) { + if (transfers[this._id]) { + transfers[this._id].abort(); + delete transfers[this._id]; + } + } +}; + +module.exports = FileTransfer; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-file/src/browser/FileProxy.js b/platforms/browser/platform_www/plugins/cordova-plugin-file/src/browser/FileProxy.js new file mode 100644 index 0000000..ed3b61f --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-file/src/browser/FileProxy.js @@ -0,0 +1,986 @@ +cordova.define("cordova-plugin-file.browserFileProxy", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +(function() { + /*global require, exports, module*/ + /*global FILESYSTEM_PREFIX*/ + /*global IDBKeyRange*/ + + /* Heavily based on https://github.com/ebidel/idb.filesystem.js */ + + // For chrome we don't need to implement proxy methods + // All functionality can be accessed natively. + if (require('./isChrome')()) { + var pathsPrefix = { + // Read-only directory where the application is installed. + applicationDirectory: location.origin + "/", + // Where to put app-specific data files. + dataDirectory: 'filesystem:file:///persistent/', + // Cached files that should survive app restarts. + // Apps should not rely on the OS to delete files in here. + cacheDirectory: 'filesystem:file:///temporary/', + }; + + exports.requestAllPaths = function(successCallback) { + successCallback(pathsPrefix); + }; + + require("cordova/exec/proxy").add("File", module.exports); + return; + } + + var LocalFileSystem = require('./LocalFileSystem'), + FileSystem = require('./FileSystem'), + FileEntry = require('./FileEntry'), + FileError = require('./FileError'), + DirectoryEntry = require('./DirectoryEntry'), + File = require('./File'); + + (function(exports, global) { + var indexedDB = global.indexedDB || global.mozIndexedDB; + if (!indexedDB) { + throw "Firefox OS File plugin: indexedDB not supported"; + } + + var fs_ = null; + + var idb_ = {}; + idb_.db = null; + var FILE_STORE_ = 'entries'; + + var DIR_SEPARATOR = '/'; + + var pathsPrefix = { + // Read-only directory where the application is installed. + applicationDirectory: location.origin + "/", + // Where to put app-specific data files. + dataDirectory: 'file:///persistent/', + // Cached files that should survive app restarts. + // Apps should not rely on the OS to delete files in here. + cacheDirectory: 'file:///temporary/', + }; + + var unicodeLastChar = 65535; + + /*** Exported functionality ***/ + + exports.requestFileSystem = function(successCallback, errorCallback, args) { + var type = args[0]; + // Size is ignored since IDB filesystem size depends + // on browser implementation and can't be set up by user + var size = args[1]; // jshint ignore: line + + if (type !== LocalFileSystem.TEMPORARY && type !== LocalFileSystem.PERSISTENT) { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + return; + } + + var name = type === LocalFileSystem.TEMPORARY ? 'temporary' : 'persistent'; + var storageName = (location.protocol + location.host).replace(/:/g, '_'); + + var root = new DirectoryEntry('', DIR_SEPARATOR); + fs_ = new FileSystem(name, root); + + idb_.open(storageName, function() { + successCallback(fs_); + }, errorCallback); + }; + + // Overridden by Android, BlackBerry 10 and iOS to populate fsMap + require('./fileSystems').getFs = function(name, callback) { + callback(new FileSystem(name, fs_.root)); + }; + + // list a directory's contents (files and folders). + exports.readEntries = function(successCallback, errorCallback, args) { + var fullPath = args[0]; + + if (typeof successCallback !== 'function') { + throw Error('Expected successCallback argument.'); + } + + var path = resolveToFullPath_(fullPath); + + exports.getDirectory(function() { + idb_.getAllEntries(path.fullPath + DIR_SEPARATOR, path.storagePath, function(entries) { + successCallback(entries); + }, errorCallback); + }, function() { + if (errorCallback) { + errorCallback(FileError.NOT_FOUND_ERR); + } + }, [path.storagePath, path.fullPath, {create: false}]); + }; + + exports.getFile = function(successCallback, errorCallback, args) { + var fullPath = args[0]; + var path = args[1]; + var options = args[2] || {}; + + // Create an absolute path if we were handed a relative one. + path = resolveToFullPath_(fullPath, path); + + idb_.get(path.storagePath, function(fileEntry) { + if (options.create === true && options.exclusive === true && fileEntry) { + // If create and exclusive are both true, and the path already exists, + // getFile must fail. + + if (errorCallback) { + errorCallback(FileError.PATH_EXISTS_ERR); + } + } else if (options.create === true && !fileEntry) { + // If create is true, the path doesn't exist, and no other error occurs, + // getFile must create it as a zero-length file and return a corresponding + // FileEntry. + var newFileEntry = new FileEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root)); + + newFileEntry.file_ = new MyFile({ + size: 0, + name: newFileEntry.name, + lastModifiedDate: new Date(), + storagePath: path.storagePath + }); + + idb_.put(newFileEntry, path.storagePath, successCallback, errorCallback); + } else if (options.create === true && fileEntry) { + if (fileEntry.isFile) { + // Overwrite file, delete then create new. + idb_['delete'](path.storagePath, function() { + var newFileEntry = new FileEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root)); + + newFileEntry.file_ = new MyFile({ + size: 0, + name: newFileEntry.name, + lastModifiedDate: new Date(), + storagePath: path.storagePath + }); + + idb_.put(newFileEntry, path.storagePath, successCallback, errorCallback); + }, errorCallback); + } else { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + } + } else if ((!options.create || options.create === false) && !fileEntry) { + // If create is not true and the path doesn't exist, getFile must fail. + if (errorCallback) { + errorCallback(FileError.NOT_FOUND_ERR); + } + } else if ((!options.create || options.create === false) && fileEntry && + fileEntry.isDirectory) { + // If create is not true and the path exists, but is a directory, getFile + // must fail. + if (errorCallback) { + errorCallback(FileError.TYPE_MISMATCH_ERR); + } + } else { + // Otherwise, if no other error occurs, getFile must return a FileEntry + // corresponding to path. + + successCallback(fileEntryFromIdbEntry(fileEntry)); + } + }, errorCallback); + }; + + exports.getFileMetadata = function(successCallback, errorCallback, args) { + var fullPath = args[0]; + + exports.getFile(function(fileEntry) { + successCallback(new File(fileEntry.file_.name, fileEntry.fullPath, '', fileEntry.file_.lastModifiedDate, + fileEntry.file_.size)); + }, errorCallback, [fullPath, null]); + }; + + exports.getMetadata = function(successCallback, errorCallback, args) { + exports.getFile(function (fileEntry) { + successCallback( + { + modificationTime: fileEntry.file_.lastModifiedDate, + size: fileEntry.file_.lastModifiedDate + }); + }, errorCallback, args); + }; + + exports.setMetadata = function(successCallback, errorCallback, args) { + var fullPath = args[0]; + var metadataObject = args[1]; + + exports.getFile(function (fileEntry) { + fileEntry.file_.lastModifiedDate = metadataObject.modificationTime; + idb_.put(fileEntry, fileEntry.file_.storagePath, successCallback, errorCallback); + }, errorCallback, [fullPath, null]); + }; + + exports.write = function(successCallback, errorCallback, args) { + var fileName = args[0], + data = args[1], + position = args[2], + isBinary = args[3]; // jshint ignore: line + + if (!data) { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + return; + } + + if (typeof data === 'string' || data instanceof String) { + data = new Blob([data]); + } + + exports.getFile(function(fileEntry) { + var blob_ = fileEntry.file_.blob_; + + if (!blob_) { + blob_ = new Blob([data], {type: data.type}); + } else { + // Calc the head and tail fragments + var head = blob_.slice(0, position); + var tail = blob_.slice(position + (data.size || data.byteLength)); + + // Calc the padding + var padding = position - head.size; + if (padding < 0) { + padding = 0; + } + + // Do the "write". In fact, a full overwrite of the Blob. + blob_ = new Blob([head, new Uint8Array(padding), data, tail], + {type: data.type}); + } + + // Set the blob we're writing on this file entry so we can recall it later. + fileEntry.file_.blob_ = blob_; + fileEntry.file_.lastModifiedDate = new Date() || null; + fileEntry.file_.size = blob_.size; + fileEntry.file_.name = blob_.name; + fileEntry.file_.type = blob_.type; + + idb_.put(fileEntry, fileEntry.file_.storagePath, function() { + successCallback(data.size || data.byteLength); + }, errorCallback); + }, errorCallback, [fileName, null]); + }; + + exports.readAsText = function(successCallback, errorCallback, args) { + var fileName = args[0], + enc = args[1], + startPos = args[2], + endPos = args[3]; + + readAs('text', fileName, enc, startPos, endPos, successCallback, errorCallback); + }; + + exports.readAsDataURL = function(successCallback, errorCallback, args) { + var fileName = args[0], + startPos = args[1], + endPos = args[2]; + + readAs('dataURL', fileName, null, startPos, endPos, successCallback, errorCallback); + }; + + exports.readAsBinaryString = function(successCallback, errorCallback, args) { + var fileName = args[0], + startPos = args[1], + endPos = args[2]; + + readAs('binaryString', fileName, null, startPos, endPos, successCallback, errorCallback); + }; + + exports.readAsArrayBuffer = function(successCallback, errorCallback, args) { + var fileName = args[0], + startPos = args[1], + endPos = args[2]; + + readAs('arrayBuffer', fileName, null, startPos, endPos, successCallback, errorCallback); + }; + + exports.removeRecursively = exports.remove = function(successCallback, errorCallback, args) { + if (typeof successCallback !== 'function') { + throw Error('Expected successCallback argument.'); + } + + var fullPath = resolveToFullPath_(args[0]).storagePath; + if (fullPath === pathsPrefix.cacheDirectory || fullPath === pathsPrefix.dataDirectory) { + errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR); + return; + } + + function deleteEntry(isDirectory) { + // TODO: This doesn't protect against directories that have content in it. + // Should throw an error instead if the dirEntry is not empty. + idb_['delete'](fullPath, function() { + successCallback(); + }, function() { + if (errorCallback) { errorCallback(); } + }, isDirectory); + } + + // We need to to understand what we are deleting: + exports.getDirectory(function(entry) { + deleteEntry(entry.isDirectory); + }, function(){ + //DirectoryEntry was already deleted or entry is FileEntry + deleteEntry(false); + }, [fullPath, null, {create: false}]); + }; + + exports.getDirectory = function(successCallback, errorCallback, args) { + var fullPath = args[0]; + var path = args[1]; + var options = args[2]; + + // Create an absolute path if we were handed a relative one. + path = resolveToFullPath_(fullPath, path); + + idb_.get(path.storagePath, function(folderEntry) { + if (!options) { + options = {}; + } + + if (options.create === true && options.exclusive === true && folderEntry) { + // If create and exclusive are both true, and the path already exists, + // getDirectory must fail. + if (errorCallback) { + errorCallback(FileError.PATH_EXISTS_ERR); + } + // There is a strange bug in mobilespec + FF, which results in coming to multiple else-if's + // so we are shielding from it with returns. + return; + } + + if (options.create === true && !folderEntry) { + // If create is true, the path doesn't exist, and no other error occurs, + // getDirectory must create it as a zero-length file and return a corresponding + // MyDirectoryEntry. + var dirEntry = new DirectoryEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root)); + + idb_.put(dirEntry, path.storagePath, successCallback, errorCallback); + return; + } + + if (options.create === true && folderEntry) { + + if (folderEntry.isDirectory) { + // IDB won't save methods, so we need re-create the MyDirectoryEntry. + successCallback(new DirectoryEntry(folderEntry.name, folderEntry.fullPath, folderEntry.filesystem)); + } else { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + } + return; + } + + if ((!options.create || options.create === false) && !folderEntry) { + // Handle root special. It should always exist. + if (path.fullPath === DIR_SEPARATOR) { + successCallback(fs_.root); + return; + } + + // If create is not true and the path doesn't exist, getDirectory must fail. + if (errorCallback) { + errorCallback(FileError.NOT_FOUND_ERR); + } + + return; + } + if ((!options.create || options.create === false) && folderEntry && folderEntry.isFile) { + // If create is not true and the path exists, but is a file, getDirectory + // must fail. + if (errorCallback) { + errorCallback(FileError.TYPE_MISMATCH_ERR); + } + return; + } + + // Otherwise, if no other error occurs, getDirectory must return a + // MyDirectoryEntry corresponding to path. + + // IDB won't' save methods, so we need re-create MyDirectoryEntry. + successCallback(new DirectoryEntry(folderEntry.name, folderEntry.fullPath, folderEntry.filesystem)); + }, errorCallback); + }; + + exports.getParent = function(successCallback, errorCallback, args) { + if (typeof successCallback !== 'function') { + throw Error('Expected successCallback argument.'); + } + + var fullPath = args[0]; + //fullPath is like this: + //file:///persistent/path/to/file or + //file:///persistent/path/to/directory/ + + if (fullPath === DIR_SEPARATOR || fullPath === pathsPrefix.cacheDirectory || + fullPath === pathsPrefix.dataDirectory) { + successCallback(fs_.root); + return; + } + + //To delete all slashes at the end + while (fullPath[fullPath.length - 1] === '/') { + fullPath = fullPath.substr(0, fullPath.length - 1); + } + + var pathArr = fullPath.split(DIR_SEPARATOR); + pathArr.pop(); + var parentName = pathArr.pop(); + var path = pathArr.join(DIR_SEPARATOR) + DIR_SEPARATOR; + + //To get parent of root files + var joined = path + parentName + DIR_SEPARATOR;//is like this: file:///persistent/ + if (joined === pathsPrefix.cacheDirectory || joined === pathsPrefix.dataDirectory) { + exports.getDirectory(successCallback, errorCallback, [joined, DIR_SEPARATOR, {create: false}]); + return; + } + + exports.getDirectory(successCallback, errorCallback, [path, parentName, {create: false}]); + }; + + exports.copyTo = function(successCallback, errorCallback, args) { + var srcPath = args[0]; + var parentFullPath = args[1]; + var name = args[2]; + + if (name.indexOf('/') !== -1 || srcPath === parentFullPath + name) { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + + return; + } + + // Read src file + exports.getFile(function(srcFileEntry) { + + var path = resolveToFullPath_(parentFullPath); + //Check directory + exports.getDirectory(function() { + + // Create dest file + exports.getFile(function(dstFileEntry) { + + exports.write(function() { + successCallback(dstFileEntry); + }, errorCallback, [dstFileEntry.file_.storagePath, srcFileEntry.file_.blob_, 0]); + + }, errorCallback, [parentFullPath, name, {create: true}]); + + }, function() { if (errorCallback) { errorCallback(FileError.NOT_FOUND_ERR); }}, + [path.storagePath, null, {create:false}]); + + }, errorCallback, [srcPath, null]); + }; + + exports.moveTo = function(successCallback, errorCallback, args) { + var srcPath = args[0]; + // parentFullPath and name parameters is ignored because + // args is being passed downstream to exports.copyTo method + var parentFullPath = args[1]; // jshint ignore: line + var name = args[2]; // jshint ignore: line + + exports.copyTo(function (fileEntry) { + + exports.remove(function () { + successCallback(fileEntry); + }, errorCallback, [srcPath]); + + }, errorCallback, args); + }; + + exports.resolveLocalFileSystemURI = function(successCallback, errorCallback, args) { + var path = args[0]; + + // Ignore parameters + if (path.indexOf('?') !== -1) { + path = String(path).split("?")[0]; + } + + // support for encodeURI + if (/\%5/g.test(path) || /\%20/g.test(path)) { + path = decodeURI(path); + } + + if (path.trim()[0] === '/') { + if (errorCallback) { + errorCallback(FileError.ENCODING_ERR); + } + return; + } + + //support for cdvfile + if (path.trim().substr(0,7) === "cdvfile") { + if (path.indexOf("cdvfile://localhost") === -1) { + if (errorCallback) { + errorCallback(FileError.ENCODING_ERR); + } + return; + } + + var indexPersistent = path.indexOf("persistent"); + var indexTemporary = path.indexOf("temporary"); + + //cdvfile://localhost/persistent/path/to/file + if (indexPersistent !== -1) { + path = "file:///persistent" + path.substr(indexPersistent + 10); + } else if (indexTemporary !== -1) { + path = "file:///temporary" + path.substr(indexTemporary + 9); + } else { + if (errorCallback) { + errorCallback(FileError.ENCODING_ERR); + } + return; + } + } + + // to avoid path form of '///path/to/file' + function handlePathSlashes(path) { + var cutIndex = 0; + for (var i = 0; i < path.length - 1; i++) { + if (path[i] === DIR_SEPARATOR && path[i + 1] === DIR_SEPARATOR) { + cutIndex = i + 1; + } else break; + } + + return path.substr(cutIndex); + } + + // Handle localhost containing paths (see specs ) + if (path.indexOf('file://localhost/') === 0) { + path = path.replace('file://localhost/', 'file:///'); + } + + if (path.indexOf(pathsPrefix.dataDirectory) === 0) { + path = path.substring(pathsPrefix.dataDirectory.length - 1); + path = handlePathSlashes(path); + + exports.requestFileSystem(function() { + exports.getFile(successCallback, function() { + exports.getDirectory(successCallback, errorCallback, [pathsPrefix.dataDirectory, path, + {create: false}]); + }, [pathsPrefix.dataDirectory, path, {create: false}]); + }, errorCallback, [LocalFileSystem.PERSISTENT]); + } else if (path.indexOf(pathsPrefix.cacheDirectory) === 0) { + path = path.substring(pathsPrefix.cacheDirectory.length - 1); + path = handlePathSlashes(path); + + exports.requestFileSystem(function() { + exports.getFile(successCallback, function() { + exports.getDirectory(successCallback, errorCallback, [pathsPrefix.cacheDirectory, path, + {create: false}]); + }, [pathsPrefix.cacheDirectory, path, {create: false}]); + }, errorCallback, [LocalFileSystem.TEMPORARY]); + } else if (path.indexOf(pathsPrefix.applicationDirectory) === 0) { + path = path.substring(pathsPrefix.applicationDirectory.length); + //TODO: need to cut out redundant slashes? + + var xhr = new XMLHttpRequest(); + xhr.open("GET", path, true); + xhr.onreadystatechange = function () { + if (xhr.status === 200 && xhr.readyState === 4) { + exports.requestFileSystem(function(fs) { + fs.name = location.hostname; + + //TODO: need to call exports.getFile(...) to handle errors correct + fs.root.getFile(path, {create: true}, writeFile, errorCallback); + }, errorCallback, [LocalFileSystem.PERSISTENT]); + } + }; + + xhr.onerror = function () { + if(errorCallback) { + errorCallback(FileError.NOT_READABLE_ERR); + } + }; + + xhr.send(); + } else { + if(errorCallback) { + errorCallback(FileError.NOT_FOUND_ERR); + } + } + + function writeFile(entry) { + entry.createWriter(function (fileWriter) { + fileWriter.onwriteend = function (evt) { + if (!evt.target.error) { + entry.filesystemName = location.hostname; + successCallback(entry); + } + }; + fileWriter.onerror = function () { + if (errorCallback) { + errorCallback(FileError.NOT_READABLE_ERR); + } + }; + fileWriter.write(new Blob([xhr.response])); + }, errorCallback); + } + }; + + exports.requestAllPaths = function(successCallback) { + successCallback(pathsPrefix); + }; + + /*** Helpers ***/ + + /** + * Interface to wrap the native File interface. + * + * This interface is necessary for creating zero-length (empty) files, + * something the Filesystem API allows you to do. Unfortunately, File's + * constructor cannot be called directly, making it impossible to instantiate + * an empty File in JS. + * + * @param {Object} opts Initial values. + * @constructor + */ + function MyFile(opts) { + var blob_ = new Blob(); + + this.size = opts.size || 0; + this.name = opts.name || ''; + this.type = opts.type || ''; + this.lastModifiedDate = opts.lastModifiedDate || null; + this.storagePath = opts.storagePath || ''; + + // Need some black magic to correct the object's size/name/type based on the + // blob that is saved. + Object.defineProperty(this, 'blob_', { + enumerable: true, + get: function() { + return blob_; + }, + set: function(val) { + blob_ = val; + this.size = blob_.size; + this.name = blob_.name; + this.type = blob_.type; + this.lastModifiedDate = blob_.lastModifiedDate; + }.bind(this) + }); + } + + MyFile.prototype.constructor = MyFile; + + // When saving an entry, the fullPath should always lead with a slash and never + // end with one (e.g. a directory). Also, resolve '.' and '..' to an absolute + // one. This method ensures path is legit! + function resolveToFullPath_(cwdFullPath, path) { + path = path || ''; + var fullPath = path; + var prefix = ''; + + cwdFullPath = cwdFullPath || DIR_SEPARATOR; + if (cwdFullPath.indexOf(FILESYSTEM_PREFIX) === 0) { + prefix = cwdFullPath.substring(0, cwdFullPath.indexOf(DIR_SEPARATOR, FILESYSTEM_PREFIX.length)); + cwdFullPath = cwdFullPath.substring(cwdFullPath.indexOf(DIR_SEPARATOR, FILESYSTEM_PREFIX.length)); + } + + var relativePath = path[0] !== DIR_SEPARATOR; + if (relativePath) { + fullPath = cwdFullPath; + if (cwdFullPath !== DIR_SEPARATOR) { + fullPath += DIR_SEPARATOR + path; + } else { + fullPath += path; + } + } + + // Remove doubled separator substrings + var re = new RegExp(DIR_SEPARATOR + DIR_SEPARATOR, 'g'); + fullPath = fullPath.replace(re, DIR_SEPARATOR); + + // Adjust '..'s by removing parent directories when '..' flows in path. + var parts = fullPath.split(DIR_SEPARATOR); + for (var i = 0; i < parts.length; ++i) { + var part = parts[i]; + if (part === '..') { + parts[i - 1] = ''; + parts[i] = ''; + } + } + fullPath = parts.filter(function(el) { + return el; + }).join(DIR_SEPARATOR); + + // Add back in leading slash. + if (fullPath[0] !== DIR_SEPARATOR) { + fullPath = DIR_SEPARATOR + fullPath; + } + + // Replace './' by current dir. ('./one/./two' -> one/two) + fullPath = fullPath.replace(/\.\//g, DIR_SEPARATOR); + + // Replace '//' with '/'. + fullPath = fullPath.replace(/\/\//g, DIR_SEPARATOR); + + // Replace '/.' with '/'. + fullPath = fullPath.replace(/\/\./g, DIR_SEPARATOR); + + // Remove '/' if it appears on the end. + if (fullPath[fullPath.length - 1] === DIR_SEPARATOR && + fullPath !== DIR_SEPARATOR) { + fullPath = fullPath.substring(0, fullPath.length - 1); + } + + var storagePath = prefix + fullPath; + storagePath = decodeURI(storagePath); + fullPath = decodeURI(fullPath); + + return { + storagePath: storagePath, + fullPath: fullPath, + fileName: fullPath.split(DIR_SEPARATOR).pop(), + fsName: prefix.split(DIR_SEPARATOR).pop() + }; + } + + function fileEntryFromIdbEntry(fileEntry) { + // IDB won't save methods, so we need re-create the FileEntry. + var clonedFileEntry = new FileEntry(fileEntry.name, fileEntry.fullPath, fileEntry.filesystem); + clonedFileEntry.file_ = fileEntry.file_; + + return clonedFileEntry; + } + + function readAs(what, fullPath, encoding, startPos, endPos, successCallback, errorCallback) { + exports.getFile(function(fileEntry) { + var fileReader = new FileReader(), + blob = fileEntry.file_.blob_.slice(startPos, endPos); + + fileReader.onload = function(e) { + successCallback(e.target.result); + }; + + fileReader.onerror = errorCallback; + + switch (what) { + case 'text': + fileReader.readAsText(blob, encoding); + break; + case 'dataURL': + fileReader.readAsDataURL(blob); + break; + case 'arrayBuffer': + fileReader.readAsArrayBuffer(blob); + break; + case 'binaryString': + fileReader.readAsBinaryString(blob); + break; + } + + }, errorCallback, [fullPath, null]); + } + + /*** Core logic to handle IDB operations ***/ + + idb_.open = function(dbName, successCallback, errorCallback) { + var self = this; + + // TODO: FF 12.0a1 isn't liking a db name with : in it. + var request = indexedDB.open(dbName.replace(':', '_')/*, 1 /*version*/); + + request.onerror = errorCallback || onError; + + request.onupgradeneeded = function(e) { + // First open was called or higher db version was used. + + // console.log('onupgradeneeded: oldVersion:' + e.oldVersion, + // 'newVersion:' + e.newVersion); + + self.db = e.target.result; + self.db.onerror = onError; + + if (!self.db.objectStoreNames.contains(FILE_STORE_)) { + self.db.createObjectStore(FILE_STORE_/*,{keyPath: 'id', autoIncrement: true}*/); + } + }; + + request.onsuccess = function(e) { + self.db = e.target.result; + self.db.onerror = onError; + successCallback(e); + }; + + request.onblocked = errorCallback || onError; + }; + + idb_.close = function() { + this.db.close(); + this.db = null; + }; + + idb_.get = function(fullPath, successCallback, errorCallback) { + if (!this.db) { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + return; + } + + var tx = this.db.transaction([FILE_STORE_], 'readonly'); + + var request = tx.objectStore(FILE_STORE_).get(fullPath); + + tx.onabort = errorCallback || onError; + tx.oncomplete = function() { + successCallback(request.result); + }; + }; + + idb_.getAllEntries = function(fullPath, storagePath, successCallback, errorCallback) { + if (!this.db) { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + return; + } + + var results = []; + + if (storagePath[storagePath.length - 1] === DIR_SEPARATOR) { + storagePath = storagePath.substring(0, storagePath.length - 1); + } + + var range = IDBKeyRange.bound(storagePath + DIR_SEPARATOR + ' ', + storagePath + DIR_SEPARATOR + String.fromCharCode(unicodeLastChar)); + + var tx = this.db.transaction([FILE_STORE_], 'readonly'); + tx.onabort = errorCallback || onError; + tx.oncomplete = function() { + results = results.filter(function(val) { + var pathWithoutSlash = val.fullPath; + + if (val.fullPath[val.fullPath.length - 1] === DIR_SEPARATOR) { + pathWithoutSlash = pathWithoutSlash.substr(0, pathWithoutSlash.length - 1); + } + + var valPartsLen = pathWithoutSlash.split(DIR_SEPARATOR).length; + var fullPathPartsLen = fullPath.split(DIR_SEPARATOR).length; + + /* Input fullPath parameter equals '//' for root folder */ + /* Entries in root folder has valPartsLen equals 2 (see below) */ + if (fullPath[fullPath.length -1] === DIR_SEPARATOR && fullPath.trim().length === 2) { + fullPathPartsLen = 1; + } else if (fullPath[fullPath.length -1] === DIR_SEPARATOR) { + fullPathPartsLen = fullPath.substr(0, fullPath.length - 1).split(DIR_SEPARATOR).length; + } else { + fullPathPartsLen = fullPath.split(DIR_SEPARATOR).length; + } + + if (valPartsLen === fullPathPartsLen + 1) { + // If this a subfolder and entry is a direct child, include it in + // the results. Otherwise, it's not an entry of this folder. + return val; + } else return false; + }); + + successCallback(results); + }; + + var request = tx.objectStore(FILE_STORE_).openCursor(range); + + request.onsuccess = function(e) { + var cursor = e.target.result; + if (cursor) { + var val = cursor.value; + + results.push(val.isFile ? fileEntryFromIdbEntry(val) : new DirectoryEntry(val.name, val.fullPath, val.filesystem)); + cursor['continue'](); + } + }; + }; + + idb_['delete'] = function(fullPath, successCallback, errorCallback, isDirectory) { + if (!idb_.db) { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + return; + } + + var tx = this.db.transaction([FILE_STORE_], 'readwrite'); + tx.oncomplete = successCallback; + tx.onabort = errorCallback || onError; + tx.oncomplete = function() { + if (isDirectory) { + //We delete nested files and folders after deleting parent folder + //We use ranges: https://developer.mozilla.org/en-US/docs/Web/API/IDBKeyRange + fullPath = fullPath + DIR_SEPARATOR; + + //Range contains all entries in the form fullPath where + //symbol in the range from ' ' to symbol which has code `unicodeLastChar` + var range = IDBKeyRange.bound(fullPath + ' ', fullPath + String.fromCharCode(unicodeLastChar)); + + var newTx = this.db.transaction([FILE_STORE_], 'readwrite'); + newTx.oncomplete = successCallback; + newTx.onabort = errorCallback || onError; + newTx.objectStore(FILE_STORE_)['delete'](range); + } else { + successCallback(); + } + }; + tx.objectStore(FILE_STORE_)['delete'](fullPath); + }; + + idb_.put = function(entry, storagePath, successCallback, errorCallback) { + if (!this.db) { + if (errorCallback) { + errorCallback(FileError.INVALID_MODIFICATION_ERR); + } + return; + } + + var tx = this.db.transaction([FILE_STORE_], 'readwrite'); + tx.onabort = errorCallback || onError; + tx.oncomplete = function() { + // TODO: Error is thrown if we pass the request event back instead. + successCallback(entry); + }; + + tx.objectStore(FILE_STORE_).put(entry, storagePath); + }; + + // Global error handler. Errors bubble from request, to transaction, to db. + function onError(e) { + switch (e.target.errorCode) { + case 12: + console.log('Error - Attempt to open db with a lower version than the ' + + 'current one.'); + break; + default: + console.log('errorCode: ' + e.target.errorCode); + } + + console.log(e, e.code, e.message); + } + + })(module.exports, window); + + require("cordova/exec/proxy").add("File", module.exports); +})(); + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js b/platforms/browser/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js new file mode 100644 index 0000000..464d339 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js @@ -0,0 +1,119 @@ +cordova.define("cordova-plugin-file.DirectoryEntry", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('./Entry'), + FileError = require('./FileError'), + DirectoryReader = require('./DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) { + + // add trailing slash if it is missing + if ((fullPath) && !/\/$/.test(fullPath)) { + fullPath += "/"; + } + // add trailing slash if it is missing + if (nativeURL && !/\/$/.test(nativeURL)) { + nativeURL += "/"; + } + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, fileSystem, nativeURL); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.toInternalURL()); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getDirectory", [this.toInternalURL(), path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.toInternalURL()]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var FileEntry = require('./FileEntry'); + var entry = new FileEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.toInternalURL(), path, options]); +}; + +module.exports = DirectoryEntry; + +}); diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js b/platforms/browser/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js new file mode 100644 index 0000000..921b486 --- /dev/null +++ b/platforms/browser/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js @@ -0,0 +1,75 @@ +cordova.define("cordova-plugin-file.DirectoryReader", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'), + FileError = require('./FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(localURL) { + this.localURL = localURL || null; + this.hasReadEntries = false; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + // If we've already read and passed on this directory's entries, return an empty list. + if (this.hasReadEntries) { + successCallback([]); + return; + } + var reader = this; + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i or + * \ No newline at end of file diff --git a/platforms/browser/www/screens/pay.html b/platforms/browser/www/screens/pay.html deleted file mode 100644 index df059c7..0000000 --- a/platforms/browser/www/screens/pay.html +++ /dev/null @@ -1,18 +0,0 @@ - - -
    -
    -

    Pay $some money?

    -
    - -

    - -
    -
    - \ No newline at end of file diff --git a/platforms/browser/www/screens/paymentsent.html b/platforms/browser/www/screens/paymentsent.html deleted file mode 100644 index 0ef3e9d..0000000 --- a/platforms/browser/www/screens/paymentsent.html +++ /dev/null @@ -1,13 +0,0 @@ - - -
    -
    -

    Transaction complete!

    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/platforms/browser/www/screens/peerpay.html b/platforms/browser/www/screens/peerpay.html deleted file mode 100644 index 811f7a2..0000000 --- a/platforms/browser/www/screens/peerpay.html +++ /dev/null @@ -1,20 +0,0 @@ - - -
    -
    -
    -

    Send:

    - -

    To:

    - -
    -
    - -

    - -
    -
    \ No newline at end of file diff --git a/platforms/browser/www/screens/peersent.html b/platforms/browser/www/screens/peersent.html deleted file mode 100644 index 08171e7..0000000 --- a/platforms/browser/www/screens/peersent.html +++ /dev/null @@ -1,13 +0,0 @@ - - -
    -
    -

    Gift Sent!

    -
    - -
    - -
    -
    \ No newline at end of file diff --git a/platforms/browser/www/screens/signup.html b/platforms/browser/www/screens/signup.html deleted file mode 100644 index cca3c41..0000000 --- a/platforms/browser/www/screens/signup.html +++ /dev/null @@ -1,42 +0,0 @@ - - -
    -
    -
    -
    - Create Account -
    -
    - -
    - - -
    -
    -
    - - -
    -
    -
    - - -
    -
    -
    - - -
    -
    - -
    -
    -
    - \ No newline at end of file diff --git a/platforms/ubuntu/apparmor.json b/platforms/ubuntu/apparmor.json index ec8d2fa..bbb30df 100644 --- a/platforms/ubuntu/apparmor.json +++ b/platforms/ubuntu/apparmor.json @@ -1 +1 @@ -{"policy_groups":["networking","audio"],"policy_version":1} \ No newline at end of file +{"policy_groups":["networking","audio","microphone","video","camera","sensors","contacts","location"],"policy_version":1} \ No newline at end of file diff --git a/platforms/ubuntu/build/src/coreplugins.cpp b/platforms/ubuntu/build/src/coreplugins.cpp index fc1a115..8f0ced5 100644 --- a/platforms/ubuntu/build/src/coreplugins.cpp +++ b/platforms/ubuntu/build/src/coreplugins.cpp @@ -19,6 +19,21 @@ #include #include "cplugin.h" #include "coreplugins.h" +#include "plugins/cordova-plugin-dialogs/notification.h" +#include "plugins/cordova-plugin-file/file.h" +#include "plugins/cordova-plugin-media/media.h" +#include "plugins/cordova-plugin-file-transfer/file-transfer.h" +#include "plugins/cordova-plugin-media-capture/capture.h" +#include "plugins/cordova-plugin-device-orientation/compass.h" +#include "plugins/cordova-plugin-device/device.h" +#include "plugins/cordova-plugin-battery-status/battery.h" +#include "plugins/cordova-plugin-camera/camera.h" +#include "plugins/cordova-plugin-contacts/contacts.h" +#include "plugins/cordova-plugin-device-motion/accelerometer.h" +#include "plugins/cordova-plugin-geolocation/geolocation.h" +#include "plugins/cordova-plugin-vibration/vibration.h" +#include "plugins/cordova-plugin-network-information/network_information.h" +#include "plugins/cordova-plugin-console/console.h" INSERT_HEADER_HERE #define INIT_PLUGIN(class) \ @@ -29,7 +44,7 @@ extern "C" { Q_DECL_EXPORT QList> cordovaGetPluginInstances(Cordova *cordova) { QList> res; - INSERT_PLUGIN_HERE + INIT_PLUGIN(Dialogs);INIT_PLUGIN(File);INIT_PLUGIN(Media);INIT_PLUGIN(FileTransfer);INIT_PLUGIN(MediaCapture);INIT_PLUGIN(DeviceOrientation);INIT_PLUGIN(Device);INIT_PLUGIN(BatteryStatus);INIT_PLUGIN(Camera);INIT_PLUGIN(Contacts);INIT_PLUGIN(DeviceMotion);INIT_PLUGIN(Geolocation);INIT_PLUGIN(Vibration);INIT_PLUGIN(NetworkInformation);INIT_PLUGIN(Console);INSERT_PLUGIN_HERE return res; } diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-battery-status/battery.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-battery-status/battery.cpp new file mode 100644 index 0000000..f3b8f80 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-battery-status/battery.cpp @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include + +#include "battery.h" + +BatteryStatus::BatteryStatus(Cordova *cordova) : CPlugin(cordova) { + _scId = 0; + + connect(&_batteryInfo, SIGNAL(remainingCapacityChanged(int,int)), this, SLOT(remainingCapacityChanged(int,int))); + connect(&_batteryInfo, SIGNAL(chargerTypeChanged(QBatteryInfo::ChargerType)), this, SLOT(chargerTypeChanged(QBatteryInfo::ChargerType))); +} + +void BatteryStatus::remainingCapacityChanged(int battery, int capacity) { + Q_UNUSED(battery); + Q_UNUSED(capacity); + + fireEvents(); +} + +void BatteryStatus::chargerTypeChanged(QBatteryInfo::ChargerType type) { + Q_UNUSED(type); + + fireEvents(); +} + +void BatteryStatus::fireEvents() { + int fullCount = 0; + bool isPlugged = false; + + int remaining = 0, total = 0; + for (int i = 0; i < _batteryInfo.batteryCount(); i++) { + isPlugged = (_batteryInfo.chargingState(i) == QBatteryInfo::Charging) || isPlugged; + fullCount += _batteryInfo.chargingState(i) == QBatteryInfo::Full; + + remaining += _batteryInfo.remainingCapacity(i); + total += _batteryInfo.maximumCapacity(i); + } + + isPlugged = isPlugged || (_batteryInfo.batteryCount() == fullCount); + + if (_scId) { + QVariantMap obj; + obj.insert("isPlugged", (int)isPlugged); + if (total != 0) + obj.insert("level", remaining * 100 / total); + else + obj.insert("level", 100); + + this->callbackWithoutRemove(_scId, CordovaInternal::format(obj)); + } +} + +void BatteryStatus::start(int scId, int) { + _scId = scId; +} + +void BatteryStatus::stop(int, int) { + _scId = 0; +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-battery-status/battery.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-battery-status/battery.h new file mode 100644 index 0000000..cec7856 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-battery-status/battery.h @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef BATTERY_H_AAAAAAAA +#define BATTERY_H_AAAAAAAA + +#include + +#include + +class BatteryStatus: public CPlugin { + Q_OBJECT +public: + explicit BatteryStatus(Cordova *cordova); + + virtual const QString fullName() override { + return BatteryStatus::fullID(); + } + + virtual const QString shortName() override { + return "Battery"; + } + + static const QString fullID() { + return "Battery"; + } + +public slots: + void start(int scId, int ecId); + void stop(int scId, int ecId); + +private slots: + void remainingCapacityChanged(int battery, int capacity); + void chargerTypeChanged(QBatteryInfo::ChargerType type); + void onlineStatusChanged(bool isOnline); + +private: + void fireEvents(); + + QBatteryInfo _batteryInfo; + + int _scId; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-camera/camera.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-camera/camera.cpp new file mode 100644 index 0000000..c58af32 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-camera/camera.cpp @@ -0,0 +1,140 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include "camera.h" +#include + +#include +#include +#include +#include +#include + +const char code[] = "\ +var component, object; \ +function createObject() { \ + component = Qt.createComponent(%1); \ + if (component.status == Component.Ready) \ + finishCreation(); \ + else \ + component.statusChanged.connect(finishCreation); \ +} \ +function finishCreation() { \ + CordovaWrapper.global.cameraPluginWidget = component.createObject(root, \ + {root: root, cordova: cordova}); \ +} \ +createObject()"; + + +Camera::Camera(Cordova *cordova): + CPlugin(cordova), + _lastScId(0), + _lastEcId(0) { +} + +bool Camera::preprocessImage(QString &path) { + bool convertToPNG = (*_options.find("encodingType")).toInt() == Camera::PNG; + int quality = (*_options.find("quality")).toInt(); + int width = (*_options.find("targetWidth")).toInt(); + int height = (*_options.find("targetHeight")).toInt(); + + QImage image(path); + if (width <= 0) + width = image.width(); + if (height <= 0) + height = image.height(); + image = image.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); + + QFile oldImage(path); + QTemporaryFile newImage; + + const char *type; + if (convertToPNG) { + path = generateLocation("png"); + type = "png"; + } else { + path = generateLocation("jpg"); + type = "jpg"; + } + + image.save(path, type, quality); + + oldImage.remove(); + + return true; +} + +void Camera::onImageSaved(QString path) { + bool dataURL = _options.find("destinationType")->toInt() == Camera::DATA_URL; + + QString cbParams; + if (preprocessImage(path)) { + QString absolutePath = QFileInfo(path).absoluteFilePath(); + if (dataURL) { + QFile image(absolutePath); + image.open(QIODevice::ReadOnly); + QByteArray content = image.readAll().toBase64(); + cbParams = QString("\"%1\"").arg(content.data()); + image.remove(); + } else { + cbParams = CordovaInternal::format(QString("file://localhost") + absolutePath); + } + } + + this->callback(_lastScId, cbParams); + + _lastEcId = _lastScId = 0; +} + +void Camera::takePicture(int scId, int ecId, int quality, int destinationType, int/*sourceType*/, int targetWidth, int targetHeight, int encodingType, + int/*mediaType*/, bool/*allowEdit*/, bool/*correctOrientation*/, bool/*saveToPhotoAlbum*/, const QVariantMap &/*popoverOptions*/, int/*cameraDirection*/) { + if (_camera.isNull()) { + _camera = QSharedPointer(new QCamera()); + } + + if (((_lastScId || _lastEcId) && (_lastScId != scId && _lastEcId != ecId)) || !_camera->isAvailable() || _camera->lockStatus() != QCamera::Unlocked) { + this->cb(_lastEcId, "Device is busy"); + return; + } + + _options.clear(); + _options.insert("quality", quality); + _options.insert("destinationType", destinationType); + _options.insert("targetWidth", targetWidth); + _options.insert("targetHeight", targetHeight); + _options.insert("encodingType", encodingType); + + _lastScId = scId; + _lastEcId = ecId; + + QString path = m_cordova->get_app_dir() + "/../qml/CaptureWidget.qml"; + + // TODO: relative url + QString qml = QString(code).arg(CordovaInternal::format(path)); + m_cordova->execQML(qml); +} + +void Camera::cancel() { + m_cordova->execQML("CordovaWrapper.global.cameraPluginWidget.destroy()"); + this->cb(_lastEcId, "canceled"); + + _lastEcId = _lastScId = 0; +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-camera/camera.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-camera/camera.h new file mode 100644 index 0000000..6d96038 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-camera/camera.h @@ -0,0 +1,86 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef CAMERA_H +#define CAMERA_H + +#include + +#include +#include +#include +#include +#include + +class Camera: public CPlugin { + Q_OBJECT +public: + explicit Camera(Cordova *cordova); + + virtual const QString fullName() override { + return Camera::fullID(); + } + + virtual const QString shortName() override { + return "Camera"; + } + + static const QString fullID() { + return "Camera"; + } + +public slots: + void takePicture(int scId, int ecId, int quality, int destinationType, int/*sourceType*/, int targetWidth, int targetHeight, int encodingType, + int/*mediaType*/, bool/*allowEdit*/, bool/*correctOrientation*/, bool/*saveToPhotoAlbum*/, const QVariantMap &popoverOptions, int cameraDirection); + void cancel(); + + void onImageSaved(QString path); + + QString generateLocation(const QString &extension) { + int i = 1; + for (;;++i) { + QString path = QString("%1/.local/share/%2/persistent/%3.%4").arg(QDir::homePath()) + .arg(QCoreApplication::applicationName()).arg(i).arg(extension); + + if (!QFileInfo(path).exists()) + return path; + } + } +private: + bool preprocessImage(QString &path); + + int _lastScId; + int _lastEcId; + QSharedPointer _camera; + + QVariantMap _options; +protected: + enum DestinationType { + DATA_URL = 0, + FILE_URI = 1 + }; + enum EncodingType { + JPEG = 0, + PNG = 1 + }; +}; + +#endif // CAMERA_H diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-console/console.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-console/console.cpp new file mode 100644 index 0000000..9de09f4 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-console/console.cpp @@ -0,0 +1,29 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "console.h" + +#include + +Console::Console(Cordova *cordova) : CPlugin(cordova) { +} + +void Console::logLevel(int scId, int ecId, QString level, QString message) { + Q_UNUSED(scId) + Q_UNUSED(ecId) + + if (level != "LOG") + std::cout << "[" << level.toStdString() << "] "; + std::cout << message.toStdString() << std::endl; +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-console/console.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-console/console.h new file mode 100644 index 0000000..3f3d163 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-console/console.h @@ -0,0 +1,43 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef CONSOLE_H_FDSVCXGFRS +#define CONSOLE_H_FDSVCXGFRS + +#include + +#include + +class Console : public CPlugin { + Q_OBJECT +public: + explicit Console(Cordova *cordova); + + virtual const QString fullName() override { + return Console::fullID(); + } + + virtual const QString shortName() override { + return "Console"; + } + + static const QString fullID() { + return "Console"; + } + +public slots: + void logLevel(int scId, int ecId, QString level, QString message); +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-contacts/contacts.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-contacts/contacts.cpp new file mode 100644 index 0000000..373a276 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-contacts/contacts.cpp @@ -0,0 +1,576 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include "contacts.h" + +#if defined QTCONTACTS_USE_NAMESPACE +QTCONTACTS_USE_NAMESPACE +#endif + +Contacts::Contacts(Cordova *cordova): CPlugin(cordova) { + m_fieldNamePairs.clear(); + + m_fieldNamePairs["displayName"] = QContactDetail::TypeDisplayLabel; + m_fieldNamePairs["name"] = QContactDetail::TypeName; + m_fieldNamePairs["nickname"] = QContactDetail::TypeNickname; + m_fieldNamePairs["phoneNumbers"] = QContactDetail::TypePhoneNumber; + m_fieldNamePairs["emails"] = QContactDetail::TypeEmailAddress; + m_fieldNamePairs["addresses"] = QContactDetail::TypeAddress; + m_fieldNamePairs["ims"] = QContactDetail::TypeOnlineAccount; + m_fieldNamePairs["organizations"] = QContactDetail::TypeOrganization; + m_fieldNamePairs["birthday"] = QContactDetail::TypeBirthday; + m_fieldNamePairs["note"] = QContactDetail::TypeNote; + m_fieldNamePairs["photos"] = QContactDetail::TypeAvatar; + m_fieldNamePairs["urls"] = QContactDetail::TypeUrl; + + m_notSupportedFields.clear(); + m_notSupportedFields << "categories"; + m_manager.clear(); + m_manager = QSharedPointer(new QContactManager()); +} + +void Contacts::save(int scId, int ecId, const QVariantMap ¶ms) { + QContact result; + QList detailsToDelete; + + if (params.find("id") != params.end()) { + QString id = params.find("id")->toString(); + if (!id.isEmpty()) { + result = m_manager->contact(QContactId::fromString(id)); + result.clearDetails(); + } + } + + foreach (QString field, params.keys()) { + QContactDetail::DetailType qtDefinition = cordovaFieldNameToQtDefinition(field); + if (qtDefinition == QContactDetail::TypeUndefined) + continue; + + if (field == "nickname") { + QContactNickname *detail = new QContactNickname; + detail->setNickname(params[field].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } else if (field == "note") { + QContactNote *detail = new QContactNote; + detail->setNote(params[field].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } else if (field == "phoneNumbers") { + if (params[field].type() != QVariant::List) + continue; + QVariantList phonesList = params[field].toList(); + foreach (const QVariant &phoneDesc, phonesList) { + if (phoneDesc.type() != QVariant::Map) + continue; + QContactPhoneNumber *detail = new QContactPhoneNumber; + detail->setNumber(phoneDesc.toMap()["value"].toString()); + if (!phoneDesc.toMap()["type"].toString().isEmpty() && + phoneDesc.toMap()["type"].toString() != "phone") + detail->setSubTypes(QList() << + subTypePhoneFromString(phoneDesc.toMap()["type"].toString())); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "emails") { + if (params[field].type() != QVariant::List) + continue; + QVariantList emailsList = params[field].toList(); + foreach (const QVariant &emailDesc, emailsList) { + if (emailDesc.type() != QVariant::Map) + continue; + if (emailDesc.toMap()["value"].toString().isEmpty()) + continue; + QContactEmailAddress *detail = new QContactEmailAddress; + detail->setEmailAddress(emailDesc.toMap()["value"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "ims") { + if (params[field].type() != QVariant::List) + continue; + QVariantList imsList = params[field].toList(); + foreach (const QVariant &imDesc, imsList) { + if (imDesc.type() != QVariant::Map) + continue; + QContactOnlineAccount *detail = new QContactOnlineAccount; + detail->setAccountUri(imDesc.toMap()["value"].toString()); + if (!imDesc.toMap()["type"].toString().isEmpty()) + detail->setSubTypes(QList() << + subTypeOnlineAccountFromString(imDesc.toMap()["type"].toString())); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "photos") { + if (params[field].type() != QVariant::List) + continue; + QVariantList photosList = params[field].toList(); + foreach (const QVariant &photoDesc, photosList) { + if (photoDesc.type() != QVariant::Map) + continue; + //TODO: we need to decide should we support base64 images or not + if (photoDesc.toMap()["type"].toString() != "url") + continue; + QContactAvatar *detail = new QContactAvatar; + detail->setImageUrl(QUrl(photoDesc.toMap()["value"].toString())); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "urls") { + if (params[field].type() != QVariant::List) + continue; + QVariantList urlsList = params[field].toList(); + foreach (const QVariant &urlDesc, urlsList) { + if (urlDesc.type() != QVariant::Map) + continue; + QContactUrl *detail = new QContactUrl; + detail->setUrl(urlDesc.toMap()["value"].toString()); + if (!urlDesc.toMap()["type"].toString().isEmpty()) + detail->setSubType((QContactUrl::SubType) subTypeUrlFromString(urlDesc.toMap()["type"].toString())); + detailsToDelete << detail; + result.saveDetail(detail); + } + } else if (field == "birthday") { + QDateTime birthday; + birthday.setTime_t(params[field].toLongLong() / 1000); + + QContactBirthday *detail = new QContactBirthday; + detail->setDateTime(birthday); + detailsToDelete << detail; + result.saveDetail(detail); + } else if (field == "organizations") { + + if (params[field].type() != QVariant::List) + continue; + QVariantList organizationsList = params[field].toList(); + foreach (const QVariant &organizationDesc, organizationsList) { + if (organizationDesc.type() != QVariant::Map) + continue; + QContactOrganization *detail = new QContactOrganization; + detail->setName(organizationDesc.toMap()["name"].toString()); + detail->setDepartment(QStringList() << organizationDesc.toMap()["department"].toString()); + detail->setRole(organizationDesc.toMap()["title"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + + } else if (field == "name") { + QContactName *detail = new QContactName; + QVariantMap nameMap = params[field].toMap(); + detail->setLastName(nameMap["familyName"].toString()); + detail->setFirstName(nameMap["givenName"].toString()); + detail->setMiddleName(nameMap["middleName"].toString()); + detail->setPrefix(nameMap["honorificPrefix"].toString()); + detail->setSuffix(nameMap["honorificSuffix"].toString()); + detailsToDelete << detail; + result.saveDetail(detail); + } + + } + if (!m_manager->saveContact(&result)) { + switch (m_manager->error()) { + case QContactManager::DoesNotExistError: + case QContactManager::AlreadyExistsError: + case QContactManager::InvalidDetailError: + case QContactManager::InvalidRelationshipError: + case QContactManager::BadArgumentError: + case QContactManager::InvalidContactTypeError: + callback(ecId, "ContactError.INVALID_ARGUMENT_ERROR"); + break; + case QContactManager::DetailAccessError: + case QContactManager::PermissionsError: + callback(ecId, "ContactError.PERMISSION_DENIED_ERROR"); + break; + case QContactManager::NotSupportedError: + callback(ecId, "ContactError.NOT_SUPPORTED_ERROR"); + break; + case QContactManager::TimeoutError: + callback(ecId, "ContactError.TIMEOUT_ERROR"); + break; + case QContactManager::UnspecifiedError: + case QContactManager::LockedError: + case QContactManager::OutOfMemoryError: + case QContactManager::VersionMismatchError: + case QContactManager::LimitReachedError: + case QContactManager::NoError: + default: + callback(ecId, "ContactError.UNKNOWN_ERROR"); + break; + } + } else { + callback(scId, jsonedContact(result)); + } + qDeleteAll(detailsToDelete); +} + +void Contacts::remove(int scId, int ecId, const QString &localId) { + QContactId id = QContactId::fromString(localId); + + if (!m_manager->removeContact(id)) { + switch (m_manager->error()) { + case QContactManager::AlreadyExistsError: + case QContactManager::InvalidDetailError: + case QContactManager::InvalidRelationshipError: + case QContactManager::BadArgumentError: + case QContactManager::InvalidContactTypeError: + callback(ecId, "ContactError.INVALID_ARGUMENT_ERROR"); + break; + case QContactManager::DetailAccessError: + case QContactManager::PermissionsError: + callback(ecId, "ContactError.PERMISSION_DENIED_ERROR"); + break; + case QContactManager::NotSupportedError: + callback(ecId, "ContactError.NOT_SUPPORTED_ERROR"); + break; + case QContactManager::TimeoutError: + callback(ecId, "ContactError.TIMEOUT_ERROR"); + break; + case QContactManager::UnspecifiedError: + case QContactManager::LockedError: + case QContactManager::OutOfMemoryError: + case QContactManager::VersionMismatchError: + case QContactManager::LimitReachedError: + case QContactManager::NoError: + case QContactManager::DoesNotExistError: + default: + callback(ecId, "ContactError.UNKNOWN_ERROR"); + break; + } + + } else { + cb(scId); + } +} + +void Contacts::search(int scId, int ecId, const QStringList &fields, const QVariantMap ¶ms) { + QString filter; + bool multiple = true; + + if (params.find("filter") != params.end()) { + filter = params["filter"].toString(); + } + if (params.find("multiple") != params.end()) { + multiple = params["multiple"].toBool(); + } + + findContacts(scId, ecId, fields, filter, multiple); +} + +void Contacts::findContacts(int scId, int ecId, const QStringList &fields, const QString &filter, bool multiple) { + if (fields.length() <= 0){ + callback(ecId, "new ContactError(ContactError.INVALID_ARGUMENT_ERROR)"); + } + + QContactUnionFilter unionFilter; + + QMap > fieldNames; + fieldNames[QContactDetail::TypeDisplayLabel] << QContactDisplayLabel::FieldLabel; + fieldNames[QContactDetail::TypeName] << QContactName::FieldFirstName << QContactName::FieldLastName << QContactName::FieldMiddleName << QContactName::FieldPrefix << QContactName::FieldSuffix; + fieldNames[QContactDetail::TypeNickname] << QContactNickname::FieldNickname; + fieldNames[QContactDetail::TypePhoneNumber] << QContactPhoneNumber::FieldNumber; + fieldNames[QContactDetail::TypeEmailAddress] << QContactEmailAddress::FieldEmailAddress; + fieldNames[QContactDetail::TypeAddress] << QContactAddress::FieldCountry << QContactAddress::FieldLocality << QContactAddress::FieldPostcode << QContactAddress::FieldPostOfficeBox << QContactAddress::FieldRegion << QContactAddress::FieldStreet; + fieldNames[QContactDetail::TypeOnlineAccount] << QContactOnlineAccount::FieldAccountUri; + fieldNames[QContactDetail::TypeOrganization] << QContactOrganization::FieldAssistantName << QContactOrganization::FieldDepartment << QContactOrganization::FieldLocation << QContactOrganization::FieldName << QContactOrganization::FieldRole << QContactOrganization::FieldTitle; + fieldNames[QContactDetail::TypeBirthday] << QContactBirthday::FieldBirthday; + fieldNames[QContactDetail::TypeNote] << QContactNote::FieldNote; + fieldNames[QContactDetail::TypeUrl] << QContactUrl::FieldUrl; + + foreach (const QContactDetail::DetailType &defName, fieldNames.keys()) { + foreach(int fieldName, fieldNames[defName]) { + QContactDetailFilter subFilter; + subFilter.setDetailType(defName, fieldName); + subFilter.setValue(filter); + subFilter.setMatchFlags(QContactFilter::MatchContains); + unionFilter.append(subFilter); + } + } + + QList contacts = m_manager->contacts(unionFilter); + if (contacts.empty()) { + callback(scId, "[]"); + } else { + QStringList stringifiedContacts; + foreach (const QContact &contact, contacts) { + stringifiedContacts << jsonedContact(contact, fields); + + if (!multiple) + break; + } + callback(scId, QString("[%1]").arg(stringifiedContacts.join(", "))); + } +} + +QContactDetail::DetailType Contacts::cordovaFieldNameToQtDefinition(const QString &cordovaFieldName) const { + if (m_fieldNamePairs.contains(cordovaFieldName)) + return m_fieldNamePairs[cordovaFieldName]; + + return QContactDetail::TypeUndefined; +} + +int Contacts::subTypePhoneFromString(const QString &cordovaSubType) const +{ + QString preparedSubType = cordovaSubType.toLower(); + if (preparedSubType == "mobile") + return QContactPhoneNumber::SubTypeMobile; + else if (preparedSubType == "fax") + return QContactPhoneNumber::SubTypeFax; + else if (preparedSubType == "pager") + return QContactPhoneNumber::SubTypePager; + else if (preparedSubType == "voice") + return QContactPhoneNumber::SubTypeVoice; + else if (preparedSubType == "modem") + return QContactPhoneNumber::SubTypeModem; + else if (preparedSubType == "video") + return QContactPhoneNumber::SubTypeVideo; + else if (preparedSubType == "car") + return QContactPhoneNumber::SubTypeCar; + else if (preparedSubType == "assistant") + return QContactPhoneNumber::SubTypeAssistant; + return QContactPhoneNumber::SubTypeLandline; +} + +int Contacts::subTypeOnlineAccountFromString(const QString &cordovaSubType) const { + QString preparedSubType = cordovaSubType.toLower(); + if (preparedSubType == "aim") + return QContactOnlineAccount::ProtocolAim; + else if (preparedSubType == "icq") + return QContactOnlineAccount::ProtocolIcq; + else if (preparedSubType == "irc") + return QContactOnlineAccount::ProtocolIrc; + else if (preparedSubType == "jabber") + return QContactOnlineAccount::ProtocolJabber; + else if (preparedSubType == "msn") + return QContactOnlineAccount::ProtocolMsn; + else if (preparedSubType == "qq") + return QContactOnlineAccount::ProtocolQq; + else if (preparedSubType == "skype") + return QContactOnlineAccount::ProtocolSkype; + else if (preparedSubType == "yahoo") + return QContactOnlineAccount::ProtocolYahoo; + return QContactOnlineAccount::ProtocolUnknown; +} + +int Contacts::subTypeUrlFromString(const QString &cordovaSubType) const { + QString preparedSubType = cordovaSubType.toLower(); + if (preparedSubType == "blog") + return QContactUrl::SubTypeBlog; + else if (preparedSubType == "favourite") + return QContactUrl::SubTypeFavourite; + return QContactUrl::SubTypeHomePage; +} + +QString Contacts::subTypePhoneToString(int qtSubType) const { + if (qtSubType == QContactPhoneNumber::SubTypeMobile) + return "mobile"; + else if (qtSubType == QContactPhoneNumber::SubTypeFax) + return "fax"; + else if (qtSubType == QContactPhoneNumber::SubTypePager) + return "pager"; + else if (qtSubType == QContactPhoneNumber::SubTypeVoice) + return "voice"; + else if (qtSubType == QContactPhoneNumber::SubTypeModem) + return "modem"; + else if (qtSubType == QContactPhoneNumber::SubTypeVideo) + return "video"; + else if (qtSubType == QContactPhoneNumber::SubTypeCar) + return "car"; + else if (qtSubType == QContactPhoneNumber::SubTypeAssistant) + return "assistant"; + return "home"; +} + +QString Contacts::subTypeOnlineAccountToString(int qtSubType) const { + if (qtSubType == QContactOnlineAccount::ProtocolAim) + return "aim"; + else if (qtSubType == QContactOnlineAccount::ProtocolIcq) + return "icq"; + else if (qtSubType == QContactOnlineAccount::ProtocolIrc) + return "irc"; + else if (qtSubType == QContactOnlineAccount::ProtocolJabber) + return "jabber"; + else if (qtSubType == QContactOnlineAccount::ProtocolMsn) + return "msn"; + else if (qtSubType == QContactOnlineAccount::ProtocolQq) + return "qq"; + else if (qtSubType == QContactOnlineAccount::ProtocolSkype) + return "skype"; + else if (qtSubType == QContactOnlineAccount::ProtocolYahoo) + return "yahoo"; + return "unknown"; +} + +QString Contacts::subTypeUrlToString(int qtSubType) const { + if (qtSubType == QContactUrl::SubTypeBlog) + return "blog"; + else if (qtSubType == QContactUrl::SubTypeFavourite) + return "favourite"; + return "homepage"; +} + +QString Contacts::jsonedContact(const QContact &contact, const QStringList &fields) const { + QStringList resultingFields = fields; + if (resultingFields.empty()) + resultingFields.append(m_fieldNamePairs.keys()); + if (!resultingFields.contains("id")) + resultingFields << "id"; + QStringList fieldValuesList; + foreach (const QString &field, resultingFields) { + QContactDetail::DetailType qtDefinitionName = cordovaFieldNameToQtDefinition(field); + if (field == "id") { + fieldValuesList << QString("%1: \"%2\"") + .arg(field) + .arg(contact.id().toString()); + } else if (field == "displayName") { + QContactDisplayLabel detail = contact.detail(qtDefinitionName); + fieldValuesList << QString("%1: \"%2\"") + .arg(field) + .arg(detail.label()); + } else if (field == "nickname") { + QContactNickname detail = contact.detail(qtDefinitionName); + fieldValuesList << QString("%1: \"%2\"") + .arg(field) + .arg(detail.nickname()); + } else if (field == "note") { + QContactNote detail = contact.detail(qtDefinitionName); + fieldValuesList << QString("%1: \"%2\"") + .arg(field) + .arg(detail.note()); + } else if (field == "phoneNumbers") { + QStringList fieldValues; + QList details = contact.details(qtDefinitionName); + foreach (const QContactDetail &detail, details) { + QContactPhoneNumber castedDetail = detail; + QStringList subTypes; + foreach (int subType, castedDetail.subTypes()) + subTypes << subTypePhoneToString(subType); + + if (subTypes.isEmpty()) + subTypes << "phone"; + foreach(const QString &subType, subTypes) { + fieldValues << QString("{type: \"%1\", value: \"%2\", pref: %3}") + .arg(subType) + .arg(castedDetail.number()) + .arg("false"); + } + } + fieldValuesList << QString("%1: [%2]") + .arg(field) + .arg(fieldValues.join(", ")); + } else if (field == "emails") { + QStringList fieldValues; + QList details = contact.details(qtDefinitionName); + foreach (const QContactDetail &detail, details) { + QContactEmailAddress castedDetail = detail; + fieldValues << QString("{type: \"%1\", value: \"%2\", pref: %3}") + .arg("email") + .arg(castedDetail.emailAddress()) + .arg("false"); + } + fieldValuesList << QString("%1: [%2]") + .arg(field) + .arg(fieldValues.join(", ")); + } else if (field == "ims") { + QStringList fieldValues; + QList details = contact.details(qtDefinitionName); + foreach (const QContactDetail &detail, details) { + QContactOnlineAccount castedDetail = detail; + QStringList subTypes; + foreach (int subType, castedDetail.subTypes()) + subTypes << subTypeOnlineAccountToString(subType); + + if (subTypes.isEmpty()) + subTypes << "IM"; + foreach(const QString &subType, subTypes) { + fieldValues << QString("{type: \"%1\", value: \"%2\", pref: %3}") + .arg(subType) + .arg(castedDetail.accountUri()) + .arg("false"); + } + } + fieldValuesList << QString("%1: [%2]") + .arg(field) + .arg(fieldValues.join(", ")); + } else if (field == "photos") { + QStringList fieldValues; + QList details = contact.details(qtDefinitionName); + foreach (const QContactDetail &detail, details) { + QContactAvatar castedDetail = detail; + fieldValues << QString("{type: \"%1\", value: \"%2\", pref: %3}") + .arg("url") + .arg(castedDetail.imageUrl().toString()) + .arg("false"); + } + fieldValuesList << QString("%1: [%2]") + .arg(field) + .arg(fieldValues.join(", ")); + } else if (field == "urls") { + QStringList fieldValues; + QList details = contact.details(qtDefinitionName); + + foreach (const QContactDetail &detail, details) { + QContactUrl castedDetail = detail; + QString subType = subTypeUrlToString(castedDetail.subType()); + + fieldValues << QString("{type: \"%1\", value: \"%2\", pref: %3}") + .arg(subType) + .arg(castedDetail.url()) + .arg("false"); + } + fieldValuesList << QString("%1: [%2]") + .arg(field) + .arg(fieldValues.join(", ")); + } else if (field == "birthday") { + QContactBirthday detail = contact.detail(qtDefinitionName); + fieldValuesList << QString("%1: %2") + .arg(field) + .arg(detail.dateTime().toMSecsSinceEpoch()); + } else if (field == "organizations") { + QStringList fieldValues; + QList details = contact.details(qtDefinitionName); + foreach (const QContactDetail &detail, details) { + QContactOrganization castedDetail = detail; + fieldValues << QString("{type: \"%1\", name: \"%2\", department: \"%3\", title: \"%4\", pref: %5}") + .arg("organization") + .arg(castedDetail.name()) + .arg(castedDetail.department().join(" ")) + .arg(castedDetail.role()) + .arg("false"); + } + fieldValuesList << QString("%1: [%2]") + .arg(field) + .arg(fieldValues.join(", ")); + } else if (field == "name") { + QContactName detail = contact.detail(qtDefinitionName); + fieldValuesList << QString("%1: {familyName: \"%2\", givenName: \"%3\", middleName: \"%4\", honorificPrefix: \"%5\", honorificSuffix: \"%6\"}") + .arg(field) + .arg(detail.lastName()) + .arg(detail.firstName()) + .arg(detail.middleName()) + .arg(detail.prefix()) + .arg(detail.suffix()); + } + + + } + + return QString("{%1}").arg(fieldValuesList.join(", ")); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-contacts/contacts.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-contacts/contacts.h new file mode 100644 index 0000000..4c1343b --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-contacts/contacts.h @@ -0,0 +1,70 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef CONTACTS_H_SSSSSSS +#define CONTACTS_H_SSSSSSS + +#include + +#include +#include + +QTCONTACTS_USE_NAMESPACE + +class Contacts : public CPlugin { + Q_OBJECT +public: + explicit Contacts(Cordova *cordova); + + virtual const QString fullName() override { + return Contacts::fullID(); + } + + virtual const QString shortName() override { + return "Contacts"; + } + + static const QString fullID() { + return "Contacts"; + } + +public slots: + void save(int scId, int ecId, const QVariantMap ¶ms); + void remove(int scId, int ecId, const QString &localId); + void search(int scId, int ecId, const QStringList &fields, const QVariantMap ¶ms); + +private: + void findContacts(int scId, int ecId, const QStringList &fields, const QString &filter, bool multiple); + QContactDetail::DetailType cordovaFieldNameToQtDefinition(const QString &cordovaFieldName) const; + int subTypePhoneFromString(const QString &cordovaSubType) const; + int subTypeOnlineAccountFromString(const QString &cordovaSubType) const; + int subTypeUrlFromString(const QString &cordovaSubType) const; + QString subTypePhoneToString(int qtSubType) const; + QString subTypeOnlineAccountToString(int qtSubType) const; + QString subTypeUrlToString(int qtSubType) const; + QString jsonedContact(const QContact &contact, const QStringList &fields = QStringList()) const; + + QHash m_fieldNamePairs; + QSet m_notSupportedFields; + QSharedPointer m_manager; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-device-motion/accelerometer.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-device-motion/accelerometer.cpp new file mode 100644 index 0000000..74e3ead --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-device-motion/accelerometer.cpp @@ -0,0 +1,58 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include +#include "accelerometer.h" + +DeviceMotion::DeviceMotion(Cordova *cordova): CPlugin(cordova), _scId(0), _ecId(0) { + _accelerometerSource = QSharedPointer(new QAccelerometer()); + _sensorAvaliable = _accelerometerSource->start(); + connect(_accelerometerSource.data(), SIGNAL(readingChanged()), SLOT(updateSensor())); +} + +void DeviceMotion::start(int scId, int ecId) { + assert(_ecId == 0); + assert(_scId == 0); + + _ecId = ecId; + _scId = scId; + + if (!_sensorAvaliable) { + this->cb(ecId); + return; + } +} + +void DeviceMotion::stop(int, int) { + _scId = 0; + _ecId = 0; +} + +void DeviceMotion::updateSensor() { + QAccelerometerReading *accelerometer = _accelerometerSource->reading(); + + QVariantMap obj; + obj.insert("x", accelerometer->x()); + obj.insert("y", accelerometer->y()); + obj.insert("z", accelerometer->z()); + // accelerometer->timestamp() is not sutiable. + // Timestamps values are microseconds since _a_ fixed point(depend on backend). + obj.insert("timestamp", QDateTime::currentDateTime().toMSecsSinceEpoch()); + + if (_scId) + this->callbackWithoutRemove(_scId, CordovaInternal::format(obj)); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-device-motion/accelerometer.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-device-motion/accelerometer.h new file mode 100644 index 0000000..3f36a16 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-device-motion/accelerometer.h @@ -0,0 +1,55 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef ACCELEROMETER_H +#define ACCELEROMETER_H + +#include +#include +#include + +class DeviceMotion: public CPlugin { + Q_OBJECT +public: + explicit DeviceMotion(Cordova *cordova); + + virtual const QString fullName() override { + return DeviceMotion::fullID(); + } + + virtual const QString shortName() override { + return "Accelerometer"; + } + + static const QString fullID() { + return "Accelerometer"; + } + +public slots: + void start(int scId, int ecId); + void stop(int scId, int ecId); + +protected slots: + void updateSensor(); + +private: + int _scId, _ecId; + bool _sensorAvaliable; + QSharedPointer _accelerometerSource; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-device-orientation/compass.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-device-orientation/compass.cpp new file mode 100644 index 0000000..a2c3bee --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-device-orientation/compass.cpp @@ -0,0 +1,75 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "compass.h" + +DeviceOrientation::DeviceOrientation(Cordova *cordova): CPlugin(cordova), _validData(false) { + _compass.connectToBackend(); + connect(&_compass, SIGNAL(readingChanged()), SLOT(updateSensor())); + connect(&_compass, SIGNAL(sensorError(int)), SLOT(sensorError(int))); +} + +void DeviceOrientation::getHeading(int scId, int ecId, QVariantMap options) { + Q_UNUSED(options); + if (_compass.isConnectedToBackend() || !_compass.start()) { + this->callback(ecId, "CompassError.COMPASS_NOT_SUPPORTED"); + return; + } + + _successCallbacks << scId; + _errorCallbacks << ecId; + + if (_validData) { + reportResult(); + return; + } +} + +void DeviceOrientation::sensorError(int error) { + Q_UNUSED(error); + + for (int ecId: _errorCallbacks) { + this->callback(ecId, "CompassError.COMPASS_INTERNAL_ERR"); + } + + _errorCallbacks.clear(); + _successCallbacks.clear(); + _validData = false; +} + +void DeviceOrientation::reportResult() { + QVariantMap obj; + + obj.insert("magneticHeading", _azymuth); + obj.insert("trueHeading", _azymuth); + obj.insert("headingAccuracy", _accuracy); + obj.insert("timestamp", _timestamp); + + for (int scId: _successCallbacks) { + this->cb(scId, obj); + } + + _errorCallbacks.clear(); + _successCallbacks.clear(); +} + +void DeviceOrientation::updateSensor(){ + QCompassReading *heading = _compass.reading(); + _azymuth = heading->azimuth(); + _accuracy = heading->calibrationLevel(); + _timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch(); + + _validData = true; + reportResult(); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-device-orientation/compass.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-device-orientation/compass.h new file mode 100644 index 0000000..a1f421e --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-device-orientation/compass.h @@ -0,0 +1,58 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMPASS_H_HKFSAHKDFAS +#define COMPASS_H_HKFSAHKDFAS + +#include +#include +#include + +class DeviceOrientation: public CPlugin { + Q_OBJECT +public: + explicit DeviceOrientation(Cordova *cordova); + + virtual const QString fullName() override { + return DeviceOrientation::fullID(); + } + + virtual const QString shortName() override { + return "Compass"; + } + + static const QString fullID() { + return "Compass"; + } + +public slots: + void getHeading(int scId, int ecId, QVariantMap options); + +protected slots: + void updateSensor(); + void sensorError(int error); + +private: + void reportResult(); + QCompass _compass; + QList _successCallbacks; + QList _errorCallbacks; + + double _azymuth; + double _accuracy; + qtimestamp _timestamp; + bool _validData; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-device/device.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-device/device.cpp new file mode 100644 index 0000000..eb5a012 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-device/device.cpp @@ -0,0 +1,64 @@ +/* + * Copyright 2011 Wolfgang Koller - http://www.gofg.at/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include"device.h" + +#define CORDOVA "3.0.0" + +Device::Device(Cordova *cordova) : CPlugin(cordova) { +} + +static QString getOSName() { +#ifdef Q_OS_SYMBIAN + QString platform = "Symbian"; +#endif +#ifdef Q_OS_WIN + QString platform = "Windows"; +#endif +#ifdef Q_OS_WINCE + QString platform = "Windows CE"; +#endif +#ifdef Q_OS_LINUX + QString platform = "Linux"; +#endif + return platform; +} + +void Device::getInfo(int scId, int ecId) { + Q_UNUSED(ecId) + + QDeviceInfo systemDeviceInfo; + QDeviceInfo systemInfo; + + QString platform = getOSName(); + + QString uuid = systemDeviceInfo.uniqueDeviceID(); + if (uuid.isEmpty()) { + QString deviceDescription = systemInfo.imei(0) + ";" + systemInfo.manufacturer() + ";" + systemInfo.model() + ";" + systemInfo.productName() + ";" + platform; + QString user = qgetenv("USER"); + if (user.isEmpty()) { + user = qgetenv("USERNAME"); + if (user.isEmpty()) + user = QDir::homePath(); + } + uuid = QString(QCryptographicHash::hash((deviceDescription + ";" + user).toUtf8(), QCryptographicHash::Md5).toHex()); + } + + this->cb(scId, systemDeviceInfo.model(), CORDOVA, platform, uuid, systemInfo.version(QDeviceInfo::Os)); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-device/device.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-device/device.h new file mode 100644 index 0000000..91cb937 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-device/device.h @@ -0,0 +1,47 @@ +/* + * Copyright 2011 Wolfgang Koller - http://www.gofg.at/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DEVICE_H_FDSAFAS +#define DEVICE_H_FDSAFAS + +#include + +#include + +class Device: public CPlugin { + Q_OBJECT +public: + explicit Device(Cordova *cordova); + + virtual const QString fullName() override { + return Device::fullID(); + } + + virtual const QString shortName() override { + return "Device"; + } + + static const QString fullID() { + return "com.cordova.Device"; + } + +signals: + +public slots: + void getInfo(int scId, int ecId); +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-dialogs/notification.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-dialogs/notification.cpp new file mode 100644 index 0000000..d0adf89 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-dialogs/notification.cpp @@ -0,0 +1,85 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "notification.h" + +#include + +void Dialogs::beep(int scId, int ecId, int times) { + Q_UNUSED(scId) + Q_UNUSED(ecId) + Q_UNUSED(times) + + _player.setVolume(100); + _player.setMedia(QUrl::fromLocalFile("/usr/share/sounds/ubuntu/stereo/bell.ogg")); + _player.play(); +} + +void Dialogs::alert(int scId, int ecId, const QString &message, const QString &title, const QString &buttonLabel) { + QStringList list; + list.append(buttonLabel); + + confirm(scId, ecId, message, title, list); +} + +void Dialogs::confirm(int scId, int ecId, const QString &message, const QString &title, const QStringList &buttonLabels) { + Q_UNUSED(ecId); + + if (_alertCallback) { + qCritical() << "can't open second dialog"; + return; + } + _alertCallback = scId; + + QString s1, s2, s3; + if (buttonLabels.size() > 0) + s1 = buttonLabels[0]; + if (buttonLabels.size() > 1) + s2 = buttonLabels[1]; + if (buttonLabels.size() > 2) + s3 = buttonLabels[2]; + + QString path = m_cordova->get_app_dir() + "/../qml/notification.qml"; + QString qml = QString("PopupUtils.open(%1, root, { root: root, cordova: cordova, title: %2, text: %3, promptVisible: false, button1Text: %4, button2Text: %5, button3Text: %6 })") + .arg(CordovaInternal::format(path)).arg(CordovaInternal::format(title)).arg(CordovaInternal::format(message)) + .arg(CordovaInternal::format(s1)).arg(CordovaInternal::format(s2)).arg(CordovaInternal::format(s3)); + + m_cordova->execQML(qml); +} + +void Dialogs::prompt(int scId, int ecId, const QString &message, const QString &title, const QStringList &buttonLabels, const QString &defaultText) { + Q_UNUSED(ecId); + + if (_alertCallback) { + qCritical() << "can't open second dialog"; + return; + } + _alertCallback = scId; + + QString s1, s2, s3; + if (buttonLabels.size() > 0) + s1 = buttonLabels[0]; + if (buttonLabels.size() > 1) + s2 = buttonLabels[1]; + if (buttonLabels.size() > 2) + s3 = buttonLabels[2]; + QString path = m_cordova->get_app_dir() + "/../qml/notification.qml"; + QString qml = QString("PopupUtils.open(%1, root, { root: root, cordova: cordova, title: %2, text: %3, promptVisible: true, defaultPromptText: %7, button1Text: %4, button2Text: %5, button3Text: %6 })") + .arg(CordovaInternal::format(path)).arg(CordovaInternal::format(title)).arg(CordovaInternal::format(message)) + .arg(CordovaInternal::format(s1)).arg(CordovaInternal::format(s2)) + .arg(CordovaInternal::format(s3)).arg(CordovaInternal::format(defaultText)); + + m_cordova->execQML(qml); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-dialogs/notification.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-dialogs/notification.h new file mode 100644 index 0000000..5343073 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-dialogs/notification.h @@ -0,0 +1,64 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NOTIFICATION_H +#define NOTIFICATION_H + +#include +#include +#include +#include + +class Dialogs: public CPlugin { + Q_OBJECT +public: + explicit Dialogs(Cordova *cordova): CPlugin(cordova), _alertCallback(0) { + } + + virtual const QString fullName() override { + return Dialogs::fullID(); + } + + virtual const QString shortName() override { + return "Notification"; + } + + static const QString fullID() { + return "Notification"; + } +public slots: + void beep(int scId, int ecId, int times); + void alert(int scId, int ecId, const QString &message, const QString &title, const QString &buttonLabel); + void confirm(int scId, int ecId, const QString &message, const QString &title, const QStringList &buttonLabels); + void prompt(int scId, int ecId, const QString &message, const QString &title, const QStringList &buttonLabels, const QString &defaultText); + + void notificationDialogButtonPressed(int buttonId, const QString &text, bool prompt) { + if (prompt) { + QVariantMap res; + res.insert("buttonIndex", buttonId); + res.insert("input1", text); + this->cb(_alertCallback, res); + } else { + this->cb(_alertCallback, buttonId); + } + _alertCallback = 0; + } + +private: + int _alertCallback; + QMediaPlayer _player; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-file-transfer/file-transfer.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-file-transfer/file-transfer.cpp new file mode 100644 index 0000000..5b1adea --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-file-transfer/file-transfer.cpp @@ -0,0 +1,265 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include "file-transfer.h" +#include +#include + +static void SetHeaders(QNetworkRequest &request, const QVariantMap &headers) { + for (const QString &key: headers.keys()) { + QVariant val = *headers.find(key); + QString value = val.toString(); + if (val.userType() == QMetaType::QVariantList || val.userType() == QMetaType::QStringList) { + QList list = val.toList(); + for (QVariant v: list) { + if (value.size()) + value += ", "; + value += v.toString(); + } + } + request.setRawHeader(key.toUtf8(), value.toUtf8()); + } +} + +void FileTransfer::download(int scId, int ecId, const QString& url, const QString &target, bool /*trustAllHost*/, int id, const QVariantMap &headers) { + QSharedPointer request(new FileTransferRequest(_manager, scId, ecId, id, this)); + + assert(_id2request.find(id) == _id2request.end()); + + _id2request.insert(id, request); + + request->connect(request.data(), &FileTransferRequest::done, [&]() { + auto it = _id2request.find(id); + while (it != _id2request.end() && it.key() == id) { + if (it.value().data() == request.data()) { + _id2request.erase(it); + break; + } + it++; + } + }); + request->download(url, target, headers); +} + +void FileTransfer::upload(int scId, int ecId, const QString &fileURI, const QString& url, const QString& fileKey, const QString& fileName, const QString& mimeType, + const QVariantMap & params, bool /*trustAllHosts*/, bool /*chunkedMode*/, const QVariantMap &headers, int id, const QString &/*httpMethod*/) { + QSharedPointer request(new FileTransferRequest(_manager, scId, ecId, id, this)); + + assert(_id2request.find(id) == _id2request.end()); + + _id2request.insert(id, request); + + request->connect(request.data(), &FileTransferRequest::done, [&]() { + auto it = _id2request.find(id); + while (it != _id2request.end() && it.key() == id) { + if (it.value().data() == request.data()) { + _id2request.erase(it); + break; + } + it++; + } + }); + request->upload(url, fileURI, fileKey, fileName, mimeType, params, headers); +} + +void FileTransfer::abort(int scId, int ecId, int id) { + Q_UNUSED(scId) + Q_UNUSED(ecId) + + auto it = _id2request.find(id); + while (it != _id2request.end() && it.key() == id) { + (*it)->abort(); + it++; + } +} + +void FileTransferRequest::download(const QString& uri, const QString &targetURI, const QVariantMap &headers) { + QUrl url(uri); + QNetworkRequest request; + + QSharedPointer filePlugin(_plugin->cordova()->getPlugin()); + + if (!filePlugin.data()) + return; + + if (!url.isValid()) { + QVariantMap map; + map.insert("code", INVALID_URL_ERR); + map.insert("source", uri); + map.insert("target", targetURI); + _plugin->cb(_ecId, map); + emit done(); + return; + } + + request.setUrl(url); + if (url.password().size() || url.userName().size()) { + QString headerData = "Basic " + (url.userName() + ":" + url.password()).toLocal8Bit().toBase64(); + request.setRawHeader("Authorization", headerData.toLocal8Bit()); + } + SetHeaders(request, headers); + _reply = QSharedPointer(_manager.get(request)); + + _reply->connect(_reply.data(), &QNetworkReply::finished, [this, targetURI, uri, filePlugin]() { + if (!_scId || _reply->error() != QNetworkReply::NoError) + return; + + QPair f1(dynamic_cast(filePlugin.data())->resolveURI(targetURI)); + + QFile res(f1.second.absoluteFilePath()); + if (!f1.first || !res.open(QIODevice::WriteOnly)) { + QVariantMap map; + map.insert("code", INVALID_URL_ERR); + map.insert("source", uri); + map.insert("target", targetURI); + _plugin->cb(_ecId, map); + emit done(); + return; + } + res.write(_reply->readAll()); + + _plugin->cb(_scId, dynamic_cast(filePlugin.data())->file2map(f1.second)); + + emit done(); + }); + _reply->connect(_reply.data(), SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError))); + _reply->connect(_reply.data(), SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(progress(qint64, qint64))); +} + +void FileTransferRequest::upload(const QString& _url, const QString& fileURI, QString fileKey, QString fileName, QString mimeType, const QVariantMap ¶ms, const QVariantMap &headers) { + QUrl url(_url); + QNetworkRequest request; + + QSharedPointer filePlugin(_plugin->cordova()->getPlugin()); + + if (!filePlugin.data()) + return; + + if (!url.isValid()) { + QVariantMap map; + map.insert("code", INVALID_URL_ERR); + map.insert("source", fileURI); + map.insert("target", _url); + _plugin->cb(_ecId, map); + emit done(); + return; + } + + QPair f1(dynamic_cast(filePlugin.data())->resolveURI(fileURI)); + QFile file(f1.second.absoluteFilePath()); + if (!f1.first || !file.open(QIODevice::ReadOnly)) { + QVariantMap map; + map.insert("code", FILE_NOT_FOUND_ERR); + map.insert("source", fileURI); + map.insert("target", _url); + _plugin->cb(_ecId, map); + emit done(); + return; + } + QString content{file.readAll()}; + + request.setUrl(url); + if (url.password().size() || url.userName().size()) { + QString headerData = "Basic " + (url.userName() + ":" + url.password()).toLocal8Bit().toBase64(); + request.setRawHeader("Authorization", headerData.toLocal8Bit()); + } + SetHeaders(request, headers); + + QString boundary = QString("CORDOVA-QT-%1A").arg(qrand()); + while (content.contains(boundary)) { + boundary += QString("B%1A").arg(qrand()); + } + + request.setHeader(QNetworkRequest::ContentTypeHeader, QString("multipart/form-data; boundary=") + boundary); + + fileKey.replace("\"", ""); + fileName.replace("\"", ""); + mimeType.replace("\"", ""); + QString part = "--" + boundary + "\r\n"; + + part += "Content-Disposition: form-data; name=\"" + fileKey +"\"; filename=\"" + fileName + "\"\r\n"; + part += "Content-Type: " + mimeType + "\r\n\r\n"; + part += content + "\r\n"; + + for (QString key: params.keys()) { + part += "--" + boundary + "\r\n"; + part += "Content-Disposition: form-data; name=\"" + key + "\";\r\n\r\n"; + part += params.find(key)->toString(); + part += "\r\n"; + } + + part += QString("--") + boundary + "--" + "\r\n"; + + _reply = QSharedPointer(_manager.post(request, QByteArray(part.toUtf8()))); + + _reply->connect(_reply.data(), &QNetworkReply::finished, [this, content]() { + if (_reply->error() != QNetworkReply::NoError) + return; + int status = 200; + QVariant statusCode = _reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + + if (statusCode.isValid()) { + status = statusCode.toInt(); + } + + QVariantMap map; + map.insert("responseCode", status); + map.insert("response", QString(_reply->readAll())); + map.insert("bytesSent", content.size()); + _plugin->cb(_scId, map); + emit done(); + }); + _reply->connect(_reply.data(), SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError))); + _reply->connect(_reply.data(), SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(progress(qint64, qint64))); +} + +void FileTransferRequest::abort() { + QVariantMap map; + map.insert("code", ABORT_ERR); + _plugin->cb(_ecId, map); + _scId = 0; + emit done(); +} + +void FileTransferRequest::error(QNetworkReply::NetworkError code) { + Q_UNUSED(code); + + int status = 404; + QVariant statusCode = _reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + if (statusCode.isValid()) { + status = statusCode.toInt(); + } + + QVariantMap map; + map.insert("http_status", status); + map.insert("body", QString(_reply->readAll())); + map.insert("code", CONNECTION_ERR); + _plugin->cb(_ecId, map); + emit done(); +} + +void FileTransferRequest::progress(qint64 bytesReceived, qint64 bytesTotal) { + QVariantMap map; + map.insert("lengthComputable", true); + map.insert("total", bytesTotal); + map.insert("loaded", bytesReceived); + + if (bytesReceived && bytesTotal && _scId) + _plugin->callbackWithoutRemove(_scId, CordovaInternal::format(map)); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-file-transfer/file-transfer.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-file-transfer/file-transfer.h new file mode 100644 index 0000000..75822cb --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-file-transfer/file-transfer.h @@ -0,0 +1,103 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef FILE_TRANSFER_H_SDASDASDAS +#define FILE_TRANSFER_H_SDASDASDAS + +#include +#include + +#include + +class FileTransfer; + +class FileTransferRequest: public QObject { + Q_OBJECT + + QNetworkAccessManager &_manager; + int _scId, _ecId; + int _id; + QSharedPointer _reply; + + enum FileTransferError { + FILE_NOT_FOUND_ERR = 1, + INVALID_URL_ERR = 2, + CONNECTION_ERR = 3, + ABORT_ERR = 4 + }; + +public: + FileTransferRequest(QNetworkAccessManager &manager, int scId, int ecId, int id, FileTransfer *plugin): + _manager(manager), + _scId(scId), + _ecId(ecId), + _id(id), + _plugin(plugin) { + } + + void download(const QString& url, const QString &targetURI, const QVariantMap &headers); + void upload(const QString& _url, const QString& fileURI, QString fileKey, QString fileName, QString mimeType, const QVariantMap ¶ms, const QVariantMap &headers); + void abort(); + +signals: + void done(); + +private slots: + void progress(qint64 bytesReceived, qint64 bytesTotal); + void error(QNetworkReply::NetworkError code); +private: + FileTransfer *_plugin; + Q_DISABLE_COPY(FileTransferRequest); +}; + +class FileTransfer : public CPlugin { + Q_OBJECT +public: + explicit FileTransfer(Cordova *cordova): CPlugin(cordova) { + } + + Cordova* cordova() { + return m_cordova; + } + + virtual const QString fullName() override { + return FileTransfer::fullID(); + } + + virtual const QString shortName() override { + return "FileTransfer"; + } + + static const QString fullID() { + return "FileTransfer"; + } + +public slots: + void abort(int scId, int ecId, int id); + void download(int scId, int ecId, const QString& url, const QString &target, bool /*trustAllHost*/, int id, const QVariantMap &/*headers*/); + void upload(int scId, int ecId, const QString &filePath, const QString& url, const QString& fileKey, const QString& fileName, const QString& mimeType, + const QVariantMap & params, bool /*trustAllHosts*/, bool /*chunkedMode*/, const QVariantMap &headers, int id, const QString &httpMethod); + +private: + QNetworkAccessManager _manager; + QMultiMap > _id2request; + int lastRequestId; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-file/file.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-file/file.cpp new file mode 100644 index 0000000..395ab2d --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-file/file.cpp @@ -0,0 +1,912 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "file.h" + +#include + +namespace { + class FileError { + public: + static const QString kEncodingErr; + static const QString kTypeMismatchErr; + static const QString kNotFoundErr; + static const QString kSecurityErr; + static const QString kAbortErr; + static const QString kNotReadableErr; + static const QString kNoModificationAllowedErr; + static const QString kInvalidStateErr; + static const QString kSyntaxErr; + static const QString kInvalidModificationErr; + static const QString kQuotaExceededErr; + static const QString kPathExistsErr; + }; + + bool checkFileName(const QString &name) { + if (name.contains(":")){ + return false; + } + return true; + } +}; + +const QString FileError::kEncodingErr("FileError.ENCODING_ERR"); +const QString FileError::kTypeMismatchErr("FileError.TYPE_MISMATCH_ERR"); +const QString FileError::kNotFoundErr("FileError.NOT_FOUND_ERR"); +const QString FileError::kSecurityErr("FileError.SECURITY_ERR"); +const QString FileError::kAbortErr("FileError.ABORT_ERR"); +const QString FileError::kNotReadableErr("FileError.NOT_READABLE_ERR"); +const QString FileError::kNoModificationAllowedErr("FileError.NO_MODIFICATION_ALLOWED_ERR"); +const QString FileError::kInvalidStateErr("FileError.INVALID_STATE_ERR"); +const QString FileError::kSyntaxErr("FileError.SYNTAX_ERR"); +const QString FileError::kInvalidModificationErr("FileError.INVALID_MODIFICATION_ERR"); +const QString FileError::kQuotaExceededErr("FileError.QUOTA_EXCEEDED_ERR"); +const QString FileError::kPathExistsErr("FileError.PATH_EXISTS_ERR"); + +File::File(Cordova *cordova) : + CPlugin(cordova), + _persistentDir(QString("%1/.local/share/%2/persistent").arg(QDir::homePath()).arg(QCoreApplication::applicationName())) { + QDir::root().mkpath(_persistentDir.absolutePath()); +} + +QVariantMap File::file2map(const QFileInfo &fileInfo) { + QVariantMap res; + + res.insert("name", fileInfo.fileName()); + QPair r = GetRelativePath(fileInfo); + res.insert("fullPath", QString("/") + r.second); + res.insert("filesystemName", r.first); + + res.insert("nativeURL", QString("file://localhost") + fileInfo.absoluteFilePath()); + res.insert("isDirectory", (int)fileInfo.isDir()); + res.insert("isFile", (int)fileInfo.isFile()); + + return res; +} + +QVariantMap File::dir2map(const QDir &dir) { + return file2map(QFileInfo(dir.absolutePath())); +} + +QPair File::GetRelativePath(const QFileInfo &fileInfo) { + QString fullPath = fileInfo.isDir() ? QDir::cleanPath(fileInfo.absoluteFilePath()) : fileInfo.absoluteFilePath(); + + QString relativePath1 = _persistentDir.relativeFilePath(fullPath); + QString relativePath2 = QDir::temp().relativeFilePath(fullPath); + + if (!(relativePath1[0] != '.' || relativePath2[0] != '.')) { + if (relativePath1.size() > relativePath2.size()) { + return QPair("temporary", relativePath2); + } else { + return QPair("persistent", relativePath1); + } + } + + if (relativePath1[0] != '.') + return QPair("persistent", relativePath1); + return QPair("temporary", relativePath2); +} + +void File::requestFileSystem(int scId, int ecId, unsigned short type, unsigned long long size) { + QDir dir; + + if (size >= 1000485760){ + this->callback(ecId, FileError::kQuotaExceededErr); + return; + } + + if (type == 0) + dir = QDir::temp(); + else + dir = _persistentDir; + + if (type > 1) { + this->callback(ecId, FileError::kSyntaxErr); + return; + } else { + QVariantMap res; + res.insert("root", dir2map(dir)); + if (type == 0) + res.insert("name", "temporary"); + else + res.insert("name", "persistent"); + + this->cb(scId, res); + } +} + +QPair File::resolveURI(int ecId, const QString &uri) { + QPair result; + + result.first = false; + + QUrl url = QUrl::fromUserInput(uri); + + if (url.scheme() == "file" && url.isValid()) { + result.first = true; + result.second = QFileInfo(url.path()); + return result; + } + + if (url.scheme() != "cdvfile") { + if (ecId) + this->callback(ecId, FileError::kTypeMismatchErr); + return result; + } + + QString path = url.path().replace("//", "/"); + //NOTE: colon is not safe in url, it is not a valid path in Win and Mac, simple disable it here. + if (path.contains(":") || !url.isValid()){ + if (ecId) + this->callback(ecId, FileError::kEncodingErr); + return result; + } + if (!path.startsWith("/persistent/") && !path.startsWith("/temporary/")) { + if (ecId) + this->callback(ecId, FileError::kEncodingErr); + return result; + } + + result.first = true; + if (path.startsWith("/persistent/")) { + QString relativePath = path.mid(QString("/persistent/").size()); + result.second = QFileInfo(_persistentDir.filePath(relativePath)); + } else { + QString relativePath = path.mid(QString("/temporary/").size()); + result.second = QFileInfo(QDir::temp().filePath(relativePath)); + } + return result; +} + +QPair File::resolveURI(const QString &uri) { + return resolveURI(0, uri); +} + + +void File::_getLocalFilesystemPath(int scId, int ecId, const QString& uri) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + this->cb(scId, f1.second.absoluteFilePath()); +} + +void File::resolveLocalFileSystemURI(int scId, int ecId, const QString &uri) { + if (uri[0] == '/' || uri[0] == '.') { + this->callback(ecId, FileError::kEncodingErr); + return; + } + + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + QFileInfo fileInfo = f1.second; + if (!fileInfo.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + this->cb(scId, file2map(fileInfo)); +} + +void File::getFile(int scId, int ecId, const QString &parentPath, const QString &rpath, const QVariantMap &options) { + QPair f1 = resolveURI(ecId, parentPath + "/" + rpath); + if (!f1.first) + return; + + bool create = options.value("create").toBool(); + bool exclusive = options.value("exclusive").toBool(); + QFile file(f1.second.absoluteFilePath()); + + // if create is false and the path represents a directory, return error + QFileInfo fileInfo = f1.second; + if ((!create) && fileInfo.isDir()) { + this->callback(ecId, FileError::kTypeMismatchErr); + return; + } + + // if file does exist, and create is true and exclusive is true, return error + if (file.exists()) { + if (create && exclusive) { + this->callback(ecId, FileError::kPathExistsErr); + return; + } + } + else { + // if file does not exist and create is false, return error + if (!create) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + file.open(QIODevice::WriteOnly); + file.close(); + + // Check if creation was successfull + if (!file.exists()) { + this->callback(ecId, FileError::kNoModificationAllowedErr); + return; + } + } + + this->cb(scId, file2map(QFileInfo(file))); +} + +void File::getDirectory(int scId, int ecId, const QString &parentPath, const QString &rpath, const QVariantMap &options) { + QPair f1 = resolveURI(ecId, parentPath + "/" + rpath); + if (!f1.first) + return; + + bool create = options.value("create").toBool(); + bool exclusive = options.value("exclusive").toBool(); + QDir dir(f1.second.absoluteFilePath()); + + QFileInfo &fileInfo = f1.second; + if ((!create) && fileInfo.isFile()) { + this->callback(ecId, FileError::kTypeMismatchErr); + return; + } + + if (dir.exists()) { + if (create && exclusive) { + this->callback(ecId, FileError::kPathExistsErr); + return; + } + } + else { + if (!create) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + QString folderName = dir.dirName(); + dir.cdUp(); + dir.mkdir(folderName); + dir.cd(folderName); + + if (!dir.exists()) { + this->callback(ecId, FileError::kNoModificationAllowedErr); + return; + } + } + + this->cb(scId, dir2map(dir)); +} + +void File::removeRecursively(int scId, int ecId, const QString &uri) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + QDir dir(f1.second.absoluteFilePath()); + if (File::rmDir(dir)) + this->cb(scId); + else + this->callback(ecId, FileError::kNoModificationAllowedErr); +} + +void File::write(int scId, int ecId, const QString &uri, const QString &_data, unsigned long long position, bool binary) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + QFile file(f1.second.absoluteFilePath()); + + file.open(QIODevice::WriteOnly); + file.close(); + + if (!file.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + QFileInfo fileInfo(file); + if (!file.open(QIODevice::ReadWrite)) { + this->callback(ecId, FileError::kNoModificationAllowedErr); + return; + } + + if (!binary) { + QTextStream textStream(&file); + textStream.setCodec("UTF-8"); + textStream.setAutoDetectUnicode(true); + + if (!textStream.seek(position)) { + file.close(); + fileInfo.refresh(); + + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + textStream << _data; + textStream.flush(); + } else { + QByteArray data(_data.toUtf8()); + if (!file.seek(position)) { + file.close(); + fileInfo.refresh(); + + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + file.write(data.data(), data.length()); + } + + file.flush(); + file.close(); + fileInfo.refresh(); + + this->cb(scId, fileInfo.size() - position); +} + +void File::truncate(int scId, int ecId, const QString &uri, unsigned long long size) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + QFile file(f1.second.absoluteFilePath()); + + if (!file.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + if (!file.resize(size)) { + this->callback(ecId, FileError::kNoModificationAllowedErr); + return; + } + + this->cb(scId, size); +} + +void File::getParent(int scId, int ecId, const QString &uri) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + QDir dir(f1.second.absoluteFilePath()); + + //can't cdup more than app's root + // Try to change into upper directory + if (dir != _persistentDir && dir != QDir::temp()){ + if (!dir.cdUp()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + } + this->cb(scId, dir2map(dir)); +} + +void File::remove(int scId, int ecId, const QString &uri) { + QPair f1 = resolveURI(ecId, uri); + if (!f1.first) + return; + + QFileInfo &fileInfo = f1.second; + //TODO: fix + if (!fileInfo.exists() || (fileInfo.absoluteFilePath() == _persistentDir.absolutePath()) || (QDir::temp() == fileInfo.absoluteFilePath())) { + this->callback(ecId, FileError::kNoModificationAllowedErr); + return; + } + + if (fileInfo.isDir()) { + QDir dir(fileInfo.absoluteFilePath()); + if (dir.rmdir(dir.absolutePath())) { + this->cb(scId); + return; + } + } else { + QFile file(fileInfo.absoluteFilePath()); + if (file.remove()) { + this->cb(scId); + return; + } + } + + this->callback(ecId, FileError::kInvalidModificationErr); +} + +void File::getFileMetadata(int scId, int ecId, const QString &uri) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + QFileInfo &fileInfo = f1.second; + + if (!fileInfo.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + } else { + QMimeType mime = _db.mimeTypeForFile(fileInfo.fileName()); + + QString args = QString("{name: %1, fullPath: %2, type: %3, lastModifiedDate: new Date(%4), size: %5}") + .arg(CordovaInternal::format(fileInfo.fileName())).arg(CordovaInternal::format(fileInfo.absoluteFilePath())) + .arg(CordovaInternal::format(mime.name())).arg(fileInfo.lastModified().toMSecsSinceEpoch()) + .arg(fileInfo.size()); + + this->callback(scId, args); + } +} + +void File::getMetadata(int scId, int ecId, const QString &uri) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + QFileInfo &fileInfo = f1.second; + + if (!fileInfo.exists()) + this->callback(ecId, FileError::kNotFoundErr); + else { + QVariantMap obj; + obj.insert("modificationTime", fileInfo.lastModified().toMSecsSinceEpoch()); + obj.insert("size", fileInfo.isDir() ? 0 : fileInfo.size()); + this->cb(scId, obj); + } +} + +void File::readEntries(int scId, int ecId, const QString &uri) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + QDir dir(f1.second.absoluteFilePath()); + QString entriesList; + + if (!dir.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + for (const QFileInfo &fileInfo: dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) { + entriesList += CordovaInternal::format(file2map(fileInfo)) + ","; + } + // Remove trailing comma + if (entriesList.size() > 0) + entriesList.remove(entriesList.size() - 1, 1); + + entriesList = "new Array(" + entriesList + ")"; + + this->callback(scId, entriesList); +} + +void File::readAsText(int scId, int ecId, const QString &uri, const QString &/*encoding*/, int sliceStart, int sliceEnd) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + QFile file(f1.second.absoluteFilePath()); + + if (!file.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + if (!file.open(QIODevice::ReadOnly)) { + this->callback(ecId, FileError::kNotReadableErr); + return; + } + + QByteArray content = file.readAll(); + + if (sliceEnd == -1) + sliceEnd = content.size(); + if (sliceEnd < 0) { + sliceEnd++; + sliceEnd = std::max(0, content.size() + sliceEnd); + } + if (sliceEnd > content.size()) + sliceEnd = content.size(); + + if (sliceStart < 0) + sliceStart = std::max(0, content.size() + sliceStart); + if (sliceStart > content.size()) + sliceStart = content.size(); + + if (sliceStart > sliceEnd) + sliceEnd = sliceStart; + + //FIXME: encoding + content = content.mid(sliceStart, sliceEnd - sliceStart); + + this->cb(scId, content); +} + +void File::readAsArrayBuffer(int scId, int ecId, const QString &uri, int sliceStart, int sliceEnd) { + const QString str2array("\ + (function strToArray(str) { \ + var res = new Uint8Array(str.length); \ + for (var i = 0; i < str.length; i++) { \ + res[i] = str.charCodeAt(i); \ + } \ + return res; \ + })(\"%1\")"); + + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + QFile file(f1.second.absoluteFilePath()); + + if (!file.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + if (!file.open(QIODevice::ReadOnly)) { + this->callback(ecId, FileError::kNotReadableErr); + return; + } + QString res; + QByteArray content = file.readAll(); + + if (sliceEnd == -1) + sliceEnd = content.size(); + if (sliceEnd < 0) { + sliceEnd++; + sliceEnd = std::max(0, content.size() + sliceEnd); + } + if (sliceEnd > content.size()) + sliceEnd = content.size(); + + if (sliceStart < 0) + sliceStart = std::max(0, content.size() + sliceStart); + if (sliceStart > content.size()) + sliceStart = content.size(); + + if (sliceStart > sliceEnd) + sliceEnd = sliceStart; + + content = content.mid(sliceStart, sliceEnd - sliceStart); + + res.reserve(content.length() * 6); + for (uchar c: content) { + res += "\\x"; + res += QString::number(c, 16).rightJustified(2, '0').toUpper(); + } + + this->callback(scId, str2array.arg(res)); +} + +void File::readAsBinaryString(int scId, int ecId, const QString &uri, int sliceStart, int sliceEnd) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + QFile file(f1.second.absoluteFilePath()); + + if (!file.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + if (!file.open(QIODevice::ReadOnly)) { + this->callback(ecId, FileError::kNotReadableErr); + return; + } + QString res; + QByteArray content = file.readAll(); + + if (sliceEnd == -1) + sliceEnd = content.size(); + if (sliceEnd < 0) { + sliceEnd++; + sliceEnd = std::max(0, content.size() + sliceEnd); + } + if (sliceEnd > content.size()) + sliceEnd = content.size(); + + if (sliceStart < 0) + sliceStart = std::max(0, content.size() + sliceStart); + if (sliceStart > content.size()) + sliceStart = content.size(); + + if (sliceStart > sliceEnd) + sliceEnd = sliceStart; + + content = content.mid(sliceStart, sliceEnd - sliceStart); + + res.reserve(content.length() * 6); + for (uchar c: content) { + res += "\\x"; + res += QString::number(c, 16).rightJustified(2, '0').toUpper(); + } + this->callback(scId, "\"" + res + "\""); +} + +void File::readAsDataURL(int scId, int ecId, const QString &uri, int sliceStart, int sliceEnd) { + QPair f1 = resolveURI(ecId, uri); + + if (!f1.first) + return; + + QFile file(f1.second.absoluteFilePath()); + QFileInfo &fileInfo = f1.second; + + if (!file.exists()) { + this->callback(ecId, FileError::kNotReadableErr); + return; + } + + if (!file.open(QIODevice::ReadOnly)) { + this->callback(ecId, FileError::kNotReadableErr); + return; + } + + QByteArray content = file.readAll(); + QString contentType(_db.mimeTypeForFile(fileInfo.fileName()).name()); + + if (sliceEnd == -1) + sliceEnd = content.size(); + if (sliceEnd < 0) { + sliceEnd++; + sliceEnd = std::max(0, content.size() + sliceEnd); + } + if (sliceEnd > content.size()) + sliceEnd = content.size(); + + if (sliceStart < 0) + sliceStart = std::max(0, content.size() + sliceStart); + if (sliceStart > content.size()) + sliceStart = content.size(); + + if (sliceStart > sliceEnd) + sliceEnd = sliceStart; + + content = content.mid(sliceStart, sliceEnd - sliceStart); + + this->cb(scId, QString("data:%1;base64,").arg(contentType) + content.toBase64()); +} + +bool File::rmDir(const QDir &dir) { + if (dir == _persistentDir || dir == QDir::temp()) {//can't remove root dir + return false; + } + bool result = true; + if (dir.exists()) { + // Iterate over entries and remove them + Q_FOREACH(const QFileInfo &fileInfo, dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) { + if (fileInfo.isDir()) { + result = rmDir(fileInfo.absoluteFilePath()); + } + else { + result = QFile::remove(fileInfo.absoluteFilePath()); + } + + if (!result) { + return result; + } + } + + // Finally remove the current dir + return dir.rmdir(dir.absolutePath()); + } + return result; +} + +bool File::copyFile(int scId, int ecId,const QString& sourceUri, const QString& destinationUri, const QString& newName) { + QPair destDir = resolveURI(ecId, destinationUri); + QPair sourceFile = resolveURI(ecId, sourceUri); + + if (!destDir.first || !sourceFile.first) + return false; + + if (!checkFileName(newName)) { + this->callback(ecId, FileError::kEncodingErr); + return false; + } + + if (destDir.second.isFile()) { + this->callback(ecId, FileError::kInvalidModificationErr); + return false; + } + + if (!destDir.second.isDir()) { + this->callback(ecId, FileError::kNotFoundErr); + return false; + } + + QFileInfo &fileInfo = sourceFile.second; + QString fileName((newName.isEmpty()) ? fileInfo.fileName() : newName); + QString destinationFile(QDir(destDir.second.absoluteFilePath()).filePath(fileName)); + if (QFile::copy(fileInfo.absoluteFilePath(), destinationFile)){ + this->cb(scId, file2map(QFileInfo(destinationFile))); + return true; + } + this->callback(ecId, FileError::kInvalidModificationErr); + return false; +} + +void File::copyDir(int scId, int ecId,const QString& sourceUri, const QString& destinationUri, const QString& newName) { + QPair destDir = resolveURI(ecId, destinationUri); + QPair sourceDir = resolveURI(ecId, sourceUri); + + if (!destDir.first || !sourceDir.first) + return; + if (!checkFileName(newName)) { + this->callback(ecId, FileError::kEncodingErr); + return; + } + + QString targetName = ((newName.isEmpty()) ? sourceDir.second.fileName() : newName); + QString target(QDir(destDir.second.absoluteFilePath()).filePath(targetName)); + + if (QFileInfo(target).isFile()){ + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + // check: copy directory into itself + if (QDir(sourceDir.second.absoluteFilePath()).relativeFilePath(target)[0] != '.'){ + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + if (!QDir(target).exists()){ + QDir(destDir.second.absoluteFilePath()).mkdir(target);; + } else{ + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + if (copyFolder(sourceDir.second.absoluteFilePath(), target)){ + this->cb(scId, dir2map(QDir(target))); + return; + } + this->callback(ecId, FileError::kInvalidModificationErr); + return; +} + +void File::copyTo(int scId, int ecId, const QString& source, const QString& destinationDir, const QString& newName) { + QPair f1 = resolveURI(ecId, source); + + if (!f1.first) + return; + + if (f1.second.isDir()) + copyDir(scId, ecId, source, destinationDir, newName); + else + copyFile(scId, ecId, source, destinationDir, newName); +} + +void File::moveFile(int scId, int ecId,const QString& sourceUri, const QString& destinationUri, const QString& newName) { + QPair sourceFile = resolveURI(ecId, sourceUri); + QPair destDir = resolveURI(ecId, destinationUri); + + if (!destDir.first || !sourceFile.first) + return; + if (!checkFileName(newName)) { + this->callback(ecId, FileError::kEncodingErr); + return; + } + + QString fileName = ((newName.isEmpty()) ? sourceFile.second.fileName() : newName); + QString target = QDir(destDir.second.absoluteFilePath()).filePath(fileName); + + if (sourceFile.second == QFileInfo(target)) { + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + if (!destDir.second.exists()) { + this->callback(ecId, FileError::kNotFoundErr); + return; + } + if (!destDir.second.isDir()){ + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + if (QFileInfo(target).exists()) { + if (!QFile::remove(target)) { + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + } + + QFile::rename(sourceFile.second.absoluteFilePath(), target); + this->cb(scId, file2map(QFileInfo(target))); +} + +void File::moveDir(int scId, int ecId,const QString& sourceUri, const QString& destinationUri, const QString& newName){ + QPair sourceDir = resolveURI(ecId, sourceUri); + QPair destDir = resolveURI(ecId, destinationUri); + + if (!destDir.first || !sourceDir.first) + return; + if (!checkFileName(newName)) { + this->callback(ecId, FileError::kEncodingErr); + return; + } + + QString fileName = ((newName.isEmpty()) ? sourceDir.second.fileName() : newName); + QString target = QDir(destDir.second.absoluteFilePath()).filePath(fileName); + + if (!destDir.second.exists()){ + this->callback(ecId, FileError::kNotFoundErr); + return; + } + + if (destDir.second.isFile()){ + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + // check: copy directory into itself + if (QDir(sourceDir.second.absoluteFilePath()).relativeFilePath(target)[0] != '.'){ + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + if (QFileInfo(target).exists() && !QDir(destDir.second.absoluteFilePath()).rmdir(fileName)) { + this->callback(ecId, FileError::kInvalidModificationErr); + return; + } + + if (copyFolder(sourceDir.second.absoluteFilePath(), target)) { + rmDir(sourceDir.second.absoluteFilePath()); + this->cb(scId, file2map(QFileInfo(target))); + } else { + this->callback(ecId, FileError::kNoModificationAllowedErr); + } +} + +void File::moveTo(int scId, int ecId, const QString& source, const QString& destinationDir, const QString& newName) { + QPair f1 = resolveURI(ecId, source); + + if (!f1.first) + return; + + if (f1.second.isDir()) + moveDir(scId, ecId, source, destinationDir, newName); + else + moveFile(scId, ecId, source, destinationDir, newName); +} + +bool File::copyFolder(const QString& sourceFolder, const QString& destFolder) { + QDir sourceDir(sourceFolder); + if (!sourceDir.exists()) + return false; + QDir destDir(destFolder); + if (!destDir.exists()){ + destDir.mkdir(destFolder); + } + QStringList files = sourceDir.entryList(QDir::Files); + for (int i = 0; i< files.count(); i++) + { + QString srcName = sourceFolder + "/" + files[i]; + QString destName = destFolder + "/" + files[i]; + QFile::copy(srcName, destName); + } + files.clear(); + files = sourceDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); + for (int i = 0; i< files.count(); i++) + { + QString srcName = sourceFolder + "/" + files[i]; + QString destName = destFolder + "/" + files[i]; + copyFolder(srcName, destName); + } + return true; +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-file/file.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-file/file.h new file mode 100644 index 0000000..de27762 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-file/file.h @@ -0,0 +1,81 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FILEAPI_H_SDASDASDAS +#define FILEAPI_H_SDASDASDAS + +#include +#include + +#include +#include + +class File: public CPlugin { + Q_OBJECT +public: + explicit File(Cordova *cordova); + + virtual const QString fullName() override { + return File::fullID(); + } + + virtual const QString shortName() override { + return "File"; + } + + static const QString fullID() { + return "File"; + } + QPair resolveURI(const QString &uri); + QPair resolveURI(int ecId, const QString &uri); + QVariantMap file2map(const QFileInfo &dir); + +public slots: + void requestFileSystem(int scId, int ecId, unsigned short type, unsigned long long size); + void resolveLocalFileSystemURI(int scId, int ecId, const QString&); + void getDirectory(int scId, int ecId, const QString&, const QString&, const QVariantMap&); + void getFile(int scId, int ecId, const QString &parentPath, const QString &rpath, const QVariantMap &options); + void readEntries(int scId, int ecId, const QString &uri); + void getParent(int scId, int ecId, const QString &uri); + void copyTo(int scId, int ecId, const QString& source, const QString& destinationDir, const QString& newName); + void moveTo(int scId, int ecId, const QString& source, const QString& destinationDir, const QString& newName); + void getFileMetadata(int scId, int ecId, const QString &); + void getMetadata(int scId, int ecId, const QString &); + void remove(int scId, int ecId, const QString &); + void removeRecursively(int scId, int ecId, const QString&); + void write(int scId, int ecId, const QString&, const QString&, unsigned long long position, bool binary); + void readAsText(int scId, int ecId, const QString&, const QString &encoding, int sliceStart, int sliceEnd); + void readAsDataURL(int scId, int ecId, const QString&, int sliceStart, int sliceEnd); + void readAsArrayBuffer(int scId, int ecId, const QString&, int sliceStart, int sliceEnd); + void readAsBinaryString(int scId, int ecId, const QString&, int sliceStart, int sliceEnd); + void truncate(int scId, int ecId, const QString&, unsigned long long size); + + void _getLocalFilesystemPath(int scId, int ecId, const QString&); +private: + void moveFile(int scId, int ecId,const QString&, const QString&, const QString&); + void moveDir(int scId, int ecId,const QString&, const QString&, const QString&); + bool copyFile(int scId, int ecId, const QString&, const QString&, const QString&); + void copyDir(int scId, int ecId, const QString&, const QString&, const QString&); + bool rmDir(const QDir &dir); + bool copyFolder(const QString&, const QString&); + + QPair GetRelativePath(const QFileInfo &fileInfo); + QVariantMap dir2map(const QDir &dir); + + QMimeDatabase _db; + const QDir _persistentDir; + QNetworkAccessManager _manager; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-geolocation/geolocation.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-geolocation/geolocation.cpp new file mode 100644 index 0000000..c820cfe --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-geolocation/geolocation.cpp @@ -0,0 +1,119 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include + +#include "geolocation.h" + +Geolocation::Geolocation(Cordova *cordova): CPlugin(cordova), + _geoPositionInfoSource(QGeoPositionInfoSource::createDefaultSource(this)) { + if (_geoPositionInfoSource.data() != 0) { + QObject::connect(_geoPositionInfoSource.data(), SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo))); + QObject::connect(_geoPositionInfoSource.data(), SIGNAL(updateTimeout()), this, SLOT(updateTimeout())); + } +} + +void Geolocation::addWatch(int scId, int ecId, const QString &id, bool enableHighAccuracy) { + Q_UNUSED(enableHighAccuracy); + + assert(_id2sc.find(id) == _id2sc.end()); + + if (!_geoPositionInfoSource.data()) { + QVariantMap err; + err.insert("code", POSITION_UNAVAILABLE); + err.insert("message", "unavailable"); + + this->cb(ecId, err); + return; + } + + _id2sc[id] = scId; + _id2ec[id] = ecId; +} + +void Geolocation::clearWatch(int scId, int ecId, const QString &id) { + _id2sc.remove(id); + _id2ec.remove(id); +} + +void Geolocation::getLocation(int scId, int ecId, bool enableHighAccuracy, qint64 maximumAge) { + Q_UNUSED(maximumAge); + Q_UNUSED(enableHighAccuracy); + + if (!_geoPositionInfoSource.data()) { + QVariantMap err; + err.insert("code", POSITION_UNAVAILABLE); + err.insert("message", "unavailable"); + + this->cb(ecId, err); + return; + } + + _geoPositionInfoSource->requestUpdate(); + + QString id = QString("_INTERNAL_") + QUuid::createUuid().toString(); + + _id2sc[id] = scId; + _id2ec[id] = ecId; + _singleUpdate.insert(id); +} + +void Geolocation::positionUpdated(const QGeoPositionInfo &update) { + QGeoCoordinate coordinate = update.coordinate(); + + QVariantMap p; + + p.insert("latitude", coordinate.latitude()); + p.insert("longitude", coordinate.longitude()); + p.insert("altitude", coordinate.altitude()); + + if (update.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) + p.insert("accuracy", update.attribute(QGeoPositionInfo::VerticalAccuracy)); + if (update.hasAttribute(QGeoPositionInfo::Direction)) + p.insert("heading", update.attribute(QGeoPositionInfo::Direction)); + if (update.hasAttribute(QGeoPositionInfo::GroundSpeed)) + p.insert("velocity", update.attribute(QGeoPositionInfo::GroundSpeed)); + if (update.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + p.insert("altitudeAccuracy", update.attribute(QGeoPositionInfo::HorizontalAccuracy)); + p.insert("timestamp", update.timestamp().toMSecsSinceEpoch()); + + for (const QString &id: _id2sc.keys()) { + int scId = _id2sc[id]; + this->cb(scId, p); + if (_singleUpdate.contains(id)) { + _singleUpdate.remove(id); + _id2sc.remove(id); + _id2ec.remove(id); + } + } +} + +void Geolocation::updateTimeout() { + QVariantMap err; + err.insert("code", TIMEOUT); + err.insert("message", "timeout"); + + for (int ecId: _id2ec) { + this->cb(ecId, err); + } + + _id2ec.clear(); + _id2sc.clear(); + _singleUpdate.clear(); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-geolocation/geolocation.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-geolocation/geolocation.h new file mode 100644 index 0000000..7345bec --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-geolocation/geolocation.h @@ -0,0 +1,69 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef GEOLOCATION_H_SVO2013 +#define GEOLOCATION_H_SVO2013 + +#include +#include +#include +#include + +#include + +class Geolocation: public CPlugin { + Q_OBJECT +public: + explicit Geolocation(Cordova *cordova); + + virtual const QString fullName() override { + return Geolocation::fullID(); + } + + virtual const QString shortName() override { + return "Geolocation"; + } + + static const QString fullID() { + return "Geolocation"; + } + +public slots: + void getLocation(int scId, int ecId, bool enableHighAccuracy, qint64 maximumAge); + void addWatch(int scId, int ecId, const QString &id, bool enableHighAccuracy); + void clearWatch(int scId, int ecId, const QString &id); + +protected slots: + void positionUpdated(const QGeoPositionInfo &update); + void updateTimeout(); + +private: + QMap _id2sc; + QMap _id2ec; + QSet _singleUpdate; + QSharedPointer _geoPositionInfoSource; + + enum PositionError { + PERMISSION_DENIED = 1, + POSITION_UNAVAILABLE = 2, + TIMEOUT = 3 + }; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-media-capture/capture.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-media-capture/capture.cpp new file mode 100644 index 0000000..aaf0910 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-media-capture/capture.cpp @@ -0,0 +1,161 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ +#include "capture.h" + +const char code[] = "\ +var component, object; \ +function createObject() { \ + component = Qt.createComponent(%1); \ + if (component.status == Component.Ready) \ + finishCreation(); \ + else \ + component.statusChanged.connect(finishCreation); \ +} \ +function finishCreation() { \ + CordovaWrapper.global.captureObject = component.createObject(root, \ + {root: root, cordova: cordova, state: \"%2\"}); \ +} \ +createObject()"; + +static QString formatFile(const QMimeDatabase &db, const QString &path) { + QFileInfo info(path); + QMimeType mime = db.mimeTypeForFile(info.fileName()); + + QVariantMap file; + file.insert("name", info.fileName()); + file.insert("fullPath", info.absoluteFilePath()); + file.insert("lastModifiedDate", info.lastModified().toMSecsSinceEpoch()); + file.insert("size", info.size()); + file.insert("type", mime.name()); + + return CordovaInternal::format(file); +} + +MediaCapture::MediaCapture(Cordova *cordova): CPlugin(cordova), _scId(0), _ecId(0) { +} + +void MediaCapture::captureAudio(int scId, int ecId, const QVariantMap &) { + if (_scId || _ecId) { + this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_APPLICATION_BUSY)); + return; + } + + QString path = m_cordova->get_app_dir() + "/../qml/MediaCaptureWidget.qml"; + + QString qml = QString(code).arg(CordovaInternal::format(path)).arg("audio"); + m_cordova->execQML(qml); + + _scId = scId; + _ecId = ecId; +} + +void MediaCapture::onAudioRecordError(QMediaRecorder::Error) { + if (!_ecId) + return; + this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_INTERNAL_ERR)); + _ecId = _scId = 0; + + _recorder.clear(); + _files.clear(); + + m_cordova->execQML("CordovaWrapper.global.captureObject.destroy()"); +} + +void MediaCapture::recordAudio() { + if (_recorder.data()) { + QUrl url = _recorder->outputLocation(); + + QString path = url.toString(); + _recorder->stop(); + + _recorder.clear(); + + this->callback(_scId, QString("[%1]").arg(formatFile(_db, path))); + _ecId = _scId = 0; + + m_cordova->execQML("CordovaWrapper.global.captureObject.destroy()"); + } else { + _recorder = QSharedPointer(new QAudioRecorder); + QObject::connect(_recorder.data(), SIGNAL(error(QMediaRecorder::Error)), this, SLOT(onAudioRecordError(QMediaRecorder::Error))); + + if (_options.find("mode")->toString() == "audio/amr") { + _recorder->setContainerFormat("amr"); + _recorder->setOutputLocation(generateLocation("amr")); + } else { + _recorder->setContainerFormat("wav"); + _recorder->setOutputLocation(generateLocation("wav")); + } + _recorder->record(); + } +} + +void MediaCapture::cancel() { + if (!_ecId) + return; + + m_cordova->execQML("CordovaWrapper.global.captureObject.destroy()"); + + _recorder.clear(); + this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_NO_MEDIA_FILES)); + _ecId = _scId = 0; + + _recorder.clear(); +} + +void MediaCapture::captureVideo(int scId, int ecId, const QVariantMap &) { + if (_scId || _ecId) { + this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_APPLICATION_BUSY)); + return; + } + + QString path = m_cordova->get_app_dir() + "/../qml/MediaCaptureWidget.qml"; + QString qml = QString(code).arg(CordovaInternal::format(path)).arg("videoRecording"); + m_cordova->execQML(qml); + + _scId = scId; + _ecId = ecId; +} + +void MediaCapture::onVideoRecordEnd(const QString &uri) { + QString path = QUrl::fromUserInput(uri).path(); + + this->callback(_scId, QString("[%1]").arg(formatFile(_db, path))); + _ecId = _scId = 0; + + m_cordova->execQML("CordovaWrapper.global.captureObject.destroy()"); +} + +void MediaCapture::captureImage(int scId, int ecId, const QVariantMap &) { + if (_scId || _ecId) { + this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_APPLICATION_BUSY)); + return; + } + + QString path = m_cordova->get_app_dir() + "/../qml/MediaCaptureWidget.qml"; + QString qml = QString(code).arg(CordovaInternal::format(path)).arg("camera"); + m_cordova->execQML(qml); + + _scId = scId; + _ecId = ecId; +} + +void MediaCapture::onImageSaved(const QString &path) { + this->callback(_scId, QString("[%1]").arg(formatFile(_db, path))); + _ecId = _scId = 0; +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-media-capture/capture.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-media-capture/capture.h new file mode 100644 index 0000000..4806771 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-media-capture/capture.h @@ -0,0 +1,84 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ +#ifndef CAPTURE_H_ASCXZFG975 +#define CAPTURE_H_ASCXZFG975 + +#include +#include +#include +#include +#include + +class MediaCapture: public CPlugin { + Q_OBJECT +public: + explicit MediaCapture(Cordova *cordova); + + virtual const QString fullName() override { + return MediaCapture::fullID(); + } + + virtual const QString shortName() override { + return "Capture"; + } + + static const QString fullID() { + return "Capture"; + } + +public slots: + void captureAudio(int scId, int ecId, const QVariantMap &); + void captureImage(int scId, int ecId, const QVariantMap &); + void captureVideo(int scId, int ecId, const QVariantMap &); + + void recordAudio(); + void cancel(); + void onVideoRecordEnd(const QString &uri); + void onImageSaved(const QString &path); + + QString generateLocation(const QString &extension) { + int i = 1; + for (;;++i) { + QString path = QString("%1/.local/share/%2/persistent/%3.%4").arg(QDir::homePath()) + .arg(QCoreApplication::applicationName()).arg(i).arg(extension); + + if (!QFileInfo(path).exists()) + return path; + } + } +private slots: + void onAudioRecordError(QMediaRecorder::Error); +private: + QSharedPointer _recorder; + + int _scId, _ecId; + QList _files; + QVariantMap _options; + QMimeDatabase _db; + + enum CaptureError { + CAPTURE_INTERNAL_ERR = 0, + CAPTURE_APPLICATION_BUSY = 1, + CAPTURE_INVALID_ARGUMENT = 2, + CAPTURE_NO_MEDIA_FILES = 3, + CAPTURE_NOT_SUPPORTED = 20 + }; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-media/media.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-media/media.cpp new file mode 100644 index 0000000..2814b5b --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-media/media.cpp @@ -0,0 +1,128 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include "media.h" + +void Media::create(int scId, int ecId, const QString &id, const QString &src) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + + if (_id2Player.find(id) != _id2Player.end()) { + _id2Player[id]->stop(); + _id2Player.remove(id); + } + + _id2Player[id] = QSharedPointer(new Player(id, src, this)); +} + +void Media::relase(int scId, int ecId, const QString &id) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + + if (_id2Player.find(id) == _id2Player.end()) + return; + _id2Player.remove(id); +} + +void Media::startPlayingAudio(int scId, int ecId, const QString &id, const QString &src, QVariantMap options) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + Q_UNUSED(src); + Q_UNUSED(options); + + if (_id2Player.find(id) == _id2Player.end()) + return; + QSharedPointer player = _id2Player[id]; + player->play(); +} + +void Media::pausePlayingAudio(int scId, int ecId, const QString &id) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + + if (_id2Player.find(id) == _id2Player.end()) + return; + QSharedPointer player = _id2Player[id]; + player->pause(); +} + +void Media::stopPlayingAudio(int scId, int ecId, const QString &id) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + + if (_id2Player.find(id) == _id2Player.end()) + return; + QSharedPointer player = _id2Player[id]; + player->stop(); +} + +void Media::startRecordingAudio(int scId, int ecId, const QString &id, const QString &src) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + Q_UNUSED(src); + + if (_id2Player.find(id) == _id2Player.end()) + return; + QSharedPointer player = _id2Player[id]; + player->startRecording(); +} + +void Media::stopRecordingAudio(int scId, int ecId, const QString &id) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + + if (_id2Player.find(id) == _id2Player.end()) + return; + QSharedPointer player = _id2Player[id]; + player->stopRecording(); +} + +void Media::getCurrentPositionAudio(int scId, int ecId, const QString &id) { + Q_UNUSED(ecId); + + if (_id2Player.find(id) == _id2Player.end()) + return; + + QSharedPointer player = _id2Player[id]; + double position = player->getPosition(); + this->cb(scId, position); +} + +void Media::seekToAudio(int scId, int ecId, const QString &id, qint64 position) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + + if (_id2Player.find(id) == _id2Player.end()) + return; + + QSharedPointer player = _id2Player[id]; + player->seekTo(position); +} + +void Media::setVolume(int scId, int ecId, const QString &id, int volume) { + Q_UNUSED(scId); + Q_UNUSED(ecId); + + if (_id2Player.find(id) == _id2Player.end()) + return; + QSharedPointer player = _id2Player[id]; + player->setVolume(volume); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-media/media.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-media/media.h new file mode 100644 index 0000000..c1f3712 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-media/media.h @@ -0,0 +1,267 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef MEDIA_H_789768978 +#define MEDIA_H_789768978 + +#include +#include +#include +#include + +#include +#include + +class Player; + +class Media: public CPlugin { + Q_OBJECT +public: + explicit Media(Cordova *cordova): CPlugin(cordova) { + } + + virtual const QString fullName() override { + return Media::fullID(); + } + + virtual const QString shortName() override { + return "Media"; + } + + static const QString fullID() { + return "Media"; + } + + enum State { + MEDIA_NONE = 0, + MEDIA_STARTING = 1, + MEDIA_RUNNING = 2, + MEDIA_PAUSED = 3, + MEDIA_STOPPED = 4 + }; + enum ErrorCode { + MEDIA_ERR_NONE_ACTIVE = 0, + MEDIA_ERR_ABORTED = 1, + MEDIA_ERR_NETWORK = 2, + MEDIA_ERR_DECODE = 3, + MEDIA_ERR_NONE_SUPPORTED = 4 + }; + + void execJS(const QString &js) { + m_cordova->execJS(js); + } +public slots: + void create(int scId, int ecId, const QString &id, const QString &src); + void relase(int scId, int ecId, const QString &id); + + void startRecordingAudio(int scId, int ecId, const QString &id, const QString &src); + void stopRecordingAudio(int scId, int ecId, const QString &id); + + void startPlayingAudio(int scId, int ecId, const QString &id, const QString &src, QVariantMap options); + void pausePlayingAudio(int scId, int ecId, const QString &id); + void stopPlayingAudio(int scId, int ecId, const QString &id); + void getCurrentPositionAudio(int scId, int ecId, const QString &id); + void seekToAudio(int scId, int ecId, const QString &id, qint64 position); + void setVolume(int scId, int ecId, const QString &id, int volume); + +private: + QMap > _id2Player; +}; + +class Player: public QObject { + Q_OBJECT +public: + Player(const QString &id, QString src, Media *plugin): + _state(Media::MEDIA_NONE), + _src(src), + _mode(MODE_NONE), + _plugin(plugin), + _id(id), + _stateChanged(false) { + QUrl url(src, QUrl::TolerantMode); + + if (url.scheme().isEmpty()) { + QAudioEncoderSettings audioSettings; + + _recorder.setEncodingSettings(audioSettings); + _recorder.setOutputLocation(QFileInfo(src).absoluteFilePath()); + + _player.setMedia(QUrl::fromLocalFile(QFileInfo(src).absoluteFilePath())); + } else { + _player.setMedia(url); + } + QObject::connect(&_player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(onMediaStatusChanged(QMediaPlayer::MediaStatus))); + QObject::connect(&_recorder, SIGNAL(error(QMediaRecorder::Error)), this, SLOT(onError(QMediaRecorder::Error))); + + connect(&_timer, SIGNAL(timeout()), this, SLOT(reportPosition())); + } + + void startRecording() { + if (recordMode() && _state != Media::MEDIA_RUNNING) { + _recorder.record(); + setState(Media::MEDIA_RUNNING); + } + } + void stopRecording() { + if (recordMode() && _state == Media::MEDIA_RUNNING) { + _recorder.stop(); + setState(Media::MEDIA_STOPPED); + } + } + + void setVolume(int volume) { + _player.setVolume(volume); + } + + void play() { + if (playMode() && _state != Media::MEDIA_RUNNING) { + _player.play(); + setState(Media::MEDIA_RUNNING); + } + } + void pause() { + if (playMode() && _state == Media::MEDIA_RUNNING) { + _player.pause(); + setState(Media::MEDIA_PAUSED); + } + } + void stop() { + if (playMode() && (_state == Media::MEDIA_RUNNING || _state == Media::MEDIA_PAUSED)) { + _player.stop(); + setState(Media::MEDIA_STOPPED); + } + } + double getDuration() { + if (_mode == MODE_NONE || _player.duration() == -1) + return -1; + if (_mode != MODE_PLAY) + return -2; + return static_cast(_player.duration()) / 1000.0; + } + double getPosition() { + if (_mode != MODE_PLAY) + return -1; + return static_cast(_player.position()) / 1000.0; + } + bool seekTo(qint64 position) { + if (!_player.isSeekable()) + return false; + _player.setPosition(position * 1000); + return true; + } +private slots: + void reportPosition() { + double position = getPosition(); + _plugin->execJS(QString("Media.onStatus('%1', Media.MEDIA_POSITION, %2)") + .arg(_id).arg(position)); + double duration = getDuration(); + _plugin->execJS(QString("Media.onStatus('%1', Media.MEDIA_DURATION, %2)") + .arg(_id).arg(duration)); + + if (_stateChanged && !(_state == Media::MEDIA_RUNNING && (duration == -1 || position == 0))) { + qCritical() << _id << "POSITION" << position << ":" << duration; + _stateChanged = false; + _plugin->execJS(QString("Media.onStatus('%1', Media.MEDIA_STATE, %2)").arg(_id).arg(_state)); + } + } + + void onMediaStatusChanged(QMediaPlayer::MediaStatus status) { + if (status == QMediaPlayer::InvalidMedia) { + reportError(Media::MEDIA_ERR_ABORTED, "AudioPlayer Error: The current media cannot be played."); + setState(Media::MEDIA_STOPPED); + } + if (status == QMediaPlayer::EndOfMedia) { + setState(Media::MEDIA_STOPPED); + seekTo(0); + } + } + void onError(QMediaRecorder::Error) { + reportError(Media::MEDIA_ERR_NONE_SUPPORTED, "AudioPlayer Error: Device is not ready or not available."); + setState(Media::MEDIA_STOPPED); + } + +private: + void reportError(int code, const QString &descr) { + Q_UNUSED(descr); + _plugin->execJS(QString("Media.onStatus('%1', Media.MEDIA_ERROR, {code: %2})") + .arg(_id).arg(code)); + } + + bool playMode() { + switch (_mode) { + case Player::MODE_NONE: + _mode = MODE_PLAY; + break; + case Player::MODE_PLAY: + break; + case Player::MODE_RECORD: + reportError(Media::MEDIA_ERR_NONE_SUPPORTED, "AudioPlayer Error: Can't play in record mode."); + return false; + break; + } + return true; + } + + bool recordMode() { + switch (_mode) { + case Player::MODE_NONE: + if (_recorder.outputLocation().isEmpty()) { + reportError(Media::MEDIA_ERR_NONE_SUPPORTED, "AudioPlayer Error: unsupported output location."); + return false; + } + _mode = MODE_RECORD; + break; + case Player::MODE_PLAY: + reportError(Media::MEDIA_ERR_NONE_SUPPORTED, "AudioPlayer Error: Can't play in play mode."); + return false; + break; + case Player::MODE_RECORD: + break; + } + return true; + } + + void setState(Media::State state) { + _state = state; + _stateChanged = true; + _timer.start(250); + } + + QMediaPlayer _player; + + QAudioRecorder _recorder; + QTimer _timer; + + Media::State _state; + QString _src; + enum Mode { + MODE_NONE, + MODE_PLAY, + MODE_RECORD + }; + Mode _mode; + Media *_plugin; + QString _id; + + bool _stateChanged; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-network-information/network_information.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-network-information/network_information.cpp new file mode 100644 index 0000000..8fdb494 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-network-information/network_information.cpp @@ -0,0 +1,63 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "network_information.h" + +void NetworkInformation::getConnectionInfo(int scId, int ecId) { + Q_UNUSED(ecId); + + QString result; + QNetworkInfo::NetworkMode networkMode = m_systemNetworkInfo.currentNetworkMode(); + QNetworkInfo::NetworkStatus networkStatus = m_systemNetworkInfo.networkStatus(networkMode, 0); + QNetworkInfo::CellDataTechnology cellDataTechnology = m_systemNetworkInfo.currentCellDataTechnology(0); + + if (networkStatus == QNetworkInfo::NoNetworkAvailable) + result = "Connection.NONE"; + + switch (networkMode) { + case QNetworkInfo::WimaxMode: + case QNetworkInfo::WlanMode: + result = "Connection.WIFI"; + break; + case QNetworkInfo::EthernetMode: + result = "Connection.ETHERNET"; + break; + case QNetworkInfo::LteMode: + result = "Connection.CELL_4G"; + break; + case QNetworkInfo::GsmMode: + case QNetworkInfo::CdmaMode: + case QNetworkInfo::TdscdmaMode: + case QNetworkInfo::WcdmaMode: + switch (cellDataTechnology) { + case QNetworkInfo::UmtsDataTechnology: + case QNetworkInfo::HspaDataTechnology: + result = "Connection.CELL_3G"; + break; + case QNetworkInfo::EdgeDataTechnology: + case QNetworkInfo::GprsDataTechnology: + result = "Connection.CELL_2G"; + break; + case QNetworkInfo::UnknownDataTechnology: + result = "Connection.UNKNOWN"; + break; + } + case QNetworkInfo::BluetoothMode: + case QNetworkInfo::UnknownMode: + result = "Connection.UNKNOWN"; + break; + } + + this->callback(scId, result); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-network-information/network_information.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-network-information/network_information.h new file mode 100644 index 0000000..aca20e7 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-network-information/network_information.h @@ -0,0 +1,47 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NETWORK_INFORMATION_H +#define NETWORK_INFORMATION_H + +#include + +#include +#include + +class NetworkInformation: public CPlugin { + Q_OBJECT +public: + explicit NetworkInformation(Cordova *cordova): CPlugin(cordova) {} + + virtual const QString fullName() override { + return NetworkInformation::fullID(); + } + + virtual const QString shortName() override { + return "Connection"; + } + + static const QString fullID() { + return "NetworkStatus"; + } + +public slots: + void getConnectionInfo(int scId, int ecId); + +private: + QNetworkInfo m_systemNetworkInfo; +}; + +#endif diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-vibration/vibration.cpp b/platforms/ubuntu/build/src/plugins/cordova-plugin-vibration/vibration.cpp new file mode 100644 index 0000000..45c5a83 --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-vibration/vibration.cpp @@ -0,0 +1,64 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include "vibration.h" + +void Vibration::vibrate(int, int, int mills) { + QSharedPointer vibrate = QSharedPointer::create(); + vibrate->setIntensity(1.0); + vibrate->setDuration(mills); + + vibrate->start(); + + _effects.append(vibrate); +} + +void Vibration::cancelVibration(int, int) { + _timers.clear(); + _effects.clear(); +} + +void Vibration::vibrateWithPattern(int, int, const QList &pattern, int repeat) { + QSharedPointer timer = QSharedPointer::create(); + QSharedPointer k = QSharedPointer::create(); + + QSharedPointer vibrate = QSharedPointer::create(); + vibrate->setIntensity(1.0); + + _effects.append(vibrate); + _timers.append(timer); + + timer->connect(timer.data(), &QTimer::timeout, [=, timer = timer.data()] () { + if (*k >= pattern.size()) { + if (repeat < 0 || repeat >= pattern.size()) { + timer->stop(); + return; + } + *k = repeat; + } + bool idle = (*k % 2 == 0); + if (!idle) { + vibrate->setDuration(pattern[*k]); + vibrate->start(); + } + timer->start(pattern[*k]); + (*k)++; + }); + timer->start(1); +} diff --git a/platforms/ubuntu/build/src/plugins/cordova-plugin-vibration/vibration.h b/platforms/ubuntu/build/src/plugins/cordova-plugin-vibration/vibration.h new file mode 100644 index 0000000..741b45f --- /dev/null +++ b/platforms/ubuntu/build/src/plugins/cordova-plugin-vibration/vibration.h @@ -0,0 +1,54 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef _VIBRATION_H_SFAFKNVX3456 +#define _VIBRATION_H_SFAFKNVX3456 + +#include +#include +#include + +class Vibration: public CPlugin { + Q_OBJECT +public: + explicit Vibration(Cordova *cordova): CPlugin(cordova) { + } + + virtual const QString fullName() override { + return Vibration::fullID(); + } + + virtual const QString shortName() override { + return "Vibration"; + } + + static const QString fullID() { + return "Vibration"; + } +public slots: + void vibrate(int, int, int mills); + void cancelVibration(int, int); + void vibrateWithPattern(int, int, const QList &pattern, int); + +private: + QList> _effects; + QList> _timers; +}; + +#endif diff --git a/platforms/ubuntu/config.xml b/platforms/ubuntu/config.xml index bd858d0..8daad44 100644 --- a/platforms/ubuntu/config.xml +++ b/platforms/ubuntu/config.xml @@ -1,6 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + Snipe IT Mobile A sample Apache Cordova application that responds to the deviceready event. diff --git a/platforms/ubuntu/cordova.desktop b/platforms/ubuntu/cordova.desktop index 00317fc..66c7f02 100644 --- a/platforms/ubuntu/cordova.desktop +++ b/platforms/ubuntu/cordova.desktop @@ -1,7 +1,7 @@ [Desktop Entry] -Name=Hello Cordova +Name=Snipe IT Mobile Exec=./cordova-ubuntu www/ Terminal=false Type=Application X-Ubuntu-Touch=true -Icon=qmlscene \ No newline at end of file +Icon=www/img/logo.png \ No newline at end of file diff --git a/platforms/ubuntu/manifest.json b/platforms/ubuntu/manifest.json index b0aa238..87e4311 100644 --- a/platforms/ubuntu/manifest.json +++ b/platforms/ubuntu/manifest.json @@ -1 +1 @@ -{"name":"io.cordova.helloCordova","version":"2.0.0","title":"Hello Cordova","hooks":{"cordova":{"desktop":"cordova.desktop","apparmor":"apparmor.json"}},"framework":"ubuntu-sdk-13.10","maintainer":"Apache Cordova Team ","architecture":"amd64","description":"A sample Apache Cordova application that responds to the deviceready event."} \ No newline at end of file +{"name":"com.netsyms.SnipeITMobile","version":"1.0.0","title":"Snipe IT Mobile","hooks":{"cordova":{"desktop":"cordova.desktop","apparmor":"apparmor.json"}},"framework":"ubuntu-sdk-13.10","maintainer":"Apache Cordova Team ","architecture":"amd64","description":"A sample Apache Cordova application that responds to the deviceready event."} \ No newline at end of file diff --git a/platforms/ubuntu/platform_www/cordova_plugins.js b/platforms/ubuntu/platform_www/cordova_plugins.js new file mode 100644 index 0000000..0b59c4d --- /dev/null +++ b/platforms/ubuntu/platform_www/cordova_plugins.js @@ -0,0 +1,547 @@ +cordova.define('cordova/plugin_list', function(require, exports, module) { +module.exports = [ + { + "file": "plugins/cordova-plugin-dialogs/www/notification.js", + "id": "cordova-plugin-dialogs.notification", + "pluginId": "cordova-plugin-dialogs", + "merges": [ + "navigator.notification" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js", + "id": "cordova-plugin-file.DirectoryEntry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.DirectoryEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryReader.js", + "id": "cordova-plugin-file.DirectoryReader", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.DirectoryReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Entry.js", + "id": "cordova-plugin-file.Entry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Entry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/File.js", + "id": "cordova-plugin-file.File", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.File" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileEntry.js", + "id": "cordova-plugin-file.FileEntry", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileError.js", + "id": "cordova-plugin-file.FileError", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileError" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileReader.js", + "id": "cordova-plugin-file.FileReader", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileSystem.js", + "id": "cordova-plugin-file.FileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js", + "id": "cordova-plugin-file.FileUploadOptions", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileUploadOptions" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadResult.js", + "id": "cordova-plugin-file.FileUploadResult", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileUploadResult" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileWriter.js", + "id": "cordova-plugin-file.FileWriter", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Flags.js", + "id": "cordova-plugin-file.Flags", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Flags" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js", + "id": "cordova-plugin-file.LocalFileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.LocalFileSystem" + ], + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Metadata.js", + "id": "cordova-plugin-file.Metadata", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.Metadata" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ProgressEvent.js", + "id": "cordova-plugin-file.ProgressEvent", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.ProgressEvent" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems.js", + "id": "cordova-plugin-file.fileSystems", + "pluginId": "cordova-plugin-file" + }, + { + "file": "plugins/cordova-plugin-file/www/requestFileSystem.js", + "id": "cordova-plugin-file.requestFileSystem", + "pluginId": "cordova-plugin-file", + "clobbers": [ + "window.requestFileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js", + "id": "cordova-plugin-file.resolveLocalFileSystemURI", + "pluginId": "cordova-plugin-file", + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/browser/isChrome.js", + "id": "cordova-plugin-file.isChrome", + "pluginId": "cordova-plugin-file", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/ubuntu/FileSystem.js", + "id": "cordova-plugin-file.ubuntuFileSystem1", + "pluginId": "cordova-plugin-file", + "merges": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ubuntu/FileWriter.js", + "id": "cordova-plugin-file.FileWriter1", + "pluginId": "cordova-plugin-file", + "merges": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ubuntu/fileSystems-roots.js", + "id": "cordova-plugin-file.fileSystems-roots", + "pluginId": "cordova-plugin-file", + "runs": true + }, + { + "file": "plugins/cordova-plugin-media/www/MediaError.js", + "id": "cordova-plugin-media.MediaError", + "pluginId": "cordova-plugin-media", + "clobbers": [ + "window.MediaError" + ] + }, + { + "file": "plugins/cordova-plugin-media/www/Media.js", + "id": "cordova-plugin-media.Media", + "pluginId": "cordova-plugin-media", + "clobbers": [ + "window.Media" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransferError.js", + "id": "cordova-plugin-file-transfer.FileTransferError", + "pluginId": "cordova-plugin-file-transfer", + "clobbers": [ + "window.FileTransferError" + ] + }, + { + "file": "plugins/cordova-plugin-file-transfer/www/FileTransfer.js", + "id": "cordova-plugin-file-transfer.FileTransfer", + "pluginId": "cordova-plugin-file-transfer", + "clobbers": [ + "window.FileTransfer" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js", + "id": "cordova-plugin-media-capture.CaptureAudioOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureAudioOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js", + "id": "cordova-plugin-media-capture.CaptureImageOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureImageOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js", + "id": "cordova-plugin-media-capture.CaptureVideoOptions", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureVideoOptions" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/CaptureError.js", + "id": "cordova-plugin-media-capture.CaptureError", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "CaptureError" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFileData.js", + "id": "cordova-plugin-media-capture.MediaFileData", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "MediaFileData" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/MediaFile.js", + "id": "cordova-plugin-media-capture.MediaFile", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "MediaFile" + ] + }, + { + "file": "plugins/cordova-plugin-media-capture/www/helpers.js", + "id": "cordova-plugin-media-capture.helpers", + "pluginId": "cordova-plugin-media-capture", + "runs": true + }, + { + "file": "plugins/cordova-plugin-media-capture/www/capture.js", + "id": "cordova-plugin-media-capture.capture", + "pluginId": "cordova-plugin-media-capture", + "clobbers": [ + "navigator.device.capture" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassError.js", + "id": "cordova-plugin-device-orientation.CompassError", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "CompassError" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/CompassHeading.js", + "id": "cordova-plugin-device-orientation.CompassHeading", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "CompassHeading" + ] + }, + { + "file": "plugins/cordova-plugin-device-orientation/www/compass.js", + "id": "cordova-plugin-device-orientation.compass", + "pluginId": "cordova-plugin-device-orientation", + "clobbers": [ + "navigator.compass" + ] + }, + { + "file": "plugins/cordova-plugin-device/www/device.js", + "id": "cordova-plugin-device.device", + "pluginId": "cordova-plugin-device", + "clobbers": [ + "device" + ] + }, + { + "file": "plugins/cordova-plugin-device/src/ubuntu/device.js", + "id": "cordova-plugin-device.DeviceProxy", + "pluginId": "cordova-plugin-device", + "merges": [ + "device" + ] + }, + { + "file": "plugins/cordova-plugin-battery-status/www/battery.js", + "id": "cordova-plugin-battery-status.battery", + "pluginId": "cordova-plugin-battery-status", + "clobbers": [ + "navigator.battery" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraConstants.js", + "id": "cordova-plugin-camera.Camera", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "Camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverOptions.js", + "id": "cordova-plugin-camera.CameraPopoverOptions", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "CameraPopoverOptions" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/Camera.js", + "id": "cordova-plugin-camera.camera", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "navigator.camera" + ] + }, + { + "file": "plugins/cordova-plugin-camera/www/CameraPopoverHandle.js", + "id": "cordova-plugin-camera.CameraPopoverHandle", + "pluginId": "cordova-plugin-camera", + "clobbers": [ + "CameraPopoverHandle" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/contacts.js", + "id": "cordova-plugin-contacts.contacts", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "navigator.contacts" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/Contact.js", + "id": "cordova-plugin-contacts.Contact", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "Contact" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/convertUtils.js", + "id": "cordova-plugin-contacts.convertUtils", + "pluginId": "cordova-plugin-contacts" + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactAddress.js", + "id": "cordova-plugin-contacts.ContactAddress", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactAddress" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactError.js", + "id": "cordova-plugin-contacts.ContactError", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactError" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactField.js", + "id": "cordova-plugin-contacts.ContactField", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactField" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFindOptions.js", + "id": "cordova-plugin-contacts.ContactFindOptions", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactFindOptions" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactName.js", + "id": "cordova-plugin-contacts.ContactName", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactName" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactOrganization.js", + "id": "cordova-plugin-contacts.ContactOrganization", + "pluginId": "cordova-plugin-contacts", + "clobbers": [ + "ContactOrganization" + ] + }, + { + "file": "plugins/cordova-plugin-contacts/www/ContactFieldType.js", + "id": "cordova-plugin-contacts.ContactFieldType", + "pluginId": "cordova-plugin-contacts", + "merges": [ + "" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/Acceleration.js", + "id": "cordova-plugin-device-motion.Acceleration", + "pluginId": "cordova-plugin-device-motion", + "clobbers": [ + "Acceleration" + ] + }, + { + "file": "plugins/cordova-plugin-device-motion/www/accelerometer.js", + "id": "cordova-plugin-device-motion.accelerometer", + "pluginId": "cordova-plugin-device-motion", + "clobbers": [ + "navigator.accelerometer" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/Coordinates.js", + "id": "cordova-plugin-geolocation.Coordinates", + "pluginId": "cordova-plugin-geolocation", + "clobbers": [ + "Coordinates" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/PositionError.js", + "id": "cordova-plugin-geolocation.PositionError", + "pluginId": "cordova-plugin-geolocation", + "clobbers": [ + "PositionError" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/Position.js", + "id": "cordova-plugin-geolocation.Position", + "pluginId": "cordova-plugin-geolocation", + "clobbers": [ + "Position" + ] + }, + { + "file": "plugins/cordova-plugin-geolocation/www/geolocation.js", + "id": "cordova-plugin-geolocation.geolocation", + "pluginId": "cordova-plugin-geolocation", + "clobbers": [ + "navigator.geolocation" + ] + }, + { + "file": "plugins/cordova-plugin-vibration/www/vibration.js", + "id": "cordova-plugin-vibration.notification", + "pluginId": "cordova-plugin-vibration", + "merges": [ + "navigator.notification", + "navigator" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/network.js", + "id": "cordova-plugin-network-information.network", + "pluginId": "cordova-plugin-network-information", + "clobbers": [ + "navigator.connection", + "navigator.network.connection" + ] + }, + { + "file": "plugins/cordova-plugin-network-information/www/Connection.js", + "id": "cordova-plugin-network-information.Connection", + "pluginId": "cordova-plugin-network-information", + "clobbers": [ + "Connection" + ] + }, + { + "file": "plugins/cordova-plugin-console/www/console-via-logger.js", + "id": "cordova-plugin-console.console", + "pluginId": "cordova-plugin-console", + "clobbers": [ + "console" + ] + }, + { + "file": "plugins/cordova-plugin-console/www/logger.js", + "id": "cordova-plugin-console.logger", + "pluginId": "cordova-plugin-console", + "clobbers": [ + "cordova.logger" + ] + } +]; +module.exports.metadata = +// TOP OF METADATA +{ + "cordova-plugin-dialogs": "1.2.2-dev", + "cordova-plugin-compat": "1.0.0", + "cordova-plugin-file": "4.2.0", + "cordova-plugin-media": "2.3.1-dev", + "cordova-plugin-file-transfer": "1.5.2-dev", + "cordova-plugin-media-capture": "1.3.1-dev", + "cordova-plugin-device-orientation": "1.0.4-dev", + "cordova-plugin-device": "1.1.3-dev", + "cordova-plugin-battery-status": "1.1.3-dev", + "cordova-plugin-camera": "2.2.1-dev", + "cordova-plugin-contacts": "2.1.1-dev", + "cordova-plugin-device-motion": "1.2.2-dev", + "cordova-plugin-geolocation": "2.2.1-dev", + "cordova-plugin-vibration": "2.1.2-dev", + "cordova-plugin-network-information": "1.2.2-dev", + "cordova-plugin-console": "1.0.4-dev", + "cordova-plugin-whitelist": "1.2.2" +} +// BOTTOM OF METADATA +}); \ No newline at end of file diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-battery-status/www/battery.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-battery-status/www/battery.js new file mode 100644 index 0000000..9a1671b --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-battery-status/www/battery.js @@ -0,0 +1,112 @@ +cordova.define("cordova-plugin-battery-status.battery", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * This class contains information about the current battery status. + * @constructor + */ +var cordova = require('cordova'), + exec = require('cordova/exec'); + +var STATUS_CRITICAL = 5; +var STATUS_LOW = 20; + +var Battery = function() { + this._level = null; + this._isPlugged = null; + // Create new event handlers on the window (returns a channel instance) + this.channels = { + batterystatus:cordova.addWindowEventHandler("batterystatus"), + batterylow:cordova.addWindowEventHandler("batterylow"), + batterycritical:cordova.addWindowEventHandler("batterycritical") + }; + for (var key in this.channels) { + this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange; + } +}; + +function handlers() { + return battery.channels.batterystatus.numHandlers + + battery.channels.batterylow.numHandlers + + battery.channels.batterycritical.numHandlers; +} + +/** + * Event handlers for when callbacks get registered for the battery. + * Keep track of how many handlers we have so we can start and stop the native battery listener + * appropriately (and hopefully save on battery life!). + */ +Battery.onHasSubscribersChange = function() { + // If we just registered the first handler, make sure native listener is started. + if (this.numHandlers === 1 && handlers() === 1) { + exec(battery._status, battery._error, "Battery", "start", []); + } else if (handlers() === 0) { + exec(null, null, "Battery", "stop", []); + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function (info) { + + if (info) { + if (battery._level !== info.level || battery._isPlugged !== info.isPlugged) { + + if(info.level === null && battery._level !== null) { + return; // special case where callback is called because we stopped listening to the native side. + } + + // Something changed. Fire batterystatus event + cordova.fireWindowEvent("batterystatus", info); + + if (!info.isPlugged) { // do not fire low/critical if we are charging. issue: CB-4520 + // note the following are NOT exact checks, as we want to catch a transition from + // above the threshold to below. issue: CB-4519 + if (battery._level > STATUS_CRITICAL && info.level <= STATUS_CRITICAL) { + // Fire critical battery event + cordova.fireWindowEvent("batterycritical", info); + } + else if (battery._level > STATUS_LOW && info.level <= STATUS_LOW) { + // Fire low battery event + cordova.fireWindowEvent("batterylow", info); + } + } + battery._level = info.level; + battery._isPlugged = info.isPlugged; + } + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +var battery = new Battery(); // jshint ignore:line + +module.exports = battery; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/Camera.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/Camera.js new file mode 100644 index 0000000..e69b18a --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/Camera.js @@ -0,0 +1,193 @@ +cordova.define("cordova-plugin-camera.camera", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + Camera = require('./Camera'); + // XXX: commented out + //CameraPopoverHandle = require('./CameraPopoverHandle'); + +/** + * @namespace navigator + */ + +/** + * @exports camera + */ +var cameraExport = {}; + +// Tack on the Camera Constants to the base camera plugin. +for (var key in Camera) { + cameraExport[key] = Camera[key]; +} + +/** + * Callback function that provides an error message. + * @callback module:camera.onError + * @param {string} message - The message is provided by the device's native code. + */ + +/** + * Callback function that provides the image data. + * @callback module:camera.onSuccess + * @param {string} imageData - Base64 encoding of the image data, _or_ the image file URI, depending on [`cameraOptions`]{@link module:camera.CameraOptions} in effect. + * @example + * // Show image + * // + * function cameraCallback(imageData) { + * var image = document.getElementById('myImage'); + * image.src = "data:image/jpeg;base64," + imageData; + * } + */ + +/** + * Optional parameters to customize the camera settings. + * * [Quirks](#CameraOptions-quirks) + * @typedef module:camera.CameraOptions + * @type {Object} + * @property {number} [quality=50] - Quality of the saved image, expressed as a range of 0-100, where 100 is typically full resolution with no loss from file compression. (Note that information about the camera's resolution is unavailable.) + * @property {module:Camera.DestinationType} [destinationType=FILE_URI] - Choose the format of the return value. + * @property {module:Camera.PictureSourceType} [sourceType=CAMERA] - Set the source of the picture. + * @property {Boolean} [allowEdit=true] - Allow simple editing of image before selection. + * @property {module:Camera.EncodingType} [encodingType=JPEG] - Choose the returned image file's encoding. + * @property {number} [targetWidth] - Width in pixels to scale image. Must be used with `targetHeight`. Aspect ratio remains constant. + * @property {number} [targetHeight] - Height in pixels to scale image. Must be used with `targetWidth`. Aspect ratio remains constant. + * @property {module:Camera.MediaType} [mediaType=PICTURE] - Set the type of media to select from. Only works when `PictureSourceType` is `PHOTOLIBRARY` or `SAVEDPHOTOALBUM`. + * @property {Boolean} [correctOrientation] - Rotate the image to correct for the orientation of the device during capture. + * @property {Boolean} [saveToPhotoAlbum] - Save the image to the photo album on the device after capture. + * @property {module:CameraPopoverOptions} [popoverOptions] - iOS-only options that specify popover location in iPad. + * @property {module:Camera.Direction} [cameraDirection=BACK] - Choose the camera to use (front- or back-facing). + */ + +/** + * @description Takes a photo using the camera, or retrieves a photo from the device's + * image gallery. The image is passed to the success callback as a + * Base64-encoded `String`, or as the URI for the image file. + * + * The `camera.getPicture` function opens the device's default camera + * application that allows users to snap pictures by default - this behavior occurs, + * when `Camera.sourceType` equals [`Camera.PictureSourceType.CAMERA`]{@link module:Camera.PictureSourceType}. + * Once the user snaps the photo, the camera application closes and the application is restored. + * + * If `Camera.sourceType` is `Camera.PictureSourceType.PHOTOLIBRARY` or + * `Camera.PictureSourceType.SAVEDPHOTOALBUM`, then a dialog displays + * that allows users to select an existing image. The + * `camera.getPicture` function returns a [`CameraPopoverHandle`]{@link module:CameraPopoverHandle} object, + * which can be used to reposition the image selection dialog, for + * example, when the device orientation changes. + * + * The return value is sent to the [`cameraSuccess`]{@link module:camera.onSuccess} callback function, in + * one of the following formats, depending on the specified + * `cameraOptions`: + * + * - A `String` containing the Base64-encoded photo image. + * + * - A `String` representing the image file location on local storage (default). + * + * You can do whatever you want with the encoded image or URI, for + * example: + * + * - Render the image in an `` tag, as in the example below + * + * - Save the data locally (`LocalStorage`, [Lawnchair](http://brianleroux.github.com/lawnchair/), etc.) + * + * - Post the data to a remote server + * + * __NOTE__: Photo resolution on newer devices is quite good. Photos + * selected from the device's gallery are not downscaled to a lower + * quality, even if a `quality` parameter is specified. To avoid common + * memory problems, set `Camera.destinationType` to `FILE_URI` rather + * than `DATA_URL`. + * + * __Supported Platforms__ + * + * - Android + * - BlackBerry + * - Browser + * - Firefox + * - FireOS + * - iOS + * - Windows + * - WP8 + * - Ubuntu + * + * More examples [here](#camera-getPicture-examples). Quirks [here](#camera-getPicture-quirks). + * + * @example + * navigator.camera.getPicture(cameraSuccess, cameraError, cameraOptions); + * @param {module:camera.onSuccess} successCallback + * @param {module:camera.onError} errorCallback + * @param {module:camera.CameraOptions} options CameraOptions + */ +cameraExport.getPicture = function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'Camera.getPicture', arguments); + options = options || {}; + var getValue = argscheck.getValue; + + var quality = getValue(options.quality, 50); + var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI); + var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA); + var targetWidth = getValue(options.targetWidth, -1); + var targetHeight = getValue(options.targetHeight, -1); + var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG); + var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE); + var allowEdit = !!options.allowEdit; + var correctOrientation = !!options.correctOrientation; + var saveToPhotoAlbum = !!options.saveToPhotoAlbum; + var popoverOptions = getValue(options.popoverOptions, null); + var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK); + + var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, + mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection]; + + exec(successCallback, errorCallback, "Camera", "takePicture", args); + // XXX: commented out + //return new CameraPopoverHandle(); +}; + +/** + * Removes intermediate image files that are kept in temporary storage + * after calling [`camera.getPicture`]{@link module:camera.getPicture}. Applies only when the value of + * `Camera.sourceType` equals `Camera.PictureSourceType.CAMERA` and the + * `Camera.destinationType` equals `Camera.DestinationType.FILE_URI`. + * + * __Supported Platforms__ + * + * - iOS + * + * @example + * navigator.camera.cleanup(onSuccess, onFail); + * + * function onSuccess() { + * console.log("Camera cleanup success.") + * } + * + * function onFail(message) { + * alert('Failed because: ' + message); + * } + */ +cameraExport.cleanup = function(successCallback, errorCallback) { + exec(successCallback, errorCallback, "Camera", "cleanup", []); +}; + +module.exports = cameraExport; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js new file mode 100644 index 0000000..df6cce4 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraConstants.js @@ -0,0 +1,90 @@ +cordova.define("cordova-plugin-camera.Camera", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * @module Camera + */ +module.exports = { + /** + * @enum {number} + */ + DestinationType:{ + /** Return base64 encoded string. DATA_URL can be very memory intensive and cause app crashes or out of memory errors. Use FILE_URI or NATIVE_URI if possible */ + DATA_URL: 0, + /** Return file uri (content://media/external/images/media/2 for Android) */ + FILE_URI: 1, + /** Return native uri (eg. asset-library://... for iOS) */ + NATIVE_URI: 2 + }, + /** + * @enum {number} + */ + EncodingType:{ + /** Return JPEG encoded image */ + JPEG: 0, + /** Return PNG encoded image */ + PNG: 1 + }, + /** + * @enum {number} + */ + MediaType:{ + /** Allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType */ + PICTURE: 0, + /** Allow selection of video only, ONLY RETURNS URL */ + VIDEO: 1, + /** Allow selection from all media types */ + ALLMEDIA : 2 + }, + /** + * @enum {number} + */ + PictureSourceType:{ + /** Choose image from picture library (same as SAVEDPHOTOALBUM for Android) */ + PHOTOLIBRARY : 0, + /** Take picture from camera */ + CAMERA : 1, + /** Choose image from picture library (same as PHOTOLIBRARY for Android) */ + SAVEDPHOTOALBUM : 2 + }, + /** + * Matches iOS UIPopoverArrowDirection constants to specify arrow location on popover. + * @enum {number} + */ + PopoverArrowDirection:{ + ARROW_UP : 1, + ARROW_DOWN : 2, + ARROW_LEFT : 4, + ARROW_RIGHT : 8, + ARROW_ANY : 15 + }, + /** + * @enum {number} + */ + Direction:{ + /** Use the back-facing camera */ + BACK: 0, + /** Use the front-facing camera */ + FRONT: 1 + } +}; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js new file mode 100644 index 0000000..33c168a --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverHandle.js @@ -0,0 +1,34 @@ +cordova.define("cordova-plugin-camera.CameraPopoverHandle", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * @ignore in favour of iOS' one + * A handle to an image picker popover. + */ +var CameraPopoverHandle = function() { + this.setPosition = function(popoverOptions) { + console.log('CameraPopoverHandle.setPosition is only supported on iOS.'); + }; +}; + +module.exports = CameraPopoverHandle; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js new file mode 100644 index 0000000..08d20d3 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-camera/www/CameraPopoverOptions.js @@ -0,0 +1,54 @@ +cordova.define("cordova-plugin-camera.CameraPopoverOptions", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Camera = require('./Camera'); + +/** + * @namespace navigator + */ + +/** + * iOS-only parameters that specify the anchor element location and arrow + * direction of the popover when selecting images from an iPad's library + * or album. + * Note that the size of the popover may change to adjust to the + * direction of the arrow and orientation of the screen. Make sure to + * account for orientation changes when specifying the anchor element + * location. + * @module CameraPopoverOptions + * @param {Number} [x=0] - x pixel coordinate of screen element onto which to anchor the popover. + * @param {Number} [y=32] - y pixel coordinate of screen element onto which to anchor the popover. + * @param {Number} [width=320] - width, in pixels, of the screen element onto which to anchor the popover. + * @param {Number} [height=480] - height, in pixels, of the screen element onto which to anchor the popover. + * @param {module:Camera.PopoverArrowDirection} [arrowDir=ARROW_ANY] - Direction the arrow on the popover should point. + */ +var CameraPopoverOptions = function (x, y, width, height, arrowDir) { + // information of rectangle that popover should be anchored to + this.x = x || 0; + this.y = y || 32; + this.width = width || 320; + this.height = height || 480; + this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY; +}; + +module.exports = CameraPopoverOptions; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-console/www/console-via-logger.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-console/www/console-via-logger.js new file mode 100644 index 0000000..2a9a90d --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-console/www/console-via-logger.js @@ -0,0 +1,188 @@ +cordova.define("cordova-plugin-console.console", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +//------------------------------------------------------------------------------ + +var logger = require("./logger"); + +//------------------------------------------------------------------------------ +// object that we're exporting +//------------------------------------------------------------------------------ +var console = module.exports; + +//------------------------------------------------------------------------------ +// copy of the original console object +//------------------------------------------------------------------------------ +var WinConsole = window.console; + +//------------------------------------------------------------------------------ +// whether to use the logger +//------------------------------------------------------------------------------ +var UseLogger = false; + +//------------------------------------------------------------------------------ +// Timers +//------------------------------------------------------------------------------ +var Timers = {}; + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +function noop() {} + +//------------------------------------------------------------------------------ +// used for unimplemented methods +//------------------------------------------------------------------------------ +console.useLogger = function (value) { + if (arguments.length) UseLogger = !!value; + + if (UseLogger) { + if (logger.useConsole()) { + throw new Error("console and logger are too intertwingly"); + } + } + + return UseLogger; +}; + +//------------------------------------------------------------------------------ +console.log = function() { + if (logger.useConsole()) return; + logger.log.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.error = function() { + if (logger.useConsole()) return; + logger.error.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.warn = function() { + if (logger.useConsole()) return; + logger.warn.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.info = function() { + if (logger.useConsole()) return; + logger.info.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.debug = function() { + if (logger.useConsole()) return; + logger.debug.apply(logger, [].slice.call(arguments)); +}; + +//------------------------------------------------------------------------------ +console.assert = function(expression) { + if (expression) return; + + var message = logger.format.apply(logger.format, [].slice.call(arguments, 1)); + console.log("ASSERT: " + message); +}; + +//------------------------------------------------------------------------------ +console.clear = function() {}; + +//------------------------------------------------------------------------------ +console.dir = function(object) { + console.log("%o", object); +}; + +//------------------------------------------------------------------------------ +console.dirxml = function(node) { + console.log(node.innerHTML); +}; + +//------------------------------------------------------------------------------ +console.trace = noop; + +//------------------------------------------------------------------------------ +console.group = console.log; + +//------------------------------------------------------------------------------ +console.groupCollapsed = console.log; + +//------------------------------------------------------------------------------ +console.groupEnd = noop; + +//------------------------------------------------------------------------------ +console.time = function(name) { + Timers[name] = new Date().valueOf(); +}; + +//------------------------------------------------------------------------------ +console.timeEnd = function(name) { + var timeStart = Timers[name]; + if (!timeStart) { + console.warn("unknown timer: " + name); + return; + } + + var timeElapsed = new Date().valueOf() - timeStart; + console.log(name + ": " + timeElapsed + "ms"); +}; + +//------------------------------------------------------------------------------ +console.timeStamp = noop; + +//------------------------------------------------------------------------------ +console.profile = noop; + +//------------------------------------------------------------------------------ +console.profileEnd = noop; + +//------------------------------------------------------------------------------ +console.count = noop; + +//------------------------------------------------------------------------------ +console.exception = console.log; + +//------------------------------------------------------------------------------ +console.table = function(data, columns) { + console.log("%o", data); +}; + +//------------------------------------------------------------------------------ +// return a new function that calls both functions passed as args +//------------------------------------------------------------------------------ +function wrappedOrigCall(orgFunc, newFunc) { + return function() { + var args = [].slice.call(arguments); + try { orgFunc.apply(WinConsole, args); } catch (e) {} + try { newFunc.apply(console, args); } catch (e) {} + }; +} + +//------------------------------------------------------------------------------ +// For every function that exists in the original console object, that +// also exists in the new console object, wrap the new console method +// with one that calls both +//------------------------------------------------------------------------------ +for (var key in console) { + if (typeof WinConsole[key] == "function") { + console[key] = wrappedOrigCall(WinConsole[key], console[key]); + } +} + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-console/www/logger.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-console/www/logger.js new file mode 100644 index 0000000..403f84e --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-console/www/logger.js @@ -0,0 +1,356 @@ +cordova.define("cordova-plugin-console.logger", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +//------------------------------------------------------------------------------ +// The logger module exports the following properties/functions: +// +// LOG - constant for the level LOG +// ERROR - constant for the level ERROR +// WARN - constant for the level WARN +// INFO - constant for the level INFO +// DEBUG - constant for the level DEBUG +// logLevel() - returns current log level +// logLevel(value) - sets and returns a new log level +// useConsole() - returns whether logger is using console +// useConsole(value) - sets and returns whether logger is using console +// log(message,...) - logs a message at level LOG +// error(message,...) - logs a message at level ERROR +// warn(message,...) - logs a message at level WARN +// info(message,...) - logs a message at level INFO +// debug(message,...) - logs a message at level DEBUG +// logLevel(level,message,...) - logs a message specified level +// +//------------------------------------------------------------------------------ + +var logger = exports; + +var exec = require('cordova/exec'); + +var UseConsole = false; +var UseLogger = true; +var Queued = []; +var DeviceReady = false; +var CurrentLevel; + +var originalConsole = console; + +/** + * Logging levels + */ + +var Levels = [ + "LOG", + "ERROR", + "WARN", + "INFO", + "DEBUG" +]; + +/* + * add the logging levels to the logger object and + * to a separate levelsMap object for testing + */ + +var LevelsMap = {}; +for (var i=0; i 0){ + formatArgs.unshift(fmtString); // add formatString + } + + var message = logger.format.apply(logger.format, formatArgs); + + if (LevelsMap[level] === null) { + throw new Error("invalid logging level: " + level); + } + + if (LevelsMap[level] > CurrentLevel) return; + + // queue the message if not yet at deviceready + if (!DeviceReady && !UseConsole) { + Queued.push([level, message]); + return; + } + + // Log using the native logger if that is enabled + if (UseLogger) { + exec(null, null, "Console", "logLevel", [level, message]); + } + + // Log using the console if that is enabled + if (UseConsole) { + // make sure console is not using logger + if (console.useLogger()) { + throw new Error("console and logger are too intertwingly"); + } + + // log to the console + switch (level) { + case logger.LOG: originalConsole.log(message); break; + case logger.ERROR: originalConsole.log("ERROR: " + message); break; + case logger.WARN: originalConsole.log("WARN: " + message); break; + case logger.INFO: originalConsole.log("INFO: " + message); break; + case logger.DEBUG: originalConsole.log("DEBUG: " + message); break; + } + } +}; + + +/** + * Formats a string and arguments following it ala console.log() + * + * Any remaining arguments will be appended to the formatted string. + * + * for rationale, see FireBug's Console API: + * http://getfirebug.com/wiki/index.php/Console_API + */ +logger.format = function(formatString, args) { + return __format(arguments[0], [].slice.call(arguments,1)).join(' '); +}; + + +//------------------------------------------------------------------------------ +/** + * Formats a string and arguments following it ala vsprintf() + * + * format chars: + * %j - format arg as JSON + * %o - format arg as JSON + * %c - format arg as '' + * %% - replace with '%' + * any other char following % will format it's + * arg via toString(). + * + * Returns an array containing the formatted string and any remaining + * arguments. + */ +function __format(formatString, args) { + if (formatString === null || formatString === undefined) return [""]; + if (arguments.length == 1) return [formatString.toString()]; + + if (typeof formatString != "string") + formatString = formatString.toString(); + + var pattern = /(.*?)%(.)(.*)/; + var rest = formatString; + var result = []; + + while (args.length) { + var match = pattern.exec(rest); + if (!match) break; + + var arg = args.shift(); + rest = match[3]; + result.push(match[1]); + + if (match[2] == '%') { + result.push('%'); + args.unshift(arg); + continue; + } + + result.push(__formatted(arg, match[2])); + } + + result.push(rest); + + var remainingArgs = [].slice.call(args); + remainingArgs.unshift(result.join('')); + return remainingArgs; +} + +function __formatted(object, formatChar) { + + try { + switch(formatChar) { + case 'j': + case 'o': return JSON.stringify(object); + case 'c': return ''; + } + } + catch (e) { + return "error JSON.stringify()ing argument: " + e; + } + + if ((object === null) || (object === undefined)) { + return Object.prototype.toString.call(object); + } + + return object.toString(); +} + + +//------------------------------------------------------------------------------ +// when deviceready fires, log queued messages +logger.__onDeviceReady = function() { + if (DeviceReady) return; + + DeviceReady = true; + + for (var i=0; i} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + 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.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + argscheck.checkArgs('FF', 'Contact.remove', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + if (this.id === null) { + fail(ContactError.UNKNOWN_ERROR); + } + else { + exec(successCB, fail, "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 = utils.clone(this); + clonedContact.id = null; + clonedContact.rawId = null; + + function nullIds(arr) { + if (arr) { + for (var i = 0; i < arr.length; ++i) { + arr[i].id = null; + } + } + } + + // Loop through and clear out any id's in phones, emails, etc. + nullIds(clonedContact.phoneNumbers); + nullIds(clonedContact.emails); + nullIds(clonedContact.addresses); + nullIds(clonedContact.ims); + nullIds(clonedContact.organizations); + nullIds(clonedContact.categories); + nullIds(clonedContact.photos); + nullIds(clonedContact.urls); + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + argscheck.checkArgs('FFO', 'Contact.save', arguments); + var fail = errorCB && function(code) { + errorCB(new ContactError(code)); + }; + var success = function(result) { + if (result) { + if (successCB) { + var fullContact = require('./contacts').create(result); + successCB(convertUtils.toCordovaFormat(fullContact)); + } + } + else { + // no Entry object returned + fail(ContactError.UNKNOWN_ERROR); + } + }; + var dupContact = convertUtils.toNativeFormat(utils.clone(this)); + exec(success, fail, "Contacts", "save", [dupContact]); +}; + + +module.exports = Contact; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js new file mode 100644 index 0000000..a6246de --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactAddress.js @@ -0,0 +1,48 @@ +cordova.define("cordova-plugin-contacts.ContactAddress", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted // NOTE: not a W3C standard +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ + +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +module.exports = ContactAddress; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js new file mode 100644 index 0000000..ee9715a --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactError.js @@ -0,0 +1,45 @@ +cordova.define("cordova-plugin-contacts.ContactError", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var ContactError = function(err) { + this.code = (typeof err != 'undefined' ? err : null); +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.OPERATION_CANCELLED_ERROR = 6; +ContactError.PERMISSION_DENIED_ERROR = 20; + +module.exports = ContactError; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js new file mode 100644 index 0000000..589f585 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactField.js @@ -0,0 +1,39 @@ +cordova.define("cordova-plugin-contacts.ContactField", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = (type && type.toString()) || null; + this.value = (value && value.toString()) || null; + this.pref = (typeof pref != 'undefined' ? pref : false); +}; + +module.exports = ContactField; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js new file mode 100644 index 0000000..c364ed6 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactFieldType.js @@ -0,0 +1,57 @@ +cordova.define("cordova-plugin-contacts.ContactFieldType", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + + // Possible field names for various platforms. + // Some field names are platform specific + + var fieldType = { + addresses: "addresses", + birthday: "birthday", + categories: "categories", + country: "country", + department: "department", + displayName: "displayName", + emails: "emails", + familyName: "familyName", + formatted: "formatted", + givenName: "givenName", + honorificPrefix: "honorificPrefix", + honorificSuffix: "honorificSuffix", + id: "id", + ims: "ims", + locality: "locality", + middleName: "middleName", + name: "name", + nickname: "nickname", + note: "note", + organizations: "organizations", + phoneNumbers: "phoneNumbers", + photos: "photos", + postalCode: "postalCode", + region: "region", + streetAddress: "streetAddress", + title: "title", + urls: "urls" + }; + + module.exports = fieldType; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js new file mode 100644 index 0000000..2fa2c67 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactFindOptions.js @@ -0,0 +1,40 @@ +cordova.define("cordova-plugin-contacts.ContactFindOptions", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * ContactFindOptions. + * @constructor + * @param filter used to match contacts against + * @param multiple boolean used to determine if more than one contact should be returned + * @param desiredFields + * @param hasPhoneNumber boolean used to filter the search and only return contacts that have a phone number informed + */ + +var ContactFindOptions = function(filter, multiple, desiredFields, hasPhoneNumber) { + this.filter = filter || ''; + this.multiple = (typeof multiple != 'undefined' ? multiple : false); + this.desiredFields = typeof desiredFields != 'undefined' ? desiredFields : []; + this.hasPhoneNumber = typeof hasPhoneNumber != 'undefined' ? hasPhoneNumber : false; +}; + +module.exports = ContactFindOptions; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js new file mode 100644 index 0000000..41b5e6d --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactName.js @@ -0,0 +1,43 @@ +cordova.define("cordova-plugin-contacts.ContactName", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact name. +* @constructor +* @param formatted // NOTE: not part of W3C standard +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +module.exports = ContactName; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js new file mode 100644 index 0000000..8e1302e --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/ContactOrganization.js @@ -0,0 +1,43 @@ +cordova.define("cordova-plugin-contacts.ContactOrganization", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** +* Contact organization. +* @constructor +* @param pref +* @param type +* @param name +* @param dept +* @param title +*/ + +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = (typeof pref != 'undefined' ? pref : false); + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +module.exports = ContactOrganization; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/contacts.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/contacts.js new file mode 100644 index 0000000..f90121a --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/contacts.js @@ -0,0 +1,101 @@ +cordova.define("cordova-plugin-contacts.contacts", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + ContactError = require('./ContactError'), + Contact = require('./Contact'), + fieldType = require('./ContactFieldType'), + convertUtils = require('./convertUtils'); + +/** +* Represents a group of Contacts. +* @constructor +*/ +var contacts = { + fieldType: fieldType, + /** + * Returns an array of Contacts matching the search criteria. + * @param fields that should be searched + * @param successCB success callback + * @param errorCB error callback + * @param {ContactFindOptions} options that can be applied to contact searching + * @return array of Contacts matching search criteria + */ + find: function(fields, successCB, errorCB, options) { + argscheck.checkArgs('afFO', 'contacts.find', arguments); + if (!fields.length) { + if (errorCB) { + errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); + } + } else { + // missing 'options' param means return all contacts + options = options || { filter: '', multiple: true }; + var win = function(result) { + var cs = []; + for (var i = 0, l = result.length; i < l; i++) { + cs.push(convertUtils.toCordovaFormat(contacts.create(result[i]))); + } + successCB(cs); + }; + exec(win, errorCB, "Contacts", "search", [fields, options]); + } + }, + + /** + * This function picks contact from phone using contact picker UI + * @returns new Contact object + */ + pickContact: function (successCB, errorCB) { + + argscheck.checkArgs('fF', 'contacts.pick', arguments); + + var win = function (result) { + // if Contacts.pickContact return instance of Contact object + // don't create new Contact object, use current + var contact = result instanceof Contact ? result : contacts.create(result); + successCB(convertUtils.toCordovaFormat(contact)); + }; + exec(win, errorCB, "Contacts", "pickContact", []); + }, + + /** + * This function creates a new contact, but it does not persist the contact + * to device storage. To persist the contact to device storage, invoke + * contact.save(). + * @param properties an object whose properties will be examined to create a new Contact + * @returns new Contact object + */ + create: function(properties) { + argscheck.checkArgs('O', 'contacts.create', arguments); + var contact = new Contact(); + for (var i in properties) { + if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { + contact[i] = properties[i]; + } + } + return contact; + } +}; + +module.exports = contacts; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js new file mode 100644 index 0000000..9295eaf --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-contacts/www/convertUtils.js @@ -0,0 +1,72 @@ +cordova.define("cordova-plugin-contacts.convertUtils", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var utils = require('cordova/utils'); + +module.exports = { + /** + * Converts primitives into Complex Object + * Currently only used for Date fields + */ + toCordovaFormat: function (contact) { + var value = contact.birthday; + if (value !== null) { + try { + contact.birthday = new Date(parseFloat(value)); + + //we might get 'Invalid Date' which does not throw an error + //and is an instance of Date. + if (isNaN(contact.birthday.getTime())) { + contact.birthday = null; + } + + } catch (exception){ + console.log("Cordova Contact toCordovaFormat error: exception creating date."); + } + } + return contact; + }, + + /** + * Converts Complex objects into primitives + * Only conversion at present is for Dates. + **/ + toNativeFormat: function (contact) { + var value = contact.birthday; + if (value !== null) { + // try to make it a Date object if it is not already + if (!utils.isDate(value)){ + try { + value = new Date(value); + } catch(exception){ + value = null; + } + } + if (utils.isDate(value)){ + value = value.valueOf(); // convert to milliseconds + } + contact.birthday = value; + } + return contact; + } +}; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js new file mode 100644 index 0000000..fd4ea4e --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-motion/www/Acceleration.js @@ -0,0 +1,31 @@ +cordova.define("cordova-plugin-device-motion.Acceleration", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var Acceleration = function(x, y, z, timestamp) { + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); +}; + +module.exports = Acceleration; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js new file mode 100644 index 0000000..6cf3d9b --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-motion/www/accelerometer.js @@ -0,0 +1,204 @@ +cordova.define("cordova-plugin-device-motion.accelerometer", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * This class provides access to device accelerometer data. + * @constructor + */ +var argscheck = require('cordova/argscheck'), + utils = require("cordova/utils"), + exec = require("cordova/exec"), + Acceleration = require('./Acceleration'); + +// Is the accel sensor running? +var running = false; + +// Keeps reference to watchAcceleration calls. +var timers = {}; + +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Timer used when faking up devicemotion events +var eventTimerId = null; + +// Tells native to start. +function start() { + exec(function (a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function (e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + accel = null; + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return { win: win, fail: fail }; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + +var accelerometer = { + /** + * Asynchronously acquires the current acceleration. + * + * @param {Function} successCallback The function to call when the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + */ + getCurrentAcceleration: function (successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments); + + if (cordova.platformId === "windowsphone") { + exec(function (a) { + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + successCallback(accel); + }, function (e) { + errorCallback(e); + }, "Accelerometer", "getCurrentAcceleration", []); + + return; + } + + var p; + var win = function (a) { + removeListeners(p); + successCallback(a); + }; + var fail = function (e) { + removeListeners(p); + if (errorCallback) { + errorCallback(e); + } + }; + + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } + }, + + /** + * Asynchronously acquires the acceleration repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the acceleration data is available + * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) + * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ + watchAcceleration: function (successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments); + // Default interval (10 sec) + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; + + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); + + var p = createCallbackPair(function () { }, function (e) { + removeListeners(p); + if (errorCallback) { + errorCallback(e); + } + }); + listeners.push(p); + + timers[id] = { + timer: window.setInterval(function () { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners: p + }; + + if (running) { + // If we're already running then immediately invoke the success callback + // but only if we have retrieved a value, sample code does not check for null ... + if (accel) { + successCallback(accel); + } + } else { + start(); + } + + if (cordova.platformId === "browser" && !eventTimerId) { + // Start firing devicemotion events if we haven't already + var devicemotionEvent = new Event('devicemotion'); + eventTimerId = window.setInterval(function() { + window.dispatchEvent(devicemotionEvent); + }, 200); + } + + return id; + }, + + /** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ + clearWatch: function (id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); + delete timers[id]; + + if (eventTimerId && Object.keys(timers).length === 0) { + // No more watchers, so stop firing 'devicemotion' events + window.clearInterval(eventTimerId); + eventTimerId = null; + } + } + } +}; +module.exports = accelerometer; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js new file mode 100644 index 0000000..7f9d177 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/CompassError.js @@ -0,0 +1,36 @@ +cordova.define("cordova-plugin-device-orientation.CompassError", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * CompassError. + * An error code assigned by an implementation when an error has occurred + * @constructor + */ +var CompassError = function(err) { + this.code = (err !== undefined ? err : null); +}; + +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +module.exports = CompassError; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js new file mode 100644 index 0000000..32bc9b5 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/CompassHeading.js @@ -0,0 +1,31 @@ +cordova.define("cordova-plugin-device-orientation.CompassHeading", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) { + this.magneticHeading = magneticHeading; + this.trueHeading = trueHeading; + this.headingAccuracy = headingAccuracy; + this.timestamp = timestamp || new Date().getTime(); +}; + +module.exports = CompassHeading; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js new file mode 100644 index 0000000..c1b7ae6 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device-orientation/www/compass.js @@ -0,0 +1,120 @@ +cordova.define("cordova-plugin-device-orientation.compass", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + utils = require('cordova/utils'), + CompassHeading = require('./CompassHeading'), + CompassError = require('./CompassError'), + + timers = {}, + eventTimerId = null, + compass = { + /** + * Asynchronously acquires 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. + * @param {CompassOptions} options The options for getting the heading data (not used). + */ + getCurrentHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments); + + var win = function(result) { + var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); + successCallback(ch); + }; + var fail = errorCallback && function(code) { + var ce = new CompassError(code); + errorCallback(ce); + }; + + // Get heading + exec(win, fail, "Compass", "getHeading", [options]); + }, + + /** + * Asynchronously acquires 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. + * @param {HeadingOptions} options The options for getting the heading data + * such as timeout and the frequency of the watch. For iOS, filter parameter + * specifies to watch via a distance filter rather than time. + */ + watchHeading:function(successCallback, errorCallback, options) { + argscheck.checkArgs('fFO', 'compass.watchHeading', arguments); + // Default interval (100 msec) + var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; + var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; + + var id = utils.createUUID(); + if (filter > 0) { + // is an iOS request for watch by filter, no timer needed + timers[id] = "iOS"; + compass.getCurrentHeading(successCallback, errorCallback, options); + } else { + // Start watch timer to get headings + timers[id] = window.setInterval(function() { + compass.getCurrentHeading(successCallback, errorCallback); + }, frequency); + } + + if (cordova.platformId === 'browser' && !eventTimerId) { + // Start firing deviceorientation events if haven't already + var deviceorientationEvent = new Event('deviceorientation'); + eventTimerId = window.setInterval(function() { + window.dispatchEvent(deviceorientationEvent); + }, 200); + } + + return id; + }, + + /** + * Clears the specified heading watch. + * @param {String} id The ID of the watch returned from #watchHeading. + */ + clearWatch:function(id) { + // Stop javascript timer & remove from timer list + if (id && timers[id]) { + if (timers[id] != "iOS") { + clearInterval(timers[id]); + } else { + // is iOS watch by filter so call into device to stop + exec(null, null, "Compass", "stopHeading", []); + } + delete timers[id]; + + if (eventTimerId && Object.keys(timers).length === 0) { + // No more watchers, so stop firing 'deviceorientation' events + window.clearInterval(eventTimerId); + eventTimerId = null; + } + } + } + }; + +module.exports = compass; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-device/src/ubuntu/device.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device/src/ubuntu/device.js new file mode 100644 index 0000000..103a535 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device/src/ubuntu/device.js @@ -0,0 +1,35 @@ +cordova.define("cordova-plugin-device.DeviceProxy", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* global Cordova */ + +module.exports = { + getInfo:function(win,fail,args) { + Cordova.exec(function (model, cordova, platform, uuid, version) { + win({name: name, model: model, cordova: cordova, + platform: platform, uuid: uuid, version: version}); + }, null, "com.cordova.Device", "getInfo", []); + } +}; + +require("cordova/exec/proxy").add("Device", module.exports); + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-device/www/device.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device/www/device.js new file mode 100644 index 0000000..ff0c5b4 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-device/www/device.js @@ -0,0 +1,85 @@ +cordova.define("cordova-plugin-device.device", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + channel = require('cordova/channel'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + cordova = require('cordova'); + +channel.createSticky('onCordovaInfoReady'); +// Tell cordova channel to wait on the CordovaInfoReady event +channel.waitForInitialization('onCordovaInfoReady'); + +/** + * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +function Device() { + this.available = false; + this.platform = null; + this.version = null; + this.uuid = null; + this.cordova = null; + this.model = null; + this.manufacturer = null; + this.isVirtual = null; + this.serial = null; + + var me = this; + + channel.onCordovaReady.subscribe(function() { + me.getInfo(function(info) { + //ignoring info.cordova returning from native, we should use value from cordova.version defined in cordova.js + //TODO: CB-5105 native implementations should not return info.cordova + var buildLabel = cordova.version; + me.available = true; + me.platform = info.platform; + me.version = info.version; + me.uuid = info.uuid; + me.cordova = buildLabel; + me.model = info.model; + me.isVirtual = info.isVirtual; + me.manufacturer = info.manufacturer || 'unknown'; + me.serial = info.serial || 'unknown'; + channel.onCordovaInfoReady.fire(); + },function(e) { + me.available = false; + utils.alert("[ERROR] Error initializing Cordova: " + e); + }); + }); +} + +/** + * Get device info + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + */ +Device.prototype.getInfo = function(successCallback, errorCallback) { + argscheck.checkArgs('fF', 'Device.getInfo', arguments); + exec(successCallback, errorCallback, "Device", "getDeviceInfo", []); +}; + +module.exports = new Device(); + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-dialogs/www/notification.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-dialogs/www/notification.js new file mode 100644 index 0000000..b5e758d --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-dialogs/www/notification.js @@ -0,0 +1,129 @@ +cordova.define("cordova-plugin-dialogs.notification", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'); +var platform = require('cordova/platform'); + +/** + * Provides access to notifications on the device. + */ + +module.exports = { + + /** + * Open a native alert dialog, with a customizable title and button text. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} completeCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Alert) + * @param {String} buttonLabel Label of the close button (default: OK) + */ + alert: function(message, completeCallback, title, buttonLabel) { + var _title = (typeof title === "string" ? title : "Alert"); + var _buttonLabel = (buttonLabel || "OK"); + exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]); + }, + + /** + * Open a native confirm dialog, with a customizable title and button text. + * The result that the user selects is returned to the result callback. + * + * @param {String} message Message to print in the body of the alert + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the alert dialog (default: Confirm) + * @param {Array} buttonLabels Array of the labels of the buttons (default: ['OK', 'Cancel']) + */ + confirm: function(message, resultCallback, title, buttonLabels) { + var _title = (typeof title === "string" ? title : "Confirm"); + var _buttonLabels = (buttonLabels || ["OK", "Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.confirm(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + + exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]); + }, + + /** + * Open a native prompt dialog, with a customizable title and button text. + * The following results are returned to the result callback: + * buttonIndex Index number of the button selected. + * input1 The text entered in the prompt dialog box. + * + * @param {String} message Dialog message to display (default: "Prompt message") + * @param {Function} resultCallback The callback that is called when user clicks on a button. + * @param {String} title Title of the dialog (default: "Prompt") + * @param {Array} buttonLabels Array of strings for the button labels (default: ["OK","Cancel"]) + * @param {String} defaultText Textbox input value (default: empty string) + */ + prompt: function(message, resultCallback, title, buttonLabels, defaultText) { + var _message = (typeof message === "string" ? message : "Prompt message"); + var _title = (typeof title === "string" ? title : "Prompt"); + var _buttonLabels = (buttonLabels || ["OK","Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.prompt(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + + var _defaultText = (defaultText || ""); + exec(resultCallback, null, "Notification", "prompt", [_message, _title, _buttonLabels, _defaultText]); + }, + + /** + * Causes the device to beep. + * On Android, the default notification ringtone is played "count" times. + * + * @param {Integer} count The number of beeps. + */ + beep: function(count) { + var defaultedCount = count || 1; + exec(null, null, "Notification", "beep", [ defaultedCount ]); + } +}; + +function convertButtonLabels(buttonLabels) { + + // Some platforms take an array of button label names. + // Other platforms take a comma separated list. + // For compatibility, we convert to the desired type based on the platform. + if (platform.id == "amazon-fireos" || platform.id == "android" || platform.id == "ios" || + platform.id == "windowsphone" || platform.id == "firefoxos" || platform.id == "ubuntu" || + platform.id == "windows8" || platform.id == "windows") { + + if (typeof buttonLabels === 'string') { + buttonLabels = buttonLabels.split(","); // not crazy about changing the var type here + } + } else { + if (Array.isArray(buttonLabels)) { + var buttonLabelArray = buttonLabels; + buttonLabels = buttonLabelArray.toString(); + } + } + + return buttonLabels; +} +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js new file mode 100644 index 0000000..dd5a2a2 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransfer.js @@ -0,0 +1,241 @@ +cordova.define("cordova-plugin-file-transfer.FileTransfer", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* global cordova, FileSystem */ + +var argscheck = require('cordova/argscheck'), + exec = require('cordova/exec'), + FileTransferError = require('./FileTransferError'), + ProgressEvent = require('cordova-plugin-file.ProgressEvent'); + +function newProgressEvent(result) { + var pe = new ProgressEvent(); + pe.lengthComputable = result.lengthComputable; + pe.loaded = result.loaded; + pe.total = result.total; + return pe; +} + +function getUrlCredentials(urlString) { + var credentialsPattern = /^https?\:\/\/(?:(?:(([^:@\/]*)(?::([^@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?).*$/, + credentials = credentialsPattern.exec(urlString); + + return credentials && credentials[1]; +} + +function getBasicAuthHeader(urlString) { + var header = null; + + + // This is changed due to MS Windows doesn't support credentials in http uris + // so we detect them by regexp and strip off from result url + // Proof: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/a327cf3c-f033-4a54-8b7f-03c56ba3203f/windows-foundation-uri-security-problem + + if (window.btoa) { + var credentials = getUrlCredentials(urlString); + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; +} + +function convertHeadersToArray(headers) { + var result = []; + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + var headerValue = headers[header]; + result.push({ + name: header, + value: headerValue.toString() + }); + } + } + return result; +} + +var idCounter = 0; + +/** + * FileTransfer uploads a file to a remote server. + * @constructor + */ +var FileTransfer = function() { + this._id = ++idCounter; + this.onprogress = null; // optional callback +}; + +/** +* 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 +* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false +*/ +FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments); + // check for options + var fileKey = null; + var fileName = null; + var mimeType = null; + var params = null; + var chunkedMode = true; + var headers = null; + var httpMethod = null; + var basicAuthHeader = getBasicAuthHeader(server); + if (basicAuthHeader) { + server = server.replace(getUrlCredentials(server) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + httpMethod = options.httpMethod || "POST"; + if (httpMethod.toUpperCase() == "PUT"){ + httpMethod = "PUT"; + } else { + httpMethod = "POST"; + } + if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { + chunkedMode = options.chunkedMode; + } + if (options.params) { + params = options.params; + } + else { + params = {}; + } + } + + if (cordova.platformId === "windowsphone") { + headers = headers && convertHeadersToArray(headers); + params = params && convertHeadersToArray(params); + } + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body, e.exception); + errorCallback(error); + }; + + var self = this; + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + self.onprogress(newProgressEvent(result)); + } + } else { + if (successCallback) { + successCallback(result); + } + } + }; + exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]); +}; + +/** + * Downloads a file form a given URL and saves it to the specified directory. + * @param source {String} URL of the server to receive the file + * @param target {String} Full path of the file on the device + * @param successCallback (Function} Callback to be invoked when upload has completed + * @param errorCallback {Function} Callback to be invoked upon error + * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false + * @param options {FileDownloadOptions} Optional parameters such as headers + */ +FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments); + var self = this; + + var basicAuthHeader = getBasicAuthHeader(source); + if (basicAuthHeader) { + source = source.replace(getUrlCredentials(source) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + var headers = null; + if (options) { + headers = options.headers || null; + } + + if (cordova.platformId === "windowsphone" && headers) { + headers = convertHeadersToArray(headers); + } + + var win = function(result) { + if (typeof result.lengthComputable != "undefined") { + if (self.onprogress) { + return self.onprogress(newProgressEvent(result)); + } + } else if (successCallback) { + var entry = null; + if (result.isDirectory) { + entry = new (require('cordova-plugin-file.DirectoryEntry'))(); + } + else if (result.isFile) { + entry = new (require('cordova-plugin-file.FileEntry'))(); + } + entry.isDirectory = result.isDirectory; + entry.isFile = result.isFile; + entry.name = result.name; + entry.fullPath = result.fullPath; + entry.filesystem = new FileSystem(result.filesystemName || (result.filesystem == window.PERSISTENT ? 'persistent' : 'temporary')); + entry.nativeURL = result.nativeURL; + successCallback(entry); + } + }; + + var fail = errorCallback && function(e) { + var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body, e.exception); + errorCallback(error); + }; + + exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]); +}; + +/** + * Aborts the ongoing file transfer on this object. The original error + * callback for the file transfer will be called if necessary. + */ +FileTransfer.prototype.abort = function() { + exec(null, null, 'FileTransfer', 'abort', [this._id]); +}; + +module.exports = FileTransfer; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js new file mode 100644 index 0000000..8339c2b --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-file-transfer/www/FileTransferError.js @@ -0,0 +1,43 @@ +cordova.define("cordova-plugin-file-transfer.FileTransferError", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/** + * FileTransferError + * @constructor + */ +var FileTransferError = function(code, source, target, status, body, exception) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; + this.exception = exception || null; +}; + +FileTransferError.FILE_NOT_FOUND_ERR = 1; +FileTransferError.INVALID_URL_ERR = 2; +FileTransferError.CONNECTION_ERR = 3; +FileTransferError.ABORT_ERR = 4; +FileTransferError.NOT_MODIFIED_ERR = 5; + +module.exports = FileTransferError; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js new file mode 100644 index 0000000..464d339 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/DirectoryEntry.js @@ -0,0 +1,119 @@ +cordova.define("cordova-plugin-file.DirectoryEntry", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + Entry = require('./Entry'), + FileError = require('./FileError'), + DirectoryReader = require('./DirectoryReader'); + +/** + * An interface representing a directory on the file system. + * + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) { + + // add trailing slash if it is missing + if ((fullPath) && !/\/$/.test(fullPath)) { + fullPath += "/"; + } + // add trailing slash if it is missing + if (nativeURL && !/\/$/.test(nativeURL)) { + nativeURL += "/"; + } + DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, fileSystem, nativeURL); +}; + +utils.extend(DirectoryEntry, Entry); + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.toInternalURL()); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or exclusively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getDirectory", [this.toInternalURL(), path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments); + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(successCallback, fail, "File", "removeRecursively", [this.toInternalURL()]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or exclusively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments); + var fs = this.filesystem; + var win = successCallback && function(result) { + var FileEntry = require('./FileEntry'); + var entry = new FileEntry(result.name, result.fullPath, fs, result.nativeURL); + successCallback(entry); + }; + var fail = errorCallback && function(code) { + errorCallback(new FileError(code)); + }; + exec(win, fail, "File", "getFile", [this.toInternalURL(), path, options]); +}; + +module.exports = DirectoryEntry; + +}); diff --git a/platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js b/platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js new file mode 100644 index 0000000..921b486 --- /dev/null +++ b/platforms/ubuntu/platform_www/plugins/cordova-plugin-file/www/DirectoryReader.js @@ -0,0 +1,75 @@ +cordova.define("cordova-plugin-file.DirectoryReader", function(require, exports, module) { /* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +var exec = require('cordova/exec'), + FileError = require('./FileError') ; + +/** + * An interface that lists the files and directories in a directory. + */ +function DirectoryReader(localURL) { + this.localURL = localURL || null; + this.hasReadEntries = false; +} + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + // If we've already read and passed on this directory's entries, return an empty list. + if (this.hasReadEntries) { + successCallback([]); + return; + } + var reader = this; + var win = typeof successCallback !== 'function' ? null : function(result) { + var retVal = []; + for (var i=0; i or + *
    \ No newline at end of file diff --git a/platforms/browser/www/screens/login.html b/platforms/browser/www/screens/login.html index 20432db..8e9514d 100644 --- a/platforms/browser/www/screens/login.html +++ b/platforms/browser/www/screens/login.html @@ -1,5 +1,3 @@ - -
    @@ -12,29 +10,36 @@
    - +

    -