diff --git a/.gitignore b/.gitignore index 8abb0fce..541b49d1 100644 --- a/.gitignore +++ b/.gitignore @@ -54,8 +54,10 @@ pom.xml.asc /fixtures/*.db-shm /fixtures/*.db-wal /query-parser/out/ + ## Build generated /sdks/swift/Mentat/build/ +/sdks/android/**/build DerivedData build.xcarchive @@ -78,4 +80,10 @@ build.xcarchive ## Obj-C/Swift specific *.hmap -*.ipa \ No newline at end of file +*.ipa + + +# Android & IntelliJ +**/*.iml +**/.idea +/sdks/android/**/local.properties diff --git a/ffi/README.md b/ffi/README.md new file mode 100644 index 00000000..db3153d6 --- /dev/null +++ b/ffi/README.md @@ -0,0 +1,22 @@ +# Development flow for Mentat FFI + +## Android SDK +Android Mentat SDK is one of two first-party consumers (the other one being iOS Mentat SDK). + +Binaries produced by `cargo build ...` are symlinked from within the SDK, and a number of target-specific `libmentat_ffi.so` binaries are bundled together and distributed with the SDK. + +There is a build script at `/scripts/android_build.sh` which knows how to cross-compile `mentat_ffi` for various Android targets. + +- `.//scripts/android_build.sh` - compiles for all supported targets +- `.//scripts/android_build.sh x86` - compiles for `x86` +- `.//scripts/android_build.sh x86 arm` - compiles for `x86`, `arm` + +General development flow while working on the Android SDK is: +- (pre) compile for all targets, if you've never done so +- make changes to `mentat_ffi` and/or `mentat` +- re-compile `mentat_ffi` binaries using `./android_build.sh x86`. During development it's faster to compile just for the target which matches your emulator, e.g. `x86` +- make corresponding changes in the Android SDK, try them out from within the bundled sample project +- since binaries are symlinked, no manual copy step is necessary for the Android SDK to pick up the changes + +## iOS SDK +TODO, contribute via [issue #732](https://github.com/mozilla/mentat/issues/732). diff --git a/sdks/android/Mentat/build.gradle b/sdks/android/Mentat/build.gradle index 9f40753e..8146fd8e 100644 --- a/sdks/android/Mentat/build.gradle +++ b/sdks/android/Mentat/build.gradle @@ -7,6 +7,12 @@ buildscript { version: '0.3.1' ] + ext.build = [ + compileSdkVersion: 27, + targetSdkVersion: 27, + minSdkVersion: 16 + ] + repositories { jcenter() google() diff --git a/sdks/android/Mentat/gradle/wrapper/gradle-wrapper.properties b/sdks/android/Mentat/gradle/wrapper/gradle-wrapper.properties index 2cd17130..e2520ecb 100644 --- a/sdks/android/Mentat/gradle/wrapper/gradle-wrapper.properties +++ b/sdks/android/Mentat/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -#Mon May 28 21:36:15 EDT 2018 +#Thu May 31 19:25:23 EDT 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/sdks/android/Mentat/library/build.gradle b/sdks/android/Mentat/library/build.gradle index 5facabdb..4b43ed23 100644 --- a/sdks/android/Mentat/library/build.gradle +++ b/sdks/android/Mentat/library/build.gradle @@ -5,12 +5,11 @@ apply plugin: 'com.jfrog.bintray' apply plugin: 'com.github.dcendents.android-maven' android { - compileSdkVersion 27 + compileSdkVersion rootProject.ext.build['compileSdkVersion'] defaultConfig { - minSdkVersion 16 - targetSdkVersion 27 - versionCode 1 - versionName "1.0" + minSdkVersion rootProject.ext.build['minSdkVersion'] + targetSdkVersion rootProject.ext.build['targetSdkVersion'] + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so deleted file mode 100644 index 6bed1721..00000000 Binary files a/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so and /dev/null differ diff --git a/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so new file mode 120000 index 00000000..192961bd --- /dev/null +++ b/sdks/android/Mentat/library/src/main/jniLibs/arm64/libmentat_ffi.so @@ -0,0 +1 @@ +../../../../../../../../target/aarch64-linux-android/release/libmentat_ffi.so \ No newline at end of file diff --git a/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so deleted file mode 100644 index ac20e94b..00000000 Binary files a/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so and /dev/null differ diff --git a/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so new file mode 120000 index 00000000..f248755f --- /dev/null +++ b/sdks/android/Mentat/library/src/main/jniLibs/armeabi/libmentat_ffi.so @@ -0,0 +1 @@ +../../../../../../../../target/armv7-linux-androideabi/release/libmentat_ffi.so \ No newline at end of file diff --git a/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so deleted file mode 100755 index fbeae458..00000000 Binary files a/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so and /dev/null differ diff --git a/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so b/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so new file mode 120000 index 00000000..2d4f93c2 --- /dev/null +++ b/sdks/android/Mentat/library/src/main/jniLibs/x86/libmentat_ffi.so @@ -0,0 +1 @@ +../../../../../../../../target/i686-linux-android/release/libmentat_ffi.so \ No newline at end of file diff --git a/sdks/android/Mentat/samples/basic/build.gradle b/sdks/android/Mentat/samples/basic/build.gradle new file mode 100644 index 00000000..49fa1822 --- /dev/null +++ b/sdks/android/Mentat/samples/basic/build.gradle @@ -0,0 +1,38 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion rootProject.ext.build['compileSdkVersion'] + + defaultConfig { + applicationId "org.mozilla.samples.mentat.basic" + minSdkVersion rootProject.ext.build['minSdkVersion'] + targetSdkVersion rootProject.ext.build['targetSdkVersion'] + 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 project(':library') + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "com.android.support:appcompat-v7:27.1.1" +} + +repositories { + mavenCentral() +} diff --git a/sdks/android/Mentat/samples/basic/proguard-rules.pro b/sdks/android/Mentat/samples/basic/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/sdks/android/Mentat/samples/basic/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/sdks/android/Mentat/samples/basic/src/main/AndroidManifest.xml b/sdks/android/Mentat/samples/basic/src/main/AndroidManifest.xml new file mode 100644 index 00000000..ca9f02ee --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + diff --git a/sdks/android/Mentat/samples/basic/src/main/java/org/mozilla/samples/basic/MainActivity.kt b/sdks/android/Mentat/samples/basic/src/main/java/org/mozilla/samples/basic/MainActivity.kt new file mode 100644 index 00000000..81c75a42 --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/java/org/mozilla/samples/basic/MainActivity.kt @@ -0,0 +1,28 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * Copyright 2018 Mozilla + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use + * this file except in compliance with the License. You may obtain a copy of the + * License at http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. */ + +package org.mozilla.samples.basic + +import android.support.v7.app.AppCompatActivity +import android.os.Bundle + +import org.mozilla.mentat.Mentat + +class MainActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + Mentat(this.getDatabasePath("test.db").absolutePath).use { + } + } +} + diff --git a/sdks/android/Mentat/samples/basic/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sdks/android/Mentat/samples/basic/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..c7bd21db --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/sdks/android/Mentat/samples/basic/src/main/res/drawable/ic_launcher_background.xml b/sdks/android/Mentat/samples/basic/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..d5fccc53 --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdks/android/Mentat/samples/basic/src/main/res/layout/activity_main.xml b/sdks/android/Mentat/samples/basic/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..e20f5d69 --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-hdpi/ic_launcher.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 00000000..a2f59082 Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 00000000..1b523998 Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-mdpi/ic_launcher.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 00000000..ff10afd6 Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-mdpi/ic_launcher_round.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 00000000..115a4c76 Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xhdpi/ic_launcher.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 00000000..dcd3cd80 Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 00000000..459ca609 Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 00000000..8ca12fe0 Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 00000000..8e19b410 Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000..b824ebdd Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 00000000..4c19a13c Binary files /dev/null and b/sdks/android/Mentat/samples/basic/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/sdks/android/Mentat/samples/basic/src/main/res/values/colors.xml b/sdks/android/Mentat/samples/basic/src/main/res/values/colors.xml new file mode 100644 index 00000000..3ab3e9cb --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/sdks/android/Mentat/samples/basic/src/main/res/values/strings.xml b/sdks/android/Mentat/samples/basic/src/main/res/values/strings.xml new file mode 100644 index 00000000..4daea835 --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + MentatSDKSampleBasic + diff --git a/sdks/android/Mentat/samples/basic/src/main/res/values/styles.xml b/sdks/android/Mentat/samples/basic/src/main/res/values/styles.xml new file mode 100644 index 00000000..5885930d --- /dev/null +++ b/sdks/android/Mentat/samples/basic/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/sdks/android/Mentat/settings.gradle b/sdks/android/Mentat/settings.gradle index d8f14a13..6b8f0de7 100644 --- a/sdks/android/Mentat/settings.gradle +++ b/sdks/android/Mentat/settings.gradle @@ -1 +1,5 @@ include ':library' + +// SDK sample +include ':samples-basic' +project(':samples-basic').projectDir = new File(rootDir, 'samples/basic') diff --git a/sdks/android/README.md b/sdks/android/README.md new file mode 100644 index 00000000..5ed440b1 --- /dev/null +++ b/sdks/android/README.md @@ -0,0 +1,8 @@ +# Android Mentat SDK + +Exposes Mentat functionality to Android applications via the foreign function interface provided by `mentat_ffi`. + +Note that `libmentat_ffi.so` binaries are symlinked. Use [the cross-compilation script](https://github.com/mozilla/mentat/tree/master/scripts/android_build.sh) to build them. Windows users: apologies if you're on FAT; symlinks are supported on NTFS (on Vista and later). + +- See [sample projects](https://github.com/mozilla/mentat/tree/master/sdks/android/Mentat/samples) for how one might use the SDK. +- See [documentation](https://github.com/mozilla/mentat/tree/master/ffi/README.md) within the `mentat_ffi` crate for development flow.