diff --git a/.travis.yml b/.travis.yml index 330534561..3523186fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: android android: components: - - android-9 + - android-16 jdk: - oraclejdk8 sudo: false diff --git a/build.gradle b/build.gradle index 12a3ca94b..77bf4c0b5 100644 --- a/build.gradle +++ b/build.gradle @@ -428,7 +428,7 @@ subprojects { } } -configure (androidProjects) { +configure (androidProjects + androidBootClasspathProjects) { apply plugin: 'ru.vyarus.animalsniffer' dependencies { signature "net.sf.androidscents.signature:android-api-level-${smackMinAndroidSdk}:2.3.1_r2@signature" @@ -580,12 +580,21 @@ def getGitCommit() { } def getAndroidRuntimeJar() { + // We set a different Android API level compared to + // smackMinAndroidSdk here. The runtime jar retrieved via this + // method is, compared to earlier Smack versions, not used to + // check for Android API compatibility. Instead it is used to for + // the eclipse classpath, for javadoc and when compiling the pure + // Android subprojects of Smack. Currently we require level 16 + // here, because of the @TargetApi annotation found in + // AndroidUsingLinkProperties of minidns-android21. + def androidApiLevel = 16 def androidHome = getAndroidHome() - def androidJar = new File("$androidHome/platforms/android-$smackMinAndroidSdk/android.jar") + def androidJar = new File("$androidHome/platforms/android-${androidApiLevel}/android.jar") if (androidJar.isFile()) { return androidJar } else { - throw new Exception("Can't find android.jar for $smackMinAndroidSdk API. Please install corresponding SDK platform package") + throw new Exception("Can't find android.jar for $androidApiLevel API. Please install corresponding SDK platform package") } } diff --git a/smack-android/src/main/java/org/jivesoftware/smack/android/AndroidSmackInitializer.java b/smack-android/src/main/java/org/jivesoftware/smack/android/AndroidSmackInitializer.java index f9dcbdf1a..81a228ce0 100644 --- a/smack-android/src/main/java/org/jivesoftware/smack/android/AndroidSmackInitializer.java +++ b/smack-android/src/main/java/org/jivesoftware/smack/android/AndroidSmackInitializer.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2014-2017 Florian Schmaus + * Copyright © 2014-2018 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,8 +25,15 @@ import org.jivesoftware.smack.util.stringencoder.Base64UrlSafeEncoder; import org.jivesoftware.smack.util.stringencoder.android.AndroidBase64Encoder; import org.jivesoftware.smack.util.stringencoder.android.AndroidBase64UrlSafeEncoder; +import android.content.Context; import org.apache.http.conn.ssl.StrictHostnameVerifier; +import org.minidns.dnsserverlookup.android21.AndroidUsingLinkProperties; +/** + * This class initialized Smack for you on Android. Unfortunately it can't do it automatically, you should call + * {@link #initialize(Context)} once before performing your first XMPP connection with Smack. Note that on Android 21 or + * higher you need to hold the ACCESS_NETWORK_STATE permission. + */ public class AndroidSmackInitializer implements SmackInitializer { @Override @@ -37,4 +44,13 @@ public class AndroidSmackInitializer implements SmackInitializer { return null; } + /** + * Initializes Smack on Android. You should call this method fore performing your first XMPP connection with Smack. + * + * @param context an Android context. + * @since 4.3 + */ + public static void initialize(Context context) { + AndroidUsingLinkProperties.setup(context); + } }