From aed61478d9507ee382329259b842db11e3921d7e Mon Sep 17 00:00:00 2001 From: Mitchell Hentges Date: Sun, 8 Nov 2015 13:55:29 -0800 Subject: [PATCH] Fixes #2 --- .../positionmock/CurrentLocation.java | 21 ++++++++ .../positionmock/PositionMockActivity.java | 52 +++++++++++++++++-- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/ca/mitchhentges/positionmock/CurrentLocation.java b/app/src/main/java/ca/mitchhentges/positionmock/CurrentLocation.java index c98590d..718aa5f 100644 --- a/app/src/main/java/ca/mitchhentges/positionmock/CurrentLocation.java +++ b/app/src/main/java/ca/mitchhentges/positionmock/CurrentLocation.java @@ -23,12 +23,17 @@ public void run() { }; private Location current; + private boolean canMock = true; public CurrentLocation(LocationManager locationManager) { this.locationManager = locationManager; } public void init() { + if (!canMock) { + return; + } + locationManager.addTestProvider(PROVIDER, false, false, false, false, true, true, true, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); locationManager.setTestProviderEnabled(PROVIDER, true); locationManager.setTestProviderStatus(PROVIDER, LocationProvider.AVAILABLE, null, System.currentTimeMillis()); @@ -42,13 +47,29 @@ public void set(Position position) { } public void clean() { + if (!canMock) { + return; + } + locationManager.removeTestProvider(PROVIDER); publishTask.cancel(); } private void applyToSystem() { + if (!canMock) { + return; + } + if (current != null) { locationManager.setTestProviderLocation(PROVIDER, current); } } + + public void setCanMock(boolean canMock) { + this.canMock = canMock; + } + + public boolean canMock() { + return canMock; + } } diff --git a/app/src/main/java/ca/mitchhentges/positionmock/PositionMockActivity.java b/app/src/main/java/ca/mitchhentges/positionmock/PositionMockActivity.java index d133a61..ffc8b02 100644 --- a/app/src/main/java/ca/mitchhentges/positionmock/PositionMockActivity.java +++ b/app/src/main/java/ca/mitchhentges/positionmock/PositionMockActivity.java @@ -1,8 +1,14 @@ package ca.mitchhentges.positionmock; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; import android.location.LocationManager; import android.os.Bundle; +import android.provider.Settings; import android.support.v7.app.ActionBarActivity; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -12,6 +18,8 @@ import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.LatLng; +import java.io.IOException; + /** * Created by Mitch * on 8/7/2015. @@ -26,11 +34,47 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map); - map = new Map(); - currentLocation = new CurrentLocation((LocationManager) getSystemService(LOCATION_SERVICE)); - currentLocation.init(); + try { + map = new Map(); + currentLocation = new CurrentLocation((LocationManager) getSystemService(LOCATION_SERVICE)); + currentLocation.init(); + + ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); + } catch (SecurityException e) { + currentLocation.setCanMock(false); + } + } + + @Override + protected void onResume() { + super.onResume(); + if (currentLocation.canMock()) { + return; + } - ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); + Log.i("PositionMock", "Don't have mocking permission, can't run"); + AlertDialog. Builder builder = new AlertDialog.Builder(this); + builder + .setTitle("Missing permissions") + .setMessage("(Android 6+) Set as \"mock location app\" in Developer Options\n" + + "(Android 5-) Enable \"Allow Mock Locations\"") + .setPositiveButton("Close", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + finish(); + } + }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + finish(); + } + }) + .create() + .show(); } @Override