mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-28 05:13:53 +01:00
Add changes for permission made by Vivek to newly added fragments along with our nearby classes
This commit is contained in:
parent
2e1cb07a51
commit
c84ecd1b9c
6 changed files with 41 additions and 147 deletions
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue