Skip to content

Commit 04f9ef4

Browse files
Fixes Location related flow of the app #5256 , #5461, #5490 (#5494)
* Resolved merged conflicts * Resolved merge conflicts and updated workflow * Updated Location Flow and merged conflicts * Update flow and merge conflicts * Fixed LocationPicker's location flow * Removed redundant code from LocationPermissionsHelper * Fixed Explore fragment crashing and incorrect behaviour * Updated LocationPicker Flow * Fixed Nearby not working as intended * Final update to location flow of all maps * Added the reqested changes and fixed bugs * Resolved requested change in in-app camera location flow * Fixed In-app camera location flow * Resolved conflicts in ContributionsListFragment * Updated java doc as requested * Resolved nearby card dialog not being shown * Optimised LocationPermissionsHelper javadoc * Made requested changes for preference check * Added javadoc and requested comment for later reference * Implemented requested code changes * Fixed failing test due to changes made during PR * Added string resource for ExploreMapFragment * Changed string resource for rationale dialog * Added standard location flow information in LocationPermissionsHelper * Added javadoc for doNotAskForLocationPermission * Removed unused import * Updated javadoc * Removed values-yue-hant * Fix some merge conflict errors * Fix minor errors due to mergre conflicts * Fix some refactor errors * Fixed minor bug due to merging conflicts * Delete app/src/main/res/values-yue-hant directory * Final changes to NearbyParentFragment * Fixes #5686 map coordinates set to image coords * Removed some redundant code from recenterMap * Removed one test whose method no longer exists * Removed unused method from contract of nearby * Removed redundant method from NearbyParentFragment * nearby: add a FIXME about the possibly redudant code --------- Co-authored-by: Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
1 parent 1f2e31d commit 04f9ef4

16 files changed

+421
-297
lines changed

app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java

+48-20
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import static fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM;
55
import static fr.free.nrw.commons.utils.MapUtils.ZOOM_LEVEL;
66

7+
import android.Manifest.permission;
78
import android.annotation.SuppressLint;
89
import android.content.Intent;
910
import android.content.pm.PackageManager;
1011
import android.graphics.Color;
1112
import android.graphics.Paint;
1213
import android.graphics.drawable.Drawable;
14+
import android.location.LocationManager;
1315
import android.os.Bundle;
1416
import android.preference.PreferenceManager;
1517
import android.text.Html;
@@ -21,12 +23,14 @@
2123
import android.widget.Button;
2224
import android.widget.ImageView;
2325
import android.widget.TextView;
26+
import android.widget.Toast;
2427
import androidx.annotation.NonNull;
2528
import androidx.annotation.Nullable;
2629
import androidx.appcompat.app.ActionBar;
2730
import androidx.appcompat.app.AppCompatActivity;
2831
import androidx.appcompat.widget.AppCompatTextView;
2932
import androidx.constraintlayout.widget.ConstraintLayout;
33+
import androidx.core.app.ActivityCompat;
3034
import androidx.core.content.ContextCompat;
3135
import com.google.android.material.floatingactionbutton.FloatingActionButton;
3236
import fr.free.nrw.commons.CameraPosition;
@@ -39,9 +43,9 @@
3943
import fr.free.nrw.commons.auth.csrf.InvalidLoginTokenException;
4044
import fr.free.nrw.commons.coordinates.CoordinateEditHelper;
4145
import fr.free.nrw.commons.filepicker.Constants;
46+
import fr.free.nrw.commons.kvstore.BasicKvStore;
4247
import fr.free.nrw.commons.kvstore.JsonKvStore;
4348
import fr.free.nrw.commons.location.LocationPermissionsHelper;
44-
import fr.free.nrw.commons.location.LocationPermissionsHelper.Dialog;
4549
import fr.free.nrw.commons.location.LocationPermissionsHelper.LocationPermissionCallback;
4650
import fr.free.nrw.commons.location.LocationServiceManager;
4751
import fr.free.nrw.commons.theme.BaseActivity;
@@ -135,6 +139,7 @@ public class LocationPickerActivity extends BaseActivity implements
135139
@Named("default_preferences")
136140
public
137141
JsonKvStore applicationKvStore;
142+
BasicKvStore store;
138143
/**
139144
* isDarkTheme: for keeping a track of the device theme and modifying the map theme accordingly
140145
*/
@@ -145,6 +150,8 @@ public class LocationPickerActivity extends BaseActivity implements
145150

146151
@Inject
147152
LocationServiceManager locationManager;
153+
LocationPermissionsHelper locationPermissionsHelper;
154+
148155
@Inject
149156
SessionManager sessionManager;
150157

