Skip to content

Commit 70c4394

Browse files
committed
Merge remote-tracking branch 'refs/remotes/commons-app/master'
2 parents a79659e + 5c1fd5b commit 70c4394

File tree

4 files changed

+114
-14
lines changed

4 files changed

+114
-14
lines changed

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.Date;
4242
import java.util.HashMap;
4343
import java.util.HashSet;
44+
import java.util.Iterator;
4445
import java.util.LinkedHashSet;
4546
import java.util.List;
4647
import java.util.Set;
@@ -217,11 +218,11 @@ protected ArrayList<String> mergeItems() {
217218
Log.d(TAG, "Adding title items: " + titleItems);
218219
mergedItems.addAll(recentItems);
219220
Log.d(TAG, "Adding recent items: " + recentItems);
220-
221+
221222
//Needs to be an ArrayList and not a List unless we want to modify a big portion of preexisting code
222223
ArrayList<String> mergedItemsList = new ArrayList<String>(mergedItems);
223-
Log.d(TAG, "Merged item list: " + mergedItemsList);
224224

225+
Log.d(TAG, "Merged item list: " + mergedItemsList);
225226
return mergedItemsList;
226227
}
227228

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

+50-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
import java.io.IOException;
1212
import java.util.ArrayList;
13+
import java.util.Calendar;
14+
import java.util.Iterator;
1315

1416
import fr.free.nrw.commons.CommonsApplication;
1517

@@ -38,16 +40,59 @@ protected void onPreExecute() {
3840
catFragment.categoriesSkip.setVisibility(View.GONE);
3941
}
4042

43+
/**
44+
* Remove categories that contain a year in them (starting with 19__ or 20__), except for this year
45+
* and previous year
46+
* Rationale: https://github.com/commons-app/apps-android-commons/issues/47
47+
* @param items Unfiltered list of categories
48+
* @return Filtered category list
49+
*/
50+
private ArrayList<String> filterYears(ArrayList<String> items) {
51+
52+
Iterator<String> iterator;
53+
54+
//Check for current and previous year to exclude these categories from removal
55+
Calendar now = Calendar.getInstance();
56+
int year = now.get(Calendar.YEAR);
57+
String yearInString = String.valueOf(year);
58+
Log.d(TAG, "Year: " + yearInString);
59+
60+
int prevYear = year - 1;
61+
String prevYearInString = String.valueOf(prevYear);
62+
Log.d(TAG, "Previous year: " + prevYearInString);
63+
64+
//Copy to Iterator to prevent ConcurrentModificationException when removing item
65+
for(iterator = items.iterator(); iterator.hasNext();) {
66+
String s = iterator.next();
67+
68+
//Check if s contains a 4-digit word anywhere within the string (.* is wildcard)
69+
//And that s does not equal the current year or previous year
70+
if(s.matches(".*(19|20)\\d{2}.*") && !s.contains(yearInString) && !s.contains(prevYearInString)) {
71+
Log.d(TAG, "Filtering out year " + s);
72+
iterator.remove();
73+
}
74+
}
75+
76+
Log.d(TAG, "Items: " + items.toString());
77+
return items;
78+
}
79+
4180
@Override
4281
protected ArrayList<String> doInBackground(Void... voids) {
4382
//If user hasn't typed anything in yet, get GPS and recent items
4483
if(TextUtils.isEmpty(filter)) {
45-
return catFragment.mergeItems();
84+
ArrayList<String> mergedItems = new ArrayList<String>(catFragment.mergeItems());
85+
Log.d(TAG, "Merged items, waiting for filter");
86+
ArrayList<String> filteredItems = new ArrayList<String>(filterYears(mergedItems));
87+
return filteredItems;
4688
}
4789

4890
//if user types in something that is in cache, return cached category
4991
if(catFragment.categoriesCache.containsKey(filter)) {
50-
return catFragment.categoriesCache.get(filter);
92+
ArrayList<String> cachedItems = new ArrayList<String>(catFragment.categoriesCache.get(filter));
93+
Log.d(TAG, "Found cache items, waiting for filter");
94+
ArrayList<String> filteredItems = new ArrayList<String>(filterYears(cachedItems));
95+
return filteredItems;
5196
}
5297

5398
//otherwise if user has typed something in that isn't in cache, search API for matching categories
@@ -79,6 +124,8 @@ protected ArrayList<String> doInBackground(Void... voids) {
79124
categories.add(catString);
80125
}
81126

82-
return categories;
127+
Log.d(TAG, "Found categories from Method A search, waiting for filter");
128+
ArrayList<String> filteredItems = new ArrayList<String>(filterYears(categories));
129+
return filteredItems;
83130
}
84131
}

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

+53-3
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,16 @@
1010

1111
import java.io.IOException;
1212
import java.util.ArrayList;
13+
import java.util.Calendar;
14+
import java.util.Iterator;
15+
import java.util.List;
1316

1417
import javax.net.ssl.SSLPeerUnverifiedException;
1518

