diff --git a/.dockerignore b/.dockerignore index f4b17147..35a10ba4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -21,7 +21,7 @@ DerivedData/ build .gradle local.properties -/gradle/builds +/builds /platform-android/.externalNativeBuild # Git diff --git a/.gitignore b/.gitignore index b3317ad1..bd98a874 100644 --- a/.gitignore +++ b/.gitignore @@ -22,5 +22,7 @@ DerivedData/ build .gradle local.properties -/gradle/builds +/builds /platform-android/.externalNativeBuild +.cxx + diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e04b1469..ffc71975 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,7 +9,7 @@ build_project: - "( ./lib/bin/build_libsodium-macos clean && ./lib/bin/build_libsodium-macos )" - "( ./lib/bin/build_libjson-c-macos clean && ./lib/bin/build_libjson-c-macos )" - "( cd ./platform-independent/c/cli && ./clean && targets=all ./build && ./mpw-tests && ./mpw-cli-tests )" - - "( export JAVA_HOME=$(java_home -Fv 10 || java_home -Fv 9* ) && cd ./gradle && ./gradlew --stacktrace clean test )" + - "( export JAVA_HOME=$(java_home -Fv 10 || java_home -Fv 9* ) && ./gradlew --stacktrace clean test )" - "( xcodebuild -workspace platform-darwin/MasterPassword.xcworkspace -configuration 'Test' -scheme 'MasterPassword iOS' -sdk iphonesimulator clean build )" - "( xcodebuild -workspace platform-darwin/MasterPassword.xcworkspace -configuration 'Test' -scheme 'MasterPassword macOS' clean build )" tags: diff --git a/gradle/README.md b/RELEASE.md similarity index 100% rename from gradle/README.md rename to RELEASE.md diff --git a/gradle/build.gradle b/build.gradle similarity index 97% rename from gradle/build.gradle rename to build.gradle index a3cd4fac..053fe1ff 100644 --- a/gradle/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ buildscript { } dependencies { - classpath group: 'com.android.tools.build', name: 'gradle', version: '3.1.0' + classpath group: 'com.android.tools.build', name: 'gradle', version: '3.5.0' } } diff --git a/gradle/gradle.properties b/gradle.properties similarity index 100% rename from gradle/gradle.properties rename to gradle.properties diff --git a/gradle/.idea/misc.xml b/gradle/.idea/misc.xml deleted file mode 100644 index 9ab65e3c..00000000 --- a/gradle/.idea/misc.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/gradle/external-annotations/com/google/common/base/annotations.xml b/gradle/external-annotations/com/google/common/base/annotations.xml deleted file mode 100644 index b854e2e9..00000000 --- a/gradle/external-annotations/com/google/common/base/annotations.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/gradle/external-annotations/com/google/common/io/annotations.xml b/gradle/external-annotations/com/google/common/io/annotations.xml deleted file mode 100644 index e912cca1..00000000 --- a/gradle/external-annotations/com/google/common/io/annotations.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/gradle/external-annotations/org/testng/annotations.xml b/gradle/external-annotations/org/testng/annotations.xml deleted file mode 100644 index 4c7d5ed8..00000000 --- a/gradle/external-annotations/org/testng/annotations.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/gradle/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 91ca28c8..00000000 Binary files a/gradle/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..5c2d1cf0 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties similarity index 80% rename from gradle/gradle/wrapper/gradle-wrapper.properties rename to gradle/wrapper/gradle-wrapper.properties index 16d28051..0e2a93d9 100644 --- a/gradle/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Mon Sep 23 12:55:35 EDT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/gradle/gradlew b/gradlew similarity index 87% rename from gradle/gradlew rename to gradlew index cccdd3d5..83f2acfd 100755 --- a/gradle/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -109,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` diff --git a/gradle/gradlew.bat b/gradlew.bat similarity index 73% rename from gradle/gradlew.bat rename to gradlew.bat index e95643d6..24467a14 100644 --- a/gradle/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome diff --git a/gradle/homebrew-mpw.rb b/homebrew-mpw.rb similarity index 100% rename from gradle/homebrew-mpw.rb rename to homebrew-mpw.rb diff --git a/platform-android/build.gradle b/platform-android/build.gradle index 10a9bfc6..cf62e3eb 100644 --- a/platform-android/build.gradle +++ b/platform-android/build.gradle @@ -1,13 +1,15 @@ -apply plugin: 'com.android.application' +plugins { + id 'com.android.application' + id 'com.github.spotbugs' version '2.0.0' +} android { - compileSdkVersion 25 - buildToolsVersion '27.0.3' + compileSdkVersion 28 defaultConfig { applicationId 'com.lyndir.masterpassword' - minSdkVersion 19 - targetSdkVersion 25 + minSdkVersion 24 + targetSdkVersion 28 versionCode 20701 versionName '2.7.1' } @@ -22,8 +24,8 @@ android { } sourceSets { main { - jniLibs.srcDirs "$rootDir/../lib/libsodium/build-android~/out/lib", - "$rootDir/../lib/libjson-c/build-android~/out/lib" + jniLibs.srcDirs "$rootDir/lib/libsodium/build-android~/out/lib", + "$rootDir/lib/libjson-c/build-android~/out/lib" } } @@ -50,28 +52,28 @@ dependencies { implementation group: 'com.lyndir.lhunath.opal', name: 'opal-system', version: '1.7-p2' implementation group: 'org.slf4j', name: 'slf4j-android', version: '1.7.13-underscore' - implementation group: 'com.jakewharton', name: 'butterknife', version: '8.5.1' - annotationProcessor group: 'com.jakewharton', name: 'butterknife-compiler', version: '8.5.1' + implementation group: 'com.jakewharton', name: 'butterknife', version: '10.2.0' + annotationProcessor group: 'com.jakewharton', name: 'butterknife-compiler', version: '10.2.0' } preBuild { dependsOn task( type: Exec, 'build_libsodium-android', { - commandLine 'bash', "$rootDir/../lib/bin/build_libsodium-android" + commandLine 'bash', "$rootDir/lib/bin/build_libsodium-android" environment 'ANDROID_NDK_HOME', android.ndkDirectory } ) dependsOn task( type: Exec, 'build_libjson-c-android', { - commandLine 'bash', "$rootDir/../lib/bin/build_libjson-c-android" + commandLine 'bash', "$rootDir/lib/bin/build_libjson-c-android" environment 'ANDROID_NDK_HOME', android.ndkDirectory } ) } clean { dependsOn task( type: Exec, 'clean_libsodium-android', { - commandLine 'bash', "$rootDir/../lib/bin/build_libsodium-android", 'clean' + commandLine 'bash', "$rootDir/lib/bin/build_libsodium-android", 'clean' environment 'ANDROID_NDK_HOME', android.ndkDirectory } ) dependsOn task( type: Exec, 'clean_libjson-c-android', { - commandLine 'bash', "$rootDir/../lib/bin/build_libjson-c-android", 'clean' + commandLine 'bash', "$rootDir/lib/bin/build_libjson-c-android", 'clean' environment 'ANDROID_NDK_HOME', android.ndkDirectory } ) } diff --git a/platform-darwin/MasterPassword-JNI.xcodeproj/project.pbxproj b/platform-darwin/MasterPassword-JNI.xcodeproj/project.pbxproj index c9e1bbbc..5f34905f 100644 --- a/platform-darwin/MasterPassword-JNI.xcodeproj/project.pbxproj +++ b/platform-darwin/MasterPassword-JNI.xcodeproj/project.pbxproj @@ -75,7 +75,7 @@ buildPhases = ( ); buildToolPath = gradle; - buildWorkingDirectory = /Users/lhunath/Documents/workspace/lyndir/MasterPassword/gradle; + buildWorkingDirectory = /Users/lhunath/Documents/workspace/lyndir/MasterPassword; dependencies = ( ); name = "MasterPassword-JNI"; diff --git a/platform-independent/c/core/build.gradle b/platform-independent/c/core/build.gradle index 54fc8478..00c72dfb 100644 --- a/platform-independent/c/core/build.gradle +++ b/platform-independent/c/core/build.gradle @@ -2,8 +2,8 @@ import org.gradle.internal.jvm.Jvm plugins { - id 'cpp-library' id 'base' + id 'cpp-library' } description = 'Master Password Algorithm Implementation' @@ -16,7 +16,7 @@ artifacts { components.withType( ComponentWithRuntimeFile ) { if (optimized) from runtimeFile, { - into standardOperatingSystem( targetPlatform ) + '/' + standardArchitecture( targetPlatform ) + into targetMachine.getOperatingSystemFamily().getName() + '/' + targetMachine.getArchitecture().getName() } } } @@ -25,6 +25,7 @@ artifacts { library { baseName.set( 'mpw' ) linkage.set( [Linkage.SHARED] ) + source.from fileTree( 'src' ) // Reconfigure the toolchain from C++ to C. toolChains { @@ -42,75 +43,43 @@ library { // Cross-compile for these host platforms. // TODO: Cross-compiling, blocked by: https://github.com/gradle/gradle-native/issues/169 - CppLibraryPlugin.java:163 - operatingSystems.set( [objects.named( OperatingSystemFamily, OperatingSystemFamily.LINUX ), - objects.named( OperatingSystemFamily, OperatingSystemFamily.MAC_OS ), - objects.named( OperatingSystemFamily, OperatingSystemFamily.WINDOWS )] ) +// operatingSystems.set( [objects.named( OperatingSystemFamily, OperatingSystemFamily.LINUX ), +// objects.named( OperatingSystemFamily, OperatingSystemFamily.MAC_OS ), +// objects.named( OperatingSystemFamily, OperatingSystemFamily.WINDOWS )] ) + targetMachines.set( [ + machines.linux.x86_64, + machines.windows.x86, machines.windows.x86_64, + machines.macOS.x86_64 + ] ) components.withType( CppComponent ) { - cppSource.from fileTree( 'src' ) - - privateHeaders { - // JDK for JNI support. - from files( new File( Jvm.current().javaHome, 'include' ) ) { first().eachDir { from it } } - } + // JDK for JNI support. + privateHeaders.from files( new File( Jvm.current().javaHome, 'include' ) ) { first().eachDir { from it } } binaries.whenElementFinalized { project.dependencies { - def system = standardOperatingSystem( targetPlatform ) + def system = targetMachine.getOperatingSystemFamily().getName() // libsodium archive.dependsOn project.tasks.maybeCreate( "build_libsodium-${system}", Exec ).configure { - commandLine 'bash', "$rootDir/../lib/bin/build_libsodium-${system}" - privateHeaders.from "$rootDir/../lib/libsodium/build-${system}~/out/include" - add( linkLibraries.name, fileTree( "$rootDir/../lib/libsodium/build-${system}~/out/lib" ) ) + commandLine 'bash', "$rootDir/lib/bin/build_libsodium-${system}" + privateHeaders.from "$rootDir/lib/libsodium/build-${system}~/out/include" + add( linkLibraries.name, fileTree( "$rootDir/lib/libsodium/build-${system}~/out/lib" ) ) } clean.dependsOn project.tasks.maybeCreate( "clean_libsodium-${system}", Exec ).configure { - commandLine 'bash', "$rootDir/../lib/bin/build_libsodium-${system}", 'clean' + commandLine 'bash', "$rootDir/lib/bin/build_libsodium-${system}", 'clean' } // libjson-c /*archive.dependsOn project.tasks.maybeCreate( "build_libjson-c-${system}", Exec ).configure { - commandLine 'bash', "$rootDir/../lib/bin/build_libjson-c-${system}" - privateHeaders.from "$rootDir/../lib/libjson-c/build-${system}~/out/include" - add( linkLibraries.name, fileTree( "$rootDir/../lib/libjson-c/build-${system}~/out/lib" ) ) + commandLine 'bash', "$rootDir/lib/bin/build_libjson-c-${system}" + privateHeaders.from "$rootDir/lib/libjson-c/build-${system}~/out/include" + add( linkLibraries.name, fileTree( "$rootDir/lib/libjson-c/build-${system}~/out/lib" ) ) } clean.dependsOn project.tasks.maybeCreate( "clean_libjson-c-${system}", Exec ).configure { - commandLine 'bash', "$rootDir/../lib/bin/build_libjson-c-${system}", 'clean' + commandLine 'bash', "$rootDir/lib/bin/build_libjson-c-${system}", 'clean' }*/ } } } } - -static String standardOperatingSystem(NativePlatform platform) { - OperatingSystem os = platform.getOperatingSystem() - if (os.isWindows()) - return OperatingSystemFamily.WINDOWS - - else if (os.isMacOsX()) - return OperatingSystemFamily.MAC_OS - - else if (os.isLinux()) - return OperatingSystemFamily.LINUX - - // Other systems will need to use a Linux compatibility layer. - return OperatingSystemFamily.LINUX -} - -static String standardArchitecture(NativePlatform platform) { - Architecture arch = platform.getArchitecture() - if (arch.isArm()) - return 'arm' - - else if (arch.name.toLowerCase( Locale.ROOT ).startsWith( 'arm' )) - return 'arm64' - - else if (arch.isAmd64()) - return 'x86_64' - - else if (arch.isI386()) - return 'x86' - - // Other systems will need to be compatible with the x86 architecture. - return 'x86' -} diff --git a/platform-independent/java/algorithm/build.gradle b/platform-independent/java/algorithm/build.gradle index 901f9d30..d72079fc 100644 --- a/platform-independent/java/algorithm/build.gradle +++ b/platform-independent/java/algorithm/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java-library' + id 'com.github.spotbugs' version '2.0.0' } description = 'Master Password Algorithm Implementation' @@ -16,10 +17,8 @@ configurations { dependencies { implementation group: 'com.lyndir.lhunath.opal', name: 'opal-system', version: '1.7-p2' - api group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.5' - api group: 'org.jetbrains', name: 'annotations', version: '13.0' - api group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2' - api group: 'com.google.code.findbugs', name: 'findbugs-annotations', version: '3.0.1' + api group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.8' + api group: 'org.jetbrains', name: 'annotations', version: '16.0.2' lib project( path: ':masterpassword-core', configuration: 'default' ) } diff --git a/platform-independent/java/algorithm/src/main/java/com/lyndir/masterpassword/impl/Native.java b/platform-independent/java/algorithm/src/main/java/com/lyndir/masterpassword/impl/Native.java index a05e8334..e4dac85c 100644 --- a/platform-independent/java/algorithm/src/main/java/com/lyndir/masterpassword/impl/Native.java +++ b/platform-independent/java/algorithm/src/main/java/com/lyndir/masterpassword/impl/Native.java @@ -199,5 +199,11 @@ public final class Native { return x86; } + + + @Override + public String toString() { + return name().replace('_', '-' ); + } } } diff --git a/platform-independent/java/gui/build.gradle b/platform-independent/java/gui/build.gradle index 0f2f2ff2..fd787c87 100644 --- a/platform-independent/java/gui/build.gradle +++ b/platform-independent/java/gui/build.gradle @@ -1,7 +1,8 @@ plugins { id 'java' id 'application' - id 'com.github.johnrengelman.shadow' version '2.0.4' + id 'com.github.spotbugs' version '2.0.0' + id 'com.github.johnrengelman.shadow' version '5.1.0' } description = 'Master Password GUI' @@ -31,7 +32,7 @@ shadowJar { storepass: System.getenv( 'STORE_PW' ), keypass: System.getenv( 'KEY_PW_DESKTOP' ), preservelastmodified: 'true', - signedJar: "${rootDir}/../public/site/${project.name}-${project.version}.jar" ) + signedJar: "${rootDir}/public/site/${project.name}-${project.version}.jar" ) } } diff --git a/platform-independent/java/model/build.gradle b/platform-independent/java/model/build.gradle index 786f25df..c1ea7580 100644 --- a/platform-independent/java/model/build.gradle +++ b/platform-independent/java/model/build.gradle @@ -1,22 +1,19 @@ plugins { id 'java-library' - id 'net.ltgt.apt' version '0.9' + id 'com.github.spotbugs' version '2.0.0' } description = 'Master Password Site Model' dependencies { implementation group: 'com.lyndir.lhunath.opal', name: 'opal-system', version: '1.7-p2' - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.5' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.8' + implementation 'com.github.spotbugs:spotbugs-annotations:4.0.0-beta4' api project( ':masterpassword-algorithm' ) - api group: 'joda-time', name: 'joda-time', version: '2.4' - api group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.5' - api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.5' - api group: 'com.google.code.findbugs', name: 'findbugs-annotations', version: '3.0.1' - - compileOnly group: 'com.google.auto.value', name: 'auto-value', version: '1.2' - apt group: 'com.google.auto.value', name: 'auto-value', version: '1.2' + api group: 'joda-time', name: 'joda-time', version: '2.10' + api group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.8' + api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8' testImplementation group: 'org.testng', name: 'testng', version: '6.8.5' testImplementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.2' diff --git a/platform-independent/java/model/src/main/java/com/lyndir/masterpassword/model/impl/Changeable.java b/platform-independent/java/model/src/main/java/com/lyndir/masterpassword/model/impl/Changeable.java index 2d3a0246..de01ab41 100644 --- a/platform-independent/java/model/src/main/java/com/lyndir/masterpassword/model/impl/Changeable.java +++ b/platform-independent/java/model/src/main/java/com/lyndir/masterpassword/model/impl/Changeable.java @@ -29,7 +29,7 @@ public abstract class Changeable { } changeExecutor.submit( () -> { - synchronized (changeExecutor) { + synchronized (mutex) { if (grouping != Grouping.APPLY) return; changed = false; diff --git a/platform-independent/java/tests/build.gradle b/platform-independent/java/tests/build.gradle index 7ebd626c..45a35af4 100644 --- a/platform-independent/java/tests/build.gradle +++ b/platform-independent/java/tests/build.gradle @@ -1,17 +1,21 @@ plugins { id 'java' + id 'com.github.spotbugs' version '2.0.0' } description = 'Master Password Test Suite' dependencies { implementation group: 'com.lyndir.lhunath.opal', name: 'opal-system', version: '1.7-p2' + implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' implementation project( ':masterpassword-algorithm' ) implementation project( ':masterpassword-model' ) testImplementation group: 'org.testng', name: 'testng', version: '6.8.5' testImplementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.2' + + runtime group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.1' } test.useTestNG() diff --git a/gradle/settings.gradle b/settings.gradle similarity index 55% rename from gradle/settings.gradle rename to settings.gradle index 74f5bc7f..45b50023 100644 --- a/gradle/settings.gradle +++ b/settings.gradle @@ -5,23 +5,23 @@ def localFile = file( 'local.properties' ) localFile.exists() && local.load( localFile.newDataInputStream() ) include 'masterpassword-core' -project( ':masterpassword-core' ).projectDir = new File( '../platform-independent/c/core' ) +project( ':masterpassword-core' ).projectDir = new File( 'platform-independent/c/core' ) include 'masterpassword-algorithm' -project( ':masterpassword-algorithm' ).projectDir = new File( '../platform-independent/java/algorithm' ) +project( ':masterpassword-algorithm' ).projectDir = new File( 'platform-independent/java/algorithm' ) include 'masterpassword-model' -project( ':masterpassword-model' ).projectDir = new File( '../platform-independent/java/model' ) +project( ':masterpassword-model' ).projectDir = new File( 'platform-independent/java/model' ) include 'masterpassword-tests' -project( ':masterpassword-tests' ).projectDir = new File( '../platform-independent/java/tests' ) +project( ':masterpassword-tests' ).projectDir = new File( 'platform-independent/java/tests' ) include 'masterpassword-gui' -project( ':masterpassword-gui' ).projectDir = new File( '../platform-independent/java/gui' ) +project( ':masterpassword-gui' ).projectDir = new File( 'platform-independent/java/gui' ) if (local.containsKey( 'sdk.dir' ) && file( local.getProperty( 'sdk.dir' ) ).exists()) { include 'masterpassword-android' - project( ':masterpassword-android' ).projectDir = new File( '../platform-android' ) + project( ':masterpassword-android' ).projectDir = new File( 'platform-android' ) } else { logger.warn( "Skipping masterpassword-android since sdk.dir is not defined in local.properties." ) }