From ab30b0c921f4db77478ba419420679931d9b89b3 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Sun, 6 May 2018 13:35:11 +0200 Subject: [PATCH] Add AndroidSmackInitializer.initialize(Context) This commit also changes the usage of the android.jar found in the androidBootClasspath gradle variable, because AndroidSmackInitializer.initialize(Context) pulls in org.minidns.dnsserverlookup.android21.AndroidUsingLinkProperties from minidns-android21, which has a @TargetApi annotation which is only available on Android SDK API level 16 or higher. Otherwhise we would get > Task :smack-android:compileJava FAILED /home/flo/.gradle/caches/modules-2/files-2.1/org.minidns/minidns-android21/0.3.0/13f273d095e51d701283062a25e867f3ff26d258/minidns-android21-0.3.0.jar(/org/minidns/dnsserverlookup/android21/AndroidUsingLinkProperties.class): warning: Cannot find annotation method 'value()' in type 'TargetApi': class file for android.annotation.TargetApi not found /home/flo/.gradle/caches/modules-2/files-2.1/org.minidns/minidns-android21/0.3.0/13f273d095e51d701283062a25e867f3ff26d258/minidns-android21-0.3.0.jar(/org/minidns/dnsserverlookup/android21/AndroidUsingLinkProperties.class): warning: Cannot find annotation method 'value()' in type 'TargetApi' error: warnings found and -Werror specified 1 error when compiling smack-android. --- .travis.yml | 2 +- build.gradle | 15 ++++++++++++--- .../smack/android/AndroidSmackInitializer.java | 18 +++++++++++++++++- 3 files changed, 30 insertions(+), 5 deletions(-) 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); + } }