1619
import fr.free.nrw.commons.CommonsApplication;
1720

21+
import static android.R.id.list;
22+
1823
/**
1924
* Sends asynchronous queries to the Commons MediaWiki API to retrieve categories that share the
2025
* same prefix as the keyword typed in by the user. The 'acprefix' action-specific parameter is used
@@ -41,16 +46,59 @@ protected void onPreExecute() {
4146
catFragment.categoriesSkip.setVisibility(View.GONE);
4247
}
4348

49+
/**
50+
* Remove categories that contain a year in them (starting with 19__ or 20__), except for this year
51+
* and previous year
52+
* Rationale: https://github.com/commons-app/apps-android-commons/issues/47
53+
* @param items Unfiltered list of categories
54+
* @return Filtered category list
55+
*/
56+
private ArrayList<String> filterYears(ArrayList<String> items) {
57+
58+
Iterator<String> iterator;
59+
60+
//Check for current and previous year to exclude these categories from removal
61+
Calendar now = Calendar.getInstance();
62+
int year = now.get(Calendar.YEAR);
63+
String yearInString = String.valueOf(year);
64+
Log.d(TAG, "Year: " + yearInString);
65+
66+
int prevYear = year - 1;
67+
String prevYearInString = String.valueOf(prevYear);
68+
Log.d(TAG, "Previous year: " + prevYearInString);
69+
70+
//Copy to Iterator to prevent ConcurrentModificationException when removing item
71+
for(iterator = items.iterator(); iterator.hasNext();) {
72+
String s = iterator.next();
73+
74+
//Check if s contains a 4-digit word anywhere within the string (.* is wildcard)
75+
//And that s does not equal the current year or previous year
76+
if(s.matches(".*(19|20)\\d{2}.*") && !s.contains(yearInString) && !s.contains(prevYearInString)) {
77+
Log.d(TAG, "Filtering out year " + s);
78+
iterator.remove();
79+
}
80+
}
81+
82+
Log.d(TAG, "Items: " + items.toString());
83+
return items;
84+
}
85+
4486
@Override
4587
protected ArrayList<String> doInBackground(Void... voids) {
4688
//If user hasn't typed anything in yet, get GPS and recent items
4789
if(TextUtils.isEmpty(filter)) {
48-
return catFragment.mergeItems();
90+
ArrayList<String> mergedItems = new ArrayList<String>(catFragment.mergeItems());
91+
Log.d(TAG, "Merged items, waiting for filter");
92+
ArrayList<String> filteredItems = new ArrayList<String>(filterYears(mergedItems));
93+
return filteredItems;
4994
}
5095

5196
//if user types in something that is in cache, return cached category
5297
if(catFragment.categoriesCache.containsKey(filter)) {
53-
return catFragment.categoriesCache.get(filter);
98+
ArrayList<String> cachedItems = new ArrayList<String>(catFragment.categoriesCache.get(filter));
99+
Log.d(TAG, "Found cache items, waiting for filter");
100+
ArrayList<String> filteredItems = new ArrayList<String>(filterYears(cachedItems));
101+
return filteredItems;
54102
}
55103

56104
//otherwise if user has typed something in that isn't in cache, search API for matching categories
@@ -76,6 +124,8 @@ protected ArrayList<String> doInBackground(Void... voids) {
76124
categories.add(categoryNode.getDocument().getTextContent());
77125
}
78126

79-
return categories;
127+
Log.d(TAG, "Found categories from Prefix search, waiting for filter");
128+
ArrayList<String> filteredItems = new ArrayList<String>(filterYears(categories));
129+
return filteredItems;
80130
}
81131
}

find-broken-strings-variables.sh

+8-6
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
# Spot malformed string replacement patterns in Android localization files.
33
# First install Lint from the Android SDK
44

5-
grep -R "%1$ s" res/values*
6-
grep -R "%1$ d" res/values*
7-
grep -R "%1" res/values* | grep -v "%1\\$"
5+
VALUES=app/src/main/res/values
86

9-
grep -RH '%' res/values* |
7+
grep -R "%1$ s" $VALUES*
8+
grep -R "%1$ d" $VALUES*
9+
grep -R "%1" $VALUES* | grep -v "%1\\$"
10+
11+
grep -RH '%' $VALUES* |
1012
sed -e 's/%/\n%/g' | # Split lines that contain several expressions
1113
grep '%' | # Filter out lines that do not contain expressions
1214
grep -v ' % ' | # Lone % character, not a variable
@@ -23,10 +25,10 @@ grep -RH '%' res/values* |
2325
grep -v '%20' # Ignore URL whitespace
2426
exit
2527
# Double-width percent sign
26-
grep -R '' res/values*
28+
grep -R '' $VALUES*
2729

2830
# Broken CDATA syntax
29-
grep -R "CDATA " res/values*
31+
grep -R "CDATA " $VALUES*
3032

3133
# Android SDK Lint (does not detect most syntax errors)
3234
lint --check StringFormatInvalid commons

0 commit comments

Comments
 (0)