diff --git a/app/build.gradle b/app/build.gradle index b3f898183..8a01106c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } debug { - testCoverageEnabled true + testCoverageEnabled true } } @@ -64,4 +64,9 @@ android { disable 'ExtraTranslation' abortOnError false } + + //FIXME: Temporary fix for https://github.com/commons-app/apps-android-commons/issues/709 + configurations.all { + resolutionStrategy.force 'com.android.support:support-annotations:25.2.0' + } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index 1060cf25e..f2d3b6726 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -1,14 +1,20 @@ package fr.free.nrw.commons.nearby; +import android.Manifest; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; import android.location.LocationManager; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.view.Menu; import android.view.MenuInflater; @@ -38,6 +44,7 @@ public class NearbyActivity extends NavigationBaseActivity { @BindView(R.id.progressBar) ProgressBar progressBar; private boolean isMapViewActive = false; + private static final int LOCATION_REQUEST = 1; private LocationServiceManager locationManager; private LatLng curLatLang; @@ -52,13 +59,8 @@ public class NearbyActivity extends NavigationBaseActivity { if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } - + checkLocationPermission(); bundle = new Bundle(); - locationManager = new LocationServiceManager(this); - locationManager.registerLocationManager(); - curLatLang = locationManager.getLatestLocation(); - nearbyAsyncTask = new NearbyAsyncTask(this); - nearbyAsyncTask.execute(); initDrawer(); } @@ -89,6 +91,51 @@ public class NearbyActivity extends NavigationBaseActivity { } } + private void startLookingForNearby() { + locationManager = new LocationServiceManager(this); + locationManager.registerLocationManager(); + curLatLang = locationManager.getLatestLocation(); + nearbyAsyncTask = new NearbyAsyncTask(this); + nearbyAsyncTask.execute(); + } + + private void checkLocationPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ContextCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + startLookingForNearby(); + } else { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST); + } + } else { + startLookingForNearby(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode) { + case LOCATION_REQUEST: { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + startLookingForNearby(); + } else { + //If permission not granted, go to page that says Nearby Places cannot be displayed + if (nearbyAsyncTask != null) { + nearbyAsyncTask.cancel(true); + } + if (progressBar != null) { + progressBar.setVisibility(View.GONE); + } + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + Fragment noPermissionsFragment = new NoPermissionsFragment(); + fragmentTransaction.replace(R.id.container, noPermissionsFragment); + fragmentTransaction.commit(); + } + } + } + } + protected void checkGps() { LocationManager manager = (LocationManager) getSystemService(LOCATION_SERVICE); if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { @@ -128,16 +175,18 @@ public class NearbyActivity extends NavigationBaseActivity { } private void showMapView() { - if (!isMapViewActive) { - isMapViewActive = true; - if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { - setMapFragment(); - } + if (nearbyAsyncTask != null) { + if (!isMapViewActive) { + isMapViewActive = true; + if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { + setMapFragment(); + } - } else { - isMapViewActive = false; - if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { - setListFragment(); + } else { + isMapViewActive = false; + if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { + setListFragment(); + } } } } @@ -151,7 +200,9 @@ public class NearbyActivity extends NavigationBaseActivity { @Override protected void onPause() { super.onPause(); - nearbyAsyncTask.cancel(true); + if (nearbyAsyncTask != null) { + nearbyAsyncTask.cancel(true); + } } protected void refreshView() { @@ -166,7 +217,9 @@ public class NearbyActivity extends NavigationBaseActivity { @Override protected void onDestroy() { super.onDestroy(); - locationManager.unregisterLocationManager(); + if (locationManager != null) { + locationManager.unregisterLocationManager(); + } } private class NearbyAsyncTask extends AsyncTask> { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NoPermissionsFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NoPermissionsFragment.java new file mode 100644 index 000000000..5065a7d93 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NoPermissionsFragment.java @@ -0,0 +1,30 @@ +package fr.free.nrw.commons.nearby; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import butterknife.ButterKnife; +import fr.free.nrw.commons.R; +import timber.log.Timber; + +/** + * Tells user that Nearby Places cannot be displayed if location permissions are denied + */ +public class NoPermissionsFragment extends Fragment { + + public NoPermissionsFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + Timber.d("NoPermissionsFragment created"); + View view = inflater.inflate(R.layout.fragment_no_permissions, container, false); + ButterKnife.bind(this, view); + return view; + } + +} diff --git a/app/src/main/res/layout/fragment_no_permissions.xml b/app/src/main/res/layout/fragment_no_permissions.xml new file mode 100644 index 000000000..8ea6f3a45 --- /dev/null +++ b/app/src/main/res/layout/fragment_no_permissions.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4d8060d58..aad1ae7e7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -194,7 +194,9 @@ Tap this message (or hit back) to skip this step. Logout Tutorial + Nearby places cannot be displayed without location permissions no description found Commons Article Wikidata item +