diff --git a/CHANGELOG.md b/CHANGELOG.md index bac4be2..80572b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.5 - 2017-09-11 + +- Convert to Kotlin library. + ## 1.0.4 - 2017-09-11 - Minor tweaks. diff --git a/README.md b/README.md index 94811d6..5dfc35b 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A simple utility class that allows you to track when your Android application ha ```groovy -compile 'com.miguelgaeta.android-backgrounded:backgrounded:1.0.4' +compile 'com.miguelgaeta.android-backgrounded:backgrounded:1.0.5' ``` diff --git a/app/build.gradle b/app/build.gradle index df98238..a20f12f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' android { - compileSdkVersion 26 - buildToolsVersion '25.0.0' + compileSdkVersion rootProject.ext.target_sdk_version + buildToolsVersion rootProject.ext.build_tools_version defaultConfig { applicationId "com.miguelgaeta.android_backgrounded" - minSdkVersion 14 - targetSdkVersion 26 - versionCode 1 - versionName "1.0" + + minSdkVersion rootProject.ext.min_sdk_version + targetSdkVersion rootProject.ext.target_sdk_version } buildTypes { release { @@ -22,10 +22,13 @@ android { dependencies { //noinspection GradleDynamicVersion - compile 'com.android.support:appcompat-v7:26+' + compile "com.android.support:appcompat-v7:$target_sdk_version+" //noinspection GradleDynamicVersion compile 'io.reactivex:rxjava:1.+' + //noinspection GradleDynamicVersion + compile 'org.jetbrains.kotlin:kotlin-stdlib-jre7:1.+' + compile project(':backgrounded') } diff --git a/app/src/main/java/com/miguelgaeta/AppActivity.java b/app/src/main/java/com/miguelgaeta/AppActivity.java deleted file mode 100644 index 73e928c..0000000 --- a/app/src/main/java/com/miguelgaeta/AppActivity.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.miguelgaeta; - -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.util.Log; - -import com.miguelgaeta.backgrounded.Backgrounded; - -import rx.functions.Action1; - -public class AppActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Backgrounded.init(getApplication()); - Backgrounded.get().subscribe(new Action1() { - - @Override - public void call(Boolean backgrounded) { - - Log.e("Test", "Backgrounded status: " + backgrounded); - } - }); - - Log.e("Test", "Currently backgrounded: " + Backgrounded.isBackgrounded()); - } -} diff --git a/app/src/main/java/com/miguelgaeta/AppActivity.kt b/app/src/main/java/com/miguelgaeta/AppActivity.kt new file mode 100644 index 0000000..bcd7f6a --- /dev/null +++ b/app/src/main/java/com/miguelgaeta/AppActivity.kt @@ -0,0 +1,24 @@ +package com.miguelgaeta + +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.util.Log +import com.miguelgaeta.backgrounded.Backgrounded + +class AppActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + Backgrounded.init(application) + Backgrounded.get().subscribe { backgrounded -> Log.e("Test", "Backgrounded status: " + backgrounded) } + + Log.e("Test", "Currently backgrounded: " + Backgrounded.isBackgrounded()) + } + + override fun onDestroy() { + super.onDestroy() + + Backgrounded.destroy(application) + } +} diff --git a/backgrounded/build.gradle b/backgrounded/build.gradle index 5b9e94e..4a6f457 100644 --- a/backgrounded/build.gradle +++ b/backgrounded/build.gradle @@ -1,12 +1,13 @@ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' android { - compileSdkVersion 26 - buildToolsVersion '25.0.0' + compileSdkVersion rootProject.ext.target_sdk_version + buildToolsVersion rootProject.ext.build_tools_version defaultConfig { - minSdkVersion 14 - targetSdkVersion 26 + minSdkVersion rootProject.ext.min_sdk_version + targetSdkVersion rootProject.ext.target_sdk_version } buildTypes { @@ -21,6 +22,9 @@ dependencies { //noinspection GradleDynamicVersion provided 'io.reactivex:rxjava:1.+' + + //noinspection GradleDynamicVersion + provided "org.jetbrains.kotlin:kotlin-stdlib-jre7:1.+" } apply from: '../build.release-aar.gradle' diff --git a/backgrounded/src/main/java/com/miguelgaeta/backgrounded/Backgrounded.java b/backgrounded/src/main/java/com/miguelgaeta/backgrounded/Backgrounded.java deleted file mode 100644 index f9f1db2..0000000 --- a/backgrounded/src/main/java/com/miguelgaeta/backgrounded/Backgrounded.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.miguelgaeta.backgrounded; - -import android.app.Activity; -import android.app.Application; -import android.os.Bundle; -import android.util.Log; - -import java.util.concurrent.TimeUnit; - -import rx.Observable; -import rx.Subscription; -import rx.functions.Action1; -import rx.subjects.BehaviorSubject; -import rx.subjects.SerializedSubject; -import rx.subjects.Subject; - -/** - * Utility class that uses {@link Application.ActivityLifecycleCallbacks} to heuristically - * track whether or not the current application is in the foreground or background. - */ -public class Backgrounded { - - private static Lifecycle lifecycle; - - public static void init(Application application) { - - lifecycle = new Lifecycle(); - - if (application != null) { - application.registerActivityLifecycleCallbacks(lifecycle); - } - } - - @SuppressWarnings("unused") - public static void destroy(Application application) { - - if (application != null) { - application.unregisterActivityLifecycleCallbacks(lifecycle); - } - } - - public static Observable get() { - - checkInitialized(); - - return lifecycle.emitter.distinctUntilChanged(); - } - - public static boolean isBackgrounded() { - - checkInitialized(); - - return lifecycle.emitter.toBlocking().mostRecent(true).iterator().next(); - } - - private static void checkInitialized() { - - if (lifecycle == null) { - - throw new RuntimeException("Backgrounded utility is not initialized."); - } - } - - private static class Lifecycle implements Application.ActivityLifecycleCallbacks { - - private static final int DELAY = 2000; - private static final int DELAY_SHORT = 500; - - private static final String TAG = "Backgrounded"; - - private final Subject emitter = new SerializedSubject<>(BehaviorSubject.create()); - private Subscription subscription; - - Lifecycle() { - - checkBackgrounded(DELAY_SHORT); - } - - @Override - public void onActivityCreated(Activity activity, Bundle bundle) { - - } - - @Override - public void onActivityStarted(Activity activity) { - - } - - @Override - public void onActivityResumed(Activity activity) { - - if (subscription != null) { - subscription.unsubscribe(); - } - - emitter.onNext(false); - } - - @Override - public void onActivityPaused(Activity activity) { - - checkBackgrounded(DELAY); - } - - @Override - public void onActivityStopped(Activity activity) { - - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { - - } - - @Override - public void onActivityDestroyed(Activity activity) { - - } - - private void checkBackgrounded(final int delay) { - - subscription = Observable.timer(delay, TimeUnit.MILLISECONDS).subscribe(new Action1() { - - @Override - public void call(Long aLong) { - - emitter.onNext(true); - } - - }, new Action1() { - - @Override - public void call(Throwable throwable) { - - Log.e(TAG, "Subscription error in backgrounded delay."); - } - }); - } - } -} diff --git a/backgrounded/src/main/java/com/miguelgaeta/backgrounded/Backgrounded.kt b/backgrounded/src/main/java/com/miguelgaeta/backgrounded/Backgrounded.kt new file mode 100644 index 0000000..e1e1c0f --- /dev/null +++ b/backgrounded/src/main/java/com/miguelgaeta/backgrounded/Backgrounded.kt @@ -0,0 +1,85 @@ +package com.miguelgaeta.backgrounded + +import android.app.Activity +import android.app.Application +import android.os.Bundle +import android.util.Log +import rx.Observable +import rx.Subscription +import rx.subjects.BehaviorSubject +import rx.subjects.SerializedSubject +import java.util.concurrent.TimeUnit + +/** + * Utility class that uses [Application.ActivityLifecycleCallbacks] to heuristically + * track whether or not the current application is in the foreground or background. + */ +object Backgrounded { + + private val lifecycle: Lifecycle = Lifecycle() + + @JvmStatic fun init(application: Application?) { + application?.registerActivityLifecycleCallbacks(lifecycle) + } + + @JvmStatic fun destroy(application: Application?) { + application?.unregisterActivityLifecycleCallbacks(lifecycle) + } + + @JvmStatic fun get(): Observable = + lifecycle.emitter.distinctUntilChanged() + + @JvmStatic fun isBackgrounded(): Boolean = + lifecycle.emitter.toBlocking().mostRecent(true).iterator().next() + + private class Lifecycle internal constructor() : Application.ActivityLifecycleCallbacks { + + internal val emitter = SerializedSubject(BehaviorSubject.create()) + internal var subscription: Subscription? = null + + init { + checkBackgrounded(DELAY_SHORT) + } + + override fun onActivityCreated(activity: Activity, bundle: Bundle) { + } + + override fun onActivityStarted(activity: Activity) { + } + + override fun onActivityResumed(activity: Activity) { + subscription?.unsubscribe() + + emitter.onNext(false) + } + + override fun onActivityPaused(activity: Activity) { + checkBackgrounded(DELAY) + } + + override fun onActivityStopped(activity: Activity) { + } + + override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) { + } + + override fun onActivityDestroyed(activity: Activity) { + } + + private fun checkBackgrounded(delay: Long) { + subscription = Observable + .just(true) + .delay(delay, TimeUnit.MILLISECONDS) + .subscribe(emitter::onNext) { Log.e(TAG, TAG_ERROR) } + } + + companion object { + + private val DELAY = 2000L + private val DELAY_SHORT = 500L + + private val TAG = "Backgrounded" + private val TAG_ERROR = "Subscription error in backgrounded delay." + } + } +} diff --git a/build.gradle b/build.gradle index 8a4e037..aa4154e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,17 @@ buildscript { + ext.kotlin_version = '1.1.51' + ext.build_tools_version = '26.0.1' + ext.gradle_tools_version = '2.3.3' + ext.min_sdk_version = 14 + ext.target_sdk_version = 26 + repositories { jcenter() } + dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath "com.android.tools.build:gradle:$gradle_tools_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/build.release-aar.gradle b/build.release-aar.gradle index 3ed9892..4e2cfa0 100644 --- a/build.release-aar.gradle +++ b/build.release-aar.gradle @@ -8,21 +8,6 @@ def version = POM_VERSION_ID def localReleaseDest = "${buildDir}/release/${version}" -task androidJavadocs(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar" - - //noinspection GroovyAssignabilityCheck - classpath += files(ext.androidJar) -} - -task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { - classifier = 'javadoc' - - //noinspection GroovyAssignabilityCheck - from androidJavadocs.destinationDir -} - task androidSourcesJar(type: Jar) { classifier = 'sources' @@ -56,5 +41,4 @@ generateRelease.dependsOn(zipRelease) artifacts { archives androidSourcesJar - archives androidJavadocsJar } diff --git a/gradle.properties b/gradle.properties index 5ce6c77..f3c5dd1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,4 @@ POM_GROUP_ID=com.miguelgaeta.android-backgrounded POM_ARTIFACT_ID=backgrounded -POM_VERSION_ID=1.0.4 \ No newline at end of file +POM_VERSION_ID=1.0.5 \ No newline at end of file