diff --git a/bin/templates/cordova/lib/config/GradlePropertiesParser.js b/bin/templates/cordova/lib/config/GradlePropertiesParser.js index 8955aa94..2c8aaa8d 100644 --- a/bin/templates/cordova/lib/config/GradlePropertiesParser.js +++ b/bin/templates/cordova/lib/config/GradlePropertiesParser.js @@ -37,8 +37,8 @@ class GradlePropertiesParser { 'org.gradle.jvmargs': '-Xmx2048m', // Android X - 'android.useAndroidX': 'false', - 'android.enableJetifier': 'false' + 'android.useAndroidX': 'true', + 'android.enableJetifier': 'true' // Shaves another 100ms, but produces a "try at own risk" warning. Not worth it (yet): // 'org.gradle.parallel': 'true' diff --git a/bin/templates/cordova/lib/prepare.js b/bin/templates/cordova/lib/prepare.js index 17cbf6f2..c4e9acb2 100644 --- a/bin/templates/cordova/lib/prepare.js +++ b/bin/templates/cordova/lib/prepare.js @@ -59,7 +59,6 @@ module.exports.prepare = function (cordovaProject, options) { const minSdkVersion = this._config.getPreference('android-minSdkVersion', 'android'); const maxSdkVersion = this._config.getPreference('android-maxSdkVersion', 'android'); const targetSdkVersion = this._config.getPreference('android-targetSdkVersion', 'android'); - const androidXEnabled = this._config.getPreference('AndroidXEnabled', 'android'); const isGradlePluginKotlinEnabled = this._config.getPreference('GradlePluginKotlinEnabled', 'android'); const gradlePluginKotlinCodeStyle = this._config.getPreference('GradlePluginKotlinCodeStyle', 'android'); @@ -72,12 +71,6 @@ module.exports.prepare = function (cordovaProject, options) { gradlePropertiesUserConfig['kotlin.code.style'] = gradlePluginKotlinCodeStyle || 'official'; } - // Both 'useAndroidX' and 'enableJetifier' are linked together. - if (androidXEnabled) { - gradlePropertiesUserConfig['android.useAndroidX'] = androidXEnabled; - gradlePropertiesUserConfig['android.enableJetifier'] = androidXEnabled; - } - const gradlePropertiesParser = new GradlePropertiesParser(this.locations.root); gradlePropertiesParser.configure(gradlePropertiesUserConfig); diff --git a/bin/templates/project/AndroidManifest.xml b/bin/templates/project/AndroidManifest.xml index fc328ab0..21da8bfc 100644 --- a/bin/templates/project/AndroidManifest.xml +++ b/bin/templates/project/AndroidManifest.xml @@ -35,7 +35,7 @@ diff --git a/bin/templates/project/app/build.gradle b/bin/templates/project/app/build.gradle index 022bb895..4ff458ba 100644 --- a/bin/templates/project/app/build.gradle +++ b/bin/templates/project/app/build.gradle @@ -339,6 +339,7 @@ android { dependencies { implementation fileTree(dir: 'libs', include: '*.jar') + implementation 'androidx.appcompat:appcompat:1.2.0' if (cdvHelpers.getConfigPreference('GradlePluginKotlinEnabled', 'false').toBoolean()) { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/framework/build.gradle b/framework/build.gradle index 9a028997..5970f621 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -122,6 +122,10 @@ task sourcesJar(type: Jar) { classifier = 'sources' } +dependencies { + implementation 'androidx.appcompat:appcompat:1.2.0' +} + artifacts { archives sourcesJar } diff --git a/framework/src/org/apache/cordova/CordovaActivity.java b/framework/src/org/apache/cordova/CordovaActivity.java index 9b15e336..4a436202 100755 --- a/framework/src/org/apache/cordova/CordovaActivity.java +++ b/framework/src/org/apache/cordova/CordovaActivity.java @@ -24,7 +24,6 @@ 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; @@ -32,7 +31,6 @@ 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; @@ -43,6 +41,8 @@ import android.view.WindowManager; import android.webkit.WebViewClient; import android.widget.FrameLayout; +import androidx.appcompat.app.AppCompatActivity; + /** * This class is the main Android activity that represents the Cordova * application. It should be extended by the user to load the specific @@ -74,7 +74,7 @@ import android.widget.FrameLayout; * deprecated in favor of the config.xml file. * */ -public class CordovaActivity extends Activity { +public class CordovaActivity extends AppCompatActivity { public static String TAG = "CordovaActivity"; // The webview for our app diff --git a/framework/src/org/apache/cordova/CordovaInterface.java b/framework/src/org/apache/cordova/CordovaInterface.java index 7661b742..53d03a5c 100755 --- a/framework/src/org/apache/cordova/CordovaInterface.java +++ b/framework/src/org/apache/cordova/CordovaInterface.java @@ -18,11 +18,10 @@ */ package org.apache.cordova; -import android.app.Activity; import android.content.Context; import android.content.Intent; -import org.apache.cordova.CordovaPlugin; +import androidx.appcompat.app.AppCompatActivity; import java.util.concurrent.ExecutorService; @@ -56,7 +55,7 @@ public interface CordovaInterface { * * @return the Activity */ - public abstract Activity getActivity(); + public abstract AppCompatActivity getActivity(); /** * Get the Android context. diff --git a/framework/src/org/apache/cordova/CordovaInterfaceImpl.java b/framework/src/org/apache/cordova/CordovaInterfaceImpl.java index 9a6e9245..84e2c0a4 100644 --- a/framework/src/org/apache/cordova/CordovaInterfaceImpl.java +++ b/framework/src/org/apache/cordova/CordovaInterfaceImpl.java @@ -20,7 +20,6 @@ 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; @@ -28,6 +27,8 @@ import android.os.Build; import android.os.Bundle; import android.util.Pair; +import androidx.appcompat.app.AppCompatActivity; + import org.json.JSONException; import org.json.JSONObject; @@ -39,7 +40,7 @@ import java.util.concurrent.Executors; */ public class CordovaInterfaceImpl implements CordovaInterface { private static final String TAG = "CordovaInterfaceImpl"; - protected Activity activity; + protected AppCompatActivity activity; protected ExecutorService threadPool; protected PluginManager pluginManager; @@ -51,11 +52,11 @@ public class CordovaInterfaceImpl implements CordovaInterface { protected boolean activityWasDestroyed = false; protected Bundle savedPluginState; - public CordovaInterfaceImpl(Activity activity) { + public CordovaInterfaceImpl(AppCompatActivity activity) { this(activity, Executors.newCachedThreadPool()); } - public CordovaInterfaceImpl(Activity activity, ExecutorService threadPool) { + public CordovaInterfaceImpl(AppCompatActivity activity, ExecutorService threadPool) { this.activity = activity; this.threadPool = threadPool; this.permissionResultCallbacks = new CallbackMap(); @@ -76,13 +77,13 @@ public class CordovaInterfaceImpl implements CordovaInterface { public void setActivityResultCallback(CordovaPlugin plugin) { // Cancel any previously pending activity. if (activityResultCallback != null) { - activityResultCallback.onActivityResult(activityResultRequestCode, Activity.RESULT_CANCELED, null); + activityResultCallback.onActivityResult(activityResultRequestCode, AppCompatActivity.RESULT_CANCELED, null); } activityResultCallback = plugin; } @Override - public Activity getActivity() { + public AppCompatActivity getActivity() { return activity; } diff --git a/test/android/README.md b/test/android/README.md deleted file mode 100644 index a6c62f55..00000000 --- a/test/android/README.md +++ /dev/null @@ -1,60 +0,0 @@ - - -# Cordova Android Test Project - -The project in this directory is an Android Test project that enables those -interested in further developing `cordova-android` to validate their changes. - -## Requirements - -The requirements in the [top-level README](../README.md) still apply. In -addition, ensure you have installed Gradle, and that it is (at the time of this -writing) at least version 3.3 or newer. - -## Getting Started - -You can run this test project from both the command line as well as from -Android Studio: - -### Command Line - -Ensure you have the gradle wrapper script, `gradlew`, in this directory. If -you do not, you can run the following to generate it: - - $ cd cordova-android/test - $ gradle :wrapper -b build.gradle - -You can then see a list of all tasks available to run with `gradlew tasks`. - -The two different kinds of tests one typically wants to run are unit tests and -end-to-end, or instrumented, tests. Unit tests do not require any particular -environment to run in, but the instrumented tests, however, require a connected -Android device or emulator to run in. - -- To run the unit tests, run: `gradlew test`. -- To run the instrumented tests, run: `gradlew connectedAndroidTest`. - -To make sure all tests are run, add the `--rerun-tasks` parameter. - -### Android Studio - -Import this `test/` directory into Android Studio, and hit the Play button. diff --git a/test/android/app/.gitignore b/test/android/app/.gitignore deleted file mode 100644 index 796b96d1..00000000 --- a/test/android/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/test/android/app/build.gradle b/test/android/app/build.gradle deleted file mode 100644 index bb1bc19c..00000000 --- a/test/android/app/build.gradle +++ /dev/null @@ -1,61 +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' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - applicationId "org.apache.cordova.unittests" - minSdkVersion 22 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation project(path: ':CordovaLib') - androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - androidTestImplementation('com.android.support.test.espresso:espresso-web:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - implementation 'com.android.support:appcompat-v7:26.1.0' - testImplementation 'junit:junit:4.12' - testImplementation 'org.json:json:20140107' - - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -} -repositories { - jcenter() -} diff --git a/test/android/app/proguard-rules.pro b/test/android/app/proguard-rules.pro deleted file mode 100644 index fa4b7eba..00000000 --- a/test/android/app/proguard-rules.pro +++ /dev/null @@ -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. -# - -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/jbowser/Library/Android/sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/BackButtonMultipageTest.java b/test/android/app/src/androidTest/java/org/apache/cordova/unittests/BackButtonMultipageTest.java deleted file mode 100644 index e1c7f058..00000000 --- a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/BackButtonMultipageTest.java +++ /dev/null @@ -1,165 +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.unittests; - -import android.content.Intent; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import org.apache.cordova.CordovaWebView; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.pressBack; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.web.sugar.Web.onWebView; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - - -import static org.apache.cordova.unittests.R.id.cordovaWebView; - - -@RunWith(AndroidJUnit4.class) -public class BackButtonMultipageTest { - - private static final String START_URL = "file:///android_asset/www/backbuttonmultipage/index.html"; - private static final String SAMPLE3_URL = "file:///android_asset/www/backbuttonmultipage/sample3.html"; - private static final String SAMPLE2_URL = "file:///android_asset/www/backbuttonmultipage/sample2.html"; - //I have no idea why we picked 100, but we did. - private static final int WEBVIEW_ID = 100; - private TestActivity mActivity; - - // Don't launch the activity, we're going to send it intents - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - TestActivity.class, true, false); - - @Before - public void launchApplicationWithIntent() { - Intent intent = new Intent(); - intent.putExtra("startUrl", START_URL); - mActivity = (TestActivity) mActivityRule.launchActivity(intent); - } - - @Test - public void testViaHref() throws Throwable { - final CordovaWebView webInterface = mActivity.getWebInterface(); - assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); - - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - webInterface.sendJavascript("window.location = 'sample2.html';"); - } - }); - assertPageSample(SAMPLE2_URL); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - webInterface.sendJavascript("window.location = 'sample3.html';"); - } - }); - assertPageSample(SAMPLE3_URL); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - assertTrue(webInterface.backHistory()); - } - }); - assertPageSample(SAMPLE2_URL); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - assertTrue(webInterface.backHistory()); - } - }); - assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - assertFalse(webInterface.backHistory()); - } - }); - } - - @Test - public void testViaLoadUrl() throws Throwable { - final CordovaWebView webInterface = mActivity.getWebInterface(); - assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); - - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - webInterface.loadUrl(SAMPLE2_URL); - } - }); - assertPageSample(SAMPLE2_URL); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - webInterface.loadUrl(SAMPLE3_URL); - } - }); - assertPageSample(SAMPLE3_URL); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - assertTrue(webInterface.backHistory()); - } - }); - assertPageSample(SAMPLE2_URL); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - assertTrue(webInterface.backHistory()); - } - }); - assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - assertFalse(webInterface.backHistory()); - } - }); - } - - @Test - public void testViaBackButtonOnView() throws Throwable { - final CordovaWebView webInterface = mActivity.getWebInterface(); - assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); - - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - webInterface.loadUrl(SAMPLE2_URL); - } - }); - assertPageSample(SAMPLE2_URL); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - webInterface.loadUrl(SAMPLE3_URL); - } - }); - assertPageSample(SAMPLE3_URL); - onView(withId(WEBVIEW_ID)).perform(pressBack()); - assertPageSample(SAMPLE2_URL); - onView(withId(WEBVIEW_ID)).perform(pressBack()); - assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); - } - - private void assertPageSample(String url) { - assertEquals(url, mActivity.onPageFinishedUrl.take()); - } - -} diff --git a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/EmbeddedWebViewTest.java b/test/android/app/src/androidTest/java/org/apache/cordova/unittests/EmbeddedWebViewTest.java deleted file mode 100644 index 07933778..00000000 --- a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/EmbeddedWebViewTest.java +++ /dev/null @@ -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.unittests; - -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static junit.framework.Assert.assertNotNull; - -/* - * This test is to cover the use case of Cordova Android used as a component in a larger Android - * application. This test is strictly used to cover this use case. In this example, the WebView - * should load, not be null, and the Plugin Manager should also be initialized. - * - - */ - - -@RunWith(AndroidJUnit4.class) -public class EmbeddedWebViewTest { - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - EmbeddedWebViewActivity.class); - - @Test - public void checkWebViewTest() { - EmbeddedWebViewActivity activity = (EmbeddedWebViewActivity) mActivityRule.getActivity(); - assertNotNull(activity.webInterface); - assertNotNull(activity.webInterface.getPluginManager()); - } -} diff --git a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/ErrorUrlTest.java b/test/android/app/src/androidTest/java/org/apache/cordova/unittests/ErrorUrlTest.java deleted file mode 100644 index 7300d7c5..00000000 --- a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/ErrorUrlTest.java +++ /dev/null @@ -1,68 +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.unittests; - -import android.content.Intent; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import org.apache.cordova.CordovaWebView; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static junit.framework.Assert.assertEquals; - -@RunWith(AndroidJUnit4.class) -public class ErrorUrlTest { - private static final String START_URL = "file:///android_asset/www/htmlnotfound/index.html"; - private static final String ERROR_URL = "file:///android_asset/www/htmlnotfound/error.html"; - private static final String INVALID_URL = "file:///android_asset/www/invalid.html"; - - //I have no idea why we picked 100, but we did. - private static final int WEBVIEW_ID = 100; - private TestActivity mActivity; - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - TestActivity.class); - - @Before - public void launchApplicationWithIntent() { - Intent intent = new Intent(); - intent.putExtra("startUrl", START_URL); - intent.putExtra("errorurl", INVALID_URL); - intent.putExtra("url", INVALID_URL); - mActivity = (TestActivity) mActivityRule.launchActivity(intent); - } - - @Test - public void errorUrlTest() throws Throwable { - assertEquals(START_URL, mActivity.onPageFinishedUrl.take()); - assertEquals(ERROR_URL, mActivity.onPageFinishedUrl.take()); - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - assertEquals(ERROR_URL, mActivity.getWebInterface().getUrl()); - } - }); - } -} diff --git a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/IFrameTest.java b/test/android/app/src/androidTest/java/org/apache/cordova/unittests/IFrameTest.java deleted file mode 100644 index f3f66d73..00000000 --- a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/IFrameTest.java +++ /dev/null @@ -1,114 +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.unittests; - -import android.content.Intent; -import android.support.test.espresso.web.webdriver.Locator; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import org.apache.cordova.CordovaWebView; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.pressBack; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.web.sugar.Web.onWebView; -import static android.support.test.espresso.web.webdriver.DriverAtoms.findElement; -import static android.support.test.espresso.web.webdriver.DriverAtoms.webClick; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; - -@RunWith(AndroidJUnit4.class) -public class IFrameTest { - - private static final String START_URL = "file:///android_asset/www/iframe/index.html"; - //I have no idea why we picked 100, but we did. - private static final int WEBVIEW_ID = 100; - private int WEBVIEW_LOAD_DELAY = 500; - - private TestActivity testActivity; - - // Don't launch the activity, we're going to send it intents - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - TestActivity.class, true, false); - - @Before - public void launchApplicationWithIntent() { - Intent intent = new Intent(); - intent.putExtra("startUrl", START_URL); - testActivity = (TestActivity) mActivityRule.launchActivity(intent); - } - - @Test - public void iFrameHistory() throws Throwable { - final CordovaWebView cordovaWebView = (CordovaWebView) testActivity.getWebInterface(); - onWebView().withElement(findElement(Locator.ID, "google_maps")).perform(webClick()); - sleep(WEBVIEW_LOAD_DELAY); - mActivityRule.runOnUiThread(new Runnable() { - public void run() - { - String url = cordovaWebView.getUrl(); - assertTrue(url.endsWith("index.html")); - } - }); - sleep(WEBVIEW_LOAD_DELAY); - onWebView().withElement(findElement(Locator.ID, "javascript_load")).perform(webClick()); - mActivityRule.runOnUiThread(new Runnable() { - public void run() - { - String url = cordovaWebView.getUrl(); - assertTrue(url.endsWith("index.html")); - } - }); - sleep(WEBVIEW_LOAD_DELAY); - //Espresso will kill the application and not trigger the backHistory method, which correctly - //navigates the iFrame history. backHistory is tied to the back button. - mActivityRule.runOnUiThread(new Runnable() { - public void run() - { - assertTrue(cordovaWebView.backHistory()); - String url = cordovaWebView.getUrl(); - assertTrue(url.endsWith("index.html")); - assertFalse(cordovaWebView.backHistory()); - } - }); - - } - - - //BRUTE FORCE THE CRAP OUT OF CONCURRENCY ERRORS - private void sleep(int timeout) { - try { - Thread.sleep(timeout); - } catch (InterruptedException e) { - fail("Unexpected Timeout"); - } - } - -} diff --git a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/MessageChannelMultipageTest.java b/test/android/app/src/androidTest/java/org/apache/cordova/unittests/MessageChannelMultipageTest.java deleted file mode 100644 index 65971560..00000000 --- a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/MessageChannelMultipageTest.java +++ /dev/null @@ -1,130 +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.unittests; - -import android.content.Intent; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import org.apache.cordova.CallbackContext; -import org.apache.cordova.CordovaWebView; -import org.apache.cordova.CordovaWebViewImpl; -import org.apache.cordova.PluginManager; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.fail; - -@RunWith(AndroidJUnit4.class) -public class MessageChannelMultipageTest { - private static final String START_URL = "file:///android_asset/www/backbuttonmultipage/index.html"; - //I have no idea why we picked 100, but we did. - private static final int WEBVIEW_ID = 100; - private TestActivity testActivity; - - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - TestActivity.class); - - @Before - public void launchApplicationWithIntent() { - Intent intent = new Intent(); - intent.putExtra("startUrl", START_URL); - testActivity = (TestActivity) mActivityRule.launchActivity(intent); - } - - - - //test that after a page load the cached callback id and the live callback id match - //this is to prevent a regression - //the issue was that CordovaWebViewImpl's cached instance of CoreAndroid would become stale on page load - //this is because the cached instance was not being cleared when the pluginManager was reset on page load - //the plugin manager would get a new instance which would be updated with a new callback id - //the cached instance's message channel callback id would become stale - //effectively this caused message channel events to not be delivered - @Test - public void testThatCachedCallbackIdIsValid() throws Throwable { - final CordovaWebView cordovaWebView = testActivity.getWebInterface(); - Class cordovaWebViewImpl = CordovaWebViewImpl.class; - //send a test event - this initializes cordovaWebViewImpl.appPlugin (the cached instance of CoreAndroid) - Method method = cordovaWebViewImpl.getDeclaredMethod("sendJavascriptEvent", String.class); - method.setAccessible(true); - method.invoke(cordovaWebView, "testEvent"); - sleep(1000); - - //load a page - this resets the plugin manager and nulls cordovaWebViewImpl.appPlugin - //(previously this resets plugin manager but did not null cordovaWebViewImpl.appPlugin, leading to the issue) - mActivityRule.runOnUiThread(new Runnable() { - public void run() { - cordovaWebView.loadUrl(START_URL); - } - }); - assertEquals(START_URL, testActivity.onPageFinishedUrl.take()); - - //send a test event - this initializes cordovaWebViewImpl.appPlugin (the cached instance of CoreAndroid) - method.invoke(cordovaWebView, "testEvent"); - sleep(1000); - - //get reference to package protected class CoreAndroid - Class coreAndroid = Class.forName("org.apache.cordova.CoreAndroid"); - - //get cached CoreAndroid - Field appPluginField = cordovaWebViewImpl.getDeclaredField("appPlugin"); - appPluginField.setAccessible(true); - Object cachedAppPlugin = appPluginField.get(cordovaWebView); - //get cached CallbackContext - Field messageChannelField = coreAndroid.getDeclaredField("messageChannel"); - messageChannelField.setAccessible(true); - CallbackContext cachedCallbackContext = (CallbackContext) messageChannelField.get(cachedAppPlugin); - - //get live CoreAndroid - PluginManager pluginManager = cordovaWebView.getPluginManager(); - Field coreAndroidPluginNameField = coreAndroid.getField("PLUGIN_NAME"); - String coreAndroidPluginName = (String) coreAndroidPluginNameField.get(null); - Object liveAppPlugin = pluginManager.getPlugin(coreAndroidPluginName); - //get live CallbackContext - CallbackContext liveCallbackContext = (CallbackContext) messageChannelField.get(liveAppPlugin); - - //get callback id from live callbackcontext - String liveCallbackId = (liveCallbackContext != null) ? liveCallbackContext.getCallbackId() : null; - //get callback id from cached callbackcontext - String cachedCallbackId = (cachedCallbackContext != null) ? cachedCallbackContext.getCallbackId() : null; - - //verify that the live message channel has been initialized - assertNotNull(liveCallbackId); - //verify that the cached message channel and the live message channel have the same id - assertEquals(liveCallbackId, cachedCallbackId); - } - - private void sleep(int timeout) { - try { - Thread.sleep(timeout); - } catch (InterruptedException e) { - fail("Unexpected Timeout"); - } - } -} diff --git a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/StandardActivityTest.java b/test/android/app/src/androidTest/java/org/apache/cordova/unittests/StandardActivityTest.java deleted file mode 100644 index f7162d56..00000000 --- a/test/android/app/src/androidTest/java/org/apache/cordova/unittests/StandardActivityTest.java +++ /dev/null @@ -1,100 +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.unittests; - -import android.content.Intent; -import android.graphics.Color; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; -import android.view.View; -import android.widget.LinearLayout; - -import org.apache.cordova.CordovaPreferences; -import org.apache.cordova.CordovaWebView; -import org.apache.cordova.engine.SystemWebView; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertNotSame; -import static junit.framework.Assert.assertTrue; - -/** - * The purpose of this test is to test the default application that is generated by Cordova itself - * - */ -@RunWith(AndroidJUnit4.class) -public class StandardActivityTest { - - private static final String FALSE_URI = "http://www.google.com"; - - // Don't launch the activity, we're going to send it intents - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>( - StandardActivity.class, true, false); - - @Before - public void launchApplicationWithIntent() { - Intent intent = new Intent(); - intent.putExtra("startUrl", FALSE_URI); - intent.putExtra("backgroundcolor", "#0000ff"); - mActivityRule.launchActivity(intent); - } - - - @Test - public void webViewCheck() { - StandardActivity activity = (StandardActivity) mActivityRule.getActivity(); - //Fish the webview out of the mostly locked down Activity using the Android SDK - View view = activity.getWindow().getCurrentFocus(); - assertEquals(SystemWebView.class, view.getClass()); - } - - @Test - public void startUriIntentCheck() { - StandardActivity activity = (StandardActivity) mActivityRule.getActivity(); - final SystemWebView webView = (SystemWebView) activity.getWindow().getCurrentFocus(); - try { - mActivityRule.runOnUiThread(new Runnable() { - @Override - public void run() { - String uri = webView.getUrl(); - assertFalse(uri.equals(FALSE_URI)); - } - }); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - - @Test - public void checkBackgroundIntentCheck() { - StandardActivity activity = (StandardActivity) mActivityRule.getActivity(); - final SystemWebView webView = (SystemWebView) activity.getWindow().getCurrentFocus(); - CordovaWebView webInterface = webView.getCordovaWebView(); - CordovaPreferences prefs = webInterface.getPreferences(); - assertFalse(prefs.getInteger("backgroundcolor", Color.BLACK) == Color.GREEN); - } - -} diff --git a/test/android/app/src/main/AndroidManifest.xml b/test/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 9d404fe6..00000000 --- a/test/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/android/app/src/main/assets/www/backbuttonmultipage/index.html b/test/android/app/src/main/assets/www/backbuttonmultipage/index.html deleted file mode 100755 index 8739aa0e..00000000 --- a/test/android/app/src/main/assets/www/backbuttonmultipage/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - -Backbutton - - - - - -

Cordova Android Tests

-
-

Cordova:  

-

Deviceready:  

-
-
-

Page 1

- Go to next page.
- If returning from previous page, press "backbutton". You should exit this app. -
- Next page - - diff --git a/test/android/app/src/main/assets/www/backbuttonmultipage/sample2.html b/test/android/app/src/main/assets/www/backbuttonmultipage/sample2.html deleted file mode 100755 index 0b5be64c..00000000 --- a/test/android/app/src/main/assets/www/backbuttonmultipage/sample2.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - -Backbutton - - - - - -

Cordova Android Tests

-
-

Cordova:  

-

Deviceready:  

-
-
-

Page 2

- Go to next page.
- If returning from previous page, press "backbutton". You should go to Page 1. -
- Next page - - diff --git a/test/android/app/src/main/assets/www/backbuttonmultipage/sample3.html b/test/android/app/src/main/assets/www/backbuttonmultipage/sample3.html deleted file mode 100755 index 7aa1e3b4..00000000 --- a/test/android/app/src/main/assets/www/backbuttonmultipage/sample3.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - -Backbutton - - - - - -

Cordova Android Tests

-
-

Cordova:  

-

Deviceready:  

-
-
-

Page 3

- Press the 3 buttons below. You should stay on same page.
- Press "backbutton" 4 times. This will go back to #test3, #test2, #test1, then return to previous Page 2.
-
- page3#test1 - page3#test2 - page3#test3 - - diff --git a/test/android/app/src/main/assets/www/backgroundcolor/index.html b/test/android/app/src/main/assets/www/backgroundcolor/index.html deleted file mode 100755 index 3b09d648..00000000 --- a/test/android/app/src/main/assets/www/backgroundcolor/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - Cordova Tests - - - - - -

Background Color Test

-
-

Cordova:  

-

Deviceready:  

-
-
- Before this page was show, you should have seen the background flash green.
-
- - diff --git a/test/android/app/src/main/assets/www/cordova.js b/test/android/app/src/main/assets/www/cordova.js deleted file mode 100644 index 11da9eb0..00000000 --- a/test/android/app/src/main/assets/www/cordova.js +++ /dev/null @@ -1,2206 +0,0 @@ -// Platform: android -// 7c5fcc5a5adfbf3fb8ceaf36fbdd4bd970bd9c20 -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT 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 = '6.2.0-dev'; -// file: src/scripts/require.js - - -var require, - define; - -(function () { - var modules = {}, - // Stack of moduleIds currently being built. - requireStack = [], - // Map of module ID -> index into requireStack of modules currently being built. - inProgressModules = {}, - SEPARATOR = "."; - - - - function build(module) { - var factory = module.factory, - 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 "module " + id + " not found"; - } else if (id in inProgressModules) { - var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; - throw "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 (modules[id]) { - throw "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 = {}, - 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 (data.hasOwnProperty(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; - console && console.log && console.log(msg); - cordova.fireWindowEvent("cordovacallbackerror", { 'message': msg }); - throw err; - } - }, - addConstructor: function(func) { - channel.onCordovaReady.subscribe(function() { - try { - func(); - } catch(e) { - console.log("Failed to run constructor: " + e); - } - }); - } -}; - - -module.exports = cordova; - -}); - -// file: /Users/steveng/repo/cordova/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: /Users/steveng/repo/cordova/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 (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex]; -} - -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), - cUpper = c.toUpperCase(), - 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 = typeof atob != 'undefined' ? atob(str) : new Buffer(str,'base64').toString('binary'); - 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> 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 (objects.hasOwnProperty(prop)) { - func.apply(context, [objects[prop], prop]); - } - } -} - -function clobber(obj, key, value) { - exports.replaceHookForTesting(obj, key); - 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 (src.hasOwnProperty(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; -exports.replaceHookForTesting = function() {}; - -}); - -// file: src/common/channel.js -define("cordova/channel", function(require, exports, module) { - -var utils = require('cordova/utils'), - 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; -}, - 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, - i = len, - f = function() { - if (!(--i)) h(); - }; - for (var j=0; jNative bridge. - POLLING: 0, - // For LOAD_URL to be viable, it would need to have a work-around for - // the bug where the soft-keyboard gets dismissed when a message is sent. - LOAD_URL: 1, - // For the ONLINE_EVENT to be viable, it would need to intercept all event - // listeners (both through addEventListener and window.ononline) as well - // as set the navigator property itself. - ONLINE_EVENT: 2, - EVAL_BRIDGE: 3 - }, - jsToNativeBridgeMode, // Set lazily. - nativeToJsBridgeMode = nativeToJsModes.EVAL_BRIDGE, - pollEnabled = false, - bridgeSecret = -1; - -var messagesFromNative = []; -var isProcessing = false; -var resolvedPromise = typeof Promise == 'undefined' ? null : Promise.resolve(); -var nextTick = resolvedPromise ? function(fn) { resolvedPromise.then(fn); } : function(fn) { setTimeout(fn); }; - -function androidExec(success, fail, service, action, args) { - if (bridgeSecret < 0) { - // If we ever catch this firing, we'll need to queue up exec()s - // and fire them once we get a secret. For now, I don't think - // it's possible for exec() to be called since plugins are parsed but - // not run until until after onNativeReady. - throw new Error('exec() called without bridgeSecret'); - } - // Set default bridge modes if they have not already been set. - // By default, we use the failsafe, since addJavascriptInterface breaks too often - if (jsToNativeBridgeMode === undefined) { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - } - - // If args is not provided, default to an empty array - args = args || []; - - // Process any ArrayBuffers in the args into a string. - for (var i = 0; i < args.length; i++) { - if (utils.typeName(args[i]) == 'ArrayBuffer') { - args[i] = base64.fromArrayBuffer(args[i]); - } - } - - var callbackId = service + cordova.callbackId++, - argsJson = JSON.stringify(args); - if (success || fail) { - cordova.callbacks[callbackId] = {success:success, fail:fail}; - } - - var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson); - // If argsJson was received by Java as null, try again with the PROMPT bridge mode. - // This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666. - if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && msgs === "@Null arguments.") { - androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT); - androidExec(success, fail, service, action, args); - androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); - } else if (msgs) { - messagesFromNative.push(msgs); - // Always process async to avoid exceptions messing up stack. - nextTick(processMessages); - } -} - -androidExec.init = function() { - //CB-11828 - //This failsafe checks the version of Android and if it's Jellybean, it switches it to - //using the Online Event bridge for communicating from Native to JS - // - //It's ugly, but it's necessary. - var check = navigator.userAgent.toLowerCase().match(/android\s[0-9].[0-9]/); - var version_code = check && check[0].match(/4.[0-3].*/); - if (version_code != null && nativeToJsBridgeMode == nativeToJsModes.EVAL_BRIDGE) { - nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT; - } - - bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode); - channel.onNativeReady.fire(); -}; - -function pollOnceFromOnlineEvent() { - pollOnce(true); -} - -function pollOnce(opt_fromOnlineEvent) { - if (bridgeSecret < 0) { - // This can happen when the NativeToJsMessageQueue resets the online state on page transitions. - // We know there's nothing to retrieve, so no need to poll. - return; - } - var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent); - if (msgs) { - messagesFromNative.push(msgs); - // Process sync since we know we're already top-of-stack. - processMessages(); - } -} - -function pollingTimerFunc() { - if (pollEnabled) { - pollOnce(); - setTimeout(pollingTimerFunc, 50); - } -} - -function hookOnlineApis() { - function proxyEvent(e) { - cordova.fireWindowEvent(e.type); - } - // The network module takes care of firing online and offline events. - // It currently fires them only on document though, so we bridge them - // to window here (while first listening for exec()-releated online/offline - // events). - window.addEventListener('online', pollOnceFromOnlineEvent, false); - window.addEventListener('offline', pollOnceFromOnlineEvent, false); - cordova.addWindowEventHandler('online'); - cordova.addWindowEventHandler('offline'); - document.addEventListener('online', proxyEvent, false); - document.addEventListener('offline', proxyEvent, false); -} - -hookOnlineApis(); - -androidExec.jsToNativeModes = jsToNativeModes; -androidExec.nativeToJsModes = nativeToJsModes; - -androidExec.setJsToNativeBridgeMode = function(mode) { - if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { - mode = jsToNativeModes.PROMPT; - } - nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); - jsToNativeBridgeMode = mode; -}; - -androidExec.setNativeToJsBridgeMode = function(mode) { - if (mode == nativeToJsBridgeMode) { - return; - } - if (nativeToJsBridgeMode == nativeToJsModes.POLLING) { - pollEnabled = false; - } - - nativeToJsBridgeMode = mode; - // Tell the native side to switch modes. - // Otherwise, it will be set by androidExec.init() - if (bridgeSecret >= 0) { - nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode); - } - - if (mode == nativeToJsModes.POLLING) { - pollEnabled = true; - setTimeout(pollingTimerFunc, 1); - } -}; - -function buildPayload(payload, message) { - var payloadKind = message.charAt(0); - if (payloadKind == 's') { - payload.push(message.slice(1)); - } else if (payloadKind == 't') { - payload.push(true); - } else if (payloadKind == 'f') { - payload.push(false); - } else if (payloadKind == 'N') { - payload.push(null); - } else if (payloadKind == 'n') { - payload.push(+message.slice(1)); - } else if (payloadKind == 'A') { - var data = message.slice(1); - payload.push(base64.toArrayBuffer(data)); - } else if (payloadKind == 'S') { - payload.push(window.atob(message.slice(1))); - } else if (payloadKind == 'M') { - var multipartMessages = message.slice(1); - while (multipartMessages !== "") { - var spaceIdx = multipartMessages.indexOf(' '); - var msgLen = +multipartMessages.slice(0, spaceIdx); - var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen); - multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1); - buildPayload(payload, multipartMessage); - } - } else { - payload.push(JSON.parse(message)); - } -} - -// Processes a single message, as encoded by NativeToJsMessageQueue.java. -function processMessage(message) { - var firstChar = message.charAt(0); - if (firstChar == 'J') { - // This is deprecated on the .java side. It doesn't work with CSP enabled. - eval(message.slice(1)); - } else if (firstChar == 'S' || firstChar == 'F') { - var success = firstChar == 'S'; - var keepCallback = message.charAt(1) == '1'; - var spaceIdx = message.indexOf(' ', 2); - var status = +message.slice(2, spaceIdx); - var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1); - var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx); - var payloadMessage = message.slice(nextSpaceIdx + 1); - var payload = []; - buildPayload(payload, payloadMessage); - cordova.callbackFromNative(callbackId, success, status, payload, keepCallback); - } else { - console.log("processMessage failed: invalid message: " + JSON.stringify(message)); - } -} - -function processMessages() { - // Check for the reentrant case. - if (isProcessing) { - return; - } - if (messagesFromNative.length === 0) { - return; - } - isProcessing = true; - try { - var msg = popMessageFromQueue(); - // The Java side can send a * message to indicate that it - // still has messages waiting to be retrieved. - if (msg == '*' && messagesFromNative.length === 0) { - nextTick(pollOnce); - return; - } - processMessage(msg); - } finally { - isProcessing = false; - if (messagesFromNative.length > 0) { - nextTick(processMessages); - } - } -} - -function popMessageFromQueue() { - var messageBatch = messagesFromNative.shift(); - if (messageBatch == '*') { - return '*'; - } - - var spaceIdx = messageBatch.indexOf(' '); - var msgLen = +messageBatch.slice(0, spaceIdx); - var message = messageBatch.substr(spaceIdx + 1, msgLen); - messageBatch = messageBatch.slice(spaceIdx + msgLen + 1); - if (messageBatch) { - messagesFromNative.unshift(messageBatch); - } - return message; -} - -module.exports = androidExec; - -}); - -// 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 utils = require('cordova/utils'); - -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); - -// Replace navigator before any modules are required(), to ensure it happens as soon as possible. -// We replace it so that properties that can't be clobbered can instead be overridden. -function replaceNavigator(origNavigator) { - var CordovaNavigator = function() {}; - CordovaNavigator.prototype = origNavigator; - var newNavigator = new CordovaNavigator(); - // This work-around really only applies to new APIs that are newer than Function.bind. - // Without it, APIs such as getGamepads() break. - if (CordovaNavigator.bind) { - for (var key in origNavigator) { - if (typeof origNavigator[key] == 'function') { - newNavigator[key] = origNavigator[key].bind(origNavigator); - } - else { - (function(k) { - utils.defineGetterSetter(newNavigator,key,function() { - return origNavigator[k]; - }); - })(key); - } - } - } - return newNavigator; -} - -if (window.navigator) { - window.navigator = replaceNavigator(window.navigator); -} - -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/init_b.js -define("cordova/init_b", 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 utils = require('cordova/utils'); - -var platformInitChannelsArray = [channel.onDOMContentLoaded, channel.onNativeReady, channel.onPluginsReady]; - -// setting exec -cordova.exec = require('cordova/exec'); - -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); - -// Replace navigator before any modules are required(), to ensure it happens as soon as possible. -// We replace it so that properties that can't be clobbered can instead be overridden. -function replaceNavigator(origNavigator) { - var CordovaNavigator = function() {}; - CordovaNavigator.prototype = origNavigator; - var newNavigator = new CordovaNavigator(); - // This work-around really only applies to new APIs that are newer than Function.bind. - // Without it, APIs such as getGamepads() break. - if (CordovaNavigator.bind) { - for (var key in origNavigator) { - if (typeof origNavigator[key] == 'function') { - newNavigator[key] = origNavigator[key].bind(origNavigator); - } - else { - (function(k) { - utils.defineGetterSetter(newNavigator,key,function() { - return origNavigator[k]; - }); - })(key); - } - } - } - return newNavigator; -} -if (window.navigator) { - window.navigator = replaceNavigator(window.navigator); -} - -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(); -} - -// 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'), - moduleMap = define.moduleMap, - symbolList, - deprecationMap; - -exports.reset = function() { - symbolList = []; - deprecationMap = {}; -}; - -function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { - if (!(moduleName in moduleMap)) { - throw new Error('Module ' + moduleName + ' does not exist.'); - } - symbolList.push(strategy, moduleName, symbolPath); - if (opt_deprecationMessage) { - deprecationMap[symbolPath] = opt_deprecationMessage; - } -} - -// Note: Android 2.3 does have Function.bind(). -exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('c', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('m', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { - addEntry('d', moduleName, symbolPath, opt_deprecationMessage); -}; - -exports.runs = function(moduleName) { - addEntry('r', moduleName, null); -}; - -function prepareNamespace(symbolPath, context) { - if (!symbolPath) { - return context; - } - var parts = symbolPath.split('.'); - var cur = context; - for (var i = 0, part; part = parts[i]; ++i) { - cur = cur[part] = cur[part] || {}; - } - return cur; -} - -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); - // - 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: src/common/modulemapper_b.js -define("cordova/modulemapper_b", function(require, exports, module) { - -var builder = require('cordova/builder'), - symbolList = [], - deprecationMap; - -exports.reset = function() { - symbolList = []; - deprecationMap = {}; -}; - -function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { - 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; - } - var parts = symbolPath.split('.'); - var cur = context; - for (var i = 0, part; part = parts[i]; ++i) { - cur = cur[part] = cur[part] || {}; - } - return cur; -} - -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); - // - 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: /Users/steveng/repo/cordova/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'), - cordova = require('cordova'), - exec = require('cordova/exec'), - modulemapper = require('cordova/modulemapper'); - - // Get the shared secret needed to use the bridge. - exec.init(); - - // TODO: Extract this as a proper plugin. - modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app'); - - var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App'; - - // Inject a listener for the backbutton on the document. - var backButtonChannel = cordova.addDocumentEventHandler('backbutton'); - backButtonChannel.onHasSubscribersChange = function() { - // If we just attached the first handler or detached the last handler, - // let native know we need to override the back button. - exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [this.numHandlers == 1]); - }; - - // Add hardware MENU and SEARCH button handlers - cordova.addDocumentEventHandler('menubutton'); - cordova.addDocumentEventHandler('searchbutton'); - - function bindButtonChannel(buttonName) { - // generic button bind used for volumeup/volumedown buttons - var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button'); - volumeButtonChannel.onHasSubscribersChange = function() { - exec(null, null, APP_PLUGIN_NAME, "overrideButton", [buttonName, this.numHandlers == 1]); - }; - } - // Inject a listener for the volume buttons on the document. - bindButtonChannel('volumeup'); - bindButtonChannel('volumedown'); - - // The resume event is not "sticky", but it is possible that the event - // will contain the result of a plugin call. We need to ensure that the - // plugin result is delivered even after the event is fired (CB-10498) - var cordovaAddEventListener = document.addEventListener; - - document.addEventListener = function(evt, handler, capture) { - cordovaAddEventListener(evt, handler, capture); - - if (evt === 'resume' && lastResumeEvent) { - handler(lastResumeEvent); - } - }; - - // Let native code know we are all done on the JS side. - // Native code will then un-hide the WebView. - channel.onCordovaReady.subscribe(function() { - exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []); - exec(null, null, APP_PLUGIN_NAME, "show", []); - }); - } -}; - -function onMessageFromNative(msg) { - var cordova = require('cordova'); - var action = msg.action; - - switch (action) - { - // Button events - case 'backbutton': - case 'menubutton': - case 'searchbutton': - // App life cycle events - case 'pause': - // Volume events - case 'volumedownbutton': - case 'volumeupbutton': - cordova.fireDocumentEvent(action); - break; - case 'resume': - if(arguments.length > 1 && msg.pendingResult) { - if(arguments.length === 2) { - msg.pendingResult.result = arguments[1]; - } else { - // The plugin returned a multipart message - var res = []; - for(var i = 1; i < arguments.length; i++) { - res.push(arguments[i]); - } - msg.pendingResult.result = res; - } - - // Save the plugin result so that it can be delivered to the js - // even if they miss the initial firing of the event - lastResumeEvent = msg; - } - cordova.fireDocumentEvent(action, msg); - break; - default: - throw new Error('Unknown event action ' + action); - } -} - -}); - -// file: /Users/steveng/repo/cordova/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'); -var urlutil = require('cordova/urlutil'); - -// Helper function to inject a - - - -

Full Screen Test

-
-

Cordova:  

-

Deviceready:  

-
-
- The app should take over the entire screen.
- The top Android status bar should not be shown. -
- - diff --git a/test/android/app/src/main/assets/www/htmlnotfound/error.html b/test/android/app/src/main/assets/www/htmlnotfound/error.html deleted file mode 100755 index 3852efe6..00000000 --- a/test/android/app/src/main/assets/www/htmlnotfound/error.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - Expected Error - - - - - -

Expected Error

-
-

Cordova:  

-

Deviceready:  

-
-
- This is an expected error page because the initial href doesn't exist. - - diff --git a/test/android/app/src/main/assets/www/iframe/index.html b/test/android/app/src/main/assets/www/iframe/index.html deleted file mode 100755 index c286e245..00000000 --- a/test/android/app/src/main/assets/www/iframe/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - Cordova Tests - - - - - - -

IFrame

-
-

Cordova:  

-

Deviceready:  

-
-
- Press the two buttons:
- 1. Google Maps should display in iframe.
- 2. Page 2 replaces current page.
- (NOTE: THIS BEHAVIOR IS WRONG - AND NEEDS TO BE FIXED IN FUTURE RELEASE.) -
- - Google Maps - Page 2 - - diff --git a/test/android/app/src/main/assets/www/iframe/index2.html b/test/android/app/src/main/assets/www/iframe/index2.html deleted file mode 100755 index b1ca1b0b..00000000 --- a/test/android/app/src/main/assets/www/iframe/index2.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - Cordova Tests - - - - - -

IFrame window

-
-

Cordova:  

-

Deviceready:  

-
-
- This should display a Cordova page inside an iframe. The info above should be filled out. - (NOTE: THIS DOES NOT WORK AND NEEDS TO BE FIXED IN FUTURE RELEASE.) -
- - diff --git a/test/android/app/src/main/assets/www/index.html b/test/android/app/src/main/assets/www/index.html deleted file mode 100755 index 46148260..00000000 --- a/test/android/app/src/main/assets/www/index.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - Cordova Tests - - - - - - - -

Cordova Android Native Tests

-
-

Cordova:  

-

Deviceready:  

-
-
-

Run each of the test activities below:

-
- - - - - - - - - - diff --git a/test/android/app/src/main/assets/www/lifecycle/index.html b/test/android/app/src/main/assets/www/lifecycle/index.html deleted file mode 100755 index 25fc2308..00000000 --- a/test/android/app/src/main/assets/www/lifecycle/index.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - -Lifecycle Page 1 - - - - - - -

Events

-
-

Cordova:  

-

Deviceready:  

-
-
-

Test 1

- Press "Home" button, then return to this app to see pause/resume.
- There should be "Running" entries between pause and resume since app continues to run in the background. -

Test 2

- Press "Load new page" button to load a new Cordova page.
- When returning, you should see -
    -
  • Page2: onunload
  • -
  • Page1: onload
  • -
  • Page1: Running
  • -
-
-
-

Info for event testing:

-
-
- - Load new page - Clear status - - - - - - diff --git a/test/android/app/src/main/assets/www/lifecycle/index2.html b/test/android/app/src/main/assets/www/lifecycle/index2.html deleted file mode 100755 index 9b22a0d6..00000000 --- a/test/android/app/src/main/assets/www/lifecycle/index2.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - -Lifecycle Page 2 - - - - - - -

Events

-
-

Cordova:  

-

Platform:  , Version:  

-

UUID:  , Name:  

-

Width:  , Height:  , Color Depth:

-
-
- You should see
-
    -
  • Page1: onunload
  • -
  • Page2: onload
  • -
  • Page2: Running
  • -
- Press "backbutton" to return to Page 1. -
-
-

Info for event testing:

-
-
- - Load new page - Clear status - - - - - - diff --git a/test/android/app/src/main/assets/www/main.js b/test/android/app/src/main/assets/www/main.js deleted file mode 100755 index a2421391..00000000 --- a/test/android/app/src/main/assets/www/main.js +++ /dev/null @@ -1,27 +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 deviceInfo = function() { - document.getElementById("deviceready").innerHTML = "fired"; - document.getElementById("cordova").innerHTML = cordova.version; -}; - -function init() { - document.addEventListener("deviceready", deviceInfo, true); -} diff --git a/test/android/app/src/main/assets/www/master.css b/test/android/app/src/main/assets/www/master.css deleted file mode 100755 index c3e3c452..00000000 --- a/test/android/app/src/main/assets/www/master.css +++ /dev/null @@ -1,136 +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. -*/ - - body { - background:#222 none repeat scroll 0 0; - color:#666; - font-family:Helvetica; - font-size:72%; - line-height:1.5em; - margin:0; - border-top:1px solid #393939; - } - - #info{ - background:#ffa; - border: 1px solid #ffd324; - -webkit-border-radius: 5px; - border-radius: 5px; - clear:both; - margin:15px 6px 0; - width:295px; - padding:4px 0px 2px 10px; - } - - #info > h4{ - font-size:.95em; - margin:5px 0; - } - - #stage.theme{ - padding-top:3px; - } - - /* Definition List */ - #stage.theme > dl{ - padding-top:10px; - clear:both; - margin:0; - list-style-type:none; - padding-left:10px; - overflow:auto; - } - - #stage.theme > dl > dt{ - font-weight:bold; - float:left; - margin-left:5px; - } - - #stage.theme > dl > dd{ - width:45px; - float:left; - color:#a87; - font-weight:bold; - } - - /* Content Styling */ - #stage.theme > h1, #stage.theme > h2, #stage.theme > p{ - margin:1em 0 .5em 13px; - } - - #stage.theme > h1{ - color:#eee; - font-size:1.6em; - text-align:center; - margin:0; - margin-top:15px; - padding:0; - } - - #stage.theme > h2{ - clear:both; - margin:0; - padding:3px; - font-size:1em; - text-align:center; - } - - /* Stage Buttons */ - #stage.theme a.btn{ - border: 1px solid #555; - -webkit-border-radius: 5px; - border-radius: 5px; - text-align:center; - display:block; - float:left; - background:#444; - width:150px; - color:#9ab; - font-size:1.1em; - text-decoration:none; - padding:1.2em 0; - margin:3px 0px 3px 5px; - } - #stage.theme a.btn.large{ - width:308px; - padding:1.2em 0; - } - - /* Stage Buttons */ - #stage.theme button.btn{ - border: 1px solid #555; - -webkit-border-radius: 5px; - border-radius: 5px; - text-align:center; - display:block; - float:left; - background:#444; - width:150px; - color:#9ab; - font-size:1.1em; - text-decoration:none; - padding:1.2em 0; - margin:3px 0px 3px 5px; - } -#stage.theme button.btn.large{ - width:308px; - padding:1.2em 0; - } - diff --git a/test/android/app/src/main/assets/www/whitelist/index.html b/test/android/app/src/main/assets/www/whitelist/index.html deleted file mode 100755 index b9596c93..00000000 --- a/test/android/app/src/main/assets/www/whitelist/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - Cordova Tests - - - - - -

Whitelist Page 1

-
-

Cordova:  

-

Deviceready:  

-
-
- Loading Page 2 should be successful.
- Loading Page 3 should be in web browser.
- Loading Page 2 with target=_blank should be in web browser?
- (THIS DOESN'T HAPPEN.) https://issues.apache.org/jira/browse/CB-362 -
- Page 2 - Page 3 - Page 2 with target=_blank - - diff --git a/test/android/app/src/main/assets/www/whitelist/index2.html b/test/android/app/src/main/assets/www/whitelist/index2.html deleted file mode 100755 index 5d990ad7..00000000 --- a/test/android/app/src/main/assets/www/whitelist/index2.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - Cordova Tests - - - - - -

Whitelist Page 2

-
-

Cordova:  

-

Deviceready:  

-
-
- Press "backbutton" -
- - diff --git a/test/android/app/src/main/java/org/apache/cordova/unittests/EmbeddedWebViewActivity.java b/test/android/app/src/main/java/org/apache/cordova/unittests/EmbeddedWebViewActivity.java deleted file mode 100644 index 2e60ba57..00000000 --- a/test/android/app/src/main/java/org/apache/cordova/unittests/EmbeddedWebViewActivity.java +++ /dev/null @@ -1,110 +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.unittests; - -import android.content.Intent; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.util.Log; - -import org.apache.cordova.ConfigXmlParser; -import org.apache.cordova.CordovaInterfaceImpl; -import org.apache.cordova.CordovaWebView; -import org.apache.cordova.CordovaWebViewImpl; -import org.apache.cordova.PluginManager; -import org.apache.cordova.engine.SystemWebView; -import org.apache.cordova.engine.SystemWebViewEngine; -import org.json.JSONException; - -public class EmbeddedWebViewActivity extends AppCompatActivity { - - public CordovaWebView webInterface; - private CordovaInterfaceImpl cordovaInterface = new CordovaInterfaceImpl(this); - private String TAG = "CordovaTestActivity"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - //Set up the webview - ConfigXmlParser parser = new ConfigXmlParser(); - parser.parse(this); - - SystemWebView webView = (SystemWebView) findViewById(R.id.cordovaWebView); - webInterface = new CordovaWebViewImpl(new SystemWebViewEngine(webView)); - webInterface.init(cordovaInterface, parser.getPluginEntries(), parser.getPreferences()); - - webView.loadUrl(parser.getLaunchUrl()); - } - - // This is still required by Cordova - @Override - public void onDestroy() - { - super.onDestroy(); - PluginManager pluginManager = webInterface.getPluginManager(); - if(pluginManager != null) - { - pluginManager.onDestroy(); - } - - } - - /** - * 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) { - super.onActivityResult(requestCode, resultCode, intent); - cordovaInterface.onActivityResult(requestCode, resultCode, intent); - } - - /** - * Called by the system when the user grants permissions! - * - * Note: The fragment gets priority over the activity, since the activity doesn't call - * into the parent onRequestPermissionResult, which is why there's no override. - * - * @param requestCode - * @param permissions - * @param grantResults - */ - 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(); - } - - } - -} diff --git a/test/android/app/src/main/java/org/apache/cordova/unittests/LifeCyclePlugin.java b/test/android/app/src/main/java/org/apache/cordova/unittests/LifeCyclePlugin.java deleted file mode 100644 index deaf74d2..00000000 --- a/test/android/app/src/main/java/org/apache/cordova/unittests/LifeCyclePlugin.java +++ /dev/null @@ -1,49 +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.unittests; - -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.LOG; - -public class LifeCyclePlugin extends CordovaPlugin { - - static String TAG = "LifeCyclePlugin"; - String calls = ""; - - @Override - public void onStart() { - calls += "start,"; - LOG.d(TAG, "onStart"); - } - @Override - public void onPause(boolean multitasking) { - calls += "pause,"; - LOG.d(TAG, "onPause"); - } - @Override - public void onResume(boolean multitasking) { - calls += "resume,"; - LOG.d(TAG, "onResume"); - } - @Override - public void onStop() { - calls += "stop,"; - LOG.d(TAG, "onStop"); - } -} diff --git a/test/android/app/src/main/java/org/apache/cordova/unittests/StandardActivity.java b/test/android/app/src/main/java/org/apache/cordova/unittests/StandardActivity.java deleted file mode 100644 index 9e7cce94..00000000 --- a/test/android/app/src/main/java/org/apache/cordova/unittests/StandardActivity.java +++ /dev/null @@ -1,42 +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.unittests; - -import android.os.Bundle; - -import org.apache.cordova.CordovaActivity; - -public class StandardActivity 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 in config.xml - loadUrl(launchUrl); - } -} diff --git a/test/android/app/src/main/java/org/apache/cordova/unittests/TestActivity.java b/test/android/app/src/main/java/org/apache/cordova/unittests/TestActivity.java deleted file mode 100644 index 024a131f..00000000 --- a/test/android/app/src/main/java/org/apache/cordova/unittests/TestActivity.java +++ /dev/null @@ -1,67 +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.unittests; - -import android.os.Bundle; - -import org.apache.cordova.CordovaActivity; -import org.apache.cordova.CordovaWebView; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.RunnableFuture; - -/** - * The purpose of this activity is to allow the test framework to manipulate the start url, which - * is normally locked down by CordovaActivity to standard users who aren't editing their Java code. - */ - -public class TestActivity extends CordovaActivity { - - public final ArrayBlockingQueue onPageFinishedUrl = new ArrayBlockingQueue(500); - - - @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) { - if (extras.getBoolean("cdvStartInBackground", false)) { - moveTaskToBack(true); - } - launchUrl = extras.getString("startUrl", "index.html"); - } - - // Set by in config.xml - loadUrl(launchUrl); - } - - @Override - public Object onMessage(String id, Object data) { - if ("onPageFinished".equals(id)) { - onPageFinishedUrl.add((String) data); - } - return super.onMessage(id, data); - } - - public CordovaWebView getWebInterface() { return this.appView; } - -} diff --git a/test/android/app/src/main/res/layout/activity_main.xml b/test/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 7cbd51d6..00000000 --- a/test/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - diff --git a/test/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/test/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index cde69bcc..00000000 Binary files a/test/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/test/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/test/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c133a0cb..00000000 Binary files a/test/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/test/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/test/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index bfa42f0e..00000000 Binary files a/test/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/test/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/test/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 324e72cd..00000000 Binary files a/test/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/test/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/test/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index aee44e13..00000000 Binary files a/test/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/test/android/app/src/main/res/values-w820dp/dimens.xml b/test/android/app/src/main/res/values-w820dp/dimens.xml deleted file mode 100644 index a1a90b9f..00000000 --- a/test/android/app/src/main/res/values-w820dp/dimens.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - 64dp - diff --git a/test/android/app/src/main/res/values/colors.xml b/test/android/app/src/main/res/values/colors.xml deleted file mode 100644 index b184be6b..00000000 --- a/test/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - #3F51B5 - #303F9F - #FF4081 - diff --git a/test/android/app/src/main/res/values/dimens.xml b/test/android/app/src/main/res/values/dimens.xml deleted file mode 100644 index 8f9a14a9..00000000 --- a/test/android/app/src/main/res/values/dimens.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 16dp - 16dp - diff --git a/test/android/app/src/main/res/values/strings.xml b/test/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 353e3abc..00000000 --- a/test/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - UnitTests - diff --git a/test/android/app/src/main/res/values/styles.xml b/test/android/app/src/main/res/values/styles.xml deleted file mode 100644 index ae304dac..00000000 --- a/test/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - diff --git a/test/android/app/src/main/res/xml/config.xml b/test/android/app/src/main/res/xml/config.xml deleted file mode 100644 index a824011e..00000000 --- a/test/android/app/src/main/res/xml/config.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - Hello Cordova - - A sample Apache Cordova application that responds to the deviceready event. - - - Apache Cordova Team - - - - - - - - - - - - - - - - - - diff --git a/test/android/app/src/test/java/org/apache/cordova/unittests/NativeToJsMessageQueueTest.java b/test/android/app/src/test/java/org/apache/cordova/unittests/NativeToJsMessageQueueTest.java deleted file mode 100644 index dc7bb672..00000000 --- a/test/android/app/src/test/java/org/apache/cordova/unittests/NativeToJsMessageQueueTest.java +++ /dev/null @@ -1,177 +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.unittests; - -import android.app.Activity; -import android.content.Intent; -import android.view.View; -import android.webkit.ValueCallback; - -import org.apache.cordova.CordovaInterface; -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.CordovaResourceApi; -import org.apache.cordova.CordovaWebView; -import org.apache.cordova.CordovaWebViewEngine; -import org.apache.cordova.ICordovaCookieManager; -import org.apache.cordova.NativeToJsMessageQueue; -import org.apache.cordova.PluginManager; -import org.apache.cordova.PluginResult; -import org.apache.cordova.engine.SystemWebViewEngine; -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Before; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.concurrent.ExecutorService; - -import static org.junit.Assert.*; - -public class NativeToJsMessageQueueTest { - - NativeToJsMessageQueue queue = new NativeToJsMessageQueue(); - private String TEST_CALLBACK_ID = "MessageQueueTest"; - - //A queue with no bridges should not work - @Test - public void testEmptyBridge() - { - assertFalse(queue.isBridgeEnabled()); - } - - - //A queue with at least one bridge should work, using Eval Bridge - @Test - public void testEnabledBridge() - { - NativeToJsMessageQueue.BridgeMode bridge; - bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); - queue.addBridgeMode(bridge); - queue.setBridgeMode(0); - assertTrue(queue.isBridgeEnabled()); - } - - //This test is for the undocumented encoding system setup for the bridge - //TODO: Document how the non-Javascript bridges are supposed to work - @Test - public void testPopAndEncode() - { - NativeToJsMessageQueue.BridgeMode bridge; - bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); - queue.addBridgeMode(bridge); - queue.setBridgeMode(0); - - PluginResult result = new PluginResult(PluginResult.Status.OK); - queue.addPluginResult(result, TEST_CALLBACK_ID); - assertFalse(queue.isEmpty()); - String resultString = queue.popAndEncode(false); - String [] results = resultString.split(" "); - assertEquals(TEST_CALLBACK_ID, results[2]); - } - - //This test is for the evalBridge, which directly calls cordova.callbackFromNative, skipping - //platform specific NativeToJs code - @Test - public void testBasicPopAndEncodeAsJs() - { - NativeToJsMessageQueue.BridgeMode bridge; - bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); - queue.addBridgeMode(bridge); - queue.setBridgeMode(0); - - PluginResult result = new PluginResult(PluginResult.Status.OK); - queue.addPluginResult(result, TEST_CALLBACK_ID); - assertFalse(queue.isEmpty()); - String resultString = queue.popAndEncodeAsJs(); - assertTrue(resultString.startsWith("cordova.callbackFromNative")); - } - - //This test is for the evalBridge, which directly calls cordova.callbackFromNative, skipping - //platform specific NativeToJs code - @Test - public void testStringPopAndEncodeAsJs() - { - NativeToJsMessageQueue.BridgeMode bridge; - bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); - queue.addBridgeMode(bridge); - queue.setBridgeMode(0); - - PluginResult result = new PluginResult(PluginResult.Status.OK, "String Plugin Result"); - queue.addPluginResult(result, TEST_CALLBACK_ID); - assertFalse(queue.isEmpty()); - String resultString = queue.popAndEncodeAsJs(); - assertTrue(resultString.startsWith("cordova.callbackFromNative")); - } - - //This test is for the evalBridge, which directly calls cordova.callbackFromNative, skipping - //platform specific NativeToJs code - @Test - public void testJsonPopAndEncodeAsJs() - { - NativeToJsMessageQueue.BridgeMode bridge; - bridge = new NativeToJsMessageQueue.NoOpBridgeMode(); - queue.addBridgeMode(bridge); - queue.setBridgeMode(0); - - JSONObject object = new JSONObject(); - try { - object.put("test", "value"); - } catch (JSONException e) { - e.printStackTrace(); - } - PluginResult result = new PluginResult(PluginResult.Status.OK, object); - queue.addPluginResult(result, TEST_CALLBACK_ID); - assertFalse(queue.isEmpty()); - String resultString = queue.popAndEncodeAsJs(); - assertTrue(resultString.startsWith("cordova.callbackFromNative")); - } - - //This test is for the evalBridge, which directly calls cordova.callbackFromNative, skipping - //platform specific NativeToJs code - @Test - public void testMultipartPopAndEncodeAsJs() - { - ArrayList multiparts = new ArrayList(); - for (int i=0; i<5; i++) { - multiparts.add(new PluginResult(PluginResult.Status.OK, i)); - } - PluginResult multipartresult = new PluginResult(PluginResult.Status.OK, multiparts); - NativeToJsMessageQueue queue = new NativeToJsMessageQueue(); - queue.addBridgeMode(new NativeToJsMessageQueue.NoOpBridgeMode()); - queue.setBridgeMode(0); - queue.addPluginResult(multipartresult, "37"); - String result = queue.popAndEncodeAsJs(); - assertEquals(result, "cordova.callbackFromNative('37',true,1,[0,1,2,3,4],false);"); - } - - @Test - public void testNullPopAndEncodeAsJs() - { - NativeToJsMessageQueue queue = new NativeToJsMessageQueue(); - queue.addBridgeMode(new NativeToJsMessageQueue.NoOpBridgeMode()); - queue.setBridgeMode(0); - - PluginResult result = new PluginResult(PluginResult.Status.OK, (String)null); - queue.addPluginResult(result, TEST_CALLBACK_ID); - assertFalse(queue.isEmpty()); - String resultString = queue.popAndEncodeAsJs(); - assertEquals(resultString, "cordova.callbackFromNative('" + TEST_CALLBACK_ID + "',true,1,[null],false);"); - } -} diff --git a/test/android/build.gradle b/test/android/build.gradle deleted file mode 100644 index 73570fc7..00000000 --- a/test/android/build.gradle +++ /dev/null @@ -1,47 +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. -*/ - -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext.kotlin_version = '1.4.32' - - repositories { - google() - jcenter() - } - - dependencies { - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - - classpath 'com.android.tools.build:gradle:4.1.3' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/test/android/gradle.properties b/test/android/gradle.properties deleted file mode 100644 index aac7c9b4..00000000 --- a/test/android/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true diff --git a/test/android/settings.gradle b/test/android/settings.gradle deleted file mode 100644 index ac3d9ebd..00000000 --- a/test/android/settings.gradle +++ /dev/null @@ -1,21 +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. -*/ - -include ':app' -include ":CordovaLib" -project(':CordovaLib').projectDir = new File('../../framework') diff --git a/test/android/wrapper.gradle b/test/android/wrapper.gradle deleted file mode 100644 index 80394fa7..00000000 --- a/test/android/wrapper.gradle +++ /dev/null @@ -1,21 +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. -*/ - -wrapper { - gradleVersion = '6.8.3' -} diff --git a/test/clean.js b/test/clean.js index 212226af..88148cdb 100644 --- a/test/clean.js +++ b/test/clean.js @@ -25,7 +25,7 @@ const path = require('path'); * you want to upgrade gradlew or test its proper generation. */ -for (const variant of ['android', 'androidx']) { +for (const variant of ['androidx']) { for (const file of ['gradlew', 'gradlew.bat']) { fs.removeSync(path.join(__dirname, variant, file)); } diff --git a/test/run_java_unit_tests.js b/test/run_java_unit_tests.js index 40354b58..752dbca2 100644 --- a/test/run_java_unit_tests.js +++ b/test/run_java_unit_tests.js @@ -59,10 +59,6 @@ class AndroidTestRunner { Promise.resolve() .then(_ => console.log('Starting to run all android platform tests')) - // Android Test - .then(_ => new AndroidTestRunner('Android Project', path.resolve(__dirname, 'android'))) - .then(test => test.run()) - // AndroidX Test .then(_ => new AndroidTestRunner('AndroidX Project', path.resolve(__dirname, 'androidx'))) .then(test => test.run())