@@ -163,6 +170,7 @@ protected void onCreate(@Nullable final Bundle savedInstanceState) {
163170

164171
isDarkTheme = systemThemeUtils.isDeviceInNightMode();
165172
moveToCurrentLocation = false;
173+
store = new BasicKvStore(this, "LocationPermissions");
166174

167175
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
168176
final ActionBar actionBar = getSupportActionBar();
@@ -482,19 +490,10 @@ private void removeSelectedLocationMarker() {
482490
* Center the map at user's current location
483491
*/
484492
private void requestLocationPermissions() {
485-
LocationPermissionsHelper.Dialog locationAccessDialog = new Dialog(
486-
R.string.location_permission_title,
487-
R.string.upload_map_location_access
488-
);
489-
490-
LocationPermissionsHelper.Dialog locationOffDialog = new Dialog(
491-
R.string.ask_to_turn_location_on,
492-
R.string.upload_map_location_access
493-
);
494-
LocationPermissionsHelper locationPermissionsHelper = new LocationPermissionsHelper(
493+
locationPermissionsHelper = new LocationPermissionsHelper(
495494
this, locationManager, this);
496-
locationPermissionsHelper.handleLocationPermissions(locationAccessDialog,
497-
locationOffDialog);
495+
locationPermissionsHelper.requestForLocationAccess(R.string.location_permission_title,
496+
R.string.upload_map_location_access);
498497
}
499498

500499
@Override
@@ -505,7 +504,7 @@ public void onRequestPermissionsResult(final int requestCode,
505504
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
506505
onLocationPermissionGranted();
507506
} else {
508-
onLocationPermissionDenied("");
507+
onLocationPermissionDenied(getString(R.string.upload_map_location_access));
509508
}
510509
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
511510
}
@@ -524,21 +523,50 @@ protected void onPause() {
524523

525524
@Override
526525
public void onLocationPermissionDenied(String toastMessage) {
527-
//do nothing
526+
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
527+
permission.ACCESS_FINE_LOCATION)) {
528+
if (!locationPermissionsHelper.checkLocationPermission(this)) {
529+
if (store.getBoolean("isPermissionDenied", false)) {
530+
// means user has denied location permission twice or checked the "Don't show again"
531+
locationPermissionsHelper.showAppSettingsDialog(this,
532+
R.string.upload_map_location_access);
533+
} else {
534+
Toast.makeText(getBaseContext(), toastMessage, Toast.LENGTH_LONG).show();
535+
}
536+
store.putBoolean("isPermissionDenied", true);
537+
}
538+
} else {
539+
Toast.makeText(getBaseContext(), toastMessage, Toast.LENGTH_LONG).show();
540+
}
528541
}
529542

530543
@Override
531544
public void onLocationPermissionGranted() {
545+
if (moveToCurrentLocation || !(activity.equals("MediaActivity"))) {
546+
if (locationPermissionsHelper.isLocationAccessToAppsTurnedOn()) {
547+
locationManager.requestLocationUpdatesFromProvider(
548+
LocationManager.NETWORK_PROVIDER);
549+
locationManager.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER);
550+
getLocation();
551+
} else {
552+
getLocation();
553+
locationPermissionsHelper.showLocationOffDialog(this,
554+
R.string.ask_to_turn_location_on_text);
555+
}
556+
}
557+
}
558+
559+
/**
560+
* Gets new location if locations services are on, else gets last location
561+
*/
562+
private void getLocation() {
532563
fr.free.nrw.commons.location.LatLng currLocation = locationManager.getLastLocation();
533564
if (currLocation != null) {
534565
GeoPoint currLocationGeopoint = new GeoPoint(currLocation.getLatitude(),
535566
currLocation.getLongitude());
536567
addLocationMarker(currLocationGeopoint);
537-
if (moveToCurrentLocation) {
538-
mapView.getController().setCenter(currLocationGeopoint);
539-
mapView.getController().animateTo(currLocationGeopoint);
540-
moveToCurrentLocation = false;
541-
}
568+
mapView.getController().setCenter(currLocationGeopoint);
569+
mapView.getController().animateTo(currLocationGeopoint);
542570
markerImage.setTranslationY(0);
543571
}
544572
}

