diff --git a/.gitignore b/.gitignore
index d81e438..6d15748 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@ tags
.*.swp
/.settings
/*.iml
+.idea
diff --git a/ant.properties b/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-# 'source.dir' for the location of your java source folder and
-# 'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-# 'key.store' for the location of your keystore and
-# 'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/build.gradle b/build.gradle
index 8a27fea..4fcc401 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,37 +1,9 @@
buildscript {
- repositories {
- mavenCentral()
- google()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:4.1.3'
- }
-}
-
-apply plugin: 'com.android.library'
-
-repositories {
- mavenCentral()
- google()
-}
-
-android {
- compileSdkVersion 29
- defaultConfig {
- minSdkVersion 9
- targetSdkVersion 29
- }
-
- sourceSets {
- main {
- manifest.srcFile 'AndroidManifest.xml'
- java.srcDirs = ['src']
- resources.srcDirs = ['src']
- aidl.srcDirs = ['src']
- renderscript.srcDirs = ['src']
- res.srcDirs = ['res']
- assets.srcDirs = ['assets']
- }
- }
-
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.6.0'
+ }
}
diff --git a/build.xml b/build.xml
deleted file mode 100644
index 06cf485..0000000
--- a/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..63eda80
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Aug 21 08:07:18 CEST 2019
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+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
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/AndroidManifest.xml b/lib/AndroidManifest.xml
similarity index 86%
rename from AndroidManifest.xml
rename to lib/AndroidManifest.xml
index 11cb5ef..b20a9c0 100644
--- a/AndroidManifest.xml
+++ b/lib/AndroidManifest.xml
@@ -1,6 +1,5 @@
diff --git a/lib/build.gradle b/lib/build.gradle
new file mode 100644
index 0000000..d409e3c
--- /dev/null
+++ b/lib/build.gradle
@@ -0,0 +1,23 @@
+apply plugin: 'com.android.library'
+
+android {
+ namespace "de.duenndns.ssl"
+ defaultConfig {
+ minSdkVersion 9
+ compileSdk 31
+ targetSdkVersion 31
+ }
+
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = ['src']
+ resources.srcDirs = ['src']
+ aidl.srcDirs = ['src']
+ renderscript.srcDirs = ['src']
+ res.srcDirs = ['res']
+ assets.srcDirs = ['assets']
+ }
+ }
+
+}
diff --git a/res/values-de/strings.xml b/lib/res/values-de/strings.xml
similarity index 83%
rename from res/values-de/strings.xml
rename to lib/res/values-de/strings.xml
index ab5caea..a6b0968 100644
--- a/res/values-de/strings.xml
+++ b/lib/res/values-de/strings.xml
@@ -1,12 +1,10 @@
- Unbekanntes Zertifikat akzeptieren?
Das Serverzertifikat stammt nicht von einer bekannten Ausstellungsstelle (CA).
Das Serverzertifikat ist abgelaufen.
Abweichenden Servernamen akzeptieren?
Der Server konnte sich nicht als »%s« ausweisen. Das Zertifikat gilt nur für:
- Verbindung trotzdem aufbauen?
Zertifikatdetails:
Immer
diff --git a/res/values-es/strings.xml b/lib/res/values-es/strings.xml
similarity index 83%
rename from res/values-es/strings.xml
rename to lib/res/values-es/strings.xml
index c989db3..c638ff3 100644
--- a/res/values-es/strings.xml
+++ b/lib/res/values-es/strings.xml
@@ -1,12 +1,10 @@
- ¿Aceptar certicado desconocido?
El certificado del servidor no está firmado por una Autoridad Conocida (CA).
The server certificate is expired.
¿Aceptar discordancia en nombre del servidor?
El servidor no ha podido autenticarte como \"%s\". El certificado es solo válido para:
- ¿Quieres conectar de todas formas?
Detalle del certificado:
Siempre
diff --git a/res/values-eu/strings.xml b/lib/res/values-eu/strings.xml
similarity index 85%
rename from res/values-eu/strings.xml
rename to lib/res/values-eu/strings.xml
index 6406998..39c7e32 100644
--- a/res/values-eu/strings.xml
+++ b/lib/res/values-eu/strings.xml
@@ -1,12 +1,10 @@
- Ziurtagiri ezezaguna onartu?
Zerbitzariaren ziurtagiria ez dago Ziurtagiri-emaile Autoritate ezagun batez sinatuta.
Zerbitzariaren ziurtagiria iraungi da.
Zerbitzariaren izeneko desadostasuna onartu?
Zerbitzaria ezin izan da \"%s\" bezala autentifikatu. Ziurtagiria soilik honetarako baliagarria da:
- Konektatu hala ere?
Ziurtagiriaren xehetasunak:
Beti
diff --git a/res/values-fi/strings.xml b/lib/res/values-fi/strings.xml
similarity index 81%
rename from res/values-fi/strings.xml
rename to lib/res/values-fi/strings.xml
index 6001b2d..bda99a4 100644
--- a/res/values-fi/strings.xml
+++ b/lib/res/values-fi/strings.xml
@@ -1,12 +1,10 @@
- Hyväksytäänkö palvelimen antama tuntematon varmenne?
Palvelimen varmenne ei ole tunnetun varmentajan (CA) allekirjoittama.
The server certificate is expired.
Sallitaanko palvelimen nimi, joka ei vastaa varmeenteessa olevaa nimeä?
Palvelimella ei ole varmennetta nimelle \"%s\". Varmenteen sisältämät nimet:
- Haluatko jatkaa yhteyden muodostamista?
Sertifikaatin tiedot:
Aina
diff --git a/res/values-fr/strings.xml b/lib/res/values-fr/strings.xml
similarity index 83%
rename from res/values-fr/strings.xml
rename to lib/res/values-fr/strings.xml
index c1fa6ec..6b7a95e 100644
--- a/res/values-fr/strings.xml
+++ b/lib/res/values-fr/strings.xml
@@ -1,12 +1,10 @@
- Accepter les certificats inconnus ?
Le certificat du serveur n’est pas signé par une Autorité de Certification reconnue.
Le certificat a expiré.
Accepter le nom de serveur qui ne concorde pas ?
Le serveur n\'a pas pu s\'authentifier comme « %s ». Le certificat est valide uniquement pour :
- Voulez-vous vous connecter quand même ?
Détails du certificat :
Toujours
diff --git a/res/values-iw/strings.xml b/lib/res/values-iw/strings.xml
similarity index 82%
rename from res/values-iw/strings.xml
rename to lib/res/values-iw/strings.xml
index 5b0619b..b49f1ba 100644
--- a/res/values-iw/strings.xml
+++ b/lib/res/values-iw/strings.xml
@@ -1,12 +1,10 @@
- לקבל תעודה לא מוכרת?
תעודת השרת אינה חתומה על ידי Certificate Authority מוכר.
The server certificate is expired.
לקבל שם שרת לא תואם?
שרת לא היה מסוגל לאמת בתור \"%s\". התעודה הינה ברת תוקף רק עבור:
- האם ברצונך להתחבר בכל אופן?
פרטי תעודה:
תמיד
diff --git a/res/values-no/strings.xml b/lib/res/values-no/strings.xml
similarity index 83%
rename from res/values-no/strings.xml
rename to lib/res/values-no/strings.xml
index 79fa296..63213a7 100644
--- a/res/values-no/strings.xml
+++ b/lib/res/values-no/strings.xml
@@ -1,12 +1,10 @@
- Godta ukjent sertifikat?
Sertifikatet er ikke utstilt av en kjent utstiller (CA).
The server certificate is expired.
Godta feil servernavn?
Serveren heter ikke \"%s\". Sertifikatet gjelder bare for:
- Vil du bruke serveren likevel?
Sertifikatdetaljer:
Alltid
diff --git a/res/values-ru/strings.xml b/lib/res/values-ru/strings.xml
similarity index 83%
rename from res/values-ru/strings.xml
rename to lib/res/values-ru/strings.xml
index 3259925..73fee70 100644
--- a/res/values-ru/strings.xml
+++ b/lib/res/values-ru/strings.xml
@@ -1,12 +1,10 @@
- Принять неизвестный сертификат?
Сертификат сервера не подписан известным центром сертификации.
Срок действия сертификата сервера истёк.
Принять несоответствующее имя сервера?
Сервер не может аутентифицироваться как \"%s\". Сертификат действителен только для:
- Вы всё равно хотите подключиться?
Сведения о сертификате:
Всегда
diff --git a/res/values-tr/strings.xml b/lib/res/values-tr/strings.xml
similarity index 82%
rename from res/values-tr/strings.xml
rename to lib/res/values-tr/strings.xml
index 63ae5d6..7509011 100644
--- a/res/values-tr/strings.xml
+++ b/lib/res/values-tr/strings.xml
@@ -1,12 +1,10 @@
- Bilinmeyen Sertifikayı Kabul Ediyor musunuz?
Sunucu Sertifikası bilinen bir Sertifika Otoritesi tarafından imzalanmamıştır.
The server certificate is expired.
Eşleşmeyen Sunucu İsmi Kabul Edilsin mi?
Sunucu \"%s\" olarak kimliğini teyit edemedi. Sertifika sadece şunun için geçerlidir:
- Gene de bağlanmak istiyor musunuz?
Sertifika detayları:
Daima
diff --git a/res/values-zh-rCN/strings.xml b/lib/res/values-zh-rCN/strings.xml
similarity index 82%
rename from res/values-zh-rCN/strings.xml
rename to lib/res/values-zh-rCN/strings.xml
index a1f4bc1..623c264 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/lib/res/values-zh-rCN/strings.xml
@@ -1,12 +1,10 @@
- 是否接受未知的证书?
服务器证书没有被签名
The server certificate is expired.
是否接受不匹配的服务器名
服务器不能给\"%s\"授权. 证书只对:有效
- Do you want to connect anyway?
证书详情
总是
diff --git a/res/values/strings.xml b/lib/res/values/strings.xml
similarity index 100%
rename from res/values/strings.xml
rename to lib/res/values/strings.xml
diff --git a/lib/settings.gradle b/lib/settings.gradle
new file mode 100644
index 0000000..96d5088
--- /dev/null
+++ b/lib/settings.gradle
@@ -0,0 +1,9 @@
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+include ':example'
diff --git a/src/de/duenndns/ssl/MTMDecision.java b/lib/src/de/duenndns/ssl/MTMDecision.java
similarity index 100%
rename from src/de/duenndns/ssl/MTMDecision.java
rename to lib/src/de/duenndns/ssl/MTMDecision.java
diff --git a/src/de/duenndns/ssl/MemorizingActivity.java b/lib/src/de/duenndns/ssl/MemorizingActivity.java
similarity index 100%
rename from src/de/duenndns/ssl/MemorizingActivity.java
rename to lib/src/de/duenndns/ssl/MemorizingActivity.java
diff --git a/src/de/duenndns/ssl/MemorizingTrustManager.java b/lib/src/de/duenndns/ssl/MemorizingTrustManager.java
similarity index 98%
rename from src/de/duenndns/ssl/MemorizingTrustManager.java
rename to lib/src/de/duenndns/ssl/MemorizingTrustManager.java
index 3e4236f..aca8bf2 100644
--- a/src/de/duenndns/ssl/MemorizingTrustManager.java
+++ b/lib/src/de/duenndns/ssl/MemorizingTrustManager.java
@@ -37,6 +37,7 @@
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
+import android.util.Log;
import android.util.SparseArray;
import android.os.Build;
import android.os.Handler;
@@ -167,7 +168,7 @@ void init(Context m) {
File dir = app.getDir(KEYSTORE_DIR, Context.MODE_PRIVATE);
keyStoreFile = new File(dir + File.separator + KEYSTORE_FILE);
-
+ LOGGER.log(Level.INFO, "init(): Using keyStoreFile " + keyStoreFile.getPath());
appKeyStore = loadAppKeyStore();
}
@@ -362,13 +363,14 @@ KeyStore loadAppKeyStore() {
void storeCert(String alias, Certificate cert) {
try {
appKeyStore.setCertificateEntry(alias, cert);
+ LOGGER.log(Level.INFO, "storeCert(" + alias + ")");
} catch (KeyStoreException e) {
LOGGER.log(Level.SEVERE, "storeCert(" + cert + ")", e);
return;
- }
+ }
keyStoreUpdated();
}
-
+
void storeCert(X509Certificate cert) {
storeCert(cert.getSubjectDN().toString(), cert);
}
@@ -425,7 +427,7 @@ private static boolean isPathException(Throwable e) {
public void checkCertTrusted(X509Certificate[] chain, String authType, boolean isServer)
throws CertificateException
{
- LOGGER.log(Level.FINE, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")");
+ LOGGER.log(Level.INFO, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")");
try {
LOGGER.log(Level.FINE, "checkCertTrusted: trying appTrustManager");
if (isServer)
@@ -549,7 +551,7 @@ private void certDetails(StringBuilder si, X509Certificate c) {
si.append(c.getIssuerDN().toString());
si.append("\n");
}
-
+
private String certChainMessage(final X509Certificate[] chain, CertificateException cause) {
Throwable e = cause;
LOGGER.log(Level.FINE, "certChainMessage for " + e);
@@ -619,8 +621,11 @@ private static void setLatestEventInfoReflective(Notification notification,
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
void startActivityNotification(Intent intent, int decisionId, String certName) {
Notification notification;
- final PendingIntent call = PendingIntent.getActivity(master, 0, intent,
- 0);
+ int flags = 0;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ flags |= PendingIntent.FLAG_MUTABLE;
+ }
+ final PendingIntent call = PendingIntent.getActivity(master, 0, intent, flags);
final String mtmNotification = master.getString(R.string.mtm_notification);
final long currentMillis = System.currentTimeMillis();
final Context context = master.getApplicationContext();
@@ -683,9 +688,9 @@ public void run() {
// invalid / expired activity, the catch-all fallback is
// deployed.
try {
- foregroundAct.startActivity(ni);
+ getUI().startActivity(ni);
} catch (Exception e) {
- LOGGER.log(Level.FINE, "startActivity(MemorizingActivity)", e);
+ LOGGER.log(Level.SEVERE, "startActivity(MemorizingActivity)", e);
startActivityNotification(ni, myId, message);
}
}
@@ -700,7 +705,7 @@ public void run() {
LOGGER.log(Level.FINE, "finished wait on " + myId + ": " + choice.state);
return choice.state;
}
-
+
void interactCert(final X509Certificate[] chain, String authType, CertificateException cause)
throws CertificateException
{
@@ -741,10 +746,10 @@ protected static void interactResult(int decisionId, int choice) {
d.notify();
}
}
-
+
class MemorizingHostnameVerifier implements HostnameVerifier {
private HostnameVerifier defaultVerifier;
-
+
public MemorizingHostnameVerifier(HostnameVerifier wrapped) {
defaultVerifier = wrapped;
}
diff --git a/libs/.android_sucks b/libs/.android_sucks
deleted file mode 100644
index e69de29..0000000
diff --git a/project.properties b/project.properties
deleted file mode 100644
index cb55769..0000000
--- a/project.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-android.library=true
-# Project target.
-target=android-23
diff --git a/settings.gradle b/settings.gradle
index ff1d046..0720016 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,13 @@
-include ':example'
+pluginManagement {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+dependencyResolutionManagement {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+include ':lib'