tracker service is now a so-called bound service
This commit is contained in:
parent
39a4cbbe41
commit
8264a2b2af
5 changed files with 357 additions and 78 deletions
|
@ -20,15 +20,18 @@ import android.Manifest;
|
|||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.location.Location;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.os.IBinder;
|
||||
import android.os.Vibrator;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.annotation.NonNull;
|
||||
|
@ -52,6 +55,7 @@ import android.widget.Button;
|
|||
import android.widget.Toast;
|
||||
|
||||
import org.osmdroid.config.Configuration;
|
||||
import org.y20k.trackbook.core.Track;
|
||||
import org.y20k.trackbook.helpers.DialogHelper;
|
||||
import org.y20k.trackbook.helpers.LogHelper;
|
||||
import org.y20k.trackbook.helpers.NightModeHelper;
|
||||
|
@ -75,6 +79,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
|
||||
|
||||
/* Main class variables */
|
||||
private TrackerService mTrackerService;
|
||||
private BottomNavigationView mBottomNavigationView;
|
||||
private NonSwipeableViewPager mViewPager;
|
||||
private SectionsPagerAdapter mSectionsPagerAdapter;
|
||||
|
@ -94,6 +99,8 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
private int mFloatingActionButtonState;
|
||||
private int mSelectedTab;
|
||||
|
||||
boolean mBound = false;
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
@ -140,6 +147,10 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
protected void onStart() {
|
||||
super.onStart();
|
||||
|
||||
// bind to TrackerService
|
||||
Intent intent = new Intent(this, TrackerService.class);
|
||||
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
||||
|
||||
// register broadcast receiver for changed tracking state
|
||||
mTrackingChangedReceiver = createTrackingChangedReceiver();
|
||||
IntentFilter trackingStoppedIntentFilter = new IntentFilter(ACTION_TRACKING_STATE_CHANGED);
|
||||
|
@ -170,6 +181,14 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
unbindService(mConnection);
|
||||
mBound = false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
@ -250,13 +269,21 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
}
|
||||
|
||||
|
||||
/* Request the current Track from TrackerService */
|
||||
public void requestTrack() {
|
||||
if (mBound) {
|
||||
mTrackerService.sendTrackUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Handles the visual state after a save action */
|
||||
private void handleStateAfterSave() {
|
||||
// display and update tracks tab
|
||||
mBottomNavigationView.setSelectedItemId(R.id.navigation_last_tracks);
|
||||
|
||||
// dismiss notification
|
||||
startTrackerService(ACTION_DISMISS, null);
|
||||
dismissNotification();
|
||||
|
||||
// hide Floating Action Button sub menu
|
||||
showFloatingActionButtonMenu(false);
|
||||
|
@ -267,17 +294,11 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
}
|
||||
|
||||
|
||||
/* Start/stop tracker service */
|
||||
private void startTrackerService(String intentAction, @Nullable Location lastLocation) {
|
||||
// build intent
|
||||
/* Start tracker service */
|
||||
private void startTrackerService() {
|
||||
// start service so that it keeps running after unbind
|
||||
Intent intent = new Intent(this, TrackerService.class);
|
||||
intent.setAction(intentAction);
|
||||
if (lastLocation != null && intentAction.equals(ACTION_START)) {
|
||||
intent.putExtra(EXTRA_LAST_LOCATION, lastLocation);
|
||||
}
|
||||
|
||||
// communicate with service
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && intentAction.equals(ACTION_START)) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// ... start service in foreground to prevent it being killed on Oreo
|
||||
startForegroundService(intent);
|
||||
} else {
|
||||
|
@ -286,6 +307,39 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
}
|
||||
|
||||
|
||||
/* Start recording movements */
|
||||
private void startRecording(Location lastLocation) {
|
||||
startTrackerService();
|
||||
if (mBound) {
|
||||
mTrackerService.startTracking(lastLocation);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Resume recording movements */
|
||||
private void resumeRecording() {
|
||||
startTrackerService();
|
||||
if (mBound) {
|
||||
mTrackerService.resumeTracking();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Stop recording movements */
|
||||
private void stopRecording() {
|
||||
if (mBound) {
|
||||
mTrackerService.stopTracking();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Dismiss notification */
|
||||
private void dismissNotification() {
|
||||
if (mBound) {
|
||||
mTrackerService.dismissNotification();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Handles the visual state after a save action */
|
||||
private void handleStateAfterClear() {
|
||||
|
@ -293,7 +347,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
Toast.makeText(this, getString(R.string.toast_message_track_clear), Toast.LENGTH_LONG).show();
|
||||
|
||||
// dismiss notification
|
||||
startTrackerService(ACTION_DISMISS, null);
|
||||
dismissNotification();
|
||||
|
||||
// hide Floating Action Button sub menu
|
||||
showFloatingActionButtonMenu(false);
|
||||
|
@ -335,7 +389,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
Snackbar.make(view, R.string.snackbar_message_tracking_resumed, Snackbar.LENGTH_SHORT).setAction("Action", null).show();
|
||||
|
||||
// resume tracking
|
||||
startTrackerService(ACTION_RESUME, null);
|
||||
resumeRecording();
|
||||
|
||||
// hide sub menu
|
||||
showFloatingActionButtonMenu(false);
|
||||
|
@ -500,7 +554,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
Snackbar.make(view, R.string.snackbar_message_tracking_started, Snackbar.LENGTH_SHORT).setAction("Action", null).show();
|
||||
|
||||
// start tracker service
|
||||
startTrackerService(ACTION_START, lastLocation);
|
||||
startRecording(lastLocation);
|
||||
|
||||
} else {
|
||||
Toast.makeText(this, getString(R.string.toast_message_location_services_not_ready), Toast.LENGTH_LONG).show();
|
||||
|
@ -518,7 +572,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
// --> is handled by broadcast receiver
|
||||
|
||||
// stop tracker service
|
||||
startTrackerService(ACTION_STOP, null);
|
||||
stopRecording();
|
||||
|
||||
break;
|
||||
|
||||
|
@ -756,6 +810,25 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
|||
// }
|
||||
|
||||
|
||||
/**
|
||||
* Defines callbacks for service binding, passed to bindService()
|
||||
*/
|
||||
private ServiceConnection mConnection = new ServiceConnection() {
|
||||
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName className, IBinder service) {
|
||||
// We've bound to LocalService, cast the IBinder and get LocalService instance
|
||||
TrackerService.LocalBinder binder = (TrackerService.LocalBinder) service;
|
||||
mTrackerService = binder.getService();
|
||||
mBound = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName arg0) {
|
||||
mBound = false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Inner class: SectionsPagerAdapter that returns a fragment corresponding to one of the tabs.
|
||||
|
|
|
@ -228,9 +228,7 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys {
|
|||
// CASE 1: recording active
|
||||
if (mTrackerServiceRunning) {
|
||||
// request an updated track recording from service
|
||||
Intent intent = new Intent(mActivity, TrackerService.class);
|
||||
intent.setAction(ACTION_TRACK_REQUEST);
|
||||
mActivity.startService(intent);
|
||||
((MainActivity)mActivity).requestTrack();
|
||||
}
|
||||
|
||||
// CASE 2: recording stopped - temp file exists
|
||||
|
@ -580,6 +578,8 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys {
|
|||
|
||||
/* Loads state tracker service from preferences */
|
||||
private void loadTrackerServiceState(Context context) {
|
||||
// TODO: get state directly from service, create a ServiceConnection.
|
||||
// see: https://github.com/ena1106/FragmentBoundServiceExample/blob/master/app/src/main/java/it/ena1106/fragmentboundservice/BoundFragment.java
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
mTrackerServiceRunning = settings.getBoolean(PREFS_TRACKER_SERVICE_RUNNING, false);
|
||||
}
|
||||
|
|
|
@ -31,6 +31,7 @@ import android.location.Location;
|
|||
import android.location.LocationListener;
|
||||
import android.location.LocationManager;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Binder;
|
||||
import android.os.Bundle;
|
||||
import android.os.CountDownTimer;
|
||||
import android.os.Handler;
|
||||
|
@ -50,6 +51,7 @@ import org.y20k.trackbook.helpers.StorageHelper;
|
|||
import org.y20k.trackbook.helpers.TrackbookKeys;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import static android.hardware.Sensor.TYPE_STEP_COUNTER;
|
||||
|
||||
|
@ -79,6 +81,8 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven
|
|||
private boolean mTrackerServiceRunning;
|
||||
private boolean mLocationSystemSetting;
|
||||
|
||||
private final IBinder mBinder = new LocalBinder(); // todo move to onCreate
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
|
@ -102,69 +106,101 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
// a client is binding to the service with bindService()
|
||||
return mBinder;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onUnbind(Intent intent) {
|
||||
// All clients have unbound with unbindService()
|
||||
// return mAllowRebind; // todo change
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void onRebind(Intent intent) {
|
||||
// A client is binding to the service with bindService(),
|
||||
// after onUnbind() has already been called
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
|
||||
// check if user did turn off location in device settings
|
||||
if (!mLocationSystemSetting) {
|
||||
LogHelper.i(LOG_TAG, "Location Setting is turned off.");
|
||||
Toast.makeText(getApplicationContext(), R.string.toast_message_location_offline, Toast.LENGTH_LONG).show();
|
||||
stopTracking();
|
||||
return START_STICKY;
|
||||
}
|
||||
|
||||
// RESTART CHECK: checking for empty intent - try to get saved track
|
||||
if (intent == null || intent.getAction() == null) {
|
||||
LogHelper.w(LOG_TAG, "Null-Intent received. Trying to restart tracking.");
|
||||
startTracking(intent, false);
|
||||
}
|
||||
|
||||
// ACTION START
|
||||
else if (intent.getAction().equals(ACTION_START) && mLocationSystemSetting) {
|
||||
startTracking(intent, true);
|
||||
}
|
||||
|
||||
// ACTION RESUME
|
||||
else if (intent.getAction().equals(ACTION_RESUME) && mLocationSystemSetting) {
|
||||
startTracking(intent, false);
|
||||
}
|
||||
|
||||
// ACTION STOP
|
||||
else if (intent.getAction().equals(ACTION_STOP) || !mLocationSystemSetting) {
|
||||
mTrackerServiceRunning = false;
|
||||
if (mTrack != null && mTimer != null) {
|
||||
stopTracking();
|
||||
} else {
|
||||
// handle error - save state
|
||||
saveTrackerServiceState(mTrackerServiceRunning, FAB_STATE_DEFAULT);
|
||||
}
|
||||
if (ACTION_STOP.equals(intent.getAction())) {
|
||||
stopTracking();
|
||||
}
|
||||
// ACTION RESUME
|
||||
else if (ACTION_RESUME.equals(intent.getAction())) {
|
||||
resumeTracking();
|
||||
}
|
||||
|
||||
// ACTION DISMISS
|
||||
else if (intent.getAction().equals(ACTION_DISMISS)) {
|
||||
// save state
|
||||
saveTrackerServiceState(mTrackerServiceRunning, FAB_STATE_DEFAULT);
|
||||
// dismiss notification
|
||||
mNotificationManager.cancel(TRACKER_SERVICE_NOTIFICATION_ID); // todo check if necessary?
|
||||
stopForeground(true);
|
||||
}
|
||||
|
||||
// ACTION TRACK REQUEST
|
||||
else if (intent.getAction().equals(ACTION_TRACK_REQUEST)) {
|
||||
// send track via broadcast
|
||||
sendTrackUpdate();
|
||||
}
|
||||
// // check if user did turn off location in device settings
|
||||
// if (!mLocationSystemSetting) {
|
||||
// LogHelper.i(LOG_TAG, "Location Setting is turned off.");
|
||||
// Toast.makeText(getApplicationContext(), R.string.toast_message_location_offline, Toast.LENGTH_LONG).show();
|
||||
// stopTracking();
|
||||
// return START_STICKY;
|
||||
// }
|
||||
//
|
||||
// // RESTART CHECK: checking for empty intent - try to get saved track
|
||||
// if (intent == null || intent.getAction() == null) {
|
||||
// LogHelper.w(LOG_TAG, "Null-Intent received. Trying to restart tracking.");
|
||||
// startTracking(intent, false);
|
||||
// }
|
||||
//
|
||||
// // ACTION START
|
||||
// else if (intent.getAction().equals(ACTION_START) && mLocationSystemSetting) {
|
||||
// startTracking(intent, true);
|
||||
// }
|
||||
//
|
||||
// // ACTION RESUME
|
||||
// else if (intent.getAction().equals(ACTION_RESUME) && mLocationSystemSetting) {
|
||||
// startTracking(intent, false);
|
||||
// }
|
||||
//
|
||||
// // ACTION STOP
|
||||
// else if (intent.getAction().equals(ACTION_STOP) || !mLocationSystemSetting) {
|
||||
// mTrackerServiceRunning = false;
|
||||
// if (mTrack != null && mTimer != null) {
|
||||
// stopTracking();
|
||||
// } else {
|
||||
// // handle error - save state
|
||||
// saveTrackerServiceState(mTrackerServiceRunning, FAB_STATE_DEFAULT);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // ACTION DISMISS
|
||||
// else if (intent.getAction().equals(ACTION_DISMISS)) {
|
||||
// // save state
|
||||
// saveTrackerServiceState(mTrackerServiceRunning, FAB_STATE_DEFAULT);
|
||||
// // dismiss notification
|
||||
// mNotificationManager.cancel(TRACKER_SERVICE_NOTIFICATION_ID); // todo check if necessary?
|
||||
// stopForeground(true);
|
||||
// }
|
||||
//
|
||||
// // ACTION TRACK REQUEST
|
||||
// else if (intent.getAction().equals(ACTION_TRACK_REQUEST)) {
|
||||
// // send track via broadcast
|
||||
// sendTrackUpdate();
|
||||
// }
|
||||
|
||||
// START_STICKY is used for services that are explicitly started and stopped as needed
|
||||
return START_STICKY;
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
return null;
|
||||
}
|
||||
// @Nullable
|
||||
// @Override
|
||||
// public IBinder onBind(Intent intent) {
|
||||
// return null;
|
||||
// }
|
||||
|
||||
|
||||
@Override
|
||||
|
@ -204,6 +240,153 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven
|
|||
|
||||
|
||||
/* Start tracking location */
|
||||
public void startTracking(Location lastLocation) {
|
||||
if (mLocationSystemSetting) {
|
||||
LogHelper.v(LOG_TAG, "Start tracking");
|
||||
|
||||
// create a new track - if requested
|
||||
mTrack = new Track();
|
||||
|
||||
// get last location
|
||||
if (lastLocation != null) {
|
||||
mCurrentBestLocation = lastLocation;
|
||||
} else {
|
||||
mCurrentBestLocation = LocationHelper.determineLastKnownLocation(mLocationManager);
|
||||
}
|
||||
|
||||
// initialize step counter
|
||||
mStepCountOffset = 0;
|
||||
|
||||
// begin recording
|
||||
recordMovements();
|
||||
|
||||
} else {
|
||||
LogHelper.i(LOG_TAG, "Location Setting is turned off.");
|
||||
Toast.makeText(getApplicationContext(), R.string.toast_message_location_offline, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Resume tracking after stop/pause */
|
||||
public void resumeTracking() {
|
||||
if (mLocationSystemSetting) {
|
||||
LogHelper.v(LOG_TAG, "Recording resumed");
|
||||
|
||||
// create a new track - if requested
|
||||
StorageHelper storageHelper = new StorageHelper(this);
|
||||
if (storageHelper.tempFileExists()) {
|
||||
// load temp track file
|
||||
mTrack = storageHelper.loadTrack(FILE_TEMP_TRACK);
|
||||
// try to mark last waypoint as stopover
|
||||
int lastWayPoint = mTrack.getWayPoints().size() - 1;
|
||||
if (lastWayPoint >= 0) {
|
||||
mTrack.getWayPoints().get(lastWayPoint).setIsStopOver(true);
|
||||
}
|
||||
} else {
|
||||
// fallback, if tempfile did not exist
|
||||
LogHelper.e(LOG_TAG, "Unable to find previously saved track temp file.");
|
||||
mTrack = new Track();
|
||||
}
|
||||
|
||||
// get last location
|
||||
if (mTrack.getSize() > 0) {
|
||||
mCurrentBestLocation = mTrack.getWayPointLocation(mTrack.getSize() -1);
|
||||
} else {
|
||||
mCurrentBestLocation = LocationHelper.determineLastKnownLocation(mLocationManager);
|
||||
}
|
||||
|
||||
// initialize step counter
|
||||
mStepCountOffset = mTrack.getStepCount();
|
||||
|
||||
// begin recording
|
||||
recordMovements();
|
||||
|
||||
} else {
|
||||
LogHelper.i(LOG_TAG, "Location Setting is turned off.");
|
||||
Toast.makeText(getApplicationContext(), R.string.toast_message_location_offline, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Record movements */
|
||||
private void recordMovements() {
|
||||
// add last location as WayPoint to track
|
||||
addWayPointToTrack();
|
||||
|
||||
// put up notification
|
||||
displayNotification(true);
|
||||
|
||||
// create gps and network location listeners
|
||||
startFindingLocation();
|
||||
|
||||
// start timer that periodically request a location update
|
||||
startIntervalTimer();
|
||||
|
||||
// start counting steps
|
||||
startStepCounter();
|
||||
|
||||
// register content observer for changes in System Settings
|
||||
this.getContentResolver().registerContentObserver(android.provider.Settings.Secure.CONTENT_URI, true, mSettingsContentObserver);
|
||||
|
||||
// start service in foreground
|
||||
startForeground(TRACKER_SERVICE_NOTIFICATION_ID, mNotification);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void startStepCounter() {
|
||||
boolean stepCounterAvailable;
|
||||
stepCounterAvailable = mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(TYPE_STEP_COUNTER), SensorManager.SENSOR_DELAY_UI);
|
||||
if (stepCounterAvailable) {
|
||||
LogHelper.v(LOG_TAG, "Pedometer sensor available: Registering listener.");
|
||||
} else {
|
||||
LogHelper.i(LOG_TAG, "Pedometer sensor not available.");
|
||||
mTrack.setStepCount(-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Set timer to retrieve new locations and to prevent endless tracking */
|
||||
private void startIntervalTimer() {
|
||||
mTimer = new CountDownTimer(EIGHT_HOURS_IN_MILLISECONDS, FIFTEEN_SECONDS_IN_MILLISECONDS) {
|
||||
@Override
|
||||
public void onTick(long millisUntilFinished) {
|
||||
// update track duration - and add duration from previously interrupted / paused session
|
||||
long previouslyRecordedDuration = mTrack.getTrackDuration();
|
||||
long duration = EIGHT_HOURS_IN_MILLISECONDS - millisUntilFinished + previouslyRecordedDuration;
|
||||
mTrack.setDuration(duration);
|
||||
// try to add WayPoint to Track
|
||||
addWayPointToTrack();
|
||||
// update notification
|
||||
|
||||
mNotification = NotificationHelper.getUpdatedNotification(TrackerService.this, mNotificationBuilder, mTrack);
|
||||
mNotificationManager.notify(TRACKER_SERVICE_NOTIFICATION_ID, mNotification);
|
||||
// save a temp file in case the service has been killed by the system
|
||||
SaveTempTrackAsyncHelper saveTempTrackAsyncHelper = new SaveTempTrackAsyncHelper();
|
||||
saveTempTrackAsyncHelper.execute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {
|
||||
// stop tracking after eight hours
|
||||
stopTracking();
|
||||
}
|
||||
};
|
||||
mTimer.start();
|
||||
}
|
||||
|
||||
|
||||
/* Display notification */
|
||||
private void displayNotification(boolean trackingState) {
|
||||
mNotificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANEL_ID_RECORDING_CHANNEL);
|
||||
mNotification = NotificationHelper.getNotification(this, mNotificationBuilder, mTrack, trackingState);
|
||||
mNotificationManager.notify(TRACKER_SERVICE_NOTIFICATION_ID, mNotification); // todo check if necessary in pre Android O
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Start tracking location */ // todo remove
|
||||
private void startTracking(@Nullable Intent intent, boolean createNewTrack) {
|
||||
LogHelper.v(LOG_TAG, "Service received command: START");
|
||||
|
||||
|
@ -301,8 +484,8 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven
|
|||
|
||||
|
||||
/* Stop tracking location */
|
||||
private void stopTracking() {
|
||||
LogHelper.v(LOG_TAG, "Service received command: STOP");
|
||||
public void stopTracking() {
|
||||
LogHelper.v(LOG_TAG, "Recording stopped");
|
||||
|
||||
// store current date and time
|
||||
mTrack.setRecordingEnd();
|
||||
|
@ -318,9 +501,7 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven
|
|||
saveTempTrackAsyncHelper.execute();
|
||||
|
||||
// change notification
|
||||
mNotificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANEL_ID_RECORDING_CHANNEL);
|
||||
mNotification = NotificationHelper.getNotification(this, mNotificationBuilder, mTrack, false);
|
||||
mNotificationManager.notify(TRACKER_SERVICE_NOTIFICATION_ID, mNotification);
|
||||
displayNotification(false);
|
||||
|
||||
// remove listeners
|
||||
stopFindingLocation();
|
||||
|
@ -334,6 +515,17 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven
|
|||
}
|
||||
|
||||
|
||||
/* Dismiss notification */
|
||||
public void dismissNotification() {
|
||||
// save state
|
||||
saveTrackerServiceState(mTrackerServiceRunning, FAB_STATE_DEFAULT);
|
||||
// cancel notification
|
||||
mNotificationManager.cancel(TRACKER_SERVICE_NOTIFICATION_ID); // todo check if necessary?
|
||||
stopForeground(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Adds a new WayPoint to current track */
|
||||
private void addWayPointToTrack() {
|
||||
|
||||
|
@ -376,7 +568,7 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven
|
|||
|
||||
|
||||
/* Broadcasts a track update */
|
||||
private void sendTrackUpdate() {
|
||||
public void sendTrackUpdate() {
|
||||
if (mTrack != null) {
|
||||
Intent i = new Intent();
|
||||
i.setAction(ACTION_TRACK_UPDATED);
|
||||
|
@ -467,6 +659,20 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Inner class: Local Binder that returns this service
|
||||
*/
|
||||
public class LocalBinder extends Binder {
|
||||
TrackerService getService() {
|
||||
// return this instance of TrackerService so clients can call public methods
|
||||
return TrackerService.this;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* End of inner class
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Inner class: SettingsContentObserver is a custom ContentObserver for changes in Android Settings
|
||||
*/
|
||||
|
|
|
@ -6,7 +6,7 @@ buildscript {
|
|||
google()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.0.1'
|
||||
classpath 'com.android.tools.build:gradle:3.1.0'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
|||
#Thu Nov 02 15:43:54 CET 2017
|
||||
#Wed Apr 04 15:52:45 CEST 2018
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
|
||||
|
|
Loading…
Reference in a new issue