Skip to content

Commit d62a758

Browse files
neslihanturanmisaochan
authored andcommitted
Fixes #2001 New main UI - progress bar in Nearby card view sometimes runs forever. (#2021)
* Localisation updates from https://translatewiki.net. * Remove unused mediawiki api dependency (#1991) * Categories with pipe suffix (#1873) * Bug fix issue #1826 Changes made : -Certain category names used to show suffixed with strings prefixed with pipe '|'. Removed everything after the pipe. As per the discussion on the thread, its safe to remove everything after the pipe, including the pipe * review suggested changes *Code formatting *Extracted out the index of pipe in a variable *Added issue link in comments * Remove libraries section from README (#1988) * Remove libraries section from README * Add wiki link to "libraries used" to README * Localisation updates from https://translatewiki.net. * Localisation updates from https://translatewiki.net. * Display nearby notification only if it is loaded * Cover don't ask again checkbox is selected posibility * Clean commented out codes * Add strings to string.xml * Add unable to display text to strings xml * Fix nearby card permission explanation string * Add never ask again checkbox to dialogbox * Add action to never display checkbox * Implement a setting on settings page, to be able to enable this setting later * Revert unnecessary changes
1 parent f7ce893 commit d62a758

File tree

7 files changed

+209
-18
lines changed

7 files changed

+209
-18
lines changed

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

Lines changed: 87 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.free.nrw.commons.contributions;
22

3+
import android.Manifest;
34
import android.content.ComponentName;
45
import android.content.Context;
56
import android.content.Intent;
@@ -20,12 +21,14 @@
2021
import android.support.v4.content.Loader;
2122
import android.support.v4.app.LoaderManager;
2223
import android.support.v4.widget.CursorAdapter;
23-
import android.util.Log;
24+
import android.support.v7.app.AlertDialog;
2425
import android.view.LayoutInflater;
2526
import android.view.View;
2627
import android.view.ViewGroup;
2728
import android.widget.Adapter;
2829
import android.widget.AdapterView;
30+
import android.widget.CheckBox;
31+
import android.widget.CompoundButton;
2932

3033
import java.util.ArrayList;
3134
import java.util.concurrent.CountDownLatch;
@@ -50,6 +53,8 @@
5053
import fr.free.nrw.commons.notification.UnreadNotificationsCheckAsync;
5154
import fr.free.nrw.commons.settings.Prefs;
5255
import fr.free.nrw.commons.upload.UploadService;
56+
import fr.free.nrw.commons.utils.DialogUtil;
57+
import fr.free.nrw.commons.utils.ViewUtil;
5358
import io.reactivex.Observable;
5459
import io.reactivex.android.schedulers.AndroidSchedulers;
5560
import io.reactivex.disposables.CompositeDisposable;
@@ -102,10 +107,11 @@ public class ContributionsFragment
102107
private LatLng curLatLng;
103108

104109
private boolean firstLocationUpdate = true;
105-
private LocationServiceManager locationManager;
110+
public LocationServiceManager locationManager;
106111

107112
private boolean isFragmentAttachedBefore = false;
108-
113+
private View checkBoxView;
114+
private CheckBox checkBox;
109115

