From 8b75c41143529cee9301c88760b955169cbc209b Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Fri, 29 Apr 2022 21:50:20 +1000 Subject: [PATCH 01/25] Fix string for custom selector --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cc032ef40..a251d21ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -674,7 +674,7 @@ Upload your first media by tapping on the add button. Done Back Welcome to Custom Picture Selector - This picker shows differently pictures that are already to Commons. + This picker shows you which pictures you have already uploaded to Commons. Unlike the picture on the left, the picture on the right has the Commons logo indicating it is already uploaded. \n Touch and hold for image preview. Awesome This image has already been uploaded to Commons. From 9880d7ea7e5e8ad2057a38e2eaf3461d61ca73eb Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Mon, 2 May 2022 11:12:08 +0530 Subject: [PATCH 02/25] Fix bug #4950 back arrow still present on top-level activity (#4952) --- .../nrw/commons/contributions/ContributionsFragment.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java index 25d6e7d33..45ae66e4a 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java @@ -662,7 +662,7 @@ public class ContributionsFragment } public boolean backButtonClicked() { - if (null != mediaDetailPagerFragment && mediaDetailPagerFragment.isVisible()) { + if (mediaDetailPagerFragment != null && mediaDetailPagerFragment.isVisible()) { if (store.getBoolean("displayNearbyCardView", true) && !isUserProfile) { if (nearbyNotificationCardView.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) { nearbyNotificationCardView.setVisibility(View.VISIBLE); @@ -679,9 +679,10 @@ public class ContributionsFragment }else { fetchCampaigns(); } - if(getActivity() instanceof MainActivity) { + if (getActivity() instanceof MainActivity) { // Fragment is associated with MainActivity - ((MainActivity)getActivity()).showTabs(); + ((BaseActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false); + ((MainActivity) getActivity()).showTabs(); } return true; } From 4edabede8856b8882294fbfc3d24f1029fd5739d Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Wed, 18 May 2022 22:17:10 +0530 Subject: [PATCH 03/25] Fix bug #4949 by correctly setting previous db version number (#4956) * Fix bug #4949 by correctly setting previous db version number * Fix failing tests --- .../bookmarks/items/BookmarkItemsDao.java | 12 +-- .../bookmarks/items/BookmarkItemsDaoTest.kt | 75 +++++++++++++++++++ 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDao.java b/app/src/main/java/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDao.java index 08e54a114..70c370836 100644 --- a/app/src/main/java/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDao.java +++ b/app/src/main/java/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDao.java @@ -309,22 +309,18 @@ public class BookmarkItemsDao { if (from == to) { return; } - if (from < 7) { + if (from < 18) { + // doesn't exist yet from++; onUpdate(db, from, to); return; } - if (from == 7) { + if (from == 18) { + // table added in version 19 onCreate(db); from++; onUpdate(db, from, to); - return; - } - - if (from == 8) { - from++; - onUpdate(db, from, to); } } } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDaoTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDaoTest.kt index 73504acdc..92778dea7 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDaoTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDaoTest.kt @@ -271,9 +271,84 @@ class BookmarkItemsDaoTest { @Test fun migrateTableVersionFrom_v7_to_v8() { onUpdate(database, 7, 8) + // Table didn't change in version 8 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v8_to_v9() { + onUpdate(database, 8, 9) + // Table didn't change in version 9 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v9_to_v10() { + onUpdate(database, 9, 10) + // Table didn't change in version 10 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v10_to_v11() { + onUpdate(database, 10, 11) + // Table didn't change in version 11 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v11_to_v12() { + onUpdate(database, 11, 12) + // Table didn't change in version 12 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v12_to_v13() { + onUpdate(database, 12, 13) + // Table didn't change in version 13 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v13_to_v14() { + onUpdate(database, 13, 14) + // Table didn't change in version 14 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v14_to_v15() { + onUpdate(database, 14, 15) + // Table didn't change in version 15 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v15_to_v16() { + onUpdate(database, 15, 16) + // Table didn't change in version 16 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v16_to_v17() { + onUpdate(database, 16, 17) + // Table didn't change in version 17 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v18_to_v19() { + onUpdate(database, 18, 19) verify(database).execSQL(CREATE_TABLE_STATEMENT) } + @Test + fun migrateTableVersionFrom_v19_to_v19() { + onUpdate(database, 19, 19) + verifyZeroInteractions(database) + } private fun createCursor(rowCount: Int) = MatrixCursor(columns, rowCount).apply { From f4414b1c314d801db21dd9a1b9d6163d2cc83242 Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Fri, 20 May 2022 13:39:45 +0530 Subject: [PATCH 04/25] Fix bug #4959 by correctly setting previous db version number and updating the current db version (#4960) --- .../free/nrw/commons/data/DBOpenHelper.java | 4 +- .../recentlanguages/RecentLanguagesDao.java | 12 +-- .../RecentLanguagesDaoUnitTest.kt | 89 ++++++++++++++++++- 3 files changed, 90 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java b/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java index 207101638..7ee417fbc 100644 --- a/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java +++ b/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java @@ -4,9 +4,7 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; - import fr.free.nrw.commons.bookmarks.items.BookmarkItemsDao; -import fr.free.nrw.commons.bookmarks.items.BookmarkItemsDao.Table; import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao; import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesDao; import fr.free.nrw.commons.category.CategoryDao; @@ -16,7 +14,7 @@ import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao; public class DBOpenHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "commons.db"; - private static final int DATABASE_VERSION = 19; + private static final int DATABASE_VERSION = 20; public static final String CONTRIBUTIONS_TABLE = "contributions"; private final String DROP_TABLE_STATEMENT="DROP TABLE IF EXISTS %s"; diff --git a/app/src/main/java/fr/free/nrw/commons/recentlanguages/RecentLanguagesDao.java b/app/src/main/java/fr/free/nrw/commons/recentlanguages/RecentLanguagesDao.java index 1af1b50e6..c4a4bf518 100644 --- a/app/src/main/java/fr/free/nrw/commons/recentlanguages/RecentLanguagesDao.java +++ b/app/src/main/java/fr/free/nrw/commons/recentlanguages/RecentLanguagesDao.java @@ -185,23 +185,17 @@ public class RecentLanguagesDao { if (from == to) { return; } - if (from < 6) { + if (from < 19) { // doesn't exist yet from++; onUpdate(db, from, to); return; } - if (from == 6) { - // table added in version 7 + if (from == 19) { + // table added in version 20 onCreate(db); from++; onUpdate(db, from, to); - return; - } - if (from == 7) { - from++; - onUpdate(db, from, to); - return; } } } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/recentlanguages/RecentLanguagesDaoUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/recentlanguages/RecentLanguagesDaoUnitTest.kt index 122f2e49c..abe8708bf 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/recentlanguages/RecentLanguagesDaoUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/recentlanguages/RecentLanguagesDaoUnitTest.kt @@ -177,20 +177,103 @@ class RecentLanguagesDaoUnitTest { @Test fun migrateTableVersionFrom_v5_to_v6() { onUpdate(database, 5, 6) - // Table didnt exist before v7 + // Table didnt exist in version 6 verifyZeroInteractions(database) } @Test fun migrateTableVersionFrom_v6_to_v7() { onUpdate(database, 6, 7) - verify(database).execSQL(CREATE_TABLE_STATEMENT) + // Table didnt exist in version 7 + verifyZeroInteractions(database) } @Test fun migrateTableVersionFrom_v7_to_v8() { onUpdate(database, 7, 8) - // Table didnt change in version 8 + // Table didnt exist in version 8 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v8_to_v9() { + onUpdate(database, 8, 9) + // Table didnt exist in version 9 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v9_to_v10() { + onUpdate(database, 9, 10) + // Table didnt exist in version 10 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v10_to_v11() { + onUpdate(database, 10, 11) + // Table didnt exist in version 11 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v11_to_v12() { + onUpdate(database, 11, 12) + // Table didnt exist in version 12 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v12_to_v13() { + onUpdate(database, 12, 13) + // Table didnt exist in version 13 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v13_to_v14() { + onUpdate(database, 13, 14) + // Table didnt exist in version 14 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v14_to_v15() { + onUpdate(database, 14, 15) + // Table didnt exist in version 15 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v15_to_v16() { + onUpdate(database, 15, 16) + // Table didnt exist in version 16 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v16_to_v17() { + onUpdate(database, 16, 17) + // Table didnt exist in version 17 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v18_to_v19() { + onUpdate(database, 18, 19) + // Table didnt exist in version 18 + verifyZeroInteractions(database) + } + + @Test + fun migrateTableVersionFrom_v19_to_v20() { + onUpdate(database, 19, 20) + verify(database).execSQL(CREATE_TABLE_STATEMENT) + } + + @Test + fun migrateTableVersionFrom_v20_to_v20() { + onUpdate(database, 20, 20) verifyZeroInteractions(database) } From 9654a8ea34917d1ad52323fd890337f9a041a17a Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Fri, 20 May 2022 19:09:21 +0530 Subject: [PATCH 05/25] Fix bug #4957 (#4961) --- .../fr/free/nrw/commons/description/DescriptionEditActivity.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt index 04c90e492..8d7795f5e 100644 --- a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt @@ -154,8 +154,7 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi buffer.append("}}, ") } } - buffer.deleteCharAt(buffer.length - 1) - buffer.deleteCharAt(buffer.length - 1) + buffer.replace(", $".toRegex(), "") buffer.append(descriptionEnd) } val returningIntent = Intent() From 05895c5d9e533a1a5b97e4b53c760dba6d998003 Mon Sep 17 00:00:00 2001 From: Nicolas Raoul Date: Thu, 26 May 2022 00:00:15 +0900 Subject: [PATCH 06/25] Update library to new version that handles older Java VMs Fixes #4972 I believe. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index daff00e52..4b71fb21c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -152,7 +152,7 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' - implementation("io.github.coordinates2country:coordinates2country-android:1.2") { exclude group: 'com.google.android', module: 'android' } + implementation("io.github.coordinates2country:coordinates2country-android:1.3") { exclude group: 'com.google.android', module: 'android' } } task disableAnimations(type: Exec) { From 50b3d2c5fb104057157c00aa21ed7bf8a7aa16aa Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Sat, 28 May 2022 17:08:26 +1000 Subject: [PATCH 07/25] Versioning for v4.0.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4b71fb21c..d94dbb9dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -173,8 +173,8 @@ android { defaultConfig { //applicationId 'fr.free.nrw.commons' - versionCode 1025 - versionName '3.1.1' + versionCode 1026 + versionName '4.0.0' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) minSdkVersion 19 From e27f5d445866a9894b42021f58f7f9525b160209 Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Sat, 28 May 2022 17:21:46 +1000 Subject: [PATCH 08/25] Changelog for v4.0.0 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 405b7d9de..612011688 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Wikimedia Commons for Android +## v4.0.0 +- Added map showing nearby Commons pictures +- Added custom SPARQL queries +- Added user profiles +- Added custom picture selector +- Various bugfixes +- Updated target SDK to 30 + ## v3.1.1 - Optimized Nearby query - Added Sweden's property for WLM 2021 From 3533b81979a556cb68b5d629365240e809236b07 Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Fri, 3 Jun 2022 11:50:26 +0530 Subject: [PATCH 09/25] Fix bug #4984 Added queries for package name for Android API 30+ (#4987) --- app/src/main/AndroidManifest.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8fc66230f..cf245ed7c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,16 @@ + + + + + + + + + + From 18fa7171a4cec0d589129ea91cb6a03be563006d Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Wed, 8 Jun 2022 12:09:56 +0530 Subject: [PATCH 10/25] Update mapbox sdk version (#4989) --- app/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d94dbb9dd..6707be870 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,10 +38,10 @@ dependencies { implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' implementation 'com.github.chrisbanes:PhotoView:2.0.0' implementation 'com.github.pedrovgs:renderers:3.3.3' - implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:9.1.0' - implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-localization-v8:0.11.0' - implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-scalebar-v9:0.4.0' - implementation 'com.mapbox.mapboxsdk:mapbox-android-telemetry:6.1.0' + implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:9.2.1' + implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-localization-v9:0.12.0' + implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-scalebar-v9:0.5.0' + implementation 'com.mapbox.mapboxsdk:mapbox-android-telemetry:7.0.0' implementation 'com.github.deano2390:MaterialShowcaseView:1.2.0' implementation 'com.dinuscxj:circleprogressbar:1.1.1' implementation 'com.karumi:dexter:5.0.0' From 66f8f97d0c07b0ab2339bab2455c50afaf640a84 Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Thu, 9 Jun 2022 17:47:09 +1000 Subject: [PATCH 11/25] Versioning for v4.0.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6707be870..f135e1b8f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -173,8 +173,8 @@ android { defaultConfig { //applicationId 'fr.free.nrw.commons' - versionCode 1026 - versionName '4.0.0' + versionCode 1027 + versionName '4.0.1' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) minSdkVersion 19 From e5e5a8df91416e5f87d77a2c17bf36227566193c Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Thu, 9 Jun 2022 17:48:42 +1000 Subject: [PATCH 12/25] Changelog for v4.0.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 612011688..17553aea1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Wikimedia Commons for Android +## v4.0.1 +- Fixed bug with no browser found +- Updated Mapbox SDK to fix hamburger crash + ## v4.0.0 - Added map showing nearby Commons pictures - Added custom SPARQL queries From d45123d53e442b0cd69be739e3cf6ad5b5e07718 Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Tue, 28 Jun 2022 08:41:09 +0530 Subject: [PATCH 13/25] Remove network type information from NetworkUtils (#4996) * Remove network type information from NetworkUtils * Ignore dependent tests --- app/src/main/java/fr/free/nrw/commons/utils/NetworkUtils.java | 4 ++++ .../kotlin/fr/free/nrw/commons/utils/NetworkUtilsTest.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/utils/NetworkUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/NetworkUtils.java index 59e38f0c9..ce64cb031 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/NetworkUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/NetworkUtils.java @@ -49,6 +49,8 @@ public class NetworkUtils { return NetworkConnectionType.WIFI; } + // TODO for Android 12+ request permission from user is mandatory + /* int mobileNetwork = telephonyManager.getNetworkType(); switch (mobileNetwork) { case TelephonyManager.NETWORK_TYPE_GPRS: @@ -71,6 +73,8 @@ public class NetworkUtils { default: return NetworkConnectionType.UNKNOWN; } + */ + return NetworkConnectionType.UNKNOWN; } /** diff --git a/app/src/test/kotlin/fr/free/nrw/commons/utils/NetworkUtilsTest.java b/app/src/test/kotlin/fr/free/nrw/commons/utils/NetworkUtilsTest.java index 32a8791ab..13f4c4b9a 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/utils/NetworkUtilsTest.java +++ b/app/src/test/kotlin/fr/free/nrw/commons/utils/NetworkUtilsTest.java @@ -8,6 +8,7 @@ import android.telephony.TelephonyManager; import org.jetbrains.annotations.NotNull; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import fr.free.nrw.commons.utils.model.NetworkConnectionType; @@ -97,6 +98,7 @@ public class NetworkUtilsTest { } @Test + @Ignore("Fix these test with telemetry permission") public void testCellular2GNetwork() { Context mockContext = mock(Context.class); Application mockApplication = mock(Application.class); @@ -123,6 +125,7 @@ public class NetworkUtilsTest { } @Test + @Ignore("Fix these test with telemetry permission") public void testCellular3GNetwork() { Context mockContext = mock(Context.class); Application mockApplication = mock(Application.class); @@ -149,6 +152,7 @@ public class NetworkUtilsTest { } @Test + @Ignore("Fix these test with telemetry permission") public void testCellular4GNetwork() { Context mockContext = mock(Context.class); Application mockApplication = mock(Application.class); From d8e4c038e090e03bd41706eb5c6066f5f0981481 Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Tue, 28 Jun 2022 08:41:32 +0530 Subject: [PATCH 14/25] Fix #4992 invert the equals condition to be null safe (#4995) --- .../free/nrw/commons/LocationPicker/LocationPickerActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java b/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java index c8791e3c2..4af6fdd83 100644 --- a/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java @@ -155,7 +155,7 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa addCredits(); getToolbarUI(); - if (activity.equals("UploadActivity")) { + if ("UploadActivity".equals(activity)) { placeSelectedButton.setVisibility(View.GONE); modifyLocationButton.setVisibility(View.VISIBLE); showInMapButton.setVisibility(View.VISIBLE); From 5fe1ad84a050febff56937236813c428203f0de2 Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Tue, 5 Jul 2022 14:24:15 +0530 Subject: [PATCH 15/25] Fix java.lang.NullPointerException for username in ContributionBoundaryCallback (#5003) --- .../ContributionBoundaryCallback.kt | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionBoundaryCallback.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionBoundaryCallback.kt index 78fbe5bb3..b75332b73 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionBoundaryCallback.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionBoundaryCallback.kt @@ -21,7 +21,7 @@ class ContributionBoundaryCallback @Inject constructor( @param:Named(CommonsApplicationModule.IO_THREAD) private val ioThreadScheduler: Scheduler ) : BoundaryCallback() { private val compositeDisposable: CompositeDisposable = CompositeDisposable() - lateinit var userName: String + var userName: String? = null /** @@ -53,13 +53,13 @@ class ContributionBoundaryCallback @Inject constructor( /** * Fetches contributions using the MediaWiki API */ - fun fetchContributions() { + private fun fetchContributions() { if (sessionManager.userName != null) { - compositeDisposable.add( - mediaClient.getMediaListForUser(userName!!) + userName?.let { userName -> + mediaClient.getMediaListForUser(userName) .map { mediaList -> - mediaList.map { - Contribution(media = it, state = Contribution.STATE_COMPLETED) + mediaList.map { media -> + Contribution(media = media, state = Contribution.STATE_COMPLETED) } } .subscribeOn(ioThreadScheduler) @@ -69,11 +69,13 @@ class ContributionBoundaryCallback @Inject constructor( error.message ) } - ) - }else { - if (compositeDisposable != null){ - compositeDisposable.clear() + }?.let { + compositeDisposable.add( + it + ) } + }else { + compositeDisposable.clear() } } From 8eb66813546100e9ec06d4ace866dba78938d11f Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Wed, 6 Jul 2022 12:50:29 +0530 Subject: [PATCH 16/25] Fix failing tests for PR #5003 (#5004) * Fix java.lang.NullPointerException for username in ContributionBoundaryCallback * Fix failing tests --- .../ContributionBoundaryCallbackTest.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionBoundaryCallbackTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionBoundaryCallbackTest.kt index f58342467..399b39aff 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionBoundaryCallbackTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionBoundaryCallbackTest.kt @@ -18,6 +18,7 @@ import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.MockitoAnnotations +import java.lang.reflect.Method /** * The unit test class for ContributionBoundaryCallbackTest @@ -95,7 +96,11 @@ class ContributionBoundaryCallbackTest { whenever(mediaClient.getMediaListForUser(anyString())).thenReturn( Single.just(listOf(media())) ) - contributionBoundaryCallback.fetchContributions() + val method: Method = ContributionBoundaryCallback::class.java.getDeclaredMethod( + "fetchContributions" + ) + method.isAccessible = true + method.invoke(contributionBoundaryCallback) verify(repository).save(anyList()); verify(mediaClient).getMediaListForUser(anyString()); } @@ -104,7 +109,11 @@ class ContributionBoundaryCallbackTest { fun testFetchContributionsFailed() { whenever(sessionManager.userName).thenReturn("Test") whenever(mediaClient.getMediaListForUser(anyString())).thenReturn(Single.error(Exception("Error"))) - contributionBoundaryCallback.fetchContributions() + val method: Method = ContributionBoundaryCallback::class.java.getDeclaredMethod( + "fetchContributions" + ) + method.isAccessible = true + method.invoke(contributionBoundaryCallback) verifyZeroInteractions(repository); verify(mediaClient).getMediaListForUser(anyString()); } From bec2680164cd71fc2348871c1c1ee54d057d2d58 Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Tue, 12 Jul 2022 12:15:25 +0530 Subject: [PATCH 17/25] Update Room DB Version (#5011) --- app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt b/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt index b9a8795e0..fd85731d8 100644 --- a/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt +++ b/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt @@ -14,7 +14,7 @@ import fr.free.nrw.commons.upload.depicts.DepictsDao * The database for accessing the respective DAOs * */ -@Database(entities = [Contribution::class, Depicts::class, UploadedStatus::class], version = 11, exportSchema = false) +@Database(entities = [Contribution::class, Depicts::class, UploadedStatus::class], version = 12, exportSchema = false) @TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun contributionDao(): ContributionDao From c52002407d226897a70729d78be8a9777c47caaf Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Tue, 12 Jul 2022 12:15:50 +0530 Subject: [PATCH 18/25] Fix #5001 (#5010) --- .../mediaDetails/UploadMediaDetailFragment.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java index d4200e52d..534ca61ee 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java @@ -148,18 +148,16 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); - init(); + if (callback != null) { + init(); + } } private void init() { tvTitle.setText(getString(R.string.step_count, callback.getIndexInViewFlipper(this) + 1, callback.getTotalNumberOfSteps(), getString(R.string.media_detail_step_title))); - tooltip.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - showInfoAlert(R.string.media_detail_step_title, R.string.media_details_tooltip); - } - }); + tooltip.setOnClickListener( + v -> showInfoAlert(R.string.media_detail_step_title, R.string.media_details_tooltip)); initPresenter(); presenter.receiveImage(uploadableFile, place); initRecyclerView(); From cb3094b51c9940d7eca7e829c1df9a4df6b77ee2 Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Mon, 18 Jul 2022 19:06:21 +0300 Subject: [PATCH 19/25] Fix DB update issue (#5016) --- .../fr/free/nrw/commons/category/CategoryDao.java | 15 ++++++++++++--- .../fr/free/nrw/commons/category/CategoryItem.kt | 4 ++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryDao.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryDao.java index 4369350f4..b638fc508 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryDao.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryDao.java @@ -93,9 +93,11 @@ public class CategoryDao { // fixme add a limit on the original query instead of falling out of the loop? while (cursor != null && cursor.moveToNext() && cursor.getPosition() < limit) { - items.add(new CategoryItem(fromCursor(cursor).getName(), - fromCursor(cursor).getDescription(), fromCursor(cursor).getThumbnail(), - false)); + if (fromCursor(cursor).getName() != null ) { + items.add(new CategoryItem(fromCursor(cursor).getName(), + fromCursor(cursor).getDescription(), fromCursor(cursor).getThumbnail(), + false)); + } } } catch (RemoteException e) { throw new RuntimeException(e); @@ -193,6 +195,13 @@ public class CategoryDao { onUpdate(db, from, to); return; } + if (from == 17) { + db.execSQL("ALTER TABLE categories ADD COLUMN description STRING;"); + db.execSQL("ALTER TABLE categories ADD COLUMN thumbnail STRING;"); + from++; + onUpdate(db, from, to); + return; + } } } } diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.kt b/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.kt index 8da0b6b6a..d4ecdfdd1 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.kt +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.kt @@ -4,8 +4,8 @@ import android.os.Parcelable import kotlinx.android.parcel.Parcelize @Parcelize -data class CategoryItem(val name: String, val description: String, - val thumbnail: String, var isSelected: Boolean) : Parcelable { +data class CategoryItem(val name: String, val description: String?, + val thumbnail: String?, var isSelected: Boolean) : Parcelable { override fun toString(): String { return "CategoryItem: '$name'" From 98143aa969ef822bddf39a1c83aa8f3513d44248 Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Wed, 3 Aug 2022 14:09:07 +0300 Subject: [PATCH 20/25] [WIP] Fix both timezone problem and saved date problem (#5019) * Fix both timezone problem and saved date problem * Fixaccidental test code and add comments * Add issue link to the comments * Fix format issue and null checks --- .../nrw/commons/contributions/Contribution.kt | 4 +- .../fr/free/nrw/commons/db/AppDatabase.kt | 2 +- .../commons/filepicker/UploadableFile.java | 38 +++++++++++++++++-- .../commons/upload/PageContentsCreator.java | 6 +-- .../free/nrw/commons/upload/UploadItem.java | 7 +++- .../free/nrw/commons/upload/UploadModel.java | 5 ++- 6 files changed, 51 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt index ccb9fd640..a5e71f235 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt @@ -38,6 +38,7 @@ data class Contribution constructor( val localUri: Uri? = null, var dataLength: Long = 0, var dateCreated: Date? = null, + var dateCreatedString: String? = null, var dateModified: Date? = null, var hasInvalidLocation : Int = 0, var contentUri: Uri? = null, @@ -67,7 +68,8 @@ data class Contribution constructor( dateCreatedSource = "", depictedItems = depictedItems, wikidataPlace = from(item.place), - contentUri = item.contentUri + contentUri = item.contentUri, + dateCreatedString = item.fileCreatedDateString ) /** diff --git a/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt b/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt index fd85731d8..a877e14c4 100644 --- a/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt +++ b/app/src/main/java/fr/free/nrw/commons/db/AppDatabase.kt @@ -14,7 +14,7 @@ import fr.free.nrw.commons.upload.depicts.DepictsDao * The database for accessing the respective DAOs * */ -@Database(entities = [Contribution::class, Depicts::class, UploadedStatus::class], version = 12, exportSchema = false) +@Database(entities = [Contribution::class, Depicts::class, UploadedStatus::class], version = 13, exportSchema = false) @TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun contributionDao(): ContributionDao diff --git a/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java b/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java index aa9379a20..7df1cc964 100644 --- a/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java +++ b/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java @@ -12,6 +12,8 @@ import androidx.exifinterface.media.ExifInterface; import java.io.File; import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.Date; import fr.free.nrw.commons.upload.FileUtils; @@ -124,13 +126,30 @@ public class UploadableFile implements Parcelable { private DateTimeWithSource getDateTimeFromExif() { try { ExifInterface exif = new ExifInterface(file.getAbsolutePath()); - @SuppressLint("RestrictedApi") Long dateTime = exif.getDateTime(); - if(dateTime != null){ - Date date = new Date(dateTime); - return new DateTimeWithSource(date, DateTimeWithSource.EXIF_SOURCE); + // TAG_DATETIME returns the last edited date, we need TAG_DATETIME_ORIGINAL for creation date + // See issue https://github.com/commons-app/apps-android-commons/issues/1971 + String dateTimeSubString = exif.getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL); + if (dateTimeSubString!=null) { //getAttribute may return null + String year = dateTimeSubString.substring(0,4); + String month = dateTimeSubString.substring(5,7); + String day = dateTimeSubString.substring(8,10); + // This date is stored as a string (not as a date), the rason is we don't want to include timezones + String dateCreatedString = String.format("%04d-%02d-%02d", Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day)); + if (dateCreatedString.length() == 10) { //yyyy-MM-dd format of date is expected + @SuppressLint("RestrictedApi") Long dateTime = exif.getDateTimeOriginal(); + if(dateTime != null){ + Date date = new Date(dateTime); + return new DateTimeWithSource(date, dateCreatedString, DateTimeWithSource.EXIF_SOURCE); + } + } } + } catch (IOException e) { e.printStackTrace(); + } catch (NumberFormatException e) { + e.printStackTrace(); + } catch (IndexOutOfBoundsException e) { + e.printStackTrace(); } return null; } @@ -149,6 +168,7 @@ public class UploadableFile implements Parcelable { public static final String EXIF_SOURCE = "exif"; private final long epochDate; + private String dateString; // this does not includes timezone information private final String source; public DateTimeWithSource(long epochDate, String source) { @@ -161,10 +181,20 @@ public class UploadableFile implements Parcelable { this.source = source; } + public DateTimeWithSource(Date date, String dateString, String source) { + this.epochDate = date.getTime(); + this.dateString = dateString; + this.source = source; + } + public long getEpochDate() { return epochDate; } + public String getDateString() { + return dateString; + } + public String getSource() { return source; } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java b/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java index 4bf2de027..146967f4a 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/PageContentsCreator.java @@ -48,7 +48,7 @@ class PageContentsCreator { .append(media.getAuthor()).append("]]\n"); final String templatizedCreatedDate = getTemplatizedCreatedDate( - contribution.getDateCreated(), contribution.getDateCreatedSource()); + contribution.getDateCreatedString(), contribution.getDateCreated(), contribution.getDateCreatedSource()); if (!StringUtils.isBlank(templatizedCreatedDate)) { buffer.append("|date=").append(templatizedCreatedDate); } @@ -90,12 +90,12 @@ class PageContentsCreator { * @param dateCreatedSource * @return */ - private String getTemplatizedCreatedDate(Date dateCreated, String dateCreatedSource) { + private String getTemplatizedCreatedDate(String dateCreatedString, Date dateCreated, String dateCreatedSource) { if (dateCreated != null) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); return String.format(Locale.ENGLISH, isExif(dateCreatedSource) ? TEMPLATE_DATE_ACC_TO_EXIF : TEMPLATE_DATA_OTHER_SOURCE, - dateFormat.format(dateCreated) + isExif(dateCreatedSource) ? dateCreatedString: dateFormat.format(dateCreated) ) + "\n"; } return ""; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadItem.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadItem.java index 3d0f2066b..87050fb5c 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadItem.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadItem.java @@ -25,6 +25,7 @@ public class UploadItem { private boolean hasInvalidLocation; private boolean isWLMUpload = false; private String countryCode; + private String fileCreatedDateString; //according to EXIF data /** * Uri of uploadItem @@ -40,7 +41,8 @@ public class UploadItem { final Place place, final long createdTimestamp, final String createdTimestampSource, - final Uri contentUri) { + final Uri contentUri, + final String fileCreatedDateString) { this.createdTimestampSource = createdTimestampSource; uploadMediaDetails = new ArrayList<>(Collections.singletonList(new UploadMediaDetail())); this.place = place; @@ -50,6 +52,7 @@ public class UploadItem { this.createdTimestamp = createdTimestamp; this.contentUri = contentUri; imageQuality = BehaviorSubject.createDefault(ImageUtils.IMAGE_WAIT); + this.fileCreatedDateString = fileCreatedDateString; } public String getCreatedTimestampSource() { @@ -83,6 +86,8 @@ public class UploadItem { */ public Uri getContentUri() { return contentUri; } + public String getFileCreatedDateString() { return fileCreatedDateString; } + public void setImageQuality(final int imageQuality) { this.imageQuality.onNext(imageQuality); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java index e2c562414..494fac958 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java @@ -102,8 +102,10 @@ public class UploadModel { .getFileCreatedDate(context); long fileCreatedDate = -1; String createdTimestampSource = ""; + String fileCreatedDateString = ""; if (dateTimeWithSource != null) { fileCreatedDate = dateTimeWithSource.getEpochDate(); + fileCreatedDateString = dateTimeWithSource.getDateString(); createdTimestampSource = dateTimeWithSource.getSource(); } Timber.d("File created date is %d", fileCreatedDate); @@ -113,7 +115,8 @@ public class UploadModel { Uri.parse(uploadableFile.getFilePath()), uploadableFile.getMimeType(context), imageCoordinates, place, fileCreatedDate, createdTimestampSource, - uploadableFile.getContentUri()); + uploadableFile.getContentUri(), + fileCreatedDateString); if (place != null) { uploadItem.getUploadMediaDetails().set(0, new UploadMediaDetail(place)); } From 02df6554954f254f35d36ddb4a0f77da77653242 Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Thu, 4 Aug 2022 18:44:30 +1000 Subject: [PATCH 21/25] Versioning for v4.0.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f135e1b8f..2537a241c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -173,8 +173,8 @@ android { defaultConfig { //applicationId 'fr.free.nrw.commons' - versionCode 1027 - versionName '4.0.1' + versionCode 1028 + versionName '4.0.2' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) minSdkVersion 19 From 3f759a84368fb1f485d5cfe4567c2397ab33e222 Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Thu, 4 Aug 2022 18:45:35 +1000 Subject: [PATCH 22/25] Changelog for v4.0.2 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17553aea1..61dcd9aaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Wikimedia Commons for Android +## v4.0.2 +- Fixed bug with wrong dates taken from EXIF +- Fixed various crashes + ## v4.0.1 - Fixed bug with no browser found - Updated Mapbox SDK to fix hamburger crash From c53befc102519b6998e87e54b32f56f19be82c8b Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Fri, 5 Aug 2022 12:50:26 +0530 Subject: [PATCH 23/25] Add "Report Violation" menu option (#5025) * Add "Report Violation" menu option * Update email template * Update email address * Fixed typo Co-authored-by: Josephine Lim --- .../free/nrw/commons/CommonsApplication.java | 4 + .../media/MediaDetailPagerFragment.java | 77 ++++++++++++++++++- .../main/res/menu/fragment_image_detail.xml | 4 + app/src/main/res/values/arrays.xml | 7 +- app/src/main/res/values/strings.xml | 5 ++ 5 files changed, 95 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java index e95196bbb..238777cce 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -110,6 +110,10 @@ public class CommonsApplication extends MultiDexApplication { public static final String FEEDBACK_EMAIL_SUBJECT = "Commons Android App Feedback"; + public static final String REPORT_EMAIL = "commons-app-android-private@googlegroups.com"; + + public static final String REPORT_EMAIL_SUBJECT = "Report a violation"; + public static final String NOTIFICATION_CHANNEL_ID_ALL = "CommonsNotificationAll"; public static final String FEEDBACK_EMAIL_TEMPLATE_HEADER = "-- Technical information --"; diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index b1e74b447..eaede2484 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -3,6 +3,7 @@ package fr.free.nrw.commons.media; import static fr.free.nrw.commons.Utils.handleWebUrl; import android.annotation.SuppressLint; +import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -12,7 +13,9 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; @@ -22,6 +25,7 @@ import androidx.viewpager.widget.ViewPager; import butterknife.BindView; import butterknife.ButterKnife; import com.google.android.material.snackbar.Snackbar; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.SessionManager; @@ -33,7 +37,6 @@ import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient; import fr.free.nrw.commons.profile.ProfileActivity; -import fr.free.nrw.commons.theme.BaseActivity; import fr.free.nrw.commons.utils.DownloadUtils; import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.utils.NetworkUtils; @@ -211,11 +214,83 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple ProfileActivity.startYourself(getActivity(), m.getUser(), !Objects.equals(sessionManager.getUserName(), m.getUser())); } + return true; + case R.id.menu_view_report: + showReportDialog(m); default: return super.onOptionsItemSelected(item); } } + private void showReportDialog(final Media media) { + if (media == null) { + return; + } + final AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity()); + final String[] values = requireContext().getResources() + .getStringArray(R.array.report_violation_options); + builder.setTitle(R.string.report_violation); + builder.setItems(R.array.report_violation_options, (dialog, which) -> { + sendReportEmail(media, values[which]); + }); + builder.show(); + } + + private void sendReportEmail(final Media media, final String type) { + final String technicalInfo = getTechInfo(media, type); + + final Intent feedbackIntent = new Intent(Intent.ACTION_SENDTO); + feedbackIntent.setType("message/rfc822"); + feedbackIntent.setData(Uri.parse("mailto:")); + feedbackIntent.putExtra(Intent.EXTRA_EMAIL, + new String[]{CommonsApplication.REPORT_EMAIL}); + feedbackIntent.putExtra(Intent.EXTRA_SUBJECT, + CommonsApplication.REPORT_EMAIL_SUBJECT); + feedbackIntent.putExtra(Intent.EXTRA_TEXT, technicalInfo); + try { + startActivity(feedbackIntent); + } catch (final ActivityNotFoundException e) { + Toast.makeText(getActivity(), R.string.no_email_client, Toast.LENGTH_SHORT).show(); + } + } + + private String getTechInfo(final Media media, final String type) { + final StringBuilder builder = new StringBuilder(); + + builder.append("Report type: ") + .append(type) + .append("\n\n"); + + builder.append("Image that you want to report: ") + .append(media.getImageUrl()) + .append("\n\n"); + + builder.append("User that you want to report: ") + .append(media.getAuthor()) + .append("\n\n"); + + if (sessionManager.getUserName() != null) { + builder.append("Your username: ") + .append(sessionManager.getUserName()) + .append("\n\n"); + } + + builder.append("Violation reason: ") + .append("\n"); + + builder.append("----------------------------------------------") + .append("\n") + .append("(please write reason here)") + .append("\n") + .append("----------------------------------------------") + .append("\n\n") + .append("Thank you for your report! Our team will investigate as soon as possible.") + .append("\n") + .append("Please note that images also have a `Nominate for deletion` button."); + + return builder.toString(); + } + /** * Set the media as the device's wallpaper if the imageUrl is not null * Fails silently if setting the wallpaper fails diff --git a/app/src/main/res/menu/fragment_image_detail.xml b/app/src/main/res/menu/fragment_image_detail.xml index c101ae9b2..65ad9ebbe 100644 --- a/app/src/main/res/menu/fragment_image_detail.xml +++ b/app/src/main/res/menu/fragment_image_detail.xml @@ -34,5 +34,9 @@ android:id="@+id/menu_view_user_page" android:title="@string/menu_view_user_page" app:showAsAction="never" /> + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 89ce57701..c09853373 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -70,5 +70,10 @@ yearly all_time - + + @string/report_user + @string/report_content + @string/request_user_block + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a251d21ed..8b165000d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -717,4 +717,9 @@ Upload your first media by tapping on the add button. Error while sending feedback What is your feedback? Your feedback + Report + Report violation + Report this user + Report this content + Request to block this user From 23c474b066e4a2e7ea423d1601f0833b3dcc23bf Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Fri, 5 Aug 2022 17:49:20 +1000 Subject: [PATCH 24/25] Versioning for v4.0.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2537a241c..684ad65df 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -173,8 +173,8 @@ android { defaultConfig { //applicationId 'fr.free.nrw.commons' - versionCode 1028 - versionName '4.0.2' + versionCode 1029 + versionName '4.0.3' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) minSdkVersion 19 From 308cce46a1d0c96c183427fb83ea01439ca5ec6a Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Fri, 5 Aug 2022 17:50:30 +1000 Subject: [PATCH 25/25] Changelog for v4.0.3 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61dcd9aaf..06c2a2ad6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Wikimedia Commons for Android +## v4.0.3 +- Added "Report" button for Google UGC policy + ## v4.0.2 - Fixed bug with wrong dates taken from EXIF - Fixed various crashes