app/src/main/java/fr/free/nrw/commons/bookmarks/locations/BookmarkLocationsFragment.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void onActivityResult(Map<String, Boolean> result) {
4545
contributionController.locationPermissionCallback.onLocationPermissionGranted();
4646
} else {
4747
if (shouldShowRequestPermissionRationale(permission.ACCESS_FINE_LOCATION)) {
48-
contributionController.handleShowRationaleFlowCameraLocation(getActivity());
48+
contributionController.handleShowRationaleFlowCameraLocation(getActivity(), inAppCameraLocationPermissionLauncher);
4949
} else {
5050
contributionController.locationPermissionCallback.onLocationPermissionDenied(getActivity().getString(R.string.in_app_camera_location_permission_denied));
5151
}

app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java

+38-18
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import fr.free.nrw.commons.kvstore.JsonKvStore;
1818
import fr.free.nrw.commons.location.LatLng;
1919
import fr.free.nrw.commons.location.LocationPermissionsHelper;
20-
import fr.free.nrw.commons.location.LocationPermissionsHelper.Dialog;
2120
import fr.free.nrw.commons.location.LocationPermissionsHelper.LocationPermissionCallback;
2221
import fr.free.nrw.commons.location.LocationServiceManager;
2322
import fr.free.nrw.commons.nearby.Place;
@@ -84,15 +83,6 @@ public void initiateCameraPick(Activity activity,
8483
*/
8584
private void createDialogsAndHandleLocationPermissions(Activity activity,
8685
ActivityResultLauncher<String[]> inAppCameraLocationPermissionLauncher) {
87-
LocationPermissionsHelper.Dialog locationAccessDialog = new Dialog(
88-
R.string.location_permission_title,
89-
R.string.in_app_camera_location_permission_rationale
90-
);
91-
92-
LocationPermissionsHelper.Dialog locationOffDialog = new Dialog(
93-
R.string.ask_to_turn_location_on,
94-
R.string.in_app_camera_needs_location
95-
);
9686
locationPermissionCallback = new LocationPermissionCallback() {
9787
@Override
9888
public void onLocationPermissionDenied(String toastMessage) {
@@ -106,7 +96,12 @@ public void onLocationPermissionDenied(String toastMessage) {
10696

10797
@Override
10898
public void onLocationPermissionGranted() {
109-
initiateCameraUpload(activity);
99+
if (!locationPermissionsHelper.isLocationAccessToAppsTurnedOn()) {
100+
showLocationOffDialog(activity, R.string.in_app_camera_needs_location,
101+
R.string.in_app_camera_location_unavailable);
102+
} else {
103+
initiateCameraUpload(activity);
104+
}
110105
}
111106
};
112107

@@ -115,22 +110,46 @@ public void onLocationPermissionGranted() {
115110
if (inAppCameraLocationPermissionLauncher != null) {
116111
inAppCameraLocationPermissionLauncher.launch(
117112
new String[]{permission.ACCESS_FINE_LOCATION});
118-
} else {
119-
locationPermissionsHelper.handleLocationPermissions(locationAccessDialog,
120-
locationOffDialog);
121113
}
122114

123115
}
124116

125-
public void handleShowRationaleFlowCameraLocation(Activity activity) {
117+
/**
118+
* Shows a dialog alerting the user about location services being off
119+
* and asking them to turn it on
120+
* TODO: Add a seperate callback in LocationPermissionsHelper for this.
121+
* Ref: https://github.com/commons-app/apps-android-commons/pull/5494/files#r1510553114
122+
*
123+
* @param activity Activity reference
124+
* @param dialogTextResource Resource id of text to be shown in dialog
125+
* @param toastTextResource Resource id of text to be shown in toast
126+
*/
127+
private void showLocationOffDialog(Activity activity, int dialogTextResource,
128+
int toastTextResource) {
129+
DialogUtil
130+
.showAlertDialog(activity,
131+
activity.getString(R.string.ask_to_turn_location_on),
132+
activity.getString(dialogTextResource),
133+
activity.getString(R.string.title_app_shortcut_setting),
134+
activity.getString(R.string.cancel),
135+
() -> locationPermissionsHelper.openLocationSettings(activity),
136+
() -> {
137+
Toast.makeText(activity, activity.getString(toastTextResource),
138+
Toast.LENGTH_LONG).show();
139+
initiateCameraUpload(activity);
140+
}
141+
);
142+
}
143+
144+
public void handleShowRationaleFlowCameraLocation(Activity activity,
145+
ActivityResultLauncher<String[]> inAppCameraLocationPermissionLauncher) {
126146
DialogUtil.showAlertDialog(activity, activity.getString(R.string.location_permission_title),
127147
activity.getString(R.string.in_app_camera_location_permission_rationale),
128148
activity.getString(android.R.string.ok),
129149
activity.getString(android.R.string.cancel),
130150
() -> {
131-
if (!locationPermissionsHelper.isLocationAccessToAppsTurnedOn()) {
132-
locationPermissionsHelper.showLocationOffDialog(activity);
133-
}
151+
createDialogsAndHandleLocationPermissions(activity,
152+
inAppCameraLocationPermissionLauncher);
134153
},
135154
() -> locationPermissionCallback.onLocationPermissionDenied(
136155
activity.getString(R.string.in_app_camera_location_permission_denied)),
@@ -162,6 +181,7 @@ private void askUserToAllowLocationAccess(Activity activity,
162181
inAppCameraLocationPermissionLauncher);
163182
},
164183
() -> {
184+
ViewUtil.showLongToast(activity, R.string.in_app_camera_location_permission_denied);
165185
defaultKvStore.putBoolean("inAppCameraLocationPref", false);
166186
initiateCameraUpload(activity);
167187
},

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -147,21 +147,20 @@ public void onActivityResult(Map<String, Boolean> result) {
147147
areAllGranted = areAllGranted && b;
148148
}
149149

150-
if (areAllGranted) {
151-
onLocationPermissionGranted();
150+
if (areAllGranted) {
151+
onLocationPermissionGranted();
152+
} else {
153+
if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)
154+
&& store.getBoolean("displayLocationPermissionForCardView", true)
155+
&& !store.getBoolean("doNotAskForLocationPermission", false)
156+
&& (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) {
157+
binding.cardViewNearby.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
152158
} else {
153-
if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)
154-
&& store.getBoolean("displayLocationPermissionForCardView", true)
155-
&& !store.getBoolean("doNotAskForLocationPermission", false)
156-
&& (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) {
157-
binding.cardViewNearby.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
158-
showNearbyCardPermissionRationale();
159-
} else {
160-
displayYouWontSeeNearbyMessage();
161-
}
159+
displayYouWontSeeNearbyMessage();
162160
}
163161
}
164-
});
162+
}
163+
});
165164

166165
@NonNull
167166
public static ContributionsFragment newInstance() {
@@ -537,6 +536,7 @@ private void showNearbyCardPermissionRationale() {
537536
private void displayYouWontSeeNearbyMessage() {
538537
ViewUtil.showLongToast(getActivity(),
539538
getResources().getString(R.string.unable_to_display_nearest_place));
539+
// Set to true as the user doesn't want the app to ask for location permission anymore
540540
store.putBoolean("doNotAskForLocationPermission", true);
541541
}
542542

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java

+20-16
Original file line numberDiff line numberDiff line change
@@ -98,26 +98,30 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
9898
private int contributionsSize;
9999
private String userName;
100100

101-
private ActivityResultLauncher<String[]> inAppCameraLocationPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
102-
@Override
103-
public void onActivityResult(Map<String, Boolean> result) {
104-
boolean areAllGranted = true;
105-
for (final boolean b : result.values()) {
106-
areAllGranted = areAllGranted && b;
107-
}
101+
private ActivityResultLauncher<String[]> inAppCameraLocationPermissionLauncher = registerForActivityResult(
102+
new ActivityResultContracts.RequestMultiplePermissions(),
103+
new ActivityResultCallback<Map<String, Boolean>>() {
104+
@Override
105+
public void onActivityResult(Map<String, Boolean> result) {
106+
boolean areAllGranted = true;
107+
for (final boolean b : result.values()) {
108+
areAllGranted = areAllGranted && b;
109+
}
108110

109-
if (areAllGranted) {
110-
controller.locationPermissionCallback.onLocationPermissionGranted();
111-
} else {
112-
if (shouldShowRequestPermissionRationale(permission.ACCESS_FINE_LOCATION)) {
113-
controller.handleShowRationaleFlowCameraLocation(getActivity());
111+
if (areAllGranted) {
112+
controller.locationPermissionCallback.onLocationPermissionGranted();
114113
} else {
115-
controller.locationPermissionCallback.onLocationPermissionDenied(
116-
getActivity().getString(R.string.in_app_camera_location_permission_denied));
114+
if (shouldShowRequestPermissionRationale(permission.ACCESS_FINE_LOCATION)) {
115+
controller.handleShowRationaleFlowCameraLocation(getActivity(),
116+
inAppCameraLocationPermissionLauncher);
117+
} else {
118+
controller.locationPermissionCallback.onLocationPermissionDenied(
119+
getActivity().getString(
120+
R.string.in_app_camera_location_permission_denied));
121+
}
117122
}
118123
}
119-
}
120-
});
124+
});
121125

122126

123127
@Override

app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapContract.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@ public class ExploreMapContract {
1111

1212
interface View {
1313
boolean isNetworkConnectionEstablished();
14-
void populatePlaces(LatLng currentLatLng);
15-
void checkPermissionsAndPerformAction();
16-
void recenterMap(LatLng currentLatLng);
17-
void showLocationOffDialog();
18-
void openLocationSettings();
14+
void populatePlaces(LatLng curlatLng);
15+
void askForLocationPermission();
16+
void recenterMap(LatLng curLatLng);
1917
void hideBottomDetailsSheet();
2018
LatLng getMapCenter();
2119
LatLng getMapFocus();

0 commit comments

Comments
 (0)