-
-
Save anonymous/817189e74f85e732f59bf1488e1c5927 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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