tracking button state gets restored after rotation

master
y20k 2016-08-30 16:49:54 +02:00
parent 07b5716e69
commit 7b793fc9dd
3 changed files with 97 additions and 48 deletions

View File

@ -62,10 +62,14 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// set state of tracking
mTracking = false; mTracking = false;
mPermissionsGranted = false; if (savedInstanceState != null) {
mTracking = savedInstanceState.getBoolean(INSTANCE_TRACKING_STARTED, false);
}
// check permissions on Android 6 and higher // check permissions on Android 6 and higher
mPermissionsGranted = false;
if (Build.VERSION.SDK_INT >= 23) { if (Build.VERSION.SDK_INT >= 23) {
// check permissions // check permissions
mMissingPermissions = checkPermissions(); mMissingPermissions = checkPermissions();
@ -109,6 +113,22 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
} }
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean(INSTANCE_TRACKING_STARTED, mTracking);
super.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
super.onResume();
// set state of FloatingActionButton
setFloatingActionButtonState();
}
@Override @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) { switch (requestCode) {
@ -193,9 +213,6 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp); mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp);
mTracking = false; mTracking = false;
// re-start preliminary tracking
// startFindingLocation();
// stop tracker service // stop tracker service
Intent intent = new Intent(this, TrackerService.class); Intent intent = new Intent(this, TrackerService.class);
intent.setAction(ACTION_STOP); intent.setAction(ACTION_STOP);
@ -221,6 +238,16 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
} }
/* Set state of FloatingActionButton */
private void setFloatingActionButtonState() {
if (mTracking) {
mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_red_24dp);
} else {
mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp);
}
}
/* Check which permissions have been granted */ /* Check which permissions have been granted */
private List<String> checkPermissions() { private List<String> checkPermissions() {
List<String> permissions = new ArrayList<>(); List<String> permissions = new ArrayList<>();

View File

@ -52,11 +52,12 @@ public class TrackerService extends Service implements TrackbookKeys {
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
// acquire reference to Location Manager
mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// checking for empty intent // checking for empty intent
if (intent == null) { if (intent == null) {
Log.v(LOG_TAG, "Null-Intent received. Stopping self."); Log.v(LOG_TAG, "Null-Intent received. Stopping self.");
// remove notification
stopForeground(true);
stopSelf(); stopSelf();
} }
@ -67,25 +68,10 @@ public class TrackerService extends Service implements TrackbookKeys {
// create a new track // create a new track
mTrack = new Track(getApplicationContext()); mTrack = new Track(getApplicationContext());
// acquire reference to Location Manager // create gps and network location listeners
mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); createListeners();
// listeners that responds to location updates
mGPSListener = createLocationListener();
mNetworkListener = createLocationListener();
// register location listeners and request updates
try {
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mGPSListener);
} catch (SecurityException e) {
e.printStackTrace();
}
try {
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mNetworkListener);
} catch (SecurityException e) {
e.printStackTrace();
}
// set a timer to prevent endless tracking
mTimer = new CountDownTimer(CONSTANT_MAXIMAL_DURATION, CONSTANT_TRACKING_INTERVAL) { mTimer = new CountDownTimer(CONSTANT_MAXIMAL_DURATION, CONSTANT_TRACKING_INTERVAL) {
@Override @Override
public void onTick(long l) { public void onTick(long l) {
@ -102,18 +88,10 @@ public class TrackerService extends Service implements TrackbookKeys {
// ACTION STOP // ACTION STOP
else if (intent.getAction().equals(ACTION_STOP)) { else if (intent.getAction().equals(ACTION_STOP)) {
// remove listeners
try {
mLocationManager.removeUpdates(mGPSListener);
} catch (SecurityException e) {
e.printStackTrace();
}
try {
mLocationManager.removeUpdates(mNetworkListener);
} catch (SecurityException e) {
e.printStackTrace();
}
Log.v(LOG_TAG, "Service received command: STOP"); Log.v(LOG_TAG, "Service received command: STOP");
// remove listeners
removeListeners();
} }
// START_STICKY is used for services that are explicitly started and stopped as needed // START_STICKY is used for services that are explicitly started and stopped as needed
@ -130,24 +108,15 @@ public class TrackerService extends Service implements TrackbookKeys {
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); Log.v(LOG_TAG, "onDestroy called.");
// remove listeners // remove listeners
try { removeListeners();
mLocationManager.removeUpdates(mGPSListener);
} catch (SecurityException e) {
e.printStackTrace();
}
try {
mLocationManager.removeUpdates(mNetworkListener);
} catch (SecurityException e) {
e.printStackTrace();
}
Log.v(LOG_TAG, "onDestroy called.");
// cancel notification // cancel notification
stopForeground(true); stopForeground(true);
super.onDestroy();
} }
@ -184,4 +153,56 @@ public class TrackerService extends Service implements TrackbookKeys {
} }
}; };
} }
/* Creates gps and network location listeners */
private void createListeners() {
Log.v(LOG_TAG, "Setting up location listeners.");
// listeners that responds to location updates
mGPSListener = createLocationListener();
mNetworkListener = createLocationListener();
// register location listeners and request updates
try {
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mGPSListener);
} catch (SecurityException e) {
e.printStackTrace();
}
try {
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mNetworkListener);
} catch (SecurityException e) {
e.printStackTrace();
}
}
/* Removes gps and network location listeners */
private void removeListeners() {
Log.v(LOG_TAG, "Removing location listeners.");
// remove gps listener
if (mGPSListener != null) {
Log.v(LOG_TAG, "Removing GPS location listener.");
try {
mLocationManager.removeUpdates(mGPSListener);
} catch (SecurityException e) {
// catches permission problems
e.printStackTrace();
}
}
// remove network listener
if (mNetworkListener != null) {
Log.v(LOG_TAG, "Removing network location listener.");
try {
mLocationManager.removeUpdates(mNetworkListener);
} catch (SecurityException e) {
// catches permission problems
e.printStackTrace();
}
}
}
} }

View File

@ -49,6 +49,7 @@ public interface TrackbookKeys {
public static final String INSTANCE_LONGITUDE = "longitude"; public static final String INSTANCE_LONGITUDE = "longitude";
public static final String INSTANCE_ZOOM_LEVEL = "zoomLevel"; public static final String INSTANCE_ZOOM_LEVEL = "zoomLevel";
public static final String INSTANCE_CURRENT_LOCATION = "currentLocation"; public static final String INSTANCE_CURRENT_LOCATION = "currentLocation";
public static final String INSTANCE_TRACKING_STARTED = "trackingStarted";
/* RESULTS */ /* RESULTS */