110116
/**
111117
* Since we will need to use parent activity on onAuthCookieAcquired, we have to wait
@@ -137,6 +143,18 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
137143
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
138144
View view = inflater.inflate(R.layout.fragment_contributions, container, false);
139145
nearbyNoificationCardView = view.findViewById(R.id.card_view_nearby);
146+
checkBoxView = View.inflate(getActivity(), R.layout.nearby_permission_dialog, null);
147+
checkBox = (CheckBox) checkBoxView.findViewById(R.id.never_ask_again);
148+
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
149+
150+
@Override
151+
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
152+
if (isChecked) {
153+
// Do not ask for permission on activity start again
154+
prefs.edit().putBoolean("displayLocationPermissionForCardView",false).apply();
155+
}
156+
}
157+
});
140158

141159
if (savedInstanceState != null) {
142160
mediaDetailPagerFragment = (MediaDetailPagerFragment)getChildFragmentManager().findFragmentByTag(MEDIA_DETAIL_PAGER_FRAGMENT_TAG);
@@ -186,7 +204,9 @@ public void setContributionsListFragment() {
186204
// show nearby card view on contributions list is visible
187205
if (nearbyNoificationCardView != null) {
188206
if (prefs.getBoolean("displayNearbyCardView", true)) {
189-
nearbyNoificationCardView.setVisibility(View.VISIBLE);
207+
if (nearbyNoificationCardView.cardViewVisibilityState == NearbyNoificationCardView.CardViewVisibilityState.READY) {
208+
nearbyNoificationCardView.setVisibility(View.VISIBLE);
209+
}
190210
} else {
191211
nearbyNoificationCardView.setVisibility(View.GONE);
192212
}
@@ -312,16 +332,24 @@ public void onAuthCookieAcquired(Intent uploadServiceIntent) {
312332

313333
@Override
314334
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
335+
Timber.d("onRequestPermissionsResult");
315336
switch (requestCode) {
316337
case LOCATION_REQUEST: {
317338
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
318339
Timber.d("Location permission granted, refreshing view");
319340
// No need to display permission request button anymore
320-
nearbyNoificationCardView.displayPermissionRequestButton(false);
321341
locationManager.registerLocationManager();
322342
} else {
323-
// Still ask for permission
324-
nearbyNoificationCardView.displayPermissionRequestButton(true);
343+
if (prefs.getBoolean("displayLocationPermissionForCardView", true)) {
344+
// Still ask for permission
345+
DialogUtil.showAlertDialog(getActivity(),
346+
getString(R.string.nearby_card_permission_title),
347+
getString(R.string.nearby_card_permission_explanation),
348+
() -> displayYouWontSeeNearbyMessage(),
349+
() -> enableLocationPermission(),
350+
checkBoxView,
351+
false);
352+
}
325353
}
326354
}
327355
break;
@@ -499,9 +527,10 @@ public void onResume() {
499527

500528

501529
if (prefs.getBoolean("displayNearbyCardView", true)) {
502-
nearbyNoificationCardView.cardViewVisibilityState = NearbyNoificationCardView.CardViewVisibilityState.LOADING;
503-
nearbyNoificationCardView.setVisibility(View.VISIBLE);
504530
checkGPS();
531+
if (nearbyNoificationCardView.cardViewVisibilityState == NearbyNoificationCardView.CardViewVisibilityState.READY) {
532+
nearbyNoificationCardView.setVisibility(View.VISIBLE);
533+
}
505534

506535
} else {
507536
// Hide nearby notification card view if related shared preferences is false
@@ -511,15 +540,22 @@ public void onResume() {
511540

512541
}
513542

514-
515543
/**
516544
* Check GPS to decide displaying request permission button or not.
517545
*/
518546
private void checkGPS() {
519547
if (!locationManager.isProviderEnabled()) {
520548
Timber.d("GPS is not enabled");
521549
nearbyNoificationCardView.permissionType = NearbyNoificationCardView.PermissionType.ENABLE_GPS;
522-
nearbyNoificationCardView.displayPermissionRequestButton(true);
550+
if (prefs.getBoolean("displayLocationPermissionForCardView", true)) {
551+
DialogUtil.showAlertDialog(getActivity(),
552+
getString(R.string.nearby_card_permission_title),
553+
getString(R.string.nearby_card_permission_explanation),
554+
() -> displayYouWontSeeNearbyMessage(),
555+
() -> enableGPS(),
556+
checkBoxView,
557+
false);
558+
}
523559
} else {
524560
Timber.d("GPS is enabled");
525561
checkLocationPermission();
@@ -530,20 +566,57 @@ private void checkLocationPermission() {
530566
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
531567
if (locationManager.isLocationPermissionGranted()) {
532568
nearbyNoificationCardView.permissionType = NearbyNoificationCardView.PermissionType.NO_PERMISSION_NEEDED;
533-
nearbyNoificationCardView.displayPermissionRequestButton(false);
534569
locationManager.registerLocationManager();
535570
} else {
536571
nearbyNoificationCardView.permissionType = NearbyNoificationCardView.PermissionType.ENABLE_LOCATION_PERMISSON;
537-
nearbyNoificationCardView.displayPermissionRequestButton(true);
572+
// If user didn't selected Don't ask again
573+
if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)
574+
&& prefs.getBoolean("displayLocationPermissionForCardView", true)) {
575+
DialogUtil.showAlertDialog(getActivity(),
576+
getString(R.string.nearby_card_permission_title),
577+
getString(R.string.nearby_card_permission_explanation),
578+
() -> displayYouWontSeeNearbyMessage(),
579+
() -> enableLocationPermission(),
580+
checkBoxView,
581+
false);
582+
}
538583
}
539584
} else {
540585
// If device is under Marshmallow, we already checked for GPS
541586
nearbyNoificationCardView.permissionType = NearbyNoificationCardView.PermissionType.NO_PERMISSION_NEEDED;
542-
nearbyNoificationCardView.displayPermissionRequestButton(false);
543587
locationManager.registerLocationManager();
544588
}
545589
}
546590

