[android] - cleanup telem, disabled logging, exponential backoff, local broadcast (#7605)

This commit is contained in:
Tobrun
2017-01-10 17:26:06 +01:00
committed by GitHub
parent 92dff9ee93
commit f18c0b8d1e
4 changed files with 65 additions and 29 deletions

View File

@@ -8,6 +8,7 @@ import android.location.Location;
import android.location.LocationManager;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.LocalBroadcastManager;
import timber.log.Timber;
@@ -153,7 +154,7 @@ public class LocationServices implements LostApiClient.ConnectionCallbacks,
// Update the Telemetry Receiver
Intent locIntent = new Intent(TelemetryLocationReceiver.INTENT_STRING);
locIntent.putExtra(LocationManager.KEY_LOCATION_CHANGED, location);
context.sendBroadcast(locIntent);
LocalBroadcastManager.getInstance(context.getApplicationContext()).sendBroadcast(locIntent);
}
/**

View File

@@ -117,10 +117,10 @@ public class MapboxEventManager {
*/
public void initialize(@NonNull Context context, @NonNull String accessToken) {
Timber.i("Telemetry initialize() called...");
//Timber.i("Telemetry initialize() called...");
if (initialized) {
Timber.i("Mapbox Telemetry has already been initialized.");
//Timber.i("Mapbox Telemetry has already been initialized.");
return;
}
@@ -143,7 +143,7 @@ public class MapboxEventManager {
Context.MODE_PRIVATE);
// Determine if Telemetry Should Be Enabled
Timber.i("Right before Telemetry set enabled in initialized()");
///Timber.i("Right before Telemetry set enabled in initialized()");
setTelemetryEnabled(prefs.getBoolean(MapboxConstants.MAPBOX_SHARED_PREFERENCE_KEY_TELEMETRY_ENABLED, true));
// Load / Create Vendor Id
@@ -171,7 +171,7 @@ public class MapboxEventManager {
String stagingAccessToken = appInfo.metaData.getString(MapboxConstants.KEY_META_DATA_STAGING_ACCESS_TOKEN);
if (TextUtils.isEmpty(stagingURL) || TextUtils.isEmpty(stagingAccessToken)) {
Timber.d("Looking in SharedPreferences for Staging Credentials");
//Timber.d("Looking in SharedPreferences for Staging Credentials");
stagingURL = prefs.getString(MapboxConstants.MAPBOX_SHARED_PREFERENCE_KEY_TELEMETRY_STAGING_URL, null);
stagingAccessToken = prefs.getString(
MapboxConstants.MAPBOX_SHARED_PREFERENCE_KEY_TELEMETRY_STAGING_ACCESS_TOKEN, null);
@@ -191,7 +191,7 @@ public class MapboxEventManager {
}
} catch (Exception exception) {
Timber.e("Error Trying to load Staging Credentials: ", exception);
//Timber.e("Error Trying to load Staging Credentials: ", exception);
}
// Register for battery updates
@@ -227,7 +227,7 @@ public class MapboxEventManager {
}
}
} catch (Exception exception) {
Timber.w("Error checking for Telemetry Service Config: ", exception);
//Timber.w("Error checking for Telemetry Service Config: ", exception);
}
throw new TelemetryServiceNotConfiguredException();
}
@@ -246,41 +246,45 @@ public class MapboxEventManager {
* @param telemetryEnabled True to start telemetry, false to stop it
*/
public void setTelemetryEnabled(boolean telemetryEnabled) {
Timber.i("this.telemetryEnabled = " + this.telemetryEnabled + "; telemetryEnabled = " + telemetryEnabled);
//Timber.i("this.telemetryEnabled = " + this.telemetryEnabled + "; telemetryEnabled = " + telemetryEnabled);
if (this.telemetryEnabled == telemetryEnabled) {
Timber.d("No need to start / stop telemetry as it's already in that state.");
//Timber.d("No need to start / stop telemetry as it's already in that state.");
return;
}
if (telemetryEnabled) {
Timber.d("Starting Telemetry Up!");
//Timber.d("Starting Telemetry Up!");
// Start It Up
context.startService(new Intent(context, TelemetryService.class));
// Make sure Ambient Mode is started at a minimum
if (LocationServices.getLocationServices(context).areLocationPermissionsGranted()) {
Timber.i("Permissions are good, see if GPS is enabled and if not then setup Ambient.");
//Timber.i("Permissions are good, see if GPS is enabled and if not then setup Ambient.");
if (LocationServices.getLocationServices(context).isGpsEnabled()) {
LocationServices.getLocationServices(context).toggleGPS(false);
}
} else {
// Start timer that checks for Permissions
Timber.i("Permissions are not good. Need to do some looping to check on stuff.");
//Timber.i("Permissions are not good. Need to do some looping to check on stuff.");
final Handler permsHandler = new Handler();
Runnable runnable = new Runnable() {
private final ExponentialBackoffCounter exponentialBackoffCounter = new ExponentialBackoffCounter();
@Override
public void run() {
if (LocationServices.getLocationServices(context).areLocationPermissionsGranted()) {
Timber.i("Permissions finally granted, so starting Ambient if GPS isn't already enabled");
//Timber.i("Permissions finally granted, so starting Ambient if GPS isn't already enabled");
// Start Ambient
if (LocationServices.getLocationServices(context).isGpsEnabled()) {
LocationServices.getLocationServices(context).toggleGPS(false);
}
} else {
// Restart Handler
Timber.i("Permissions not granted yet... let's try again in 30 seconds");
permsHandler.postDelayed(this, 1000 * 30);
long nextWaitTime = exponentialBackoffCounter.getNextCount();
//Timber.i("Permissions not granted yet... let's try again in " + nextWaitTime/1000 + " seconds");
permsHandler.postDelayed(this, nextWaitTime);
}
}
};
@@ -291,7 +295,7 @@ public class MapboxEventManager {
timer = new Timer();
timer.schedule(new FlushEventsTimerTask(), flushDelayInitialInMillis, flushDelayInMillis);
} else {
Timber.d("Shutting Telemetry Down");
//Timber.d("Shutting Telemetry Down");
// Shut It Down
events.removeAllElements();
context.stopService(new Intent(context, TelemetryService.class));
@@ -318,7 +322,7 @@ public class MapboxEventManager {
* NOTE: Permission set to package private to enable only telemetry code to use this.
*/
void flushEventsQueueImmediately() {
Timber.i("flushEventsQueueImmediately() called...");
//Timber.i("flushEventsQueueImmediately() called...");
new FlushTheEventsTask().execute();
}
@@ -333,7 +337,7 @@ public class MapboxEventManager {
}
events.add(event);
if (events.size() == FLUSH_EVENTS_CAP) {
Timber.d("eventsSize == flushCap so send data.");
//Timber.d("eventsSize == flushCap so send data.");
flushEventsQueueImmediately();
}
}
@@ -433,7 +437,7 @@ public class MapboxEventManager {
eventWithAttributes.put(MapboxEvent.ATTRIBUTE_CELLULAR_NETWORK_TYPE, getCellularNetworkType());
eventWithAttributes.put(MapboxEvent.ATTRIBUTE_WIFI, getConnectedToWifi());
} else {
Timber.w("This is not an event type in the Events Data Model.");
//Timber.w("This is not an event type in the Events Data Model.");
return;
}
@@ -455,7 +459,7 @@ public class MapboxEventManager {
// Send to Server Immediately
flushEventsQueueImmediately();
Timber.d("turnstile event pushed.");
//Timber.d("turnstile event pushed.");
}
/**
@@ -481,7 +485,7 @@ public class MapboxEventManager {
return hex;
}
} catch (Exception exception) {
Timber.w("Error encoding string, will return in original form.", exception);
//Timber.w("Error encoding string, will return in original form.", exception);
}
return string;
}
@@ -620,7 +624,7 @@ public class MapboxEventManager {
status = true;
}
} catch (Exception exception) {
Timber.w("Error getting Wifi Connection Status: ", exception);
//Timber.w("Error getting Wifi Connection Status: ", exception);
status = false;
}
}
@@ -638,13 +642,13 @@ public class MapboxEventManager {
protected Void doInBackground(Void... voids) {
if (events.isEmpty()) {
Timber.d("No events in the queue to send so returning.");
//Timber.d("No events in the queue to send so returning.");
return null;
}
// Check for NetworkConnectivity
if (!Mapbox.isConnected()) {
Timber.w("Not connected to network, so empty events cache and return without attempting to send events");
//Timber.w("Not connected to network, so empty events cache and return without attempting to send events");
// Make sure that events don't pile up when Offline
// and thus impact available memory over time.
events.removeAllElements();
@@ -768,11 +772,10 @@ public class MapboxEventManager {
.post(body)
.build();
response = client.newCall(request).execute();
Timber.d("response code = " + response.code() + " for events " + events.size());
//Timber.d("response code = " + response.code() + " for events " + events.size());
} catch (Exception exception) {
Timber.e("FlushTheEventsTask borked: ", exception);
exception.printStackTrace();
} finally {
if (response != null && response.body() != null) {
response.body().close();
@@ -811,4 +814,15 @@ public class MapboxEventManager {
return "";
}
}
static class ExponentialBackoffCounter {
private static final long BASE_TIME = 30000 /*30 seconds*/;
private int attempt;
long getNextCount() {
attempt++;
return attempt * BASE_TIME;
}
}
}

View File

@@ -8,6 +8,7 @@ import android.content.pm.ServiceInfo;
import android.os.AsyncTask;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.content.LocalBroadcastManager;
import timber.log.Timber;
@@ -55,9 +56,10 @@ public class TelemetryService extends Service {
Timber.i("onCreate() called");
// Enable Location Listening for lifecycle of app
IntentFilter filter = new IntentFilter(TelemetryLocationReceiver.INTENT_STRING);
telemetryLocationReceiver = new TelemetryLocationReceiver();
registerReceiver(telemetryLocationReceiver, filter);
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(
new TelemetryLocationReceiver(),
new IntentFilter(TelemetryLocationReceiver.INTENT_STRING)
);
}
/**