diff --git a/mobile/android/app/base/build.gradle b/mobile/android/app/base/build.gradle deleted file mode 100644 index e0d1d1e943c..00000000000 --- a/mobile/android/app/base/build.gradle +++ /dev/null @@ -1,149 +0,0 @@ -buildDir "${topobjdir}/gradle/build/mobile/android/base" - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 23 - buildToolsVersion "23.0.1" - - defaultConfig { - targetSdkVersion 23 - minSdkVersion 15 - // Used by Robolectric based tests; see TestRunner. - buildConfigField 'String', 'BUILD_DIR', "\"${project.buildDir}\"" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - - lintOptions { - abortOnError false - } - - sourceSets { - main { - manifest.srcFile "${topsrcdir}/mobile/android/base/AndroidManifest.xml" - - java { - srcDir "${topsrcdir}/mobile/android/base/java" - srcDir "${topsrcdir}/mobile/android/search/java" - srcDir "${topsrcdir}/mobile/android/javaaddons/java" - srcDir "${topsrcdir}/mobile/android/services/src/main/java" - - if (mozconfig.substs.MOZ_ANDROID_MLS_STUMBLER) { - srcDir "${topsrcdir}/mobile/android/stumbler/java" - } - - if (!mozconfig.substs.MOZ_CRASHREPORTER) { - exclude 'org/mozilla/gecko/CrashReporter.java' - } - - if (!mozconfig.substs.MOZ_NATIVE_DEVICES) { - exclude 'org/mozilla/gecko/ChromeCast.java' - exclude 'org/mozilla/gecko/GeckoMediaPlayer.java' - exclude 'org/mozilla/gecko/MediaPlayerManager.java' - } - - if (mozconfig.substs.MOZ_WEBRTC) { - srcDir "${topsrcdir}/media/webrtc/trunk/webrtc/modules/audio_device/android/java/src" - srcDir "${topsrcdir}/media/webrtc/trunk/webrtc/modules/video_capture/android/java/src" - srcDir "${topsrcdir}/media/webrtc/trunk/webrtc/modules/video_render/android/java/src" - } - - if (mozconfig.substs.MOZ_INSTALL_TRACKING) { - exclude 'org/mozilla/gecko/adjust/StubAdjustHelper.java' - } else { - exclude 'org/mozilla/gecko/adjust/AdjustHelper.java' - } - - srcDir "${project.buildDir}/generated/source/preprocessed_code" // See syncPreprocessedCode. - } - - res { - srcDir "${topsrcdir}/${mozconfig.substs.MOZ_BRANDING_DIRECTORY}/res" - srcDir "${project.buildDir}/generated/source/preprocessed_resources" // See syncPreprocessedResources. - srcDir "${topsrcdir}/mobile/android/base/resources" - srcDir "${topsrcdir}/mobile/android/services/src/main/res" - if (mozconfig.substs.MOZ_CRASHREPORTER) { - srcDir "${topsrcdir}/mobile/android/base/crashreporter/res" - } - } - - assets { - srcDir "${topsrcdir}/mobile/android/app/assets" - } - } - - test { - java { - srcDir "${topsrcdir}/mobile/android/tests/background/junit4/src" - } - - resources { - srcDir "${topsrcdir}/mobile/android/tests/background/junit4/resources" - } - } - } -} - -task syncPreprocessedCode(type: Sync, dependsOn: rootProject.generateCodeAndResources) { - into("${project.buildDir}/generated/source/preprocessed_code") - from("${topobjdir}/mobile/android/base/generated/preprocessed") -} - -task syncPreprocessedResources(type: Sync, dependsOn: rootProject.generateCodeAndResources) { - into("${project.buildDir}/generated/source/preprocessed_resources") - from("${topobjdir}/mobile/android/base/res") -} - -android.libraryVariants.all { variant -> - variant.preBuild.dependsOn syncPreprocessedCode - variant.preBuild.dependsOn syncPreprocessedResources -} - -dependencies { - compile 'com.android.support:support-v4:23.0.1' - compile 'com.android.support:appcompat-v7:23.0.1' - compile 'com.android.support:recyclerview-v7:23.0.1' - compile 'com.android.support:design:23.0.1' - - if (mozconfig.substs.MOZ_NATIVE_DEVICES) { - compile 'com.android.support:mediarouter-v7:23.0.1' - compile 'com.google.android.gms:play-services-basement:8.1.0' - compile 'com.google.android.gms:play-services-base:8.1.0' - compile 'com.google.android.gms:play-services-cast:8.1.0' - } - - if (mozconfig.substs.MOZ_INSTALL_TRACKING) { - compile 'com.google.android.gms:play-services-ads:8.1.0' - compile 'com.google.android.gms:play-services-analytics:8.1.0' - compile 'com.google.android.gms:play-services-appindexing:8.1.0' - compile 'com.google.android.gms:play-services-basement:8.1.0' - } - - if (mozconfig.substs.MOZ_ANDROID_GCM) { - compile 'com.google.android.gms:play-services-basement:8.1.0' - compile 'com.google.android.gms:play-services-base:8.1.0' - compile 'com.google.android.gms:play-services-gcm:8.1.0' - } - - // Gradle based builds include LeakCanary. Mach based builds only include the no-op version of - // this library. - compile 'com.squareup.leakcanary:leakcanary-android:1.4-beta1' - - compile project(':thirdparty') - - testCompile 'junit:junit:4.12' - testCompile 'org.robolectric:robolectric:3.0' - testCompile 'org.simpleframework:simple-http:6.0.1' - testCompile 'org.mockito:mockito-core:1.10.19' -} - -apply plugin: 'idea' - -idea { - module { - } -} diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index 77b91eecdd3..0fede1157eb 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -17,6 +17,8 @@ android { MOZ_ANDROID_MIN_SDK_VERSION: mozconfig.substs.MOZ_ANDROID_MIN_SDK_VERSION, MOZ_ANDROID_SHARED_ID: "${mozconfig.substs.ANDROID_PACKAGE_NAME}.sharedID", ] + // Used by Robolectric based tests; see TestRunner. + buildConfigField 'String', 'BUILD_DIR', "\"${project.buildDir}\"" } compileOptions { @@ -65,12 +67,65 @@ android { sourceSets { main { manifest.srcFile "${topobjdir}/mobile/android/base/AndroidManifest.xml" + + java { + srcDir "${topsrcdir}/mobile/android/base/java" + srcDir "${topsrcdir}/mobile/android/search/java" + srcDir "${topsrcdir}/mobile/android/javaaddons/java" + srcDir "${topsrcdir}/mobile/android/services/src/main/java" + + if (mozconfig.substs.MOZ_ANDROID_MLS_STUMBLER) { + srcDir "${topsrcdir}/mobile/android/stumbler/java" + } + + if (!mozconfig.substs.MOZ_CRASHREPORTER) { + exclude 'org/mozilla/gecko/CrashReporter.java' + } + + if (!mozconfig.substs.MOZ_NATIVE_DEVICES) { + exclude 'org/mozilla/gecko/ChromeCast.java' + exclude 'org/mozilla/gecko/GeckoMediaPlayer.java' + exclude 'org/mozilla/gecko/MediaPlayerManager.java' + } + + if (mozconfig.substs.MOZ_WEBRTC) { + srcDir "${topsrcdir}/media/webrtc/trunk/webrtc/modules/audio_device/android/java/src" + srcDir "${topsrcdir}/media/webrtc/trunk/webrtc/modules/video_capture/android/java/src" + srcDir "${topsrcdir}/media/webrtc/trunk/webrtc/modules/video_render/android/java/src" + } + + if (mozconfig.substs.MOZ_INSTALL_TRACKING) { + exclude 'org/mozilla/gecko/adjust/StubAdjustHelper.java' + } else { + exclude 'org/mozilla/gecko/adjust/AdjustHelper.java' + } + + srcDir "${project.buildDir}/generated/source/preprocessed_code" // See syncPreprocessedCode. + } + + res { + srcDir "${topsrcdir}/${mozconfig.substs.MOZ_BRANDING_DIRECTORY}/res" + srcDir "${project.buildDir}/generated/source/preprocessed_resources" // See syncPreprocessedResources. + srcDir "${topsrcdir}/mobile/android/base/resources" + srcDir "${topsrcdir}/mobile/android/services/src/main/res" + if (mozconfig.substs.MOZ_CRASHREPORTER) { + srcDir "${topsrcdir}/mobile/android/base/crashreporter/res" + } + } + assets { if (mozconfig.substs.MOZ_ANDROID_DISTRIBUTION_DIRECTORY && !mozconfig.substs.MOZ_ANDROID_PACKAGE_INSTALL_BOUNCER) { // If we are packaging the bouncer, it will have the distribution, so don't put // it in the main APK as well. srcDir "${mozconfig.substs.MOZ_ANDROID_DISTRIBUTION_DIRECTORY}/assets" } + srcDir "${topsrcdir}/mobile/android/app/assets" + } + } + + test { + java { + srcDir "${topsrcdir}/mobile/android/tests/background/junit4/src" } } @@ -89,10 +144,55 @@ android { } } } + + testOptions { + unitTests.all { + // We'd like to use (Runtime.runtime.availableProcessors()/2), but + // we have tests that start test servers and the bound ports + // collide. We'll fix this soon to have much faster test cycles. + maxParallelForks 1 + } + } } dependencies { - compile project(':base') + compile 'com.android.support:support-v4:23.0.1' + compile 'com.android.support:appcompat-v7:23.0.1' + compile 'com.android.support:recyclerview-v7:23.0.1' + compile 'com.android.support:design:23.0.1' + + if (mozconfig.substs.MOZ_NATIVE_DEVICES) { + compile 'com.android.support:mediarouter-v7:23.0.1' + compile 'com.google.android.gms:play-services-basement:8.1.0' + compile 'com.google.android.gms:play-services-base:8.1.0' + compile 'com.google.android.gms:play-services-cast:8.1.0' + } + + if (mozconfig.substs.MOZ_INSTALL_TRACKING) { + compile 'com.google.android.gms:play-services-ads:8.1.0' + compile 'com.google.android.gms:play-services-analytics:8.1.0' + compile 'com.google.android.gms:play-services-appindexing:8.1.0' + compile 'com.google.android.gms:play-services-basement:8.1.0' + } + + if (mozconfig.substs.MOZ_ANDROID_GCM) { + compile 'com.google.android.gms:play-services-basement:8.1.0' + compile 'com.google.android.gms:play-services-base:8.1.0' + compile 'com.google.android.gms:play-services-gcm:8.1.0' + } + + // Gradle based builds include LeakCanary. Gradle based tests include the no-op version. Mach + // based builds only include the no-op version of this library. + compile 'com.squareup.leakcanary:leakcanary-android:1.4-beta1' + testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1' + + compile project(':thirdparty') + + testCompile 'junit:junit:4.12' + testCompile 'org.robolectric:robolectric:3.0' + testCompile 'org.simpleframework:simple-http:6.0.1' + testCompile 'org.mockito:mockito-core:1.10.19' + // Including the Robotium JAR directly can cause issues with dexing. androidTestCompile 'com.jayway.android.robotium:robotium-solo:4.3.1' } @@ -128,6 +228,16 @@ task syncAssetsFromDistDir(type: Sync, dependsOn: checkAssetsExistInDistDir) { } } +task syncPreprocessedCode(type: Sync, dependsOn: rootProject.generateCodeAndResources) { + into("${project.buildDir}/generated/source/preprocessed_code") + from("${topobjdir}/mobile/android/base/generated/preprocessed") +} + +task syncPreprocessedResources(type: Sync, dependsOn: rootProject.generateCodeAndResources) { + into("${project.buildDir}/generated/source/preprocessed_resources") + from("${topobjdir}/mobile/android/base/res") +} + // The omnijar inputs are listed as resource directory inputs to a dummy JAR. // That arrangement labels them nicely in IntelliJ. See the comment in the // :omnijar project for more context. @@ -161,6 +271,9 @@ task buildOmnijar(type:Exec) { } android.applicationVariants.all { variant -> + variant.preBuild.dependsOn syncPreprocessedCode + variant.preBuild.dependsOn syncPreprocessedResources + // Like 'local' or 'localOld'. def productFlavor = variant.productFlavors[0].name // Like 'debug' or 'release'. diff --git a/mobile/android/app/base/lint.xml b/mobile/android/app/lint.xml similarity index 100% rename from mobile/android/app/base/lint.xml rename to mobile/android/app/lint.xml diff --git a/mobile/android/tests/background/junit4/resources/robolectric.properties b/mobile/android/app/src/main/resources/robolectric.properties similarity index 100% rename from mobile/android/tests/background/junit4/resources/robolectric.properties rename to mobile/android/app/src/main/resources/robolectric.properties diff --git a/mobile/android/app/src/test/java/org/mozilla/gecko/TestGeckoApplication.java b/mobile/android/app/src/test/java/org/mozilla/gecko/TestGeckoApplication.java new file mode 100644 index 00000000000..fee9a426d15 --- /dev/null +++ b/mobile/android/app/src/test/java/org/mozilla/gecko/TestGeckoApplication.java @@ -0,0 +1,27 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +package org.mozilla.gecko; + +import android.app.Application; + +import org.robolectric.TestLifecycleApplication; + +import java.lang.reflect.Method; + +/** + * GeckoApplication isn't test-lifecycle friendly: onCreate is called multiple times, which + * re-registers Gecko event listeners, which fails. This class is magically named so that + * Robolectric uses it instead of the application defined in the Android manifest. See + * http://robolectric.blogspot.ca/2013/04/the-test-lifecycle-in-20.html. + */ +public class TestGeckoApplication extends Application implements TestLifecycleApplication { + @Override public void beforeTest(Method method) { + } + + @Override public void prepareTest(Object test) { + } + + @Override public void afterTest(Method method) { + } +} diff --git a/mobile/android/base/AndroidManifest.xml b/mobile/android/base/AndroidManifest.xml deleted file mode 100644 index decb23df4fd..00000000000 --- a/mobile/android/base/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/settings.gradle b/settings.gradle index c4aa90de794..d3c0ddef474 100644 --- a/settings.gradle +++ b/settings.gradle @@ -29,12 +29,10 @@ if (json.substs.MOZ_BUILD_APP != 'mobile/android') { System.setProperty('android.home', json.substs.ANDROID_SDK_ROOT) include ':app' -include ':base' include ':omnijar' include ':thirdparty' project(':app').projectDir = new File("${json.topsrcdir}/mobile/android/app") -project(':base').projectDir = new File("${json.topsrcdir}/mobile/android/app/base") project(':omnijar').projectDir = new File("${json.topsrcdir}/mobile/android/app/omnijar") project(':thirdparty').projectDir = new File("${json.topsrcdir}/mobile/android/thirdparty")