diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/AbstractSendToGoogleActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/AbstractSendToGoogleActivity.java index b665129bd..cb301155c 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/AbstractSendToGoogleActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/AbstractSendToGoogleActivity.java @@ -54,8 +54,9 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv private static final int DELETE_REQUEST_CODE = 3; protected static final int GOOGLE_PLAY_SERVICES_REQUEST_CODE = 4; protected static final int CAMERA_REQUEST_CODE = 5; + protected static final int GPS_REQUEST_CODE = 6; - @Override + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == DELETE_REQUEST_CODE) { onDeleted(); diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/TrackListActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/TrackListActivity.java index 4399a9b58..4e5e75d6d 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/TrackListActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/TrackListActivity.java @@ -16,6 +16,7 @@ package com.google.android.apps.mytracks; +import android.Manifest; import android.app.Dialog; import android.app.SearchManager; import android.content.Context; @@ -23,15 +24,13 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.content.pm.PackageManager; import android.database.Cursor; import android.os.Bundle; import android.os.Looper; import android.os.Parcelable; import android.os.RemoteException; import android.os.StrictMode; -import androidx.loader.app.LoaderManager.LoaderCallbacks; -import androidx.loader.content.CursorLoader; -import androidx.loader.content.Loader; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -47,6 +46,12 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.loader.app.LoaderManager.LoaderCallbacks; +import androidx.loader.content.CursorLoader; +import androidx.loader.content.Loader; + import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.TracksColumns; @@ -427,6 +432,17 @@ public class TrackListActivity extends AbstractSendToGoogleActivity implements F } } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == GPS_REQUEST_CODE) { + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, R.string.permission_gps_failed, Toast.LENGTH_SHORT).show(); + finish(); + } + } + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + @Override protected int getLayoutResId() { return R.layout.track_list; @@ -466,20 +482,18 @@ public class TrackListActivity extends AbstractSendToGoogleActivity implements F Intent intent; switch (item.getItemId()) { case R.id.track_list_search: + // TODO ? return false; case R.id.track_list_start_gps: - MyTracksLocationManager myTracksLocationManager = new MyTracksLocationManager( - this, Looper.myLooper(), false); + MyTracksLocationManager myTracksLocationManager = new MyTracksLocationManager(this, Looper.myLooper(), false); if (!myTracksLocationManager.isGpsProviderEnabled()) { intent = GoogleLocationUtils.newLocationSettingsIntent(TrackListActivity.this); startActivity(intent); } else { - startGps = !TrackRecordingServiceConnectionUtils.isRecordingServiceRunning( - this); + startGps = !TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(this); // Show toast - Toast toast = Toast.makeText( - this, startGps ? R.string.gps_starting : R.string.gps_stopping, Toast.LENGTH_SHORT); + Toast toast = Toast.makeText(this, startGps ? R.string.gps_starting : R.string.gps_stopping, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); @@ -599,16 +613,15 @@ public class TrackListActivity extends AbstractSendToGoogleActivity implements F * Shows start up dialogs. */ public void showStartupDialogs() { - { - // If stats_units_key is undefined, set it - if (PreferencesUtils.getString(this, R.string.stats_units_key, "").equals("")) { - String statsUnits = getString( - Locale.US.equals(Locale.getDefault()) ? R.string.stats_units_imperial - : R.string.stats_units_metric); - PreferencesUtils.setString(this, R.string.stats_units_key, statsUnits); - } - checkGooglePlayServices(); + // If stats_units_key is undefined, set it + if (PreferencesUtils.getString(this, R.string.stats_units_key, "").equals("")) { + String statsUnits = getString(Locale.US.equals(Locale.getDefault()) ? R.string.stats_units_imperial : R.string.stats_units_metric); + PreferencesUtils.setString(this, R.string.stats_units_key, statsUnits); } + + checkGooglePlayServices(); + + requestGPSPermissions(); } private void checkGooglePlayServices() { @@ -628,6 +641,12 @@ public class TrackListActivity extends AbstractSendToGoogleActivity implements F } } + private void requestGPSPermissions() { + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, GPS_REQUEST_CODE); + } + } + /** * Updates the menu items. * diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/MyTracksLocationManager.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/MyTracksLocationManager.java index 1c1238c56..01c28d329 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/MyTracksLocationManager.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/MyTracksLocationManager.java @@ -37,7 +37,6 @@ import com.google.android.gms.location.LocationServices; import com.google.android.gms.tasks.OnSuccessListener; - /** * My Tracks Location Manager. Applies Google location settings before allowing * access to {@link LocationManager}. @@ -67,6 +66,7 @@ public class MyTracksLocationManager { @Override public void onConnected(@Nullable Bundle bundle) { handler.post(new Runnable() { + //Permissions should be already acquired by TrackListActivity during start up. @SuppressLint("MissingPermission") @Override public void run() { diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java index 0bd90f57e..b9ce2a6d9 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -35,11 +35,12 @@ import android.os.Handler; import android.os.IBinder; import android.os.PowerManager.WakeLock; import android.os.Process; +import android.util.Log; + import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.core.app.NotificationCompat; import androidx.core.app.TaskStackBuilder; -import android.util.Log; import com.google.android.apps.mytracks.Constants; import com.google.android.apps.mytracks.TrackDetailActivity; diff --git a/myTracks/src/main/res/values/strings.xml b/myTracks/src/main/res/values/strings.xml index 38372140c..1d7f57865 100644 --- a/myTracks/src/main/res/values/strings.xml +++ b/myTracks/src/main/res/values/strings.xml @@ -1233,6 +1233,9 @@ limitations under the License. + + My Tracks requires permission to use GPS. + @@ -1298,6 +1301,8 @@ limitations under the License. Speak the name of a track or marker + +