From 439dc3d6676743d68695d86c3b2c35291cfa7a65 Mon Sep 17 00:00:00 2001 From: Anthony Agby Date: Wed, 30 May 2018 16:20:00 -0400 Subject: [PATCH 1/6] Add and update dependencies - update support library version - add architecture lifecycle dependencies --- gradle/dependencies.gradle | 29 +++++++++++++++++------------ libtelemetry/build.gradle | 2 ++ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 71b271982..2cdb20dd2 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -2,22 +2,23 @@ ext { androidVersions = [ minSdkVersion : 14, - targetSdkVersion : 25, - compileSdkVersion: 25, + targetSdkVersion : 26, + compileSdkVersion: 26, buildToolsVersion: '27.0.2' ] version = [ - mapboxServices : '2.2.6', - gmsLocation : '11.0.4', - junit : '4.12', - supportLibVersion: '25.4.0', - constraintLayout : '1.0.2', - mockito : '2.11.0', - testRunnerVersion: '1.0.1', - okhttp3 : '3.10.0', - gson : '2.8.2', - espressoVersion : '3.0.1' + mapboxServices : '2.2.6', + gmsLocation : '11.0.4', + junit : '4.12', + supportLibVersion : '26.1.0', + constraintLayout : '1.0.2', + mockito : '2.11.0', + testRunnerVersion : '1.0.1', + okhttp3 : '3.10.0', + gson : '2.8.2', + espressoVersion : '3.0.1', + archLifecycleVersion: "1.0.0" ] pluginVersion = [ @@ -33,6 +34,10 @@ ext { // play services gmsLocation : "com.google.android.gms:play-services-location:${version.gmsLocation}", + //architecture components + archLifecycleExtensions: "android.arch.lifecycle:extensions:${version.archLifecycleVersion}", + archLifecycleCompiler : "android.arch.lifecycle:compiler:${version.archLifecycleVersion}", + // okhttp okhttp3 : "com.squareup.okhttp3:okhttp:${version.okhttp3}", okhttp3Mockwebserver : "com.squareup.okhttp3:mockwebserver:${version.okhttp3}", diff --git a/libtelemetry/build.gradle b/libtelemetry/build.gradle index 2c7bdf942..a8fbeab89 100644 --- a/libtelemetry/build.gradle +++ b/libtelemetry/build.gradle @@ -34,6 +34,8 @@ dependencies { compile dependenciesList.okhttp3 compile dependenciesList.gson compile dependenciesList.supportAppcompatV7 + compile dependenciesList.archLifecycleExtensions + annotationProcessor dependenciesList.archLifecycleCompiler testCompile dependenciesList.junit testCompile dependenciesList.mockito From 35d006b9fcf2cb4d16fd09881161b9c0eae57fb4 Mon Sep 17 00:00:00 2001 From: Anthony Agby Date: Wed, 30 May 2018 17:25:31 -0400 Subject: [PATCH 2/6] ApplicationLifecycleObserver - create and integrate ApplicationLifecycleObserver - start and kill service when moving between background and foreground --- .../ApplicationLifecycleObserver.java | 39 +++++++++++++++++++ .../android/telemetry/MapboxTelemetry.java | 14 ++++++- .../android/telemetry/TelemetryService.java | 18 +++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 libtelemetry/src/main/java/com/mapbox/android/telemetry/ApplicationLifecycleObserver.java diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/ApplicationLifecycleObserver.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/ApplicationLifecycleObserver.java new file mode 100644 index 000000000..128088155 --- /dev/null +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/ApplicationLifecycleObserver.java @@ -0,0 +1,39 @@ +package com.mapbox.android.telemetry; + +import android.annotation.SuppressLint; +import android.arch.lifecycle.Lifecycle; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.OnLifecycleEvent; +import android.content.Context; +import android.content.Intent; + +class ApplicationLifecycleObserver implements LifecycleObserver { + private static TelemetryService telemetryService; + private Context applicationContext; + private Intent locationServiceIntent = null; + + ApplicationLifecycleObserver(Context applicationContext) { + this.applicationContext = applicationContext; + } + + static void setTelemetryService(TelemetryService telemeService) { + telemetryService = telemeService; + } + + @SuppressLint("NewApi") + @OnLifecycleEvent(Lifecycle.Event.ON_START) + void onEnterForeground() { + if (telemetryService != null) { + locationServiceIntent = new Intent(applicationContext, TelemetryService.class); + applicationContext.startForegroundService(locationServiceIntent); + } + + } + + @OnLifecycleEvent(Lifecycle.Event.ON_STOP) + void onEnterBackground() { + if (telemetryService != null) { + telemetryService.stopForegroundService(); + } + } +} diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java index d7ad38287..9744bf06d 100644 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java @@ -2,12 +2,14 @@ import android.app.ActivityManager; +import android.arch.lifecycle.ProcessLifecycleOwner; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.os.Build; import android.os.IBinder; import com.mapbox.android.core.location.LocationEnginePriority; @@ -488,7 +490,12 @@ private PermissionCheckRunnable obtainPermissionCheckRunnable() { } private void startLocation() { - applicationContext.startService(obtainLocationServiceIntent()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + applicationContext.startForegroundService(obtainLocationServiceIntent()); + initializeLifecycleMonitor(); + } else { + applicationContext.startService(obtainLocationServiceIntent()); + } } private void startAlarm() { @@ -528,4 +535,9 @@ private boolean unbindServiceConnection() { return false; } + + private void initializeLifecycleMonitor() { + ApplicationLifecycleObserver applicationLifecycleMonitor = new ApplicationLifecycleObserver(applicationContext); + ProcessLifecycleOwner.get().getLifecycle().addObserver(applicationLifecycleMonitor); + } } diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/TelemetryService.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/TelemetryService.java index ab3e7a66b..2ee954b8a 100644 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/TelemetryService.java +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/TelemetryService.java @@ -1,11 +1,13 @@ package com.mapbox.android.telemetry; +import android.app.Notification; import android.app.Service; import android.content.Intent; import android.content.IntentFilter; import android.location.Location; import android.os.Binder; +import android.os.Build; import android.os.IBinder; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; @@ -41,6 +43,10 @@ public void onCreate() { createLocationReceiver(); createTelemetryReceiver(); createServiceTaskCallbacks(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + initiateForegroundService(); + } } @Override @@ -254,4 +260,16 @@ TelemetryService obtainService() { return TelemetryService.this; } } + + private void initiateForegroundService() { + Notification notification = new Notification(); + startForeground(1375, notification); + + ApplicationLifecycleObserver.setTelemetryService(this); + } + + void stopForegroundService() { + stopForeground(true); + stopSelf(); + } } From acd1f053496adfef72645d2d066c6b2419172d83 Mon Sep 17 00:00:00 2001 From: Anthony Agby Date: Thu, 7 Jun 2018 11:14:13 -0400 Subject: [PATCH 3/6] Check background status before starting - check to see if device is in background before starting service and lifecycle monitoring --- .../java/com/mapbox/android/telemetry/MapboxTelemetry.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java index 9744bf06d..dce21949d 100644 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java @@ -2,6 +2,7 @@ import android.app.ActivityManager; +import android.arch.lifecycle.Lifecycle; import android.arch.lifecycle.ProcessLifecycleOwner; import android.content.ComponentName; import android.content.Context; @@ -491,8 +492,10 @@ private PermissionCheckRunnable obtainPermissionCheckRunnable() { private void startLocation() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - applicationContext.startForegroundService(obtainLocationServiceIntent()); - initializeLifecycleMonitor(); + if (ProcessLifecycleOwner.get().getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { + applicationContext.startForegroundService(obtainLocationServiceIntent()); + initializeLifecycleMonitor(); + } } else { applicationContext.startService(obtainLocationServiceIntent()); } From 4433cc38971ee092fbca41775bb71ccec8fd87ee Mon Sep 17 00:00:00 2001 From: Anthony Agby Date: Fri, 8 Jun 2018 13:30:15 -0400 Subject: [PATCH 4/6] Remove lifecycle observer - move maven repo - remove lifecycle observer - check if app is in foreground before starting service - remove all code related to lifecycle observer --- build.gradle | 2 +- .../ApplicationLifecycleObserver.java | 39 ------------------- .../android/telemetry/MapboxTelemetry.java | 13 +------ .../android/telemetry/TelemetryService.java | 18 --------- 4 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 libtelemetry/src/main/java/com/mapbox/android/telemetry/ApplicationLifecycleObserver.java diff --git a/build.gradle b/build.gradle index d04c5e4bb..c0c5dc06a 100644 --- a/build.gradle +++ b/build.gradle @@ -13,8 +13,8 @@ buildscript { allprojects { repositories { - maven { url 'https://plugins.gradle.org/m2' } maven { url "https://maven.google.com" } + maven { url 'https://plugins.gradle.org/m2' } jcenter() } diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/ApplicationLifecycleObserver.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/ApplicationLifecycleObserver.java deleted file mode 100644 index 128088155..000000000 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/ApplicationLifecycleObserver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.mapbox.android.telemetry; - -import android.annotation.SuppressLint; -import android.arch.lifecycle.Lifecycle; -import android.arch.lifecycle.LifecycleObserver; -import android.arch.lifecycle.OnLifecycleEvent; -import android.content.Context; -import android.content.Intent; - -class ApplicationLifecycleObserver implements LifecycleObserver { - private static TelemetryService telemetryService; - private Context applicationContext; - private Intent locationServiceIntent = null; - - ApplicationLifecycleObserver(Context applicationContext) { - this.applicationContext = applicationContext; - } - - static void setTelemetryService(TelemetryService telemeService) { - telemetryService = telemeService; - } - - @SuppressLint("NewApi") - @OnLifecycleEvent(Lifecycle.Event.ON_START) - void onEnterForeground() { - if (telemetryService != null) { - locationServiceIntent = new Intent(applicationContext, TelemetryService.class); - applicationContext.startForegroundService(locationServiceIntent); - } - - } - - @OnLifecycleEvent(Lifecycle.Event.ON_STOP) - void onEnterBackground() { - if (telemetryService != null) { - telemetryService.stopForegroundService(); - } - } -} diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java index dce21949d..4a00c3226 100644 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java @@ -10,7 +10,6 @@ import android.content.ServiceConnection; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.os.Build; import android.os.IBinder; import com.mapbox.android.core.location.LocationEnginePriority; @@ -491,12 +490,7 @@ private PermissionCheckRunnable obtainPermissionCheckRunnable() { } private void startLocation() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - if (ProcessLifecycleOwner.get().getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { - applicationContext.startForegroundService(obtainLocationServiceIntent()); - initializeLifecycleMonitor(); - } - } else { + if (ProcessLifecycleOwner.get().getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { applicationContext.startService(obtainLocationServiceIntent()); } } @@ -538,9 +532,4 @@ private boolean unbindServiceConnection() { return false; } - - private void initializeLifecycleMonitor() { - ApplicationLifecycleObserver applicationLifecycleMonitor = new ApplicationLifecycleObserver(applicationContext); - ProcessLifecycleOwner.get().getLifecycle().addObserver(applicationLifecycleMonitor); - } } diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/TelemetryService.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/TelemetryService.java index 2ee954b8a..ab3e7a66b 100644 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/TelemetryService.java +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/TelemetryService.java @@ -1,13 +1,11 @@ package com.mapbox.android.telemetry; -import android.app.Notification; import android.app.Service; import android.content.Intent; import android.content.IntentFilter; import android.location.Location; import android.os.Binder; -import android.os.Build; import android.os.IBinder; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; @@ -43,10 +41,6 @@ public void onCreate() { createLocationReceiver(); createTelemetryReceiver(); createServiceTaskCallbacks(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - initiateForegroundService(); - } } @Override @@ -260,16 +254,4 @@ TelemetryService obtainService() { return TelemetryService.this; } } - - private void initiateForegroundService() { - Notification notification = new Notification(); - startForeground(1375, notification); - - ApplicationLifecycleObserver.setTelemetryService(this); - } - - void stopForegroundService() { - stopForeground(true); - stopSelf(); - } } From 14299d84b2fa5ca73beef8b7f8085f6049314b70 Mon Sep 17 00:00:00 2001 From: Anthony Agby Date: Fri, 8 Jun 2018 14:08:05 -0400 Subject: [PATCH 5/6] Foreground check for Oreo+ - made foreground check only valid for oreo and up environments - additionally fixes failing test --- .../java/com/mapbox/android/telemetry/MapboxTelemetry.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java index 4a00c3226..b781a8f82 100644 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java @@ -10,6 +10,7 @@ import android.content.ServiceConnection; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.os.Build; import android.os.IBinder; import com.mapbox.android.core.location.LocationEnginePriority; @@ -490,7 +491,11 @@ private PermissionCheckRunnable obtainPermissionCheckRunnable() { } private void startLocation() { - if (ProcessLifecycleOwner.get().getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + if (ProcessLifecycleOwner.get().getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { + applicationContext.startService(obtainLocationServiceIntent()); + } + } else { applicationContext.startService(obtainLocationServiceIntent()); } } From afb487fe2433368abc7ec9c0d4be7248c03adf6f Mon Sep 17 00:00:00 2001 From: Anthony Agby Date: Thu, 14 Jun 2018 13:56:08 -0400 Subject: [PATCH 6/6] LifeCycleObserver - bump lifecycle dependency to 1.1.1 - make MapboxTelemetry a LIfecycleObserver - if oreo and not yet "STARTED" will listen for app to be in the foreground then create service (and kill listener) --- gradle/dependencies.gradle | 2 +- .../mapbox/android/telemetry/MapboxTelemetry.java | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 2cdb20dd2..8d2872020 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -18,7 +18,7 @@ ext { okhttp3 : '3.10.0', gson : '2.8.2', espressoVersion : '3.0.1', - archLifecycleVersion: "1.0.0" + archLifecycleVersion: "1.1.1" ] pluginVersion = [ diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java index b781a8f82..23fd98bb4 100644 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/MapboxTelemetry.java @@ -3,6 +3,8 @@ import android.app.ActivityManager; import android.arch.lifecycle.Lifecycle; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.OnLifecycleEvent; import android.arch.lifecycle.ProcessLifecycleOwner; import android.content.ComponentName; import android.content.Context; @@ -25,7 +27,8 @@ import okhttp3.Callback; import okhttp3.Response; -public class MapboxTelemetry implements FullQueueCallback, EventCallback, ServiceTaskCallback, Callback { +public class MapboxTelemetry implements FullQueueCallback, EventCallback, ServiceTaskCallback, Callback, + LifecycleObserver { private static final String EVENTS_USER_AGENT = "MapboxEventsAndroid/"; private static final String TELEMETRY_USER_AGENT = "MapboxTelemetryAndroid/"; private static final String UNITY_USER_AGENT = "MapboxEventsUnityAndroid/"; @@ -494,6 +497,8 @@ private void startLocation() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (ProcessLifecycleOwner.get().getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { applicationContext.startService(obtainLocationServiceIntent()); + } else { + ProcessLifecycleOwner.get().getLifecycle().addObserver(this); } } else { applicationContext.startService(obtainLocationServiceIntent()); @@ -537,4 +542,10 @@ private boolean unbindServiceConnection() { return false; } + + @OnLifecycleEvent(Lifecycle.Event.ON_START) + void onEnterForeground() { + startLocation(); + ProcessLifecycleOwner.get().getLifecycle().removeObserver(this); + } }