591+
private void enableLocationPermission() {
592+
if (!getActivity().isFinishing()) {
593+
((MainActivity) getActivity()).locationManager.requestPermissions(getActivity());
594+
}
595+
}
596+
597+
private void enableGPS() {
598+
new AlertDialog.Builder(getActivity())
599+
.setMessage(R.string.gps_disabled)
600+
.setCancelable(false)
601+
.setPositiveButton(R.string.enable_gps,
602+
(dialog, id) -> {
603+
Intent callGPSSettingIntent = new Intent(
604+
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
605+
Timber.d("Loaded settings page");
606+
((MainActivity) getActivity()).startActivityForResult(callGPSSettingIntent, 1);
607+
})
608+
.setNegativeButton(R.string.menu_cancel_upload, (dialog, id) -> {
609+
dialog.cancel();
610+
displayYouWontSeeNearbyMessage();
611+
})
612+
.create()
613+
.show();
614+
}
615+
616+
private void displayYouWontSeeNearbyMessage() {
617+
ViewUtil.showLongToast(getActivity(), getResources().getString(R.string.unable_to_display_nearest_place));
618+
}
619+
547620

548621
private void updateClosestNearbyCardViewInfo() {
549622
curLatLng = locationManager.getLastLocation();

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import fr.free.nrw.commons.location.LocationServiceManager;
3232
import fr.free.nrw.commons.nearby.NearbyFragment;
3333
import fr.free.nrw.commons.nearby.NearbyMapFragment;
34+
import fr.free.nrw.commons.nearby.NearbyNoificationCardView;
3435
import fr.free.nrw.commons.notification.NotificationActivity;
3536
import fr.free.nrw.commons.theme.NavigationBaseActivity;
3637
import fr.free.nrw.commons.upload.UploadService;
@@ -253,7 +254,9 @@ public void onBackPressed() {
253254
showTabs();
254255
// Nearby Notification Card View was invisible when Media Details Fragment is active, make it visible again on Contrib List Fragment active, according to preferences
255256
if (prefs.getBoolean("displayNearbyCardView", true)) {
256-
contributionsFragment.nearbyNoificationCardView.setVisibility(View.VISIBLE);
257+
if (contributionsFragment.nearbyNoificationCardView.cardViewVisibilityState == NearbyNoificationCardView.CardViewVisibilityState.READY) {
258+
contributionsFragment.nearbyNoificationCardView.setVisibility(View.VISIBLE);
259+
}
257260
} else {
258261
contributionsFragment.nearbyNoificationCardView.setVisibility(View.GONE);
259262
}
@@ -468,6 +471,8 @@ public void onRequestPermissionsResult(int requestCode,
468471
if (grantResults.length > 0
469472
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
470473
Timber.d("Location permission given");
474+
((ContributionsFragment)contributionsActivityPagerAdapter
475+
.getItem(0)).locationManager.registerLocationManager();
471476
} else {
472477
// If nearby fragment is visible and location permission is not given, send user back to contrib fragment
473478
if (!isContributionsFragmentVisible) {

app/src/main/java/fr/free/nrw/commons/nearby/NearbyNoificationCardView.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
import android.content.Context;
44
import android.content.Intent;
55
import android.content.res.Resources;
6+
import android.os.Handler;
67
import android.support.annotation.NonNull;
78
import android.support.annotation.Nullable;
89
import android.support.design.widget.CoordinatorLayout;
910
import android.support.design.widget.SwipeDismissBehavior;
1011
import android.support.v7.app.AlertDialog;
1112
import android.support.v7.widget.CardView;
1213
import android.util.AttributeSet;
14+
import android.util.Log;
1315
import android.view.MotionEvent;
1416
import android.view.View;
1517
import android.widget.Button;
@@ -19,6 +21,7 @@
1921
import android.widget.TextView;
2022

2123
import android.widget.Toast;
24+
2225
import fr.free.nrw.commons.R;
2326
import fr.free.nrw.commons.contributions.MainActivity;
2427
import fr.free.nrw.commons.utils.ViewUtil;
@@ -86,7 +89,7 @@ private void init() {
8689
protected void onAttachedToWindow() {
8790
super.onAttachedToWindow();
8891
// If you don't setVisibility after getting layout params, then you will se an empty space in place of nerabyNotificationCardView
89-
if (((MainActivity)context).prefs.getBoolean("displayNearbyCardView", true)) {
92+
if (((MainActivity)context).prefs.getBoolean("displayNearbyCardView", true) && this.cardViewVisibilityState == NearbyNoificationCardView.CardViewVisibilityState.READY) {
9093
this.setVisibility(VISIBLE);
9194
} else {
9295
this.setVisibility(GONE);
@@ -183,25 +186,51 @@ public void onClick(View view) {
183186

184187
} else {
185188
cardViewVisibilityState = CardViewVisibilityState.LOADING;
186-
permissionRequestButton.setVisibility(GONE);
189+
/*permissionRequestButton.setVisibility(GONE);
187190
contentLayout.setVisibility(VISIBLE);
188191
// Set visibility of elements in content layout once it become visible
189192
progressBar.setVisibility(VISIBLE);
190193
notificationTitle.setVisibility(GONE);
191194
notificationDistance.setVisibility(GONE);
192195
notificationIcon.setVisibility(GONE);
193196
194-
permissionRequestButton.setVisibility(GONE);
197+
permissionRequestButton.setVisibility(GONE);*/
198+
199+
this.setVisibility(GONE);
200+
Handler nearbyNotificationHandler = new Handler();
201+
Runnable nearbyNotificationRunnable = new Runnable() {
202+
@Override
203+
public void run() {
204+
if (cardViewVisibilityState != NearbyNoificationCardView.CardViewVisibilityState.READY
205+
&& cardViewVisibilityState != NearbyNoificationCardView.CardViewVisibilityState.ASK_PERMISSION
206+
&& cardViewVisibilityState != NearbyNoificationCardView.CardViewVisibilityState.INVISIBLE) {
207+
// If after 30 seconds, card view is not ready
208+
errorOcured();
209+
} else {
210+
suceeded();
211+
}
212+
}
213+
};
214+
nearbyNotificationHandler.postDelayed(nearbyNotificationRunnable, 30000);
195215
}
196216
}
197217

218+
private void errorOcured() {
219+
this.setVisibility(GONE);
220+
}
221+
222+
private void suceeded() {
223+
this.setVisibility(VISIBLE);
224+
}
225+
198226
/**
199227
* Pass place information to views.
200228
* @param isClosestNearbyPlaceFound false if there are no close place
201229
* @param place Closes place where we will get information from
202230
*/
203231
public void updateContent(boolean isClosestNearbyPlaceFound, Place place) {
204232
Timber.d("Update nearby card notification content");
233+
this.setVisibility(VISIBLE);
205234
cardViewVisibilityState = CardViewVisibilityState.READY;
206235
permissionRequestButton.setVisibility(GONE);
207236
contentLayout.setVisibility(VISIBLE);
@@ -269,6 +298,7 @@ public enum CardViewVisibilityState {
269298
READY,
270299
INVISIBLE,
271300
ASK_PERMISSION,
301+
ERROR_OCURED
272302
}
273303

274304
/**

app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.support.annotation.Nullable;
1111
import android.support.v4.app.DialogFragment;
1212
import android.support.v4.app.FragmentActivity;
13+
import android.view.View;
1314

1415
import fr.free.nrw.commons.R;
1516
import timber.log.Timber;
@@ -160,6 +161,63 @@ public static void showAlertDialog(Activity activity,
160161
showSafely(activity, dialog);
161162
}
162163

164+
/*
165+
Shows alert dialog with custom view
166+
*/
167+
public static void showAlertDialog(Activity activity,
168+
String title,
169+
String message,
170+
final Runnable onPositiveBtnClick,
171+
final Runnable onNegativeBtnClick,
172+
View customView,
173+
boolean cancelable) {
174+
showAlertDialog(activity,
175+
title,
176+
message,
177+
activity.getString(R.string.no),
178+
activity.getString(R.string.yes),
179+
onPositiveBtnClick,
180+
onNegativeBtnClick,
181+
customView,
182+
false);
183+
}
184+
185+
/*
186+
Shows alert dialog with custom view
187+
*/
188+
private static void showAlertDialog(Activity activity,
189+
String title,
190+
String message,
191+
String positiveButtonText,
192+
String negativeButtonText,
193+
final Runnable onPositiveBtnClick,
194+
final Runnable onNegativeBtnClick,
195+
View customView,
196+
boolean cancelable) {
197+
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
198+
builder.setTitle(title);
199+
builder.setMessage(message);
200+
builder.setView(customView);
201+
builder.setCancelable(cancelable);
202+
203+
builder.setPositiveButton(positiveButtonText, (dialogInterface, i) -> {
204+
dialogInterface.dismiss();
205+
if (onPositiveBtnClick != null) {
206+
onPositiveBtnClick.run();
207+
}
208+
});
209+
210+
builder.setNegativeButton(negativeButtonText, (DialogInterface dialogInterface, int i) -> {
211+
dialogInterface.dismiss();
212+
if (onNegativeBtnClick != null) {
213+
onNegativeBtnClick.run();
214+
}
215+
});
216+
217+
AlertDialog dialog = builder.create();
218+
showSafely(activity, dialog);
219+
}
220+
163221
public interface Callback {
164222

165223
void onPositiveButtonClicked();

0 commit comments

Comments
 (0)