Skip to content

Commit 08a555c

Browse files
ashishkumar468misaochan
authored andcommitted
Merge 2.10 with master & Fixed merge conflicts (commons-app#2844)
1 parent 02ad3b2 commit 08a555c

18 files changed

+171
-112
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Wikimedia Commons for Android
22

3+
## v2.10.2
4+
- Fixed remaining issues with date image taken
5+
- Fixed database crash
6+
37
## v2.10.1
48
- Fixed "stuck before category selection screen" bug
59
- Fixed notification taps

app/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ android {
104104

105105
defaultConfig {
106106
applicationId 'fr.free.nrw.commons'
107-
versionCode 226
108-
versionName '2.10.1'
107+
versionCode 243
108+
versionName '2.10.2'
109109
setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName())
110110

111111
minSdkVersion 19

app/src/main/java/fr/free/nrw/commons/Utils.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,8 @@ public static int licenseNameFor(String license) {
6363
return R.string.license_name_cc_by_sa_four;
6464
case Prefs.Licenses.CC0:
6565
return R.string.license_name_cc0;
66-
case Prefs.Licenses.CC_BY: // for backward compatibility to v2.1
67-
return R.string.license_name_cc_by_3_0;
68-
case Prefs.Licenses.CC_BY_SA: // for backward compatibility to v2.1
69-
return R.string.license_name_cc_by_sa_3_0;
7066
}
71-
throw new RuntimeException("Unrecognized license value: " + license);
67+
throw new IllegalStateException("Unrecognized license value: " + license);
7268
}
7369

7470
/**
@@ -92,7 +88,7 @@ public static String licenseUrlFor(String license) {
9288
case Prefs.Licenses.CC0:
9389
return "https://creativecommons.org/publicdomain/zero/1.0/";
9490
default:
95-
throw new RuntimeException("Unrecognized license value: " + license);
91+
throw new IllegalStateException("Unrecognized license value: " + license);
9692
}
9793
}
9894

app/src/main/java/fr/free/nrw/commons/bookmarks/pictures/BookmarkPicturesDao.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,15 @@
66
import android.database.sqlite.SQLiteDatabase;
77
import android.os.RemoteException;
88
import androidx.annotation.NonNull;
9+
import fr.free.nrw.commons.bookmarks.Bookmark;
910

1011
import java.util.ArrayList;
1112
import java.util.List;
12-
1313
import javax.inject.Inject;
1414
import javax.inject.Named;
1515
import javax.inject.Provider;
1616
import javax.inject.Singleton;
1717

18-
import fr.free.nrw.commons.bookmarks.Bookmark;
19-
2018
import static fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesContentProvider.BASE_URI;
2119

2220
@Singleton
@@ -121,6 +119,10 @@ private void deleteBookmark(Bookmark bookmark) {
121119
* @return boolean : is bookmark in database ?
122120
*/
123121
public boolean findBookmark(Bookmark bookmark) {
122+
if (bookmark == null) {//Avoiding NPE's
123+
return false;
124+
}
125+
124126
Cursor cursor = null;
125127
ContentProviderClient db = clientProvider.get();
126128
try {

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

-4
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,6 @@ private String licenseTemplateFor(String license) {
259259
return "{{self|cc-by-sa-4.0}}";
260260
case Prefs.Licenses.CC0:
261261
return "{{self|cc-zero}}";
262-
case Prefs.Licenses.CC_BY:
263-
return "{{self|cc-by-3.0}}";
264-
case Prefs.Licenses.CC_BY_SA:
265-
return "{{self|cc-by-sa-3.0}}";
266262
}
267263

268264
throw new RuntimeException("Unrecognized license value: " + license);

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@
99
import android.os.RemoteException;
1010
import androidx.annotation.Nullable;
1111
import android.text.TextUtils;
12+
import fr.free.nrw.commons.settings.Prefs;
1213

1314
import org.apache.commons.lang3.StringUtils;
14-
15-
import fr.free.nrw.commons.settings.Prefs;
1615
import java.util.Date;
1716
import javax.inject.Inject;
1817
import javax.inject.Named;
@@ -320,7 +319,7 @@ private static void runQuery(SQLiteDatabase db, String query) {
320319
try {
321320
db.execSQL(query);
322321
} catch (SQLiteException e) {
323-
Timber.e(e, "Exception performing query: " + query);
322+
Timber.e("Exception performing query: " + query + " message: " + e.getMessage());
324323
}
325324
}
326325

app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.java

+25-16
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,33 @@
22

33
import android.database.DataSetObserver;
44
import android.os.Bundle;
5-
import com.google.android.material.tabs.TabLayout;
6-
import androidx.fragment.app.Fragment;
7-
import androidx.fragment.app.FragmentManager;
8-
import androidx.fragment.app.FragmentTransaction;
9-
import androidx.viewpager.widget.ViewPager;
10-
import androidx.appcompat.widget.Toolbar;
115
import android.text.TextUtils;
126
import android.view.View;
137
import android.widget.FrameLayout;
148
import android.widget.SearchView;
15-
16-
import com.jakewharton.rxbinding2.view.RxView;
17-
import com.jakewharton.rxbinding2.widget.RxSearchView;
18-
19-
import java.util.ArrayList;
20-
import java.util.List;
21-
import java.util.concurrent.TimeUnit;
22-
9+
import androidx.appcompat.widget.Toolbar;
10+
import androidx.fragment.app.Fragment;
11+
import androidx.fragment.app.FragmentManager;
12+
import androidx.fragment.app.FragmentTransaction;
13+
import androidx.viewpager.widget.ViewPager;
2314
import butterknife.BindView;
2415
import butterknife.ButterKnife;
16+
import com.google.android.material.tabs.TabLayout;
17+
import com.jakewharton.rxbinding2.view.RxView;
18+
import com.jakewharton.rxbinding2.widget.RxSearchView;
2519
import fr.free.nrw.commons.Media;
2620
import fr.free.nrw.commons.R;
2721
import fr.free.nrw.commons.explore.categories.SearchCategoryFragment;
2822
import fr.free.nrw.commons.explore.images.SearchImageFragment;
2923
import fr.free.nrw.commons.explore.recentsearches.RecentSearchesFragment;
3024
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
3125
import fr.free.nrw.commons.theme.NavigationBaseActivity;
26+
import fr.free.nrw.commons.utils.FragmentUtils;
3227
import fr.free.nrw.commons.utils.ViewUtil;
3328
import io.reactivex.android.schedulers.AndroidSchedulers;
29+
import java.util.ArrayList;
30+
import java.util.List;
31+
import java.util.concurrent.TimeUnit;
3432

3533
/**
3634
* Represents search screen of this app
@@ -109,8 +107,13 @@ public void setTabs() {
109107
viewPager.setVisibility(View.VISIBLE);
110108
tabLayout.setVisibility(View.VISIBLE);
111109
searchHistoryContainer.setVisibility(View.GONE);
112-
searchImageFragment.updateImageList(query.toString());
113-
searchCategoryFragment.updateCategoryList(query.toString());
110+
if (FragmentUtils.isFragmentUIActive(searchImageFragment)) {
111+
searchImageFragment.updateImageList(query.toString());
112+
}
113+
114+
if (FragmentUtils.isFragmentUIActive(searchCategoryFragment)) {
115+
searchCategoryFragment.updateCategoryList(query.toString());
116+
}
114117
}else {
115118
//Open RecentSearchesFragment
116119
recentSearchesFragment.updateRecentSearches();
@@ -261,4 +264,10 @@ public void requestMoreImages() {
261264
searchImageFragment.addImagesToList(query);
262265
}
263266
}
267+
268+
@Override protected void onDestroy() {
269+
super.onDestroy();
270+
//Dispose the disposables when the activity is destroyed
271+
compositeDisposable.dispose();
272+
}
264273
}

app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package fr.free.nrw.commons.explore.images;
22

3-
43
import android.annotation.SuppressLint;
54
import android.content.res.Configuration;
65
import android.os.Bundle;
@@ -228,8 +227,15 @@ private void initErrorView() {
228227
* Handles the UI updates for no internet scenario
229228
*/
230229
private void handleNoInternet() {
231-
progressBar.setVisibility(GONE);
232-
ViewUtil.showShortSnackbar(imagesRecyclerView, R.string.no_internet);
230+
if (null
231+
!= getView()) {//We have exposed public methods to update our ui, we will have to add null checks until we make this lifecycle aware
232+
if (null != progressBar) {
233+
progressBar.setVisibility(GONE);
234+
}
235+
ViewUtil.showShortSnackbar(imagesRecyclerView, R.string.no_internet);
236+
} else {
237+
Timber.d("Attempt to update fragment ui after its view was destroyed");
238+
}
233239
}
234240

235241
/**
@@ -257,4 +263,9 @@ public Media getImageAtPosition(int i) {
257263
return imagesAdapter.getItem(i);
258264
}
259265
}
266+
267+
@Override public void onDestroyView() {
268+
super.onDestroyView();
269+
compositeDisposable.clear();
270+
}
260271
}

app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@
5252
import io.reactivex.android.schedulers.AndroidSchedulers;
5353
import io.reactivex.disposables.Disposable;
5454
import io.reactivex.schedulers.Schedulers;
55+
import java.io.IOException;
56+
import java.util.ArrayList;
57+
import java.util.Date;
58+
import java.util.Locale;
59+
import javax.inject.Inject;
60+
import javax.inject.Provider;
5561
import timber.log.Timber;
5662

5763
import static android.view.View.GONE;
@@ -285,6 +291,7 @@ public void onDestroyView() {
285291
detailProvider.unregisterDataSetObserver(dataObserver);
286292
dataObserver = null;
287293
}
294+
compositeDisposable.clear();
288295
super.onDestroyView();
289296
}
290297

@@ -414,9 +421,12 @@ private void onDeleteClicked(Spinner spinner) {
414421
.subscribeOn(Schedulers.io())
415422
.observeOn(AndroidSchedulers.mainThread())
416423
.subscribe(s -> {
417-
isDeleted = true;
418-
enableDeleteButton(false);
424+
if (getActivity() != null) {
425+
isDeleted = true;
426+
enableDeleteButton(false);
427+
}
419428
}));
429+
420430
}
421431

422432
@OnClick(R.id.seeMore)
@@ -540,4 +550,5 @@ private void checkDeletion(Media media){
540550
nominatedForDeletion.setVisibility(GONE);
541551
}
542552
}
553+
543554
}

app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java

+15-19
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import android.content.Intent;
66
import android.database.DataSetObserver;
77
import android.net.Uri;
8-
import android.os.Build;
98
import android.os.Bundle;
109
import android.os.Environment;
1110
import android.os.Handler;
@@ -15,14 +14,12 @@
1514
import android.view.MenuItem;
1615
import android.view.View;
1716
import android.view.ViewGroup;
17+
import android.widget.Toast;
1818

19-
import com.google.android.material.snackbar.Snackbar;
2019

2120
import javax.inject.Inject;
2221
import javax.inject.Named;
2322

24-
import androidx.core.app.ActivityCompat;
25-
import androidx.core.content.ContextCompat;
2623
import androidx.fragment.app.Fragment;
2724
import androidx.fragment.app.FragmentManager;
2825
import androidx.fragment.app.FragmentStatePagerAdapter;
@@ -44,12 +41,12 @@
4441
import fr.free.nrw.commons.mwapi.MediaWikiApi;
4542
import fr.free.nrw.commons.utils.ImageUtils;
4643
import fr.free.nrw.commons.utils.NetworkUtils;
44+
import fr.free.nrw.commons.utils.PermissionUtils;
4745
import fr.free.nrw.commons.utils.ViewUtil;
4846
import timber.log.Timber;
4947

50-
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
48+
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
5149
import static android.content.Context.DOWNLOAD_SERVICE;
52-
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
5350
import static fr.free.nrw.commons.Utils.handleWebUrl;
5451

5552
public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment implements ViewPager.OnPageChangeListener {
@@ -227,20 +224,19 @@ private void downloadMedia(Media m) {
227224
// Modern Android updates the gallery automatically. Yay!
228225
req.allowScanningByMediaScanner();
229226
req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
227+
PermissionUtils.checkPermissionsAndPerformAction(getActivity(), WRITE_EXTERNAL_STORAGE,
228+
() -> enqueueRequest(req), () -> Toast.makeText(getContext(),
229+
R.string.download_failed_we_cannot_download_the_file_without_storage_permission,
230+
Toast.LENGTH_SHORT).show(), R.string.storage_permission,
231+
R.string.write_storage_permission_rationale);
230232

231-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
232-
ContextCompat.checkSelfPermission(getContext(), READ_EXTERNAL_STORAGE)
233-
!= PERMISSION_GRANTED
234-
&& getView() != null) {
235-
Snackbar.make(getView(), R.string.read_storage_permission_rationale,
236-
Snackbar.LENGTH_INDEFINITE).setAction(R.string.ok,
237-
view -> ActivityCompat.requestPermissions(getActivity(),
238-
new String[]{READ_EXTERNAL_STORAGE}, 1)).show();
239-
} else {
240-
DownloadManager systemService = (DownloadManager) getActivity().getSystemService(DOWNLOAD_SERVICE);
241-
if (systemService != null) {
242-
systemService.enqueue(req);
243-
}
233+
}
234+
235+
private void enqueueRequest(DownloadManager.Request req) {
236+
DownloadManager systemService =
237+
(DownloadManager) getActivity().getSystemService(DOWNLOAD_SERVICE);
238+
if (systemService != null) {
239+
systemService.enqueue(req);
244240
}
245241
}
246242

app/src/main/java/fr/free/nrw/commons/mwapi/CustomMwApi.java

+4
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ public String getAuthCookie() {
6969
}
7070

7171
public void setAuthCookie(String authCookie) {
72+
if (authCookie == null) {//If the authCookie is null, no need to proceed
73+
return;
74+
}
75+
7276
this.authCookie = authCookie;
7377
this.isLoggedIn = true;
7478
String[] cookies = authCookie.split(";");

app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -319,10 +319,13 @@ public Single<List<Media>> getMediaList(String queryType, String keyword) {
319319
if (response.body() != null && response.isSuccessful()) {
320320
String json = response.body().string();
321321
MwQueryResponse mwQueryResponse = gson.fromJson(json, MwQueryResponse.class);
322-
putContinueValues(keyword, mwQueryResponse.continuation());
323-
if (mwQueryResponse.query() == null) {
322+
if (null == mwQueryResponse
323+
|| null == mwQueryResponse.query()
324+
|| null == mwQueryResponse.query().pages()) {
324325
return mediaList;
325326
}
327+
putContinueValues(keyword, mwQueryResponse.continuation());
328+
326329
List<MwQueryPage> pages = mwQueryResponse.query().pages();
327330
for (MwQueryPage page : pages) {
328331
Media media = Media.from(page);

app/src/main/java/fr/free/nrw/commons/settings/Prefs.java

-4
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,5 @@ public static class Licenses {
1414
public static final String CC_BY_SA_4 = "CC BY-SA 4.0";
1515
public static final String CC_BY_4 = "CC BY 4.0";
1616
public static final String CC0 = "CC0";
17-
18-
// kept for backward compatibility to v2.1
19-
@Deprecated public static final String CC_BY = "CC BY";
20-
@Deprecated public static final String CC_BY_SA = "CC BY-SA";
2117
}
2218
}

0 commit comments

Comments
 (0)