Browse Source

Signed-off-by: caner <5658514@qq.com>

caner 3 years ago
parent
commit
895f7eb0b3
100 changed files with 0 additions and 14602 deletions
  1. 0 6
      .gitignore
  2. 0 8
      LICENSE
  3. 0 47
      README.md
  4. 0 44
      config.xml
  5. 0 32
      package.json
  6. 0 21
      platforms/android/.gitignore
  7. 0 22
      platforms/android/CordovaLib/AndroidManifest.xml
  8. 0 150
      platforms/android/CordovaLib/build.gradle
  9. 0 205
      platforms/android/CordovaLib/cordova.gradle
  10. 0 11
      platforms/android/CordovaLib/project.properties
  11. 0 22
      platforms/android/CordovaLib/repositories.gradle
  12. 0 69
      platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java
  13. 0 73
      platforms/android/CordovaLib/src/org/apache/cordova/BuildHelper.java
  14. 0 142
      platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java
  15. 0 65
      platforms/android/CordovaLib/src/org/apache/cordova/CallbackMap.java
  16. 0 71
      platforms/android/CordovaLib/src/org/apache/cordova/Config.java
  17. 0 145
      platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java
  18. 0 528
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java
  19. 0 113
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java
  20. 0 186
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java
  21. 0 105
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java
  22. 0 152
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaDialogsHelper.java
  23. 0 51
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaHttpAuthHandler.java
  24. 0 97
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java
  25. 0 249
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterfaceImpl.java
  26. 0 422
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java
  27. 0 101
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaPreferences.java
  28. 0 479
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaResourceApi.java
  29. 0 142
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebView.java
  30. 0 85
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewEngine.java
  31. 0 668
      platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewImpl.java
  32. 0 410
      platforms/android/CordovaLib/src/org/apache/cordova/CoreAndroid.java
  33. 0 31
      platforms/android/CordovaLib/src/org/apache/cordova/ExposedJsApi.java
  34. 0 66
      platforms/android/CordovaLib/src/org/apache/cordova/ICordovaClientCertRequest.java
  35. 0 33
      platforms/android/CordovaLib/src/org/apache/cordova/ICordovaCookieManager.java
  36. 0 38
      platforms/android/CordovaLib/src/org/apache/cordova/ICordovaHttpAuthHandler.java
  37. 0 244
      platforms/android/CordovaLib/src/org/apache/cordova/LOG.java
  38. 0 552
      platforms/android/CordovaLib/src/org/apache/cordova/NativeToJsMessageQueue.java
  39. 0 87
      platforms/android/CordovaLib/src/org/apache/cordova/PermissionHelper.java
  40. 0 70
      platforms/android/CordovaLib/src/org/apache/cordova/PluginEntry.java
  41. 0 580
      platforms/android/CordovaLib/src/org/apache/cordova/PluginManager.java
  42. 0 198
      platforms/android/CordovaLib/src/org/apache/cordova/PluginResult.java
  43. 0 76
      platforms/android/CordovaLib/src/org/apache/cordova/ResumeCallback.java
  44. 0 170
      platforms/android/CordovaLib/src/org/apache/cordova/Whitelist.java
  45. 0 62
      platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemCookieManager.java
  46. 0 53
      platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemExposedJsApi.java
  47. 0 270
      platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebChromeClient.java
  48. 0 88
      platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebView.java
  49. 0 369
      platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java
  50. 0 328
      platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewEngine.java
  51. 0 373
      platforms/android/android.json
  52. 0 415
      platforms/android/app/build.gradle
  53. BIN
      platforms/android/app/libs/x5core.aar
  54. 0 23
      platforms/android/app/repositories.gradle
  55. 0 22
      platforms/android/app/src/main/AndroidManifest.xml
  56. 0 36
      platforms/android/app/src/main/assets/www/cordova-js-src/android/nativeapiprovider.js
  57. 0 35
      platforms/android/app/src/main/assets/www/cordova-js-src/android/promptbasednativeapi.js
  58. 0 287
      platforms/android/app/src/main/assets/www/cordova-js-src/exec.js
  59. 0 122
      platforms/android/app/src/main/assets/www/cordova-js-src/platform.js
  60. 0 108
      platforms/android/app/src/main/assets/www/cordova-js-src/plugin/android/app.js
  61. 0 1904
      platforms/android/app/src/main/assets/www/cordova.js
  62. 0 251
      platforms/android/app/src/main/assets/www/cordova_plugins.js
  63. BIN
      platforms/android/app/src/main/assets/www/favicon.ico
  64. 0 1
      platforms/android/app/src/main/assets/www/index.html
  65. 0 120
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/DirectoryEntry.js
  66. 0 75
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/DirectoryReader.js
  67. 0 263
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/Entry.js
  68. 0 81
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/File.js
  69. 0 95
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileEntry.js
  70. 0 49
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileError.js
  71. 0 301
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileReader.js
  72. 0 58
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileSystem.js
  73. 0 44
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileUploadOptions.js
  74. 0 33
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileUploadResult.js
  75. 0 328
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileWriter.js
  76. 0 39
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/Flags.js
  77. 0 26
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/LocalFileSystem.js
  78. 0 43
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/Metadata.js
  79. 0 70
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/ProgressEvent.js
  80. 0 51
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/android/FileSystem.js
  81. 0 29
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/browser/isChrome.js
  82. 0 65
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/fileSystemPaths.js
  83. 0 49
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/fileSystems-roots.js
  84. 0 28
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/fileSystems.js
  85. 0 84
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/requestFileSystem.js
  86. 0 94
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js
  87. 0 35
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js
  88. 0 45
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/CaptureError.js
  89. 0 33
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js
  90. 0 37
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js
  91. 0 58
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/MediaFile.js
  92. 0 42
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/MediaFileData.js
  93. 0 47
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/android/init.js
  94. 0 85
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/capture.js
  95. 0 47
      platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/helpers.js
  96. 0 0
      platforms/android/app/src/main/assets/www/static/css/app.a7d19b57.css
  97. 0 0
      platforms/android/app/src/main/assets/www/static/js/app.e5c82ec7.js
  98. 0 0
      platforms/android/app/src/main/assets/www/static/js/chunk-vendors.e36198ac.js
  99. 0 41
      platforms/android/app/src/main/java/io/cordova/hellocordova/MainActivity.java
  100. 0 294
      platforms/android/app/src/main/java/org/apache/cordova/file/AssetFilesystem.java

+ 0 - 6
.gitignore

@@ -1,6 +0,0 @@
-.DS_Store
-
-# Generated by package manager
-node_modules/
-yarn.lock
-# Generated by Cordova

+ 0 - 8
LICENSE

@@ -1,8 +0,0 @@
-MIT License
-Copyright (c) <year> <copyright holders>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 0 - 47
README.md

@@ -1,47 +0,0 @@
-# 控制端
-```
-基于Vue,Cordova,可打包PC和Android
-Client.html.adnroid11 使用vue+vite module方式,适用android11版本以上,更快
-```
-## 功能
-
-- [x] 与云服务器建立 socket 连接,断开自动连接,重启 webrtc
-- [x] 与被控端建立 webrtc 音视频连接(单向)
-- [x] 按下说话功能(发送音频)
-- [x] 高德地图展示
-- [x] 信号展示
-- [x] 电量展示
-- [x] 离线状态展示
-
-## android
-```
-1. 打 debug-apk 包 cordova build android
-2. webrtc 依赖 cordova-plugin-webview-x5
-3. 摄像头|mic 权限需要用户手动打开
-4. 打 aab 包:cordova build android --prod --release -- -- --packageType=bundle
-```
-
-### PC 教程
-```
-1. cd Client.html
-2. npm install
-3. npm run build
-4. 找到 www 目录,上传至服务器即可
-```
-
-### android 教程
-```
-1. 执行完 PC 的步骤
-2. cordova build android 即可得到 debug 包
-3. 安卓 debug.apk 包即可
-```
-
-### more
-```
-1. 摇杆|手柄控制请参考https://git.caner.top/Caner/ESP8266-PS-Contrl
-```
-
-### 后续
-```
-更多使用方法会在抖音更新:Caner
-```    

+ 0 - 44
config.xml

@@ -1,44 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<widget id="io.cordova.hellocordova" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
-    <name>Contrl</name>
-    <description>
-        The remote end.
-    </description>
-    <author email="5658514@qq.com" href="https://caner.top">
-        Caner
-    </author>
-    <content src="index.html" />
-    <plugin name="cordova-plugin-whitelist" spec="1" />
-    <access origin="*" />
-    <allow-intent href="http://*/*" />
-    <allow-intent href="https://*/*" />
-    <allow-intent href="tel:*" />
-    <allow-intent href="sms:*" />
-    <allow-intent href="mailto:*" />
-    <allow-intent href="geo:*" />
-    <platform name="android" value="app">
-        <allow-intent href="market:*" />
-        <config-file parent="/*" target="AndroidManifest.xml">
-            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-            <uses-permission android:name="android.permission.CAMERA" />
-            <uses-permission android:name="android.permission.RECORD_AUDIO" />
-            <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
-        </config-file>    
-        <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
-            <activity android:usesCleartextTraffic="true" />
-        </edit-config>
-        <preference name="AndroidPersistentFileLocation" value="Compatibility" />
-        <preference name="android-targetSdkVersion" value="30" />
-        <!-- 图标 -->
-        <icon density="ldpi" src="res/icon/android/ldpi/icon.png" />
-        <icon density="mdpi" src="res/icon/android/mdpi/icon.png" />
-        <icon density="hdpi" src="res/icon/android/hdpi/icon.png" />
-        <icon density="xhdpi" src="res/icon/android/xhdpi/icon.png" />
-        <icon density="xxhdpi" src="res/icon/android/xxhdpi/icon.png" />
-        <icon density="xxxhdpi" src="res/icon/android/xxxhdpi/icon.png" />                
-    </platform>
-    <platform name="ios">
-        <allow-intent href="itms:*" />
-        <allow-intent href="itms-apps:*" />
-    </platform>
-</widget>

+ 0 - 32
package.json

@@ -1,32 +0,0 @@
-{
-  "name": "io.cordova.hellocordova",
-  "displayName": "HelloCordova",
-  "version": "1.0.0",
-  "description": "A sample Apache Cordova application that responds to the deviceready event.",
-  "main": "index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "keywords": [
-    "ecosystem:cordova"
-  ],
-  "author": "Caner",
-  "license": "Apache-2.0",
-  "devDependencies": {
-    "cordova-android": "^9.1.0",
-    "cordova-plugin-file": "^6.0.2",
-    "cordova-plugin-media-capture": "^3.0.3",
-    "cordova-plugin-webview-x5": "^0.3.2-alpha.1",
-    "cordova-plugin-whitelist": "^1.3.5"
-  },
-  "cordova": {
-    "plugins": {
-      "cordova-plugin-whitelist": {},
-      "cordova-plugin-webview-x5": {},
-      "cordova-plugin-media-capture": {}
-    },
-    "platforms": [
-      "android"
-    ]
-  }
-}

+ 0 - 21
platforms/android/.gitignore

@@ -1,21 +0,0 @@
-# Non-project-specific build files:
-build.xml
-local.properties
-/gradlew
-/gradlew.bat
-/gradle
-# Ant builds
-ant-build
-ant-gen
-# Eclipse builds
-gen
-out
-# Gradle build artifacts
-.gradle
-.gradletasknamecache
-/build
-/CordovaLib/build
-/app/build
-gradle-app.setting
-# Android Studio
-.idea

+ 0 - 22
platforms/android/CordovaLib/AndroidManifest.xml

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-       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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="org.apache.cordova" android:versionName="1.0" android:versionCode="1">
-</manifest>

+ 0 - 150
platforms/android/CordovaLib/build.gradle

@@ -1,150 +0,0 @@
-/* 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.
-*/
-
-ext {
-    apply from: 'cordova.gradle'
-    cdvCompileSdkVersion = privateHelpers.getProjectTarget()
-    cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()
-    if (project.hasProperty('cdvMinSdkVersion') && cdvMinSdkVersion.isInteger()) {
-        cdvMinSdkVersion = cdvMinSdkVersion as int
-        println '[Cordova] cdvMinSdkVersion is overridden, try it at your own risk.'
-    } else {
-        cdvMinSdkVersion = 22; // current Cordova's default
-    }
-}
-
-buildscript {
-    apply from: 'repositories.gradle'
-    repositories repos
-
-    dependencies {
-        // The gradle plugin and the maven plugin have to be updated after each version of Android
-        // studio comes out
-        classpath 'com.android.tools.build:gradle:4.0.0'
-        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
-        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
-    }
-}
-
-allprojects {
-    apply from: 'repositories.gradle'
-    repositories repos
-}
-
-apply plugin: 'com.android.library'
-apply plugin: 'com.github.dcendents.android-maven'
-apply plugin: 'com.jfrog.bintray'
-
-group = 'org.apache.cordova'
-version = '9.1.0'
-
-android {
-    compileSdkVersion cdvCompileSdkVersion
-    buildToolsVersion cdvBuildToolsVersion
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_8
-        targetCompatibility JavaVersion.VERSION_1_8
-    }
-
-    // For the Android Cordova Lib, we allow changing the minSdkVersion, but it is at the users own risk
-    defaultConfig {
-        minSdkVersion cdvMinSdkVersion
-    }
-
-    sourceSets {
-        main {
-            manifest.srcFile 'AndroidManifest.xml'
-            java.srcDirs = ['src']
-            resources.srcDirs = ['src']
-            aidl.srcDirs = ['src']
-            renderscript.srcDirs = ['src']
-            res.srcDirs = ['res']
-            assets.srcDirs = ['assets']
-        }
-    }
-
-    packagingOptions {
-        exclude 'META-INF/LICENSE'
-        exclude 'META-INF/LICENSE.txt'
-        exclude 'META-INF/DEPENDENCIES'
-        exclude 'META-INF/NOTICE'
-    }
-}
-
-install {
-    repositories.mavenInstaller {
-        pom {
-            project {
-                packaging 'aar'
-                name 'Cordova'
-                url 'https://cordova.apache.org'
-                licenses {
-                    license {
-                        name 'The Apache Software License, Version 2.0'
-                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-                    }
-                }
-                developers {
-                    developer {
-                        id 'stevengill'
-                        name 'Steve Gill'
-                    }
-                }
-                scm {
-                    connection 'scm:git:https://github.com/apache/cordova-android.git'
-                    developerConnection 'scm:git:git@github.com:apache/cordova-android.git'
-                    url 'https://github.com/apache/cordova-android'
-
-                }
-            }
-        }
-    }
-}
-
-task sourcesJar(type: Jar) {
-    from android.sourceSets.main.java.srcDirs
-    classifier = 'sources'
-}
-
-artifacts {
-    archives sourcesJar
-}
-
-bintray {
-    user = System.getenv('BINTRAY_USER')
-    key = System.getenv('BINTRAY_KEY')
-    configurations = ['archives']
-    pkg {
-        repo = 'maven'
-        name = 'cordova-android'
-        userOrg = 'cordova'
-        licenses = ['Apache-2.0']
-        vcsUrl = 'https://github.com/apache/cordova-android'
-        websiteUrl = 'https://cordova.apache.org'
-        issueTrackerUrl = 'https://github.com/apache/cordova-android/issues'
-        publicDownloadNumbers = true
-        licenses = ['Apache-2.0']
-        labels = ['android', 'cordova', 'phonegap']
-        version {
-            name = '9.1.0'
-            released = new Date()
-            vcsTag = '9.1.0'
-        }
-    }
-}

+ 0 - 205
platforms/android/CordovaLib/cordova.gradle

@@ -1,205 +0,0 @@
-/*
-       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.
-*/
-
-import java.util.regex.Pattern
-import groovy.swing.SwingBuilder
-import com.g00fy2.versioncompare.Version
-
-String doEnsureValueExists(filePath, props, key) {
-    if (props.get(key) == null) {
-        throw new GradleException(filePath + ': Missing key required "' + key + '"')
-    }
-    return props.get(key)
-}
-
-String doGetProjectTarget() {
-    def props = new Properties()
-    def propertiesFile = 'project.properties';
-    if(!(file(propertiesFile).exists())) {
-      propertiesFile = '../project.properties';
-    }
-    file(propertiesFile).withReader { reader ->
-        props.load(reader)
-    }
-    return doEnsureValueExists('project.properties', props, 'target')
-}
-
-Boolean isVersionValid(version) {
-    return !(new Version(version)).isEqual('0.0.0')
-}
-
-String doFindLatestInstalledBuildTools(String minBuildToolsVersionString) {
-    def buildToolsDirContents
-    try {
-        def buildToolsDir = new File(getAndroidSdkDir(), "build-tools")
-        buildToolsDirContents = buildToolsDir.list()
-    } catch (e) {
-        println "An exception occurred while trying to find the Android build tools."
-        throw e
-    }
-
-    def highestBuildToolsVersion = buildToolsDirContents
-        .collect { new Version(it) }
-        // Invalid inputs will be handled as 0.0.0
-        .findAll { it.isHigherThan('0.0.0') }
-        .max()
-
-    if (highestBuildToolsVersion == null) {
-        throw new RuntimeException("""
-            No installed build tools found. Install the Android build tools
-            version ${minBuildToolsVersionString} or higher.
-        """.replaceAll(/\s+/, ' ').trim())
-    }
-
-    if (highestBuildToolsVersion.isLowerThan(minBuildToolsVersionString)) {
-        throw new RuntimeException("""
-            No usable Android build tools found. Highest installed version is
-            ${highestBuildToolsVersion.getOriginalString()}; minimum version
-            required is ${minBuildToolsVersionString}.
-        """.replaceAll(/\s+/, ' ').trim())
-    }
-
-    highestBuildToolsVersion.getOriginalString()
-}
-
-String getAndroidSdkDir() {
-    def rootDir = project.rootDir
-    def androidSdkDir = null
-    String envVar = System.getenv("ANDROID_SDK_ROOT")
-    if (envVar == null) {
-        envVar = System.getenv("ANDROID_HOME")
-    }
-
-    def localProperties = new File(rootDir, 'local.properties')
-    String systemProperty = System.getProperty("android.home")
-    if (envVar != null) {
-        androidSdkDir = envVar
-    } else if (localProperties.exists()) {
-        Properties properties = new Properties()
-        localProperties.withInputStream { instr ->
-            properties.load(instr)
-        }
-        def sdkDirProp = properties.getProperty('sdk.dir')
-        if (sdkDirProp != null) {
-            androidSdkDir = sdkDirProp
-        } else {
-            sdkDirProp = properties.getProperty('android.dir')
-            if (sdkDirProp != null) {
-                androidSdkDir = (new File(rootDir, sdkDirProp)).getAbsolutePath()
-            }
-        }
-    }
-    if (androidSdkDir == null && systemProperty != null) {
-        androidSdkDir = systemProperty
-    }
-    if (androidSdkDir == null) {
-        throw new RuntimeException(
-            "Unable to determine Android SDK directory.")
-    }
-    androidSdkDir
-}
-
-def doExtractIntFromManifest(name) {
-    def manifestFile = file(android.sourceSets.main.manifest.srcFile)
-    def pattern = Pattern.compile(name + "=\"(\\d+)\"")
-    def matcher = pattern.matcher(manifestFile.getText())
-    matcher.find()
-    return new BigInteger(matcher.group(1))
-}
-
-def doExtractStringFromManifest(name) {
-    def manifestFile = file(android.sourceSets.main.manifest.srcFile)
-    def pattern = Pattern.compile(name + "=\"(\\S+)\"")
-    def matcher = pattern.matcher(manifestFile.getText())
-    matcher.find()
-    return matcher.group(1)
-}
-
-def doPromptForPassword(msg) {
-    if (System.console() == null) {
-        def ret = null
-        new SwingBuilder().edt {
-            dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true) {
-                vbox {
-                    label(text: msg)
-                    def input = passwordField()
-                    button(defaultButton: true, text: 'OK', actionPerformed: {
-                        ret = input.password;
-                        dispose();
-                    })
-                }
-            }
-        }
-        if (!ret) {
-            throw new GradleException('User canceled build')
-        }
-        return new String(ret)
-    } else {
-        return System.console().readPassword('\n' + msg);
-    }
-}
-
-def doGetConfigXml() {
-    def xml = file("src/main/res/xml/config.xml").getText()
-    // Disable namespace awareness since Cordova doesn't use them properly
-    return new XmlParser(false, false).parseText(xml)
-}
-
-def doGetConfigPreference(name, defaultValue) {
-    name = name.toLowerCase()
-    def root = doGetConfigXml()
-
-    def ret = defaultValue
-    root.preference.each { it ->
-        def attrName = it.attribute("name")
-        if (attrName && attrName.toLowerCase() == name) {
-            ret = it.attribute("value")
-        }
-    }
-    return ret
-}
-
-// Properties exported here are visible to all plugins.
-ext {
-    // These helpers are shared, but are not guaranteed to be stable / unchanged.
-    privateHelpers = {}
-    privateHelpers.getProjectTarget = { doGetProjectTarget() }
-    privateHelpers.findLatestInstalledBuildTools = { doFindLatestInstalledBuildTools('19.1.0') }
-    privateHelpers.extractIntFromManifest = { name -> doExtractIntFromManifest(name) }
-    privateHelpers.extractStringFromManifest = { name -> doExtractStringFromManifest(name) }
-    privateHelpers.promptForPassword = { msg -> doPromptForPassword(msg) }
-    privateHelpers.ensureValueExists = { filePath, props, key -> doEnsureValueExists(filePath, props, key) }
-
-    // These helpers can be used by plugins / projects and will not change.
-    cdvHelpers = {}
-    // Returns a XmlParser for the config.xml. Added in 4.1.0.
-    cdvHelpers.getConfigXml = { doGetConfigXml() }
-    // Returns the value for the desired <preference>. Added in 4.1.0.
-    cdvHelpers.getConfigPreference = { name, defaultValue -> doGetConfigPreference(name, defaultValue) }
-}
-
-buildscript {
-    repositories {
-        jcenter()
-    }
-
-    dependencies {
-        classpath 'com.g00fy2:versioncompare:1.3.4@jar'
-    }
-}

+ 0 - 11
platforms/android/CordovaLib/project.properties

@@ -1,11 +0,0 @@
-# This file was originally created by the Android Tools, but is now
-# used by cordova-android to manage the project configuration.
-
-# Indicates whether an apk should be generated for each density.
-split.density=false
-
-# Project target.
-target=android-29
-apk-configurations=
-renderscript.opt.level=O0
-android.library=true

+ 0 - 22
platforms/android/CordovaLib/repositories.gradle

@@ -1,22 +0,0 @@
-/* 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.
-*/
-
-ext.repos = {
-    google()
-    jcenter()
-}

+ 0 - 69
platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java

@@ -1,69 +0,0 @@
-/*
-       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;
-
-/**
- * The Class AuthenticationToken defines the userName and password to be used for authenticating a web resource
- */
-public class AuthenticationToken {
-    private String userName;
-    private String password;
-
-    /**
-     * Gets the user name.
-     *
-     * @return the user name
-     */
-    public String getUserName() {
-        return userName;
-    }
-
-    /**
-     * Sets the user name.
-     *
-     * @param userName
-     *            the new user name
-     */
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    /**
-     * Gets the password.
-     *
-     * @return the password
-     */
-    public String getPassword() {
-        return password;
-    }
-
-    /**
-     * Sets the password.
-     *
-     * @param password
-     *            the new password
-     */
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-
-
-
-}

+ 0 - 73
platforms/android/CordovaLib/src/org/apache/cordova/BuildHelper.java

@@ -1,73 +0,0 @@
-/*
-       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;
-
-/*
- * This is a utility class that allows us to get the BuildConfig variable, which is required
- * for the use of different providers.  This is not guaranteed to work, and it's better for this
- * to be set in the build step in config.xml
- *
- */
-
-import android.app.Activity;
-import android.content.Context;
-
-import java.lang.reflect.Field;
-
-
-public class BuildHelper {
-
-
-    private static String TAG="BuildHelper";
-
-    /*
-     * This needs to be implemented if you wish to use the Camera Plugin or other plugins
-     * that read the Build Configuration.
-     *
-     * Thanks to Phil@Medtronic and Graham Borland for finding the answer and posting it to
-     * StackOverflow.  This is annoying as hell!  However, this method does not work with
-     * ProGuard, and you should use the config.xml to define the application_id
-     *
-     */
-
-    public static Object getBuildConfigValue(Context ctx, String key)
-    {
-        try
-        {
-            Class<?> clazz = Class.forName(ctx.getClass().getPackage().getName() + ".BuildConfig");
-            Field field = clazz.getField(key);
-            return field.get(null);
-        } catch (ClassNotFoundException e) {
-            LOG.d(TAG, "Unable to get the BuildConfig, is this built with ANT?");
-            e.printStackTrace();
-        } catch (NoSuchFieldException e) {
-            LOG.d(TAG, key + " is not a valid field. Check your build.gradle");
-        } catch (IllegalAccessException e) {
-            LOG.d(TAG, "Illegal Access Exception: Let's print a stack trace.");
-            e.printStackTrace();
-        } catch (NullPointerException e) {
-            LOG.d(TAG, "Null Pointer Exception: Let's print a stack trace.");
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-
-}

+ 0 - 142
platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java

@@ -1,142 +0,0 @@
-/*
-       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;
-
-import org.json.JSONArray;
-
-import org.apache.cordova.CordovaWebView;
-import org.apache.cordova.PluginResult;
-import org.json.JSONObject;
-
-public class CallbackContext {
-    private static final String LOG_TAG = "CordovaPlugin";
-
-    private String callbackId;
-    private CordovaWebView webView;
-    protected boolean finished;
-    private int changingThreads;
-
-    public CallbackContext(String callbackId, CordovaWebView webView) {
-        this.callbackId = callbackId;
-        this.webView = webView;
-    }
-
-    public boolean isFinished() {
-        return finished;
-    }
-
-    public boolean isChangingThreads() {
-        return changingThreads > 0;
-    }
-
-    public String getCallbackId() {
-        return callbackId;
-    }
-
-    public void sendPluginResult(PluginResult pluginResult) {
-        synchronized (this) {
-            if (finished) {
-                LOG.w(LOG_TAG, "Attempted to send a second callback for ID: " + callbackId + "\nResult was: " + pluginResult.getMessage());
-                return;
-            } else {
-                finished = !pluginResult.getKeepCallback();
-            }
-        }
-        webView.sendPluginResult(pluginResult, callbackId);
-    }
-
-    /**
-     * Helper for success callbacks that just returns the Status.OK by default
-     *
-     * @param message           The message to add to the success result.
-     */
-    public void success(JSONObject message) {
-        sendPluginResult(new PluginResult(PluginResult.Status.OK, message));
-    }
-
-    /**
-     * Helper for success callbacks that just returns the Status.OK by default
-     *
-     * @param message           The message to add to the success result.
-     */
-    public void success(String message) {
-        sendPluginResult(new PluginResult(PluginResult.Status.OK, message));
-    }
-
-    /**
-     * Helper for success callbacks that just returns the Status.OK by default
-     *
-     * @param message           The message to add to the success result.
-     */
-    public void success(JSONArray message) {
-        sendPluginResult(new PluginResult(PluginResult.Status.OK, message));
-    }
-
-    /**
-     * Helper for success callbacks that just returns the Status.OK by default
-     *
-     * @param message           The message to add to the success result.
-     */
-    public void success(byte[] message) {
-        sendPluginResult(new PluginResult(PluginResult.Status.OK, message));
-    }
-
-    /**
-     * Helper for success callbacks that just returns the Status.OK by default
-     *
-     * @param message           The message to add to the success result.
-     */
-    public void success(int message) {
-        sendPluginResult(new PluginResult(PluginResult.Status.OK, message));
-    }
-
-    /**
-     * Helper for success callbacks that just returns the Status.OK by default
-     */
-    public void success() {
-        sendPluginResult(new PluginResult(PluginResult.Status.OK));
-    }
-
-    /**
-     * Helper for error callbacks that just returns the Status.ERROR by default
-     *
-     * @param message           The message to add to the error result.
-     */
-    public void error(JSONObject message) {
-        sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message));
-    }
-
-    /**
-     * Helper for error callbacks that just returns the Status.ERROR by default
-     *
-     * @param message           The message to add to the error result.
-     */
-    public void error(String message) {
-        sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message));
-    }
-
-    /**
-     * Helper for error callbacks that just returns the Status.ERROR by default
-     *
-     * @param message           The message to add to the error result.
-     */
-    public void error(int message) {
-        sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message));
-    }
-}

+ 0 - 65
platforms/android/CordovaLib/src/org/apache/cordova/CallbackMap.java

@@ -1,65 +0,0 @@
-/*
-       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;
-
-import android.util.Pair;
-import android.util.SparseArray;
-
-/**
- * Provides a collection that maps unique request codes to CordovaPlugins and Integers.
- * Used to ensure that when plugins make requests for runtime permissions, those requests do not
- * collide with requests from other plugins that use the same request code value.
- */
-public class CallbackMap {
-    private int currentCallbackId = 0;
-    private SparseArray<Pair<CordovaPlugin, Integer>> callbacks;
-
-    public CallbackMap() {
-        this.callbacks = new SparseArray<Pair<CordovaPlugin, Integer>>();
-    }
-
-    /**
-     * Stores a CordovaPlugin and request code and returns a new unique request code to use
-     * in a permission request.
-     *
-     * @param receiver      The plugin that is making the request
-     * @param requestCode   The original request code used by the plugin
-     * @return              A unique request code that can be used to retrieve this callback
-     *                      with getAndRemoveCallback()
-     */
-    public synchronized int registerCallback(CordovaPlugin receiver, int requestCode) {
-        int mappedId = this.currentCallbackId++;
-        callbacks.put(mappedId, new Pair<CordovaPlugin, Integer>(receiver, requestCode));
-        return mappedId;
-    }
-
-    /**
-     * Retrieves and removes a callback stored in the map using the mapped request code
-     * obtained from registerCallback()
-     *
-     * @param mappedId      The request code obtained from registerCallback()
-     * @return              The CordovaPlugin and orignal request code that correspond to the
-     *                      given mappedCode
-     */
-    public synchronized Pair<CordovaPlugin, Integer> getAndRemoveCallback(int mappedId) {
-        Pair<CordovaPlugin, Integer> callback = callbacks.get(mappedId);
-        callbacks.remove(mappedId);
-        return callback;
-    }
-}

+ 0 - 71
platforms/android/CordovaLib/src/org/apache/cordova/Config.java

@@ -1,71 +0,0 @@
-/*
-       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;
-
-import java.util.List;
-
-import android.app.Activity;
-
-@Deprecated // Use Whitelist, CordovaPrefences, etc. directly.
-public class Config {
-    private static final String TAG = "Config";
-
-    static ConfigXmlParser parser;
-
-    private Config() {
-    }
-
-    public static void init(Activity action) {
-        parser = new ConfigXmlParser();
-        parser.parse(action);
-        //TODO: Add feature to bring this back.  Some preferences should be overridden by intents, but not all
-        parser.getPreferences().setPreferencesBundle(action.getIntent().getExtras());
-    }
-
-    // Intended to be used for testing only; creates an empty configuration.
-    public static void init() {
-        if (parser == null) {
-            parser = new ConfigXmlParser();
-        }
-    }
-
-    public static String getStartUrl() {
-        if (parser == null) {
-            return "file:///android_asset/www/index.html";
-        }
-        return parser.getLaunchUrl();
-    }
-
-    public static String getErrorUrl() {
-        return parser.getPreferences().getString("errorurl", null);
-    }
-
-    public static List<PluginEntry> getPluginEntries() {
-        return parser.getPluginEntries();
-    }
-
-    public static CordovaPreferences getPreferences() {
-        return parser.getPreferences();
-    }
-
-    public static boolean isInitialized() {
-        return parser != null;
-    }
-}

+ 0 - 145
platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java

@@ -1,145 +0,0 @@
-/*
-       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;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.Context;
-
-public class ConfigXmlParser {
-    private static String TAG = "ConfigXmlParser";
-
-    private String launchUrl = "file:///android_asset/www/index.html";
-    private CordovaPreferences prefs = new CordovaPreferences();
-    private ArrayList<PluginEntry> pluginEntries = new ArrayList<PluginEntry>(20);
-
-    public CordovaPreferences getPreferences() {
-        return prefs;
-    }
-
-    public ArrayList<PluginEntry> getPluginEntries() {
-        return pluginEntries;
-    }
-
-    public String getLaunchUrl() {
-        return launchUrl;
-    }
-
-    public void parse(Context action) {
-        // First checking the class namespace for config.xml
-        int id = action.getResources().getIdentifier("config", "xml", action.getClass().getPackage().getName());
-        if (id == 0) {
-            // If we couldn't find config.xml there, we'll look in the namespace from AndroidManifest.xml
-            id = action.getResources().getIdentifier("config", "xml", action.getPackageName());
-            if (id == 0) {
-                LOG.e(TAG, "res/xml/config.xml is missing!");
-                return;
-            }
-        }
-        parse(action.getResources().getXml(id));
-    }
-
-    boolean insideFeature = false;
-    String service = "", pluginClass = "", paramType = "";
-    boolean onload = false;
-
-    public void parse(XmlPullParser xml) {
-        int eventType = -1;
-
-        while (eventType != XmlPullParser.END_DOCUMENT) {
-            if (eventType == XmlPullParser.START_TAG) {
-                handleStartTag(xml);
-            }
-            else if (eventType == XmlPullParser.END_TAG)
-            {
-                handleEndTag(xml);
-            }
-            try {
-                eventType = xml.next();
-            } catch (XmlPullParserException e) {
-                e.printStackTrace();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    public void handleStartTag(XmlPullParser xml) {
-        String strNode = xml.getName();
-        if (strNode.equals("feature")) {
-            //Check for supported feature sets  aka. plugins (Accelerometer, Geolocation, etc)
-            //Set the bit for reading params
-            insideFeature = true;
-            service = xml.getAttributeValue(null, "name");
-        }
-        else if (insideFeature && strNode.equals("param")) {
-            paramType = xml.getAttributeValue(null, "name");
-            if (paramType.equals("service")) // check if it is using the older service param
-                service = xml.getAttributeValue(null, "value");
-            else if (paramType.equals("package") || paramType.equals("android-package"))
-                pluginClass = xml.getAttributeValue(null,"value");
-            else if (paramType.equals("onload"))
-                onload = "true".equals(xml.getAttributeValue(null, "value"));
-        }
-        else if (strNode.equals("preference")) {
-            String name = xml.getAttributeValue(null, "name").toLowerCase(Locale.ENGLISH);
-            String value = xml.getAttributeValue(null, "value");
-            prefs.set(name, value);
-        }
-        else if (strNode.equals("content")) {
-            String src = xml.getAttributeValue(null, "src");
-            if (src != null) {
-                setStartUrl(src);
-            }
-        }
-    }
-
-    public void handleEndTag(XmlPullParser xml) {
-        String strNode = xml.getName();
-        if (strNode.equals("feature")) {
-            pluginEntries.add(new PluginEntry(service, pluginClass, onload));
-
-            service = "";
-            pluginClass = "";
-            insideFeature = false;
-            onload = false;
-        }
-    }
-
-    private void setStartUrl(String src) {
-        Pattern schemeRegex = Pattern.compile("^[a-z-]+://");
-        Matcher matcher = schemeRegex.matcher(src);
-        if (matcher.find()) {
-            launchUrl = src;
-        } else {
-            if (src.charAt(0) == '/') {
-                src = src.substring(1);
-            }
-            launchUrl = "file:///android_asset/www/" + src;
-        }
-    }
-}

+ 0 - 528
platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java

@@ -1,528 +0,0 @@
-/*
-       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;
-
-import java.util.ArrayList;
-import java.util.Locale;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.annotation.SuppressLint;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.graphics.Color;
-import android.media.AudioManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.webkit.WebViewClient;
-import android.widget.FrameLayout;
-
-/**
- * This class is the main Android activity that represents the Cordova
- * application. It should be extended by the user to load the specific
- * html file that contains the application.
- *
- * As an example:
- *
- * <pre>
- *     package org.apache.cordova.examples;
- *
- *     import android.os.Bundle;
- *     import org.apache.cordova.*;
- *
- *     public class Example extends CordovaActivity {
- *       &#64;Override
- *       public void onCreate(Bundle savedInstanceState) {
- *         super.onCreate(savedInstanceState);
- *         super.init();
- *         // Load your application
- *         loadUrl(launchUrl);
- *       }
- *     }
- * </pre>
- *
- * Cordova xml configuration: Cordova uses a configuration file at
- * res/xml/config.xml to specify its settings. See "The config.xml File"
- * guide in cordova-docs at http://cordova.apache.org/docs for the documentation
- * for the configuration. The use of the set*Property() methods is
- * deprecated in favor of the config.xml file.
- *
- */
-public class CordovaActivity extends Activity {
-    public static String TAG = "CordovaActivity";
-
-    // The webview for our app
-    protected CordovaWebView appView;
-
-    private static int ACTIVITY_STARTING = 0;
-    private static int ACTIVITY_RUNNING = 1;
-    private static int ACTIVITY_EXITING = 2;
-
-    // Keep app running when pause is received. (default = true)
-    // If true, then the JavaScript and native code continue to run in the background
-    // when another application (activity) is started.
-    protected boolean keepRunning = true;
-
-    // Flag to keep immersive mode if set to fullscreen
-    protected boolean immersiveMode;
-
-    // Read from config.xml:
-    protected CordovaPreferences preferences;
-    protected String launchUrl;
-    protected ArrayList<PluginEntry> pluginEntries;
-    protected CordovaInterfaceImpl cordovaInterface;
-
-    /**
-     * Called when the activity is first created.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        // need to activate preferences before super.onCreate to avoid "requestFeature() must be called before adding content" exception
-        loadConfig();
-
-        String logLevel = preferences.getString("loglevel", "ERROR");
-        LOG.setLogLevel(logLevel);
-
-        LOG.i(TAG, "Apache Cordova native platform version " + CordovaWebView.CORDOVA_VERSION + " is starting");
-        LOG.d(TAG, "CordovaActivity.onCreate()");
-
-        if (!preferences.getBoolean("ShowTitle", false)) {
-            getWindow().requestFeature(Window.FEATURE_NO_TITLE);
-        }
-
-        if (preferences.getBoolean("SetFullscreen", false)) {
-            LOG.d(TAG, "The SetFullscreen configuration is deprecated in favor of Fullscreen, and will be removed in a future version.");
-            preferences.set("Fullscreen", true);
-        }
-        if (preferences.getBoolean("Fullscreen", false)) {
-            // NOTE: use the FullscreenNotImmersive configuration key to set the activity in a REAL full screen
-            // (as was the case in previous cordova versions)
-            if (!preferences.getBoolean("FullscreenNotImmersive", false)) {
-                immersiveMode = true;
-                // The splashscreen plugin needs the flags set before we're focused to prevent
-                // the nav and title bars from flashing in.
-                setImmersiveUiVisibility();
-            } else {
-                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
-                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
-            }
-        } else {
-            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,
-                    WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
-        }
-
-        super.onCreate(savedInstanceState);
-
-        cordovaInterface = makeCordovaInterface();
-        if (savedInstanceState != null) {
-            cordovaInterface.restoreInstanceState(savedInstanceState);
-        }
-    }
-
-    protected void init() {
-        appView = makeWebView();
-        createViews();
-        if (!appView.isInitialized()) {
-            appView.init(cordovaInterface, pluginEntries, preferences);
-        }
-        cordovaInterface.onCordovaInit(appView.getPluginManager());
-
-        // Wire the hardware volume controls to control media if desired.
-        String volumePref = preferences.getString("DefaultVolumeStream", "");
-        if ("media".equals(volumePref.toLowerCase(Locale.ENGLISH))) {
-            setVolumeControlStream(AudioManager.STREAM_MUSIC);
-        }
-    }
-
-    @SuppressWarnings("deprecation")
-    protected void loadConfig() {
-        ConfigXmlParser parser = new ConfigXmlParser();
-        parser.parse(this);
-        preferences = parser.getPreferences();
-        preferences.setPreferencesBundle(getIntent().getExtras());
-        launchUrl = parser.getLaunchUrl();
-        pluginEntries = parser.getPluginEntries();
-        Config.parser = parser;
-    }
-
-    //Suppressing warnings in AndroidStudio
-    @SuppressWarnings({"deprecation", "ResourceType"})
-    protected void createViews() {
-        //Why are we setting a constant as the ID? This should be investigated
-        appView.getView().setId(100);
-        appView.getView().setLayoutParams(new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT));
-
-        setContentView(appView.getView());
-
-        if (preferences.contains("BackgroundColor")) {
-            try {
-                int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK);
-                // Background of activity:
-                appView.getView().setBackgroundColor(backgroundColor);
-            }
-            catch (NumberFormatException e){
-                e.printStackTrace();
-            }
-        }
-
-        appView.getView().requestFocusFromTouch();
-    }
-
-    /**
-     * Construct the default web view object.
-     * <p/>
-     * Override this to customize the webview that is used.
-     */
-    protected CordovaWebView makeWebView() {
-        return new CordovaWebViewImpl(makeWebViewEngine());
-    }
-
-    protected CordovaWebViewEngine makeWebViewEngine() {
-        return CordovaWebViewImpl.createEngine(this, preferences);
-    }
-
-    protected CordovaInterfaceImpl makeCordovaInterface() {
-        return new CordovaInterfaceImpl(this) {
-            @Override
-            public Object onMessage(String id, Object data) {
-                // Plumb this to CordovaActivity.onMessage for backwards compatibility
-                return CordovaActivity.this.onMessage(id, data);
-            }
-        };
-    }
-
-    /**
-     * Load the url into the webview.
-     */
-    public void loadUrl(String url) {
-        if (appView == null) {
-            init();
-        }
-
-        // If keepRunning
-        this.keepRunning = preferences.getBoolean("KeepRunning", true);
-
-        appView.loadUrlIntoView(url, true);
-    }
-
-    /**
-     * Called when the system is about to start resuming a previous activity.
-     */
-    @Override
-    protected void onPause() {
-        super.onPause();
-        LOG.d(TAG, "Paused the activity.");
-
-        if (this.appView != null) {
-            // CB-9382 If there is an activity that started for result and main activity is waiting for callback
-            // result, we shoudn't stop WebView Javascript timers, as activity for result might be using them
-            boolean keepRunning = this.keepRunning || this.cordovaInterface.activityResultCallback != null;
-            this.appView.handlePause(keepRunning);
-        }
-    }
-
-    /**
-     * Called when the activity receives a new intent
-     */
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        //Forward to plugins
-        if (this.appView != null)
-            this.appView.onNewIntent(intent);
-    }
-
-    /**
-     * Called when the activity will start interacting with the user.
-     */
-    @Override
-    protected void onResume() {
-        super.onResume();
-        LOG.d(TAG, "Resumed the activity.");
-
-        if (this.appView == null) {
-            return;
-        }
-        if (! this.getWindow().getDecorView().hasFocus()) {
-            // Force window to have focus, so application always
-            // receive user input. Workaround for some devices (Samsung Galaxy Note 3 at least)
-            this.getWindow().getDecorView().requestFocus();
-        }
-
-        this.appView.handleResume(this.keepRunning);
-    }
-
-    /**
-     * Called when the activity is no longer visible to the user.
-     */
-    @Override
-    protected void onStop() {
-        super.onStop();
-        LOG.d(TAG, "Stopped the activity.");
-
-        if (this.appView == null) {
-            return;
-        }
-        this.appView.handleStop();
-    }
-
-    /**
-     * Called when the activity is becoming visible to the user.
-     */
-    @Override
-    protected void onStart() {
-        super.onStart();
-        LOG.d(TAG, "Started the activity.");
-
-        if (this.appView == null) {
-            return;
-        }
-        this.appView.handleStart();
-    }
-
-    /**
-     * The final call you receive before your activity is destroyed.
-     */
-    @Override
-    public void onDestroy() {
-        LOG.d(TAG, "CordovaActivity.onDestroy()");
-        super.onDestroy();
-
-        if (this.appView != null) {
-            appView.handleDestroy();
-        }
-    }
-
-    /**
-     * Called when view focus is changed
-     */
-    @Override
-    public void onWindowFocusChanged(boolean hasFocus) {
-        super.onWindowFocusChanged(hasFocus);
-        if (hasFocus && immersiveMode) {
-            setImmersiveUiVisibility();
-        }
-    }
-
-    @SuppressLint("InlinedApi")
-    protected void setImmersiveUiVisibility() {
-        final int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
-                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
-                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
-                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
-                | View.SYSTEM_UI_FLAG_FULLSCREEN
-                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
-
-        getWindow().getDecorView().setSystemUiVisibility(uiOptions);
-    }
-
-    @SuppressLint("NewApi")
-    @Override
-    public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
-        // Capture requestCode here so that it is captured in the setActivityResultCallback() case.
-        cordovaInterface.setActivityResultRequestCode(requestCode);
-        super.startActivityForResult(intent, requestCode, options);
-    }
-
-    /**
-     * Called when an activity you launched exits, giving you the requestCode you started it with,
-     * the resultCode it returned, and any additional data from it.
-     *
-     * @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").
-     */
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
-        LOG.d(TAG, "Incoming Result. Request code = " + requestCode);
-        super.onActivityResult(requestCode, resultCode, intent);
-        cordovaInterface.onActivityResult(requestCode, resultCode, intent);
-    }
-
-    /**
-     * Report an error to the host application. These errors are unrecoverable (i.e. the main resource is unavailable).
-     * The errorCode parameter corresponds to one of the ERROR_* constants.
-     *
-     * @param errorCode   The error code corresponding to an ERROR_* value.
-     * @param description A String describing the error.
-     * @param failingUrl  The url that failed to load.
-     */
-    public void onReceivedError(final int errorCode, final String description, final String failingUrl) {
-        final CordovaActivity me = this;
-
-        // If errorUrl specified, then load it
-        final String errorUrl = preferences.getString("errorUrl", null);
-        if ((errorUrl != null) && (!failingUrl.equals(errorUrl)) && (appView != null)) {
-            // Load URL on UI thread
-            me.runOnUiThread(new Runnable() {
-                public void run() {
-                    me.appView.showWebPage(errorUrl, false, true, null);
-                }
-            });
-        }
-        // If not, then display error dialog
-        else {
-            final boolean exit = !(errorCode == WebViewClient.ERROR_HOST_LOOKUP);
-            me.runOnUiThread(new Runnable() {
-                public void run() {
-                    if (exit) {
-                        me.appView.getView().setVisibility(View.GONE);
-                        me.displayError("Application Error", description + " (" + failingUrl + ")", "OK", exit);
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * Display an error dialog and optionally exit application.
-     */
-    public void displayError(final String title, final String message, final String button, final boolean exit) {
-        final CordovaActivity me = this;
-        me.runOnUiThread(new Runnable() {
-            public void run() {
-                try {
-                    AlertDialog.Builder dlg = new AlertDialog.Builder(me);
-                    dlg.setMessage(message);
-                    dlg.setTitle(title);
-                    dlg.setCancelable(false);
-                    dlg.setPositiveButton(button,
-                            new AlertDialog.OnClickListener() {
-                                public void onClick(DialogInterface dialog, int which) {
-                                    dialog.dismiss();
-                                    if (exit) {
-                                        finish();
-                                    }
-                                }
-                            });
-                    dlg.create();
-                    dlg.show();
-                } catch (Exception e) {
-                    finish();
-                }
-            }
-        });
-    }
-
-    /*
-     * Hook in Cordova for menu plugins
-     */
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        if (appView != null) {
-            appView.getPluginManager().postMessage("onCreateOptionsMenu", menu);
-        }
-        return super.onCreateOptionsMenu(menu);
-    }
-
-    @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
-        if (appView != null) {
-            appView.getPluginManager().postMessage("onPrepareOptionsMenu", menu);
-        }
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (appView != null) {
-            appView.getPluginManager().postMessage("onOptionsItemSelected", item);
-        }
-        return true;
-    }
-
-    /**
-     * Called when a message is sent to plugin.
-     *
-     * @param id   The message id
-     * @param data The message data
-     * @return Object or null
-     */
-    public Object onMessage(String id, Object data) {
-        if ("onReceivedError".equals(id)) {
-            JSONObject d = (JSONObject) data;
-            try {
-                this.onReceivedError(d.getInt("errorCode"), d.getString("description"), d.getString("url"));
-            } catch (JSONException e) {
-                e.printStackTrace();
-            }
-        } else if ("exit".equals(id)) {
-            finish();
-        }
-        return null;
-    }
-
-    protected void onSaveInstanceState(Bundle outState) {
-        cordovaInterface.onSaveInstanceState(outState);
-        super.onSaveInstanceState(outState);
-    }
-
-    /**
-     * Called by the system when the device configuration changes while your activity is running.
-     *
-     * @param newConfig The new device configuration
-     */
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        if (this.appView == null) {
-            return;
-        }
-        PluginManager pm = this.appView.getPluginManager();
-        if (pm != null) {
-            pm.onConfigurationChanged(newConfig);
-        }
-    }
-
-    /**
-     * Called by the system when the user grants permissions
-     *
-     * @param requestCode
-     * @param permissions
-     * @param grantResults
-     */
-    @Override
-    public void onRequestPermissionsResult(int requestCode, String permissions[],
-                                           int[] grantResults) {
-        try
-        {
-            cordovaInterface.onRequestPermissionResult(requestCode, permissions, grantResults);
-        }
-        catch (JSONException e)
-        {
-            LOG.d(TAG, "JSONException: Parameters fed into the method are not valid");
-            e.printStackTrace();
-        }
-
-    }
-
-}

+ 0 - 113
platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java

@@ -1,113 +0,0 @@
-/*
-       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;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.util.Base64;
-
-public class CordovaArgs {
-    private JSONArray baseArgs;
-
-    public CordovaArgs(JSONArray args) {
-        this.baseArgs = args;
-    }
-
-
-    // Pass through the basics to the base args.
-    public Object get(int index) throws JSONException {
-        return baseArgs.get(index);
-    }
-
-    public boolean getBoolean(int index) throws JSONException {
-        return baseArgs.getBoolean(index);
-    }
-
-    public double getDouble(int index) throws JSONException {
-        return baseArgs.getDouble(index);
-    }
-
-    public int getInt(int index) throws JSONException {
-        return baseArgs.getInt(index);
-    }
-
-    public JSONArray getJSONArray(int index) throws JSONException {
-        return baseArgs.getJSONArray(index);
-    }
-
-    public JSONObject getJSONObject(int index) throws JSONException {
-        return baseArgs.getJSONObject(index);
-    }
-
-    public long getLong(int index) throws JSONException {
-        return baseArgs.getLong(index);
-    }
-
-    public String getString(int index) throws JSONException {
-        return baseArgs.getString(index);
-    }
-
-
-    public Object opt(int index) {
-        return baseArgs.opt(index);
-    }
-
-    public boolean optBoolean(int index) {
-        return baseArgs.optBoolean(index);
-    }
-
-    public double optDouble(int index) {
-        return baseArgs.optDouble(index);
-    }
-
-    public int optInt(int index) {
-        return baseArgs.optInt(index);
-    }
-
-    public JSONArray optJSONArray(int index) {
-        return baseArgs.optJSONArray(index);
-    }
-
-    public JSONObject optJSONObject(int index) {
-        return baseArgs.optJSONObject(index);
-    }
-
-    public long optLong(int index) {
-        return baseArgs.optLong(index);
-    }
-
-    public String optString(int index) {
-        return baseArgs.optString(index);
-    }
-
-    public boolean isNull(int index) {
-        return baseArgs.isNull(index);
-    }
-
-
-    // The interesting custom helpers.
-    public byte[] getArrayBuffer(int index) throws JSONException {
-        String encoded = baseArgs.getString(index);
-        return Base64.decode(encoded, Base64.DEFAULT);
-    }
-}
-
-

+ 0 - 186
platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java

@@ -1,186 +0,0 @@
-/*
-       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;
-
-import android.annotation.SuppressLint;
-
-import java.security.SecureRandom;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-
-/**
- * Contains APIs that the JS can call. All functions in here should also have
- * an equivalent entry in CordovaChromeClient.java, and be added to
- * cordova-js/lib/android/plugin/android/promptbasednativeapi.js
- */
-public class CordovaBridge {
-    private static final String LOG_TAG = "CordovaBridge";
-    private PluginManager pluginManager;
-    private NativeToJsMessageQueue jsMessageQueue;
-    private volatile int expectedBridgeSecret = -1; // written by UI thread, read by JS thread.
-
-    public CordovaBridge(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue) {
-        this.pluginManager = pluginManager;
-        this.jsMessageQueue = jsMessageQueue;
-    }
-
-    public String jsExec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException {
-        if (!verifySecret("exec()", bridgeSecret)) {
-            return null;
-        }
-        // If the arguments weren't received, send a message back to JS.  It will switch bridge modes and try again.  See CB-2666.
-        // We send a message meant specifically for this case.  It starts with "@" so no other message can be encoded into the same string.
-        if (arguments == null) {
-            return "@Null arguments.";
-        }
-
-        jsMessageQueue.setPaused(true);
-        try {
-            // Tell the resourceApi what thread the JS is running on.
-            CordovaResourceApi.jsThread = Thread.currentThread();
-
-            pluginManager.exec(service, action, callbackId, arguments);
-            String ret = null;
-            if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) {
-                ret = jsMessageQueue.popAndEncode(false);
-            }
-            return ret;
-        } catch (Throwable e) {
-            e.printStackTrace();
-            return "";
-        } finally {
-            jsMessageQueue.setPaused(false);
-        }
-    }
-
-    public void jsSetNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException {
-        if (!verifySecret("setNativeToJsBridgeMode()", bridgeSecret)) {
-            return;
-        }
-        jsMessageQueue.setBridgeMode(value);
-    }
-
-    public String jsRetrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException {
-        if (!verifySecret("retrieveJsMessages()", bridgeSecret)) {
-            return null;
-        }
-        return jsMessageQueue.popAndEncode(fromOnlineEvent);
-    }
-
-    private boolean verifySecret(String action, int bridgeSecret) throws IllegalAccessException {
-        if (!jsMessageQueue.isBridgeEnabled()) {
-            if (bridgeSecret == -1) {
-                LOG.d(LOG_TAG, action + " call made before bridge was enabled.");
-            } else {
-                LOG.d(LOG_TAG, "Ignoring " + action + " from previous page load.");
-            }
-            return false;
-        }
-        // Bridge secret wrong and bridge not due to it being from the previous page.
-        if (expectedBridgeSecret < 0 || bridgeSecret != expectedBridgeSecret) {
-            LOG.e(LOG_TAG, "Bridge access attempt with wrong secret token, possibly from malicious code. Disabling exec() bridge!");
-            clearBridgeSecret();
-            throw new IllegalAccessException();
-        }
-        return true;
-    }
-
-    /** Called on page transitions */
-    void clearBridgeSecret() {
-        expectedBridgeSecret = -1;
-    }
-
-    public boolean isSecretEstablished() {
-        return expectedBridgeSecret != -1;
-    }
-
-    /** Called by cordova.js to initialize the bridge. */
-    //On old Androids SecureRandom isn't really secure, this is the least of your problems if
-    //you're running Android 4.3 and below in 2017
-    int generateBridgeSecret() {
-        SecureRandom randGen = new SecureRandom();
-        expectedBridgeSecret = randGen.nextInt(Integer.MAX_VALUE);
-        return expectedBridgeSecret;
-    }
-
-    public void reset() {
-        jsMessageQueue.reset();
-        clearBridgeSecret();
-    }
-
-    public String promptOnJsPrompt(String origin, String message, String defaultValue) {
-        if (defaultValue != null && defaultValue.startsWith("gap:")) {
-            JSONArray array;
-            try {
-                array = new JSONArray(defaultValue.substring(4));
-                int bridgeSecret = array.getInt(0);
-                String service = array.getString(1);
-                String action = array.getString(2);
-                String callbackId = array.getString(3);
-                String r = jsExec(bridgeSecret, service, action, callbackId, message);
-                return r == null ? "" : r;
-            } catch (JSONException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            }
-            return "";
-        }
-        // Sets the native->JS bridge mode.
-        else if (defaultValue != null && defaultValue.startsWith("gap_bridge_mode:")) {
-            try {
-                int bridgeSecret = Integer.parseInt(defaultValue.substring(16));
-                jsSetNativeToJsBridgeMode(bridgeSecret, Integer.parseInt(message));
-            } catch (NumberFormatException e){
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            }
-            return "";
-        }
-        // Polling for JavaScript messages
-        else if (defaultValue != null && defaultValue.startsWith("gap_poll:")) {
-            int bridgeSecret = Integer.parseInt(defaultValue.substring(9));
-            try {
-                String r = jsRetrieveJsMessages(bridgeSecret, "1".equals(message));
-                return r == null ? "" : r;
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            }
-            return "";
-        }
-        else if (defaultValue != null && defaultValue.startsWith("gap_init:")) {
-            // Protect against random iframes being able to talk through the bridge.
-            // Trust only pages which the app would have been allowed to navigate to anyway.
-            if (pluginManager.shouldAllowBridgeAccess(origin)) {
-                // Enable the bridge
-                int bridgeMode = Integer.parseInt(defaultValue.substring(9));
-                jsMessageQueue.setBridgeMode(bridgeMode);
-                // Tell JS the bridge secret.
-                int secret = generateBridgeSecret();
-                return ""+secret;
-            } else {
-                LOG.e(LOG_TAG, "gap_init called from restricted origin: " + origin);
-            }
-            return "";
-        }
-        return null;
-    }
-}

+ 0 - 105
platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java

@@ -1,105 +0,0 @@
-/*
-       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;
-
-import java.security.Principal;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-
-import android.annotation.SuppressLint;
-import android.webkit.ClientCertRequest;
-
-/**
- * Implementation of the ICordovaClientCertRequest for Android WebView.
- *
- */
-public class CordovaClientCertRequest implements ICordovaClientCertRequest {
-
-    private final ClientCertRequest request;
-
-    public CordovaClientCertRequest(ClientCertRequest request) {
-        this.request = request;
-    }
-
-    /**
-     * Cancel this request
-     */
-    @SuppressLint("NewApi")
-    public void cancel()
-    {
-        request.cancel();
-    }
-
-    /*
-     * Returns the host name of the server requesting the certificate.
-     */
-    @SuppressLint("NewApi")
-    public String getHost()
-    {
-        return request.getHost();
-    }
-
-    /*
-     * Returns the acceptable types of asymmetric keys (can be null).
-     */
-    @SuppressLint("NewApi")
-    public String[] getKeyTypes()
-    {
-        return request.getKeyTypes();
-    }
-
-    /*
-     * Returns the port number of the server requesting the certificate.
-     */
-    @SuppressLint("NewApi")
-    public int getPort()
-    {
-        return request.getPort();
-    }
-
-    /*
-     * Returns the acceptable certificate issuers for the certificate matching the private key (can be null).
-     */
-    @SuppressLint("NewApi")
-    public Principal[] getPrincipals()
-    {
-        return request.getPrincipals();
-    }
-
-    /*
-     * Ignore the request for now. Do not remember user's choice.
-     */
-    @SuppressLint("NewApi")
-    public void ignore()
-    {
-        request.ignore();
-    }
-
-    /*
-     * Proceed with the specified private key and client certificate chain. Remember the user's positive choice and use it for future requests.
-     *
-     * @param privateKey The privateKey
-     * @param chain The certificate chain
-     */
-    @SuppressLint("NewApi")
-    public void proceed(PrivateKey privateKey, X509Certificate[] chain)
-    {
-        request.proceed(privateKey, chain);
-    }
-}

+ 0 - 152
platforms/android/CordovaLib/src/org/apache/cordova/CordovaDialogsHelper.java

@@ -1,152 +0,0 @@
-/*
-       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;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.view.KeyEvent;
-import android.widget.EditText;
-
-/**
- * Helper class for WebViews to implement prompt(), alert(), confirm() dialogs.
- */
-public class CordovaDialogsHelper {
-    private final Context context;
-    private AlertDialog lastHandledDialog;
-
-    public CordovaDialogsHelper(Context context) {
-        this.context = context;
-    }
-
-    public void showAlert(String message, final Result result) {
-        AlertDialog.Builder dlg = new AlertDialog.Builder(context);
-        dlg.setMessage(message);
-        dlg.setTitle("Alert");
-        //Don't let alerts break the back button
-        dlg.setCancelable(true);
-        dlg.setPositiveButton(android.R.string.ok,
-                new AlertDialog.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        result.gotResult(true, null);
-                    }
-                });
-        dlg.setOnCancelListener(
-                new DialogInterface.OnCancelListener() {
-                    public void onCancel(DialogInterface dialog) {
-                        result.gotResult(false, null);
-                    }
-                });
-        dlg.setOnKeyListener(new DialogInterface.OnKeyListener() {
-            //DO NOTHING
-            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
-                if (keyCode == KeyEvent.KEYCODE_BACK)
-                {
-                    result.gotResult(true, null);
-                    return false;
-                }
-                else
-                    return true;
-            }
-        });
-        lastHandledDialog = dlg.show();
-    }
-
-    public void showConfirm(String message, final Result result) {
-        AlertDialog.Builder dlg = new AlertDialog.Builder(context);
-        dlg.setMessage(message);
-        dlg.setTitle("Confirm");
-        dlg.setCancelable(true);
-        dlg.setPositiveButton(android.R.string.ok,
-                new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        result.gotResult(true, null);
-                    }
-                });
-        dlg.setNegativeButton(android.R.string.cancel,
-                new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        result.gotResult(false, null);
-                    }
-                });
-        dlg.setOnCancelListener(
-                new DialogInterface.OnCancelListener() {
-                    public void onCancel(DialogInterface dialog) {
-                        result.gotResult(false, null);
-                    }
-                });
-        dlg.setOnKeyListener(new DialogInterface.OnKeyListener() {
-            //DO NOTHING
-            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
-                if (keyCode == KeyEvent.KEYCODE_BACK)
-                {
-                    result.gotResult(false, null);
-                    return false;
-                }
-                else
-                    return true;
-            }
-        });
-        lastHandledDialog = dlg.show();
-    }
-
-    /**
-     * Tell the client to display a prompt dialog to the user.
-     * If the client returns true, WebView will assume that the client will
-     * handle the prompt dialog and call the appropriate JsPromptResult method.
-     *
-     * Since we are hacking prompts for our own purposes, we should not be using them for
-     * this purpose, perhaps we should hack console.log to do this instead!
-     */
-    public void showPrompt(String message, String defaultValue, final Result result) {
-        // Returning false would also show a dialog, but the default one shows the origin (ugly).
-        AlertDialog.Builder dlg = new AlertDialog.Builder(context);
-        dlg.setMessage(message);
-        final EditText input = new EditText(context);
-        if (defaultValue != null) {
-            input.setText(defaultValue);
-        }
-        dlg.setView(input);
-        dlg.setCancelable(false);
-        dlg.setPositiveButton(android.R.string.ok,
-                new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        String userText = input.getText().toString();
-                        result.gotResult(true, userText);
-                    }
-                });
-        dlg.setNegativeButton(android.R.string.cancel,
-                new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        result.gotResult(false, null);
-                    }
-                });
-        lastHandledDialog = dlg.show();
-    }
-
-    public void destroyLastDialog(){
-        if (lastHandledDialog != null){
-            lastHandledDialog.cancel();
-        }
-    }
-
-    public interface Result {
-        public void gotResult(boolean success, String value);
-    }
-}

+ 0 - 51
platforms/android/CordovaLib/src/org/apache/cordova/CordovaHttpAuthHandler.java

@@ -1,51 +0,0 @@
-/*
-       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;
-
-import android.webkit.HttpAuthHandler;
-
-/**
- * Specifies interface for HTTP auth handler object which is used to handle auth requests and
- * specifying user credentials.
- */
-public class CordovaHttpAuthHandler implements ICordovaHttpAuthHandler {
-
-    private final HttpAuthHandler handler;
-
-    public CordovaHttpAuthHandler(HttpAuthHandler handler) {
-        this.handler = handler;
-    }
-
-    /**
-     * Instructs the WebView to cancel the authentication request.
-     */
-    public void cancel () {
-        this.handler.cancel();
-    }
-
-    /**
-     * Instructs the WebView to proceed with the authentication with the given credentials.
-     *
-     * @param username
-     * @param password
-     */
-    public void proceed (String username, String password) {
-        this.handler.proceed(username, password);
-    }
-}

+ 0 - 97
platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java

@@ -1,97 +0,0 @@
-/*
-       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;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-
-import org.apache.cordova.CordovaPlugin;
-
-import java.util.concurrent.ExecutorService;
-
-/**
- * The Activity interface that is implemented by CordovaActivity.
- * It is used to isolate plugin development, and remove dependency on entire Cordova library.
- */
-public interface CordovaInterface {
-
-    /**
-     * Launch an activity for which you would like a result when it finished. When this activity exits,
-     * your onActivityResult() method will be called.
-     *
-     * @param command     The command object
-     * @param intent      The intent to start
-     * @param requestCode   The request code that is passed to callback to identify the activity
-     */
-    abstract public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode);
-
-    /**
-     * Set the plugin to be called when a sub-activity exits.
-     *
-     * @param plugin      The plugin on which onActivityResult is to be called
-     */
-    abstract public void setActivityResultCallback(CordovaPlugin plugin);
-
-    /**
-     * Get the Android activity.
-     *
-     * If a custom engine lives outside of the Activity's lifecycle the return value may be null.
-     *
-     * @return the Activity
-     */
-    public abstract Activity getActivity();
-
-    /**
-     * Get the Android context.
-     *
-     * @return the Context
-     */
-    public Context getContext();
-
-    /**
-     * Called when a message is sent to plugin.
-     *
-     * @param id            The message id
-     * @param data          The message data
-     * @return              Object or null
-     */
-    public Object onMessage(String id, Object data);
-
-    /**
-     * Returns a shared thread pool that can be used for background tasks.
-     */
-    public ExecutorService getThreadPool();
-
-    /**
-     * Sends a permission request to the activity for one permission.
-     */
-    public void requestPermission(CordovaPlugin plugin, int requestCode, String permission);
-
-    /**
-     * Sends a permission request to the activity for a group of permissions
-     */
-    public void requestPermissions(CordovaPlugin plugin, int requestCode, String [] permissions);
-
-    /**
-     * Check for a permission.  Returns true if the permission is granted, false otherwise.
-     */
-    public boolean hasPermission(String permission);
-
-}

+ 0 - 249
platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterfaceImpl.java

@@ -1,249 +0,0 @@
-/*
-       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;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.Pair;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * Default implementation of CordovaInterface.
- */
-public class CordovaInterfaceImpl implements CordovaInterface {
-    private static final String TAG = "CordovaInterfaceImpl";
-    protected Activity activity;
-    protected ExecutorService threadPool;
-    protected PluginManager pluginManager;
-
-    protected ActivityResultHolder savedResult;
-    protected CallbackMap permissionResultCallbacks;
-    protected CordovaPlugin activityResultCallback;
-    protected String initCallbackService;
-    protected int activityResultRequestCode;
-    protected boolean activityWasDestroyed = false;
-    protected Bundle savedPluginState;
-
-    public CordovaInterfaceImpl(Activity activity) {
-        this(activity, Executors.newCachedThreadPool());
-    }
-
-    public CordovaInterfaceImpl(Activity activity, ExecutorService threadPool) {
-        this.activity = activity;
-        this.threadPool = threadPool;
-        this.permissionResultCallbacks = new CallbackMap();
-    }
-
-    @Override
-    public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) {
-        setActivityResultCallback(command);
-        try {
-            activity.startActivityForResult(intent, requestCode);
-        } catch (RuntimeException e) { // E.g.: ActivityNotFoundException
-            activityResultCallback = null;
-            throw e;
-        }
-    }
-
-    @Override
-    public void setActivityResultCallback(CordovaPlugin plugin) {
-        // Cancel any previously pending activity.
-        if (activityResultCallback != null) {
-            activityResultCallback.onActivityResult(activityResultRequestCode, Activity.RESULT_CANCELED, null);
-        }
-        activityResultCallback = plugin;
-    }
-
-    @Override
-    public Activity getActivity() {
-        return activity;
-    }
-
-    @Override
-    public Context getContext() {
-        return activity;
-    }
-
-    @Override
-    public Object onMessage(String id, Object data) {
-        if ("exit".equals(id)) {
-            activity.finish();
-        }
-        return null;
-    }
-
-    @Override
-    public ExecutorService getThreadPool() {
-        return threadPool;
-    }
-
-    /**
-     * Dispatches any pending onActivityResult callbacks and sends the resume event if the
-     * Activity was destroyed by the OS.
-     */
-    public void onCordovaInit(PluginManager pluginManager) {
-        this.pluginManager = pluginManager;
-        if (savedResult != null) {
-            onActivityResult(savedResult.requestCode, savedResult.resultCode, savedResult.intent);
-        } else if(activityWasDestroyed) {
-            // If there was no Activity result, we still need to send out the resume event if the
-            // Activity was destroyed by the OS
-            activityWasDestroyed = false;
-            if(pluginManager != null)
-            {
-                CoreAndroid appPlugin = (CoreAndroid) pluginManager.getPlugin(CoreAndroid.PLUGIN_NAME);
-                if(appPlugin != null) {
-                    JSONObject obj = new JSONObject();
-                    try {
-                        obj.put("action", "resume");
-                    } catch (JSONException e) {
-                        LOG.e(TAG, "Failed to create event message", e);
-                    }
-                    appPlugin.sendResumeEvent(new PluginResult(PluginResult.Status.OK, obj));
-                }
-            }
-
-        }
-    }
-
-    /**
-     * Routes the result to the awaiting plugin. Returns false if no plugin was waiting.
-     */
-    public boolean onActivityResult(int requestCode, int resultCode, Intent intent) {
-        CordovaPlugin callback = activityResultCallback;
-        if(callback == null && initCallbackService != null) {
-            // The application was restarted, but had defined an initial callback
-            // before being shut down.
-            savedResult = new ActivityResultHolder(requestCode, resultCode, intent);
-            if (pluginManager != null) {
-                callback = pluginManager.getPlugin(initCallbackService);
-                if(callback != null) {
-                    callback.onRestoreStateForActivityResult(savedPluginState.getBundle(callback.getServiceName()),
-                            new ResumeCallback(callback.getServiceName(), pluginManager));
-                }
-            }
-        }
-        activityResultCallback = null;
-
-        if (callback != null) {
-            LOG.d(TAG, "Sending activity result to plugin");
-            initCallbackService = null;
-            savedResult = null;
-            callback.onActivityResult(requestCode, resultCode, intent);
-            return true;
-        }
-        LOG.w(TAG, "Got an activity result, but no plugin was registered to receive it" + (savedResult != null ? " yet!" : "."));
-        return false;
-    }
-
-    /**
-     * Call this from your startActivityForResult() overload. This is required to catch the case
-     * where plugins use Activity.startActivityForResult() + CordovaInterface.setActivityResultCallback()
-     * rather than CordovaInterface.startActivityForResult().
-     */
-    public void setActivityResultRequestCode(int requestCode) {
-        activityResultRequestCode = requestCode;
-    }
-
-    /**
-     * Saves parameters for startActivityForResult().
-     */
-    public void onSaveInstanceState(Bundle outState) {
-        if (activityResultCallback != null) {
-            String serviceName = activityResultCallback.getServiceName();
-            outState.putString("callbackService", serviceName);
-        }
-        if(pluginManager != null){
-            outState.putBundle("plugin", pluginManager.onSaveInstanceState());
-        }
-
-    }
-
-    /**
-     * Call this from onCreate() so that any saved startActivityForResult parameters will be restored.
-     */
-    public void restoreInstanceState(Bundle savedInstanceState) {
-        initCallbackService = savedInstanceState.getString("callbackService");
-        savedPluginState = savedInstanceState.getBundle("plugin");
-        activityWasDestroyed = true;
-    }
-
-    private static class ActivityResultHolder {
-        private int requestCode;
-        private int resultCode;
-        private Intent intent;
-
-        public ActivityResultHolder(int requestCode, int resultCode, Intent intent) {
-            this.requestCode = requestCode;
-            this.resultCode = resultCode;
-            this.intent = intent;
-        }
-    }
-
-    /**
-     * Called by the system when the user grants permissions
-     *
-     * @param requestCode
-     * @param permissions
-     * @param grantResults
-     */
-    public void onRequestPermissionResult(int requestCode, String[] permissions,
-                                          int[] grantResults) throws JSONException {
-        Pair<CordovaPlugin, Integer> callback = permissionResultCallbacks.getAndRemoveCallback(requestCode);
-        if(callback != null) {
-            callback.first.onRequestPermissionResult(callback.second, permissions, grantResults);
-        }
-    }
-
-    public void requestPermission(CordovaPlugin plugin, int requestCode, String permission) {
-        String[] permissions = new String [1];
-        permissions[0] = permission;
-        requestPermissions(plugin, requestCode, permissions);
-    }
-
-        @SuppressLint("NewApi")
-    public void requestPermissions(CordovaPlugin plugin, int requestCode, String [] permissions) {
-        int mappedRequestCode = permissionResultCallbacks.registerCallback(plugin, requestCode);
-        getActivity().requestPermissions(permissions, mappedRequestCode);
-    }
-
-    public boolean hasPermission(String permission)
-    {
-        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
-        {
-            int result = activity.checkSelfPermission(permission);
-            return PackageManager.PERMISSION_GRANTED == result;
-        }
-        else
-        {
-            return true;
-        }
-    }
-}

+ 0 - 422
platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java

@@ -1,422 +0,0 @@
-/*
-       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;
-
-import org.apache.cordova.CordovaArgs;
-import org.apache.cordova.CordovaWebView;
-import org.apache.cordova.CordovaInterface;
-import org.apache.cordova.CallbackContext;
-import org.json.JSONArray;
-import org.json.JSONException;
-
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-/**
- * Plugins must extend this class and override one of the execute methods.
- */
-public class CordovaPlugin {
-    public CordovaWebView webView;
-    public CordovaInterface cordova;
-    protected CordovaPreferences preferences;
-    private String serviceName;
-
-    /**
-     * Call this after constructing to initialize the plugin.
-     * Final because we want to be able to change args without breaking plugins.
-     */
-    public final void privateInitialize(String serviceName, CordovaInterface cordova, CordovaWebView webView, CordovaPreferences preferences) {
-        assert this.cordova == null;
-        this.serviceName = serviceName;
-        this.cordova = cordova;
-        this.webView = webView;
-        this.preferences = preferences;
-        initialize(cordova, webView);
-        pluginInitialize();
-    }
-
-    /**
-     * Called after plugin construction and fields have been initialized.
-     * Prefer to use pluginInitialize instead since there is no value in
-     * having parameters on the initialize() function.
-     */
-    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
-    }
-
-    /**
-     * Called after plugin construction and fields have been initialized.
-     */
-    protected void pluginInitialize() {
-    }
-
-    /**
-     * Returns the plugin's service name (what you'd use when calling pluginManger.getPlugin())
-     */
-    public String getServiceName() {
-        return serviceName;
-    }
-
-    /**
-     * Executes the request.
-     *
-     * This method is called from the WebView thread. To do a non-trivial amount of work, use:
-     *     cordova.getThreadPool().execute(runnable);
-     *
-     * To run on the UI thread, use:
-     *     cordova.getActivity().runOnUiThread(runnable);
-     *
-     * @param action          The action to execute.
-     * @param rawArgs         The exec() arguments in JSON form.
-     * @param callbackContext The callback context used when calling back into JavaScript.
-     * @return                Whether the action was valid.
-     */
-    public boolean execute(String action, String rawArgs, CallbackContext callbackContext) throws JSONException {
-        JSONArray args = new JSONArray(rawArgs);
-        return execute(action, args, callbackContext);
-    }
-
-    /**
-     * Executes the request.
-     *
-     * This method is called from the WebView thread. To do a non-trivial amount of work, use:
-     *     cordova.getThreadPool().execute(runnable);
-     *
-     * To run on the UI thread, use:
-     *     cordova.getActivity().runOnUiThread(runnable);
-     *
-     * @param action          The action to execute.
-     * @param args            The exec() arguments.
-     * @param callbackContext The callback context used when calling back into JavaScript.
-     * @return                Whether the action was valid.
-     */
-    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
-        CordovaArgs cordovaArgs = new CordovaArgs(args);
-        return execute(action, cordovaArgs, callbackContext);
-    }
-
-    /**
-     * Executes the request.
-     *
-     * This method is called from the WebView thread. To do a non-trivial amount of work, use:
-     *     cordova.getThreadPool().execute(runnable);
-     *
-     * To run on the UI thread, use:
-     *     cordova.getActivity().runOnUiThread(runnable);
-     *
-     * @param action          The action to execute.
-     * @param args            The exec() arguments, wrapped with some Cordova helpers.
-     * @param callbackContext The callback context used when calling back into JavaScript.
-     * @return                Whether the action was valid.
-     */
-    public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException {
-        return false;
-    }
-
-    /**
-     * Called when the system is about to start resuming a previous activity.
-     *
-     * @param multitasking		Flag indicating if multitasking is turned on for app
-     */
-    public void onPause(boolean multitasking) {
-    }
-
-    /**
-     * Called when the activity will start interacting with the user.
-     *
-     * @param multitasking		Flag indicating if multitasking is turned on for app
-     */
-    public void onResume(boolean multitasking) {
-    }
-
-    /**
-     * Called when the activity is becoming visible to the user.
-     */
-    public void onStart() {
-    }
-
-    /**
-     * Called when the activity is no longer visible to the user.
-     */
-    public void onStop() {
-    }
-
-    /**
-     * Called when the activity receives a new intent.
-     */
-    public void onNewIntent(Intent intent) {
-    }
-
-    /**
-     * The final call you receive before your activity is destroyed.
-     */
-    public void onDestroy() {
-    }
-
-    /**
-     * Called when the Activity is being destroyed (e.g. if a plugin calls out to an external
-     * Activity and the OS kills the CordovaActivity in the background). The plugin should save its
-     * state in this method only if it is awaiting the result of an external Activity and needs
-     * to preserve some information so as to handle that result; onRestoreStateForActivityResult()
-     * will only be called if the plugin is the recipient of an Activity result
-     *
-     * @return  Bundle containing the state of the plugin or null if state does not need to be saved
-     */
-    public Bundle onSaveInstanceState() {
-        return null;
-    }
-
-    /**
-     * Called when a plugin is the recipient of an Activity result after the CordovaActivity has
-     * been destroyed. The Bundle will be the same as the one the plugin returned in
-     * onSaveInstanceState()
-     *
-     * @param state             Bundle containing the state of the plugin
-     * @param callbackContext   Replacement Context to return the plugin result to
-     */
-    public void onRestoreStateForActivityResult(Bundle state, CallbackContext callbackContext) {}
-
-    /**
-     * 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) {
-        return null;
-    }
-
-    /**
-     * Called when an activity you launched exits, giving you the requestCode you started it with,
-     * the resultCode it returned, and any additional data from it.
-     *
-     * @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").
-     */
-    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
-    }
-
-    /**
-     * Hook for blocking the loading of external resources.
-     *
-     * This will be called when the WebView's shouldInterceptRequest wants to
-     * know whether to open a connection to an external resource. Return false
-     * to block the request: if any plugin returns false, Cordova will block
-     * the request. If all plugins return null, the default policy will be
-     * enforced. If at least one plugin returns true, and no plugins return
-     * false, then the request will proceed.
-     *
-     * Note that this only affects resource requests which are routed through
-     * WebViewClient.shouldInterceptRequest, such as XMLHttpRequest requests and
-     * img tag loads. WebSockets and media requests (such as <video> and <audio>
-     * tags) are not affected by this method. Use CSP headers to control access
-     * to such resources.
-     */
-    public Boolean shouldAllowRequest(String url) {
-        return null;
-    }
-
-    /**
-     * Hook for blocking navigation by the Cordova WebView. This applies both to top-level and
-     * iframe navigations.
-     *
-     * This will be called when the WebView's needs to know whether to navigate
-     * to a new page. Return false to block the navigation: if any plugin
-     * returns false, Cordova will block the navigation. If all plugins return
-     * null, the default policy will be enforced. It at least one plugin returns
-     * true, and no plugins return false, then the navigation will proceed.
-     */
-    public Boolean shouldAllowNavigation(String url) {
-        return null;
-    }
-
-    /**
-     * Hook for allowing page to call exec(). By default, this returns the result of
-     * shouldAllowNavigation(). It's generally unsafe to allow untrusted content to be loaded
-     * into a CordovaWebView, even within an iframe, so it's best not to touch this.
-     */
-    public Boolean shouldAllowBridgeAccess(String url) {
-        return shouldAllowNavigation(url);
-    }
-
-    /**
-     * Hook for blocking the launching of Intents by the Cordova application.
-     *
-     * This will be called when the WebView will not navigate to a page, but
-     * could launch an intent to handle the URL. Return false to block this: if
-     * any plugin returns false, Cordova will block the navigation. If all
-     * plugins return null, the default policy will be enforced. If at least one
-     * plugin returns true, and no plugins return false, then the URL will be
-     * opened.
-     */
-    public Boolean shouldOpenExternalUrl(String url) {
-        return null;
-    }
-
-    /**
-     * Allows plugins to handle a link being clicked. Return true here to cancel the navigation.
-     *
-     * @param url           The URL that is trying to be loaded in the Cordova webview.
-     * @return              Return true to prevent the URL from loading. Default is false.
-     */
-    public boolean onOverrideUrlLoading(String url) {
-        return false;
-    }
-
-    /**
-     * Hook for redirecting requests. Applies to WebView requests as well as requests made by plugins.
-     * To handle the request directly, return a URI in the form:
-     *
-     *    cdvplugin://pluginId/...
-     *
-     * And implement handleOpenForRead().
-     * To make this easier, use the toPluginUri() and fromPluginUri() helpers:
-     *
-     *     public Uri remapUri(Uri uri) { return toPluginUri(uri); }
-     *
-     *     public CordovaResourceApi.OpenForReadResult handleOpenForRead(Uri uri) throws IOException {
-     *         Uri origUri = fromPluginUri(uri);
-     *         ...
-     *     }
-     */
-    public Uri remapUri(Uri uri) {
-        return null;
-    }
-
-    /**
-     * Called to handle CordovaResourceApi.openForRead() calls for a cdvplugin://pluginId/ URL.
-     * Should never return null.
-     * Added in cordova-android@4.0.0
-     */
-    public CordovaResourceApi.OpenForReadResult handleOpenForRead(Uri uri) throws IOException {
-        throw new FileNotFoundException("Plugin can't handle uri: " + uri);
-    }
-
-    /**
-     * Refer to remapUri()
-     * Added in cordova-android@4.0.0
-     */
-    protected Uri toPluginUri(Uri origUri) {
-        return new Uri.Builder()
-            .scheme(CordovaResourceApi.PLUGIN_URI_SCHEME)
-            .authority(serviceName)
-            .appendQueryParameter("origUri", origUri.toString())
-            .build();
-    }
-
-    /**
-     * Refer to remapUri()
-     * Added in cordova-android@4.0.0
-     */
-    protected Uri fromPluginUri(Uri pluginUri) {
-        return Uri.parse(pluginUri.getQueryParameter("origUri"));
-    }
-
-    /**
-     * Called when the WebView does a top-level navigation or refreshes.
-     *
-     * Plugins should stop any long-running processes and clean up internal state.
-     *
-     * Does nothing by default.
-     */
-    public void onReset() {
-    }
-
-    /**
-     * Called when the system received an HTTP authentication request. Plugin can use
-     * the supplied HttpAuthHandler to process this auth challenge.
-     *
-     * @param view              The WebView that is initiating the callback
-     * @param handler           The HttpAuthHandler used to set the WebView's response
-     * @param host              The host requiring authentication
-     * @param realm             The realm for which authentication is required
-     *
-     * @return                  Returns True if plugin will resolve this auth challenge, otherwise False
-     *
-     */
-    public boolean onReceivedHttpAuthRequest(CordovaWebView view, ICordovaHttpAuthHandler handler, String host, String realm) {
-        return false;
-    }
-
-    /**
-     * Called when he system received an SSL client certificate request.  Plugin can use
-     * the supplied ClientCertRequest to process this certificate challenge.
-     *
-     * @param view              The WebView that is initiating the callback
-     * @param request           The client certificate request
-     *
-     * @return                  Returns True if plugin will resolve this auth challenge, otherwise False
-     *
-     */
-    public boolean onReceivedClientCertRequest(CordovaWebView view, ICordovaClientCertRequest request) {
-        return false;
-    }
-
-    /**
-     * Called by the system when the device configuration changes while your activity is running.
-     *
-     * @param newConfig		The new device configuration
-     */
-    public void onConfigurationChanged(Configuration newConfig) {
-    }
-
-    /**
-     * Called by the Plugin Manager when we need to actually request permissions
-     *
-     * @param requestCode   Passed to the activity to track the request
-     *
-     * @return              Returns the permission that was stored in the plugin
-     */
-
-    public void requestPermissions(int requestCode) {
-    }
-
-    /*
-     * Called by the WebView implementation to check for geolocation permissions, can be used
-     * by other Java methods in the event that a plugin is using this as a dependency.
-     *
-     * @return          Returns true if the plugin has all the permissions it needs to operate.
-     */
-
-    public boolean hasPermisssion() {
-        return true;
-    }
-
-    /**
-     * Called by the system when the user grants permissions
-     *
-     * @param requestCode
-     * @param permissions
-     * @param grantResults
-     */
-    public void onRequestPermissionResult(int requestCode, String[] permissions,
-                                          int[] grantResults) throws JSONException {
-
-    }
-}

+ 0 - 101
platforms/android/CordovaLib/src/org/apache/cordova/CordovaPreferences.java

@@ -1,101 +0,0 @@
-/*
-       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;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.cordova.LOG;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class CordovaPreferences {
-    private HashMap<String, String> prefs = new HashMap<String, String>(20);
-    private Bundle preferencesBundleExtras;
-
-    public void setPreferencesBundle(Bundle extras) {
-        preferencesBundleExtras = extras;
-    }
-
-    public void set(String name, String value) {
-        prefs.put(name.toLowerCase(Locale.ENGLISH), value);
-    }
-
-    public void set(String name, boolean value) {
-        set(name, "" + value);
-    }
-
-    public void set(String name, int value) {
-        set(name, "" + value);
-    }
-
-    public void set(String name, double value) {
-        set(name, "" + value);
-    }
-
-    public Map<String, String> getAll() {
-        return prefs;
-    }
-
-    public boolean getBoolean(String name, boolean defaultValue) {
-        name = name.toLowerCase(Locale.ENGLISH);
-        String value = prefs.get(name);
-        if (value != null) {
-            return Boolean.parseBoolean(value);
-        }
-        return defaultValue;
-    }
-
-    // Added in 4.0.0
-    public boolean contains(String name) {
-        return getString(name, null) != null;
-    }
-
-    public int getInteger(String name, int defaultValue) {
-        name = name.toLowerCase(Locale.ENGLISH);
-        String value = prefs.get(name);
-        if (value != null) {
-            // Use Integer.decode() can't handle it if the highest bit is set.
-            return (int)(long)Long.decode(value);
-        }
-        return defaultValue;
-    }
-
-    public double getDouble(String name, double defaultValue) {
-        name = name.toLowerCase(Locale.ENGLISH);
-        String value = prefs.get(name);
-        if (value != null) {
-            return Double.valueOf(value);
-        }
-        return defaultValue;
-    }
-
-    public String getString(String name, String defaultValue) {
-        name = name.toLowerCase(Locale.ENGLISH);
-        String value = prefs.get(name);
-        if (value != null) {
-            return value;
-        }
-        return defaultValue;
-    }
-
-}

+ 0 - 479
platforms/android/CordovaLib/src/org/apache/cordova/CordovaResourceApi.java

@@ -1,479 +0,0 @@
-/*
-       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;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.res.AssetFileDescriptor;
-import android.content.res.AssetManager;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Looper;
-import android.util.Base64;
-import android.webkit.MimeTypeMap;
-
-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.UnsupportedEncodingException;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.nio.channels.FileChannel;
-import java.util.Locale;
-import java.util.zip.GZIPInputStream;
-
-/**
- * What this class provides:
- * 1. Helpers for reading & writing to URLs.
- *   - E.g. handles assets, resources, content providers, files, data URIs, http[s]
- *   - E.g. Can be used to query for mime-type & content length.
- *
- * 2. To allow plugins to redirect URLs (via remapUrl).
- *   - All plugins should call remapUrl() on URLs they receive from JS *before*
- *     passing the URL onto other utility functions in this class.
- *   - For an example usage of this, refer to the org.apache.cordova.file plugin.
- *
- * Future Work:
- *   - Consider using a Cursor to query content URLs for their size (like the file plugin does).
- *   - Allow plugins to remapUri to "cdv-plugin://plugin-name/foo", which CordovaResourceApi
- *     would then delegate to pluginManager.getPlugin(plugin-name).openForRead(url)
- *     - Currently, plugins *can* do this by remapping to a data: URL, but it's inefficient
- *       for large payloads.
- */
-public class CordovaResourceApi {
-    @SuppressWarnings("unused")
-    private static final String LOG_TAG = "CordovaResourceApi";
-
-    public static final int URI_TYPE_FILE = 0;
-    public static final int URI_TYPE_ASSET = 1;
-    public static final int URI_TYPE_CONTENT = 2;
-    public static final int URI_TYPE_RESOURCE = 3;
-    public static final int URI_TYPE_DATA = 4;
-    public static final int URI_TYPE_HTTP = 5;
-    public static final int URI_TYPE_HTTPS = 6;
-    public static final int URI_TYPE_PLUGIN = 7;
-    public static final int URI_TYPE_UNKNOWN = -1;
-
-    public static final String PLUGIN_URI_SCHEME = "cdvplugin";
-
-    private static final String[] LOCAL_FILE_PROJECTION = { "_data" };
-
-    public static Thread jsThread;
-
-    private final AssetManager assetManager;
-    private final ContentResolver contentResolver;
-    private final PluginManager pluginManager;
-    private boolean threadCheckingEnabled = true;
-
-
-    public CordovaResourceApi(Context context, PluginManager pluginManager) {
-        this.contentResolver = context.getContentResolver();
-        this.assetManager = context.getAssets();
-        this.pluginManager = pluginManager;
-    }
-
-    public void setThreadCheckingEnabled(boolean value) {
-        threadCheckingEnabled = value;
-    }
-
-    public boolean isThreadCheckingEnabled() {
-        return threadCheckingEnabled;
-    }
-
-
-    public static int getUriType(Uri uri) {
-        assertNonRelative(uri);
-        String scheme = uri.getScheme();
-        if (ContentResolver.SCHEME_CONTENT.equalsIgnoreCase(scheme)) {
-            return URI_TYPE_CONTENT;
-        }
-        if (ContentResolver.SCHEME_ANDROID_RESOURCE.equalsIgnoreCase(scheme)) {
-            return URI_TYPE_RESOURCE;
-        }
-        if (ContentResolver.SCHEME_FILE.equalsIgnoreCase(scheme)) {
-            if (uri.getPath().startsWith("/android_asset/")) {
-                return URI_TYPE_ASSET;
-            }
-            return URI_TYPE_FILE;
-        }
-        if ("data".equalsIgnoreCase(scheme)) {
-            return URI_TYPE_DATA;
-        }
-        if ("http".equalsIgnoreCase(scheme)) {
-            return URI_TYPE_HTTP;
-        }
-        if ("https".equalsIgnoreCase(scheme)) {
-            return URI_TYPE_HTTPS;
-        }
-        if (PLUGIN_URI_SCHEME.equalsIgnoreCase(scheme)) {
-            return URI_TYPE_PLUGIN;
-        }
-        return URI_TYPE_UNKNOWN;
-    }
-
-    public Uri remapUri(Uri uri) {
-        assertNonRelative(uri);
-        Uri pluginUri = pluginManager.remapUri(uri);
-        return pluginUri != null ? pluginUri : uri;
-    }
-
-    public String remapPath(String path) {
-        return remapUri(Uri.fromFile(new File(path))).getPath();
-    }
-
-    /**
-     * Returns a File that points to the resource, or null if the resource
-     * is not on the local filesystem.
-     */
-    public File mapUriToFile(Uri uri) {
-        assertBackgroundThread();
-        switch (getUriType(uri)) {
-            case URI_TYPE_FILE:
-                return new File(uri.getPath());
-            case URI_TYPE_CONTENT: {
-                Cursor cursor = contentResolver.query(uri, LOCAL_FILE_PROJECTION, null, null, null);
-                if (cursor != null) {
-                    try {
-                        int columnIndex = cursor.getColumnIndex(LOCAL_FILE_PROJECTION[0]);
-                        if (columnIndex != -1 && cursor.getCount() > 0) {
-                            cursor.moveToFirst();
-                            String realPath = cursor.getString(columnIndex);
-                            if (realPath != null) {
-                                return new File(realPath);
-                            }
-                        }
-                    } finally {
-                        cursor.close();
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    public String getMimeType(Uri uri) {
-        switch (getUriType(uri)) {
-            case URI_TYPE_FILE:
-            case URI_TYPE_ASSET:
-                return getMimeTypeFromPath(uri.getPath());
-            case URI_TYPE_CONTENT:
-            case URI_TYPE_RESOURCE:
-                return contentResolver.getType(uri);
-            case URI_TYPE_DATA: {
-                return getDataUriMimeType(uri);
-            }
-            case URI_TYPE_HTTP:
-            case URI_TYPE_HTTPS: {
-                try {
-                    HttpURLConnection conn = (HttpURLConnection)new URL(uri.toString()).openConnection();
-                    conn.setDoInput(false);
-                    conn.setRequestMethod("HEAD");
-                    String mimeType = conn.getHeaderField("Content-Type");
-                    if (mimeType != null) {
-                        mimeType = mimeType.split(";")[0];
-                    }
-                    return mimeType;
-                } catch (IOException e) {
-                }
-            }
-        }
-
-        return null;
-    }
-
-
-    //This already exists
-    private String getMimeTypeFromPath(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";
-        } else if (extension.equals("js")) {
-            // Missing from the map :(.
-            return "text/javascript";
-        }
-        return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
-    }
-
-    /**
-     * Opens a stream to the given URI, also providing the MIME type & length.
-     * @return Never returns null.
-     * @throws Throws an InvalidArgumentException for relative URIs. Relative URIs should be
-     *     resolved before being passed into this function.
-     * @throws Throws an IOException if the URI cannot be opened.
-     * @throws Throws an IllegalStateException if called on a foreground thread.
-     */
-    public OpenForReadResult openForRead(Uri uri) throws IOException {
-        return openForRead(uri, false);
-    }
-
-    /**
-     * Opens a stream to the given URI, also providing the MIME type & length.
-     * @return Never returns null.
-     * @throws Throws an InvalidArgumentException for relative URIs. Relative URIs should be
-     *     resolved before being passed into this function.
-     * @throws Throws an IOException if the URI cannot be opened.
-     * @throws Throws an IllegalStateException if called on a foreground thread and skipThreadCheck is false.
-     */
-    public OpenForReadResult openForRead(Uri uri, boolean skipThreadCheck) throws IOException {
-        if (!skipThreadCheck) {
-            assertBackgroundThread();
-        }
-        switch (getUriType(uri)) {
-            case URI_TYPE_FILE: {
-                FileInputStream inputStream = new FileInputStream(uri.getPath());
-                String mimeType = getMimeTypeFromPath(uri.getPath());
-                long length = inputStream.getChannel().size();
-                return new OpenForReadResult(uri, inputStream, mimeType, length, null);
-            }
-            case URI_TYPE_ASSET: {
-                String assetPath = uri.getPath().substring(15);
-                AssetFileDescriptor assetFd = null;
-                InputStream inputStream;
-                long length = -1;
-                try {
-                    assetFd = assetManager.openFd(assetPath);
-                    inputStream = assetFd.createInputStream();
-                    length = assetFd.getLength();
-                } catch (FileNotFoundException e) {
-                    // Will occur if the file is compressed.
-                    inputStream = assetManager.open(assetPath);
-                    length = inputStream.available();
-                }
-                String mimeType = getMimeTypeFromPath(assetPath);
-                return new OpenForReadResult(uri, inputStream, mimeType, length, assetFd);
-            }
-            case URI_TYPE_CONTENT:
-            case URI_TYPE_RESOURCE: {
-                String mimeType = contentResolver.getType(uri);
-                AssetFileDescriptor assetFd = contentResolver.openAssetFileDescriptor(uri, "r");
-                InputStream inputStream = assetFd.createInputStream();
-                long length = assetFd.getLength();
-                return new OpenForReadResult(uri, inputStream, mimeType, length, assetFd);
-            }
-            case URI_TYPE_DATA: {
-                OpenForReadResult ret = readDataUri(uri);
-                if (ret == null) {
-                    break;
-                }
-                return ret;
-            }
-            case URI_TYPE_HTTP:
-            case URI_TYPE_HTTPS: {
-                HttpURLConnection conn = (HttpURLConnection)new URL(uri.toString()).openConnection();
-                conn.setRequestProperty("Accept-Encoding", "gzip");
-                conn.setDoInput(true);
-                String mimeType = conn.getHeaderField("Content-Type");
-                if (mimeType != null) {
-                    mimeType = mimeType.split(";")[0];
-                }
-                int length = conn.getContentLength();
-                InputStream inputStream;
-                if ("gzip".equals(conn.getContentEncoding())) {
-                    inputStream = new GZIPInputStream(conn.getInputStream());
-                } else {
-                    inputStream = conn.getInputStream();
-                }
-                return new OpenForReadResult(uri, inputStream, mimeType, length, null);
-            }
-            case URI_TYPE_PLUGIN: {
-                String pluginId = uri.getHost();
-                CordovaPlugin plugin = pluginManager.getPlugin(pluginId);
-                if (plugin == null) {
-                    throw new FileNotFoundException("Invalid plugin ID in URI: " + uri);
-                }
-                return plugin.handleOpenForRead(uri);
-            }
-        }
-        throw new FileNotFoundException("URI not supported by CordovaResourceApi: " + uri);
-    }
-
-    public OutputStream openOutputStream(Uri uri) throws IOException {
-        return openOutputStream(uri, false);
-    }
-
-    /**
-     * Opens a stream to the given URI.
-     * @return Never returns null.
-     * @throws Throws an InvalidArgumentException for relative URIs. Relative URIs should be
-     *     resolved before being passed into this function.
-     * @throws Throws an IOException if the URI cannot be opened.
-     */
-    public OutputStream openOutputStream(Uri uri, boolean append) throws IOException {
-        assertBackgroundThread();
-        switch (getUriType(uri)) {
-            case URI_TYPE_FILE: {
-                File localFile = new File(uri.getPath());
-                File parent = localFile.getParentFile();
-                if (parent != null) {
-                    parent.mkdirs();
-                }
-                return new FileOutputStream(localFile, append);
-            }
-            case URI_TYPE_CONTENT:
-            case URI_TYPE_RESOURCE: {
-                AssetFileDescriptor assetFd = contentResolver.openAssetFileDescriptor(uri, append ? "wa" : "w");
-                return assetFd.createOutputStream();
-            }
-        }
-        throw new FileNotFoundException("URI not supported by CordovaResourceApi: " + uri);
-    }
-
-    public HttpURLConnection createHttpConnection(Uri uri) throws IOException {
-        assertBackgroundThread();
-        return (HttpURLConnection)new URL(uri.toString()).openConnection();
-    }
-
-    // Copies the input to the output in the most efficient manner possible.
-    // Closes both streams.
-    public void copyResource(OpenForReadResult input, OutputStream outputStream) throws IOException {
-        assertBackgroundThread();
-        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();
-            }
-        }
-    }
-
-    public void copyResource(Uri sourceUri, OutputStream outputStream) throws IOException {
-        copyResource(openForRead(sourceUri), outputStream);
-    }
-
-    // Added in 3.5.0.
-    public void copyResource(Uri sourceUri, Uri dstUri) throws IOException {
-        copyResource(openForRead(sourceUri), openOutputStream(dstUri));
-    }
-
-    private void assertBackgroundThread() {
-        if (threadCheckingEnabled) {
-            Thread curThread = Thread.currentThread();
-            if (curThread == Looper.getMainLooper().getThread()) {
-                throw new IllegalStateException("Do not perform IO operations on the UI thread. Use CordovaInterface.getThreadPool() instead.");
-            }
-            if (curThread == jsThread) {
-                throw new IllegalStateException("Tried to perform an IO operation on the WebCore thread. Use CordovaInterface.getThreadPool() instead.");
-            }
-        }
-    }
-
-    private String getDataUriMimeType(Uri uri) {
-        String uriAsString = uri.getSchemeSpecificPart();
-        int commaPos = uriAsString.indexOf(',');
-        if (commaPos == -1) {
-            return null;
-        }
-        String[] mimeParts = uriAsString.substring(0, commaPos).split(";");
-        if (mimeParts.length > 0) {
-            return mimeParts[0];
-        }
-        return null;
-    }
-
-    private OpenForReadResult readDataUri(Uri uri) {
-        String uriAsString = uri.getSchemeSpecificPart();
-        int commaPos = uriAsString.indexOf(',');
-        if (commaPos == -1) {
-            return null;
-        }
-        String[] mimeParts = uriAsString.substring(0, commaPos).split(";");
-        String contentType = null;
-        boolean base64 = false;
-        if (mimeParts.length > 0) {
-            contentType = mimeParts[0];
-        }
-        for (int i = 1; i < mimeParts.length; ++i) {
-            if ("base64".equalsIgnoreCase(mimeParts[i])) {
-                base64 = true;
-            }
-        }
-        String dataPartAsString = uriAsString.substring(commaPos + 1);
-        byte[] data;
-        if (base64) {
-            data = Base64.decode(dataPartAsString, Base64.DEFAULT);
-        } else {
-            try {
-                data = dataPartAsString.getBytes("UTF-8");
-            } catch (UnsupportedEncodingException e) {
-                data = dataPartAsString.getBytes();
-            }
-        }
-        InputStream inputStream = new ByteArrayInputStream(data);
-        return new OpenForReadResult(uri, inputStream, contentType, data.length, null);
-    }
-
-    private static void assertNonRelative(Uri uri) {
-        if (!uri.isAbsolute()) {
-            throw new IllegalArgumentException("Relative URIs are not supported.");
-        }
-    }
-
-    public static final class OpenForReadResult {
-        public final Uri uri;
-        public final InputStream inputStream;
-        public final String mimeType;
-        public final long length;
-        public final AssetFileDescriptor assetFd;
-
-        public OpenForReadResult(Uri uri, InputStream inputStream, String mimeType, long length, AssetFileDescriptor assetFd) {
-            this.uri = uri;
-            this.inputStream = inputStream;
-            this.mimeType = mimeType;
-            this.length = length;
-            this.assetFd = assetFd;
-        }
-    }
-}

+ 0 - 142
platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebView.java

@@ -1,142 +0,0 @@
-/*
-       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;
-
-import java.util.List;
-import java.util.Map;
-
-import android.content.Context;
-import android.content.Intent;
-import android.view.View;
-import android.webkit.WebChromeClient.CustomViewCallback;
-
-/**
- * Main interface for interacting with a Cordova webview - implemented by CordovaWebViewImpl.
- * This is an interface so that it can be easily mocked in tests.
- * Methods may be added to this interface without a major version bump, as plugins & embedders
- * are not expected to implement it.
- */
-public interface CordovaWebView {
-    public static final String CORDOVA_VERSION = "9.1.0";
-
-    void init(CordovaInterface cordova, List<PluginEntry> pluginEntries, CordovaPreferences preferences);
-
-    boolean isInitialized();
-
-    View getView();
-
-    void loadUrlIntoView(String url, boolean recreatePlugins);
-
-    void stopLoading();
-
-    boolean canGoBack();
-
-    void clearCache();
-
-    /** Use parameter-less overload */
-    @Deprecated
-    void clearCache(boolean b);
-
-    void clearHistory();
-
-    boolean backHistory();
-
-    void handlePause(boolean keepRunning);
-
-    void onNewIntent(Intent intent);
-
-    void handleResume(boolean keepRunning);
-
-    void handleStart();
-
-    void handleStop();
-
-    void handleDestroy();
-
-    /**
-     * Send JavaScript statement back to JavaScript.
-     *
-     * Deprecated (https://issues.apache.org/jira/browse/CB-6851)
-     * Instead of executing snippets of JS, you should use the exec bridge
-     * to create a Java->JS communication channel.
-     * To do this:
-     * 1. Within plugin.xml (to have your JS run before deviceready):
-     *    <js-module><runs/></js-module>
-     * 2. Within your .js (call exec on start-up):
-     *    require('cordova/channel').onCordovaReady.subscribe(function() {
-     *      require('cordova/exec')(win, null, 'Plugin', 'method', []);
-     *      function win(message) {
-     *        ... process message from java here ...
-     *      }
-     *    });
-     * 3. Within your .java:
-     *    PluginResult dataResult = new PluginResult(PluginResult.Status.OK, CODE);
-     *    dataResult.setKeepCallback(true);
-     *    savedCallbackContext.sendPluginResult(dataResult);
-     */
-    @Deprecated
-    void sendJavascript(String statememt);
-
-    /**
-     * Load the specified URL in the Cordova webview or a new browser instance.
-     *
-     * NOTE: If openExternal is false, only whitelisted URLs can be loaded.
-     *
-     * @param url           The url to load.
-     * @param openExternal  Load url in browser instead of Cordova webview.
-     * @param clearHistory  Clear the history stack, so new page becomes top of history
-     * @param params        Parameters for new app
-     */
-    void showWebPage(String url, boolean openExternal, boolean clearHistory, Map<String, Object> params);
-
-    /**
-     * Deprecated in 4.0.0. Use your own View-toggling logic.
-     */
-    @Deprecated
-    boolean isCustomViewShowing();
-
-    /**
-     * Deprecated in 4.0.0. Use your own View-toggling logic.
-     */
-    @Deprecated
-    void showCustomView(View view, CustomViewCallback callback);
-
-    /**
-     * Deprecated in 4.0.0. Use your own View-toggling logic.
-     */
-    @Deprecated
-    void hideCustomView();
-
-    CordovaResourceApi getResourceApi();
-
-    void setButtonPlumbedToJs(int keyCode, boolean override);
-    boolean isButtonPlumbedToJs(int keyCode);
-
-    void sendPluginResult(PluginResult cr, String callbackId);
-
-    PluginManager getPluginManager();
-    CordovaWebViewEngine getEngine();
-    CordovaPreferences getPreferences();
-    ICordovaCookieManager getCookieManager();
-
-    String getUrl();
-
-    // TODO: Work on deleting these by removing refs from plugins.
-    Context getContext();
-    void loadUrl(String url);
-    Object postMessage(String id, Object data);
-}

+ 0 - 85
platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewEngine.java

@@ -1,85 +0,0 @@
-/*
-       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;
-
-import android.view.KeyEvent;
-import android.view.View;
-import android.webkit.ValueCallback;
-
-/**
- * Interface for all Cordova engines.
- * No methods will be added to this class (in order to be compatible with existing engines).
- * Instead, we will create a new interface: e.g. CordovaWebViewEngineV2
- */
-public interface CordovaWebViewEngine {
-    void init(CordovaWebView parentWebView, CordovaInterface cordova, Client client,
-              CordovaResourceApi resourceApi, PluginManager pluginManager,
-              NativeToJsMessageQueue nativeToJsMessageQueue);
-
-    CordovaWebView getCordovaWebView();
-    ICordovaCookieManager getCookieManager();
-    View getView();
-
-    void loadUrl(String url, boolean clearNavigationStack);
-
-    void stopLoading();
-
-    /** Return the currently loaded URL */
-    String getUrl();
-
-    void clearCache();
-
-    /** After calling clearHistory(), canGoBack() should be false. */
-    void clearHistory();
-
-    boolean canGoBack();
-
-    /** Returns whether a navigation occurred */
-    boolean goBack();
-
-    /** Pauses / resumes the WebView's event loop. */
-    void setPaused(boolean value);
-
-    /** Clean up all resources associated with the WebView. */
-    void destroy();
-
-    /** Add the evaulate Javascript method **/
-    void evaluateJavascript(String js, ValueCallback<String> callback);
-
-    /**
-     * Used to retrieve the associated CordovaWebView given a View without knowing the type of Engine.
-     * E.g. ((CordovaWebView.EngineView)activity.findViewById(android.R.id.webView)).getCordovaWebView();
-     */
-    public interface EngineView {
-        CordovaWebView getCordovaWebView();
-    }
-
-    /**
-     * Contains methods that an engine uses to communicate with the parent CordovaWebView.
-     * Methods may be added in future cordova versions, but never removed.
-     */
-    public interface Client {
-        Boolean onDispatchKeyEvent(KeyEvent event);
-        void clearLoadTimeoutTimer();
-        void onPageStarted(String newUrl);
-        void onReceivedError(int errorCode, String description, String failingUrl);
-        void onPageFinishedLoading(String url);
-        boolean onNavigationAttempt(String url);
-    }
-}

+ 0 - 668
platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewImpl.java

@@ -1,668 +0,0 @@
-/*
-       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;
-
-import android.annotation.SuppressLint;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebChromeClient;
-import android.widget.FrameLayout;
-
-import org.apache.cordova.engine.SystemWebViewEngine;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.lang.reflect.Constructor;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Main class for interacting with a Cordova webview. Manages plugins, events, and a CordovaWebViewEngine.
- * Class uses two-phase initialization. You must call init() before calling any other methods.
- */
-public class CordovaWebViewImpl implements CordovaWebView {
-
-    public static final String TAG = "CordovaWebViewImpl";
-
-    private PluginManager pluginManager;
-
-    protected final CordovaWebViewEngine engine;
-    private CordovaInterface cordova;
-
-    // Flag to track that a loadUrl timeout occurred
-    private int loadUrlTimeout = 0;
-
-    private CordovaResourceApi resourceApi;
-    private CordovaPreferences preferences;
-    private CoreAndroid appPlugin;
-    private NativeToJsMessageQueue nativeToJsMessageQueue;
-    private EngineClient engineClient = new EngineClient();
-    private boolean hasPausedEver;
-
-    // The URL passed to loadUrl(), not necessarily the URL of the current page.
-    String loadedUrl;
-
-    /** custom view created by the browser (a video player for example) */
-    private View mCustomView;
-    private WebChromeClient.CustomViewCallback mCustomViewCallback;
-
-    private Set<Integer> boundKeyCodes = new HashSet<Integer>();
-
-    public static CordovaWebViewEngine createEngine(Context context, CordovaPreferences preferences) {
-        String className = preferences.getString("webview", SystemWebViewEngine.class.getCanonicalName());
-        try {
-            Class<?> webViewClass = Class.forName(className);
-            Constructor<?> constructor = webViewClass.getConstructor(Context.class, CordovaPreferences.class);
-            return (CordovaWebViewEngine) constructor.newInstance(context, preferences);
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to create webview. ", e);
-        }
-    }
-
-    public CordovaWebViewImpl(CordovaWebViewEngine cordovaWebViewEngine) {
-        this.engine = cordovaWebViewEngine;
-    }
-
-    // Convenience method for when creating programmatically (not from Config.xml).
-    public void init(CordovaInterface cordova) {
-        init(cordova, new ArrayList<PluginEntry>(), new CordovaPreferences());
-    }
-
-    @SuppressLint("Assert")
-    @Override
-    public void init(CordovaInterface cordova, List<PluginEntry> pluginEntries, CordovaPreferences preferences) {
-        if (this.cordova != null) {
-            throw new IllegalStateException();
-        }
-        this.cordova = cordova;
-        this.preferences = preferences;
-        pluginManager = new PluginManager(this, this.cordova, pluginEntries);
-        resourceApi = new CordovaResourceApi(engine.getView().getContext(), pluginManager);
-        nativeToJsMessageQueue = new NativeToJsMessageQueue();
-        nativeToJsMessageQueue.addBridgeMode(new NativeToJsMessageQueue.NoOpBridgeMode());
-        nativeToJsMessageQueue.addBridgeMode(new NativeToJsMessageQueue.LoadUrlBridgeMode(engine, cordova));
-
-        if (preferences.getBoolean("DisallowOverscroll", false)) {
-            engine.getView().setOverScrollMode(View.OVER_SCROLL_NEVER);
-        }
-        engine.init(this, cordova, engineClient, resourceApi, pluginManager, nativeToJsMessageQueue);
-        // This isn't enforced by the compiler, so assert here.
-        assert engine.getView() instanceof CordovaWebViewEngine.EngineView;
-
-        pluginManager.addService(CoreAndroid.PLUGIN_NAME, "org.apache.cordova.CoreAndroid");
-        pluginManager.init();
-
-    }
-
-    @Override
-    public boolean isInitialized() {
-        return cordova != null;
-    }
-
-    @Override
-    public void loadUrlIntoView(final String url, boolean recreatePlugins) {
-        LOG.d(TAG, ">>> loadUrl(" + url + ")");
-        if (url.equals("about:blank") || url.startsWith("javascript:")) {
-            engine.loadUrl(url, false);
-            return;
-        }
-
-        recreatePlugins = recreatePlugins || (loadedUrl == null);
-
-        if (recreatePlugins) {
-            // Don't re-initialize on first load.
-            if (loadedUrl != null) {
-                appPlugin = null;
-                pluginManager.init();
-            }
-            loadedUrl = url;
-        }
-
-        // Create a timeout timer for loadUrl
-        final int currentLoadUrlTimeout = loadUrlTimeout;
-        final int loadUrlTimeoutValue = preferences.getInteger("LoadUrlTimeoutValue", 20000);
-
-        // Timeout error method
-        final Runnable loadError = new Runnable() {
-            public void run() {
-                stopLoading();
-                LOG.e(TAG, "CordovaWebView: TIMEOUT ERROR!");
-
-                // Handle other errors by passing them to the webview in JS
-                JSONObject data = new JSONObject();
-                try {
-                    data.put("errorCode", -6);
-                    data.put("description", "The connection to the server was unsuccessful.");
-                    data.put("url", url);
-                } catch (JSONException e) {
-                    // Will never happen.
-                }
-                pluginManager.postMessage("onReceivedError", data);
-            }
-        };
-
-        // Timeout timer method
-        final Runnable timeoutCheck = new Runnable() {
-            public void run() {
-                try {
-                    synchronized (this) {
-                        wait(loadUrlTimeoutValue);
-                    }
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-
-                // If timeout, then stop loading and handle error (if activity still exists)
-                if (loadUrlTimeout == currentLoadUrlTimeout && cordova.getActivity() != null) {
-                    cordova.getActivity().runOnUiThread(loadError);
-                } else if (cordova.getActivity() == null) {
-                    LOG.d(TAG, "Cordova activity does not exist.");
-                }
-            }
-        };
-
-        if (cordova.getActivity() != null) {
-            final boolean _recreatePlugins = recreatePlugins;
-            cordova.getActivity().runOnUiThread(new Runnable() {
-                public void run() {
-                    if (loadUrlTimeoutValue > 0) {
-                        cordova.getThreadPool().execute(timeoutCheck);
-                    }
-                    engine.loadUrl(url, _recreatePlugins);
-                }
-            });
-        } else {
-            LOG.d(TAG, "Cordova activity does not exist.");
-        }
-    }
-
-
-    @Override
-    public void loadUrl(String url) {
-        loadUrlIntoView(url, true);
-    }
-
-    @Override
-    public void showWebPage(String url, boolean openExternal, boolean clearHistory, Map<String, Object> params) {
-        LOG.d(TAG, "showWebPage(%s, %b, %b, HashMap)", url, openExternal, clearHistory);
-
-        // If clearing history
-        if (clearHistory) {
-            engine.clearHistory();
-        }
-
-        // If loading into our webview
-        if (!openExternal) {
-            // Make sure url is in whitelist
-            if (pluginManager.shouldAllowNavigation(url)) {
-                // TODO: What about params?
-                // Load new URL
-                loadUrlIntoView(url, true);
-                return;
-            } else {
-                LOG.w(TAG, "showWebPage: Refusing to load URL into webview since it is not in the <allow-navigation> whitelist. URL=" + url);
-                return;
-            }
-        }
-        if (!pluginManager.shouldOpenExternalUrl(url)) {
-            LOG.w(TAG, "showWebPage: Refusing to send intent for URL since it is not in the <allow-intent> whitelist. URL=" + url);
-            return;
-        }
-
-        Intent intent = null;
-        try {
-            if (url.startsWith("intent://")) {
-                intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
-            } else {
-                intent = new Intent(Intent.ACTION_VIEW);
-                // To send an intent without CATEGORY_BROWSER, a custom plugin should be used.
-                intent.addCategory(Intent.CATEGORY_BROWSABLE);
-                Uri uri = Uri.parse(url);
-                // Omitting the MIME type for file: URLs causes "No Activity found to handle Intent".
-                // Adding the MIME type to http: URLs causes them to not be handled by the downloader.
-                if ("file".equals(uri.getScheme())) {
-                    intent.setDataAndType(uri, resourceApi.getMimeType(uri));
-                } else {
-                    intent.setData(uri);
-                }
-            }
-            if (cordova.getActivity() != null) {
-                cordova.getActivity().startActivity(intent);
-            } else {
-                LOG.d(TAG, "Cordova activity does not exist.");
-            }
-        } catch (URISyntaxException e) {
-            LOG.e(TAG, "Error parsing url " + url, e);
-        } catch (ActivityNotFoundException e) {
-            if (url.startsWith("intent://") && intent != null && intent.getStringExtra("browser_fallback_url") != null) {
-                showWebPage(intent.getStringExtra("browser_fallback_url"), openExternal, clearHistory, params);
-            } else {
-                LOG.e(TAG, "Error loading url " + url, e);
-            }
-        }
-    }
-
-    private static class WrapperView extends FrameLayout {
-
-        private final CordovaWebViewEngine engine;
-
-        public WrapperView(Context context, CordovaWebViewEngine engine) {
-            super(context);
-            this.engine = engine;
-        }
-
-        @Override
-        public boolean dispatchKeyEvent(KeyEvent event) {
-            boolean ret = engine.getView().dispatchKeyEvent(event);
-            if (!ret) {
-                // If the engine didn't handle the event, handle it normally.
-                ret = super.dispatchKeyEvent(event);
-            }
-            return ret;
-        }
-    }
-
-    @Override
-    @Deprecated
-    public void showCustomView(View view, WebChromeClient.CustomViewCallback callback) {
-        // This code is adapted from the original Android Browser code, licensed under the Apache License, Version 2.0
-        LOG.d(TAG, "showing Custom View");
-        // if a view already exists then immediately terminate the new one
-        if (mCustomView != null) {
-            callback.onCustomViewHidden();
-            return;
-        }
-
-        WrapperView wrapperView = new WrapperView(getContext(), engine);
-        wrapperView.addView(view);
-
-        // Store the view and its callback for later (to kill it properly)
-        mCustomView = wrapperView;
-        mCustomViewCallback = callback;
-
-        // Add the custom view to its container.
-        ViewGroup parent = (ViewGroup) engine.getView().getParent();
-        parent.addView(wrapperView, new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                Gravity.CENTER));
-
-        // Hide the content view.
-        engine.getView().setVisibility(View.GONE);
-
-        // Finally show the custom view container.
-        parent.setVisibility(View.VISIBLE);
-        parent.bringToFront();
-    }
-
-    @Override
-    @Deprecated
-    public void hideCustomView() {
-        // This code is adapted from the original Android Browser code, licensed under the Apache License, Version 2.0
-        if (mCustomView == null) return;
-        LOG.d(TAG, "Hiding Custom View");
-
-        // Hide the custom view.
-        mCustomView.setVisibility(View.GONE);
-
-        // Remove the custom view from its container.
-        ViewGroup parent = (ViewGroup) engine.getView().getParent();
-        parent.removeView(mCustomView);
-        mCustomView = null;
-        mCustomViewCallback.onCustomViewHidden();
-
-        // Show the content view.
-        engine.getView().setVisibility(View.VISIBLE);
-    }
-
-    @Override
-    @Deprecated
-    public boolean isCustomViewShowing() {
-        return mCustomView != null;
-    }
-
-    @Override
-    @Deprecated
-    public void sendJavascript(String statement) {
-        nativeToJsMessageQueue.addJavaScript(statement);
-    }
-
-    @Override
-    public void sendPluginResult(PluginResult cr, String callbackId) {
-        nativeToJsMessageQueue.addPluginResult(cr, callbackId);
-    }
-
-    @Override
-    public PluginManager getPluginManager() {
-        return pluginManager;
-    }
-    @Override
-    public CordovaPreferences getPreferences() {
-        return preferences;
-    }
-    @Override
-    public ICordovaCookieManager getCookieManager() {
-        return engine.getCookieManager();
-    }
-    @Override
-    public CordovaResourceApi getResourceApi() {
-        return resourceApi;
-    }
-    @Override
-    public CordovaWebViewEngine getEngine() {
-        return engine;
-    }
-    @Override
-    public View getView() {
-        return engine.getView();
-    }
-    @Override
-    public Context getContext() {
-        return engine.getView().getContext();
-    }
-
-    private void sendJavascriptEvent(String event) {
-        if (appPlugin == null) {
-            appPlugin = (CoreAndroid)pluginManager.getPlugin(CoreAndroid.PLUGIN_NAME);
-        }
-
-        if (appPlugin == null) {
-            LOG.w(TAG, "Unable to fire event without existing plugin");
-            return;
-        }
-        appPlugin.fireJavascriptEvent(event);
-    }
-
-    @Override
-    public void setButtonPlumbedToJs(int keyCode, boolean override) {
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_VOLUME_DOWN:
-            case KeyEvent.KEYCODE_VOLUME_UP:
-            case KeyEvent.KEYCODE_BACK:
-            case KeyEvent.KEYCODE_MENU:
-                // TODO: Why are search and menu buttons handled separately?
-                if (override) {
-                    boundKeyCodes.add(keyCode);
-                } else {
-                    boundKeyCodes.remove(keyCode);
-                }
-                return;
-            default:
-                throw new IllegalArgumentException("Unsupported keycode: " + keyCode);
-        }
-    }
-
-    @Override
-    public boolean isButtonPlumbedToJs(int keyCode) {
-        return boundKeyCodes.contains(keyCode);
-    }
-
-    @Override
-    public Object postMessage(String id, Object data) {
-        return pluginManager.postMessage(id, data);
-    }
-
-    // Engine method proxies:
-    @Override
-    public String getUrl() {
-        return engine.getUrl();
-    }
-
-    @Override
-    public void stopLoading() {
-        // Clear timeout flag
-        loadUrlTimeout++;
-    }
-
-    @Override
-    public boolean canGoBack() {
-        return engine.canGoBack();
-    }
-
-    @Override
-    public void clearCache() {
-        engine.clearCache();
-    }
-
-    @Override
-    @Deprecated
-    public void clearCache(boolean b) {
-        engine.clearCache();
-    }
-
-    @Override
-    public void clearHistory() {
-        engine.clearHistory();
-    }
-
-    @Override
-    public boolean backHistory() {
-        return engine.goBack();
-    }
-
-    /////// LifeCycle methods ///////
-    @Override
-    public void onNewIntent(Intent intent) {
-        if (this.pluginManager != null) {
-            this.pluginManager.onNewIntent(intent);
-        }
-    }
-    @Override
-    public void handlePause(boolean keepRunning) {
-        if (!isInitialized()) {
-            return;
-        }
-        hasPausedEver = true;
-        pluginManager.onPause(keepRunning);
-        sendJavascriptEvent("pause");
-
-        // If app doesn't want to run in background
-        if (!keepRunning) {
-            // Pause JavaScript timers. This affects all webviews within the app!
-            engine.setPaused(true);
-        }
-    }
-    @Override
-    public void handleResume(boolean keepRunning) {
-        if (!isInitialized()) {
-            return;
-        }
-
-        // Resume JavaScript timers. This affects all webviews within the app!
-        engine.setPaused(false);
-        this.pluginManager.onResume(keepRunning);
-
-        // In order to match the behavior of the other platforms, we only send onResume after an
-        // onPause has occurred. The resume event might still be sent if the Activity was killed
-        // while waiting for the result of an external Activity once the result is obtained
-        if (hasPausedEver) {
-            sendJavascriptEvent("resume");
-        }
-    }
-    @Override
-    public void handleStart() {
-        if (!isInitialized()) {
-            return;
-        }
-        pluginManager.onStart();
-    }
-    @Override
-    public void handleStop() {
-        if (!isInitialized()) {
-            return;
-        }
-        pluginManager.onStop();
-    }
-    @Override
-    public void handleDestroy() {
-        if (!isInitialized()) {
-            return;
-        }
-        // Cancel pending timeout timer.
-        loadUrlTimeout++;
-
-        // Forward to plugins
-        this.pluginManager.onDestroy();
-
-        // TODO: about:blank is a bit special (and the default URL for new frames)
-        // We should use a blank data: url instead so it's more obvious
-        this.loadUrl("about:blank");
-
-        // TODO: Should not destroy webview until after about:blank is done loading.
-        engine.destroy();
-        hideCustomView();
-    }
-
-    protected class EngineClient implements CordovaWebViewEngine.Client {
-        @Override
-        public void clearLoadTimeoutTimer() {
-            loadUrlTimeout++;
-        }
-
-        @Override
-        public void onPageStarted(String newUrl) {
-            LOG.d(TAG, "onPageDidNavigate(" + newUrl + ")");
-            boundKeyCodes.clear();
-            pluginManager.onReset();
-            pluginManager.postMessage("onPageStarted", newUrl);
-        }
-
-        @Override
-        public void onReceivedError(int errorCode, String description, String failingUrl) {
-            clearLoadTimeoutTimer();
-            JSONObject data = new JSONObject();
-            try {
-                data.put("errorCode", errorCode);
-                data.put("description", description);
-                data.put("url", failingUrl);
-            } catch (JSONException e) {
-                e.printStackTrace();
-            }
-            pluginManager.postMessage("onReceivedError", data);
-        }
-
-        @Override
-        public void onPageFinishedLoading(String url) {
-            LOG.d(TAG, "onPageFinished(" + url + ")");
-
-            clearLoadTimeoutTimer();
-
-            // Broadcast message that page has loaded
-            pluginManager.postMessage("onPageFinished", url);
-
-            // Make app visible after 2 sec in case there was a JS error and Cordova JS never initialized correctly
-            if (engine.getView().getVisibility() != View.VISIBLE) {
-                Thread t = new Thread(new Runnable() {
-                    public void run() {
-                        try {
-                            Thread.sleep(2000);
-                            if (cordova.getActivity() != null) {
-                                cordova.getActivity().runOnUiThread(new Runnable() {
-                                    public void run() {
-                                        pluginManager.postMessage("spinner", "stop");
-                                    }
-                                });
-                            } else {
-                                LOG.d(TAG, "Cordova activity does not exist.");
-                            }
-                        } catch (InterruptedException e) {
-                        }
-                    }
-                });
-                t.start();
-            }
-
-            // Shutdown if blank loaded
-            if (url.equals("about:blank")) {
-                pluginManager.postMessage("exit", null);
-            }
-        }
-
-        @Override
-        public Boolean onDispatchKeyEvent(KeyEvent event) {
-            int keyCode = event.getKeyCode();
-            boolean isBackButton = keyCode == KeyEvent.KEYCODE_BACK;
-            if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                if (isBackButton && mCustomView != null) {
-                    return true;
-                } else if (boundKeyCodes.contains(keyCode)) {
-                    return true;
-                } else if (isBackButton) {
-                    return engine.canGoBack();
-                }
-            } else if (event.getAction() == KeyEvent.ACTION_UP) {
-                if (isBackButton && mCustomView != null) {
-                    hideCustomView();
-                    return true;
-                } else if (boundKeyCodes.contains(keyCode)) {
-                    String eventName = null;
-                    switch (keyCode) {
-                        case KeyEvent.KEYCODE_VOLUME_DOWN:
-                            eventName = "volumedownbutton";
-                            break;
-                        case KeyEvent.KEYCODE_VOLUME_UP:
-                            eventName = "volumeupbutton";
-                            break;
-                        case KeyEvent.KEYCODE_SEARCH:
-                            eventName = "searchbutton";
-                            break;
-                        case KeyEvent.KEYCODE_MENU:
-                            eventName = "menubutton";
-                            break;
-                        case KeyEvent.KEYCODE_BACK:
-                            eventName = "backbutton";
-                            break;
-                    }
-                    if (eventName != null) {
-                        sendJavascriptEvent(eventName);
-                        return true;
-                    }
-                } else if (isBackButton) {
-                    return engine.goBack();
-                }
-            }
-            return null;
-        }
-
-        @Override
-        public boolean onNavigationAttempt(String url) {
-            // Give plugins the chance to handle the url
-            if (pluginManager.onOverrideUrlLoading(url)) {
-                return true;
-            } else if (pluginManager.shouldAllowNavigation(url)) {
-                return false;
-            } else if (pluginManager.shouldOpenExternalUrl(url)) {
-                showWebPage(url, true, false, null);
-                return true;
-            }
-            LOG.w(TAG, "Blocked (possibly sub-frame) navigation to non-allowed URL: " + url);
-            return true;
-        }
-    }
-}

+ 0 - 410
platforms/android/CordovaLib/src/org/apache/cordova/CoreAndroid.java

@@ -1,410 +0,0 @@
-/*
-       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;
-
-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.telephony.TelephonyManager;
-import android.view.KeyEvent;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-
-/**
- * This class exposes methods in Cordova that can be called from JavaScript.
- */
-public class CoreAndroid extends CordovaPlugin {
-
-    public static final String PLUGIN_NAME = "CoreAndroid";
-    protected static final String TAG = "CordovaApp";
-    private BroadcastReceiver telephonyReceiver;
-    private CallbackContext messageChannel;
-    private PluginResult pendingResume;
-    private PluginResult pendingPause;
-    private final Object messageChannelLock = new Object();
-
-    /**
-     * Send an event to be fired on the Javascript side.
-     *
-     * @param action The name of the event to be fired
-     */
-    public void fireJavascriptEvent(String action) {
-        sendEventMessage(action);
-    }
-
-    /**
-     * Sets the context of the Command. This can then be used to do things like
-     * get file paths associated with the Activity.
-     */
-    @Override
-    public void pluginInitialize() {
-        this.initTelephonyReceiver();
-    }
-
-    /**
-     * 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 from which we were invoked.
-     * @return                  A PluginResult object with a status and message.
-     */
-    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
-        PluginResult.Status status = PluginResult.Status.OK;
-        String result = "";
-
-        try {
-            if (action.equals("clearCache")) {
-                this.clearCache();
-            }
-            else if (action.equals("show")) {
-                // This gets called from JavaScript onCordovaReady to show the webview.
-                // I recommend we change the name of the Message as spinner/stop is not
-                // indicative of what this actually does (shows the webview).
-                cordova.getActivity().runOnUiThread(new Runnable() {
-                    public void run() {
-                        webView.getPluginManager().postMessage("spinner", "stop");
-                    }
-                });
-            }
-            else if (action.equals("loadUrl")) {
-                this.loadUrl(args.getString(0), args.optJSONObject(1));
-            }
-            else if (action.equals("cancelLoadUrl")) {
-                //this.cancelLoadUrl();
-            }
-            else if (action.equals("clearHistory")) {
-                this.clearHistory();
-            }
-            else if (action.equals("backHistory")) {
-                this.backHistory();
-            }
-            else if (action.equals("overrideButton")) {
-                this.overrideButton(args.getString(0), args.getBoolean(1));
-            }
-            else if (action.equals("overrideBackbutton")) {
-                this.overrideBackbutton(args.getBoolean(0));
-            }
-            else if (action.equals("exitApp")) {
-                this.exitApp();
-            }
-			else if (action.equals("messageChannel")) {
-                synchronized(messageChannelLock) {
-                    messageChannel = callbackContext;
-                    if (pendingPause != null) {
-                        sendEventMessage(pendingPause);
-                        pendingPause = null;
-                    }
-                    if (pendingResume != null) {
-                        sendEventMessage(pendingResume);
-                        pendingResume = null;
-                    }
-                }
-                return true;
-            }
-
-            callbackContext.sendPluginResult(new PluginResult(status, result));
-            return true;
-        } catch (JSONException e) {
-            callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
-            return false;
-        }
-    }
-
-    //--------------------------------------------------------------------------
-    // LOCAL METHODS
-    //--------------------------------------------------------------------------
-
-    /**
-     * Clear the resource cache.
-     */
-    public void clearCache() {
-        cordova.getActivity().runOnUiThread(new Runnable() {
-            public void run() {
-                webView.clearCache();
-            }
-        });
-    }
-
-    /**
-     * Load the url into the webview.
-     *
-     * @param url
-     * @param props			Properties that can be passed in to the Cordova activity (i.e. loadingDialog, wait, ...)
-     * @throws JSONException
-     */
-    public void loadUrl(String url, JSONObject props) throws JSONException {
-        LOG.d("App", "App.loadUrl("+url+","+props+")");
-        int wait = 0;
-        boolean openExternal = false;
-        boolean clearHistory = false;
-
-        // If there are properties, then set them on the Activity
-        HashMap<String, Object> params = new HashMap<String, Object>();
-        if (props != null) {
-            JSONArray keys = props.names();
-            for (int i = 0; i < keys.length(); i++) {
-                String key = keys.getString(i);
-                if (key.equals("wait")) {
-                    wait = props.getInt(key);
-                }
-                else if (key.equalsIgnoreCase("openexternal")) {
-                    openExternal = props.getBoolean(key);
-                }
-                else if (key.equalsIgnoreCase("clearhistory")) {
-                    clearHistory = props.getBoolean(key);
-                }
-                else {
-                    Object value = props.get(key);
-                    if (value == null) {
-
-                    }
-                    else if (value.getClass().equals(String.class)) {
-                        params.put(key, (String)value);
-                    }
-                    else if (value.getClass().equals(Boolean.class)) {
-                        params.put(key, (Boolean)value);
-                    }
-                    else if (value.getClass().equals(Integer.class)) {
-                        params.put(key, (Integer)value);
-                    }
-                }
-            }
-        }
-
-        // If wait property, then delay loading
-
-        if (wait > 0) {
-            try {
-                synchronized(this) {
-                    this.wait(wait);
-                }
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
-        this.webView.showWebPage(url, openExternal, clearHistory, params);
-    }
-
-    /**
-     * Clear page history for the app.
-     */
-    public void clearHistory() {
-        cordova.getActivity().runOnUiThread(new Runnable() {
-            public void run() {
-                webView.clearHistory();
-            }
-        });
-    }
-
-    /**
-     * Go to previous page displayed.
-     * This is the same as pressing the backbutton on Android device.
-     */
-    public void backHistory() {
-        cordova.getActivity().runOnUiThread(new Runnable() {
-            public void run() {
-                webView.backHistory();
-            }
-        });
-    }
-
-    /**
-     * Override the default behavior of the Android back button.
-     * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired.
-     *
-     * @param override		T=override, F=cancel override
-     */
-    public void overrideBackbutton(boolean override) {
-        LOG.i("App", "WARNING: Back Button Default Behavior will be overridden.  The backbutton event will be fired!");
-        webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_BACK, override);
-    }
-
-    /**
-     * Override the default behavior of the Android volume buttons.
-     * If overridden, when the volume button is pressed, the "volume[up|down]button" JavaScript event will be fired.
-     *
-     * @param button        volumeup, volumedown
-     * @param override      T=override, F=cancel override
-     */
-    public void overrideButton(String button, boolean override) {
-        LOG.i("App", "WARNING: Volume Button Default Behavior will be overridden.  The volume event will be fired!");
-        if (button.equals("volumeup")) {
-            webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_VOLUME_UP, override);
-        }
-        else if (button.equals("volumedown")) {
-            webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_VOLUME_DOWN, override);
-        }
-        else if (button.equals("menubutton")) {
-            webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_MENU, override);
-        }
-    }
-
-    /**
-     * Return whether the Android back button is overridden by the user.
-     *
-     * @return boolean
-     */
-    public boolean isBackbuttonOverridden() {
-        return webView.isButtonPlumbedToJs(KeyEvent.KEYCODE_BACK);
-    }
-
-    /**
-     * Exit the Android application.
-     */
-    public void exitApp() {
-        this.webView.getPluginManager().postMessage("exit", null);
-    }
-
-
-    /**
-     * Listen for telephony events: RINGING, OFFHOOK and IDLE
-     * Send these events to all plugins using
-     *      CordovaActivity.onMessage("telephone", "ringing" | "offhook" | "idle")
-     */
-    private void initTelephonyReceiver() {
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
-        //final CordovaInterface mycordova = this.cordova;
-        this.telephonyReceiver = new BroadcastReceiver() {
-
-            @Override
-            public void onReceive(Context context, Intent intent) {
-
-                // If state has changed
-                if ((intent != null) && intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
-                    if (intent.hasExtra(TelephonyManager.EXTRA_STATE)) {
-                        String extraData = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
-                        if (extraData.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
-                            LOG.i(TAG, "Telephone RINGING");
-                            webView.getPluginManager().postMessage("telephone", "ringing");
-                        }
-                        else if (extraData.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
-                            LOG.i(TAG, "Telephone OFFHOOK");
-                            webView.getPluginManager().postMessage("telephone", "offhook");
-                        }
-                        else if (extraData.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
-                            LOG.i(TAG, "Telephone IDLE");
-                            webView.getPluginManager().postMessage("telephone", "idle");
-                        }
-                    }
-                }
-            }
-        };
-
-        // Register the receiver
-        webView.getContext().registerReceiver(this.telephonyReceiver, intentFilter);
-    }
-
-    private void sendEventMessage(String action) {
-        JSONObject obj = new JSONObject();
-        try {
-            obj.put("action", action);
-        } catch (JSONException e) {
-            LOG.e(TAG, "Failed to create event message", e);
-        }
-        PluginResult result = new PluginResult(PluginResult.Status.OK, obj);
-
-        if (messageChannel == null) {
-            LOG.i(TAG, "Request to send event before messageChannel initialised: " + action);
-            if ("pause".equals(action)) {
-                pendingPause = result;
-            } else if ("resume".equals(action)) {
-                // When starting normally onPause then onResume is called
-                pendingPause = null;
-            }
-        } else {
-            sendEventMessage(result);
-        }
-    }
-
-    private void sendEventMessage(PluginResult payload) {
-        payload.setKeepCallback(true);
-        if (messageChannel != null) {
-            messageChannel.sendPluginResult(payload);
-        }
-    }
-
-    /*
-     * Unregister the receiver
-     *
-     */
-    public void onDestroy()
-    {
-        webView.getContext().unregisterReceiver(this.telephonyReceiver);
-    }
-
-    /**
-     * Used to send the resume event in the case that the Activity is destroyed by the OS
-     *
-     * @param resumeEvent PluginResult containing the payload for the resume event to be fired
-     */
-    public void sendResumeEvent(PluginResult resumeEvent) {
-        // This operation must be synchronized because plugin results that trigger resume
-        // events can be processed asynchronously
-        synchronized(messageChannelLock) {
-            if (messageChannel != null) {
-                sendEventMessage(resumeEvent);
-            } else {
-                // Might get called before the page loads, so we need to store it until the
-                // messageChannel gets created
-                this.pendingResume = resumeEvent;
-            }
-        }
-    }
-
-      /*
-     * This needs to be implemented if you wish to use the Camera Plugin or other plugins
-     * that read the Build Configuration.
-     *
-     * Thanks to Phil@Medtronic and Graham Borland for finding the answer and posting it to
-     * StackOverflow.  This is annoying as hell!
-     *
-     */
-
-    public static Object getBuildConfigValue(Context ctx, String key)
-    {
-        try
-        {
-            Class<?> clazz = Class.forName(ctx.getClass().getPackage().getName() + ".BuildConfig");
-            Field field = clazz.getField(key);
-            return field.get(null);
-        } catch (ClassNotFoundException e) {
-            LOG.d(TAG, "Unable to get the BuildConfig, is this built with ANT?");
-            e.printStackTrace();
-        } catch (NoSuchFieldException e) {
-            LOG.d(TAG, key + " is not a valid field. Check your build.gradle");
-        } catch (IllegalAccessException e) {
-            LOG.d(TAG, "Illegal Access Exception: Let's print a stack trace.");
-            e.printStackTrace();
-        } catch (NullPointerException e) {
-            LOG.d(TAG, "Null Pointer Exception: Let's print a stack trace.");
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-}

+ 0 - 31
platforms/android/CordovaLib/src/org/apache/cordova/ExposedJsApi.java

@@ -1,31 +0,0 @@
-/*
-       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;
-
-import org.json.JSONException;
-
-/*
- * Any exposed Javascript API MUST implement these three things!
- */
-public interface ExposedJsApi {
-    public String exec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException;
-    public void setNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException;
-    public String retrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException;
-}

+ 0 - 66
platforms/android/CordovaLib/src/org/apache/cordova/ICordovaClientCertRequest.java

@@ -1,66 +0,0 @@
-/*
-       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;
-
-import java.security.Principal;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-
-/**
- * Specifies interface for handling certificate requests.
- */
-public interface ICordovaClientCertRequest {
-    /**
-     * Cancel this request
-     */
-    public void cancel();
-
-    /*
-     * Returns the host name of the server requesting the certificate.
-     */
-    public String getHost();
-
-    /*
-     * Returns the acceptable types of asymmetric keys (can be null).
-     */
-    public String[] getKeyTypes();
-
-    /*
-     * Returns the port number of the server requesting the certificate.
-     */
-    public int getPort();
-
-    /*
-     * Returns the acceptable certificate issuers for the certificate matching the private key (can be null).
-     */
-    public Principal[] getPrincipals();
-
-    /*
-     * Ignore the request for now. Do not remember user's choice.
-     */
-    public void ignore();
-
-    /*
-     * Proceed with the specified private key and client certificate chain. Remember the user's positive choice and use it for future requests.
-     *
-     * @param privateKey The privateKey
-     * @param chain The certificate chain
-     */
-    public void proceed(PrivateKey privateKey, X509Certificate[] chain);
-}

+ 0 - 33
platforms/android/CordovaLib/src/org/apache/cordova/ICordovaCookieManager.java

@@ -1,33 +0,0 @@
-/*
-       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;
-
-public interface ICordovaCookieManager {
-
-    public void setCookiesEnabled(boolean accept);
-
-    public void setCookie(final String url, final String value);
-
-    public String getCookie(final String url);
-
-    public void clearCookies();
-
-    public void flush();
-};

+ 0 - 38
platforms/android/CordovaLib/src/org/apache/cordova/ICordovaHttpAuthHandler.java

@@ -1,38 +0,0 @@
-/*
-       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;
-
-/**
- * Specifies interface for HTTP auth handler object which is used to handle auth requests and
- * specifying user credentials.
- */
- public interface ICordovaHttpAuthHandler {
-    /**
-     * Instructs the WebView to cancel the authentication request.
-     */
-    public void cancel ();
-
-    /**
-     * Instructs the WebView to proceed with the authentication with the given credentials.
-     *
-     * @param username The user name
-     * @param password The password
-     */
-    public void proceed (String username, String password);
-}

+ 0 - 244
platforms/android/CordovaLib/src/org/apache/cordova/LOG.java

@@ -1,244 +0,0 @@
-/*
-       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;
-
-import android.util.Log;
-
-/**
- * Log to Android logging system.
- *
- * Log message can be a string or a printf formatted string with arguments.
- * See http://developer.android.com/reference/java/util/Formatter.html
- */
-public class LOG {
-
-    public static final int VERBOSE = Log.VERBOSE;
-    public static final int DEBUG = Log.DEBUG;
-    public static final int INFO = Log.INFO;
-    public static final int WARN = Log.WARN;
-    public static final int ERROR = Log.ERROR;
-
-    // Current log level
-    public static int LOGLEVEL = Log.ERROR;
-
-    /**
-     * Set the current log level.
-     *
-     * @param logLevel
-     */
-    public static void setLogLevel(int logLevel) {
-        LOGLEVEL = logLevel;
-        Log.i("CordovaLog", "Changing log level to " + logLevel);
-    }
-
-    /**
-     * Set the current log level.
-     *
-     * @param logLevel
-     */
-    public static void setLogLevel(String logLevel) {
-        if ("VERBOSE".equals(logLevel)) LOGLEVEL = VERBOSE;
-        else if ("DEBUG".equals(logLevel)) LOGLEVEL = DEBUG;
-        else if ("INFO".equals(logLevel)) LOGLEVEL = INFO;
-        else if ("WARN".equals(logLevel)) LOGLEVEL = WARN;
-        else if ("ERROR".equals(logLevel)) LOGLEVEL = ERROR;
-        Log.i("CordovaLog", "Changing log level to " + logLevel + "(" + LOGLEVEL + ")");
-    }
-
-    /**
-     * Determine if log level will be logged
-     *
-     * @param logLevel
-     * @return true if the parameter passed in is greater than or equal to the current log level
-     */
-    public static boolean isLoggable(int logLevel) {
-        return (logLevel >= LOGLEVEL);
-    }
-
-    /**
-     * Verbose log message.
-     *
-     * @param tag
-     * @param s
-     */
-    public static void v(String tag, String s) {
-        if (LOG.VERBOSE >= LOGLEVEL) Log.v(tag, s);
-    }
-
-    /**
-     * Debug log message.
-     *
-     * @param tag
-     * @param s
-     */
-    public static void d(String tag, String s) {
-        if (LOG.DEBUG >= LOGLEVEL) Log.d(tag, s);
-    }
-
-    /**
-     * Info log message.
-     *
-     * @param tag
-     * @param s
-     */
-    public static void i(String tag, String s) {
-        if (LOG.INFO >= LOGLEVEL) Log.i(tag, s);
-    }
-
-    /**
-     * Warning log message.
-     *
-     * @param tag
-     * @param s
-     */
-    public static void w(String tag, String s) {
-        if (LOG.WARN >= LOGLEVEL) Log.w(tag, s);
-    }
-
-    /**
-     * Error log message.
-     *
-     * @param tag
-     * @param s
-     */
-    public static void e(String tag, String s) {
-        if (LOG.ERROR >= LOGLEVEL) Log.e(tag, s);
-    }
-
-    /**
-     * Verbose log message.
-     *
-     * @param tag
-     * @param s
-     * @param e
-     */
-    public static void v(String tag, String s, Throwable e) {
-        if (LOG.VERBOSE >= LOGLEVEL) Log.v(tag, s, e);
-    }
-
-    /**
-     * Debug log message.
-     *
-     * @param tag
-     * @param s
-     * @param e
-     */
-    public static void d(String tag, String s, Throwable e) {
-        if (LOG.DEBUG >= LOGLEVEL) Log.d(tag, s, e);
-    }
-
-    /**
-     * Info log message.
-     *
-     * @param tag
-     * @param s
-     * @param e
-     */
-    public static void i(String tag, String s, Throwable e) {
-        if (LOG.INFO >= LOGLEVEL) Log.i(tag, s, e);
-    }
-
-    /**
-     * Warning log message.
-     *
-     * @param tag
-     * @param e
-     */
-    public static void w(String tag, Throwable e) {
-        if (LOG.WARN >= LOGLEVEL) Log.w(tag, e);
-    }
-
-    /**
-     * Warning log message.
-     *
-     * @param tag
-     * @param s
-     * @param e
-     */
-    public static void w(String tag, String s, Throwable e) {
-        if (LOG.WARN >= LOGLEVEL) Log.w(tag, s, e);
-    }
-
-    /**
-     * Error log message.
-     *
-     * @param tag
-     * @param s
-     * @param e
-     */
-    public static void e(String tag, String s, Throwable e) {
-        if (LOG.ERROR >= LOGLEVEL) Log.e(tag, s, e);
-    }
-
-    /**
-     * Verbose log message with printf formatting.
-     *
-     * @param tag
-     * @param s
-     * @param args
-     */
-    public static void v(String tag, String s, Object... args) {
-        if (LOG.VERBOSE >= LOGLEVEL) Log.v(tag, String.format(s, args));
-    }
-
-    /**
-     * Debug log message with printf formatting.
-     *
-     * @param tag
-     * @param s
-     * @param args
-     */
-    public static void d(String tag, String s, Object... args) {
-        if (LOG.DEBUG >= LOGLEVEL) Log.d(tag, String.format(s, args));
-    }
-
-    /**
-     * Info log message with printf formatting.
-     *
-     * @param tag
-     * @param s
-     * @param args
-     */
-    public static void i(String tag, String s, Object... args) {
-        if (LOG.INFO >= LOGLEVEL) Log.i(tag, String.format(s, args));
-    }
-
-    /**
-     * Warning log message with printf formatting.
-     *
-     * @param tag
-     * @param s
-     * @param args
-     */
-    public static void w(String tag, String s, Object... args) {
-        if (LOG.WARN >= LOGLEVEL) Log.w(tag, String.format(s, args));
-    }
-
-    /**
-     * Error log message with printf formatting.
-     *
-     * @param tag
-     * @param s
-     * @param args
-     */
-    public static void e(String tag, String s, Object... args) {
-        if (LOG.ERROR >= LOGLEVEL) Log.e(tag, String.format(s, args));
-    }
-
-}

+ 0 - 552
platforms/android/CordovaLib/src/org/apache/cordova/NativeToJsMessageQueue.java

@@ -1,552 +0,0 @@
-/*
-       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;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-
-/**
- * Holds the list of messages to be sent to the WebView.
- */
-public class NativeToJsMessageQueue {
-    private static final String LOG_TAG = "JsMessageQueue";
-
-    // Set this to true to force plugin results to be encoding as
-    // JS instead of the custom format (useful for benchmarking).
-    // Doesn't work for multipart messages.
-    private static final boolean FORCE_ENCODE_USING_EVAL = false;
-
-    // Disable sending back native->JS messages during an exec() when the active
-    // exec() is asynchronous. Set this to true when running bridge benchmarks.
-    static final boolean DISABLE_EXEC_CHAINING = false;
-
-    // A hopefully reasonable upper limit of how much combined payload data
-    // to send to the JavaScript in one shot.
-    // This currently only chops up on message boundaries.
-    // It may be useful to split and reassemble response messages someday.
-    private static int COMBINED_RESPONSE_CUTOFF = 16 * 1024 * 1024;
-
-    /**
-     * When true, the active listener is not fired upon enqueue. When set to false,
-     * the active listener will be fired if the queue is non-empty.
-     */
-    private boolean paused;
-
-    /**
-     * The list of JavaScript statements to be sent to JavaScript.
-     */
-    private final LinkedList<JsMessage> queue = new LinkedList<JsMessage>();
-
-    /**
-     * The array of listeners that can be used to send messages to JS.
-     */
-    private ArrayList<BridgeMode> bridgeModes = new ArrayList<BridgeMode>();
-
-    /**
-     * When null, the bridge is disabled. This occurs during page transitions.
-     * When disabled, all callbacks are dropped since they are assumed to be
-     * relevant to the previous page.
-     */
-    private BridgeMode activeBridgeMode;
-
-    public void addBridgeMode(BridgeMode bridgeMode) {
-        bridgeModes.add(bridgeMode);
-    }
-
-    public boolean isBridgeEnabled() {
-        return activeBridgeMode != null;
-    }
-
-    public boolean isEmpty() {
-        return queue.isEmpty();
-    }
-
-    /**
-     * Changes the bridge mode.
-     */
-    public void setBridgeMode(int value) {
-        if (value < -1 || value >= bridgeModes.size()) {
-            LOG.d(LOG_TAG, "Invalid NativeToJsBridgeMode: " + value);
-        } else {
-            BridgeMode newMode = value < 0 ? null : bridgeModes.get(value);
-            if (newMode != activeBridgeMode) {
-                LOG.d(LOG_TAG, "Set native->JS mode to " + (newMode == null ? "null" : newMode.getClass().getSimpleName()));
-                synchronized (this) {
-                    activeBridgeMode = newMode;
-                    if (newMode != null) {
-                        newMode.reset();
-                        if (!paused && !queue.isEmpty()) {
-                            newMode.onNativeToJsMessageAvailable(this);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Clears all messages and resets to the default bridge mode.
-     */
-    public void reset() {
-        synchronized (this) {
-            queue.clear();
-            setBridgeMode(-1);
-        }
-    }
-
-    private int calculatePackedMessageLength(JsMessage message) {
-        int messageLen = message.calculateEncodedLength();
-        String messageLenStr = String.valueOf(messageLen);
-        return messageLenStr.length() + messageLen + 1;
-    }
-
-    private void packMessage(JsMessage message, StringBuilder sb) {
-        int len = message.calculateEncodedLength();
-        sb.append(len)
-          .append(' ');
-        message.encodeAsMessage(sb);
-    }
-
-    /**
-     * Combines and returns queued messages combined into a single string.
-     *
-     * Combines as many messages as possible, without exceeding
-     * COMBINED_RESPONSE_CUTOFF in case of multiple response messages.
-     *
-     * Returns null if the queue is empty.
-     */
-    public String popAndEncode(boolean fromOnlineEvent) {
-        synchronized (this) {
-            if (activeBridgeMode == null) {
-                return null;
-            }
-            activeBridgeMode.notifyOfFlush(this, fromOnlineEvent);
-            if (queue.isEmpty()) {
-                return null;
-            }
-            int totalPayloadLen = 0;
-            int numMessagesToSend = 0;
-            for (JsMessage message : queue) {
-                int messageSize = calculatePackedMessageLength(message);
-                if (numMessagesToSend > 0 &&
-                    COMBINED_RESPONSE_CUTOFF > 0 &&
-                    totalPayloadLen + messageSize > COMBINED_RESPONSE_CUTOFF
-                   ) {
-                    break;
-                }
-                totalPayloadLen += messageSize;
-                numMessagesToSend += 1;
-            }
-
-            StringBuilder sb = new StringBuilder(totalPayloadLen);
-            for (int i = 0; i < numMessagesToSend; ++i) {
-                JsMessage message = queue.removeFirst();
-                packMessage(message, sb);
-            }
-
-            if (!queue.isEmpty()) {
-                // Attach a char to indicate that there are more messages pending.
-                sb.append('*');
-            }
-            String ret = sb.toString();
-            return ret;
-        }
-    }
-
-    /**
-     * Same as popAndEncode(), except encodes in a form that can be executed as JS.
-     */
-    public String popAndEncodeAsJs() {
-        synchronized (this) {
-            int length = queue.size();
-            if (length == 0) {
-                return null;
-            }
-            int totalPayloadLen = 0;
-            int numMessagesToSend = 0;
-            for (JsMessage message : queue) {
-                int messageSize = message.calculateEncodedLength() + 50; // overestimate.
-                if (numMessagesToSend > 0 &&
-                    COMBINED_RESPONSE_CUTOFF > 0 &&
-                    totalPayloadLen + messageSize > COMBINED_RESPONSE_CUTOFF
-                   ) {
-                    break;
-                }
-                totalPayloadLen += messageSize;
-                numMessagesToSend += 1;
-            }
-            boolean willSendAllMessages = numMessagesToSend == queue.size();
-            StringBuilder sb = new StringBuilder(totalPayloadLen + (willSendAllMessages ? 0 : 100));
-            // Wrap each statement in a try/finally so that if one throws it does
-            // not affect the next.
-            for (int i = 0; i < numMessagesToSend; ++i) {
-                JsMessage message = queue.removeFirst();
-                if (willSendAllMessages && (i + 1 == numMessagesToSend)) {
-                    message.encodeAsJsMessage(sb);
-                } else {
-                    sb.append("try{");
-                    message.encodeAsJsMessage(sb);
-                    sb.append("}finally{");
-                }
-            }
-            if (!willSendAllMessages) {
-                sb.append("window.setTimeout(function(){cordova.require('cordova/plugin/android/polling').pollOnce();},0);");
-            }
-            for (int i = willSendAllMessages ? 1 : 0; i < numMessagesToSend; ++i) {
-                sb.append('}');
-            }
-            String ret = sb.toString();
-            return ret;
-        }
-    }
-
-    /**
-     * Add a JavaScript statement to the list.
-     */
-    public void addJavaScript(String statement) {
-        enqueueMessage(new JsMessage(statement));
-    }
-
-    /**
-     * Add a JavaScript statement to the list.
-     */
-    public void addPluginResult(PluginResult result, String callbackId) {
-        if (callbackId == null) {
-            LOG.e(LOG_TAG, "Got plugin result with no callbackId", new Throwable());
-            return;
-        }
-        // Don't send anything if there is no result and there is no need to
-        // clear the callbacks.
-        boolean noResult = result.getStatus() == PluginResult.Status.NO_RESULT.ordinal();
-        boolean keepCallback = result.getKeepCallback();
-        if (noResult && keepCallback) {
-            return;
-        }
-        JsMessage message = new JsMessage(result, callbackId);
-        if (FORCE_ENCODE_USING_EVAL) {
-            StringBuilder sb = new StringBuilder(message.calculateEncodedLength() + 50);
-            message.encodeAsJsMessage(sb);
-            message = new JsMessage(sb.toString());
-        }
-
-        enqueueMessage(message);
-    }
-
-    private void enqueueMessage(JsMessage message) {
-        synchronized (this) {
-            if (activeBridgeMode == null) {
-                LOG.d(LOG_TAG, "Dropping Native->JS message due to disabled bridge");
-                return;
-            }
-            queue.add(message);
-            if (!paused) {
-                activeBridgeMode.onNativeToJsMessageAvailable(this);
-            }
-        }
-    }
-
-    public void setPaused(boolean value) {
-        if (paused && value) {
-            // This should never happen. If a use-case for it comes up, we should
-            // change pause to be a counter.
-            LOG.e(LOG_TAG, "nested call to setPaused detected.", new Throwable());
-        }
-        paused = value;
-        if (!value) {
-            synchronized (this) {
-                if (!queue.isEmpty() && activeBridgeMode != null) {
-                    activeBridgeMode.onNativeToJsMessageAvailable(this);
-                }
-            }
-        }
-    }
-
-    public static abstract class BridgeMode {
-        public abstract void onNativeToJsMessageAvailable(NativeToJsMessageQueue queue);
-        public void notifyOfFlush(NativeToJsMessageQueue queue, boolean fromOnlineEvent) {}
-        public void reset() {}
-    }
-
-    /** Uses JS polls for messages on a timer.. */
-    public static class NoOpBridgeMode extends BridgeMode {
-        @Override public void onNativeToJsMessageAvailable(NativeToJsMessageQueue queue) {
-        }
-    }
-
-    /** Uses webView.loadUrl("javascript:") to execute messages. */
-    public static class LoadUrlBridgeMode extends BridgeMode {
-        private final CordovaWebViewEngine engine;
-        private final CordovaInterface cordova;
-
-        public LoadUrlBridgeMode(CordovaWebViewEngine engine, CordovaInterface cordova) {
-            this.engine = engine;
-            this.cordova = cordova;
-        }
-
-        @Override
-        public void onNativeToJsMessageAvailable(final NativeToJsMessageQueue queue) {
-            cordova.getActivity().runOnUiThread(new Runnable() {
-                public void run() {
-                    String js = queue.popAndEncodeAsJs();
-                    if (js != null) {
-                        engine.loadUrl("javascript:" + js, false);
-                    }
-                }
-            });
-        }
-    }
-
-    /** Uses online/offline events to tell the JS when to poll for messages. */
-    public static class OnlineEventsBridgeMode extends BridgeMode {
-        private final OnlineEventsBridgeModeDelegate delegate;
-        private boolean online;
-        private boolean ignoreNextFlush;
-
-        public interface OnlineEventsBridgeModeDelegate {
-            void setNetworkAvailable(boolean value);
-            void runOnUiThread(Runnable r);
-        }
-
-        public OnlineEventsBridgeMode(OnlineEventsBridgeModeDelegate delegate) {
-            this.delegate = delegate;
-        }
-
-        @Override
-        public void reset() {
-            delegate.runOnUiThread(new Runnable() {
-                public void run() {
-                    online = false;
-                    // If the following call triggers a notifyOfFlush, then ignore it.
-                    ignoreNextFlush = true;
-                    delegate.setNetworkAvailable(true);
-                }
-            });
-        }
-
-        @Override
-        public void onNativeToJsMessageAvailable(final NativeToJsMessageQueue queue) {
-            delegate.runOnUiThread(new Runnable() {
-                public void run() {
-                    if (!queue.isEmpty()) {
-                        ignoreNextFlush = false;
-                        delegate.setNetworkAvailable(online);
-                    }
-                }
-            });
-        }
-        // Track when online/offline events are fired so that we don't fire excess events.
-        @Override
-        public void notifyOfFlush(final NativeToJsMessageQueue queue, boolean fromOnlineEvent) {
-            if (fromOnlineEvent && !ignoreNextFlush) {
-                online = !online;
-            }
-        }
-    }
-
-    /** Uses webView.evaluateJavascript to execute messages. */
-    public static class EvalBridgeMode extends BridgeMode {
-        private final CordovaWebViewEngine engine;
-        private final CordovaInterface cordova;
-
-        public EvalBridgeMode(CordovaWebViewEngine engine, CordovaInterface cordova) {
-            this.engine = engine;
-            this.cordova = cordova;
-        }
-
-        @Override
-        public void onNativeToJsMessageAvailable(final NativeToJsMessageQueue queue) {
-            cordova.getActivity().runOnUiThread(new Runnable() {
-                public void run() {
-                    String js = queue.popAndEncodeAsJs();
-                    if (js != null) {
-                        engine.evaluateJavascript(js, null);
-                    }
-                }
-            });
-        }
-    }
-
-
-
-    private static class JsMessage {
-        final String jsPayloadOrCallbackId;
-        final PluginResult pluginResult;
-        JsMessage(String js) {
-            if (js == null) {
-                throw new NullPointerException();
-            }
-            jsPayloadOrCallbackId = js;
-            pluginResult = null;
-        }
-        JsMessage(PluginResult pluginResult, String callbackId) {
-            if (callbackId == null || pluginResult == null) {
-                throw new NullPointerException();
-            }
-            jsPayloadOrCallbackId = callbackId;
-            this.pluginResult = pluginResult;
-        }
-
-        static int calculateEncodedLengthHelper(PluginResult pluginResult) {
-            switch (pluginResult.getMessageType()) {
-                case PluginResult.MESSAGE_TYPE_BOOLEAN: // f or t
-                case PluginResult.MESSAGE_TYPE_NULL: // N
-                    return 1;
-                case PluginResult.MESSAGE_TYPE_NUMBER: // n
-                    return 1 + pluginResult.getMessage().length();
-                case PluginResult.MESSAGE_TYPE_STRING: // s
-                    return 1 + pluginResult.getStrMessage().length();
-                case PluginResult.MESSAGE_TYPE_BINARYSTRING:
-                    return 1 + pluginResult.getMessage().length();
-                case PluginResult.MESSAGE_TYPE_ARRAYBUFFER:
-                    return 1 + pluginResult.getMessage().length();
-                case PluginResult.MESSAGE_TYPE_MULTIPART:
-                    int ret = 1;
-                    for (int i = 0; i < pluginResult.getMultipartMessagesSize(); i++) {
-                        int length = calculateEncodedLengthHelper(pluginResult.getMultipartMessage(i));
-                        int argLength = String.valueOf(length).length();
-                        ret += argLength + 1 + length;
-                    }
-                    return ret;
-                case PluginResult.MESSAGE_TYPE_JSON:
-                default:
-                    return pluginResult.getMessage().length();
-            }
-        }
-
-        int calculateEncodedLength() {
-            if (pluginResult == null) {
-                return jsPayloadOrCallbackId.length() + 1;
-            }
-            int statusLen = String.valueOf(pluginResult.getStatus()).length();
-            int ret = 2 + statusLen + 1 + jsPayloadOrCallbackId.length() + 1;
-            return ret + calculateEncodedLengthHelper(pluginResult);
-            }
-
-        static void encodeAsMessageHelper(StringBuilder sb, PluginResult pluginResult) {
-            switch (pluginResult.getMessageType()) {
-                case PluginResult.MESSAGE_TYPE_BOOLEAN:
-                    sb.append(pluginResult.getMessage().charAt(0)); // t or f.
-                    break;
-                case PluginResult.MESSAGE_TYPE_NULL: // N
-                    sb.append('N');
-                    break;
-                case PluginResult.MESSAGE_TYPE_NUMBER: // n
-                    sb.append('n')
-                      .append(pluginResult.getMessage());
-                    break;
-                case PluginResult.MESSAGE_TYPE_STRING: // s
-                    sb.append('s');
-                    sb.append(pluginResult.getStrMessage());
-                    break;
-                case PluginResult.MESSAGE_TYPE_BINARYSTRING: // S
-                    sb.append('S');
-                    sb.append(pluginResult.getMessage());
-                    break;
-                case PluginResult.MESSAGE_TYPE_ARRAYBUFFER: // A
-                    sb.append('A');
-                    sb.append(pluginResult.getMessage());
-                    break;
-                case PluginResult.MESSAGE_TYPE_MULTIPART:
-                    sb.append('M');
-                    for (int i = 0; i < pluginResult.getMultipartMessagesSize(); i++) {
-                        PluginResult multipartMessage = pluginResult.getMultipartMessage(i);
-                        sb.append(String.valueOf(calculateEncodedLengthHelper(multipartMessage)));
-                        sb.append(' ');
-                        encodeAsMessageHelper(sb, multipartMessage);
-                    }
-                    break;
-                case PluginResult.MESSAGE_TYPE_JSON:
-                default:
-                    sb.append(pluginResult.getMessage()); // [ or {
-            }
-        }
-
-        void encodeAsMessage(StringBuilder sb) {
-            if (pluginResult == null) {
-                sb.append('J')
-                  .append(jsPayloadOrCallbackId);
-                return;
-            }
-            int status = pluginResult.getStatus();
-            boolean noResult = status == PluginResult.Status.NO_RESULT.ordinal();
-            boolean resultOk = status == PluginResult.Status.OK.ordinal();
-            boolean keepCallback = pluginResult.getKeepCallback();
-
-            sb.append((noResult || resultOk) ? 'S' : 'F')
-              .append(keepCallback ? '1' : '0')
-              .append(status)
-              .append(' ')
-              .append(jsPayloadOrCallbackId)
-              .append(' ');
-
-            encodeAsMessageHelper(sb, pluginResult);
-        }
-
-        void buildJsMessage(StringBuilder sb) {
-            switch (pluginResult.getMessageType()) {
-                case PluginResult.MESSAGE_TYPE_MULTIPART:
-                    int size = pluginResult.getMultipartMessagesSize();
-                    for (int i=0; i<size; i++) {
-                        PluginResult subresult = pluginResult.getMultipartMessage(i);
-                        JsMessage submessage = new JsMessage(subresult, jsPayloadOrCallbackId);
-                        submessage.buildJsMessage(sb);
-                        if (i < (size-1)) {
-                            sb.append(",");
-                        }
-                    }
-                    break;
-                case PluginResult.MESSAGE_TYPE_BINARYSTRING:
-                    sb.append("atob('")
-                            .append(pluginResult.getMessage())
-                            .append("')");
-                    break;
-                case PluginResult.MESSAGE_TYPE_ARRAYBUFFER:
-                    sb.append("cordova.require('cordova/base64').toArrayBuffer('")
-                            .append(pluginResult.getMessage())
-                            .append("')");
-                    break;
-                case PluginResult.MESSAGE_TYPE_NULL:
-                    sb.append("null");
-                    break;
-                default:
-                    sb.append(pluginResult.getMessage());
-            }
-        }
-
-        void encodeAsJsMessage(StringBuilder sb) {
-            if (pluginResult == null) {
-                sb.append(jsPayloadOrCallbackId);
-            } else {
-                int status = pluginResult.getStatus();
-                boolean success = (status == PluginResult.Status.OK.ordinal()) || (status == PluginResult.Status.NO_RESULT.ordinal());
-                sb.append("cordova.callbackFromNative('")
-                        .append(jsPayloadOrCallbackId)
-                        .append("',")
-                        .append(success)
-                        .append(",")
-                        .append(status)
-                        .append(",[");
-                buildJsMessage(sb);
-                sb.append("],")
-                        .append(pluginResult.getKeepCallback())
-                        .append(");");
-            }
-        }
-    }
-}

+ 0 - 87
platforms/android/CordovaLib/src/org/apache/cordova/PermissionHelper.java

@@ -1,87 +0,0 @@
-/*
-       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;
-
-import java.util.Arrays;
-
-import org.json.JSONException;
-
-import android.content.pm.PackageManager;
-
-/**
- * This class provides reflective methods for permission requesting and checking so that plugins
- * written for cordova-android 5.0.0+ can still compile with earlier cordova-android versions.
- */
-public class PermissionHelper {
-    private static final String LOG_TAG = "CordovaPermissionHelper";
-
-    /**
-     * Requests a "dangerous" permission for the application at runtime. This is a helper method
-     * alternative to cordovaInterface.requestPermission() that does not require the project to be
-     * built with cordova-android 5.0.0+
-     *
-     * @param plugin        The plugin the permission is being requested for
-     * @param requestCode   A requestCode to be passed to the plugin's onRequestPermissionResult()
-     *                      along with the result of the permission request
-     * @param permission    The permission to be requested
-     */
-    public static void requestPermission(CordovaPlugin plugin, int requestCode, String permission) {
-        PermissionHelper.requestPermissions(plugin, requestCode, new String[] {permission});
-    }
-
-    /**
-     * Requests "dangerous" permissions for the application at runtime. This is a helper method
-     * alternative to cordovaInterface.requestPermissions() that does not require the project to be
-     * built with cordova-android 5.0.0+
-     *
-     * @param plugin        The plugin the permissions are being requested for
-     * @param requestCode   A requestCode to be passed to the plugin's onRequestPermissionResult()
-     *                      along with the result of the permissions request
-     * @param permissions   The permissions to be requested
-     */
-    public static void requestPermissions(CordovaPlugin plugin, int requestCode, String[] permissions) {
-        plugin.cordova.requestPermissions(plugin, requestCode, permissions);
-    }
-
-    /**
-     * Checks at runtime to see if the application has been granted a permission. This is a helper
-     * method alternative to cordovaInterface.hasPermission() that does not require the project to
-     * be built with cordova-android 5.0.0+
-     *
-     * @param plugin        The plugin the permission is being checked against
-     * @param permission    The permission to be checked
-     *
-     * @return              True if the permission has already been granted and false otherwise
-     */
-    public static boolean hasPermission(CordovaPlugin plugin, String permission) {
-        return plugin.cordova.hasPermission(permission);
-    }
-
-    private static void deliverPermissionResult(CordovaPlugin plugin, int requestCode, String[] permissions) {
-        // Generate the request results
-        int[] requestResults = new int[permissions.length];
-        Arrays.fill(requestResults, PackageManager.PERMISSION_GRANTED);
-
-        try {
-            plugin.onRequestPermissionResult(requestCode, permissions, requestResults);
-        } catch (JSONException e) {
-            LOG.e(LOG_TAG, "JSONException when delivering permissions results", e);
-        }
-    }
-}

+ 0 - 70
platforms/android/CordovaLib/src/org/apache/cordova/PluginEntry.java

@@ -1,70 +0,0 @@
-/*
-       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;
-
-import org.apache.cordova.CordovaPlugin;
-
-/**
- * This class represents a service entry object.
- */
-public final class PluginEntry {
-
-    /**
-     * The name of the service that this plugin implements
-     */
-    public final String service;
-
-    /**
-     * The plugin class name that implements the service.
-     */
-    public final String pluginClass;
-
-    /**
-     * The pre-instantiated plugin to use for this entry.
-     */
-    public final CordovaPlugin plugin;
-
-    /**
-     * Flag that indicates the plugin object should be created when PluginManager is initialized.
-     */
-    public final boolean onload;
-
-    /**
-     * Constructs with a CordovaPlugin already instantiated.
-     */
-    public PluginEntry(String service, CordovaPlugin plugin) {
-        this(service, plugin.getClass().getName(), true, plugin);
-    }
-
-    /**
-     * @param service               The name of the service
-     * @param pluginClass           The plugin class name
-     * @param onload                Create plugin object when HTML page is loaded
-     */
-    public PluginEntry(String service, String pluginClass, boolean onload) {
-        this(service, pluginClass, onload, null);
-    }
-
-    private PluginEntry(String service, String pluginClass, boolean onload, CordovaPlugin plugin) {
-        this.service = service;
-        this.pluginClass = pluginClass;
-        this.onload = onload;
-        this.plugin = plugin;
-    }
-}

+ 0 - 580
platforms/android/CordovaLib/src/org/apache/cordova/PluginManager.java

@@ -1,580 +0,0 @@
-/*
-       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;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.json.JSONException;
-
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Debug;
-import android.os.Build;
-
-/**
- * PluginManager is exposed to JavaScript in the Cordova WebView.
- *
- * Calling native plugin code can be done by calling PluginManager.exec(...)
- * from JavaScript.
- */
-public class PluginManager {
-    private static String TAG = "PluginManager";
-    private static final int SLOW_EXEC_WARNING_THRESHOLD = Debug.isDebuggerConnected() ? 60 : 16;
-
-    // List of service entries
-    private final Map<String, CordovaPlugin> pluginMap = Collections.synchronizedMap(new LinkedHashMap<String, CordovaPlugin>());
-    private final Map<String, PluginEntry> entryMap = Collections.synchronizedMap(new LinkedHashMap<String, PluginEntry>());
-
-    private final CordovaInterface ctx;
-    private final CordovaWebView app;
-    private boolean isInitialized;
-
-    private CordovaPlugin permissionRequester;
-
-    public PluginManager(CordovaWebView cordovaWebView, CordovaInterface cordova, Collection<PluginEntry> pluginEntries) {
-        this.ctx = cordova;
-        this.app = cordovaWebView;
-        setPluginEntries(pluginEntries);
-    }
-
-    public Collection<PluginEntry> getPluginEntries() {
-        return entryMap.values();
-    }
-
-    public void setPluginEntries(Collection<PluginEntry> pluginEntries) {
-        if (isInitialized) {
-            this.onPause(false);
-            this.onDestroy();
-            pluginMap.clear();
-            entryMap.clear();
-        }
-        for (PluginEntry entry : pluginEntries) {
-            addService(entry);
-        }
-        if (isInitialized) {
-            startupPlugins();
-        }
-    }
-
-    /**
-     * Init when loading a new HTML page into webview.
-     */
-    public void init() {
-        LOG.d(TAG, "init()");
-        isInitialized = true;
-        this.onPause(false);
-        this.onDestroy();
-        pluginMap.clear();
-        this.startupPlugins();
-    }
-
-    /**
-     * Create plugins objects that have onload set.
-     */
-    private void startupPlugins() {
-        synchronized (entryMap) {
-            for (PluginEntry entry : entryMap.values()) {
-                // Add a null entry to for each non-startup plugin to avoid ConcurrentModificationException
-                // When iterating plugins.
-                if (entry.onload) {
-                    getPlugin(entry.service);
-                }
-                else {
-                    LOG.d(TAG, "startupPlugins: put - " + entry.service);
-                    pluginMap.put(entry.service, null);
-                }
-            }
-        }
-    }
-
-    /**
-     * Receives a request for execution and fulfills it by finding the appropriate
-     * Java class and calling it's execute method.
-     *
-     * PluginManager.exec can be used either synchronously or async. In either case, a JSON encoded
-     * string is returned that will indicate if any errors have occurred when trying to find
-     * or execute the class denoted by the clazz argument.
-     *
-     * @param service       String containing the service to run
-     * @param action        String containing the action that the class is supposed to perform. This is
-     *                      passed to the plugin execute method and it is up to the plugin developer
-     *                      how to deal with it.
-     * @param callbackId    String containing the id of the callback that is execute in JavaScript if
-     *                      this is an async plugin call.
-     * @param rawArgs       An Array literal string containing any arguments needed in the
-     *                      plugin execute method.
-     */
-    public void exec(final String service, final String action, final String callbackId, final String rawArgs) {
-        CordovaPlugin plugin = getPlugin(service);
-        if (plugin == null) {
-            LOG.d(TAG, "exec() call to unknown plugin: " + service);
-            PluginResult cr = new PluginResult(PluginResult.Status.CLASS_NOT_FOUND_EXCEPTION);
-            app.sendPluginResult(cr, callbackId);
-            return;
-        }
-        CallbackContext callbackContext = new CallbackContext(callbackId, app);
-        try {
-            long pluginStartTime = System.currentTimeMillis();
-            boolean wasValidAction = plugin.execute(action, rawArgs, callbackContext);
-            long duration = System.currentTimeMillis() - pluginStartTime;
-
-            if (duration > SLOW_EXEC_WARNING_THRESHOLD) {
-                LOG.w(TAG, "THREAD WARNING: exec() call to " + service + "." + action + " blocked the main thread for " + duration + "ms. Plugin should use CordovaInterface.getThreadPool().");
-            }
-            if (!wasValidAction) {
-                PluginResult cr = new PluginResult(PluginResult.Status.INVALID_ACTION);
-                callbackContext.sendPluginResult(cr);
-            }
-        } catch (JSONException e) {
-            PluginResult cr = new PluginResult(PluginResult.Status.JSON_EXCEPTION);
-            callbackContext.sendPluginResult(cr);
-        } catch (Exception e) {
-            LOG.e(TAG, "Uncaught exception from plugin", e);
-            callbackContext.error(e.getMessage());
-        }
-    }
-
-    /**
-     * Get the plugin object that implements the service.
-     * If the plugin object does not already exist, then create it.
-     * If the service doesn't exist, then return null.
-     *
-     * @param service       The name of the service.
-     * @return              CordovaPlugin or null
-     */
-    public CordovaPlugin getPlugin(String service) {
-        CordovaPlugin ret = pluginMap.get(service);
-        if (ret == null) {
-            PluginEntry pe = entryMap.get(service);
-            if (pe == null) {
-                return null;
-            }
-            if (pe.plugin != null) {
-                ret = pe.plugin;
-            } else {
-                ret = instantiatePlugin(pe.pluginClass);
-            }
-            ret.privateInitialize(service, ctx, app, app.getPreferences());
-            LOG.d(TAG, "getPlugin - put: " + service);
-            pluginMap.put(service, ret);
-        }
-        return ret;
-    }
-
-    /**
-     * Add a plugin class that implements a service to the service entry table.
-     * This does not create the plugin object instance.
-     *
-     * @param service           The service name
-     * @param className         The plugin class name
-     */
-    public void addService(String service, String className) {
-        PluginEntry entry = new PluginEntry(service, className, false);
-        this.addService(entry);
-    }
-
-    /**
-     * Add a plugin class that implements a service to the service entry table.
-     * This does not create the plugin object instance.
-     *
-     * @param entry             The plugin entry
-     */
-    public void addService(PluginEntry entry) {
-        this.entryMap.put(entry.service, entry);
-        if (entry.plugin != null) {
-            entry.plugin.privateInitialize(entry.service, ctx, app, app.getPreferences());
-            LOG.d(TAG, "addService: put - " + entry.service);
-            pluginMap.put(entry.service, entry.plugin);
-        }
-    }
-
-    /**
-     * Called when the system is about to start resuming a previous activity.
-     *
-     * @param multitasking      Flag indicating if multitasking is turned on for app
-     */
-    public void onPause(boolean multitasking) {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    plugin.onPause(multitasking);
-                }
-            }
-        }
-    }
-
-    /**
-     * Called when the system received an HTTP authentication request. Plugins can use
-     * the supplied HttpAuthHandler to process this auth challenge.
-     *
-     * @param view              The WebView that is initiating the callback
-     * @param handler           The HttpAuthHandler used to set the WebView's response
-     * @param host              The host requiring authentication
-     * @param realm             The realm for which authentication is required
-     *
-     * @return                  Returns True if there is a plugin which will resolve this auth challenge, otherwise False
-     *
-     */
-    public boolean onReceivedHttpAuthRequest(CordovaWebView view, ICordovaHttpAuthHandler handler, String host, String realm) {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null && plugin.onReceivedHttpAuthRequest(app, handler, host, realm)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Called when he system received an SSL client certificate request.  Plugin can use
-     * the supplied ClientCertRequest to process this certificate challenge.
-     *
-     * @param view              The WebView that is initiating the callback
-     * @param request           The client certificate request
-     *
-     * @return                  Returns True if plugin will resolve this auth challenge, otherwise False
-     *
-     */
-    public boolean onReceivedClientCertRequest(CordovaWebView view, ICordovaClientCertRequest request) {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null && plugin.onReceivedClientCertRequest(app, request)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Called when the activity will start interacting with the user.
-     *
-     * @param multitasking      Flag indicating if multitasking is turned on for app
-     */
-    public void onResume(boolean multitasking) {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    plugin.onResume(multitasking);
-                }
-            }
-        }
-    }
-
-    /**
-     * Called when the activity is becoming visible to the user.
-     */
-    public void onStart() {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    plugin.onStart();
-                }
-            }
-        }
-    }
-
-    /**
-     * Called when the activity is no longer visible to the user.
-     */
-    public void onStop() {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    plugin.onStop();
-                }
-            }
-        }
-    }
-
-    /**
-     * The final call you receive before your activity is destroyed.
-     */
-    public void onDestroy() {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    plugin.onDestroy();
-                }
-            }
-        }
-    }
-
-    /**
-     * Send a message to all plugins.
-     *
-     * @param id                The message id
-     * @param data              The message data
-     * @return                  Object to stop propagation or null
-     */
-    public Object postMessage(String id, Object data) {
-        LOG.d(TAG, "postMessage: " + id);
-        synchronized (this.pluginMap) {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-                this.pluginMap.forEach((s, plugin) -> {
-                    if (plugin != null) {
-                        plugin.onMessage(id, data);
-                    }
-                });
-            } else {
-                for (CordovaPlugin plugin : this.pluginMap.values()) {
-                    if (plugin != null) {
-                        Object obj = plugin.onMessage(id, data);
-                        if (obj != null) {
-                            return obj;
-                        }
-                    }
-                }
-            }
-        }
-        return ctx.onMessage(id, data);
-    }
-
-    /**
-     * Called when the activity receives a new intent.
-     */
-    public void onNewIntent(Intent intent) {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    plugin.onNewIntent(intent);
-                }
-            }
-        }
-    }
-
-    /**
-     * Called when the webview is going to request an external resource.
-     *
-     * This delegates to the installed plugins, and returns true/false for the
-     * first plugin to provide a non-null result.  If no plugins respond, then
-     * the default policy is applied.
-     *
-     * @param url       The URL that is being requested.
-     * @return          Returns true to allow the resource to load,
-     *                  false to block the resource.
-     */
-    public boolean shouldAllowRequest(String url) {
-        synchronized (this.entryMap) {
-            for (PluginEntry entry : this.entryMap.values()) {
-                CordovaPlugin plugin = pluginMap.get(entry.service);
-                if (plugin != null) {
-                    Boolean result = plugin.shouldAllowRequest(url);
-                    if (result != null) {
-                        return result;
-                    }
-                }
-            }
-        }
-
-        // Default policy:
-        if (url.startsWith("blob:") || url.startsWith("data:") || url.startsWith("about:blank")) {
-            return true;
-        }
-        // TalkBack requires this, so allow it by default.
-        if (url.startsWith("https://ssl.gstatic.com/accessibility/javascript/android/")) {
-            return true;
-        }
-        if (url.startsWith("file://")) {
-            //This directory on WebKit/Blink based webviews contains SQLite databases!
-            //DON'T CHANGE THIS UNLESS YOU KNOW WHAT YOU'RE DOING!
-            return !url.contains("/app_webview/");
-        }
-        return false;
-    }
-
-    /**
-     * Called when the webview is going to change the URL of the loaded content.
-     *
-     * This delegates to the installed plugins, and returns true/false for the
-     * first plugin to provide a non-null result.  If no plugins respond, then
-     * the default policy is applied.
-     *
-     * @param url       The URL that is being requested.
-     * @return          Returns true to allow the navigation,
-     *                  false to block the navigation.
-     */
-    public boolean shouldAllowNavigation(String url) {
-        synchronized (this.entryMap) {
-            for (PluginEntry entry : this.entryMap.values()) {
-                CordovaPlugin plugin = pluginMap.get(entry.service);
-                if (plugin != null) {
-                    Boolean result = plugin.shouldAllowNavigation(url);
-                    if (result != null) {
-                        return result;
-                    }
-                }
-            }
-        }
-
-        // Default policy:
-        return url.startsWith("file://") || url.startsWith("about:blank");
-    }
-
-
-    /**
-     * Called when the webview is requesting the exec() bridge be enabled.
-     */
-    public boolean shouldAllowBridgeAccess(String url) {
-        synchronized (this.entryMap) {
-            for (PluginEntry entry : this.entryMap.values()) {
-                CordovaPlugin plugin = pluginMap.get(entry.service);
-                if (plugin != null) {
-                    Boolean result = plugin.shouldAllowBridgeAccess(url);
-                    if (result != null) {
-                        return result;
-                    }
-                }
-            }
-        }
-
-        // Default policy:
-        return url.startsWith("file://");
-    }
-
-    /**
-     * Called when the webview is going not going to navigate, but may launch
-     * an Intent for an URL.
-     *
-     * This delegates to the installed plugins, and returns true/false for the
-     * first plugin to provide a non-null result.  If no plugins respond, then
-     * the default policy is applied.
-     *
-     * @param url       The URL that is being requested.
-     * @return          Returns true to allow the URL to launch an intent,
-     *                  false to block the intent.
-     */
-    public Boolean shouldOpenExternalUrl(String url) {
-        synchronized (this.entryMap) {
-            for (PluginEntry entry : this.entryMap.values()) {
-                CordovaPlugin plugin = pluginMap.get(entry.service);
-                if (plugin != null) {
-                    Boolean result = plugin.shouldOpenExternalUrl(url);
-                    if (result != null) {
-                        return result;
-                    }
-                }
-            }
-        }
-        // Default policy:
-        // External URLs are not allowed
-        return false;
-    }
-
-    /**
-     * Called when the URL of the webview changes.
-     *
-     * @param url               The URL that is being changed to.
-     * @return                  Return false to allow the URL to load, return true to prevent the URL from loading.
-     */
-    public boolean onOverrideUrlLoading(String url) {
-        synchronized (this.entryMap) {
-            for (PluginEntry entry : this.entryMap.values()) {
-                CordovaPlugin plugin = pluginMap.get(entry.service);
-                if (plugin != null && plugin.onOverrideUrlLoading(url)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Called when the app navigates or refreshes.
-     */
-    public void onReset() {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    plugin.onReset();
-                }
-            }
-        }
-    }
-
-    Uri remapUri(Uri uri) {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    Uri ret = plugin.remapUri(uri);
-                    if (ret != null) {
-                        return ret;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Create a plugin based on class name.
-     */
-    private CordovaPlugin instantiatePlugin(String className) {
-        CordovaPlugin ret = null;
-        try {
-            Class<?> c = null;
-            if ((className != null) && !("".equals(className))) {
-                c = Class.forName(className);
-            }
-            if (c != null & CordovaPlugin.class.isAssignableFrom(c)) {
-                ret = (CordovaPlugin) c.newInstance();
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            System.out.println("Error adding plugin " + className + ".");
-        }
-        return ret;
-    }
-
-    /**
-     * Called by the system when the device configuration changes while your activity is running.
-     *
-     * @param newConfig		The new device configuration
-     */
-    public void onConfigurationChanged(Configuration newConfig) {
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    plugin.onConfigurationChanged(newConfig);
-                }
-            }
-        }
-    }
-
-    public Bundle onSaveInstanceState() {
-        Bundle state = new Bundle();
-        synchronized (this.pluginMap) {
-            for (CordovaPlugin plugin : this.pluginMap.values()) {
-                if (plugin != null) {
-                    Bundle pluginState = plugin.onSaveInstanceState();
-                    if (pluginState != null) {
-                        state.putBundle(plugin.getServiceName(), pluginState);
-                    }
-                }
-            }
-        }
-        return state;
-    }
-}

+ 0 - 198
platforms/android/CordovaLib/src/org/apache/cordova/PluginResult.java

@@ -1,198 +0,0 @@
-/*
-       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;
-
-import java.util.List;
-
-import org.json.JSONArray;
-import org.json.JSONObject;
-
-import android.util.Base64;
-
-public class PluginResult {
-    private final int status;
-    private final int messageType;
-    private boolean keepCallback = false;
-    private String strMessage;
-    private String encodedMessage;
-    private List<PluginResult> multipartMessages;
-
-    public PluginResult(Status status) {
-        this(status, PluginResult.StatusMessages[status.ordinal()]);
-    }
-
-    public PluginResult(Status status, String message) {
-        this.status = status.ordinal();
-        this.messageType = message == null ? MESSAGE_TYPE_NULL : MESSAGE_TYPE_STRING;
-        this.strMessage = message;
-    }
-
-    public PluginResult(Status status, JSONArray message) {
-        this.status = status.ordinal();
-        this.messageType = MESSAGE_TYPE_JSON;
-        encodedMessage = message.toString();
-    }
-
-    public PluginResult(Status status, JSONObject message) {
-        this.status = status.ordinal();
-        this.messageType = MESSAGE_TYPE_JSON;
-        encodedMessage = message.toString();
-    }
-
-    public PluginResult(Status status, int i) {
-        this.status = status.ordinal();
-        this.messageType = MESSAGE_TYPE_NUMBER;
-        this.encodedMessage = ""+i;
-    }
-
-    public PluginResult(Status status, float f) {
-        this.status = status.ordinal();
-        this.messageType = MESSAGE_TYPE_NUMBER;
-        this.encodedMessage = ""+f;
-    }
-
-    public PluginResult(Status status, boolean b) {
-        this.status = status.ordinal();
-        this.messageType = MESSAGE_TYPE_BOOLEAN;
-        this.encodedMessage = Boolean.toString(b);
-    }
-
-    public PluginResult(Status status, byte[] data) {
-        this(status, data, false);
-    }
-
-    public PluginResult(Status status, byte[] data, boolean binaryString) {
-        this.status = status.ordinal();
-        this.messageType = binaryString ? MESSAGE_TYPE_BINARYSTRING : MESSAGE_TYPE_ARRAYBUFFER;
-        this.encodedMessage = Base64.encodeToString(data, Base64.NO_WRAP);
-    }
-
-    // The keepCallback and status of multipartMessages are ignored.
-    public PluginResult(Status status, List<PluginResult> multipartMessages) {
-        this.status = status.ordinal();
-        this.messageType = MESSAGE_TYPE_MULTIPART;
-        this.multipartMessages = multipartMessages;
-    }
-
-    public void setKeepCallback(boolean b) {
-        this.keepCallback = b;
-    }
-
-    public int getStatus() {
-        return status;
-    }
-
-    public int getMessageType() {
-        return messageType;
-    }
-
-    public String getMessage() {
-        if (encodedMessage == null) {
-            encodedMessage = JSONObject.quote(strMessage);
-        }
-        return encodedMessage;
-    }
-
-    public int getMultipartMessagesSize() {
-        return multipartMessages.size();
-    }
-
-    public PluginResult getMultipartMessage(int index) {
-        return multipartMessages.get(index);
-    }
-
-    /**
-     * If messageType == MESSAGE_TYPE_STRING, then returns the message string.
-     * Otherwise, returns null.
-     */
-    public String getStrMessage() {
-        return strMessage;
-    }
-
-    public boolean getKeepCallback() {
-        return this.keepCallback;
-    }
-
-    @Deprecated // Use sendPluginResult instead of sendJavascript.
-    public String getJSONString() {
-        return "{\"status\":" + this.status + ",\"message\":" + this.getMessage() + ",\"keepCallback\":" + this.keepCallback + "}";
-    }
-
-    @Deprecated // Use sendPluginResult instead of sendJavascript.
-    public String toCallbackString(String callbackId) {
-        // If no result to be sent and keeping callback, then no need to sent back to JavaScript
-        if ((status == PluginResult.Status.NO_RESULT.ordinal()) && keepCallback) {
-        	return null;
-        }
-
-        // Check the success (OK, NO_RESULT & !KEEP_CALLBACK)
-        if ((status == PluginResult.Status.OK.ordinal()) || (status == PluginResult.Status.NO_RESULT.ordinal())) {
-            return toSuccessCallbackString(callbackId);
-        }
-
-        return toErrorCallbackString(callbackId);
-    }
-
-    @Deprecated // Use sendPluginResult instead of sendJavascript.
-    public String toSuccessCallbackString(String callbackId) {
-        return "cordova.callbackSuccess('"+callbackId+"',"+this.getJSONString()+");";
-    }
-
-    @Deprecated // Use sendPluginResult instead of sendJavascript.
-    public String toErrorCallbackString(String callbackId) {
-        return "cordova.callbackError('"+callbackId+"', " + this.getJSONString()+ ");";
-    }
-
-    public static final int MESSAGE_TYPE_STRING = 1;
-    public static final int MESSAGE_TYPE_JSON = 2;
-    public static final int MESSAGE_TYPE_NUMBER = 3;
-    public static final int MESSAGE_TYPE_BOOLEAN = 4;
-    public static final int MESSAGE_TYPE_NULL = 5;
-    public static final int MESSAGE_TYPE_ARRAYBUFFER = 6;
-    // Use BINARYSTRING when your string may contain null characters.
-    // This is required to work around a bug in the platform :(.
-    public static final int MESSAGE_TYPE_BINARYSTRING = 7;
-    public static final int MESSAGE_TYPE_MULTIPART = 8;
-
-    public static String[] StatusMessages = new String[] {
-        "No result",
-        "OK",
-        "Class not found",
-        "Illegal access",
-        "Instantiation error",
-        "Malformed url",
-        "IO error",
-        "Invalid action",
-        "JSON error",
-        "Error"
-    };
-
-    public enum Status {
-        NO_RESULT,
-        OK,
-        CLASS_NOT_FOUND_EXCEPTION,
-        ILLEGAL_ACCESS_EXCEPTION,
-        INSTANTIATION_EXCEPTION,
-        MALFORMED_URL_EXCEPTION,
-        IO_EXCEPTION,
-        INVALID_ACTION,
-        JSON_EXCEPTION,
-        ERROR
-    }
-}

+ 0 - 76
platforms/android/CordovaLib/src/org/apache/cordova/ResumeCallback.java

@@ -1,76 +0,0 @@
-/*
-       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;
-
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ResumeCallback extends CallbackContext {
-    private final String TAG = "CordovaResumeCallback";
-    private String serviceName;
-    private PluginManager pluginManager;
-
-    public ResumeCallback(String serviceName, PluginManager pluginManager) {
-        super("resumecallback", null);
-        this.serviceName = serviceName;
-        this.pluginManager = pluginManager;
-    }
-
-    @Override
-    public void sendPluginResult(PluginResult pluginResult) {
-        synchronized (this) {
-            if (finished) {
-                LOG.w(TAG, serviceName + " attempted to send a second callback to ResumeCallback\nResult was: " + pluginResult.getMessage());
-                return;
-            } else {
-                finished = true;
-            }
-        }
-
-        JSONObject event = new JSONObject();
-        JSONObject pluginResultObject = new JSONObject();
-
-        try {
-            pluginResultObject.put("pluginServiceName", this.serviceName);
-            pluginResultObject.put("pluginStatus", PluginResult.StatusMessages[pluginResult.getStatus()]);
-
-            event.put("action", "resume");
-            event.put("pendingResult", pluginResultObject);
-        } catch (JSONException e) {
-            LOG.e(TAG, "Unable to create resume object for Activity Result");
-        }
-
-        PluginResult eventResult = new PluginResult(PluginResult.Status.OK, event);
-
-        // We send a list of results to the js so that we don't have to decode
-        // the PluginResult passed to this CallbackContext into JSON twice.
-        // The results are combined into an event payload before the event is
-        // fired on the js side of things (see platform.js)
-        List<PluginResult> result = new ArrayList<PluginResult>();
-        result.add(eventResult);
-        result.add(pluginResult);
-
-        CoreAndroid appPlugin = (CoreAndroid) pluginManager.getPlugin(CoreAndroid.PLUGIN_NAME);
-        appPlugin.sendResumeEvent(new PluginResult(PluginResult.Status.OK, result));
-    }
-}

+ 0 - 170
platforms/android/CordovaLib/src/org/apache/cordova/Whitelist.java

@@ -1,170 +0,0 @@
-/*
-       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;
-
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.cordova.LOG;
-
-import android.net.Uri;
-
-public class Whitelist {
-    private static class URLPattern {
-        public Pattern scheme;
-        public Pattern host;
-        public Integer port;
-        public Pattern path;
-
-        private String regexFromPattern(String pattern, boolean allowWildcards) {
-            final String toReplace = "\\.[]{}()^$?+|";
-            StringBuilder regex = new StringBuilder();
-            for (int i=0; i < pattern.length(); i++) {
-                char c = pattern.charAt(i);
-                if (c == '*' && allowWildcards) {
-                    regex.append(".");
-                } else if (toReplace.indexOf(c) > -1) {
-                    regex.append('\\');
-                }
-                regex.append(c);
-            }
-            return regex.toString();
-        }
-
-        public URLPattern(String scheme, String host, String port, String path) throws MalformedURLException {
-            try {
-                if (scheme == null || "*".equals(scheme)) {
-                    this.scheme = null;
-                } else {
-                    this.scheme = Pattern.compile(regexFromPattern(scheme, false), Pattern.CASE_INSENSITIVE);
-                }
-                if ("*".equals(host)) {
-                    this.host = null;
-                } else if (host.startsWith("*.")) {
-                    this.host = Pattern.compile("([a-z0-9.-]*\\.)?" + regexFromPattern(host.substring(2), false), Pattern.CASE_INSENSITIVE);
-                } else {
-                    this.host = Pattern.compile(regexFromPattern(host, false), Pattern.CASE_INSENSITIVE);
-                }
-                if (port == null || "*".equals(port)) {
-                    this.port = null;
-                } else {
-                    this.port = Integer.parseInt(port,10);
-                }
-                if (path == null || "/*".equals(path)) {
-                    this.path = null;
-                } else {
-                    this.path = Pattern.compile(regexFromPattern(path, true));
-                }
-            } catch (NumberFormatException e) {
-                throw new MalformedURLException("Port must be a number");
-            }
-        }
-
-        public boolean matches(Uri uri) {
-            try {
-                return ((scheme == null || scheme.matcher(uri.getScheme()).matches()) &&
-                        (host == null || host.matcher(uri.getHost()).matches()) &&
-                        (port == null || port.equals(uri.getPort())) &&
-                        (path == null || path.matcher(uri.getPath()).matches()));
-            } catch (Exception e) {
-                LOG.d(TAG, e.toString());
-                return false;
-            }
-        }
-    }
-
-    private ArrayList<URLPattern> whiteList;
-
-    public static final String TAG = "Whitelist";
-
-    public Whitelist() {
-        this.whiteList = new ArrayList<URLPattern>();
-    }
-
-    /* Match patterns (from http://developer.chrome.com/extensions/match_patterns.html)
-     *
-     * <url-pattern> := <scheme>://<host><path>
-     * <scheme> := '*' | 'http' | 'https' | 'file' | 'ftp' | 'chrome-extension'
-     * <host> := '*' | '*.' <any char except '/' and '*'>+
-     * <path> := '/' <any chars>
-     *
-     * We extend this to explicitly allow a port attached to the host, and we allow
-     * the scheme to be omitted for backwards compatibility. (Also host is not required
-     * to begin with a "*" or "*.".)
-     */
-    public void addWhiteListEntry(String origin, boolean subdomains) {
-        if (whiteList != null) {
-            try {
-                // Unlimited access to network resources
-                if (origin.compareTo("*") == 0) {
-                    LOG.d(TAG, "Unlimited access to network resources");
-                    whiteList = null;
-                }
-                else { // specific access
-                    Pattern parts = Pattern.compile("^((\\*|[A-Za-z-]+):(//)?)?(\\*|((\\*\\.)?[^*/:]+))?(:(\\d+))?(/.*)?");
-                    Matcher m = parts.matcher(origin);
-                    if (m.matches()) {
-                        String scheme = m.group(2);
-                        String host = m.group(4);
-                        // Special case for two urls which are allowed to have empty hosts
-                        if (("file".equals(scheme) || "content".equals(scheme)) && host == null) host = "*";
-                        String port = m.group(8);
-                        String path = m.group(9);
-                        if (scheme == null) {
-                            // XXX making it stupid friendly for people who forget to include protocol/SSL
-                            whiteList.add(new URLPattern("http", host, port, path));
-                            whiteList.add(new URLPattern("https", host, port, path));
-                        } else {
-                            whiteList.add(new URLPattern(scheme, host, port, path));
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                LOG.d(TAG, "Failed to add origin %s", origin);
-            }
-        }
-    }
-
-
-    /**
-     * Determine if URL is in approved list of URLs to load.
-     *
-     * @param uri
-     * @return true if wide open or whitelisted
-     */
-    public boolean isUrlWhiteListed(String uri) {
-        // If there is no whitelist, then it's wide open
-        if (whiteList == null) return true;
-
-        Uri parsedUri = Uri.parse(uri);
-        // Look for match in white list
-        Iterator<URLPattern> pit = whiteList.iterator();
-        while (pit.hasNext()) {
-            URLPattern p = pit.next();
-            if (p.matches(parsedUri)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-}

+ 0 - 62
platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemCookieManager.java

@@ -1,62 +0,0 @@
-/*
-       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.engine;
-
-import android.annotation.TargetApi;
-import android.os.Build;
-import android.webkit.CookieManager;
-import android.webkit.WebView;
-
-import org.apache.cordova.ICordovaCookieManager;
-
-class SystemCookieManager implements ICordovaCookieManager {
-
-    protected final WebView webView;
-    private final CookieManager cookieManager;
-
-    public SystemCookieManager(WebView webview) {
-        webView = webview;
-        cookieManager = CookieManager.getInstance();
-
-        cookieManager.setAcceptFileSchemeCookies(true);
-        cookieManager.setAcceptThirdPartyCookies(webView, true);
-    }
-
-    public void setCookiesEnabled(boolean accept) {
-        cookieManager.setAcceptCookie(accept);
-    }
-
-    public void setCookie(final String url, final String value) {
-        cookieManager.setCookie(url, value);
-    }
-
-    public String getCookie(final String url) {
-        return cookieManager.getCookie(url);
-    }
-
-    @SuppressWarnings("deprecation")
-    public void clearCookies() {
-        cookieManager.removeAllCookies(null);
-    }
-
-    public void flush() {
-        cookieManager.flush();
-    }
-};

+ 0 - 53
platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemExposedJsApi.java

@@ -1,53 +0,0 @@
-/*
-       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.engine;
-
-import android.webkit.JavascriptInterface;
-
-import org.apache.cordova.CordovaBridge;
-import org.apache.cordova.ExposedJsApi;
-import org.json.JSONException;
-
-/**
- * Contains APIs that the JS can call. All functions in here should also have
- * an equivalent entry in CordovaChromeClient.java, and be added to
- * cordova-js/lib/android/plugin/android/promptbasednativeapi.js
- */
-class SystemExposedJsApi implements ExposedJsApi {
-    private final CordovaBridge bridge;
-
-    SystemExposedJsApi(CordovaBridge bridge) {
-        this.bridge = bridge;
-    }
-
-    @JavascriptInterface
-    public String exec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException {
-        return bridge.jsExec(bridgeSecret, service, action, callbackId, arguments);
-    }
-
-    @JavascriptInterface
-    public void setNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException {
-        bridge.jsSetNativeToJsBridgeMode(bridgeSecret, value);
-    }
-
-    @JavascriptInterface
-    public String retrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException {
-        return bridge.jsRetrieveJsMessages(bridgeSecret, fromOnlineEvent);
-    }
-}

+ 0 - 270
platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebChromeClient.java

@@ -1,270 +0,0 @@
-/*
-       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.engine;
-
-import java.util.Arrays;
-import android.annotation.TargetApi;
-import android.app.Activity;
-import android.content.Context;
-import android.content.ActivityNotFoundException;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Build;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup.LayoutParams;
-import android.webkit.ConsoleMessage;
-import android.webkit.GeolocationPermissions.Callback;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.ValueCallback;
-import android.webkit.WebChromeClient;
-import android.webkit.WebStorage;
-import android.webkit.WebView;
-import android.webkit.PermissionRequest;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
-
-import org.apache.cordova.CordovaDialogsHelper;
-import org.apache.cordova.CordovaPlugin;
-import org.apache.cordova.LOG;
-
-/**
- * This class is the WebChromeClient that implements callbacks for our web view.
- * The kind of callbacks that happen here are on the chrome outside the document,
- * such as onCreateWindow(), onConsoleMessage(), onProgressChanged(), etc. Related
- * to but different than CordovaWebViewClient.
- */
-public class SystemWebChromeClient extends WebChromeClient {
-
-    private static final int FILECHOOSER_RESULTCODE = 5173;
-    private static final String LOG_TAG = "SystemWebChromeClient";
-    private long MAX_QUOTA = 100 * 1024 * 1024;
-    protected final SystemWebViewEngine parentEngine;
-
-    // the video progress view
-    private View mVideoProgressView;
-
-    private CordovaDialogsHelper dialogsHelper;
-    private Context appContext;
-
-    private WebChromeClient.CustomViewCallback mCustomViewCallback;
-    private View mCustomView;
-
-    public SystemWebChromeClient(SystemWebViewEngine parentEngine) {
-        this.parentEngine = parentEngine;
-        appContext = parentEngine.webView.getContext();
-        dialogsHelper = new CordovaDialogsHelper(appContext);
-    }
-
-    /**
-     * Tell the client to display a javascript alert dialog.
-     */
-    @Override
-    public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
-        dialogsHelper.showAlert(message, new CordovaDialogsHelper.Result() {
-            @Override public void gotResult(boolean success, String value) {
-                if (success) {
-                    result.confirm();
-                } else {
-                    result.cancel();
-                }
-            }
-        });
-        return true;
-    }
-
-    /**
-     * Tell the client to display a confirm dialog to the user.
-     */
-    @Override
-    public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
-        dialogsHelper.showConfirm(message, new CordovaDialogsHelper.Result() {
-            @Override
-            public void gotResult(boolean success, String value) {
-                if (success) {
-                    result.confirm();
-                } else {
-                    result.cancel();
-                }
-            }
-        });
-        return true;
-    }
-
-    /**
-     * Tell the client to display a prompt dialog to the user.
-     * If the client returns true, WebView will assume that the client will
-     * handle the prompt dialog and call the appropriate JsPromptResult method.
-     *
-     * Since we are hacking prompts for our own purposes, we should not be using them for
-     * this purpose, perhaps we should hack console.log to do this instead!
-     */
-    @Override
-    public boolean onJsPrompt(WebView view, String origin, String message, String defaultValue, final JsPromptResult result) {
-        // Unlike the @JavascriptInterface bridge, this method is always called on the UI thread.
-        String handledRet = parentEngine.bridge.promptOnJsPrompt(origin, message, defaultValue);
-        if (handledRet != null) {
-            result.confirm(handledRet);
-        } else {
-            dialogsHelper.showPrompt(message, defaultValue, new CordovaDialogsHelper.Result() {
-                @Override
-                public void gotResult(boolean success, String value) {
-                    if (success) {
-                        result.confirm(value);
-                    } else {
-                        result.cancel();
-                    }
-                }
-            });
-        }
-        return true;
-    }
-
-    /**
-     * Handle database quota exceeded notification.
-     */
-    @Override
-    @SuppressWarnings("deprecation")
-    public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize,
-            long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater)
-    {
-        LOG.d(LOG_TAG, "onExceededDatabaseQuota estimatedSize: %d  currentQuota: %d  totalUsedQuota: %d", estimatedSize, currentQuota, totalUsedQuota);
-        quotaUpdater.updateQuota(MAX_QUOTA);
-    }
-
-    @Override
-    /**
-     * Instructs the client to show a prompt to ask the user to set the Geolocation permission state for the specified origin.
-     *
-     * This also checks for the Geolocation Plugin and requests permission from the application  to use Geolocation.
-     *
-     * @param origin
-     * @param callback
-     */
-    public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {
-        super.onGeolocationPermissionsShowPrompt(origin, callback);
-        callback.invoke(origin, true, false);
-        //Get the plugin, it should be loaded
-        CordovaPlugin geolocation = parentEngine.pluginManager.getPlugin("Geolocation");
-        if(geolocation != null && !geolocation.hasPermisssion())
-        {
-            geolocation.requestPermissions(0);
-        }
-    }
-
-    // API level 7 is required for this, see if we could lower this using something else
-    @Override
-    @SuppressWarnings("deprecation")
-    public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) {
-        parentEngine.getCordovaWebView().showCustomView(view, callback);
-    }
-
-    @Override
-    @SuppressWarnings("deprecation")
-    public void onHideCustomView() {
-        parentEngine.getCordovaWebView().hideCustomView();
-    }
-
-    @Override
-    /**
-     * Ask the host application for a custom progress view to show while
-     * a <video> is loading.
-     * @return View The progress view.
-     */
-    public View getVideoLoadingProgressView() {
-        if (mVideoProgressView == null) {
-            // Create a new Loading view programmatically.
-
-            // create the linear layout
-            LinearLayout layout = new LinearLayout(parentEngine.getView().getContext());
-            layout.setOrientation(LinearLayout.VERTICAL);
-            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
-            layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
-            layout.setLayoutParams(layoutParams);
-            // the proress bar
-            ProgressBar bar = new ProgressBar(parentEngine.getView().getContext());
-            LinearLayout.LayoutParams barLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
-            barLayoutParams.gravity = Gravity.CENTER;
-            bar.setLayoutParams(barLayoutParams);
-            layout.addView(bar);
-
-            mVideoProgressView = layout;
-        }
-        return mVideoProgressView;
-    }
-
-    @Override
-    public boolean onShowFileChooser(WebView webView, final ValueCallback<Uri[]> filePathsCallback, final WebChromeClient.FileChooserParams fileChooserParams) {
-        // Check if multiple-select is specified
-        Boolean selectMultiple = false;
-        if (fileChooserParams.getMode() == WebChromeClient.FileChooserParams.MODE_OPEN_MULTIPLE) {
-            selectMultiple = true;
-        }
-        Intent intent = fileChooserParams.createIntent();
-        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, selectMultiple);
-        
-        // Uses Intent.EXTRA_MIME_TYPES to pass multiple mime types.
-        String[] acceptTypes = fileChooserParams.getAcceptTypes();
-        if (acceptTypes.length > 1) {
-            intent.setType("*/*"); // Accept all, filter mime types by Intent.EXTRA_MIME_TYPES.
-            intent.putExtra(Intent.EXTRA_MIME_TYPES, acceptTypes);
-        }
-        try {
-            parentEngine.cordova.startActivityForResult(new CordovaPlugin() {
-                @Override
-                public void onActivityResult(int requestCode, int resultCode, Intent intent) {
-                    Uri[] result = null;
-                    if (resultCode ==  Activity.RESULT_OK && intent != null) {
-                        if (intent.getClipData() != null) {
-                            // handle multiple-selected files
-                            final int numSelectedFiles = intent.getClipData().getItemCount();
-                            result = new Uri[numSelectedFiles];
-                            for (int i = 0; i < numSelectedFiles; i++) {
-                                result[i] = intent.getClipData().getItemAt(i).getUri();
-                                LOG.d(LOG_TAG, "Receive file chooser URL: " + result[i]);
-                            }
-                        }
-                        else if (intent.getData() != null) {
-                            // handle single-selected file
-                            result = WebChromeClient.FileChooserParams.parseResult(resultCode, intent);
-                            LOG.d(LOG_TAG, "Receive file chooser URL: " + result);
-                        }
-                    }
-                    filePathsCallback.onReceiveValue(result);
-                }
-            }, intent, FILECHOOSER_RESULTCODE);
-        } catch (ActivityNotFoundException e) {
-            LOG.w("No activity found to handle file chooser intent.", e);
-            filePathsCallback.onReceiveValue(null);
-        }
-        return true;
-    }
-
-    @Override
-    public void onPermissionRequest(final PermissionRequest request) {
-        LOG.d(LOG_TAG, "onPermissionRequest: " + Arrays.toString(request.getResources()));
-        request.grant(request.getResources());
-    }
-
-    public void destroyLastDialog(){
-        dialogsHelper.destroyLastDialog();
-    }
-}

+ 0 - 88
platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebView.java

@@ -1,88 +0,0 @@
-/*
-       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.engine;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.webkit.WebChromeClient;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-
-import org.apache.cordova.CordovaInterface;
-import org.apache.cordova.CordovaWebView;
-import org.apache.cordova.CordovaWebViewEngine;
-
-/**
- * Custom WebView subclass that enables us to capture events needed for Cordova.
- */
-public class SystemWebView extends WebView implements CordovaWebViewEngine.EngineView {
-    private SystemWebViewClient viewClient;
-    SystemWebChromeClient chromeClient;
-    private SystemWebViewEngine parentEngine;
-    private CordovaInterface cordova;
-
-    public SystemWebView(Context context) {
-        this(context, null);
-    }
-
-    public SystemWebView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    // Package visibility to enforce that only SystemWebViewEngine should call this method.
-    void init(SystemWebViewEngine parentEngine, CordovaInterface cordova) {
-        this.cordova = cordova;
-        this.parentEngine = parentEngine;
-        if (this.viewClient == null) {
-            setWebViewClient(new SystemWebViewClient(parentEngine));
-        }
-
-        if (this.chromeClient == null) {
-            setWebChromeClient(new SystemWebChromeClient(parentEngine));
-        }
-    }
-
-    @Override
-    public CordovaWebView getCordovaWebView() {
-        return parentEngine != null ? parentEngine.getCordovaWebView() : null;
-    }
-
-    @Override
-    public void setWebViewClient(WebViewClient client) {
-        viewClient = (SystemWebViewClient)client;
-        super.setWebViewClient(client);
-    }
-
-    @Override
-    public void setWebChromeClient(WebChromeClient client) {
-        chromeClient = (SystemWebChromeClient)client;
-        super.setWebChromeClient(client);
-    }
-
-    @Override
-    public boolean dispatchKeyEvent(KeyEvent event) {
-        Boolean ret = parentEngine.client.onDispatchKeyEvent(event);
-        if (ret != null) {
-            return ret.booleanValue();
-        }
-        return super.dispatchKeyEvent(event);
-    }
-}

+ 0 - 369
platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java

@@ -1,369 +0,0 @@
-/*
-       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.engine;
-
-import android.annotation.TargetApi;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.net.http.SslError;
-import android.os.Build;
-import android.webkit.ClientCertRequest;
-import android.webkit.HttpAuthHandler;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebResourceResponse;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-
-import org.apache.cordova.AuthenticationToken;
-import org.apache.cordova.CordovaClientCertRequest;
-import org.apache.cordova.CordovaHttpAuthHandler;
-import org.apache.cordova.CordovaResourceApi;
-import org.apache.cordova.LOG;
-import org.apache.cordova.PluginManager;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Hashtable;
-
-
-/**
- * This class is the WebViewClient that implements callbacks for our web view.
- * The kind of callbacks that happen here are regarding the rendering of the
- * document instead of the chrome surrounding it, such as onPageStarted(),
- * shouldOverrideUrlLoading(), etc. Related to but different than
- * CordovaChromeClient.
- */
-public class SystemWebViewClient extends WebViewClient {
-
-    private static final String TAG = "SystemWebViewClient";
-    protected final SystemWebViewEngine parentEngine;
-    private boolean doClearHistory = false;
-    boolean isCurrentlyLoading;
-
-    /** The authorization tokens. */
-    private Hashtable<String, AuthenticationToken> authenticationTokens = new Hashtable<String, AuthenticationToken>();
-
-    public SystemWebViewClient(SystemWebViewEngine parentEngine) {
-        this.parentEngine = parentEngine;
-    }
-
-    /**
-     * Give the host application a chance to take over the control when a new url
-     * is about to be loaded in the current WebView.
-     *
-     * @param view          The WebView that is initiating the callback.
-     * @param url           The url to be loaded.
-     * @return              true to override, false for default behavior
-     */
-    @Override
-    @SuppressWarnings("deprecation")
-    public boolean shouldOverrideUrlLoading(WebView view, String url) {
-        return parentEngine.client.onNavigationAttempt(url);
-    }
-
-    /**
-     * On received http auth request.
-     * The method reacts on all registered authentication tokens. There is one and only one authentication token for any host + realm combination
-     */
-    @Override
-    public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
-
-        // Get the authentication token (if specified)
-        AuthenticationToken token = this.getAuthenticationToken(host, realm);
-        if (token != null) {
-            handler.proceed(token.getUserName(), token.getPassword());
-            return;
-        }
-
-        // Check if there is some plugin which can resolve this auth challenge
-        PluginManager pluginManager = this.parentEngine.pluginManager;
-        if (pluginManager != null && pluginManager.onReceivedHttpAuthRequest(null, new CordovaHttpAuthHandler(handler), host, realm)) {
-            parentEngine.client.clearLoadTimeoutTimer();
-            return;
-        }
-
-        // By default handle 401 like we'd normally do!
-        super.onReceivedHttpAuthRequest(view, handler, host, realm);
-    }
-
-    /**
-     * On received client cert request.
-     * The method forwards the request to any running plugins before using the default implementation.
-     *
-     * @param view
-     * @param request
-     */
-    @Override
-    public void onReceivedClientCertRequest (WebView view, ClientCertRequest request)
-    {
-
-        // Check if there is some plugin which can resolve this certificate request
-        PluginManager pluginManager = this.parentEngine.pluginManager;
-        if (pluginManager != null && pluginManager.onReceivedClientCertRequest(null, new CordovaClientCertRequest(request))) {
-            parentEngine.client.clearLoadTimeoutTimer();
-            return;
-        }
-
-        // By default pass to WebViewClient
-        super.onReceivedClientCertRequest(view, request);
-    }
-
-    /**
-     * Notify the host application that a page has started loading.
-     * This method is called once for each main frame load so a page with iframes or framesets will call onPageStarted
-     * one time for the main frame. This also means that onPageStarted will not be called when the contents of an
-     * embedded frame changes, i.e. clicking a link whose target is an iframe.
-     *
-     * @param view          The webview initiating the callback.
-     * @param url           The url of the page.
-     */
-    @Override
-    public void onPageStarted(WebView view, String url, Bitmap favicon) {
-        super.onPageStarted(view, url, favicon);
-        isCurrentlyLoading = true;
-        // Flush stale messages & reset plugins.
-        parentEngine.bridge.reset();
-        parentEngine.client.onPageStarted(url);
-    }
-
-    /**
-     * Notify the host application that a page has finished loading.
-     * This method is called only for main frame. When onPageFinished() is called, the rendering picture may not be updated yet.
-     *
-     *
-     * @param view          The webview initiating the callback.
-     * @param url           The url of the page.
-     */
-    @Override
-    public void onPageFinished(WebView view, String url) {
-        super.onPageFinished(view, url);
-        // Ignore excessive calls, if url is not about:blank (CB-8317).
-        if (!isCurrentlyLoading && !url.startsWith("about:")) {
-            return;
-        }
-        isCurrentlyLoading = false;
-
-        /**
-         * Because of a timing issue we need to clear this history in onPageFinished as well as
-         * onPageStarted. However we only want to do this if the doClearHistory boolean is set to
-         * true. You see when you load a url with a # in it which is common in jQuery applications
-         * onPageStared is not called. Clearing the history at that point would break jQuery apps.
-         */
-        if (this.doClearHistory) {
-            view.clearHistory();
-            this.doClearHistory = false;
-        }
-        parentEngine.client.onPageFinishedLoading(url);
-
-    }
-
-    /**
-     * Report an error to the host application. These errors are unrecoverable (i.e. the main resource is unavailable).
-     * The errorCode parameter corresponds to one of the ERROR_* constants.
-     *
-     * @param view          The WebView that is initiating the callback.
-     * @param errorCode     The error code corresponding to an ERROR_* value.
-     * @param description   A String describing the error.
-     * @param failingUrl    The url that failed to load.
-     */
-    @Override
-    @SuppressWarnings("deprecation")
-    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
-        // Ignore error due to stopLoading().
-        if (!isCurrentlyLoading) {
-            return;
-        }
-        LOG.d(TAG, "CordovaWebViewClient.onReceivedError: Error code=%s Description=%s URL=%s", errorCode, description, failingUrl);
-
-        // If this is a "Protocol Not Supported" error, then revert to the previous
-        // page. If there was no previous page, then punt. The application's config
-        // is likely incorrect (start page set to sms: or something like that)
-        if (errorCode == WebViewClient.ERROR_UNSUPPORTED_SCHEME) {
-            parentEngine.client.clearLoadTimeoutTimer();
-
-            if (view.canGoBack()) {
-                view.goBack();
-                return;
-            } else {
-                super.onReceivedError(view, errorCode, description, failingUrl);
-            }
-        }
-        parentEngine.client.onReceivedError(errorCode, description, failingUrl);
-    }
-
-    /**
-     * Notify the host application that an SSL error occurred while loading a resource.
-     * The host application must call either handler.cancel() or handler.proceed().
-     * Note that the decision may be retained for use in response to future SSL errors.
-     * The default behavior is to cancel the load.
-     *
-     * @param view          The WebView that is initiating the callback.
-     * @param handler       An SslErrorHandler object that will handle the user's response.
-     * @param error         The SSL error object.
-     */
-    @Override
-    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
-
-        final String packageName = parentEngine.cordova.getActivity().getPackageName();
-        final PackageManager pm = parentEngine.cordova.getActivity().getPackageManager();
-
-        ApplicationInfo appInfo;
-        try {
-            appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
-            if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
-                // debug = true
-                handler.proceed();
-                return;
-            } else {
-                // debug = false
-                super.onReceivedSslError(view, handler, error);
-            }
-        } catch (NameNotFoundException e) {
-            // When it doubt, lock it out!
-            super.onReceivedSslError(view, handler, error);
-        }
-    }
-
-
-    /**
-     * Sets the authentication token.
-     *
-     * @param authenticationToken
-     * @param host
-     * @param realm
-     */
-    public void setAuthenticationToken(AuthenticationToken authenticationToken, String host, String realm) {
-        if (host == null) {
-            host = "";
-        }
-        if (realm == null) {
-            realm = "";
-        }
-        this.authenticationTokens.put(host.concat(realm), authenticationToken);
-    }
-
-    /**
-     * Removes the authentication token.
-     *
-     * @param host
-     * @param realm
-     *
-     * @return the authentication token or null if did not exist
-     */
-    public AuthenticationToken removeAuthenticationToken(String host, String realm) {
-        return this.authenticationTokens.remove(host.concat(realm));
-    }
-
-    /**
-     * Gets the authentication token.
-     *
-     * In order it tries:
-     * 1- host + realm
-     * 2- host
-     * 3- realm
-     * 4- no host, no realm
-     *
-     * @param host
-     * @param realm
-     *
-     * @return the authentication token
-     */
-    public AuthenticationToken getAuthenticationToken(String host, String realm) {
-        AuthenticationToken token = null;
-        token = this.authenticationTokens.get(host.concat(realm));
-
-        if (token == null) {
-            // try with just the host
-            token = this.authenticationTokens.get(host);
-
-            // Try the realm
-            if (token == null) {
-                token = this.authenticationTokens.get(realm);
-            }
-
-            // if no host found, just query for default
-            if (token == null) {
-                token = this.authenticationTokens.get("");
-            }
-        }
-
-        return token;
-    }
-
-    /**
-     * Clear all authentication tokens.
-     */
-    public void clearAuthenticationTokens() {
-        this.authenticationTokens.clear();
-    }
-
-    @Override
-    @SuppressWarnings("deprecation")
-    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
-        try {
-            // Check the against the whitelist and lock out access to the WebView directory
-            // Changing this will cause problems for your application
-            if (!parentEngine.pluginManager.shouldAllowRequest(url)) {
-                LOG.w(TAG, "URL blocked by whitelist: " + url);
-                // Results in a 404.
-                return new WebResourceResponse("text/plain", "UTF-8", null);
-            }
-
-            CordovaResourceApi resourceApi = parentEngine.resourceApi;
-            Uri origUri = Uri.parse(url);
-            // Allow plugins to intercept WebView requests.
-            Uri remappedUri = resourceApi.remapUri(origUri);
-
-            if (!origUri.equals(remappedUri) || needsSpecialsInAssetUrlFix(origUri) || needsContentUrlFix(origUri)) {
-                CordovaResourceApi.OpenForReadResult result = resourceApi.openForRead(remappedUri, true);
-                return new WebResourceResponse(result.mimeType, "UTF-8", result.inputStream);
-            }
-            // If we don't need to special-case the request, let the browser load it.
-            return null;
-        } catch (IOException e) {
-            if (!(e instanceof FileNotFoundException)) {
-                LOG.e(TAG, "Error occurred while loading a file (returning a 404).", e);
-            }
-            // Results in a 404.
-            return new WebResourceResponse("text/plain", "UTF-8", null);
-        }
-    }
-
-    private static boolean needsContentUrlFix(Uri uri) {
-        return "content".equals(uri.getScheme());
-    }
-
-    private static boolean needsSpecialsInAssetUrlFix(Uri uri) {
-        if (CordovaResourceApi.getUriType(uri) != CordovaResourceApi.URI_TYPE_ASSET) {
-            return false;
-        }
-        if (uri.getQuery() != null || uri.getFragment() != null) {
-            return true;
-        }
-
-        if (!uri.toString().contains("%")) {
-            return false;
-        }
-
-        return false;
-    }
-}

+ 0 - 328
platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewEngine.java

@@ -1,328 +0,0 @@
-/*
-       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.engine;
-
-import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.os.Build;
-import android.view.View;
-import android.webkit.ValueCallback;
-import android.webkit.WebSettings;
-import android.webkit.WebSettings.LayoutAlgorithm;
-import android.webkit.WebView;
-
-import org.apache.cordova.CordovaBridge;
-import org.apache.cordova.CordovaInterface;
-import org.apache.cordova.CordovaPreferences;
-import org.apache.cordova.CordovaResourceApi;
-import org.apache.cordova.CordovaWebView;
-import org.apache.cordova.CordovaWebViewEngine;
-import org.apache.cordova.ICordovaCookieManager;
-import org.apache.cordova.LOG;
-import org.apache.cordova.NativeToJsMessageQueue;
-import org.apache.cordova.PluginManager;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-
-/**
- * Glue class between CordovaWebView (main Cordova logic) and SystemWebView (the actual View).
- * We make the Engine separate from the actual View so that:
- *  A) We don't need to worry about WebView methods clashing with CordovaWebViewEngine methods
- *     (e.g.: goBack() is void for WebView, and boolean for CordovaWebViewEngine)
- *  B) Separating the actual View from the Engine makes API surfaces smaller.
- * Class uses two-phase initialization. However, CordovaWebView is responsible for calling .init().
- */
-public class SystemWebViewEngine implements CordovaWebViewEngine {
-    public static final String TAG = "SystemWebViewEngine";
-
-    protected final SystemWebView webView;
-    protected final SystemCookieManager cookieManager;
-    protected CordovaPreferences preferences;
-    protected CordovaBridge bridge;
-    protected CordovaWebViewEngine.Client client;
-    protected CordovaWebView parentWebView;
-    protected CordovaInterface cordova;
-    protected PluginManager pluginManager;
-    protected CordovaResourceApi resourceApi;
-    protected NativeToJsMessageQueue nativeToJsMessageQueue;
-    private BroadcastReceiver receiver;
-
-    /** Used when created via reflection. */
-    public SystemWebViewEngine(Context context, CordovaPreferences preferences) {
-        this(new SystemWebView(context), preferences);
-    }
-
-    public SystemWebViewEngine(SystemWebView webView) {
-        this(webView, null);
-    }
-
-    public SystemWebViewEngine(SystemWebView webView, CordovaPreferences preferences) {
-        this.preferences = preferences;
-        this.webView = webView;
-        cookieManager = new SystemCookieManager(webView);
-    }
-
-    @Override
-    public void init(CordovaWebView parentWebView, CordovaInterface cordova, CordovaWebViewEngine.Client client,
-              CordovaResourceApi resourceApi, PluginManager pluginManager,
-              NativeToJsMessageQueue nativeToJsMessageQueue) {
-        if (this.cordova != null) {
-            throw new IllegalStateException();
-        }
-        // Needed when prefs are not passed by the constructor
-        if (preferences == null) {
-            preferences = parentWebView.getPreferences();
-        }
-        this.parentWebView = parentWebView;
-        this.cordova = cordova;
-        this.client = client;
-        this.resourceApi = resourceApi;
-        this.pluginManager = pluginManager;
-        this.nativeToJsMessageQueue = nativeToJsMessageQueue;
-        webView.init(this, cordova);
-
-        initWebViewSettings();
-
-        nativeToJsMessageQueue.addBridgeMode(new NativeToJsMessageQueue.OnlineEventsBridgeMode(new NativeToJsMessageQueue.OnlineEventsBridgeMode.OnlineEventsBridgeModeDelegate() {
-            @Override
-            public void setNetworkAvailable(boolean value) {
-                //sometimes this can be called after calling webview.destroy() on destroy()
-                //thus resulting in a NullPointerException
-                if(webView!=null) {
-                   webView.setNetworkAvailable(value);
-                }
-            }
-            @Override
-            public void runOnUiThread(Runnable r) {
-                SystemWebViewEngine.this.cordova.getActivity().runOnUiThread(r);
-            }
-        }));
-        nativeToJsMessageQueue.addBridgeMode(new NativeToJsMessageQueue.EvalBridgeMode(this, cordova));
-        bridge = new CordovaBridge(pluginManager, nativeToJsMessageQueue);
-        exposeJsInterface(webView, bridge);
-    }
-
-    @Override
-    public CordovaWebView getCordovaWebView() {
-        return parentWebView;
-    }
-
-    @Override
-    public ICordovaCookieManager getCookieManager() {
-        return cookieManager;
-    }
-
-    @Override
-    public View getView() {
-        return webView;
-    }
-
-    @SuppressLint({"NewApi", "SetJavaScriptEnabled"})
-    @SuppressWarnings("deprecation")
-    private void initWebViewSettings() {
-        webView.setInitialScale(0);
-        webView.setVerticalScrollBarEnabled(false);
-        // Enable JavaScript
-        final WebSettings settings = webView.getSettings();
-        settings.setJavaScriptEnabled(true);
-        settings.setJavaScriptCanOpenWindowsAutomatically(true);
-        settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
-
-        /**
-         * https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccess(boolean)
-         * 
-         * SDK >= 30 has recently set this value to false by default.
-         * It is recommended to turn off this settings To prevent possible security issues targeting Build.VERSION_CODES.Q and earlier.
-         * For existing functionality, this setting is set to true. In a future release, this should be defaulted to false.
-         */
-        settings.setAllowFileAccess(true);
-
-        String manufacturer = android.os.Build.MANUFACTURER;
-        LOG.d(TAG, "CordovaWebView is running on device made by: " + manufacturer);
-
-        //We don't save any form data in the application
-        settings.setSaveFormData(false);
-        settings.setSavePassword(false);
-
-        // Jellybean rightfully tried to lock this down. Too bad they didn't give us a whitelist
-        // while we do this
-        settings.setAllowUniversalAccessFromFileURLs(true);
-        settings.setMediaPlaybackRequiresUserGesture(false);
-
-        // Enable database
-        // We keep this disabled because we use or shim to get around DOM_EXCEPTION_ERROR_16
-        String databasePath = webView.getContext().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
-        settings.setDatabaseEnabled(true);
-        settings.setDatabasePath(databasePath);
-
-
-        //Determine whether we're in debug or release mode, and turn on Debugging!
-        ApplicationInfo appInfo = webView.getContext().getApplicationContext().getApplicationInfo();
-        if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
-            enableRemoteDebugging();
-        }
-
-        settings.setGeolocationDatabasePath(databasePath);
-
-        // Enable DOM storage
-        settings.setDomStorageEnabled(true);
-
-        // Enable built-in geolocation
-        settings.setGeolocationEnabled(true);
-
-        // Enable AppCache
-        // Fix for CB-2282
-        settings.setAppCacheMaxSize(5 * 1048576);
-        settings.setAppCachePath(databasePath);
-        settings.setAppCacheEnabled(true);
-
-        // Fix for CB-1405
-        // Google issue 4641
-        String defaultUserAgent = settings.getUserAgentString();
-
-        // Fix for CB-3360
-        String overrideUserAgent = preferences.getString("OverrideUserAgent", null);
-        if (overrideUserAgent != null) {
-            settings.setUserAgentString(overrideUserAgent);
-        } else {
-            String appendUserAgent = preferences.getString("AppendUserAgent", null);
-            if (appendUserAgent != null) {
-                settings.setUserAgentString(defaultUserAgent + " " + appendUserAgent);
-            }
-        }
-        // End CB-3360
-
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
-        if (this.receiver == null) {
-            this.receiver = new BroadcastReceiver() {
-                @Override
-                public void onReceive(Context context, Intent intent) {
-                    settings.getUserAgentString();
-                }
-            };
-            webView.getContext().registerReceiver(this.receiver, intentFilter);
-        }
-        // end CB-1405
-    }
-
-    private void enableRemoteDebugging() {
-        try {
-            WebView.setWebContentsDebuggingEnabled(true);
-        } catch (IllegalArgumentException e) {
-            LOG.d(TAG, "You have one job! To turn on Remote Web Debugging! YOU HAVE FAILED! ");
-            e.printStackTrace();
-        }
-    }
-
-    // Yeah, we know. It'd be great if lint was just a little smarter.
-    @SuppressLint("AddJavascriptInterface")
-    private static void exposeJsInterface(WebView webView, CordovaBridge bridge) {
-        SystemExposedJsApi exposedJsApi = new SystemExposedJsApi(bridge);
-        webView.addJavascriptInterface(exposedJsApi, "_cordovaNative");
-    }
-
-
-    /**
-     * Load the url into the webview.
-     */
-    @Override
-    public void loadUrl(final String url, boolean clearNavigationStack) {
-        webView.loadUrl(url);
-    }
-
-    @Override
-    public String getUrl() {
-        return webView.getUrl();
-    }
-
-    @Override
-    public void stopLoading() {
-        webView.stopLoading();
-    }
-
-    @Override
-    public void clearCache() {
-        webView.clearCache(true);
-    }
-
-    @Override
-    public void clearHistory() {
-        webView.clearHistory();
-    }
-
-    @Override
-    public boolean canGoBack() {
-        return webView.canGoBack();
-    }
-
-    /**
-     * Go to previous page in history.  (We manage our own history)
-     *
-     * @return true if we went back, false if we are already at top
-     */
-    @Override
-    public boolean goBack() {
-        // Check webview first to see if there is a history
-        // This is needed to support curPage#diffLink, since they are added to parentEngine's history, but not our history url array (JQMobile behavior)
-        if (webView.canGoBack()) {
-            webView.goBack();
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void setPaused(boolean value) {
-        if (value) {
-            webView.onPause();
-            webView.pauseTimers();
-        } else {
-            webView.onResume();
-            webView.resumeTimers();
-        }
-    }
-
-    @Override
-    public void destroy() {
-        webView.chromeClient.destroyLastDialog();
-        webView.destroy();
-        // unregister the receiver
-        if (receiver != null) {
-            try {
-                webView.getContext().unregisterReceiver(receiver);
-            } catch (Exception e) {
-                LOG.e(TAG, "Error unregistering configuration receiver: " + e.getMessage(), e);
-            }
-        }
-    }
-
-    @Override
-    public void evaluateJavascript(String js, ValueCallback<String> callback) {
-        webView.evaluateJavascript(js, callback);
-    }
-}

+ 0 - 373
platforms/android/android.json

@@ -1,373 +0,0 @@
-{
-  "prepare_queue": {
-    "installed": [],
-    "uninstalled": []
-  },
-  "config_munge": {
-    "files": {
-      "AndroidManifest.xml": {
-        "parents": {
-          "/manifest/application": [
-            {
-              "xml": "<activity android:usesCleartextTraffic=\"true\" />",
-              "count": 1,
-              "mode": "merge",
-              "id": "config.xml",
-              "oldAttrib": {
-                "android:hardwareAccelerated": "true",
-                "android:icon": "@mipmap/ic_launcher",
-                "android:label": "@string/app_name",
-                "android:supportsRtl": "true",
-                "android:usesCleartextTraffic": "true"
-              }
-            }
-          ],
-          "/*": [
-            {
-              "xml": "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
-              "count": 34
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.CAMERA\" />",
-              "count": 31
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
-              "count": 32
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />",
-              "count": 31
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.RECORD_VIDEO\" />",
-              "count": 1
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />",
-              "count": 1
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
-              "count": 1
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
-              "count": 1
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.INTERNET\" />",
-              "count": 1
-            },
-            {
-              "xml": "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
-              "count": 1
-            }
-          ]
-        }
-      },
-      "res/xml/config.xml": {
-        "parents": {
-          "/*": [
-            {
-              "xml": "<feature name=\"File\"><param name=\"android-package\" value=\"org.apache.cordova.file.FileUtils\" /><param name=\"onload\" value=\"true\" /></feature>",
-              "count": 1
-            },
-            {
-              "xml": "<allow-navigation href=\"cdvfile:*\" />",
-              "count": 1
-            },
-            {
-              "xml": "<feature name=\"Capture\"><param name=\"android-package\" value=\"org.apache.cordova.mediacapture.Capture\" /></feature>",
-              "count": 1
-            },
-            {
-              "xml": "<preference name=\"webView\" value=\"org.apache.cordova.x5engine.X5WebViewEngine\" />",
-              "count": 1
-            },
-            {
-              "xml": "<preference name=\"appUserAgent\" value=\"x5webview\" />",
-              "count": 1
-            },
-            {
-              "xml": "<preference name=\"android-minSdkVersion\" value=\"15\" />",
-              "count": 1
-            },
-            {
-              "xml": "<allow-navigation href=\"*\" />",
-              "count": 1
-            },
-            {
-              "xml": "<feature name=\"Whitelist\"><param name=\"android-package\" value=\"org.apache.cordova.whitelist.WhitelistPlugin\" /><param name=\"onload\" value=\"true\" /></feature>",
-              "count": 1
-            }
-          ]
-        }
-      }
-    }
-  },
-  "installed_plugins": {
-    "cordova-plugin-file": {
-      "PACKAGE_NAME": "io.cordova.hellocordova"
-    },
-    "cordova-plugin-media-capture": {
-      "PACKAGE_NAME": "io.cordova.hellocordova"
-    },
-    "cordova-plugin-webview-x5": {
-      "PACKAGE_NAME": "io.cordova.hellocordova"
-    },
-    "cordova-plugin-whitelist": {
-      "PACKAGE_NAME": "io.cordova.hellocordova"
-    }
-  },
-  "dependent_plugins": {},
-  "modules": [
-    {
-      "id": "cordova-plugin-file.DirectoryEntry",
-      "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.DirectoryEntry"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.DirectoryReader",
-      "file": "plugins/cordova-plugin-file/www/DirectoryReader.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.DirectoryReader"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.Entry",
-      "file": "plugins/cordova-plugin-file/www/Entry.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.Entry"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.File",
-      "file": "plugins/cordova-plugin-file/www/File.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.File"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileEntry",
-      "file": "plugins/cordova-plugin-file/www/FileEntry.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileEntry"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileError",
-      "file": "plugins/cordova-plugin-file/www/FileError.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileError"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileReader",
-      "file": "plugins/cordova-plugin-file/www/FileReader.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileReader"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileSystem",
-      "file": "plugins/cordova-plugin-file/www/FileSystem.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileSystem"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileUploadOptions",
-      "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileUploadOptions"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileUploadResult",
-      "file": "plugins/cordova-plugin-file/www/FileUploadResult.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileUploadResult"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileWriter",
-      "file": "plugins/cordova-plugin-file/www/FileWriter.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileWriter"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.Flags",
-      "file": "plugins/cordova-plugin-file/www/Flags.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.Flags"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.LocalFileSystem",
-      "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.LocalFileSystem"
-      ],
-      "merges": [
-        "window"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.Metadata",
-      "file": "plugins/cordova-plugin-file/www/Metadata.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.Metadata"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.ProgressEvent",
-      "file": "plugins/cordova-plugin-file/www/ProgressEvent.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.ProgressEvent"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.fileSystems",
-      "file": "plugins/cordova-plugin-file/www/fileSystems.js",
-      "pluginId": "cordova-plugin-file"
-    },
-    {
-      "id": "cordova-plugin-file.requestFileSystem",
-      "file": "plugins/cordova-plugin-file/www/requestFileSystem.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.requestFileSystem"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.resolveLocalFileSystemURI",
-      "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js",
-      "pluginId": "cordova-plugin-file",
-      "merges": [
-        "window"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.isChrome",
-      "file": "plugins/cordova-plugin-file/www/browser/isChrome.js",
-      "pluginId": "cordova-plugin-file",
-      "runs": true
-    },
-    {
-      "id": "cordova-plugin-file.androidFileSystem",
-      "file": "plugins/cordova-plugin-file/www/android/FileSystem.js",
-      "pluginId": "cordova-plugin-file",
-      "merges": [
-        "FileSystem"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.fileSystems-roots",
-      "file": "plugins/cordova-plugin-file/www/fileSystems-roots.js",
-      "pluginId": "cordova-plugin-file",
-      "runs": true
-    },
-    {
-      "id": "cordova-plugin-file.fileSystemPaths",
-      "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js",
-      "pluginId": "cordova-plugin-file",
-      "merges": [
-        "cordova"
-      ],
-      "runs": true
-    },
-    {
-      "id": "cordova-plugin-media-capture.CaptureAudioOptions",
-      "file": "plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "CaptureAudioOptions"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.CaptureImageOptions",
-      "file": "plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "CaptureImageOptions"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.CaptureVideoOptions",
-      "file": "plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "CaptureVideoOptions"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.CaptureError",
-      "file": "plugins/cordova-plugin-media-capture/www/CaptureError.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "CaptureError"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.MediaFileData",
-      "file": "plugins/cordova-plugin-media-capture/www/MediaFileData.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "MediaFileData"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.MediaFile",
-      "file": "plugins/cordova-plugin-media-capture/www/MediaFile.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "MediaFile"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.helpers",
-      "file": "plugins/cordova-plugin-media-capture/www/helpers.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "runs": true
-    },
-    {
-      "id": "cordova-plugin-media-capture.capture",
-      "file": "plugins/cordova-plugin-media-capture/www/capture.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "navigator.device.capture"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.init",
-      "file": "plugins/cordova-plugin-media-capture/www/android/init.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "runs": true
-    }
-  ],
-  "plugin_metadata": {
-    "cordova-plugin-file": "6.0.2",
-    "cordova-plugin-media-capture": "3.0.3",
-    "cordova-plugin-webview-x5": "0.3.2",
-    "cordova-plugin-whitelist": "1.3.5"
-  }
-}

+ 0 - 415
platforms/android/app/build.gradle

@@ -1,415 +0,0 @@
-/*
-       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.
-*/
-
-apply plugin: 'com.android.application'
-
-if (cdvHelpers.getConfigPreference('GradlePluginKotlinEnabled', 'false').toBoolean()) {
-    apply plugin: 'kotlin-android'
-    apply plugin: 'kotlin-android-extensions'
-}
-
-buildscript {
-    apply from: '../CordovaLib/cordova.gradle'
-
-    if(cdvHelpers.getConfigPreference('GradlePluginKotlinEnabled', 'false').toBoolean()) {
-        String defaultGradlePluginKotlinVersion = kotlin_version
-
-        /**
-         * Fetches the user's defined Kotlin Version from config.xml.
-         * If the version is not set or invalid, it will default to the ${defaultGradlePluginKotlinVersion}
-         */
-        String gradlePluginKotlinVersion = cdvHelpers.getConfigPreference('GradlePluginKotlinVersion', defaultGradlePluginKotlinVersion)
-        if(!cdvHelpers.isVersionValid(gradlePluginKotlinVersion)) {
-            println("The defined Kotlin version (${gradlePluginKotlinVersion}) does not appear to be a valid version. Falling back to version: ${defaultGradlePluginKotlinVersion}.")
-            gradlePluginKotlinVersion = defaultGradlePluginKotlinVersion
-        }
-
-        // Change the version to be used.
-        ext.kotlin_version = gradlePluginKotlinVersion
-    }
-
-    apply from: 'repositories.gradle'
-    repositories repos
-
-    dependencies {
-        apply from: '../CordovaLib/cordova.gradle'
-
-        classpath 'com.android.tools.build:gradle:4.0.0'
-
-        if (cdvHelpers.getConfigPreference('GradlePluginKotlinEnabled', 'false').toBoolean()) {
-            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
-        }
-
-        if(cdvHelpers.getConfigPreference('GradlePluginGoogleServicesEnabled', 'false').toBoolean()) {
-            String defaultGradlePluginGoogleServicesVersion = '4.2.0'
-
-            /**
-             * Fetches the user's defined Google Services Plugin Version from config.xml.
-             * If the version is not set or invalid, it will default to the ${defaultGradlePluginGoogleServicesVersion}
-             */
-            String gradlePluginGoogleServicesVersion = cdvHelpers.getConfigPreference('GradlePluginGoogleServicesVersion', defaultGradlePluginGoogleServicesVersion)
-            if(!cdvHelpers.isVersionValid(gradlePluginGoogleServicesVersion)) {
-                println("The defined Google Services plugin version (${gradlePluginGoogleServicesVersion}) does not appear to be a valid version. Falling back to version: ${defaultGradlePluginGoogleServicesVersion}.")
-                gradlePluginGoogleServicesVersion = defaultGradlePluginGoogleServicesVersion
-            }
-
-            // Create the Google Services classpath and set it.
-            String gradlePluginGoogleServicesClassPath = "com.google.gms:google-services:${gradlePluginGoogleServicesVersion}"
-            println "Adding classpath: ${gradlePluginGoogleServicesClassPath}"
-            classpath gradlePluginGoogleServicesClassPath
-        }
-    }
-}
-
-// Allow plugins to declare Maven dependencies via build-extras.gradle.
-allprojects {
-    apply from: 'repositories.gradle'
-    repositories repos
-}
-
-task wrapper(type: Wrapper) {
-    gradleVersion = '6.5'
-}
-
-// Configuration properties. Set these via environment variables, build-extras.gradle, or gradle.properties.
-// Refer to: http://www.gradle.org/docs/current/userguide/tutorial_this_and_that.html
-ext {
-    apply from: '../CordovaLib/cordova.gradle'
-
-    // The value for android.compileSdkVersion.
-    if (!project.hasProperty('cdvCompileSdkVersion')) {
-        cdvCompileSdkVersion = null;
-    }
-    // The value for android.buildToolsVersion.
-    if (!project.hasProperty('cdvBuildToolsVersion')) {
-        cdvBuildToolsVersion = null;
-    }
-    // Sets the versionCode to the given value.
-    if (!project.hasProperty('cdvVersionCode')) {
-        cdvVersionCode = null
-    }
-    // Sets the minSdkVersion to the given value.
-    if (!project.hasProperty('cdvMinSdkVersion')) {
-        cdvMinSdkVersion = null
-    }
-    // Sets the maxSdkVersion to the given value.
-    if (!project.hasProperty('cdvMaxSdkVersion')) {
-        cdvMaxSdkVersion = null
-    }
-    // The value for android.targetSdkVersion.
-    if (!project.hasProperty('cdvTargetSdkVersion')) {
-        cdvTargetSdkVersion = null;
-    }
-    // Whether to build architecture-specific APKs.
-    if (!project.hasProperty('cdvBuildMultipleApks')) {
-        cdvBuildMultipleApks = null
-    }
-    // Whether to append a 0 "abi digit" to versionCode when only a single APK is build
-    if (!project.hasProperty('cdvVersionCodeForceAbiDigit')) {
-        cdvVersionCodeForceAbiDigit = null
-    }
-    // .properties files to use for release signing.
-    if (!project.hasProperty('cdvReleaseSigningPropertiesFile')) {
-        cdvReleaseSigningPropertiesFile = null
-    }
-    // .properties files to use for debug signing.
-    if (!project.hasProperty('cdvDebugSigningPropertiesFile')) {
-        cdvDebugSigningPropertiesFile = null
-    }
-    // Set by build.js script.
-    if (!project.hasProperty('cdvBuildArch')) {
-        cdvBuildArch = null
-    }
-
-    // Plugin gradle extensions can append to this to have code run at the end.
-    cdvPluginPostBuildExtras = []
-}
-
-// PLUGIN GRADLE EXTENSIONS START
-apply from: "../cordova-plugin-webview-x5/hellocordova-x5.gradle"
-// PLUGIN GRADLE EXTENSIONS END
-
-def hasBuildExtras1 = file('build-extras.gradle').exists()
-if (hasBuildExtras1) {
-    apply from: 'build-extras.gradle'
-}
-
-def hasBuildExtras2 = file('../build-extras.gradle').exists()
-if (hasBuildExtras2) {
-    apply from: '../build-extras.gradle'
-}
-
-// Set property defaults after extension .gradle files.
-ext.cdvCompileSdkVersion = cdvCompileSdkVersion == null ? (
-    defaultCompileSdkVersion == null
-        ? privateHelpers.getProjectTarget()
-        : defaultCompileSdkVersion
-) : Integer.parseInt('' + cdvCompileSdkVersion);
-
-if (ext.cdvBuildToolsVersion == null) {
-    ext.cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()
-    //ext.cdvBuildToolsVersion = project.ext.defaultBuildToolsVersion
-}
-if (ext.cdvDebugSigningPropertiesFile == null && file('../debug-signing.properties').exists()) {
-    ext.cdvDebugSigningPropertiesFile = '../debug-signing.properties'
-}
-if (ext.cdvReleaseSigningPropertiesFile == null && file('../release-signing.properties').exists()) {
-    ext.cdvReleaseSigningPropertiesFile = '../release-signing.properties'
-}
-
-// Cast to appropriate types.
-ext.cdvBuildMultipleApks = cdvBuildMultipleApks == null ? false : cdvBuildMultipleApks.toBoolean();
-ext.cdvVersionCodeForceAbiDigit = cdvVersionCodeForceAbiDigit == null ? false : cdvVersionCodeForceAbiDigit.toBoolean();
-
-// minSdkVersion, maxSdkVersion and targetSdkVersion
-ext.cdvMinSdkVersion = cdvMinSdkVersion == null ? defaultMinSdkVersion : Integer.parseInt('' + cdvMinSdkVersion)
-if (cdvMaxSdkVersion != null) {
-    ext.cdvMaxSdkVersion = Integer.parseInt('' + cdvMaxSdkVersion)
-}
-ext.cdvTargetSdkVersion = cdvTargetSdkVersion == null ? defaultTargetSdkVersion  : Integer.parseInt('' + cdvTargetSdkVersion)
-
-ext.cdvVersionCode = cdvVersionCode == null ? null : Integer.parseInt('' + cdvVersionCode)
-
-def computeBuildTargetName(debugBuild) {
-    def ret = 'assemble'
-    if (cdvBuildMultipleApks && cdvBuildArch) {
-        def arch = cdvBuildArch == 'arm' ? 'armv7' : cdvBuildArch
-        ret += '' + arch.toUpperCase().charAt(0) + arch.substring(1);
-    }
-    return ret + (debugBuild ? 'Debug' : 'Release')
-}
-
-// Make cdvBuild a task that depends on the debug/arch-sepecific task.
-task cdvBuildDebug
-cdvBuildDebug.dependsOn {
-    return computeBuildTargetName(true)
-}
-
-task cdvBuildRelease
-cdvBuildRelease.dependsOn {
-    return computeBuildTargetName(false)
-}
-
-task cdvPrintProps {
-    doLast {
-        println('cdvCompileSdkVersion=' + cdvCompileSdkVersion)
-        println('cdvBuildToolsVersion=' + cdvBuildToolsVersion)
-        println('cdvVersionCode=' + cdvVersionCode)
-        println('cdvVersionCodeForceAbiDigit=' + cdvVersionCodeForceAbiDigit)
-        println('cdvMinSdkVersion=' + cdvMinSdkVersion)
-        println('cdvMaxSdkVersion=' + cdvMaxSdkVersion)
-        println('cdvTargetSdkVersion=' + cdvTargetSdkVersion)
-        println('cdvBuildMultipleApks=' + cdvBuildMultipleApks)
-        println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile)
-        println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile)
-        println('cdvBuildArch=' + cdvBuildArch)
-        println('computedVersionCode=' + android.defaultConfig.versionCode)
-        android.productFlavors.each { flavor ->
-            println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode)
-        }
-    }
-}
-
-android {
-    defaultConfig {
-        versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode"))
-        applicationId privateHelpers.extractStringFromManifest("package")
-
-        if (cdvMinSdkVersion != null) {
-            minSdkVersion cdvMinSdkVersion
-        }
-
-        if (cdvMaxSdkVersion != null) {
-            maxSdkVersion cdvMaxSdkVersion
-        }
-
-        if(cdvTargetSdkVersion != null) {
-            targetSdkVersion cdvTargetSdkVersion
-        }
-    }
-
-    lintOptions {
-      abortOnError false;
-    }
-
-    compileSdkVersion cdvCompileSdkVersion
-    buildToolsVersion cdvBuildToolsVersion
-
-    // This code exists for Crosswalk and other Native APIs.
-    // By default, we multiply the existing version code in the
-    // Android Manifest by 10 and add a number for each architecture.
-    // If you are not using Crosswalk or SQLite, you can
-    // ignore this chunk of code, and your version codes will be respected.
-
-    if (Boolean.valueOf(cdvBuildMultipleApks)) {
-        flavorDimensions "default"
-
-        productFlavors {
-            armeabi {
-                versionCode defaultConfig.versionCode*10 + 1
-                ndk {
-                    abiFilters = ["armeabi"]
-                }
-            }
-            armv7 {
-                versionCode defaultConfig.versionCode*10 + 2
-                ndk {
-                    abiFilters = ["armeabi-v7a"]
-                }
-            }
-            arm64 {
-                versionCode defaultConfig.versionCode*10 + 3
-                ndk {
-                    abiFilters = ["arm64-v8a"]
-                }
-            }
-            x86 {
-                versionCode defaultConfig.versionCode*10 + 4
-                ndk {
-                    abiFilters = ["x86"]
-                }
-            }
-            x86_64 {
-                versionCode defaultConfig.versionCode*10 + 5
-                ndk {
-                    abiFilters = ["x86_64"]
-                }
-            }
-        }
-    } else if (Boolean.valueOf(cdvVersionCodeForceAbiDigit)) {
-        // This provides compatibility to the default logic for versionCode before cordova-android 5.2.0
-        defaultConfig {
-            versionCode defaultConfig.versionCode*10
-        }
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_8
-        targetCompatibility JavaVersion.VERSION_1_8
-    }
-
-    if (cdvReleaseSigningPropertiesFile) {
-        signingConfigs {
-            release {
-                // These must be set or Gradle will complain (even if they are overridden).
-                keyAlias = ""
-                keyPassword = "__unset" // And these must be set to non-empty in order to have the signing step added to the task graph.
-                storeFile = null
-                storePassword = "__unset"
-            }
-        }
-        buildTypes {
-            release {
-                signingConfig signingConfigs.release
-            }
-        }
-        addSigningProps(cdvReleaseSigningPropertiesFile, signingConfigs.release)
-    }
-
-    if (cdvDebugSigningPropertiesFile) {
-        addSigningProps(cdvDebugSigningPropertiesFile, signingConfigs.debug)
-    }
-
-    sourceSets {
-        main.java.srcDirs += 'src/main/kotlin'
-    }
-}
-
-/*
- * WARNING: Cordova Lib and platform scripts do management inside of this code here,
- * if you are adding the dependencies manually, do so outside the comments, otherwise
- * the Cordova tools will overwrite them
- */
-
-
-dependencies {
-    implementation fileTree(dir: 'libs', include: '*.jar')
-
-    if (cdvHelpers.getConfigPreference('GradlePluginKotlinEnabled', 'false').toBoolean()) {
-        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
-    }
-
-    // SUB-PROJECT DEPENDENCIES START
-    implementation(project(path: ":CordovaLib"))
-    // SUB-PROJECT DEPENDENCIES END
-}
-
-def promptForReleaseKeyPassword() {
-    if (!cdvReleaseSigningPropertiesFile) {
-        return;
-    }
-    if ('__unset'.equals(android.signingConfigs.release.storePassword)) {
-        android.signingConfigs.release.storePassword = privateHelpers.promptForPassword('Enter key store password: ')
-    }
-    if ('__unset'.equals(android.signingConfigs.release.keyPassword)) {
-        android.signingConfigs.release.keyPassword = privateHelpers.promptForPassword('Enter key password: ');
-    }
-}
-
-gradle.taskGraph.whenReady { taskGraph ->
-    taskGraph.getAllTasks().each() { task ->
-      if(['validateReleaseSigning', 'validateSigningRelease', 'validateSigningArmv7Release', 'validateSigningX76Release'].contains(task.name)) {
-         promptForReleaseKeyPassword()
-      }
-    }
-}
-
-def addSigningProps(propsFilePath, signingConfig) {
-    def propsFile = file(propsFilePath)
-    def props = new Properties()
-    propsFile.withReader { reader ->
-        props.load(reader)
-    }
-
-    def storeFile = new File(props.get('key.store') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'storeFile'))
-    if (!storeFile.isAbsolute()) {
-        storeFile = RelativePath.parse(true, storeFile.toString()).getFile(propsFile.getParentFile())
-    }
-    if (!storeFile.exists()) {
-        throw new FileNotFoundException('Keystore file does not exist: ' + storeFile.getAbsolutePath())
-    }
-    signingConfig.keyAlias = props.get('key.alias') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'keyAlias')
-    signingConfig.keyPassword = props.get('keyPassword', props.get('key.alias.password', signingConfig.keyPassword))
-    signingConfig.storeFile = storeFile
-    signingConfig.storePassword = props.get('storePassword', props.get('key.store.password', signingConfig.storePassword))
-    def storeType = props.get('storeType', props.get('key.store.type', ''))
-    if (!storeType) {
-        def filename = storeFile.getName().toLowerCase();
-        if (filename.endsWith('.p12') || filename.endsWith('.pfx')) {
-            storeType = 'pkcs12'
-        } else {
-            storeType = signingConfig.storeType // "jks"
-        }
-    }
-    signingConfig.storeType = storeType
-}
-
-for (def func : cdvPluginPostBuildExtras) {
-    func()
-}
-
-// This can be defined within build-extras.gradle as:
-//     ext.postBuildExtras = { ... code here ... }
-if (hasProperty('postBuildExtras')) {
-    postBuildExtras()
-}
-
-if (cdvHelpers.getConfigPreference('GradlePluginGoogleServicesEnabled', 'false').toBoolean()) {
-    apply plugin: 'com.google.gms.google-services'
-}

BIN
platforms/android/app/libs/x5core.aar


+ 0 - 23
platforms/android/app/repositories.gradle

@@ -1,23 +0,0 @@
-/* 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.
-*/
-
-ext.repos = {
-    mavenCentral()
-    google()
-    jcenter()
-}

+ 0 - 22
platforms/android/app/src/main/AndroidManifest.xml

@@ -1,22 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="io.cordova.hellocordova" xmlns:android="http://schemas.android.com/apk/res/android">
-    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:usesCleartextTraffic="true">
-        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
-            <intent-filter android:label="@string/launcher_name">
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.RECORD_AUDIO" />
-    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
-    <uses-permission android:name="android.permission.RECORD_VIDEO" />
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
-</manifest>

+ 0 - 36
platforms/android/app/src/main/assets/www/cordova-js-src/android/nativeapiprovider.js

@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
-*/
-
-/**
- * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi.
- */
-
-var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi');
-var currentApi = nativeApi;
-
-module.exports = {
-    get: function () { return currentApi; },
-    setPreferPrompt: function (value) {
-        currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi;
-    },
-    // Used only by tests.
-    set: function (value) {
-        currentApi = value;
-    }
-};

+ 0 - 35
platforms/android/app/src/main/assets/www/cordova-js-src/android/promptbasednativeapi.js

@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
-*/
-
-/**
- * Implements the API of ExposedJsApi.java, but uses prompt() to communicate.
- * This is used pre-JellyBean, where addJavascriptInterface() is disabled.
- */
-
-module.exports = {
-    exec: function (bridgeSecret, service, action, callbackId, argsJson) {
-        return prompt(argsJson, 'gap:' + JSON.stringify([bridgeSecret, service, action, callbackId]));
-    },
-    setNativeToJsBridgeMode: function (bridgeSecret, value) {
-        prompt(value, 'gap_bridge_mode:' + bridgeSecret);
-    },
-    retrieveJsMessages: function (bridgeSecret, fromOnlineEvent) {
-        return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret);
-    }
-};

+ 0 - 287
platforms/android/app/src/main/assets/www/cordova-js-src/exec.js

@@ -1,287 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/**
- * Execute a cordova command.  It is up to the native side whether this action
- * is synchronous or asynchronous.  The native side can return:
- *      Synchronous: PluginResult object as a JSON string
- *      Asynchronous: Empty string ""
- * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
- * depending upon the result of the action.
- *
- * @param {Function} success    The success callback
- * @param {Function} fail       The fail callback
- * @param {String} service      The name of the service to use
- * @param {String} action       Action to be run in cordova
- * @param {String[]} [args]     Zero or more arguments to pass to the method
- */
-var cordova = require('cordova');
-var nativeApiProvider = require('cordova/android/nativeapiprovider');
-var utils = require('cordova/utils');
-var base64 = require('cordova/base64');
-var channel = require('cordova/channel');
-var jsToNativeModes = {
-    PROMPT: 0,
-    JS_OBJECT: 1
-};
-var nativeToJsModes = {
-    // Polls for messages using the JS->Native bridge.
-    POLLING: 0,
-    // For LOAD_URL to be viable, it would need to have a work-around for
-    // the bug where the soft-keyboard gets dismissed when a message is sent.
-    LOAD_URL: 1,
-    // For the ONLINE_EVENT to be viable, it would need to intercept all event
-    // listeners (both through addEventListener and window.ononline) as well
-    // as set the navigator property itself.
-    ONLINE_EVENT: 2,
-    EVAL_BRIDGE: 3
-};
-var jsToNativeBridgeMode; // Set lazily.
-var nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE;
-var pollEnabled = false;
-var bridgeSecret = -1;
-
-var messagesFromNative = [];
-var isProcessing = false;
-var resolvedPromise = typeof Promise === 'undefined' ? null : Promise.resolve();
-var nextTick = resolvedPromise ? function (fn) { resolvedPromise.then(fn); } : function (fn) { setTimeout(fn); };
-
-function androidExec (success, fail, service, action, args) {
-    if (bridgeSecret < 0) {
-        // If we ever catch this firing, we'll need to queue up exec()s
-        // and fire them once we get a secret. For now, I don't think
-        // it's possible for exec() to be called since plugins are parsed but
-        // not run until until after onNativeReady.
-        throw new Error('exec() called without bridgeSecret');
-    }
-    // Set default bridge modes if they have not already been set.
-    // By default, we use the failsafe, since addJavascriptInterface breaks too often
-    if (jsToNativeBridgeMode === undefined) {
-        androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
-    }
-
-    // If args is not provided, default to an empty array
-    args = args || [];
-
-    // Process any ArrayBuffers in the args into a string.
-    for (var i = 0; i < args.length; i++) {
-        if (utils.typeName(args[i]) === 'ArrayBuffer') {
-            args[i] = base64.fromArrayBuffer(args[i]);
-        }
-    }
-
-    var callbackId = service + cordova.callbackId++;
-    var argsJson = JSON.stringify(args);
-    if (success || fail) {
-        cordova.callbacks[callbackId] = { success: success, fail: fail };
-    }
-
-    var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);
-    // If argsJson was received by Java as null, try again with the PROMPT bridge mode.
-    // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2.  See CB-2666.
-    if (jsToNativeBridgeMode === jsToNativeModes.JS_OBJECT && msgs === '@Null arguments.') {
-        androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT);
-        androidExec(success, fail, service, action, args);
-        androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
-    } else if (msgs) {
-        messagesFromNative.push(msgs);
-        // Always process async to avoid exceptions messing up stack.
-        nextTick(processMessages);
-    }
-}
-
-androidExec.init = function () {
-    bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode);
-    channel.onNativeReady.fire();
-};
-
-function pollOnceFromOnlineEvent () {
-    pollOnce(true);
-}
-
-function pollOnce (opt_fromOnlineEvent) {
-    if (bridgeSecret < 0) {
-        // This can happen when the NativeToJsMessageQueue resets the online state on page transitions.
-        // We know there's nothing to retrieve, so no need to poll.
-        return;
-    }
-    var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent);
-    if (msgs) {
-        messagesFromNative.push(msgs);
-        // Process sync since we know we're already top-of-stack.
-        processMessages();
-    }
-}
-
-function pollingTimerFunc () {
-    if (pollEnabled) {
-        pollOnce();
-        setTimeout(pollingTimerFunc, 50);
-    }
-}
-
-function hookOnlineApis () {
-    function proxyEvent (e) {
-        cordova.fireWindowEvent(e.type);
-    }
-    // The network module takes care of firing online and offline events.
-    // It currently fires them only on document though, so we bridge them
-    // to window here (while first listening for exec()-releated online/offline
-    // events).
-    window.addEventListener('online', pollOnceFromOnlineEvent, false);
-    window.addEventListener('offline', pollOnceFromOnlineEvent, false);
-    cordova.addWindowEventHandler('online');
-    cordova.addWindowEventHandler('offline');
-    document.addEventListener('online', proxyEvent, false);
-    document.addEventListener('offline', proxyEvent, false);
-}
-
-hookOnlineApis();
-
-androidExec.jsToNativeModes = jsToNativeModes;
-androidExec.nativeToJsModes = nativeToJsModes;
-
-androidExec.setJsToNativeBridgeMode = function (mode) {
-    if (mode === jsToNativeModes.JS_OBJECT && !window._cordovaNative) {
-        mode = jsToNativeModes.PROMPT;
-    }
-    nativeApiProvider.setPreferPrompt(mode === jsToNativeModes.PROMPT);
-    jsToNativeBridgeMode = mode;
-};
-
-androidExec.setNativeToJsBridgeMode = function (mode) {
-    if (mode === nativeToJsBridgeMode) {
-        return;
-    }
-    if (nativeToJsBridgeMode === nativeToJsModes.POLLING) {
-        pollEnabled = false;
-    }
-
-    nativeToJsBridgeMode = mode;
-    // Tell the native side to switch modes.
-    // Otherwise, it will be set by androidExec.init()
-    if (bridgeSecret >= 0) {
-        nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode);
-    }
-
-    if (mode === nativeToJsModes.POLLING) {
-        pollEnabled = true;
-        setTimeout(pollingTimerFunc, 1);
-    }
-};
-
-function buildPayload (payload, message) {
-    var payloadKind = message.charAt(0);
-    if (payloadKind === 's') {
-        payload.push(message.slice(1));
-    } else if (payloadKind === 't') {
-        payload.push(true);
-    } else if (payloadKind === 'f') {
-        payload.push(false);
-    } else if (payloadKind === 'N') {
-        payload.push(null);
-    } else if (payloadKind === 'n') {
-        payload.push(+message.slice(1));
-    } else if (payloadKind === 'A') {
-        var data = message.slice(1);
-        payload.push(base64.toArrayBuffer(data));
-    } else if (payloadKind === 'S') {
-        payload.push(window.atob(message.slice(1)));
-    } else if (payloadKind === 'M') {
-        var multipartMessages = message.slice(1);
-        while (multipartMessages !== '') {
-            var spaceIdx = multipartMessages.indexOf(' ');
-            var msgLen = +multipartMessages.slice(0, spaceIdx);
-            var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen);
-            multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1);
-            buildPayload(payload, multipartMessage);
-        }
-    } else {
-        payload.push(JSON.parse(message));
-    }
-}
-
-// Processes a single message, as encoded by NativeToJsMessageQueue.java.
-function processMessage (message) {
-    var firstChar = message.charAt(0);
-    if (firstChar === 'J') {
-        // This is deprecated on the .java side. It doesn't work with CSP enabled.
-        // eslint-disable-next-line no-eval
-        eval(message.slice(1));
-    } else if (firstChar === 'S' || firstChar === 'F') {
-        var success = firstChar === 'S';
-        var keepCallback = message.charAt(1) === '1';
-        var spaceIdx = message.indexOf(' ', 2);
-        var status = +message.slice(2, spaceIdx);
-        var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1);
-        var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx);
-        var payloadMessage = message.slice(nextSpaceIdx + 1);
-        var payload = [];
-        buildPayload(payload, payloadMessage);
-        cordova.callbackFromNative(callbackId, success, status, payload, keepCallback);
-    } else {
-        console.log('processMessage failed: invalid message: ' + JSON.stringify(message));
-    }
-}
-
-function processMessages () {
-    // Check for the reentrant case.
-    if (isProcessing) {
-        return;
-    }
-    if (messagesFromNative.length === 0) {
-        return;
-    }
-    isProcessing = true;
-    try {
-        var msg = popMessageFromQueue();
-        // The Java side can send a * message to indicate that it
-        // still has messages waiting to be retrieved.
-        if (msg === '*' && messagesFromNative.length === 0) {
-            nextTick(pollOnce);
-            return;
-        }
-        processMessage(msg);
-    } finally {
-        isProcessing = false;
-        if (messagesFromNative.length > 0) {
-            nextTick(processMessages);
-        }
-    }
-}
-
-function popMessageFromQueue () {
-    var messageBatch = messagesFromNative.shift();
-    if (messageBatch === '*') {
-        return '*';
-    }
-
-    var spaceIdx = messageBatch.indexOf(' ');
-    var msgLen = +messageBatch.slice(0, spaceIdx);
-    var message = messageBatch.substr(spaceIdx + 1, msgLen);
-    messageBatch = messageBatch.slice(spaceIdx + msgLen + 1);
-    if (messageBatch) {
-        messagesFromNative.unshift(messageBatch);
-    }
-    return message;
-}
-
-module.exports = androidExec;

+ 0 - 122
platforms/android/app/src/main/assets/www/cordova-js-src/platform.js

@@ -1,122 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-// The last resume event that was received that had the result of a plugin call.
-var lastResumeEvent = null;
-
-module.exports = {
-    id: 'android',
-    bootstrap: function () {
-        var channel = require('cordova/channel');
-        var cordova = require('cordova');
-        var exec = require('cordova/exec');
-        var modulemapper = require('cordova/modulemapper');
-
-        // Get the shared secret needed to use the bridge.
-        exec.init();
-
-        // TODO: Extract this as a proper plugin.
-        modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app');
-
-        var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App';
-
-        // Inject a listener for the backbutton on the document.
-        var backButtonChannel = cordova.addDocumentEventHandler('backbutton');
-        backButtonChannel.onHasSubscribersChange = function () {
-            // If we just attached the first handler or detached the last handler,
-            // let native know we need to override the back button.
-            exec(null, null, APP_PLUGIN_NAME, 'overrideBackbutton', [this.numHandlers === 1]);
-        };
-
-        // Add hardware MENU and SEARCH button handlers
-        cordova.addDocumentEventHandler('menubutton');
-        cordova.addDocumentEventHandler('searchbutton');
-
-        function bindButtonChannel (buttonName) {
-            // generic button bind used for volumeup/volumedown buttons
-            var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button');
-            volumeButtonChannel.onHasSubscribersChange = function () {
-                exec(null, null, APP_PLUGIN_NAME, 'overrideButton', [buttonName, this.numHandlers === 1]);
-            };
-        }
-        // Inject a listener for the volume buttons on the document.
-        bindButtonChannel('volumeup');
-        bindButtonChannel('volumedown');
-
-        // The resume event is not "sticky", but it is possible that the event
-        // will contain the result of a plugin call. We need to ensure that the
-        // plugin result is delivered even after the event is fired (CB-10498)
-        var cordovaAddEventListener = document.addEventListener;
-
-        document.addEventListener = function (evt, handler, capture) {
-            cordovaAddEventListener(evt, handler, capture);
-
-            if (evt === 'resume' && lastResumeEvent) {
-                handler(lastResumeEvent);
-            }
-        };
-
-        // Let native code know we are all done on the JS side.
-        // Native code will then un-hide the WebView.
-        channel.onCordovaReady.subscribe(function () {
-            exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []);
-            exec(null, null, APP_PLUGIN_NAME, 'show', []);
-        });
-    }
-};
-
-function onMessageFromNative (msg) {
-    var cordova = require('cordova');
-    var action = msg.action;
-
-    switch (action) {
-    // pause and resume are Android app life cycle events
-    case 'backbutton':
-    case 'menubutton':
-    case 'searchbutton':
-    case 'pause':
-    case 'volumedownbutton':
-    case 'volumeupbutton':
-        cordova.fireDocumentEvent(action);
-        break;
-    case 'resume':
-        if (arguments.length > 1 && msg.pendingResult) {
-            if (arguments.length === 2) {
-                msg.pendingResult.result = arguments[1];
-            } else {
-                // The plugin returned a multipart message
-                var res = [];
-                for (var i = 1; i < arguments.length; i++) {
-                    res.push(arguments[i]);
-                }
-                msg.pendingResult.result = res;
-            }
-
-            // Save the plugin result so that it can be delivered to the js
-            // even if they miss the initial firing of the event
-            lastResumeEvent = msg;
-        }
-        cordova.fireDocumentEvent(action, msg);
-        break;
-    default:
-        throw new Error('Unknown event action ' + action);
-    }
-}

+ 0 - 108
platforms/android/app/src/main/assets/www/cordova-js-src/plugin/android/app.js

@@ -1,108 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var exec = require('cordova/exec');
-var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App';
-
-module.exports = {
-    /**
-    * Clear the resource cache.
-    */
-    clearCache: function () {
-        exec(null, null, APP_PLUGIN_NAME, 'clearCache', []);
-    },
-
-    /**
-    * Load the url into the webview or into new browser instance.
-    *
-    * @param url           The URL to load
-    * @param props         Properties that can be passed in to the activity:
-    *      wait: int                           => wait msec before loading URL
-    *      loadingDialog: "Title,Message"      => display a native loading dialog
-    *      loadUrlTimeoutValue: int            => time in msec to wait before triggering a timeout error
-    *      clearHistory: boolean              => clear webview history (default=false)
-    *      openExternal: boolean              => open in a new browser (default=false)
-    *
-    * Example:
-    *      navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000});
-    */
-    loadUrl: function (url, props) {
-        exec(null, null, APP_PLUGIN_NAME, 'loadUrl', [url, props]);
-    },
-
-    /**
-    * Cancel loadUrl that is waiting to be loaded.
-    */
-    cancelLoadUrl: function () {
-        exec(null, null, APP_PLUGIN_NAME, 'cancelLoadUrl', []);
-    },
-
-    /**
-    * Clear web history in this web view.
-    * Instead of BACK button loading the previous web page, it will exit the app.
-    */
-    clearHistory: function () {
-        exec(null, null, APP_PLUGIN_NAME, 'clearHistory', []);
-    },
-
-    /**
-    * Go to previous page displayed.
-    * This is the same as pressing the backbutton on Android device.
-    */
-    backHistory: function () {
-        exec(null, null, APP_PLUGIN_NAME, 'backHistory', []);
-    },
-
-    /**
-    * Override the default behavior of the Android back button.
-    * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired.
-    *
-    * Note: The user should not have to call this method.  Instead, when the user
-    *       registers for the "backbutton" event, this is automatically done.
-    *
-    * @param override        T=override, F=cancel override
-    */
-    overrideBackbutton: function (override) {
-        exec(null, null, APP_PLUGIN_NAME, 'overrideBackbutton', [override]);
-    },
-
-    /**
-    * Override the default behavior of the Android volume button.
-    * If overridden, when the volume button is pressed, the "volume[up|down]button"
-    * JavaScript event will be fired.
-    *
-    * Note: The user should not have to call this method.  Instead, when the user
-    *       registers for the "volume[up|down]button" event, this is automatically done.
-    *
-    * @param button          volumeup, volumedown
-    * @param override        T=override, F=cancel override
-    */
-    overrideButton: function (button, override) {
-        exec(null, null, APP_PLUGIN_NAME, 'overrideButton', [button, override]);
-    },
-
-    /**
-    * Exit and terminate the application.
-    */
-    exitApp: function () {
-        return exec(null, null, APP_PLUGIN_NAME, 'exitApp', []);
-    }
-};

+ 0 - 1904
platforms/android/app/src/main/assets/www/cordova.js

@@ -1,1904 +0,0 @@
-// Platform: android
-// cordova-js rel/6.0.0-10-g07379820
-/*
- 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() {
-var PLATFORM_VERSION_BUILD_LABEL = '9.1.0';
-// file: src/scripts/require.js
-var require;
-var define;
-
-(function () {
-    var modules = {};
-    // Stack of moduleIds currently being built.
-    var requireStack = [];
-    // Map of module ID -> index into requireStack of modules currently being built.
-    var inProgressModules = {};
-    var SEPARATOR = '.';
-
-    function build (module) {
-        var factory = module.factory;
-        var localRequire = function (id) {
-            var resultantId = id;
-            // Its a relative path, so lop off the last portion and add the id (minus "./")
-            if (id.charAt(0) === '.') {
-                resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2);
-            }
-            return require(resultantId);
-        };
-        module.exports = {};
-        delete module.factory;
-        factory(localRequire, module.exports, module);
-        return module.exports;
-    }
-
-    require = function (id) {
-        if (!modules[id]) {
-            throw new Error('module ' + id + ' not found');
-        } else if (id in inProgressModules) {
-            var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id;
-            throw new Error('Cycle in require graph: ' + cycle);
-        }
-        if (modules[id].factory) {
-            try {
-                inProgressModules[id] = requireStack.length;
-                requireStack.push(id);
-                return build(modules[id]);
-            } finally {
-                delete inProgressModules[id];
-                requireStack.pop();
-            }
-        }
-        return modules[id].exports;
-    };
-
-    define = function (id, factory) {
-        if (Object.prototype.hasOwnProperty.call(modules, id)) {
-            throw new Error('module ' + id + ' already defined');
-        }
-
-        modules[id] = {
-            id: id,
-            factory: factory
-        };
-    };
-
-    define.remove = function (id) {
-        delete modules[id];
-    };
-
-    define.moduleMap = modules;
-})();
-
-// Export for use in node
-if (typeof module === 'object' && typeof require === 'function') {
-    module.exports.require = require;
-    module.exports.define = define;
-}
-
-// file: src/cordova.js
-define("cordova", function(require, exports, module) {
-
-// Workaround for Windows 10 in hosted environment case
-// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object
-if (window.cordova && !(window.cordova instanceof HTMLElement)) {
-    throw new Error('cordova already defined');
-}
-
-var channel = require('cordova/channel');
-var platform = require('cordova/platform');
-
-/**
- * Intercept calls to addEventListener + removeEventListener and handle deviceready,
- * resume, and pause events.
- */
-var m_document_addEventListener = document.addEventListener;
-var m_document_removeEventListener = document.removeEventListener;
-var m_window_addEventListener = window.addEventListener;
-var m_window_removeEventListener = window.removeEventListener;
-
-/**
- * Houses custom event handlers to intercept on document + window event listeners.
- */
-var documentEventHandlers = {};
-var windowEventHandlers = {};
-
-document.addEventListener = function (evt, handler, capture) {
-    var e = evt.toLowerCase();
-    if (typeof documentEventHandlers[e] !== 'undefined') {
-        documentEventHandlers[e].subscribe(handler);
-    } else {
-        m_document_addEventListener.call(document, evt, handler, capture);
-    }
-};
-
-window.addEventListener = function (evt, handler, capture) {
-    var e = evt.toLowerCase();
-    if (typeof windowEventHandlers[e] !== 'undefined') {
-        windowEventHandlers[e].subscribe(handler);
-    } else {
-        m_window_addEventListener.call(window, evt, handler, capture);
-    }
-};
-
-document.removeEventListener = function (evt, handler, capture) {
-    var e = evt.toLowerCase();
-    // If unsubscribing from an event that is handled by a plugin
-    if (typeof documentEventHandlers[e] !== 'undefined') {
-        documentEventHandlers[e].unsubscribe(handler);
-    } else {
-        m_document_removeEventListener.call(document, evt, handler, capture);
-    }
-};
-
-window.removeEventListener = function (evt, handler, capture) {
-    var e = evt.toLowerCase();
-    // If unsubscribing from an event that is handled by a plugin
-    if (typeof windowEventHandlers[e] !== 'undefined') {
-        windowEventHandlers[e].unsubscribe(handler);
-    } else {
-        m_window_removeEventListener.call(window, evt, handler, capture);
-    }
-};
-
-function createEvent (type, data) {
-    var event = document.createEvent('Events');
-    event.initEvent(type, false, false);
-    if (data) {
-        for (var i in data) {
-            if (Object.prototype.hasOwnProperty.call(data, i)) {
-                event[i] = data[i];
-            }
-        }
-    }
-    return event;
-}
-
-var cordova = {
-    define: define,
-    require: require,
-    version: PLATFORM_VERSION_BUILD_LABEL,
-    platformVersion: PLATFORM_VERSION_BUILD_LABEL,
-    platformId: platform.id,
-
-    /**
-     * Methods to add/remove your own addEventListener hijacking on document + window.
-     */
-    addWindowEventHandler: function (event) {
-        return (windowEventHandlers[event] = channel.create(event));
-    },
-    addStickyDocumentEventHandler: function (event) {
-        return (documentEventHandlers[event] = channel.createSticky(event));
-    },
-    addDocumentEventHandler: function (event) {
-        return (documentEventHandlers[event] = channel.create(event));
-    },
-    removeWindowEventHandler: function (event) {
-        delete windowEventHandlers[event];
-    },
-    removeDocumentEventHandler: function (event) {
-        delete documentEventHandlers[event];
-    },
-
-    /**
-     * Retrieve original event handlers that were replaced by Cordova
-     *
-     * @return object
-     */
-    getOriginalHandlers: function () {
-        return {
-            document: {
-                addEventListener: m_document_addEventListener,
-                removeEventListener: m_document_removeEventListener
-            },
-            window: {
-                addEventListener: m_window_addEventListener,
-                removeEventListener: m_window_removeEventListener
-            }
-        };
-    },
-
-    /**
-     * Method to fire event from native code
-     * bNoDetach is required for events which cause an exception which needs to be caught in native code
-     */
-    fireDocumentEvent: function (type, data, bNoDetach) {
-        var evt = createEvent(type, data);
-        if (typeof documentEventHandlers[type] !== 'undefined') {
-            if (bNoDetach) {
-                documentEventHandlers[type].fire(evt);
-            } else {
-                setTimeout(function () {
-                    // Fire deviceready on listeners that were registered before cordova.js was loaded.
-                    if (type === 'deviceready') {
-                        document.dispatchEvent(evt);
-                    }
-                    documentEventHandlers[type].fire(evt);
-                }, 0);
-            }
-        } else {
-            document.dispatchEvent(evt);
-        }
-    },
-
-    fireWindowEvent: function (type, data) {
-        var evt = createEvent(type, data);
-        if (typeof windowEventHandlers[type] !== 'undefined') {
-            setTimeout(function () {
-                windowEventHandlers[type].fire(evt);
-            }, 0);
-        } else {
-            window.dispatchEvent(evt);
-        }
-    },
-
-    /**
-     * Plugin callback mechanism.
-     */
-    // Randomize the starting callbackId to avoid collisions after refreshing or navigating.
-    // This way, it's very unlikely that any new callback would get the same callbackId as an old callback.
-    callbackId: Math.floor(Math.random() * 2000000000),
-    callbacks: {},
-    callbackStatus: {
-        NO_RESULT: 0,
-        OK: 1,
-        CLASS_NOT_FOUND_EXCEPTION: 2,
-        ILLEGAL_ACCESS_EXCEPTION: 3,
-        INSTANTIATION_EXCEPTION: 4,
-        MALFORMED_URL_EXCEPTION: 5,
-        IO_EXCEPTION: 6,
-        INVALID_ACTION: 7,
-        JSON_EXCEPTION: 8,
-        ERROR: 9
-    },
-
-    /**
-     * Called by native code when returning successful result from an action.
-     */
-    callbackSuccess: function (callbackId, args) {
-        cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);
-    },
-
-    /**
-     * Called by native code when returning error result from an action.
-     */
-    callbackError: function (callbackId, args) {
-        // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
-        // Derive success from status.
-        cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);
-    },
-
-    /**
-     * Called by native code when returning the result from an action.
-     */
-    callbackFromNative: function (callbackId, isSuccess, status, args, keepCallback) {
-        try {
-            var callback = cordova.callbacks[callbackId];
-            if (callback) {
-                if (isSuccess && status === cordova.callbackStatus.OK) {
-                    callback.success && callback.success.apply(null, args);
-                } else if (!isSuccess) {
-                    callback.fail && callback.fail.apply(null, args);
-                }
-                /*
-                else
-                    Note, this case is intentionally not caught.
-                    this can happen if isSuccess is true, but callbackStatus is NO_RESULT
-                    which is used to remove a callback from the list without calling the callbacks
-                    typically keepCallback is false in this case
-                */
-                // Clear callback if not expecting any more results
-                if (!keepCallback) {
-                    delete cordova.callbacks[callbackId];
-                }
-            }
-        } catch (err) {
-            var msg = 'Error in ' + (isSuccess ? 'Success' : 'Error') + ' callbackId: ' + callbackId + ' : ' + err;
-            cordova.fireWindowEvent('cordovacallbackerror', { message: msg, error: err });
-            throw err;
-        }
-    },
-
-    addConstructor: function (func) {
-        channel.onCordovaReady.subscribe(function () {
-            try {
-                func();
-            } catch (e) {
-                console.log('Failed to run constructor: ' + e);
-            }
-        });
-    }
-};
-
-module.exports = cordova;
-
-});
-
-// file: ../cordova-android/cordova-js-src/android/nativeapiprovider.js
-define("cordova/android/nativeapiprovider", function(require, exports, module) {
-
-/**
- * Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi.
- */
-
-var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi');
-var currentApi = nativeApi;
-
-module.exports = {
-    get: function () { return currentApi; },
-    setPreferPrompt: function (value) {
-        currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi;
-    },
-    // Used only by tests.
-    set: function (value) {
-        currentApi = value;
-    }
-};
-
-});
-
-// file: ../cordova-android/cordova-js-src/android/promptbasednativeapi.js
-define("cordova/android/promptbasednativeapi", function(require, exports, module) {
-
-/**
- * Implements the API of ExposedJsApi.java, but uses prompt() to communicate.
- * This is used pre-JellyBean, where addJavascriptInterface() is disabled.
- */
-
-module.exports = {
-    exec: function (bridgeSecret, service, action, callbackId, argsJson) {
-        return prompt(argsJson, 'gap:' + JSON.stringify([bridgeSecret, service, action, callbackId]));
-    },
-    setNativeToJsBridgeMode: function (bridgeSecret, value) {
-        prompt(value, 'gap_bridge_mode:' + bridgeSecret);
-    },
-    retrieveJsMessages: function (bridgeSecret, fromOnlineEvent) {
-        return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret);
-    }
-};
-
-});
-
-// file: src/common/argscheck.js
-define("cordova/argscheck", function(require, exports, module) {
-
-var utils = require('cordova/utils');
-
-var moduleExports = module.exports;
-
-var typeMap = {
-    A: 'Array',
-    D: 'Date',
-    N: 'Number',
-    S: 'String',
-    F: 'Function',
-    O: 'Object'
-};
-
-function extractParamName (callee, argIndex) {
-    return (/\(\s*([^)]*?)\s*\)/).exec(callee)[1].split(/\s*,\s*/)[argIndex];
-}
-
-/**
- * Checks the given arguments' types and throws if they are not as expected.
- *
- * `spec` is a string where each character stands for the required type of the
- * argument at the same position. In other words: the character at `spec[i]`
- * specifies the required type for `args[i]`. The characters in `spec` are the
- * first letter of the required type's name. The supported types are:
- *
- *     Array, Date, Number, String, Function, Object
- *
- * Lowercase characters specify arguments that must not be `null` or `undefined`
- * while uppercase characters allow those values to be passed.
- *
- * Finally, `*` can be used to allow any type at the corresponding position.
- *
- * @example
- * function foo (arr, opts) {
- *     // require `arr` to be an Array and `opts` an Object, null or undefined
- *     checkArgs('aO', 'my.package.foo', arguments);
- *     // ...
- * }
- * @param {String} spec - the type specification for `args` as described above
- * @param {String} functionName - full name of the callee.
- * Used in the error message
- * @param {Array|arguments} args - the arguments to be checked against `spec`
- * @param {Function} [opt_callee=args.callee] - the recipient of `args`.
- * Used to extract parameter names for the error message
- * @throws {TypeError} if args do not satisfy spec
- */
-function checkArgs (spec, functionName, args, opt_callee) {
-    if (!moduleExports.enableChecks) {
-        return;
-    }
-    var errMsg = null;
-    var typeName;
-    for (var i = 0; i < spec.length; ++i) {
-        var c = spec.charAt(i);
-        var cUpper = c.toUpperCase();
-        var arg = args[i];
-        // Asterix means allow anything.
-        if (c === '*') {
-            continue;
-        }
-        typeName = utils.typeName(arg);
-        if ((arg === null || arg === undefined) && c === cUpper) {
-            continue;
-        }
-        if (typeName !== typeMap[cUpper]) {
-            errMsg = 'Expected ' + typeMap[cUpper];
-            break;
-        }
-    }
-    if (errMsg) {
-        errMsg += ', but got ' + typeName + '.';
-        errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
-        // Don't log when running unit tests.
-        if (typeof jasmine === 'undefined') {
-            console.error(errMsg);
-        }
-        throw TypeError(errMsg);
-    }
-}
-
-function getValue (value, defaultValue) {
-    return value === undefined ? defaultValue : value;
-}
-
-moduleExports.checkArgs = checkArgs;
-moduleExports.getValue = getValue;
-moduleExports.enableChecks = true;
-
-});
-
-// file: src/common/base64.js
-define("cordova/base64", function(require, exports, module) {
-
-var base64 = exports;
-
-base64.fromArrayBuffer = function (arrayBuffer) {
-    var array = new Uint8Array(arrayBuffer);
-    return uint8ToBase64(array);
-};
-
-base64.toArrayBuffer = function (str) {
-    var decodedStr = atob(str);
-    var arrayBuffer = new ArrayBuffer(decodedStr.length);
-    var array = new Uint8Array(arrayBuffer);
-    for (var i = 0, len = decodedStr.length; i < len; i++) {
-        array[i] = decodedStr.charCodeAt(i);
-    }
-    return arrayBuffer;
-};
-
-// ------------------------------------------------------------------------------
-
-/* This code is based on the performance tests at http://jsperf.com/b64tests
- * This 12-bit-at-a-time algorithm was the best performing version on all
- * platforms tested.
- */
-
-var b64_6bit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-var b64_12bit;
-
-var b64_12bitTable = function () {
-    b64_12bit = [];
-    for (var i = 0; i < 64; i++) {
-        for (var j = 0; j < 64; j++) {
-            b64_12bit[i * 64 + j] = b64_6bit[i] + b64_6bit[j];
-        }
-    }
-    b64_12bitTable = function () { return b64_12bit; };
-    return b64_12bit;
-};
-
-function uint8ToBase64 (rawData) {
-    var numBytes = rawData.byteLength;
-    var output = '';
-    var segment;
-    var table = b64_12bitTable();
-    for (var i = 0; i < numBytes - 2; i += 3) {
-        segment = (rawData[i] << 16) + (rawData[i + 1] << 8) + rawData[i + 2];
-        output += table[segment >> 12];
-        output += table[segment & 0xfff];
-    }
-    if (numBytes - i === 2) {
-        segment = (rawData[i] << 16) + (rawData[i + 1] << 8);
-        output += table[segment >> 12];
-        output += b64_6bit[(segment & 0xfff) >> 6];
-        output += '=';
-    } else if (numBytes - i === 1) {
-        segment = (rawData[i] << 16);
-        output += table[segment >> 12];
-        output += '==';
-    }
-    return output;
-}
-
-});
-
-// file: src/common/builder.js
-define("cordova/builder", function(require, exports, module) {
-
-var utils = require('cordova/utils');
-
-function each (objects, func, context) {
-    for (var prop in objects) {
-        if (Object.prototype.hasOwnProperty.call(objects, prop)) {
-            func.apply(context, [objects[prop], prop]);
-        }
-    }
-}
-
-function clobber (obj, key, value) {
-    var needsProperty = false;
-    try {
-        obj[key] = value;
-    } catch (e) {
-        needsProperty = true;
-    }
-    // Getters can only be overridden by getters.
-    if (needsProperty || obj[key] !== value) {
-        utils.defineGetter(obj, key, function () {
-            return value;
-        });
-    }
-}
-
-function assignOrWrapInDeprecateGetter (obj, key, value, message) {
-    if (message) {
-        utils.defineGetter(obj, key, function () {
-            console.log(message);
-            delete obj[key];
-            clobber(obj, key, value);
-            return value;
-        });
-    } else {
-        clobber(obj, key, value);
-    }
-}
-
-function include (parent, objects, clobber, merge) {
-    each(objects, function (obj, key) {
-        try {
-            var result = obj.path ? require(obj.path) : {};
-
-            if (clobber) {
-                // Clobber if it doesn't exist.
-                if (typeof parent[key] === 'undefined') {
-                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
-                } else if (typeof obj.path !== 'undefined') {
-                    // If merging, merge properties onto parent, otherwise, clobber.
-                    if (merge) {
-                        recursiveMerge(parent[key], result);
-                    } else {
-                        assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
-                    }
-                }
-                result = parent[key];
-            } else {
-                // Overwrite if not currently defined.
-                if (typeof parent[key] === 'undefined') {
-                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
-                } else {
-                    // Set result to what already exists, so we can build children into it if they exist.
-                    result = parent[key];
-                }
-            }
-
-            if (obj.children) {
-                include(result, obj.children, clobber, merge);
-            }
-        } catch (e) {
-            utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"');
-        }
-    });
-}
-
-/**
- * Merge properties from one object onto another recursively.  Properties from
- * the src object will overwrite existing target property.
- *
- * @param target Object to merge properties into.
- * @param src Object to merge properties from.
- */
-function recursiveMerge (target, src) {
-    for (var prop in src) {
-        if (Object.prototype.hasOwnProperty.call(src, prop)) {
-            if (target.prototype && target.prototype.constructor === target) {
-                // If the target object is a constructor override off prototype.
-                clobber(target.prototype, prop, src[prop]);
-            } else {
-                if (typeof src[prop] === 'object' && typeof target[prop] === 'object') {
-                    recursiveMerge(target[prop], src[prop]);
-                } else {
-                    clobber(target, prop, src[prop]);
-                }
-            }
-        }
-    }
-}
-
-exports.buildIntoButDoNotClobber = function (objects, target) {
-    include(target, objects, false, false);
-};
-exports.buildIntoAndClobber = function (objects, target) {
-    include(target, objects, true, false);
-};
-exports.buildIntoAndMerge = function (objects, target) {
-    include(target, objects, true, true);
-};
-exports.recursiveMerge = recursiveMerge;
-exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter;
-
-});
-
-// file: src/common/channel.js
-define("cordova/channel", function(require, exports, module) {
-
-var utils = require('cordova/utils');
-var nextGuid = 1;
-
-/**
- * Custom pub-sub "channel" that can have functions subscribed to it
- * This object is used to define and control firing of events for
- * cordova initialization, as well as for custom events thereafter.
- *
- * The order of events during page load and Cordova startup is as follows:
- *
- * onDOMContentLoaded*         Internal event that is received when the web page is loaded and parsed.
- * onNativeReady*              Internal event that indicates the Cordova native side is ready.
- * onCordovaReady*             Internal event fired when all Cordova JavaScript objects have been created.
- * onDeviceReady*              User event fired to indicate that Cordova is ready
- * onResume                    User event fired to indicate a start/resume lifecycle event
- * onPause                     User event fired to indicate a pause lifecycle event
- *
- * The events marked with an * are sticky. Once they have fired, they will stay in the fired state.
- * All listeners that subscribe after the event is fired will be executed right away.
- *
- * The only Cordova events that user code should register for are:
- *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
- *      pause                 App has moved to background
- *      resume                App has returned to foreground
- *
- * Listeners can be registered as:
- *      document.addEventListener("deviceready", myDeviceReadyListener, false);
- *      document.addEventListener("resume", myResumeListener, false);
- *      document.addEventListener("pause", myPauseListener, false);
- *
- * The DOM lifecycle events should be used for saving and restoring state
- *      window.onload
- *      window.onunload
- *
- */
-
-/**
- * Channel
- * @constructor
- * @param type  String the channel name
- */
-var Channel = function (type, sticky) {
-    this.type = type;
-    // Map of guid -> function.
-    this.handlers = {};
-    // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.
-    this.state = sticky ? 1 : 0;
-    // Used in sticky mode to remember args passed to fire().
-    this.fireArgs = null;
-    // Used by onHasSubscribersChange to know if there are any listeners.
-    this.numHandlers = 0;
-    // Function that is called when the first listener is subscribed, or when
-    // the last listener is unsubscribed.
-    this.onHasSubscribersChange = null;
-};
-var channel = {
-    /**
-     * Calls the provided function only after all of the channels specified
-     * have been fired. All channels must be sticky channels.
-     */
-    join: function (h, c) {
-        var len = c.length;
-        var i = len;
-        var f = function () {
-            if (!(--i)) h();
-        };
-        for (var j = 0; j < len; j++) {
-            if (c[j].state === 0) {
-                throw Error('Can only use join with sticky channels.');
-            }
-            c[j].subscribe(f);
-        }
-        if (!len) h();
-    },
-
-    create: function (type) {
-        return (channel[type] = new Channel(type, false));
-    },
-    createSticky: function (type) {
-        return (channel[type] = new Channel(type, true));
-    },
-
-    /**
-     * cordova Channels that must fire before "deviceready" is fired.
-     */
-    deviceReadyChannelsArray: [],
-    deviceReadyChannelsMap: {},
-
-    /**
-     * Indicate that a feature needs to be initialized before it is ready to be used.
-     * This holds up Cordova's "deviceready" event until the feature has been initialized
-     * and Cordova.initComplete(feature) is called.
-     *
-     * @param feature {String}     The unique feature name
-     */
-    waitForInitialization: function (feature) {
-        if (feature) {
-            var c = channel[feature] || this.createSticky(feature);
-            this.deviceReadyChannelsMap[feature] = c;
-            this.deviceReadyChannelsArray.push(c);
-        }
-    },
-
-    /**
-     * Indicate that initialization code has completed and the feature is ready to be used.
-     *
-     * @param feature {String}     The unique feature name
-     */
-    initializationComplete: function (feature) {
-        var c = this.deviceReadyChannelsMap[feature];
-        if (c) {
-            c.fire();
-        }
-    }
-};
-
-function checkSubscriptionArgument (argument) {
-    if (typeof argument !== 'function' && typeof argument.handleEvent !== 'function') {
-        throw new Error(
-            'Must provide a function or an EventListener object ' +
-                'implementing the handleEvent interface.'
-        );
-    }
-}
-
-/**
- * Subscribes the given function to the channel. Any time that
- * Channel.fire is called so too will the function.
- * Optionally specify an execution context for the function
- * and a guid that can be used to stop subscribing to the channel.
- * Returns the guid.
- */
-Channel.prototype.subscribe = function (eventListenerOrFunction, eventListener) {
-    checkSubscriptionArgument(eventListenerOrFunction);
-    var handleEvent, guid;
-
-    if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') {
-        // Received an EventListener object implementing the handleEvent interface
-        handleEvent = eventListenerOrFunction.handleEvent;
-        eventListener = eventListenerOrFunction;
-    } else {
-        // Received a function to handle event
-        handleEvent = eventListenerOrFunction;
-    }
-
-    if (this.state === 2) {
-        handleEvent.apply(eventListener || this, this.fireArgs);
-        return;
-    }
-
-    guid = eventListenerOrFunction.observer_guid;
-    if (typeof eventListener === 'object') {
-        handleEvent = utils.close(eventListener, handleEvent);
-    }
-
-    if (!guid) {
-        // First time any channel has seen this subscriber
-        guid = '' + nextGuid++;
-    }
-    handleEvent.observer_guid = guid;
-    eventListenerOrFunction.observer_guid = guid;
-
-    // Don't add the same handler more than once.
-    if (!this.handlers[guid]) {
-        this.handlers[guid] = handleEvent;
-        this.numHandlers++;
-        if (this.numHandlers === 1) {
-            this.onHasSubscribersChange && this.onHasSubscribersChange();
-        }
-    }
-};
-
-/**
- * Unsubscribes the function with the given guid from the channel.
- */
-Channel.prototype.unsubscribe = function (eventListenerOrFunction) {
-    checkSubscriptionArgument(eventListenerOrFunction);
-    var handleEvent, guid, handler;
-
-    if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') {
-        // Received an EventListener object implementing the handleEvent interface
-        handleEvent = eventListenerOrFunction.handleEvent;
-    } else {
-        // Received a function to handle event
-        handleEvent = eventListenerOrFunction;
-    }
-
-    guid = handleEvent.observer_guid;
-    handler = this.handlers[guid];
-    if (handler) {
-        delete this.handlers[guid];
-        this.numHandlers--;
-        if (this.numHandlers === 0) {
-            this.onHasSubscribersChange && this.onHasSubscribersChange();
-        }
-    }
-};
-
-/**
- * Calls all functions subscribed to this channel.
- */
-Channel.prototype.fire = function (e) {
-    var fireArgs = Array.prototype.slice.call(arguments);
-    // Apply stickiness.
-    if (this.state === 1) {
-        this.state = 2;
-        this.fireArgs = fireArgs;
-    }
-    if (this.numHandlers) {
-        // Copy the values first so that it is safe to modify it from within
-        // callbacks.
-        var toCall = [];
-        for (var item in this.handlers) {
-            toCall.push(this.handlers[item]);
-        }
-        for (var i = 0; i < toCall.length; ++i) {
-            toCall[i].apply(this, fireArgs);
-        }
-        if (this.state === 2 && this.numHandlers) {
-            this.numHandlers = 0;
-            this.handlers = {};
-            this.onHasSubscribersChange && this.onHasSubscribersChange();
-        }
-    }
-};
-
-// defining them here so they are ready super fast!
-// DOM event that is received when the web page is loaded and parsed.
-channel.createSticky('onDOMContentLoaded');
-
-// Event to indicate the Cordova native side is ready.
-channel.createSticky('onNativeReady');
-
-// Event to indicate that all Cordova JavaScript objects have been created
-// and it's time to run plugin constructors.
-channel.createSticky('onCordovaReady');
-
-// Event to indicate that all automatically loaded JS plugins are loaded and ready.
-// FIXME remove this
-channel.createSticky('onPluginsReady');
-
-// Event to indicate that Cordova is ready
-channel.createSticky('onDeviceReady');
-
-// Event to indicate a resume lifecycle event
-channel.create('onResume');
-
-// Event to indicate a pause lifecycle event
-channel.create('onPause');
-
-// Channels that must fire before "deviceready" is fired.
-channel.waitForInitialization('onCordovaReady');
-channel.waitForInitialization('onDOMContentLoaded');
-
-module.exports = channel;
-
-});
-
-// file: ../cordova-android/cordova-js-src/exec.js
-define("cordova/exec", function(require, exports, module) {
-
-/**
- * Execute a cordova command.  It is up to the native side whether this action
- * is synchronous or asynchronous.  The native side can return:
- *      Synchronous: PluginResult object as a JSON string
- *      Asynchronous: Empty string ""
- * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
- * depending upon the result of the action.
- *
- * @param {Function} success    The success callback
- * @param {Function} fail       The fail callback
- * @param {String} service      The name of the service to use
- * @param {String} action       Action to be run in cordova
- * @param {String[]} [args]     Zero or more arguments to pass to the method
- */
-var cordova = require('cordova');
-var nativeApiProvider = require('cordova/android/nativeapiprovider');
-var utils = require('cordova/utils');
-var base64 = require('cordova/base64');
-var channel = require('cordova/channel');
-var jsToNativeModes = {
-    PROMPT: 0,
-    JS_OBJECT: 1
-};
-var nativeToJsModes = {
-    // Polls for messages using the JS->Native bridge.
-    POLLING: 0,
-    // For LOAD_URL to be viable, it would need to have a work-around for
-    // the bug where the soft-keyboard gets dismissed when a message is sent.
-    LOAD_URL: 1,
-    // For the ONLINE_EVENT to be viable, it would need to intercept all event
-    // listeners (both through addEventListener and window.ononline) as well
-    // as set the navigator property itself.
-    ONLINE_EVENT: 2,
-    EVAL_BRIDGE: 3
-};
-var jsToNativeBridgeMode; // Set lazily.
-var nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE;
-var pollEnabled = false;
-var bridgeSecret = -1;
-
-var messagesFromNative = [];
-var isProcessing = false;
-var resolvedPromise = typeof Promise === 'undefined' ? null : Promise.resolve();
-var nextTick = resolvedPromise ? function (fn) { resolvedPromise.then(fn); } : function (fn) { setTimeout(fn); };
-
-function androidExec (success, fail, service, action, args) {
-    if (bridgeSecret < 0) {
-        // If we ever catch this firing, we'll need to queue up exec()s
-        // and fire them once we get a secret. For now, I don't think
-        // it's possible for exec() to be called since plugins are parsed but
-        // not run until until after onNativeReady.
-        throw new Error('exec() called without bridgeSecret');
-    }
-    // Set default bridge modes if they have not already been set.
-    // By default, we use the failsafe, since addJavascriptInterface breaks too often
-    if (jsToNativeBridgeMode === undefined) {
-        androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
-    }
-
-    // If args is not provided, default to an empty array
-    args = args || [];
-
-    // Process any ArrayBuffers in the args into a string.
-    for (var i = 0; i < args.length; i++) {
-        if (utils.typeName(args[i]) === 'ArrayBuffer') {
-            args[i] = base64.fromArrayBuffer(args[i]);
-        }
-    }
-
-    var callbackId = service + cordova.callbackId++;
-    var argsJson = JSON.stringify(args);
-    if (success || fail) {
-        cordova.callbacks[callbackId] = { success: success, fail: fail };
-    }
-
-    var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);
-    // If argsJson was received by Java as null, try again with the PROMPT bridge mode.
-    // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2.  See CB-2666.
-    if (jsToNativeBridgeMode === jsToNativeModes.JS_OBJECT && msgs === '@Null arguments.') {
-        androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT);
-        androidExec(success, fail, service, action, args);
-        androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
-    } else if (msgs) {
-        messagesFromNative.push(msgs);
-        // Always process async to avoid exceptions messing up stack.
-        nextTick(processMessages);
-    }
-}
-
-androidExec.init = function () {
-    bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode);
-    channel.onNativeReady.fire();
-};
-
-function pollOnceFromOnlineEvent () {
-    pollOnce(true);
-}
-
-function pollOnce (opt_fromOnlineEvent) {
-    if (bridgeSecret < 0) {
-        // This can happen when the NativeToJsMessageQueue resets the online state on page transitions.
-        // We know there's nothing to retrieve, so no need to poll.
-        return;
-    }
-    var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent);
-    if (msgs) {
-        messagesFromNative.push(msgs);
-        // Process sync since we know we're already top-of-stack.
-        processMessages();
-    }
-}
-
-function pollingTimerFunc () {
-    if (pollEnabled) {
-        pollOnce();
-        setTimeout(pollingTimerFunc, 50);
-    }
-}
-
-function hookOnlineApis () {
-    function proxyEvent (e) {
-        cordova.fireWindowEvent(e.type);
-    }
-    // The network module takes care of firing online and offline events.
-    // It currently fires them only on document though, so we bridge them
-    // to window here (while first listening for exec()-releated online/offline
-    // events).
-    window.addEventListener('online', pollOnceFromOnlineEvent, false);
-    window.addEventListener('offline', pollOnceFromOnlineEvent, false);
-    cordova.addWindowEventHandler('online');
-    cordova.addWindowEventHandler('offline');
-    document.addEventListener('online', proxyEvent, false);
-    document.addEventListener('offline', proxyEvent, false);
-}
-
-hookOnlineApis();
-
-androidExec.jsToNativeModes = jsToNativeModes;
-androidExec.nativeToJsModes = nativeToJsModes;
-
-androidExec.setJsToNativeBridgeMode = function (mode) {
-    if (mode === jsToNativeModes.JS_OBJECT && !window._cordovaNative) {
-        mode = jsToNativeModes.PROMPT;
-    }
-    nativeApiProvider.setPreferPrompt(mode === jsToNativeModes.PROMPT);
-    jsToNativeBridgeMode = mode;
-};
-
-androidExec.setNativeToJsBridgeMode = function (mode) {
-    if (mode === nativeToJsBridgeMode) {
-        return;
-    }
-    if (nativeToJsBridgeMode === nativeToJsModes.POLLING) {
-        pollEnabled = false;
-    }
-
-    nativeToJsBridgeMode = mode;
-    // Tell the native side to switch modes.
-    // Otherwise, it will be set by androidExec.init()
-    if (bridgeSecret >= 0) {
-        nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode);
-    }
-
-    if (mode === nativeToJsModes.POLLING) {
-        pollEnabled = true;
-        setTimeout(pollingTimerFunc, 1);
-    }
-};
-
-function buildPayload (payload, message) {
-    var payloadKind = message.charAt(0);
-    if (payloadKind === 's') {
-        payload.push(message.slice(1));
-    } else if (payloadKind === 't') {
-        payload.push(true);
-    } else if (payloadKind === 'f') {
-        payload.push(false);
-    } else if (payloadKind === 'N') {
-        payload.push(null);
-    } else if (payloadKind === 'n') {
-        payload.push(+message.slice(1));
-    } else if (payloadKind === 'A') {
-        var data = message.slice(1);
-        payload.push(base64.toArrayBuffer(data));
-    } else if (payloadKind === 'S') {
-        payload.push(window.atob(message.slice(1)));
-    } else if (payloadKind === 'M') {
-        var multipartMessages = message.slice(1);
-        while (multipartMessages !== '') {
-            var spaceIdx = multipartMessages.indexOf(' ');
-            var msgLen = +multipartMessages.slice(0, spaceIdx);
-            var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen);
-            multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1);
-            buildPayload(payload, multipartMessage);
-        }
-    } else {
-        payload.push(JSON.parse(message));
-    }
-}
-
-// Processes a single message, as encoded by NativeToJsMessageQueue.java.
-function processMessage (message) {
-    var firstChar = message.charAt(0);
-    if (firstChar === 'J') {
-        // This is deprecated on the .java side. It doesn't work with CSP enabled.
-        // eslint-disable-next-line no-eval
-        eval(message.slice(1));
-    } else if (firstChar === 'S' || firstChar === 'F') {
-        var success = firstChar === 'S';
-        var keepCallback = message.charAt(1) === '1';
-        var spaceIdx = message.indexOf(' ', 2);
-        var status = +message.slice(2, spaceIdx);
-        var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1);
-        var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx);
-        var payloadMessage = message.slice(nextSpaceIdx + 1);
-        var payload = [];
-        buildPayload(payload, payloadMessage);
-        cordova.callbackFromNative(callbackId, success, status, payload, keepCallback);
-    } else {
-        console.log('processMessage failed: invalid message: ' + JSON.stringify(message));
-    }
-}
-
-function processMessages () {
-    // Check for the reentrant case.
-    if (isProcessing) {
-        return;
-    }
-    if (messagesFromNative.length === 0) {
-        return;
-    }
-    isProcessing = true;
-    try {
-        var msg = popMessageFromQueue();
-        // The Java side can send a * message to indicate that it
-        // still has messages waiting to be retrieved.
-        if (msg === '*' && messagesFromNative.length === 0) {
-            nextTick(pollOnce);
-            return;
-        }
-        processMessage(msg);
-    } finally {
-        isProcessing = false;
-        if (messagesFromNative.length > 0) {
-            nextTick(processMessages);
-        }
-    }
-}
-
-function popMessageFromQueue () {
-    var messageBatch = messagesFromNative.shift();
-    if (messageBatch === '*') {
-        return '*';
-    }
-
-    var spaceIdx = messageBatch.indexOf(' ');
-    var msgLen = +messageBatch.slice(0, spaceIdx);
-    var message = messageBatch.substr(spaceIdx + 1, msgLen);
-    messageBatch = messageBatch.slice(spaceIdx + msgLen + 1);
-    if (messageBatch) {
-        messagesFromNative.unshift(messageBatch);
-    }
-    return message;
-}
-
-module.exports = androidExec;
-
-});
-
-// file: src/common/exec/proxy.js
-define("cordova/exec/proxy", function(require, exports, module) {
-
-// internal map of proxy function
-var CommandProxyMap = {};
-
-module.exports = {
-
-    // example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...);
-    add: function (id, proxyObj) {
-        console.log('adding proxy for ' + id);
-        CommandProxyMap[id] = proxyObj;
-        return proxyObj;
-    },
-
-    // cordova.commandProxy.remove("Accelerometer");
-    remove: function (id) {
-        var proxy = CommandProxyMap[id];
-        delete CommandProxyMap[id];
-        CommandProxyMap[id] = null;
-        return proxy;
-    },
-
-    get: function (service, action) {
-        return (CommandProxyMap[service] ? CommandProxyMap[service][action] : null);
-    }
-};
-
-});
-
-// file: src/common/init.js
-define("cordova/init", function(require, exports, module) {
-
-var channel = require('cordova/channel');
-var cordova = require('cordova');
-var modulemapper = require('cordova/modulemapper');
-var platform = require('cordova/platform');
-var pluginloader = require('cordova/pluginloader');
-
-var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];
-
-function logUnfiredChannels (arr) {
-    for (var i = 0; i < arr.length; ++i) {
-        if (arr[i].state !== 2) {
-            console.log('Channel not fired: ' + arr[i].type);
-        }
-    }
-}
-
-window.setTimeout(function () {
-    if (channel.onDeviceReady.state !== 2) {
-        console.log('deviceready has not fired after 5 seconds.');
-        logUnfiredChannels(platformInitChannelsArray);
-        logUnfiredChannels(channel.deviceReadyChannelsArray);
-    }
-}, 5000);
-
-if (!window.console) {
-    window.console = {
-        log: function () {}
-    };
-}
-if (!window.console.warn) {
-    window.console.warn = function (msg) {
-        this.log('warn: ' + msg);
-    };
-}
-
-// Register pause, resume and deviceready channels as events on document.
-channel.onPause = cordova.addDocumentEventHandler('pause');
-channel.onResume = cordova.addDocumentEventHandler('resume');
-channel.onActivated = cordova.addDocumentEventHandler('activated');
-channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');
-
-// Listen for DOMContentLoaded and notify our channel subscribers.
-if (document.readyState === 'complete' || document.readyState === 'interactive') {
-    channel.onDOMContentLoaded.fire();
-} else {
-    document.addEventListener('DOMContentLoaded', function () {
-        channel.onDOMContentLoaded.fire();
-    }, false);
-}
-
-// _nativeReady is global variable that the native side can set
-// to signify that the native code is ready. It is a global since
-// it may be called before any cordova JS is ready.
-if (window._nativeReady) {
-    channel.onNativeReady.fire();
-}
-
-modulemapper.clobbers('cordova', 'cordova');
-modulemapper.clobbers('cordova/exec', 'cordova.exec');
-modulemapper.clobbers('cordova/exec', 'Cordova.exec');
-
-// Call the platform-specific initialization.
-platform.bootstrap && platform.bootstrap();
-
-// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
-// The delay allows the attached modules to be defined before the plugin loader looks for them.
-setTimeout(function () {
-    pluginloader.load(function () {
-        channel.onPluginsReady.fire();
-    });
-}, 0);
-
-/**
- * Create all cordova objects once native side is ready.
- */
-channel.join(function () {
-    modulemapper.mapModules(window);
-
-    platform.initialize && platform.initialize();
-
-    // Fire event to notify that all objects are created
-    channel.onCordovaReady.fire();
-
-    // Fire onDeviceReady event once page has fully loaded, all
-    // constructors have run and cordova info has been received from native
-    // side.
-    channel.join(function () {
-        require('cordova').fireDocumentEvent('deviceready');
-    }, channel.deviceReadyChannelsArray);
-}, platformInitChannelsArray);
-
-});
-
-// file: src/common/modulemapper.js
-define("cordova/modulemapper", function(require, exports, module) {
-
-var builder = require('cordova/builder');
-var moduleMap = define.moduleMap;
-var symbolList;
-var deprecationMap;
-
-exports.reset = function () {
-    symbolList = [];
-    deprecationMap = {};
-};
-
-function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) {
-    if (!(moduleName in moduleMap)) {
-        throw new Error('Module ' + moduleName + ' does not exist.');
-    }
-    symbolList.push(strategy, moduleName, symbolPath);
-    if (opt_deprecationMessage) {
-        deprecationMap[symbolPath] = opt_deprecationMessage;
-    }
-}
-
-// Note: Android 2.3 does have Function.bind().
-exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) {
-    addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
-};
-
-exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) {
-    addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
-};
-
-exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) {
-    addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
-};
-
-exports.runs = function (moduleName) {
-    addEntry('r', moduleName, null);
-};
-
-function prepareNamespace (symbolPath, context) {
-    if (!symbolPath) {
-        return context;
-    }
-    return symbolPath.split('.').reduce(function (cur, part) {
-        return (cur[part] = cur[part] || {});
-    }, context);
-}
-
-exports.mapModules = function (context) {
-    var origSymbols = {};
-    context.CDV_origSymbols = origSymbols;
-    for (var i = 0, len = symbolList.length; i < len; i += 3) {
-        var strategy = symbolList[i];
-        var moduleName = symbolList[i + 1];
-        var module = require(moduleName);
-        // <runs/>
-        if (strategy === 'r') {
-            continue;
-        }
-        var symbolPath = symbolList[i + 2];
-        var lastDot = symbolPath.lastIndexOf('.');
-        var namespace = symbolPath.substr(0, lastDot);
-        var lastName = symbolPath.substr(lastDot + 1);
-
-        var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
-        var parentObj = prepareNamespace(namespace, context);
-        var target = parentObj[lastName];
-
-        if (strategy === 'm' && target) {
-            builder.recursiveMerge(target, module);
-        } else if ((strategy === 'd' && !target) || (strategy !== 'd')) {
-            if (!(symbolPath in origSymbols)) {
-                origSymbols[symbolPath] = target;
-            }
-            builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
-        }
-    }
-};
-
-exports.getOriginalSymbol = function (context, symbolPath) {
-    var origSymbols = context.CDV_origSymbols;
-    if (origSymbols && (symbolPath in origSymbols)) {
-        return origSymbols[symbolPath];
-    }
-    var parts = symbolPath.split('.');
-    var obj = context;
-    for (var i = 0; i < parts.length; ++i) {
-        obj = obj && obj[parts[i]];
-    }
-    return obj;
-};
-
-exports.reset();
-
-});
-
-// file: ../cordova-android/cordova-js-src/platform.js
-define("cordova/platform", function(require, exports, module) {
-
-// The last resume event that was received that had the result of a plugin call.
-var lastResumeEvent = null;
-
-module.exports = {
-    id: 'android',
-    bootstrap: function () {
-        var channel = require('cordova/channel');
-        var cordova = require('cordova');
-        var exec = require('cordova/exec');
-        var modulemapper = require('cordova/modulemapper');
-
-        // Get the shared secret needed to use the bridge.
-        exec.init();
-
-        // TODO: Extract this as a proper plugin.
-        modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app');
-
-        var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App';
-
-        // Inject a listener for the backbutton on the document.
-        var backButtonChannel = cordova.addDocumentEventHandler('backbutton');
-        backButtonChannel.onHasSubscribersChange = function () {
-            // If we just attached the first handler or detached the last handler,
-            // let native know we need to override the back button.
-            exec(null, null, APP_PLUGIN_NAME, 'overrideBackbutton', [this.numHandlers === 1]);
-        };
-
-        // Add hardware MENU and SEARCH button handlers
-        cordova.addDocumentEventHandler('menubutton');
-        cordova.addDocumentEventHandler('searchbutton');
-
-        function bindButtonChannel (buttonName) {
-            // generic button bind used for volumeup/volumedown buttons
-            var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button');
-            volumeButtonChannel.onHasSubscribersChange = function () {
-                exec(null, null, APP_PLUGIN_NAME, 'overrideButton', [buttonName, this.numHandlers === 1]);
-            };
-        }
-        // Inject a listener for the volume buttons on the document.
-        bindButtonChannel('volumeup');
-        bindButtonChannel('volumedown');
-
-        // The resume event is not "sticky", but it is possible that the event
-        // will contain the result of a plugin call. We need to ensure that the
-        // plugin result is delivered even after the event is fired (CB-10498)
-        var cordovaAddEventListener = document.addEventListener;
-
-        document.addEventListener = function (evt, handler, capture) {
-            cordovaAddEventListener(evt, handler, capture);
-
-            if (evt === 'resume' && lastResumeEvent) {
-                handler(lastResumeEvent);
-            }
-        };
-
-        // Let native code know we are all done on the JS side.
-        // Native code will then un-hide the WebView.
-        channel.onCordovaReady.subscribe(function () {
-            exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []);
-            exec(null, null, APP_PLUGIN_NAME, 'show', []);
-        });
-    }
-};
-
-function onMessageFromNative (msg) {
-    var cordova = require('cordova');
-    var action = msg.action;
-
-    switch (action) {
-    // pause and resume are Android app life cycle events
-    case 'backbutton':
-    case 'menubutton':
-    case 'searchbutton':
-    case 'pause':
-    case 'volumedownbutton':
-    case 'volumeupbutton':
-        cordova.fireDocumentEvent(action);
-        break;
-    case 'resume':
-        if (arguments.length > 1 && msg.pendingResult) {
-            if (arguments.length === 2) {
-                msg.pendingResult.result = arguments[1];
-            } else {
-                // The plugin returned a multipart message
-                var res = [];
-                for (var i = 1; i < arguments.length; i++) {
-                    res.push(arguments[i]);
-                }
-                msg.pendingResult.result = res;
-            }
-
-            // Save the plugin result so that it can be delivered to the js
-            // even if they miss the initial firing of the event
-            lastResumeEvent = msg;
-        }
-        cordova.fireDocumentEvent(action, msg);
-        break;
-    default:
-        throw new Error('Unknown event action ' + action);
-    }
-}
-
-});
-
-// file: ../cordova-android/cordova-js-src/plugin/android/app.js
-define("cordova/plugin/android/app", function(require, exports, module) {
-
-var exec = require('cordova/exec');
-var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App';
-
-module.exports = {
-    /**
-    * Clear the resource cache.
-    */
-    clearCache: function () {
-        exec(null, null, APP_PLUGIN_NAME, 'clearCache', []);
-    },
-
-    /**
-    * Load the url into the webview or into new browser instance.
-    *
-    * @param url           The URL to load
-    * @param props         Properties that can be passed in to the activity:
-    *      wait: int                           => wait msec before loading URL
-    *      loadingDialog: "Title,Message"      => display a native loading dialog
-    *      loadUrlTimeoutValue: int            => time in msec to wait before triggering a timeout error
-    *      clearHistory: boolean              => clear webview history (default=false)
-    *      openExternal: boolean              => open in a new browser (default=false)
-    *
-    * Example:
-    *      navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000});
-    */
-    loadUrl: function (url, props) {
-        exec(null, null, APP_PLUGIN_NAME, 'loadUrl', [url, props]);
-    },
-
-    /**
-    * Cancel loadUrl that is waiting to be loaded.
-    */
-    cancelLoadUrl: function () {
-        exec(null, null, APP_PLUGIN_NAME, 'cancelLoadUrl', []);
-    },
-
-    /**
-    * Clear web history in this web view.
-    * Instead of BACK button loading the previous web page, it will exit the app.
-    */
-    clearHistory: function () {
-        exec(null, null, APP_PLUGIN_NAME, 'clearHistory', []);
-    },
-
-    /**
-    * Go to previous page displayed.
-    * This is the same as pressing the backbutton on Android device.
-    */
-    backHistory: function () {
-        exec(null, null, APP_PLUGIN_NAME, 'backHistory', []);
-    },
-
-    /**
-    * Override the default behavior of the Android back button.
-    * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired.
-    *
-    * Note: The user should not have to call this method.  Instead, when the user
-    *       registers for the "backbutton" event, this is automatically done.
-    *
-    * @param override        T=override, F=cancel override
-    */
-    overrideBackbutton: function (override) {
-        exec(null, null, APP_PLUGIN_NAME, 'overrideBackbutton', [override]);
-    },
-
-    /**
-    * Override the default behavior of the Android volume button.
-    * If overridden, when the volume button is pressed, the "volume[up|down]button"
-    * JavaScript event will be fired.
-    *
-    * Note: The user should not have to call this method.  Instead, when the user
-    *       registers for the "volume[up|down]button" event, this is automatically done.
-    *
-    * @param button          volumeup, volumedown
-    * @param override        T=override, F=cancel override
-    */
-    overrideButton: function (button, override) {
-        exec(null, null, APP_PLUGIN_NAME, 'overrideButton', [button, override]);
-    },
-
-    /**
-    * Exit and terminate the application.
-    */
-    exitApp: function () {
-        return exec(null, null, APP_PLUGIN_NAME, 'exitApp', []);
-    }
-};
-
-});
-
-// file: src/common/pluginloader.js
-define("cordova/pluginloader", function(require, exports, module) {
-
-var modulemapper = require('cordova/modulemapper');
-
-// Helper function to inject a <script> tag.
-// Exported for testing.
-exports.injectScript = function (url, onload, onerror) {
-    var script = document.createElement('script');
-    // onload fires even when script fails loads with an error.
-    script.onload = onload;
-    // onerror fires for malformed URLs.
-    script.onerror = onerror;
-    script.src = url;
-    document.head.appendChild(script);
-};
-
-function injectIfNecessary (id, url, onload, onerror) {
-    onerror = onerror || onload;
-    if (id in define.moduleMap) {
-        onload();
-    } else {
-        exports.injectScript(url, function () {
-            if (id in define.moduleMap) {
-                onload();
-            } else {
-                onerror();
-            }
-        }, onerror);
-    }
-}
-
-function onScriptLoadingComplete (moduleList, finishPluginLoading) {
-    // Loop through all the plugins and then through their clobbers and merges.
-    for (var i = 0, module; (module = moduleList[i]); i++) {
-        if (module.clobbers && module.clobbers.length) {
-            for (var j = 0; j < module.clobbers.length; j++) {
-                modulemapper.clobbers(module.id, module.clobbers[j]);
-            }
-        }
-
-        if (module.merges && module.merges.length) {
-            for (var k = 0; k < module.merges.length; k++) {
-                modulemapper.merges(module.id, module.merges[k]);
-            }
-        }
-
-        // Finally, if runs is truthy we want to simply require() the module.
-        if (module.runs) {
-            modulemapper.runs(module.id);
-        }
-    }
-
-    finishPluginLoading();
-}
-
-// Handler for the cordova_plugins.js content.
-// See plugman's plugin_loader.js for the details of this object.
-// This function is only called if the really is a plugins array that isn't empty.
-// Otherwise the onerror response handler will just call finishPluginLoading().
-function handlePluginsObject (path, moduleList, finishPluginLoading) {
-    // Now inject the scripts.
-    var scriptCounter = moduleList.length;
-
-    if (!scriptCounter) {
-        finishPluginLoading();
-        return;
-    }
-    function scriptLoadedCallback () {
-        if (!--scriptCounter) {
-            onScriptLoadingComplete(moduleList, finishPluginLoading);
-        }
-    }
-
-    for (var i = 0; i < moduleList.length; i++) {
-        injectIfNecessary(moduleList[i].id, path + moduleList[i].file, scriptLoadedCallback);
-    }
-}
-
-function findCordovaPath () {
-    var path = null;
-    var scripts = document.getElementsByTagName('script');
-    var term = '/cordova.js';
-    for (var n = scripts.length - 1; n > -1; n--) {
-        var src = scripts[n].src.replace(/\?.*$/, ''); // Strip any query param (CB-6007).
-        if (src.indexOf(term) === (src.length - term.length)) {
-            path = src.substring(0, src.length - term.length) + '/';
-            break;
-        }
-    }
-    return path;
-}
-
-// Tries to load all plugins' js-modules.
-// This is an async process, but onDeviceReady is blocked on onPluginsReady.
-// onPluginsReady is fired when there are no plugins to load, or they are all done.
-exports.load = function (callback) {
-    var pathPrefix = findCordovaPath();
-    if (pathPrefix === null) {
-        console.log('Could not find cordova.js script tag. Plugin loading may fail.');
-        pathPrefix = '';
-    }
-    injectIfNecessary('cordova/plugin_list', pathPrefix + 'cordova_plugins.js', function () {
-        var moduleList = require('cordova/plugin_list');
-        handlePluginsObject(pathPrefix, moduleList, callback);
-    }, callback);
-};
-
-});
-
-// file: src/common/urlutil.js
-define("cordova/urlutil", function(require, exports, module) {
-
-/**
- * For already absolute URLs, returns what is passed in.
- * For relative URLs, converts them to absolute ones.
- */
-exports.makeAbsolute = function makeAbsolute (url) {
-    var anchorEl = document.createElement('a');
-    anchorEl.href = url;
-    return anchorEl.href;
-};
-
-});
-
-// file: src/common/utils.js
-define("cordova/utils", function(require, exports, module) {
-
-var utils = exports;
-
-/**
- * Defines a property getter / setter for obj[key].
- */
-utils.defineGetterSetter = function (obj, key, getFunc, opt_setFunc) {
-    if (Object.defineProperty) {
-        var desc = {
-            get: getFunc,
-            configurable: true
-        };
-        if (opt_setFunc) {
-            desc.set = opt_setFunc;
-        }
-        Object.defineProperty(obj, key, desc);
-    } else {
-        obj.__defineGetter__(key, getFunc);
-        if (opt_setFunc) {
-            obj.__defineSetter__(key, opt_setFunc);
-        }
-    }
-};
-
-/**
- * Defines a property getter for obj[key].
- */
-utils.defineGetter = utils.defineGetterSetter;
-
-utils.arrayIndexOf = function (a, item) {
-    if (a.indexOf) {
-        return a.indexOf(item);
-    }
-    var len = a.length;
-    for (var i = 0; i < len; ++i) {
-        if (a[i] === item) {
-            return i;
-        }
-    }
-    return -1;
-};
-
-/**
- * Returns whether the item was found in the array.
- */
-utils.arrayRemove = function (a, item) {
-    var index = utils.arrayIndexOf(a, item);
-    if (index !== -1) {
-        a.splice(index, 1);
-    }
-    return index !== -1;
-};
-
-utils.typeName = function (val) {
-    return Object.prototype.toString.call(val).slice(8, -1);
-};
-
-/**
- * Returns an indication of whether the argument is an array or not
- */
-utils.isArray = Array.isArray ||
-                function (a) { return utils.typeName(a) === 'Array'; };
-
-/**
- * Returns an indication of whether the argument is a Date or not
- */
-utils.isDate = function (d) {
-    return (d instanceof Date);
-};
-
-/**
- * Does a deep clone of the object.
- */
-utils.clone = function (obj) {
-    if (!obj || typeof obj === 'function' || utils.isDate(obj) || typeof obj !== 'object') {
-        return obj;
-    }
-
-    var retVal, i;
-
-    if (utils.isArray(obj)) {
-        retVal = [];
-        for (i = 0; i < obj.length; ++i) {
-            retVal.push(utils.clone(obj[i]));
-        }
-        return retVal;
-    }
-
-    retVal = {};
-    for (i in obj) {
-        // 'unknown' type may be returned in custom protocol activation case on
-        // Windows Phone 8.1 causing "No such interface supported" exception on
-        // cloning (https://issues.apache.org/jira/browse/CB-11522)
-        // eslint-disable-next-line valid-typeof
-        if ((!(i in retVal) || retVal[i] !== obj[i]) && typeof obj[i] !== 'undefined' && typeof obj[i] !== 'unknown') {
-            retVal[i] = utils.clone(obj[i]);
-        }
-    }
-    return retVal;
-};
-
-/**
- * Returns a wrapped version of the function
- */
-utils.close = function (context, func, params) {
-    return function () {
-        var args = params || arguments;
-        return func.apply(context, args);
-    };
-};
-
-// ------------------------------------------------------------------------------
-function UUIDcreatePart (length) {
-    var uuidpart = '';
-    for (var i = 0; i < length; i++) {
-        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
-        if (uuidchar.length === 1) {
-            uuidchar = '0' + uuidchar;
-        }
-        uuidpart += uuidchar;
-    }
-    return uuidpart;
-}
-
-/**
- * Create a UUID
- */
-utils.createUUID = function () {
-    return UUIDcreatePart(4) + '-' +
-        UUIDcreatePart(2) + '-' +
-        UUIDcreatePart(2) + '-' +
-        UUIDcreatePart(2) + '-' +
-        UUIDcreatePart(6);
-};
-
-/**
- * Extends a child object from a parent object using classical inheritance
- * pattern.
- */
-utils.extend = (function () {
-    // proxy used to establish prototype chain
-    var F = function () {};
-    // extend Child from Parent
-    return function (Child, Parent) {
-        F.prototype = Parent.prototype;
-        Child.prototype = new F();
-        Child.__super__ = Parent.prototype;
-        Child.prototype.constructor = Child;
-    };
-}());
-
-/**
- * Alerts a message in any available way: alert or console.log.
- */
-utils.alert = function (msg) {
-    if (window.alert) {
-        window.alert(msg);
-    } else if (console && console.log) {
-        console.log(msg);
-    }
-};
-
-});
-
-window.cordova = require('cordova');
-// file: src/scripts/bootstrap.js
-require('cordova/init');
-
-})();

+ 0 - 251
platforms/android/app/src/main/assets/www/cordova_plugins.js

@@ -1,251 +0,0 @@
-cordova.define('cordova/plugin_list', function(require, exports, module) {
-  module.exports = [
-    {
-      "id": "cordova-plugin-file.DirectoryEntry",
-      "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.DirectoryEntry"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.DirectoryReader",
-      "file": "plugins/cordova-plugin-file/www/DirectoryReader.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.DirectoryReader"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.Entry",
-      "file": "plugins/cordova-plugin-file/www/Entry.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.Entry"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.File",
-      "file": "plugins/cordova-plugin-file/www/File.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.File"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileEntry",
-      "file": "plugins/cordova-plugin-file/www/FileEntry.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileEntry"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileError",
-      "file": "plugins/cordova-plugin-file/www/FileError.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileError"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileReader",
-      "file": "plugins/cordova-plugin-file/www/FileReader.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileReader"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileSystem",
-      "file": "plugins/cordova-plugin-file/www/FileSystem.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileSystem"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileUploadOptions",
-      "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileUploadOptions"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileUploadResult",
-      "file": "plugins/cordova-plugin-file/www/FileUploadResult.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileUploadResult"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.FileWriter",
-      "file": "plugins/cordova-plugin-file/www/FileWriter.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.FileWriter"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.Flags",
-      "file": "plugins/cordova-plugin-file/www/Flags.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.Flags"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.LocalFileSystem",
-      "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.LocalFileSystem"
-      ],
-      "merges": [
-        "window"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.Metadata",
-      "file": "plugins/cordova-plugin-file/www/Metadata.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.Metadata"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.ProgressEvent",
-      "file": "plugins/cordova-plugin-file/www/ProgressEvent.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.ProgressEvent"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.fileSystems",
-      "file": "plugins/cordova-plugin-file/www/fileSystems.js",
-      "pluginId": "cordova-plugin-file"
-    },
-    {
-      "id": "cordova-plugin-file.requestFileSystem",
-      "file": "plugins/cordova-plugin-file/www/requestFileSystem.js",
-      "pluginId": "cordova-plugin-file",
-      "clobbers": [
-        "window.requestFileSystem"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.resolveLocalFileSystemURI",
-      "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js",
-      "pluginId": "cordova-plugin-file",
-      "merges": [
-        "window"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.isChrome",
-      "file": "plugins/cordova-plugin-file/www/browser/isChrome.js",
-      "pluginId": "cordova-plugin-file",
-      "runs": true
-    },
-    {
-      "id": "cordova-plugin-file.androidFileSystem",
-      "file": "plugins/cordova-plugin-file/www/android/FileSystem.js",
-      "pluginId": "cordova-plugin-file",
-      "merges": [
-        "FileSystem"
-      ]
-    },
-    {
-      "id": "cordova-plugin-file.fileSystems-roots",
-      "file": "plugins/cordova-plugin-file/www/fileSystems-roots.js",
-      "pluginId": "cordova-plugin-file",
-      "runs": true
-    },
-    {
-      "id": "cordova-plugin-file.fileSystemPaths",
-      "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js",
-      "pluginId": "cordova-plugin-file",
-      "merges": [
-        "cordova"
-      ],
-      "runs": true
-    },
-    {
-      "id": "cordova-plugin-media-capture.CaptureAudioOptions",
-      "file": "plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "CaptureAudioOptions"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.CaptureImageOptions",
-      "file": "plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "CaptureImageOptions"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.CaptureVideoOptions",
-      "file": "plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "CaptureVideoOptions"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.CaptureError",
-      "file": "plugins/cordova-plugin-media-capture/www/CaptureError.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "CaptureError"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.MediaFileData",
-      "file": "plugins/cordova-plugin-media-capture/www/MediaFileData.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "MediaFileData"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.MediaFile",
-      "file": "plugins/cordova-plugin-media-capture/www/MediaFile.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "MediaFile"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.helpers",
-      "file": "plugins/cordova-plugin-media-capture/www/helpers.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "runs": true
-    },
-    {
-      "id": "cordova-plugin-media-capture.capture",
-      "file": "plugins/cordova-plugin-media-capture/www/capture.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "clobbers": [
-        "navigator.device.capture"
-      ]
-    },
-    {
-      "id": "cordova-plugin-media-capture.init",
-      "file": "plugins/cordova-plugin-media-capture/www/android/init.js",
-      "pluginId": "cordova-plugin-media-capture",
-      "runs": true
-    }
-  ];
-  module.exports.metadata = {
-    "cordova-plugin-file": "6.0.2",
-    "cordova-plugin-media-capture": "3.0.3",
-    "cordova-plugin-webview-x5": "0.3.2",
-    "cordova-plugin-whitelist": "1.3.5"
-  };
-});

BIN
platforms/android/app/src/main/assets/www/favicon.ico


+ 0 - 1
platforms/android/app/src/main/assets/www/index.html

@@ -1 +0,0 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="viewport" content="initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no"><link rel="icon" href="favicon.ico"><title>Caner 车控</title><link href="static/css/app.a7d19b57.css" rel="preload" as="style"><link href="static/js/app.e5c82ec7.js" rel="preload" as="script"><link href="static/js/chunk-vendors.e36198ac.js" rel="preload" as="script"><link href="static/css/app.a7d19b57.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="static/js/chunk-vendors.e36198ac.js"></script><script src="static/js/app.e5c82ec7.js"></script></body></html>

+ 0 - 120
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/DirectoryEntry.js

@@ -1,120 +0,0 @@
-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');
-var utils = require('cordova/utils');
-var exec = require('cordova/exec');
-var Entry = require('./Entry');
-var FileError = require('./FileError');
-var 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;
-
-});

+ 0 - 75
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/DirectoryReader.js

@@ -1,75 +0,0 @@
-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');
-var FileError = require('./FileError');
-
-/**
- * An interface that lists the files and directories in a directory.
- */
-function DirectoryReader (localURL) {
-    this.localURL = localURL || null;
-    this.hasReadEntries = false;
-}
-
-/**
- * Returns a list of entries from a directory.
- *
- * @param {Function} successCallback is called with a list of entries
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryReader.prototype.readEntries = function (successCallback, errorCallback) {
-    // If we've already read and passed on this directory's entries, return an empty list.
-    if (this.hasReadEntries) {
-        successCallback([]);
-        return;
-    }
-    var reader = this;
-    var win = typeof successCallback !== 'function' ? null : function (result) {
-        var retVal = [];
-        for (var i = 0; i < result.length; i++) {
-            var entry = null;
-            if (result[i].isDirectory) {
-                entry = new (require('./DirectoryEntry'))();
-            } else if (result[i].isFile) {
-                entry = new (require('./FileEntry'))();
-            }
-            entry.isDirectory = result[i].isDirectory;
-            entry.isFile = result[i].isFile;
-            entry.name = result[i].name;
-            entry.fullPath = result[i].fullPath;
-            entry.filesystem = new (require('./FileSystem'))(result[i].filesystemName);
-            entry.nativeURL = result[i].nativeURL;
-            retVal.push(entry);
-        }
-        reader.hasReadEntries = true;
-        successCallback(retVal);
-    };
-    var fail = typeof errorCallback !== 'function' ? null : function (code) {
-        errorCallback(new FileError(code));
-    };
-    exec(win, fail, 'File', 'readEntries', [this.localURL]);
-};
-
-module.exports = DirectoryReader;
-
-});

+ 0 - 263
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/Entry.js

@@ -1,263 +0,0 @@
-cordova.define("cordova-plugin-file.Entry", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var argscheck = require('cordova/argscheck');
-var exec = require('cordova/exec');
-var FileError = require('./FileError');
-var Metadata = require('./Metadata');
-
-/**
- * Represents a file or directory on the local file system.
- *
- * @param isFile
- *            {boolean} true if Entry is a file (readonly)
- * @param isDirectory
- *            {boolean} true if Entry is a directory (readonly)
- * @param name
- *            {DOMString} name of the file or directory, excluding the path
- *            leading to it (readonly)
- * @param fullPath
- *            {DOMString} the absolute full path to the file or directory
- *            (readonly)
- * @param fileSystem
- *            {FileSystem} the filesystem on which this entry resides
- *            (readonly)
- * @param nativeURL
- *            {DOMString} an alternate URL which can be used by native
- *            webview controls, for example media players.
- *            (optional, readonly)
- */
-function Entry (isFile, isDirectory, name, fullPath, fileSystem, nativeURL) {
-    this.isFile = !!isFile;
-    this.isDirectory = !!isDirectory;
-    this.name = name || '';
-    this.fullPath = fullPath || '';
-    this.filesystem = fileSystem || null;
-    this.nativeURL = nativeURL || null;
-}
-
-/**
- * Look up the metadata of the entry.
- *
- * @param successCallback
- *            {Function} is called with a Metadata object
- * @param errorCallback
- *            {Function} is called with a FileError
- */
-Entry.prototype.getMetadata = function (successCallback, errorCallback) {
-    argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);
-    var success = successCallback && function (entryMetadata) {
-        var metadata = new Metadata({
-            size: entryMetadata.size,
-            modificationTime: entryMetadata.lastModifiedDate
-        });
-        successCallback(metadata);
-    };
-    var fail = errorCallback && function (code) {
-        errorCallback(new FileError(code));
-    };
-    exec(success, fail, 'File', 'getFileMetadata', [this.toInternalURL()]);
-};
-
-/**
- * Set the metadata of the entry.
- *
- * @param successCallback
- *            {Function} is called with a Metadata object
- * @param errorCallback
- *            {Function} is called with a FileError
- * @param metadataObject
- *            {Object} keys and values to set
- */
-Entry.prototype.setMetadata = function (successCallback, errorCallback, metadataObject) {
-    argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);
-    exec(successCallback, errorCallback, 'File', 'setMetadata', [this.toInternalURL(), metadataObject]);
-};
-
-/**
- * Move a file or directory to a new location.
- *
- * @param parent
- *            {DirectoryEntry} the directory to which to move this entry
- * @param newName
- *            {DOMString} new name of the entry, defaults to the current name
- * @param successCallback
- *            {Function} called with the new DirectoryEntry object
- * @param errorCallback
- *            {Function} called with a FileError
- */
-Entry.prototype.moveTo = function (parent, newName, successCallback, errorCallback) {
-    argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);
-    var fail = errorCallback && function (code) {
-        errorCallback(new FileError(code));
-    };
-    var srcURL = this.toInternalURL();
-    // entry name
-    var name = newName || this.name;
-    var success = function (entry) {
-        if (entry) {
-            if (successCallback) {
-                // create appropriate Entry object
-                var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name);
-                var fs = newFSName ? new FileSystem(newFSName, { name: '', fullPath: '/' }) : new FileSystem(parent.filesystem.name, { name: '', fullPath: '/' }); // eslint-disable-line no-undef
-                var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL);
-                successCallback(result);
-            }
-        } else {
-            // no Entry object returned
-            if (fail) {
-                fail(FileError.NOT_FOUND_ERR);
-            }
-        }
-    };
-
-    // copy
-    exec(success, fail, 'File', 'moveTo', [srcURL, parent.toInternalURL(), name]);
-};
-
-/**
- * Copy a directory to a different location.
- *
- * @param parent
- *            {DirectoryEntry} the directory to which to copy the entry
- * @param newName
- *            {DOMString} new name of the entry, defaults to the current name
- * @param successCallback
- *            {Function} called with the new Entry object
- * @param errorCallback
- *            {Function} called with a FileError
- */
-Entry.prototype.copyTo = function (parent, newName, successCallback, errorCallback) {
-    argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);
-    var fail = errorCallback && function (code) {
-        errorCallback(new FileError(code));
-    };
-    var srcURL = this.toInternalURL();
-        // entry name
-    var name = newName || this.name;
-    // success callback
-    var success = function (entry) {
-        if (entry) {
-            if (successCallback) {
-                // create appropriate Entry object
-                var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name);
-                var fs = newFSName ? new FileSystem(newFSName, { name: '', fullPath: '/' }) : new FileSystem(parent.filesystem.name, { name: '', fullPath: '/' }); // eslint-disable-line no-undef
-                var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL);
-                successCallback(result);
-            }
-        } else {
-            // no Entry object returned
-            if (fail) {
-                fail(FileError.NOT_FOUND_ERR);
-            }
-        }
-    };
-
-    // copy
-    exec(success, fail, 'File', 'copyTo', [srcURL, parent.toInternalURL(), name]);
-};
-
-/**
- * Return a URL that can be passed across the bridge to identify this entry.
- */
-Entry.prototype.toInternalURL = function () {
-    if (this.filesystem && this.filesystem.__format__) {
-        return this.filesystem.__format__(this.fullPath, this.nativeURL);
-    }
-};
-
-/**
- * Return a URL that can be used to identify this entry.
- * Use a URL that can be used to as the src attribute of a <video> or
- * <audio> tag. If that is not possible, construct a cdvfile:// URL.
- */
-Entry.prototype.toURL = function () {
-    if (this.nativeURL) {
-        return this.nativeURL;
-    }
-    // fullPath attribute may contain the full URL in the case that
-    // toInternalURL fails.
-    return this.toInternalURL() || 'file://localhost' + this.fullPath;
-};
-
-/**
- * Backwards-compatibility: In v1.0.0 - 1.0.2, .toURL would only return a
- * cdvfile:// URL, and this method was necessary to obtain URLs usable by the
- * webview.
- * See CB-6051, CB-6106, CB-6117, CB-6152, CB-6199, CB-6201, CB-6243, CB-6249,
- * and CB-6300.
- */
-Entry.prototype.toNativeURL = function () {
-    console.log("DEPRECATED: Update your code to use 'toURL'");
-    return this.toURL();
-};
-
-/**
- * Returns a URI that can be used to identify this entry.
- *
- * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
- * @return uri
- */
-Entry.prototype.toURI = function (mimeType) {
-    console.log("DEPRECATED: Update your code to use 'toURL'");
-    return this.toURL();
-};
-
-/**
- * Remove a file or directory. It is an error to attempt to delete a
- * directory that is not empty. It is an error to attempt to delete a
- * root directory of a file system.
- *
- * @param successCallback {Function} called with no parameters
- * @param errorCallback {Function} called with a FileError
- */
-Entry.prototype.remove = function (successCallback, errorCallback) {
-    argscheck.checkArgs('FF', 'Entry.remove', arguments);
-    var fail = errorCallback && function (code) {
-        errorCallback(new FileError(code));
-    };
-    exec(successCallback, fail, 'File', 'remove', [this.toInternalURL()]);
-};
-
-/**
- * Look up the parent DirectoryEntry of this entry.
- *
- * @param successCallback {Function} called with the parent DirectoryEntry object
- * @param errorCallback {Function} called with a FileError
- */
-Entry.prototype.getParent = function (successCallback, errorCallback) {
-    argscheck.checkArgs('FF', 'Entry.getParent', arguments);
-    var fs = this.filesystem;
-    var win = successCallback && function (result) {
-        var DirectoryEntry = require('./DirectoryEntry');
-        var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL);
-        successCallback(entry);
-    };
-    var fail = errorCallback && function (code) {
-        errorCallback(new FileError(code));
-    };
-    exec(win, fail, 'File', 'getParent', [this.toInternalURL()]);
-};
-
-module.exports = Entry;
-
-});

+ 0 - 81
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/File.js

@@ -1,81 +0,0 @@
-cordova.define("cordova-plugin-file.File", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/**
- * Constructor.
- * name {DOMString} name of the file, without path information
- * fullPath {DOMString} the full path of the file, including the name
- * type {DOMString} mime type
- * lastModifiedDate {Date} last modified date
- * size {Number} size of the file in bytes
- */
-
-var File = function (name, localURL, type, lastModifiedDate, size) {
-    this.name = name || '';
-    this.localURL = localURL || null;
-    this.type = type || null;
-    this.lastModified = lastModifiedDate || null;
-    // For backwards compatibility, store the timestamp in lastModifiedDate as well
-    this.lastModifiedDate = lastModifiedDate || null;
-    this.size = size || 0;
-
-    // These store the absolute start and end for slicing the file.
-    this.start = 0;
-    this.end = this.size;
-};
-
-/**
- * Returns a "slice" of the file. Since Cordova Files don't contain the actual
- * content, this really returns a File with adjusted start and end.
- * Slices of slices are supported.
- * start {Number} The index at which to start the slice (inclusive).
- * end {Number} The index at which to end the slice (exclusive).
- */
-File.prototype.slice = function (start, end) {
-    var size = this.end - this.start;
-    var newStart = 0;
-    var newEnd = size;
-    if (arguments.length) {
-        if (start < 0) {
-            newStart = Math.max(size + start, 0);
-        } else {
-            newStart = Math.min(size, start);
-        }
-    }
-
-    if (arguments.length >= 2) {
-        if (end < 0) {
-            newEnd = Math.max(size + end, 0);
-        } else {
-            newEnd = Math.min(end, size);
-        }
-    }
-
-    var newFile = new File(this.name, this.localURL, this.type, this.lastModified, this.size);
-    newFile.start = this.start + newStart;
-    newFile.end = this.start + newEnd;
-    return newFile;
-};
-
-module.exports = File;
-
-});

+ 0 - 95
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileEntry.js

@@ -1,95 +0,0 @@
-cordova.define("cordova-plugin-file.FileEntry", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var utils = require('cordova/utils');
-var exec = require('cordova/exec');
-var Entry = require('./Entry');
-var FileWriter = require('./FileWriter');
-var File = require('./File');
-var FileError = require('./FileError');
-
-/**
- * An interface representing a file on the file system.
- *
- * {boolean} isFile always true (readonly)
- * {boolean} isDirectory always false (readonly)
- * {DOMString} name of the file, excluding the path leading to it (readonly)
- * {DOMString} fullPath the absolute full path to the file (readonly)
- * {FileSystem} filesystem on which the file resides (readonly)
- */
-var FileEntry = function (name, fullPath, fileSystem, nativeURL) {
-    // remove trailing slash if it is present
-    if (fullPath && /\/$/.test(fullPath)) {
-        fullPath = fullPath.substring(0, fullPath.length - 1);
-    }
-    if (nativeURL && /\/$/.test(nativeURL)) {
-        nativeURL = nativeURL.substring(0, nativeURL.length - 1);
-    }
-
-    FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath, fileSystem, nativeURL]);
-};
-
-utils.extend(FileEntry, Entry);
-
-/**
- * Creates a new FileWriter associated with the file that this FileEntry represents.
- *
- * @param {Function} successCallback is called with the new FileWriter
- * @param {Function} errorCallback is called with a FileError
- */
-FileEntry.prototype.createWriter = function (successCallback, errorCallback) {
-    this.file(function (filePointer) {
-        var writer = new FileWriter(filePointer);
-
-        if (writer.localURL === null || writer.localURL === '') {
-            if (errorCallback) {
-                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
-            }
-        } else {
-            if (successCallback) {
-                successCallback(writer);
-            }
-        }
-    }, errorCallback);
-};
-
-/**
- * Returns a File that represents the current state of the file that this FileEntry represents.
- *
- * @param {Function} successCallback is called with the new File object
- * @param {Function} errorCallback is called with a FileError
- */
-FileEntry.prototype.file = function (successCallback, errorCallback) {
-    var localURL = this.toInternalURL();
-    var win = successCallback && function (f) {
-        var file = new File(f.name, localURL, f.type, f.lastModifiedDate, f.size);
-        successCallback(file);
-    };
-    var fail = errorCallback && function (code) {
-        errorCallback(new FileError(code));
-    };
-    exec(win, fail, 'File', 'getFileMetadata', [localURL]);
-};
-
-module.exports = FileEntry;
-
-});

+ 0 - 49
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileError.js

@@ -1,49 +0,0 @@
-cordova.define("cordova-plugin-file.FileError", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/**
- * FileError
- */
-function FileError (error) {
-    this.code = error || null;
-}
-
-// File error codes
-// Found in DOMException
-FileError.NOT_FOUND_ERR = 1;
-FileError.SECURITY_ERR = 2;
-FileError.ABORT_ERR = 3;
-
-// Added by File API specification
-FileError.NOT_READABLE_ERR = 4;
-FileError.ENCODING_ERR = 5;
-FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
-FileError.INVALID_STATE_ERR = 7;
-FileError.SYNTAX_ERR = 8;
-FileError.INVALID_MODIFICATION_ERR = 9;
-FileError.QUOTA_EXCEEDED_ERR = 10;
-FileError.TYPE_MISMATCH_ERR = 11;
-FileError.PATH_EXISTS_ERR = 12;
-
-module.exports = FileError;
-
-});

+ 0 - 301
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileReader.js

@@ -1,301 +0,0 @@
-cordova.define("cordova-plugin-file.FileReader", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var exec = require('cordova/exec');
-var modulemapper = require('cordova/modulemapper');
-var utils = require('cordova/utils');
-var FileError = require('./FileError');
-var ProgressEvent = require('./ProgressEvent');
-var origFileReader = modulemapper.getOriginalSymbol(window, 'FileReader');
-
-/**
- * This class reads the mobile device file system.
- *
- * For Android:
- *      The root directory is the root of the file system.
- *      To read from the SD card, the file name is "sdcard/my_file.txt"
- * @constructor
- */
-var FileReader = function () {
-    this._readyState = 0;
-    this._error = null;
-    this._result = null;
-    this._progress = null;
-    this._localURL = '';
-    this._realReader = origFileReader ? new origFileReader() : {}; // eslint-disable-line new-cap
-};
-
-/**
- * Defines the maximum size to read at a time via the native API. The default value is a compromise between
- * minimizing the overhead of many exec() calls while still reporting progress frequently enough for large files.
- * (Note attempts to allocate more than a few MB of contiguous memory on the native side are likely to cause
- * OOM exceptions, while the JS engine seems to have fewer problems managing large strings or ArrayBuffers.)
- */
-FileReader.READ_CHUNK_SIZE = 256 * 1024;
-
-// States
-FileReader.EMPTY = 0;
-FileReader.LOADING = 1;
-FileReader.DONE = 2;
-
-utils.defineGetter(FileReader.prototype, 'readyState', function () {
-    return this._localURL ? this._readyState : this._realReader.readyState;
-});
-
-utils.defineGetter(FileReader.prototype, 'error', function () {
-    return this._localURL ? this._error : this._realReader.error;
-});
-
-utils.defineGetter(FileReader.prototype, 'result', function () {
-    return this._localURL ? this._result : this._realReader.result;
-});
-
-function defineEvent (eventName) {
-    utils.defineGetterSetter(FileReader.prototype, eventName, function () {
-        return this._realReader[eventName] || null;
-    }, function (value) {
-        this._realReader[eventName] = value;
-    });
-}
-defineEvent('onloadstart');    // When the read starts.
-defineEvent('onprogress');     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
-defineEvent('onload');         // When the read has successfully completed.
-defineEvent('onerror');        // When the read has failed (see errors).
-defineEvent('onloadend');      // When the request has completed (either in success or failure).
-defineEvent('onabort');        // When the read has been aborted. For instance, by invoking the abort() method.
-
-function initRead (reader, file) {
-    // Already loading something
-    if (reader.readyState === FileReader.LOADING) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    reader._result = null;
-    reader._error = null;
-    reader._progress = 0;
-    reader._readyState = FileReader.LOADING;
-
-    if (typeof file.localURL === 'string') {
-        reader._localURL = file.localURL;
-    } else {
-        reader._localURL = '';
-        return true;
-    }
-
-    if (reader.onloadstart) {
-        reader.onloadstart(new ProgressEvent('loadstart', {target: reader}));
-    }
-}
-
-/**
- * Callback used by the following read* functions to handle incremental or final success.
- * Must be bound to the FileReader's this along with all but the last parameter,
- * e.g. readSuccessCallback.bind(this, "readAsText", "UTF-8", offset, totalSize, accumulate)
- * @param readType The name of the read function to call.
- * @param encoding Text encoding, or null if this is not a text type read.
- * @param offset Starting offset of the read.
- * @param totalSize Total number of bytes or chars to read.
- * @param accumulate A function that takes the callback result and accumulates it in this._result.
- * @param r Callback result returned by the last read exec() call, or null to begin reading.
- */
-function readSuccessCallback (readType, encoding, offset, totalSize, accumulate, r) {
-    if (this._readyState === FileReader.DONE) {
-        return;
-    }
-
-    var CHUNK_SIZE = FileReader.READ_CHUNK_SIZE;
-    if (readType === 'readAsDataURL') {
-        // Windows proxy does not support reading file slices as Data URLs
-        // so read the whole file at once.
-        CHUNK_SIZE = cordova.platformId === 'windows' ? totalSize : // eslint-disable-line no-undef
-            // Calculate new chunk size for data URLs to be multiply of 3
-            // Otherwise concatenated base64 chunks won't be valid base64 data
-            FileReader.READ_CHUNK_SIZE - (FileReader.READ_CHUNK_SIZE % 3) + 3;
-    }
-
-    if (typeof r !== 'undefined') {
-        accumulate(r);
-        this._progress = Math.min(this._progress + CHUNK_SIZE, totalSize);
-
-        if (typeof this.onprogress === 'function') {
-            this.onprogress(new ProgressEvent('progress', {loaded: this._progress, total: totalSize}));
-        }
-    }
-
-    if (typeof r === 'undefined' || this._progress < totalSize) {
-        var execArgs = [
-            this._localURL,
-            offset + this._progress,
-            offset + this._progress + Math.min(totalSize - this._progress, CHUNK_SIZE)];
-        if (encoding) {
-            execArgs.splice(1, 0, encoding);
-        }
-        exec(
-            readSuccessCallback.bind(this, readType, encoding, offset, totalSize, accumulate),
-            readFailureCallback.bind(this),
-            'File', readType, execArgs);
-    } else {
-        this._readyState = FileReader.DONE;
-
-        if (typeof this.onload === 'function') {
-            this.onload(new ProgressEvent('load', {target: this}));
-        }
-
-        if (typeof this.onloadend === 'function') {
-            this.onloadend(new ProgressEvent('loadend', {target: this}));
-        }
-    }
-}
-
-/**
- * Callback used by the following read* functions to handle errors.
- * Must be bound to the FileReader's this, e.g. readFailureCallback.bind(this)
- */
-function readFailureCallback (e) {
-    if (this._readyState === FileReader.DONE) {
-        return;
-    }
-
-    this._readyState = FileReader.DONE;
-    this._result = null;
-    this._error = new FileError(e);
-
-    if (typeof this.onerror === 'function') {
-        this.onerror(new ProgressEvent('error', {target: this}));
-    }
-
-    if (typeof this.onloadend === 'function') {
-        this.onloadend(new ProgressEvent('loadend', {target: this}));
-    }
-}
-
-/**
- * Abort reading file.
- */
-FileReader.prototype.abort = function () {
-    if (origFileReader && !this._localURL) {
-        return this._realReader.abort();
-    }
-    this._result = null;
-
-    if (this._readyState === FileReader.DONE || this._readyState === FileReader.EMPTY) {
-        return;
-    }
-
-    this._readyState = FileReader.DONE;
-
-    // If abort callback
-    if (typeof this.onabort === 'function') {
-        this.onabort(new ProgressEvent('abort', {target: this}));
-    }
-    // If load end callback
-    if (typeof this.onloadend === 'function') {
-        this.onloadend(new ProgressEvent('loadend', {target: this}));
-    }
-};
-
-/**
- * Read text file.
- *
- * @param file          {File} File object containing file properties
- * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
- */
-FileReader.prototype.readAsText = function (file, encoding) {
-    if (initRead(this, file)) {
-        return this._realReader.readAsText(file, encoding);
-    }
-
-    // Default encoding is UTF-8
-    var enc = encoding || 'UTF-8';
-
-    var totalSize = file.end - file.start;
-    readSuccessCallback.bind(this)('readAsText', enc, file.start, totalSize, function (r) {
-        if (this._progress === 0) {
-            this._result = '';
-        }
-        this._result += r;
-    }.bind(this));
-};
-
-/**
- * Read file and return data as a base64 encoded data url.
- * A data url is of the form:
- *      data:[<mediatype>][;base64],<data>
- *
- * @param file          {File} File object containing file properties
- */
-FileReader.prototype.readAsDataURL = function (file) {
-    if (initRead(this, file)) {
-        return this._realReader.readAsDataURL(file);
-    }
-
-    var totalSize = file.end - file.start;
-    readSuccessCallback.bind(this)('readAsDataURL', null, file.start, totalSize, function (r) {
-        var commaIndex = r.indexOf(',');
-        if (this._progress === 0) {
-            this._result = r;
-        } else {
-            this._result += r.substring(commaIndex + 1);
-        }
-    }.bind(this));
-};
-
-/**
- * Read file and return data as a binary data.
- *
- * @param file          {File} File object containing file properties
- */
-FileReader.prototype.readAsBinaryString = function (file) {
-    if (initRead(this, file)) {
-        return this._realReader.readAsBinaryString(file);
-    }
-
-    var totalSize = file.end - file.start;
-    readSuccessCallback.bind(this)('readAsBinaryString', null, file.start, totalSize, function (r) {
-        if (this._progress === 0) {
-            this._result = '';
-        }
-        this._result += r;
-    }.bind(this));
-};
-
-/**
- * Read file and return data as a binary data.
- *
- * @param file          {File} File object containing file properties
- */
-FileReader.prototype.readAsArrayBuffer = function (file) {
-    if (initRead(this, file)) {
-        return this._realReader.readAsArrayBuffer(file);
-    }
-
-    var totalSize = file.end - file.start;
-    readSuccessCallback.bind(this)('readAsArrayBuffer', null, file.start, totalSize, function (r) {
-        var resultArray = (this._progress === 0 ? new Uint8Array(totalSize) : new Uint8Array(this._result));
-        resultArray.set(new Uint8Array(r), this._progress);
-        this._result = resultArray.buffer;
-    }.bind(this));
-};
-
-module.exports = FileReader;
-
-});

+ 0 - 58
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileSystem.js

@@ -1,58 +0,0 @@
-cordova.define("cordova-plugin-file.FileSystem", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var DirectoryEntry = require('./DirectoryEntry');
-
-/**
- * An interface representing a file system
- *
- * @constructor
- * {DOMString} name the unique name of the file system (readonly)
- * {DirectoryEntry} root directory of the file system (readonly)
- */
-var FileSystem = function (name, root) {
-    this.name = name;
-    if (root) {
-        this.root = new DirectoryEntry(root.name, root.fullPath, this, root.nativeURL);
-    } else {
-        this.root = new DirectoryEntry(this.name, '/', this);
-    }
-};
-
-FileSystem.prototype.__format__ = function (fullPath, nativeUrl) {
-    return fullPath;
-};
-
-FileSystem.prototype.toJSON = function () {
-    return '<FileSystem: ' + this.name + '>';
-};
-
-// Use instead of encodeURI() when encoding just the path part of a URI rather than an entire URI.
-FileSystem.encodeURIPath = function (path) {
-    // Because # is a valid filename character, it must be encoded to prevent part of the
-    // path from being parsed as a URI fragment.
-    return encodeURI(path).replace(/#/g, '%23');
-};
-
-module.exports = FileSystem;
-
-});

+ 0 - 44
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileUploadOptions.js

@@ -1,44 +0,0 @@
-cordova.define("cordova-plugin-file.FileUploadOptions", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/**
- * Options to customize the HTTP request used to upload files.
- * @constructor
- * @param fileKey {String}   Name of file request parameter.
- * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
- * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
- * @param params {Object}    Object with key: value params to send to the server.
- * @param headers {Object}   Keys are header names, values are header values. Multiple
- *                           headers of the same name are not supported.
- */
-var FileUploadOptions = function (fileKey, fileName, mimeType, params, headers, httpMethod) {
-    this.fileKey = fileKey || null;
-    this.fileName = fileName || null;
-    this.mimeType = mimeType || null;
-    this.params = params || null;
-    this.headers = headers || null;
-    this.httpMethod = httpMethod || null;
-};
-
-module.exports = FileUploadOptions;
-
-});

+ 0 - 33
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileUploadResult.js

@@ -1,33 +0,0 @@
-cordova.define("cordova-plugin-file.FileUploadResult", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/**
- * FileUploadResult
- * @constructor
- */
-module.exports = function FileUploadResult (size, code, content) {
-    this.bytesSent = size;
-    this.responseCode = code;
-    this.response = content;
-};
-
-});

+ 0 - 328
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/FileWriter.js

@@ -1,328 +0,0 @@
-cordova.define("cordova-plugin-file.FileWriter", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var exec = require('cordova/exec');
-var FileError = require('./FileError');
-var FileReader = require('./FileReader');
-var ProgressEvent = require('./ProgressEvent');
-
-/**
- * This class writes to the mobile device file system.
- *
- * For Android:
- *      The root directory is the root of the file system.
- *      To write to the SD card, the file name is "sdcard/my_file.txt"
- *
- * @constructor
- * @param file {File} File object containing file properties
- * @param append if true write to the end of the file, otherwise overwrite the file
- */
-var FileWriter = function (file) {
-    this.fileName = '';
-    this.length = 0;
-    if (file) {
-        this.localURL = file.localURL || file;
-        this.length = file.size || 0;
-    }
-    // default is to write at the beginning of the file
-    this.position = 0;
-
-    this.readyState = 0; // EMPTY
-
-    this.result = null;
-
-    // Error
-    this.error = null;
-
-    // Event handlers
-    this.onwritestart = null;   // When writing starts
-    this.onprogress = null;     // While writing the file, and reporting partial file data
-    this.onwrite = null;        // When the write has successfully completed.
-    this.onwriteend = null;     // When the request has completed (either in success or failure).
-    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
-    this.onerror = null;        // When the write has failed (see errors).
-};
-
-// States
-FileWriter.INIT = 0;
-FileWriter.WRITING = 1;
-FileWriter.DONE = 2;
-
-/**
- * Abort writing file.
- */
-FileWriter.prototype.abort = function () {
-    // check for invalid state
-    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    // set error
-    this.error = new FileError(FileError.ABORT_ERR);
-
-    this.readyState = FileWriter.DONE;
-
-    // If abort callback
-    if (typeof this.onabort === 'function') {
-        this.onabort(new ProgressEvent('abort', {'target': this}));
-    }
-
-    // If write end callback
-    if (typeof this.onwriteend === 'function') {
-        this.onwriteend(new ProgressEvent('writeend', {'target': this}));
-    }
-};
-
-/**
- * Writes data to the file
- *
- * @param data text or blob to be written
- * @param isPendingBlobReadResult {Boolean} true if the data is the pending blob read operation result
- */
-FileWriter.prototype.write = function (data, isPendingBlobReadResult) {
-
-    var that = this;
-    var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined');
-    /* eslint-disable no-undef */
-    var isProxySupportBlobNatively = (cordova.platformId === 'windows8' || cordova.platformId === 'windows');
-    var isBinary;
-
-    // Check to see if the incoming data is a blob
-    if (data instanceof File || (!isProxySupportBlobNatively && supportsBinary && data instanceof Blob)) {
-        var fileReader = new FileReader();
-        /* eslint-enable no-undef */
-        fileReader.onload = function () {
-            // Call this method again, with the arraybuffer as argument
-            FileWriter.prototype.write.call(that, this.result, true /* isPendingBlobReadResult */);
-        };
-        fileReader.onerror = function () {
-            // DONE state
-            that.readyState = FileWriter.DONE;
-
-            // Save error
-            that.error = this.error;
-
-            // If onerror callback
-            if (typeof that.onerror === 'function') {
-                that.onerror(new ProgressEvent('error', {'target': that}));
-            }
-
-            // If onwriteend callback
-            if (typeof that.onwriteend === 'function') {
-                that.onwriteend(new ProgressEvent('writeend', {'target': that}));
-            }
-        };
-
-        // WRITING state
-        this.readyState = FileWriter.WRITING;
-
-        if (supportsBinary) {
-            fileReader.readAsArrayBuffer(data);
-        } else {
-            fileReader.readAsText(data);
-        }
-        return;
-    }
-
-    // Mark data type for safer transport over the binary bridge
-    isBinary = supportsBinary && (data instanceof ArrayBuffer);
-    if (isBinary && cordova.platformId === 'windowsphone') { // eslint-disable-line no-undef
-        // create a plain array, using the keys from the Uint8Array view so that we can serialize it
-        data = Array.apply(null, new Uint8Array(data));
-    }
-
-    // Throw an exception if we are already writing a file
-    if (this.readyState === FileWriter.WRITING && !isPendingBlobReadResult) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    // WRITING state
-    this.readyState = FileWriter.WRITING;
-
-    var me = this;
-
-    // If onwritestart callback
-    if (typeof me.onwritestart === 'function') {
-        me.onwritestart(new ProgressEvent('writestart', {'target': me}));
-    }
-
-    // Write file
-    exec(
-        // Success callback
-        function (r) {
-            // If DONE (cancelled), then don't do anything
-            if (me.readyState === FileWriter.DONE) {
-                return;
-            }
-
-            // position always increases by bytes written because file would be extended
-            me.position += r;
-            // The length of the file is now where we are done writing.
-
-            me.length = me.position;
-
-            // DONE state
-            me.readyState = FileWriter.DONE;
-
-            // If onwrite callback
-            if (typeof me.onwrite === 'function') {
-                me.onwrite(new ProgressEvent('write', {'target': me}));
-            }
-
-            // If onwriteend callback
-            if (typeof me.onwriteend === 'function') {
-                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
-            }
-        },
-        // Error callback
-        function (e) {
-            // If DONE (cancelled), then don't do anything
-            if (me.readyState === FileWriter.DONE) {
-                return;
-            }
-
-            // DONE state
-            me.readyState = FileWriter.DONE;
-
-            // Save error
-            me.error = new FileError(e);
-
-            // If onerror callback
-            if (typeof me.onerror === 'function') {
-                me.onerror(new ProgressEvent('error', {'target': me}));
-            }
-
-            // If onwriteend callback
-            if (typeof me.onwriteend === 'function') {
-                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
-            }
-        }, 'File', 'write', [this.localURL, data, this.position, isBinary]);
-};
-
-/**
- * Moves the file pointer to the location specified.
- *
- * If the offset is a negative number the position of the file
- * pointer is rewound.  If the offset is greater than the file
- * size the position is set to the end of the file.
- *
- * @param offset is the location to move the file pointer to.
- */
-FileWriter.prototype.seek = function (offset) {
-    // Throw an exception if we are already writing a file
-    if (this.readyState === FileWriter.WRITING) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    if (!offset && offset !== 0) {
-        return;
-    }
-
-    // See back from end of file.
-    if (offset < 0) {
-        this.position = Math.max(offset + this.length, 0);
-    // Offset is bigger than file size so set position
-    // to the end of the file.
-    } else if (offset > this.length) {
-        this.position = this.length;
-    // Offset is between 0 and file size so set the position
-    // to start writing.
-    } else {
-        this.position = offset;
-    }
-};
-
-/**
- * Truncates the file to the size specified.
- *
- * @param size to chop the file at.
- */
-FileWriter.prototype.truncate = function (size) {
-    // Throw an exception if we are already writing a file
-    if (this.readyState === FileWriter.WRITING) {
-        throw new FileError(FileError.INVALID_STATE_ERR);
-    }
-
-    // WRITING state
-    this.readyState = FileWriter.WRITING;
-
-    var me = this;
-
-    // If onwritestart callback
-    if (typeof me.onwritestart === 'function') {
-        me.onwritestart(new ProgressEvent('writestart', {'target': this}));
-    }
-
-    // Write file
-    exec(
-        // Success callback
-        function (r) {
-            // If DONE (cancelled), then don't do anything
-            if (me.readyState === FileWriter.DONE) {
-                return;
-            }
-
-            // DONE state
-            me.readyState = FileWriter.DONE;
-
-            // Update the length of the file
-            me.length = r;
-            me.position = Math.min(me.position, r);
-
-            // If onwrite callback
-            if (typeof me.onwrite === 'function') {
-                me.onwrite(new ProgressEvent('write', {'target': me}));
-            }
-
-            // If onwriteend callback
-            if (typeof me.onwriteend === 'function') {
-                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
-            }
-        },
-        // Error callback
-        function (e) {
-            // If DONE (cancelled), then don't do anything
-            if (me.readyState === FileWriter.DONE) {
-                return;
-            }
-
-            // DONE state
-            me.readyState = FileWriter.DONE;
-
-            // Save error
-            me.error = new FileError(e);
-
-            // If onerror callback
-            if (typeof me.onerror === 'function') {
-                me.onerror(new ProgressEvent('error', {'target': me}));
-            }
-
-            // If onwriteend callback
-            if (typeof me.onwriteend === 'function') {
-                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
-            }
-        }, 'File', 'truncate', [this.localURL, size]);
-};
-
-module.exports = FileWriter;
-
-});

+ 0 - 39
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/Flags.js

@@ -1,39 +0,0 @@
-cordova.define("cordova-plugin-file.Flags", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/**
- * Supplies arguments to methods that lookup or create files and directories.
- *
- * @param create
- *            {boolean} file or directory if it doesn't exist
- * @param exclusive
- *            {boolean} used with create; if true the command will fail if
- *            target path exists
- */
-function Flags (create, exclusive) {
-    this.create = create || false;
-    this.exclusive = exclusive || false;
-}
-
-module.exports = Flags;
-
-});

+ 0 - 26
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/LocalFileSystem.js

@@ -1,26 +0,0 @@
-cordova.define("cordova-plugin-file.LocalFileSystem", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-exports.TEMPORARY = 0;
-exports.PERSISTENT = 1;
-
-});

+ 0 - 43
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/Metadata.js

@@ -1,43 +0,0 @@
-cordova.define("cordova-plugin-file.Metadata", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/**
- * Information about the state of the file or directory
- *
- * {Date} modificationTime (readonly)
- */
-var Metadata = function (metadata) {
-    if (typeof metadata === 'object') {
-        this.modificationTime = new Date(metadata.modificationTime);
-        this.size = metadata.size || 0;
-    } else if (typeof metadata === 'undefined') {
-        this.modificationTime = null;
-        this.size = 0;
-    } else {
-        /* Backwards compatiblity with platforms that only return a timestamp */
-        this.modificationTime = new Date(metadata);
-    }
-};
-
-module.exports = Metadata;
-
-});

+ 0 - 70
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/ProgressEvent.js

@@ -1,70 +0,0 @@
-cordova.define("cordova-plugin-file.ProgressEvent", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
-// Feature test: See if we can instantiate a native ProgressEvent;
-// if so, use that approach,
-// otherwise fill-in with our own implementation.
-//
-// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
-var ProgressEvent = (function () {
-    /*
-    var createEvent = function(data) {
-        var event = document.createEvent('Events');
-        event.initEvent('ProgressEvent', false, false);
-        if (data) {
-            for (var i in data) {
-                if (data.hasOwnProperty(i)) {
-                    event[i] = data[i];
-                }
-            }
-            if (data.target) {
-                // TODO: cannot call <some_custom_object>.dispatchEvent
-                // need to first figure out how to implement EventTarget
-            }
-        }
-        return event;
-    };
-    try {
-        var ev = createEvent({type:"abort",target:document});
-        return function ProgressEvent(type, data) {
-            data.type = type;
-            return createEvent(data);
-        };
-    } catch(e){
-    */
-    return function ProgressEvent (type, dict) {
-        this.type = type;
-        this.bubbles = false;
-        this.cancelBubble = false;
-        this.cancelable = false;
-        this.lengthComputable = false;
-        this.loaded = dict && dict.loaded ? dict.loaded : 0;
-        this.total = dict && dict.total ? dict.total : 0;
-        this.target = dict && dict.target ? dict.target : null;
-    };
-    // }
-})();
-
-module.exports = ProgressEvent;
-
-});

+ 0 - 51
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/android/FileSystem.js

@@ -1,51 +0,0 @@
-cordova.define("cordova-plugin-file.androidFileSystem", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-FILESYSTEM_PROTOCOL = 'cdvfile'; // eslint-disable-line no-undef
-
-module.exports = {
-    __format__: function (fullPath, nativeUrl) {
-        var path;
-        var contentUrlMatch = /^content:\/\//.exec(nativeUrl);
-        if (contentUrlMatch) {
-            // When available, use the path from a native content URL, which was already encoded by Android.
-            // This is necessary because JavaScript's encodeURI() does not encode as many characters as
-            // Android, which can result in permission exceptions when the encoding of a content URI
-            // doesn't match the string for which permission was originally granted.
-            path = nativeUrl.substring(contentUrlMatch[0].length - 1);
-        } else {
-            path = FileSystem.encodeURIPath(fullPath); // eslint-disable-line no-undef
-            if (!/^\//.test(path)) {
-                path = '/' + path;
-            }
-
-            var m = /\?.*/.exec(nativeUrl);
-            if (m) {
-                path += m[0];
-            }
-        }
-
-        return FILESYSTEM_PROTOCOL + '://localhost/' + this.name + path; // eslint-disable-line no-undef
-    }
-};
-
-});

+ 0 - 29
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/browser/isChrome.js

@@ -1,29 +0,0 @@
-cordova.define("cordova-plugin-file.isChrome", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-module.exports = function () {
-    // window.webkitRequestFileSystem and window.webkitResolveLocalFileSystemURL are available only in Chrome and
-    // possibly a good flag to indicate that we're running in Chrome
-    return window.webkitRequestFileSystem && window.webkitResolveLocalFileSystemURL;
-};
-
-});

+ 0 - 65
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/fileSystemPaths.js

@@ -1,65 +0,0 @@
-cordova.define("cordova-plugin-file.fileSystemPaths", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var exec = require('cordova/exec');
-var channel = require('cordova/channel');
-
-exports.file = {
-    // Read-only directory where the application is installed.
-    applicationDirectory: null,
-    // Root of app's private writable storage
-    applicationStorageDirectory: null,
-    // Where to put app-specific data files.
-    dataDirectory: null,
-    // Cached files that should survive app restarts.
-    // Apps should not rely on the OS to delete files in here.
-    cacheDirectory: null,
-    // Android: the application space on external storage.
-    externalApplicationStorageDirectory: null,
-    // Android: Where to put app-specific data files on external storage.
-    externalDataDirectory: null,
-    // Android: the application cache on external storage.
-    externalCacheDirectory: null,
-    // Android: the external storage (SD card) root.
-    externalRootDirectory: null,
-    // iOS: Temp directory that the OS can clear at will.
-    tempDirectory: null,
-    // iOS: Holds app-specific files that should be synced (e.g. to iCloud).
-    syncedDataDirectory: null,
-    // iOS: Files private to the app, but that are meaningful to other applications (e.g. Office files)
-    documentsDirectory: null,
-    // BlackBerry10: Files globally available to all apps
-    sharedDirectory: null
-};
-
-channel.waitForInitialization('onFileSystemPathsReady');
-channel.onCordovaReady.subscribe(function () {
-    function after (paths) {
-        for (var k in paths) {
-            exports.file[k] = paths[k];
-        }
-        channel.initializationComplete('onFileSystemPathsReady');
-    }
-    exec(after, null, 'File', 'requestAllPaths', []);
-});
-
-});

+ 0 - 49
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/fileSystems-roots.js

@@ -1,49 +0,0 @@
-cordova.define("cordova-plugin-file.fileSystems-roots", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-// Map of fsName -> FileSystem.
-var fsMap = null;
-var FileSystem = require('./FileSystem');
-var exec = require('cordova/exec');
-
-// Overridden by Android, BlackBerry 10 and iOS to populate fsMap.
-require('./fileSystems').getFs = function (name, callback) {
-    function success (response) {
-        fsMap = {};
-        for (var i = 0; i < response.length; ++i) {
-            var fsRoot = response[i];
-            if (fsRoot) {
-                var fs = new FileSystem(fsRoot.filesystemName, fsRoot);
-                fsMap[fs.name] = fs;
-            }
-        }
-        callback(fsMap[name]);
-    }
-
-    if (fsMap) {
-        callback(fsMap[name]);
-    } else {
-        exec(success, null, 'File', 'requestAllFileSystems', []);
-    }
-};
-
-});

+ 0 - 28
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/fileSystems.js

@@ -1,28 +0,0 @@
-cordova.define("cordova-plugin-file.fileSystems", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-// Overridden by Android, BlackBerry 10 and iOS to populate fsMap.
-module.exports.getFs = function (name, callback) {
-    callback(null);
-};
-
-});

+ 0 - 84
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/requestFileSystem.js

@@ -1,84 +0,0 @@
-cordova.define("cordova-plugin-file.requestFileSystem", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-(function () {
-    // For browser platform: not all browsers use this file.
-    function checkBrowser () {
-        if (cordova.platformId === 'browser' && require('./isChrome')()) { // eslint-disable-line no-undef
-            module.exports = window.requestFileSystem || window.webkitRequestFileSystem;
-            return true;
-        }
-        return false;
-    }
-    if (checkBrowser()) {
-        return;
-    }
-
-    var argscheck = require('cordova/argscheck');
-    var FileError = require('./FileError');
-    var FileSystem = require('./FileSystem');
-    var exec = require('cordova/exec');
-    var fileSystems = require('./fileSystems');
-
-    /**
-     * Request a file system in which to store application data.
-     * @param type  local file system type
-     * @param size  indicates how much storage space, in bytes, the application expects to need
-     * @param successCallback  invoked with a FileSystem object
-     * @param errorCallback  invoked if error occurs retrieving file system
-     */
-    var requestFileSystem = function (type, size, successCallback, errorCallback) {
-        argscheck.checkArgs('nnFF', 'requestFileSystem', arguments);
-        var fail = function (code) {
-            if (errorCallback) {
-                errorCallback(new FileError(code));
-            }
-        };
-
-        if (type < 0) {
-            fail(FileError.SYNTAX_ERR);
-        } else {
-            // if successful, return a FileSystem object
-            var success = function (file_system) {
-                if (file_system) {
-                    if (successCallback) {
-                        fileSystems.getFs(file_system.name, function (fs) {
-                            // This should happen only on platforms that haven't implemented requestAllFileSystems (windows)
-                            if (!fs) {
-                                fs = new FileSystem(file_system.name, file_system.root);
-                            }
-                            successCallback(fs);
-                        });
-                    }
-                } else {
-                    // no FileSystem object returned
-                    fail(FileError.NOT_FOUND_ERR);
-                }
-            };
-            exec(success, fail, 'File', 'requestFileSystem', [type, size]);
-        }
-    };
-
-    module.exports = requestFileSystem;
-})();
-
-});

+ 0 - 94
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js

@@ -1,94 +0,0 @@
-cordova.define("cordova-plugin-file.resolveLocalFileSystemURI", function(require, exports, module) {
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-(function () {
-    // For browser platform: not all browsers use overrided `resolveLocalFileSystemURL`.
-    function checkBrowser () {
-        if (cordova.platformId === 'browser' && require('./isChrome')()) { // eslint-disable-line no-undef
-            module.exports.resolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL;
-            return true;
-        }
-        return false;
-    }
-    if (checkBrowser()) {
-        return;
-    }
-
-    var argscheck = require('cordova/argscheck');
-    var DirectoryEntry = require('./DirectoryEntry');
-    var FileEntry = require('./FileEntry');
-    var FileError = require('./FileError');
-    var exec = require('cordova/exec');
-    var fileSystems = require('./fileSystems');
-
-    /**
-     * Look up file system Entry referred to by local URI.
-     * @param {DOMString} uri  URI referring to a local file or directory
-     * @param successCallback  invoked with Entry object corresponding to URI
-     * @param errorCallback    invoked if error occurs retrieving file system entry
-     */
-    module.exports.resolveLocalFileSystemURL = module.exports.resolveLocalFileSystemURL || function (uri, successCallback, errorCallback) {
-        argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments);
-        // error callback
-        var fail = function (error) {
-            if (errorCallback) {
-                errorCallback(new FileError(error));
-            }
-        };
-        // sanity check for 'not:valid:filename' or '/not:valid:filename'
-        // file.spec.12 window.resolveLocalFileSystemURI should error (ENCODING_ERR) when resolving invalid URI with leading /.
-        if (!uri || uri.split(':').length > 2) {
-            setTimeout(function () {
-                fail(FileError.ENCODING_ERR);
-            }, 0);
-            return;
-        }
-        // if successful, return either a file or directory entry
-        var success = function (entry) {
-            if (entry) {
-                if (successCallback) {
-                    // create appropriate Entry object
-                    var fsName = entry.filesystemName || (entry.filesystem && entry.filesystem.name) || (entry.filesystem === window.PERSISTENT ? 'persistent' : 'temporary'); // eslint-disable-line no-undef
-                    fileSystems.getFs(fsName, function (fs) {
-                        // This should happen only on platforms that haven't implemented requestAllFileSystems (windows)
-                        if (!fs) {
-                            fs = new FileSystem(fsName, {name: '', fullPath: '/'}); // eslint-disable-line no-undef
-                        }
-                        var result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath, fs, entry.nativeURL) : new FileEntry(entry.name, entry.fullPath, fs, entry.nativeURL);
-                        successCallback(result);
-                    });
-                }
-            } else {
-                // no Entry object returned
-                fail(FileError.NOT_FOUND_ERR);
-            }
-        };
-
-        exec(success, fail, 'File', 'resolveLocalFileSystemURI', [uri]);
-    };
-
-    module.exports.resolveLocalFileSystemURI = function () {
-        console.log('resolveLocalFileSystemURI is deprecated. Please call resolveLocalFileSystemURL instead.');
-        module.exports.resolveLocalFileSystemURL.apply(this, arguments);
-    };
-})();
-
-});

+ 0 - 35
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/CaptureAudioOptions.js

@@ -1,35 +0,0 @@
-cordova.define("cordova-plugin-media-capture.CaptureAudioOptions", 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.
- *
-*/
-
-/**
- * Encapsulates all audio capture operation configuration options.
- */
-var CaptureAudioOptions = function () {
-    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
-    this.limit = 1;
-    // Maximum duration of a single sound clip in seconds.
-    this.duration = 0;
-};
-
-module.exports = CaptureAudioOptions;
-
-});

+ 0 - 45
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/CaptureError.js

@@ -1,45 +0,0 @@
-cordova.define("cordova-plugin-media-capture.CaptureError", 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 CaptureError interface encapsulates all errors in the Capture API.
- */
-var CaptureError = function (c) {
-    this.code = c || null;
-};
-
-// Camera or microphone failed to capture image or sound.
-CaptureError.CAPTURE_INTERNAL_ERR = 0;
-// Camera application or audio capture application is currently serving other capture request.
-CaptureError.CAPTURE_APPLICATION_BUSY = 1;
-// Invalid use of the API (e.g. limit parameter has value less than one).
-CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
-// User exited camera application or audio capture application before capturing anything.
-CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
-// User denied permissions required to perform the capture request.
-CaptureError.CAPTURE_PERMISSION_DENIED = 4;
-// The requested capture operation is not supported.
-CaptureError.CAPTURE_NOT_SUPPORTED = 20;
-
-module.exports = CaptureError;
-
-});

+ 0 - 33
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/CaptureImageOptions.js

@@ -1,33 +0,0 @@
-cordova.define("cordova-plugin-media-capture.CaptureImageOptions", 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.
- *
-*/
-
-/**
- * Encapsulates all image capture operation configuration options.
- */
-var CaptureImageOptions = function () {
-    // Upper limit of images user can take. Value must be equal or greater than 1.
-    this.limit = 1;
-};
-
-module.exports = CaptureImageOptions;
-
-});

+ 0 - 37
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/CaptureVideoOptions.js

@@ -1,37 +0,0 @@
-cordova.define("cordova-plugin-media-capture.CaptureVideoOptions", 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.
- *
-*/
-
-/**
- * Encapsulates all video capture operation configuration options.
- */
-var CaptureVideoOptions = function () {
-    // Upper limit of videos user can record. Value must be equal or greater than 1.
-    this.limit = 1;
-    // Maximum duration of a single video clip in seconds.
-    this.duration = 0;
-    // Video quality parameter, 0 means low quality, suitable for MMS messages, and value 1 means high quality.
-    this.quality = 1;
-};
-
-module.exports = CaptureVideoOptions;
-
-});

+ 0 - 58
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/MediaFile.js

@@ -1,58 +0,0 @@
-cordova.define("cordova-plugin-media-capture.MediaFile", 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');
-var exec = require('cordova/exec');
-var File = require('cordova-plugin-file.File');
-var CaptureError = require('./CaptureError');
-/**
- * Represents a single file.
- *
- * name {DOMString} name of the file, without path information
- * fullPath {DOMString} the full path of the file, including the name
- * type {DOMString} mime type
- * lastModifiedDate {Date} last modified date
- * size {Number} size of the file in bytes
- */
-var MediaFile = function (name, localURL, type, lastModifiedDate, size) {
-    MediaFile.__super__.constructor.apply(this, arguments);
-};
-
-utils.extend(MediaFile, File);
-
-/**
- * Request capture format data for a specific file and type
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- */
-MediaFile.prototype.getFormatData = function (successCallback, errorCallback) {
-    if (typeof this.fullPath === 'undefined' || this.fullPath === null) {
-        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
-    } else {
-        exec(successCallback, errorCallback, 'Capture', 'getFormatData', [this.fullPath, this.type]);
-    }
-};
-
-module.exports = MediaFile;
-
-});

+ 0 - 42
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/MediaFileData.js

@@ -1,42 +0,0 @@
-cordova.define("cordova-plugin-media-capture.MediaFileData", 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.
- *
-*/
-
-/**
- * MediaFileData encapsulates format information of a media file.
- *
- * @param {DOMString} codecs
- * @param {long} bitrate
- * @param {long} height
- * @param {long} width
- * @param {float} duration
- */
-var MediaFileData = function (codecs, bitrate, height, width, duration) {
-    this.codecs = codecs || null;
-    this.bitrate = bitrate || 0;
-    this.height = height || 0;
-    this.width = width || 0;
-    this.duration = duration || 0;
-};
-
-module.exports = MediaFileData;
-
-});

+ 0 - 47
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/android/init.js

@@ -1,47 +0,0 @@
-cordova.define("cordova-plugin-media-capture.init", 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 cordova = require('cordova');
-var helpers = require('./helpers');
-
-var SUCCESS_EVENT = 'pendingcaptureresult';
-var FAILURE_EVENT = 'pendingcaptureerror';
-
-var sChannel = cordova.addStickyDocumentEventHandler(SUCCESS_EVENT);
-var fChannel = cordova.addStickyDocumentEventHandler(FAILURE_EVENT);
-
-// We fire one of two events in the case where the activity gets killed while
-// the user is capturing audio, image, video, etc. in a separate activity
-document.addEventListener('deviceready', function () {
-    document.addEventListener('resume', function (event) {
-        if (event.pendingResult && event.pendingResult.pluginServiceName === 'Capture') {
-            if (event.pendingResult.pluginStatus === 'OK') {
-                var mediaFiles = helpers.wrapMediaFiles(event.pendingResult.result);
-                sChannel.fire(mediaFiles);
-            } else {
-                fChannel.fire(event.pendingResult.result);
-            }
-        }
-    });
-});
-
-});

+ 0 - 85
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/capture.js

@@ -1,85 +0,0 @@
-cordova.define("cordova-plugin-media-capture.capture", 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 helpers = require('./helpers');
-
-/**
- * Launches a capture of different types.
- *
- * @param (DOMString} type
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureVideoOptions} options
- */
-function _capture (type, successCallback, errorCallback, options) {
-    var win = function (pluginResult) {
-        successCallback(helpers.wrapMediaFiles(pluginResult));
-    };
-    exec(win, errorCallback, 'Capture', type, [options]);
-}
-
-/**
- * The Capture interface exposes an interface to the camera and microphone of the hosting device.
- */
-function Capture () {
-    this.supportedAudioModes = [];
-    this.supportedImageModes = [];
-    this.supportedVideoModes = [];
-}
-
-/**
- * Launch audio recorder application for recording audio clip(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureAudioOptions} options
- */
-Capture.prototype.captureAudio = function (successCallback, errorCallback, options) {
-    _capture('captureAudio', successCallback, errorCallback, options);
-};
-
-/**
- * Launch camera application for taking image(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureImageOptions} options
- */
-Capture.prototype.captureImage = function (successCallback, errorCallback, options) {
-    _capture('captureImage', successCallback, errorCallback, options);
-};
-
-/**
- * Launch device camera application for recording video(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureVideoOptions} options
- */
-Capture.prototype.captureVideo = function (successCallback, errorCallback, options) {
-    _capture('captureVideo', successCallback, errorCallback, options);
-};
-
-module.exports = new Capture();
-
-});

+ 0 - 47
platforms/android/app/src/main/assets/www/plugins/cordova-plugin-media-capture/www/helpers.js

@@ -1,47 +0,0 @@
-cordova.define("cordova-plugin-media-capture.helpers", 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 MediaFile = require('./MediaFile');
-
-function wrapMediaFiles (pluginResult) {
-    var mediaFiles = [];
-    var i;
-    for (i = 0; i < pluginResult.length; i++) {
-        var mediaFile = new MediaFile();
-        mediaFile.name = pluginResult[i].name;
-
-        // Backwards compatibility
-        mediaFile.localURL = pluginResult[i].localURL || pluginResult[i].fullPath;
-        mediaFile.fullPath = pluginResult[i].fullPath;
-        mediaFile.type = pluginResult[i].type;
-        mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
-        mediaFile.size = pluginResult[i].size;
-        mediaFiles.push(mediaFile);
-    }
-    return mediaFiles;
-}
-
-module.exports = {
-    wrapMediaFiles: wrapMediaFiles
-};
-
-});

File diff suppressed because it is too large
+ 0 - 0
platforms/android/app/src/main/assets/www/static/css/app.a7d19b57.css


File diff suppressed because it is too large
+ 0 - 0
platforms/android/app/src/main/assets/www/static/js/app.e5c82ec7.js


File diff suppressed because it is too large
+ 0 - 0
platforms/android/app/src/main/assets/www/static/js/chunk-vendors.e36198ac.js


+ 0 - 41
platforms/android/app/src/main/java/io/cordova/hellocordova/MainActivity.java

@@ -1,41 +0,0 @@
-/*
-       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 io.cordova.hellocordova;
-
-import android.os.Bundle;
-import org.apache.cordova.*;
-
-public class MainActivity extends CordovaActivity
-{
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-
-        // enable Cordova apps to be started in the background
-        Bundle extras = getIntent().getExtras();
-        if (extras != null && extras.getBoolean("cdvStartInBackground", false)) {
-            moveTaskToBack(true);
-        }
-
-        // Set by <content src="index.html" /> in config.xml
-        loadUrl(launchUrl);
-    }
-}

+ 0 - 294
platforms/android/app/src/main/java/org/apache/cordova/file/AssetFilesystem.java

@@ -1,294 +0,0 @@
-/*
-       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 org.apache.cordova.CordovaResourceApi;
-import org.apache.cordova.LOG;
-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<String, String[]> listCache;
-    private static Map<String, Long> lengthCache;
-
-    private static final String LOG_TAG = "AssetFilesystem";
-
-    private void lazyInitCaches() {
-        synchronized (listCacheLock) {
-            if (listCache == null) {
-                ObjectInputStream ois = null;
-                try {
-                    ois = new ObjectInputStream(assetManager.open("cdvasset.manifest"));
-                    listCache = (Map<String, String[]>) ois.readObject();
-                    lengthCache = (Map<String, Long>) 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) {
-                            LOG.d(LOG_TAG, e.getLocalizedMessage());
-                        }
-                    }
-                }
-                if (listCache == null) {
-                    LOG.w("AssetFilesystem", "Asset manifest not found. Recursive copies and directory listing will be slow.");
-                    listCache = new HashMap<String, String[]>();
-                }
-            }
-        }
-    }
-
-    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) {
-            FileNotFoundException fnfe = new FileNotFoundException("File not found: " + assetPath);
-            fnfe.initCause(e);
-            throw fnfe;
-        } finally {
-            if (offr != null) {
-                try {
-                    offr.inputStream.close();
-                } catch (IOException e) {
-                    LOG.d(LOG_TAG, e.getLocalizedMessage());
-                }
-            }
-        }
-    }
-
-    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) {
-            FileNotFoundException fnfe = new FileNotFoundException();
-            fnfe.initCause(e);
-            throw fnfe;
-        }
-
-        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 new File(rootUri.getPath(), url.path).toString();
-    }
-
-    @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");
-    }
-
-}

Some files were not shown because too many files changed in this diff