Add changes for permission made by Vivek to newly added fragments along with our nearby classes

This commit is contained in:
neslihanturan 2019-06-10 19:39:44 +03:00
parent 2e1cb07a51
commit c84ecd1b9c
6 changed files with 41 additions and 147 deletions

View file

@ -501,7 +501,7 @@ public class ContributionsFragment
private void onLocationPermissionGranted() { private void onLocationPermissionGranted() {
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.NO_PERMISSION_NEEDED; nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.NO_PERMISSION_NEEDED;
locationManager.registerLocationManager(getActivity()); locationManager.registerLocationManager();
} }
private void showNearbyCardPermissionRationale() { private void showNearbyCardPermissionRationale() {

View file

@ -48,7 +48,7 @@ public class LocationServiceManager implements LocationListener {
/** /**
* Registers a LocationManager to listen for current location. * Registers a LocationManager to listen for current location.
*/ */
public void registerLocationManager(Context context) { public void registerLocationManager() {
if (!isLocationManagerRegistered) { if (!isLocationManagerRegistered) {
isLocationManagerRegistered = requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER) isLocationManagerRegistered = requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER)
&& requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER); && requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER);

View file

@ -44,6 +44,9 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import timber.log.Timber; import timber.log.Timber;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.snackbar.Snackbar;
import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION; import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION;
import static fr.free.nrw.commons.contributions.MainActivity.NEARBY_TAB_POSITION; import static fr.free.nrw.commons.contributions.MainActivity.NEARBY_TAB_POSITION;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED;
@ -105,6 +108,7 @@ public class NearbyFragment extends CommonsDaggerSupportFragment
setRetainInstance(true); setRetainInstance(true);
} }
@Nullable @Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@ -569,7 +573,7 @@ public class NearbyFragment extends CommonsDaggerSupportFragment
*/ */
private void registerLocationUpdates() { private void registerLocationUpdates() {
locationManager.registerLocationManager(getActivity()); locationManager.registerLocationManager();
} }
private void showErrorMessage(String message) { private void showErrorMessage(String message) {

View file

@ -11,10 +11,6 @@ public interface NearbyParentFragmentContract {
void setListFragmentExpanded(); void setListFragmentExpanded();
void refreshView(); void refreshView();
void registerLocationUpdates(LocationServiceManager locationServiceManager); void registerLocationUpdates(LocationServiceManager locationServiceManager);
void requestLocationPermissions(LocationServiceManager locationServiceManager);
void showLocationPermissionDeniedErrorDialog(LocationServiceManager locationServiceManager);
void checkGps(LocationServiceManager locationServiceManager);
void checkLocationPermission(LocationServiceManager locationServiceManager);
boolean isNetworkConnectionEstablished(); boolean isNetworkConnectionEstablished();
void addNetworkBroadcastReceiver(); void addNetworkBroadcastReceiver();
void listOptionMenuItemClicked(); void listOptionMenuItemClicked();
@ -23,6 +19,8 @@ public interface NearbyParentFragmentContract {
void addSearchThisAreaButtonAction(); void addSearchThisAreaButtonAction();
void setSearchThisAreaButtonVisibility(boolean isVisible); void setSearchThisAreaButtonVisibility(boolean isVisible);
void setSearchThisAreaProgressVisibility(boolean isVisible); void setSearchThisAreaProgressVisibility(boolean isVisible);
void checkPermissionsAndPerformAction(Runnable runnable);
void resumeFragment();
} }
interface UserActions { interface UserActions {

View file

@ -1,5 +1,7 @@
package fr.free.nrw.commons.nearby.mvp.fragments; package fr.free.nrw.commons.nearby.mvp.fragments;
import android.Manifest;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -40,12 +42,15 @@ import fr.free.nrw.commons.nearby.mvp.presenter.NearbyParentFragmentPresenter;
import fr.free.nrw.commons.utils.FragmentUtils; import fr.free.nrw.commons.utils.FragmentUtils;
import fr.free.nrw.commons.utils.LocationUtils; import fr.free.nrw.commons.utils.LocationUtils;
import fr.free.nrw.commons.utils.NetworkUtils; import fr.free.nrw.commons.utils.NetworkUtils;
import fr.free.nrw.commons.utils.PermissionUtils;
import fr.free.nrw.commons.wikidata.WikidataEditListener; import fr.free.nrw.commons.wikidata.WikidataEditListener;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import timber.log.Timber; import timber.log.Timber;
import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION;
import static fr.free.nrw.commons.contributions.MainActivity.NEARBY_TAB_POSITION;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.SEARCH_CUSTOM_AREA; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.SEARCH_CUSTOM_AREA;
@ -122,9 +127,26 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
// Resume the fragment if exist
resumeFragment(); resumeFragment();
if (!((MainActivity) getActivity()).isContributionsFragmentVisible) {
checkPermissionsAndPerformAction(this::resumeFragment);
} else {
resumeFragment();
}
} }
@Override
public void checkPermissionsAndPerformAction(Runnable runnable) {
PermissionUtils.checkPermissionsAndPerformAction(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION,
runnable,
() -> ((MainActivity) getActivity()).viewPager.setCurrentItem(CONTRIBUTIONS_TAB_POSITION),
R.string.location_permission_title,
R.string.location_permission_rationale_nearby);
}
/** /**
* Thanks to this method we make sure NearbyMapFragment is ready and attached. So that we can * Thanks to this method we make sure NearbyMapFragment is ready and attached. So that we can
* prevent NPE caused by null child fragment. This method is called from child fragment when * prevent NPE caused by null child fragment. This method is called from child fragment when
@ -201,17 +223,6 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
nearbyParentFragmentPresenter.updateMapMarkers(nearbyPlacesInfo); nearbyParentFragmentPresenter.updateMapMarkers(nearbyPlacesInfo);
} }
/**
* Resume fragments if they exists
*/
private void resumeFragment() {
Timber.d("Resume existing fragments if there is any");
// Find the retained fragment on activity restarts
nearbyMapFragment = getMapFragment();
nearbyListFragment = getListFragment();
}
/** /**
* Returns the map fragment added to child fragment manager previously, if exists. * Returns the map fragment added to child fragment manager previously, if exists.
*/ */
@ -262,139 +273,18 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
*/ */
@Override @Override
public void registerLocationUpdates(LocationServiceManager locationServiceManager) { public void registerLocationUpdates(LocationServiceManager locationServiceManager) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { locationManager.registerLocationManager();
if (locationServiceManager.isLocationPermissionGranted(requireContext())) {
locationServiceManager.registerLocationManager(getActivity());
} else {
// Should we show an explanation?
if (locationServiceManager.isPermissionExplanationRequired(getActivity())) {
new AlertDialog.Builder(getActivity())
.setMessage(getString(R.string.location_permission_rationale_nearby))
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
requestLocationPermissions(locationServiceManager);
dialog.dismiss();
})
.setNegativeButton(android.R.string.cancel, (dialog, id) -> {
showLocationPermissionDeniedErrorDialog(locationServiceManager);
dialog.cancel();
})
.create()
.show();
} else {
// No explanation needed, we can request the permission.
requestLocationPermissions(locationServiceManager);
}
}
} else {
locationServiceManager.registerLocationManager(getActivity());
}
} }
/** /**
* Request location permission if activity is not null * Resume fragments if they exists
* @param locationServiceManager passed from presenter, to listen/un-listen location changes
*/ */
@Override @Override
public void requestLocationPermissions(LocationServiceManager locationServiceManager) { public void resumeFragment() {
if (!getActivity().isFinishing()) { // Find the retained fragment on activity restarts
locationServiceManager.requestPermissions(); nearbyMapFragment = getMapFragment();
} nearbyListFragment = getListFragment();
} addNetworkBroadcastReceiver();
/**
* Will warn user if location is denied
* @param locationServiceManager will be passed to checkGps if needs permission
*/
@Override
public void showLocationPermissionDeniedErrorDialog(LocationServiceManager locationServiceManager) {
new AlertDialog.Builder(getActivity())
.setMessage(R.string.nearby_needs_permissions)
.setCancelable(false)
.setPositiveButton(R.string.give_permission, (dialog, which) -> {
//will ask for the location permission again
checkGps(locationServiceManager);
})
.setNegativeButton(R.string.cancel, (dialog, which) -> {
//dismiss dialog and send user to contributions tab instead
dialog.cancel();
((MainActivity)getActivity()).viewPager.setCurrentItem(((MainActivity)getActivity()).CONTRIBUTIONS_TAB_POSITION);
})
.create()
.show();
}
/**
* Checks device GPS permission first for all API levels
* @param locationServiceManager will be used to check if provider is enable
*/
@Override
public void checkGps(LocationServiceManager locationServiceManager) {
Timber.d("checking GPS");
if (!locationServiceManager.isProviderEnabled()) {
Timber.d("GPS is not enabled");
new AlertDialog.Builder(getActivity())
.setMessage(R.string.gps_disabled)
.setCancelable(false)
.setPositiveButton(R.string.enable_gps,
(dialog, id) -> {
Intent callGPSSettingIntent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
Timber.d("Loaded settings page");
startActivityForResult(callGPSSettingIntent, 1);
})
.setNegativeButton(R.string.menu_cancel_upload, (dialog, id) -> {
showLocationPermissionDeniedErrorDialog(locationServiceManager);
dialog.cancel();
})
.create()
.show();
} else {
Timber.d("GPS is enabled");
checkLocationPermission(locationServiceManager);
}
}
/**
* This method ideally should be called from inside of CheckGPS method. If device GPS is enabled
* then we need to control app specific permissions for >=M devices. For other devices, enabled
* GPS is enough for nearby, so directly call refresh view.
* @param locationServiceManager will be used to detect if location permission is granted or not
*/
@Override
public void checkLocationPermission(LocationServiceManager locationServiceManager) {
Timber.d("Checking location permission");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (locationServiceManager.isLocationPermissionGranted(requireContext())) {
nearbyParentFragmentPresenter.updateMapAndList(LOCATION_SIGNIFICANTLY_CHANGED, null);
} else {
// Should we show an explanation?
if (locationServiceManager.isPermissionExplanationRequired(getActivity())) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
new AlertDialog.Builder(getActivity())
.setMessage(getString(R.string.location_permission_rationale_nearby))
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
requestLocationPermissions(locationServiceManager);
dialog.dismiss();
})
.setNegativeButton(android.R.string.cancel, (dialog, id) -> {
showLocationPermissionDeniedErrorDialog(locationServiceManager);
dialog.cancel();
})
.create()
.show();
} else {
// No explanation needed, we can request the permission.
requestLocationPermissions(locationServiceManager);
}
}
} else {
nearbyParentFragmentPresenter.updateMapAndList(LOCATION_SIGNIFICANTLY_CHANGED, null);
}
} }
@Override @Override

