Skip to content

Instantly share code, notes, and snippets.

Created March 30, 2017 11:43
Show Gist options
  • Save anonymous/817189e74f85e732f59bf1488e1c5927 to your computer and use it in GitHub Desktop.
Save anonymous/817189e74f85e732f59bf1488e1c5927 to your computer and use it in GitHub Desktop.
package com.websmithing.gpstracker;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.SystemClock;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import java.util.UUID;
public class GpsTrackerActivity extends AppCompatActivity {
private static final String TAG = "GpsTrackerActivity";
// use the websmithing defaultUploadWebsite for testing and then check your
// location with your browser here: https://www.websmithing.com/gpstracker/displaymap.php
private String defaultUploadWebsite;
private EditText txtUserName;
private EditText txtWebsite;
private Button trackingButton;
private boolean currentlyTracking;
private RadioGroup intervalRadioGroup;
private int intervalInMinutes = 1;
private AlarmManager alarmManager;
private Intent gpsTrackerIntent;
private PendingIntent pendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gps_tracker);
Intent intent = new Intent(); //ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (pm.isIgnoringBatteryOptimizations(packageName))
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
else {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
}
startActivity(intent);
}
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setLogo(R.mipmap.ic_launcher);
getSupportActionBar().setDisplayUseLogoEnabled(true);
defaultUploadWebsite = getString(R.string.default_upload_website);
txtWebsite = (EditText)findViewById(R.id.txtWebsite);
txtUserName = (EditText)findViewById(R.id.txtUserName);
intervalRadioGroup = (RadioGroup)findViewById(R.id.intervalRadioGroup);
trackingButton = (Button)findViewById(R.id.trackingButton);
txtUserName.setImeOptions(EditorInfo.IME_ACTION_DONE);
SharedPreferences sharedPreferences = this.getSharedPreferences("com.websmithing.gpstracker.prefs", Context.MODE_PRIVATE);
currentlyTracking = sharedPreferences.getBoolean("currentlyTracking", false);
boolean firstTimeLoadingApp = sharedPreferences.getBoolean("firstTimeLoadingApp", true);
if (firstTimeLoadingApp) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("firstTimeLoadingApp", false);
editor.putString("appID", UUID.randomUUID().toString());
editor.apply();
}
intervalRadioGroup.setOnCheckedChangeListener(
new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
saveInterval();
}
});
trackingButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
trackLocation(view);
}
});
}
private void saveInterval() {
if (currentlyTracking) {
Toast.makeText(getApplicationContext(), R.string.user_needs_to_restart_tracking, Toast.LENGTH_LONG).show();
}
SharedPreferences sharedPreferences = this.getSharedPreferences("com.websmithing.gpstracker.prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
switch (intervalRadioGroup.getCheckedRadioButtonId()) {
case R.id.i1:
editor.putInt("intervalInMinutes", 1);
break;
case R.id.i5:
editor.putInt("intervalInMinutes", 5);
break;
case R.id.i15:
editor.putInt("intervalInMinutes", 15);
break;
}
editor.apply();
}
private void startAlarmManager() {
Log.d(TAG, "startAlarmManager");
Context context = getBaseContext();
alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
gpsTrackerIntent = new Intent(context, GpsTrackerAlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(context, 0, gpsTrackerIntent, 0);
SharedPreferences sharedPreferences = this.getSharedPreferences("com.websmithing.gpstracker.prefs", Context.MODE_PRIVATE);
intervalInMinutes = sharedPreferences.getInt("intervalInMinutes", 1);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(),
intervalInMinutes * 60000, // 60000 = 1 minute
pendingIntent);
}
private void cancelAlarmManager() {
Log.d(TAG, "cancelAlarmManager");
Context context = getBaseContext();
Intent gpsTrackerIntent = new Intent(context, GpsTrackerAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, gpsTrackerIntent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
}
// called when trackingButton is tapped
protected void trackLocation(View v) {
SharedPreferences sharedPreferences = this.getSharedPreferences("com.websmithing.gpstracker.prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
if (!saveUserSettings()) {
return;
}
if (!checkIfGooglePlayEnabled()) {
return;
}
if (currentlyTracking) {
cancelAlarmManager();
currentlyTracking = false;
editor.putBoolean("currentlyTracking", false);
editor.putString("sessionID", "");
} else {
startAlarmManager();
currentlyTracking = true;
editor.putBoolean("currentlyTracking", true);
editor.putFloat("totalDistanceInMeters", 0f);
editor.putBoolean("firstTimeGettingPosition", true);
editor.putString("sessionID", UUID.randomUUID().toString());
}
editor.apply();
setTrackingButtonState();
}
private boolean saveUserSettings() {
if (textFieldsAreEmptyOrHaveSpaces()) {
return false;
}
SharedPreferences sharedPreferences = this.getSharedPreferences("com.websmithing.gpstracker.prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
switch (intervalRadioGroup.getCheckedRadioButtonId()) {
case R.id.i1:
editor.putInt("intervalInMinutes", 1);
break;
case R.id.i5:
editor.putInt("intervalInMinutes", 5);
break;
case R.id.i15:
editor.putInt("intervalInMinutes", 15);
break;
}
editor.putString("userName", txtUserName.getText().toString().trim());
editor.putString("defaultUploadWebsite", txtWebsite.getText().toString().trim());
editor.apply();
return true;
}
private boolean textFieldsAreEmptyOrHaveSpaces() {
String tempUserName = txtUserName.getText().toString().trim();
String tempWebsite = txtWebsite.getText().toString().trim();
if (tempWebsite.length() == 0 || hasSpaces(tempWebsite) || tempUserName.length() == 0 || hasSpaces(tempUserName)) {
Toast.makeText(this, R.string.textfields_empty_or_spaces, Toast.LENGTH_LONG).show();
return true;
}
return false;
}
private boolean hasSpaces(String str) {
return ((str.split(" ").length > 1) ? true : false);
}
private void displayUserSettings() {
SharedPreferences sharedPreferences = this.getSharedPreferences("com.websmithing.gpstracker.prefs", Context.MODE_PRIVATE);
intervalInMinutes = sharedPreferences.getInt("intervalInMinutes", 1);
switch (intervalInMinutes) {
case 1:
intervalRadioGroup.check(R.id.i1);
break;
case 5:
intervalRadioGroup.check(R.id.i5);
break;
case 15:
intervalRadioGroup.check(R.id.i15);
break;
}
txtWebsite.setText(sharedPreferences.getString("defaultUploadWebsite", defaultUploadWebsite));
txtUserName.setText(sharedPreferences.getString("userName", ""));
}
private boolean checkIfGooglePlayEnabled() {
if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) {
return true;
} else {
Log.e(TAG, "unable to connect to google play services.");
Toast.makeText(getApplicationContext(), R.string.google_play_services_unavailable, Toast.LENGTH_LONG).show();
return false;
}
}
private void setTrackingButtonState() {
if (currentlyTracking) {
trackingButton.setBackgroundResource(R.drawable.green_tracking_button);
trackingButton.setTextColor(Color.BLACK);
trackingButton.setText(R.string.tracking_is_on);
} else {
trackingButton.setBackgroundResource(R.drawable.red_tracking_button);
trackingButton.setTextColor(Color.WHITE);
trackingButton.setText(R.string.tracking_is_off);
}
}
@Override
public void onResume() {
Log.d(TAG, "onResume");
super.onResume();
displayUserSettings();
setTrackingButtonState();
}
@Override
protected void onStop() {
super.onStop();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment