Skip to content

Commit 3511094

Browse files
dbrantdomdomegg
authored andcommitted
Fix memory leak(s). (commons-app#2674)
1 parent d1ae88c commit 3511094

File tree

6 files changed

+24
-37
lines changed

6 files changed

+24
-37
lines changed

app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package fr.free.nrw.commons.category;
22

3-
import android.app.Activity;
43
import android.content.Context;
54
import android.text.TextUtils;
65
import android.view.LayoutInflater;
@@ -22,12 +21,10 @@
2221
*/
2322

2423
public class GridViewAdapter extends ArrayAdapter {
25-
private Context context;
2624
private List<Media> data;
2725

2826
public GridViewAdapter(Context context, int layoutResourceId, List<Media> data) {
2927
super(context, layoutResourceId, data);
30-
this.context = context;
3128
this.data = data;
3229
}
3330

@@ -81,8 +78,7 @@ public boolean isEmpty() {
8178
public View getView(int position, View convertView, ViewGroup parent) {
8279

8380
if (convertView == null) {
84-
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
85-
convertView = inflater.inflate(R.layout.layout_category_images, null);
81+
convertView = LayoutInflater.from(getContext()).inflate(R.layout.layout_category_images, null);
8682
}
8783

8884
Media item = data.get(position);
@@ -102,7 +98,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
10298
*/
10399
private void setAuthorView(Media item, TextView author) {
104100
if (!TextUtils.isEmpty(item.getCreator())) {
105-
String uploadedByTemplate = context.getString(R.string.image_uploaded_by);
101+
String uploadedByTemplate = getContext().getString(R.string.image_uploaded_by);
106102

107103
String uploadedBy = String.format(Locale.getDefault(), uploadedByTemplate, item.getCreator());
108104
author.setText(uploadedBy);

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

+2-6
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public class ContributionsFragment
8787
@Inject NearbyController nearbyController;
8888
@Inject OkHttpJsonApiClient okHttpJsonApiClient;
8989
@Inject CampaignsPresenter presenter;
90+
@Inject LocationServiceManager locationManager;
9091

9192
private ArrayList<DataSetObserver> observersWaitingForLoad = new ArrayList<>();
9293
private UploadService uploadService;
@@ -105,8 +106,6 @@ public class ContributionsFragment
105106
private LatLng curLatLng;
106107

107108
private boolean firstLocationUpdate = true;
108-
public LocationServiceManager locationManager;
109-
110109
private boolean isFragmentAttachedBefore = false;
111110
private View checkBoxView;
112111
private CheckBox checkBox;
@@ -496,7 +495,6 @@ public void onSaveInstanceState(Bundle outState) {
496495
@Override
497496
public void onResume() {
498497
super.onResume();
499-
locationManager = new LocationServiceManager(getActivity());
500498

501499
firstLocationUpdate = true;
502500
locationManager.addLocationListener(this);
@@ -546,7 +544,7 @@ private void checkGPS() {
546544

547545
private void checkLocationPermission() {
548546
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
549-
if (locationManager.isLocationPermissionGranted()) {
547+
if (locationManager.isLocationPermissionGranted(requireContext())) {
550548
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.NO_PERMISSION_NEEDED;
551549
locationManager.registerLocationManager();
552550
} else {
@@ -638,8 +636,6 @@ public void onDestroy() {
638636
getChildFragmentManager().removeOnBackStackChangedListener(this);
639637
locationManager.unregisterLocationManager();
640638
locationManager.removeLocationListener(this);
641-
// Try to prevent a possible NPE
642-
locationManager.context = null;
643639
super.onDestroy();
644640

645641
if (isUploadServiceConnected) {

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import android.content.Context;
44
import android.database.Cursor;
5+
6+
import androidx.annotation.NonNull;
57
import androidx.cursoradapter.widget.CursorAdapter;
68
import android.view.LayoutInflater;
79
import android.view.View;
@@ -20,14 +22,12 @@ class ContributionsListAdapter extends CursorAdapter {
2022

2123
private final ContributionDao contributionDao;
2224
private UploadService uploadService;
23-
private Context context;
2425

2526
public ContributionsListAdapter(Context context,
2627
Cursor c,
2728
int flags,
2829
ContributionDao contributionDao) {
2930
super(context, c, flags);
30-
this.context = context;
3131
this.contributionDao = contributionDao;
3232
}
3333

@@ -53,12 +53,12 @@ public void bindView(View view, Context context, Cursor cursor) {
5353
new DisplayableContribution.ContributionActions() {
5454
@Override
5555
public void retryUpload() {
56-
ContributionsListAdapter.this.retryUpload(contribution);
56+
ContributionsListAdapter.this.retryUpload(view.getContext(), contribution);
5757
}
5858

5959
@Override
6060
public void deleteUpload() {
61-
ContributionsListAdapter.this.deleteUpload(contribution);
61+
ContributionsListAdapter.this.deleteUpload(view.getContext(), contribution);
6262
}
6363
});
6464
views.bindModel(context, displayableContribution);
@@ -68,7 +68,7 @@ public void deleteUpload() {
6868
* Retry upload when it is failed
6969
* @param contribution contribution to be retried
7070
*/
71-
private void retryUpload(Contribution contribution) {
71+
private void retryUpload(@NonNull Context context, Contribution contribution) {
7272
if (NetworkUtils.isInternetConnectionEstablished(context)) {
7373
if (contribution.getState() == STATE_FAILED
7474
&& uploadService!= null) {
@@ -87,7 +87,7 @@ private void retryUpload(Contribution contribution) {
8787
* Delete a failed upload attempt
8888
* @param contribution contribution to be deleted
8989
*/
90-
private void deleteUpload(Contribution contribution) {
90+
private void deleteUpload(@NonNull Context context, Contribution contribution) {
9191
if (NetworkUtils.isInternetConnectionEstablished(context)) {
9292
if (contribution.getState() == STATE_FAILED) {
9393
Timber.d("Deleting failed contrib %s", contribution.toString());

app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import android.location.LocationListener;
1010
import android.location.LocationManager;
1111
import android.os.Bundle;
12+
13+
import androidx.annotation.NonNull;
1214
import androidx.core.app.ActivityCompat;
1315
import androidx.core.content.ContextCompat;
1416

@@ -26,21 +28,19 @@ public class LocationServiceManager implements LocationListener {
2628
private static final long MIN_LOCATION_UPDATE_REQUEST_TIME_IN_MILLIS = 2 * 60 * 100;
2729
private static final long MIN_LOCATION_UPDATE_REQUEST_DISTANCE_IN_METERS = 10;
2830

29-
public Context context;
3031
private LocationManager locationManager;
3132
private Location lastLocation;
3233
//private Location lastLocationDuplicate; // Will be used for nearby card view on contributions activity
3334
private final List<LocationUpdateListener> locationListeners = new CopyOnWriteArrayList<>();
3435
private boolean isLocationManagerRegistered = false;
35-
public Set<Activity> locationExplanationDisplayed = new HashSet<>();
36+
private Set<Activity> locationExplanationDisplayed = new HashSet<>();
3637

3738
/**
3839
* Constructs a new instance of LocationServiceManager.
3940
*
4041
* @param context the context
4142
*/
4243
public LocationServiceManager(Context context) {
43-
this.context = context;
4444
this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
4545
}
4646

@@ -57,7 +57,7 @@ public boolean isProviderEnabled() {
5757
* Returns whether the location permission is granted.
5858
* @return true if the location permission is granted
5959
*/
60-
public boolean isLocationPermissionGranted() {
60+
public boolean isLocationPermissionGranted(@NonNull Context context) {
6161
return ContextCompat.checkSelfPermission(context,
6262
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
6363
}
@@ -101,8 +101,8 @@ public boolean isPermissionExplanationRequired(Activity activity) {
101101
* @return last known LatLng
102102
*/
103103
@SuppressLint("MissingPermission")
104-
public LatLng getLKL() {
105-
if (isLocationPermissionGranted()) {
104+
public LatLng getLKL(@NonNull Context context) {
105+
if (isLocationPermissionGranted(context)) {
106106
Location lastKL = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
107107
if (lastKL == null) {
108108
lastKL = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
@@ -225,6 +225,7 @@ private boolean isSameProvider(String provider1, String provider2) {
225225
*/
226226
public void unregisterLocationManager() {
227227
isLocationManagerRegistered = false;
228+
locationExplanationDisplayed.clear();
228229
try {
229230
locationManager.removeUpdates(this);
230231
} catch (SecurityException e) {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ private void hideProgressBar() {
572572
*/
573573
private void registerLocationUpdates() {
574574
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
575-
if (locationManager.isLocationPermissionGranted()) {
575+
if (locationManager.isLocationPermissionGranted(requireContext())) {
576576
locationManager.registerLocationManager();
577577
} else {
578578
// Should we show an explanation?
@@ -666,7 +666,7 @@ private void checkGps() {
666666
private void checkLocationPermission() {
667667
Timber.d("Checking location permission");
668668
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
669-
if (locationManager.isLocationPermissionGranted()) {
669+
if (locationManager.isLocationPermissionGranted(requireContext())) {
670670
refreshView(LOCATION_SIGNIFICANTLY_CHANGED);
671671
} else {
672672
// Should we show an explanation?

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

+5-11
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@
2121
* Custom card view for nearby notification card view on main screen, above contributions list
2222
*/
2323
public class NearbyNotificationCardView extends SwipableCardView {
24-
25-
private Context context;
26-
2724
private Button permissionRequestButton;
2825
private LinearLayout contentLayout;
2926
private TextView notificationTitle;
@@ -37,21 +34,18 @@ public class NearbyNotificationCardView extends SwipableCardView {
3734

3835
public NearbyNotificationCardView(@NonNull Context context) {
3936
super(context);
40-
this.context = context;
4137
cardViewVisibilityState = CardViewVisibilityState.INVISIBLE;
4238
init();
4339
}
4440

4541
public NearbyNotificationCardView(@NonNull Context context, @Nullable AttributeSet attrs) {
4642
super(context, attrs);
47-
this.context = context;
4843
cardViewVisibilityState = CardViewVisibilityState.INVISIBLE;
4944
init();
5045
}
5146

5247
public NearbyNotificationCardView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
5348
super(context, attrs, defStyleAttr);
54-
this.context = context;
5549
cardViewVisibilityState = CardViewVisibilityState.INVISIBLE;
5650
init();
5751
}
@@ -60,7 +54,7 @@ public NearbyNotificationCardView(@NonNull Context context, @Nullable AttributeS
6054
* Initializes views and action listeners
6155
*/
6256
private void init() {
63-
View rootView = inflate(context, R.layout.nearby_card_view, this);
57+
View rootView = inflate(getContext(), R.layout.nearby_card_view, this);
6458

6559
permissionRequestButton = rootView.findViewById(R.id.permission_request_button);
6660
contentLayout = rootView.findViewById(R.id.content_layout);
@@ -79,7 +73,7 @@ private void init() {
7973
protected void onAttachedToWindow() {
8074
super.onAttachedToWindow();
8175
// If you don't setVisibility after getting layout params, then you will se an empty space in place of nearby NotificationCardView
82-
if (((MainActivity)context).defaultKvStore.getBoolean("displayNearbyCardView", true) && this.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
76+
if (((MainActivity)getContext()).defaultKvStore.getBoolean("displayNearbyCardView", true) && this.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
8377
this.setVisibility(VISIBLE);
8478
} else {
8579
this.setVisibility(GONE);
@@ -88,14 +82,14 @@ protected void onAttachedToWindow() {
8882

8983

9084
private void setActionListeners() {
91-
this.setOnClickListener(view -> ((MainActivity)context).viewPager.setCurrentItem(1));
85+
this.setOnClickListener(view -> ((MainActivity)getContext()).viewPager.setCurrentItem(1));
9286
}
9387

9488
@Override public boolean onSwipe(View view) {
9589
view.setVisibility(GONE);
9690
// Save shared preference for nearby card view accordingly
97-
((MainActivity) context).defaultKvStore.putBoolean("displayNearbyCardView", false);
98-
ViewUtil.showLongToast(context,
91+
((MainActivity) getContext()).defaultKvStore.putBoolean("displayNearbyCardView", false);
92+
ViewUtil.showLongToast(getContext(),
9993
getResources().getString(R.string.nearby_notification_dismiss_message));
10094
return true;
10195
}

0 commit comments

Comments
 (0)