View file

@ -11,6 +11,7 @@ import fr.free.nrw.commons.location.LocationUpdateListener;
import fr.free.nrw.commons.nearby.NearbyController; import fr.free.nrw.commons.nearby.NearbyController;
import fr.free.nrw.commons.nearby.mvp.contract.NearbyMapContract; import fr.free.nrw.commons.nearby.mvp.contract.NearbyMapContract;
import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract; import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract;
import fr.free.nrw.commons.nearby.mvp.fragments.NearbyParentFragment;
import fr.free.nrw.commons.utils.LocationUtils; import fr.free.nrw.commons.utils.LocationUtils;
import fr.free.nrw.commons.wikidata.WikidataEditListener; import fr.free.nrw.commons.wikidata.WikidataEditListener;
@ -109,11 +110,12 @@ public class NearbyParentFragmentPresenter
Timber.d("initializing nearby operations started"); Timber.d("initializing nearby operations started");
// Add location listener to be notified about location changes // Add location listener to be notified about location changes
locationServiceManager.addLocationListener(this); locationServiceManager.addLocationListener(this);
nearbyParentFragmentView.checkPermissionsAndPerformAction(nearbyParentFragmentView::resumeFragment);
nearbyParentFragmentView.registerLocationUpdates(locationServiceManager); nearbyParentFragmentView.registerLocationUpdates(locationServiceManager);
// Nearby buttons should be active, they should be inactive only during update // Nearby buttons should be active, they should be inactive only during update
lockNearby(false); lockNearby(false);
// This will start a consequence to check GPS depending on different API // This will start a consequence to check GPS depending on different API
nearbyParentFragmentView.checkGps(locationServiceManager); //nearbyParentFragmentView.checkGps(locationServiceManager);
// We will know when we went offline and online again // We will know when we went offline and online again
nearbyParentFragmentView.addNetworkBroadcastReceiver(); nearbyParentFragmentView.addNetworkBroadcastReceiver();
} }