From b08a0a39640e9d7c9fb29fe1736d94dc44faa558 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Mon, 8 May 2017 00:30:56 +0100 Subject: [PATCH 01/19] Remove unused code in settingsFragment --- .../nrw/commons/settings/SettingsFragment.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index 68d174013..c67f745da 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -19,23 +19,9 @@ public class SettingsFragment extends PreferenceFragment { // Update spinner to show selected value as summary ListPreference licensePreference = (ListPreference) findPreference(Prefs.DEFAULT_LICENSE); - // WARNING: ORDERING NEEDS TO MATCH FOR THE LICENSE NAMES AND DISPLAY VALUES - licensePreference.setEntries(new String[]{ - getString(R.string.license_name_cc0), - getString(R.string.license_name_cc_by_3_0), - getString(R.string.license_name_cc_by_4_0), - getString(R.string.license_name_cc_by_sa_3_0), - getString(R.string.license_name_cc_by_sa_4_0) - }); - licensePreference.setEntryValues(new String[]{ - Prefs.Licenses.CC0, - Prefs.Licenses.CC_BY_3, - Prefs.Licenses.CC_BY_4, - Prefs.Licenses.CC_BY_SA_3, - Prefs.Licenses.CC_BY_SA_4 - }); - licensePreference.setSummary(getString(Utils.licenseNameFor(licensePreference.getValue()))); + + // Keep summary updated when changing value licensePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { From 2b91abed22990b8760ee2b4e8e9288c2b065c0fb Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Tue, 9 May 2017 19:59:42 +0100 Subject: [PATCH 02/19] Hardcode arrays.xml values --- app/src/main/res/values/arrays.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 80dd58a0e..8db2c9ccc 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -8,10 +8,10 @@ @string/license_name_cc_by_sa_four - @string/license_name_cc0 - @string/license_name_cc_by_3_0 - @string/license_name_cc_by_4_0 - @string/license_name_cc_by_sa_3_0 - @string/license_name_cc_by_sa_4_0 + CC0 + CC BY 3.0 + CC BY 4.0 + CC BY-SA 3.0 + CC BY-SA 4.0 \ No newline at end of file From 87fe6cf5859993527a852cd0a8eeec34d70dffe4 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Wed, 10 May 2017 22:51:19 +0100 Subject: [PATCH 03/19] Create untranslatable strings for pref constants --- app/src/main/res/values/arrays.xml | 10 +++++----- app/src/main/res/values/strings.xml | 5 +++++ app/src/main/res/xml/preferences.xml | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 8db2c9ccc..3cfe500d4 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -8,10 +8,10 @@ @string/license_name_cc_by_sa_four - CC0 - CC BY 3.0 - CC BY 4.0 - CC BY-SA 3.0 - CC BY-SA 4.0 + @string/license_pref_cc0 + @string/license_pref_cc_by_3_0 + @string/license_pref_cc_by_4_0 + @string/license_pref_cc_by_sa_3_0 + @string/license_pref_cc_by_sa_4_0 \ 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 67ddd2396..b39719d57 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,7 +99,9 @@ Tap this message (or hit back) to skip this step. Attribution-ShareAlike 3.0 Attribution 3.0 CC0 + CC0 CC BY-SA 3.0 + CC BY-SA 3.0 CC BY-SA 3.0 (Austria) CC BY-SA 3.0 (Germany) CC BY-SA 3.0 (Estonia) @@ -111,8 +113,11 @@ Tap this message (or hit back) to skip this step. CC BY-SA 3.0 (Poland) CC BY-SA 3.0 (Romania) CC BY 3.0 + CC BY 3.0 CC BY-SA 4.0 + CC BY-SA 4.0 CC BY 4.0 + CC BY 4.0 CC Zero own-pd CC BY-SA 2.5 diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 847f01e1c..a75cfbd5a 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -8,7 +8,7 @@ android:title="@string/preference_license" android:entries="@array/pref_defaultLicense_entries" android:entryValues="@array/pref_defaultLicense_values" - android:defaultValue="@string/license_name_cc_by_sa_4_0" + android:defaultValue="@string/license_pref_cc_by_sa_4_0" /> Date: Wed, 10 May 2017 22:51:33 +0100 Subject: [PATCH 04/19] Check in SingleUploadFragment that spinner position is valid before applying --- .../fr/free/nrw/commons/upload/SingleUploadFragment.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index e96c8768c..716af6c79 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -115,6 +115,13 @@ public class SingleUploadFragment extends Fragment { licenseSpinner.setAdapter(adapter); int position = licenseItems.indexOf(getString(Utils.licenseNameFor(license))); + + // Check position is valid + if(position < 0) { + Timber.d("Invalid position: %d. Using default license", position); + position = 4; + } + Timber.d("Position: %d %s", position, getString(Utils.licenseNameFor(license))); licenseSpinner.setSelection(position); From e5d7caf5f24869e292695a992abd8c473cd4295d Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Wed, 10 May 2017 23:15:15 +0100 Subject: [PATCH 05/19] Update SettingsActivityTest to correctly pass test on LicenseSpinner --- .../java/fr/free/nrw/commons/SettingsActivityTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java index f2047506b..7ba617730 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -84,9 +84,9 @@ public class SettingsActivityTest { .atPosition(0) .perform(ViewActions.click()); - // click "CC BY-4.0" + // click "Attribution 4.0" Espresso.onView( - ViewMatchers.withText(R.string.license_name_cc_by_4_0) + ViewMatchers.withText(R.string.license_name_cc_by_four) ).perform(ViewActions.click()); // click "License" (the first item) @@ -95,10 +95,10 @@ public class SettingsActivityTest { .atPosition(0) .perform(ViewActions.click()); - // test the value remains "CC BY-4.0" + // test the value remains "Attribution 4.0" Espresso.onView(ViewMatchers.isChecked()) .check(ViewAssertions.matches( - ViewMatchers.withText(R.string.license_name_cc_by_4_0) + ViewMatchers.withText(R.string.license_name_cc_by_four) )); } From d9afd0e4bfe4e71b36b2655595bbb0cdf7c5e38c Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Wed, 10 May 2017 23:16:35 +0100 Subject: [PATCH 06/19] Improve code style --- .../java/fr/free/nrw/commons/upload/SingleUploadFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index 716af6c79..2cf23318c 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -117,7 +117,7 @@ public class SingleUploadFragment extends Fragment { int position = licenseItems.indexOf(getString(Utils.licenseNameFor(license))); // Check position is valid - if(position < 0) { + if (position < 0) { Timber.d("Invalid position: %d. Using default license", position); position = 4; } From c6a2f2c7ea8486696f59fe4fd6a6144382b3aa43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Sat, 13 May 2017 16:09:01 +0200 Subject: [PATCH 07/19] Get coordinate template when parsing image page Currently the image detail view does not display the coordinates. This commit adds the coordinate template to the parser and displays the results rounded to 4 digits. --- .../main/java/fr/free/nrw/commons/Media.java | 9 +++++ .../free/nrw/commons/MediaDataExtractor.java | 39 +++++++++++++++++++ .../commons/media/MediaDetailFragment.java | 14 +++++++ .../main/res/layout/fragment_media_detail.xml | 29 ++++++++++++++ 4 files changed, 91 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java index 924427cef..34cfa255c 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -144,6 +144,14 @@ public class Media implements Parcelable { this.license = license; } + public String getCoordinates() { + return coordinates; + } + + public void setCoordinates(String coordinates) { + this.coordinates = coordinates; + } + // Primary metadata fields protected Uri localUri; protected String imageUrl; @@ -155,6 +163,7 @@ public class Media implements Parcelable { protected int width; protected int height; protected String license; + protected String coordinates; protected String creator; protected ArrayList categories; // as loaded at runtime? protected Map descriptions; // multilingual descriptions as loaded diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index 630cfeaff..aa39ae0e0 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -38,6 +38,7 @@ public class MediaDataExtractor { private String author; private Date date; private String license; + private String coordinates; private LicenseList licenseList; /** @@ -122,6 +123,14 @@ public class MediaDataExtractor { author = getFlatText(authorNode); } + Node coordinateTemplateNode = findTemplate(doc.getDocumentElement(), "location"); + + if (coordinateTemplateNode != null) { + coordinates = getCoordinates(coordinateTemplateNode); + } else { + coordinates = "No coordinates found"; + } + /* Pull up the license data list... look for the templates in two ways: @@ -242,6 +251,35 @@ public class MediaDataExtractor { return parentNode.getTextContent(); } + /** + * Rounds the float to 4 digits. + * + * @param coordinate A coordinate value as string. + * @return String of the rounded number. + */ + private String formatCoordinate(String coordinate) { + Float floatNumber = Float.parseFloat(coordinate); + double roundedNumber = Math.round(floatNumber * 10000d) / 10000d; + return String.valueOf(roundedNumber); + } + + /** + * Extracts the coordinates from the template and returns them as pretty formatted string. + * Loops over the children of the coordinate template: + * {{Location|47.50111007666667|19.055700301944444}} + * and extracts the latitude and longitude as a pretty string. + * + * @param parentNode The node of the coordinates template. + * @return Pretty formatted coordinates. + * @throws IOException + */ + private String getCoordinates(Node parentNode) throws IOException { + NodeList childNodes = parentNode.getChildNodes(); + String latitudeText = formatCoordinate(childNodes.item(1).getTextContent()); + String longitudeText = formatCoordinate(childNodes.item(2).getTextContent()); + return latitudeText + " N," + longitudeText + " E"; + } + // Extract a dictionary of multilingual texts from a subset of the parse tree. // Texts are wrapped in things like {{en|foo} or {{en|1=foo bar}}. // Text outside those wrappers is stuffed into a 'default' faux language key if present. @@ -287,6 +325,7 @@ public class MediaDataExtractor { media.setCategories(categories); media.setDescriptions(descriptions); + media.setCoordinates(coordinates); if (license != null) { media.setLicense(license); } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index befc3f9cf..b32d83a31 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -70,6 +70,7 @@ public class MediaDetailFragment extends Fragment { private TextView title; private TextView desc; private TextView license; + private TextView coordinates; private LinearLayout categoryContainer; private ScrollView scrollView; private ArrayList categoryNames; @@ -123,6 +124,7 @@ public class MediaDetailFragment extends Fragment { title = (TextView) view.findViewById(R.id.mediaDetailTitle); desc = (TextView) view.findViewById(R.id.mediaDetailDesc); license = (TextView) view.findViewById(R.id.mediaDetailLicense); + coordinates = (TextView) view.findViewById(R.id.mediaDetailCoordinates); categoryContainer = (LinearLayout) view.findViewById(R.id.mediaDetailCategoryContainer); licenseList = new LicenseList(getActivity()); @@ -226,6 +228,7 @@ public class MediaDetailFragment extends Fragment { // Set text of desc, license, and categories desc.setText(prettyDescription(media)); license.setText(prettyLicense(media)); + coordinates.setText(prettyCoordinates(media)); categoryNames.removeAll(categoryNames); categoryNames.addAll(media.getCategories()); @@ -388,4 +391,15 @@ public class MediaDetailFragment extends Fragment { return licenseObj.getName(); } } + + /** + * Returns the coordinates nicely formatted. + * + * @return Coordinates as text. + */ + private String prettyCoordinates(Media media) { + String coordinates = media.getCoordinates(); + + return coordinates; + } } diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index db03bccba..279957270 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -159,6 +159,35 @@ /> + + + + + Date: Sat, 13 May 2017 16:21:08 +0200 Subject: [PATCH 08/19] Code style, Codacy fixes --- app/src/main/java/fr/free/nrw/commons/Media.java | 2 +- app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java index 34cfa255c..f8f90896a 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -163,7 +163,7 @@ public class Media implements Parcelable { protected int width; protected int height; protected String license; - protected String coordinates; + private String coordinates; protected String creator; protected ArrayList categories; // as loaded at runtime? protected Map descriptions; // multilingual descriptions as loaded diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index aa39ae0e0..cb22d9b3c 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -271,7 +271,7 @@ public class MediaDataExtractor { * * @param parentNode The node of the coordinates template. * @return Pretty formatted coordinates. - * @throws IOException + * @throws IOException Parsing failed. */ private String getCoordinates(Node parentNode) throws IOException { NodeList childNodes = parentNode.getChildNodes(); From 94b19f27b9508131c050a215bc4308677ef46117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Sat, 13 May 2017 17:22:09 +0200 Subject: [PATCH 09/19] Move coordinate logic to LatLng class --- .../free/nrw/commons/MediaDataExtractor.java | 21 +++----- .../fr/free/nrw/commons/location/LatLng.java | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index cb22d9b3c..dd012926a 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -20,6 +20,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; /** @@ -251,18 +252,6 @@ public class MediaDataExtractor { return parentNode.getTextContent(); } - /** - * Rounds the float to 4 digits. - * - * @param coordinate A coordinate value as string. - * @return String of the rounded number. - */ - private String formatCoordinate(String coordinate) { - Float floatNumber = Float.parseFloat(coordinate); - double roundedNumber = Math.round(floatNumber * 10000d) / 10000d; - return String.valueOf(roundedNumber); - } - /** * Extracts the coordinates from the template and returns them as pretty formatted string. * Loops over the children of the coordinate template: @@ -275,9 +264,11 @@ public class MediaDataExtractor { */ private String getCoordinates(Node parentNode) throws IOException { NodeList childNodes = parentNode.getChildNodes(); - String latitudeText = formatCoordinate(childNodes.item(1).getTextContent()); - String longitudeText = formatCoordinate(childNodes.item(2).getTextContent()); - return latitudeText + " N," + longitudeText + " E"; + double latitudeText = Double.parseDouble(childNodes.item(1).getTextContent()); + double longitudeText = Double.parseDouble(childNodes.item(2).getTextContent()); + LatLng coordinates = new LatLng(latitudeText, longitudeText); + + return coordinates.getPrettyCoordinateString(); } // Extract a dictionary of multilingual texts from a subset of the parse tree. diff --git a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java index 839cba14e..c84095eb6 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java @@ -42,4 +42,52 @@ public class LatLng { public String toString() { return "lat/lng: (" + this.latitude + "," + this.longitude + ")"; } + + /** + * Rounds the float to 4 digits. + * + * @param coordinate A coordinate value as string. + * @return String of the rounded number. + */ + private String formatCoordinate(double coordinate) { + double roundedNumber = Math.round(coordinate * 10000d) / 10000d; + return String.valueOf(roundedNumber); + } + + /** + * Returns "N" or "S" depending on the latitude. + * + * @return "N" or "S". + */ + private String getNorthSouth() { + if (this.latitude < 0) { + return "S"; + } + + return "N"; + } + + /** + * Returns "E" or "W" depending on the longitude. + * + * @return "E" or "W". + */ + private String getEastWest() { + if (this.longitude < 180) { + return "E"; + } + + return "W"; + } + + /** + * Returns a nicely formatted coordinate string. Used e.g. in + * the detail view. + * + * @return The formatted string. + */ + public String getPrettyCoordinateString() { + return formatCoordinate(this.latitude) + " " + this.getNorthSouth() + ", " + + formatCoordinate(this.longitude) + " " + this.getEastWest(); + } } From e299536c8a7b260824848a4df5825dd8347025ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Sun, 14 May 2017 10:00:17 +0200 Subject: [PATCH 10/19] Code style --- app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java | 3 ++- app/src/main/java/fr/free/nrw/commons/location/LatLng.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index dd012926a..344546c7a 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -1,5 +1,7 @@ package fr.free.nrw.commons; +import fr.free.nrw.commons.location.LatLng; + import org.mediawiki.api.ApiResult; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -20,7 +22,6 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; /** diff --git a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java index c84095eb6..47d112991 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java @@ -87,7 +87,7 @@ public class LatLng { * @return The formatted string. */ public String getPrettyCoordinateString() { - return formatCoordinate(this.latitude) + " " + this.getNorthSouth() + ", " + - formatCoordinate(this.longitude) + " " + this.getEastWest(); + return formatCoordinate(this.latitude) + " " + this.getNorthSouth() + ", " + + formatCoordinate(this.longitude) + " " + this.getEastWest(); } } From cce8715fad808d9f894b4ccf096c3c8f73836ac2 Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 14 May 2017 11:33:39 +0200 Subject: [PATCH 11/19] Showing an overlay dialog when a nearby item is tapped --- app/src/main/assets/queries/nearby_query.txt | 43 +++++++ .../nrw/commons/nearby/NearbyBaseMarker.java | 88 ++++++++++++++ .../nrw/commons/nearby/NearbyController.java | 36 +++--- .../nrw/commons/nearby/NearbyInfoDialog.java | 110 ++++++++++++++++++ .../commons/nearby/NearbyListFragment.java | 10 +- .../nrw/commons/nearby/NearbyMapFragment.java | 26 ++++- .../free/nrw/commons/nearby/NearbyMarker.java | 31 +++++ .../free/nrw/commons/nearby/NearbyPlaces.java | 73 +++++------- .../fr/free/nrw/commons/nearby/Place.java | 6 +- .../nrw/commons/ui/widget/OverlayDialog.java | 48 ++++++++ .../fr/free/nrw/commons/utils/DialogUtil.java | 80 +++++++++++++ .../fr/free/nrw/commons/utils/FileUtils.java | 33 ++++++ .../main/res/layout/dialog_nearby_info.xml | 97 +++++++++++++++ app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/styles.xml | 6 + 15 files changed, 609 insertions(+), 79 deletions(-) create mode 100644 app/src/main/assets/queries/nearby_query.txt create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/NearbyBaseMarker.java create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/NearbyMarker.java create mode 100644 app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java create mode 100644 app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java create mode 100644 app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java create mode 100644 app/src/main/res/layout/dialog_nearby_info.xml diff --git a/app/src/main/assets/queries/nearby_query.txt b/app/src/main/assets/queries/nearby_query.txt new file mode 100644 index 000000000..02f741228 --- /dev/null +++ b/app/src/main/assets/queries/nearby_query.txt @@ -0,0 +1,43 @@ +SELECT + (SAMPLE(?location) as ?location) + ?item + (SAMPLE(COALESCE(?item_label_preferred_language, ?item_label_any_language)) as ?label) + (SAMPLE(?classId) as ?class) + (SAMPLE(COALESCE(?class_label_preferred_language, ?class_label_any_language, "?")) as ?class_label) + (SAMPLE(COALESCE(?icon0, ?icon1)) as ?icon) + (SAMPLE(COALESCE(?emoji0, ?emoji1)) as ?emoji) + (SAMPLE(?sitelink) as ?sitelink) + WHERE { + # Around given location... + SERVICE wikibase:around { + ?item wdt:P625 ?location. + bd:serviceParam wikibase:center "Point(${LONG} ${LAT})"^^geo:wktLiteral. + bd:serviceParam wikibase:radius "${RADIUS}" . # Radius in kilometers. + } + + # ... and without an image. + MINUS {?item wdt:P18 []} + + # Get the label in the preferred language of the user, or any other language if no label is available in that language. + OPTIONAL {?item rdfs:label ?item_label_preferred_language. FILTER (lang(?item_label_preferred_language) = "${LANG}")} + OPTIONAL {?item rdfs:label ?item_label_any_language} + + # Get the class label in the preferred language of the user, or any other language if no label is available in that language. + OPTIONAL { + ?item p:P31/ps:P31 ?classId. + OPTIONAL {?classId rdfs:label ?class_label_preferred_language. FILTER (lang(?class_label_preferred_language) = "${LANG}")} + OPTIONAL {?classId rdfs:label ?class_label_any_language} + + # Get icon + OPTIONAL { ?classId wdt:P2910 ?icon0. } + OPTIONAL { ?classId wdt:P279*/wdt:P2910 ?icon1. } + # Get emoji + OPTIONAL { ?classId wdt:P487 ?emoji0. } + OPTIONAL { ?classId wdt:P279*/wdt:P487 ?emoji1. } + OPTIONAL { + ?sitelink schema:about ?item . + ?sitelink schema:inLanguage "en" + } + } + } + GROUP BY ?item \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyBaseMarker.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyBaseMarker.java new file mode 100644 index 000000000..686b3e6ce --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyBaseMarker.java @@ -0,0 +1,88 @@ +package fr.free.nrw.commons.nearby; + +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.annotations.Icon; +import com.mapbox.mapboxsdk.annotations.IconFactory; +import com.mapbox.mapboxsdk.geometry.LatLng; + +import fr.free.nrw.commons.utils.UriDeserializer; +import fr.free.nrw.commons.utils.UriSerializer; + +public class NearbyBaseMarker extends BaseMarkerOptions { + private Place place; + public NearbyBaseMarker() { + + } + + public NearbyBaseMarker place(Place place) { + this.place = place; + return getThis(); + } + + public NearbyBaseMarker(Parcel in) { + Gson gson = new GsonBuilder() + .registerTypeAdapter(Uri.class, new UriDeserializer()) + .create(); + + position((LatLng) in.readParcelable(LatLng.class.getClassLoader())); + snippet(in.readString()); + String iconId = in.readString(); + Bitmap iconBitmap = in.readParcelable(Bitmap.class.getClassLoader()); + Icon icon = IconFactory.recreate(iconId, iconBitmap); + icon(icon); + title(in.readString()); + String gsonString = in.readString(); + place(gson.fromJson(gsonString, Place.class)); + } + + @Override + public NearbyBaseMarker getThis() { + return this; + } + + @Override + public NearbyMarker getMarker() { + return new NearbyMarker(this, place); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + Gson gson = new GsonBuilder() + .registerTypeAdapter(Uri.class, new UriSerializer()) + .create(); + + dest.writeParcelable(position, flags); + dest.writeString(snippet); + dest.writeString(icon.getId()); + dest.writeParcelable(icon.getBitmap(), flags); + dest.writeString(title); + dest.writeString(gson.toJson(place)); + } + + public Place getPlace() { + return place; + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public NearbyBaseMarker createFromParcel(Parcel in) { + return new NearbyBaseMarker(in); + } + + public NearbyBaseMarker[] newArray(int size) { + return new NearbyBaseMarker[size]; + } + }; +} diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java index dc36d165e..ba2aec1d9 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -1,17 +1,10 @@ package fr.free.nrw.commons.nearby; -import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; -import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; - import android.content.Context; import android.content.SharedPreferences; +import android.graphics.drawable.Icon; import android.preference.PreferenceManager; -import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; -import com.mapbox.mapboxsdk.annotations.MarkerOptions; - -import fr.free.nrw.commons.location.LatLng; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -20,8 +13,12 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; +import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; +import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; + public class NearbyController { private static final int MAX_RESULTS = 1000; @@ -40,7 +37,9 @@ public class NearbyController { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); List places = prefs.getBoolean("useWikidata", true) ? NearbyPlaces.getInstance().getFromWikidataQuery( - curLatLng, Locale.getDefault().getLanguage()) + context, + curLatLng, + Locale.getDefault().getLanguage()) : NearbyPlaces.getInstance().getFromWikiNeedsPictures(); if (curLatLng != null) { Timber.d("Sorting places by distance..."); @@ -85,19 +84,24 @@ public class NearbyController { * @param placeList list of nearby places in Place data type * @return BaseMarkerOprions list that holds nearby places */ - public static List loadAttractionsFromLocationToBaseMarkerOptions( + public static List loadAttractionsFromLocationToBaseMarkerOptions( LatLng curLatLng, List placeList) { - List baseMarkerOptionses = new ArrayList<>(); + List baseMarkerOptionses = new ArrayList<>(); placeList = placeList.subList(0, Math.min(placeList.size(), MAX_RESULTS)); for (Place place: placeList) { String distance = formatDistanceBetween(curLatLng, place.location); place.setDistance(distance); - baseMarkerOptionses.add(new MarkerOptions() - .position(new com.mapbox.mapboxsdk.geometry - .LatLng(place.location.latitude,place.location.longitude)) - .title(place.name) - .snippet(place.description)); + + NearbyBaseMarker nearbyBaseMarker = new NearbyBaseMarker(); + nearbyBaseMarker.title(place.name); + nearbyBaseMarker.position( + new com.mapbox.mapboxsdk.geometry.LatLng( + place.location.latitude, + place.location.longitude)); + nearbyBaseMarker.place(place); + + baseMarkerOptionses.add(nearbyBaseMarker); } return baseMarkerOptionses; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java new file mode 100644 index 000000000..e777eb3ee --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java @@ -0,0 +1,110 @@ +package fr.free.nrw.commons.nearby; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import butterknife.Unbinder; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.ui.widget.OverlayDialog; +import fr.free.nrw.commons.utils.DialogUtil; + +public class NearbyInfoDialog extends OverlayDialog { + + private final static String ARG_TITLE = "placeTitle"; + private final static String ARG_DESC = "placeDesc"; + private final static String ARG_LATITUDE = "latitude"; + private final static String ARG_LONGITUDE = "longitude"; + private final static String ARG_ARTICLE_LINK = "articleLink"; + private final static String ARG_WIKI_DATA_LINK = "wikiDataLink"; + + @BindView(R.id.link_preview_title) + TextView placeTitle; + @BindView(R.id.link_preview_extract) + TextView placeDescription; + + @BindView(R.id.link_preview_go_button) + TextView goToButton; + + private Unbinder unbinder; + + private LatLng location; + private Uri articleLink; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.dialog_nearby_info, container, false); + unbinder = ButterKnife.bind(this, view); + initUi(); + return view; + } + + private void initUi() { + Bundle bundle = getArguments(); + placeTitle.setText(bundle.getString(ARG_TITLE)); + placeDescription.setText(bundle.getString(ARG_DESC)); + location = new LatLng(bundle.getDouble(ARG_LATITUDE), bundle.getDouble(ARG_LONGITUDE)); + getArticleLink(bundle); + } + + private void getArticleLink(Bundle bundle) { + String articleLink = bundle.getString(ARG_ARTICLE_LINK); + articleLink = articleLink.replace("<", "").replace(">", ""); + + if (Utils.isNullOrWhiteSpace(articleLink) || articleLink == "\n") { + articleLink = bundle.getString(ARG_WIKI_DATA_LINK).replace("<", "").replace(">", ""); + } + + if (!Utils.isNullOrWhiteSpace(articleLink) && articleLink != "\n") { + this.articleLink = Uri.parse(articleLink); + } else { + goToButton.setVisibility(View.GONE); + } + } + + public static void showYourself(FragmentActivity fragmentActivity, Place place) { + NearbyInfoDialog mDialog = new NearbyInfoDialog(); + Bundle bundle = new Bundle(); + bundle.putString(ARG_TITLE, place.name); + bundle.putString(ARG_DESC, place.description); + bundle.putDouble(ARG_LATITUDE, place.location.latitude); + bundle.putDouble(ARG_LONGITUDE, place.location.longitude); + bundle.putString(ARG_ARTICLE_LINK, place.siteLink.toString()); + bundle.putString(ARG_WIKI_DATA_LINK, place.wikiDataLink.toString()); + mDialog.setArguments(bundle); + DialogUtil.showSafely(fragmentActivity, mDialog); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unbinder.unbind(); + } + + @OnClick(R.id.link_preview_directions_button) + void onDirectionsClick() { + //Open map app at given position + Uri gmmIntentUri = Uri.parse("geo:0,0?q=" + location.latitude + "," + location.longitude); + Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); + + if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { + startActivity(mapIntent); + } + } + + @OnClick(R.id.link_preview_go_button) + void onReadArticleClick() { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, articleLink); + startActivity(browserIntent); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java index eafa10382..048f1d450 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java @@ -28,8 +28,6 @@ import java.util.List; import timber.log.Timber; public class NearbyListFragment extends ListFragment { - - //private NearbyAsyncTask nearbyAsyncTask; private Gson gson; private List placeList; private LatLng curLatLng; @@ -98,12 +96,6 @@ public class NearbyListFragment extends ListFragment { Timber.d("Item at position %d has coords: Lat: %f Long: %f", position, latitude, longitude); - //Open map app at given position - Uri gmmIntentUri = Uri.parse("geo:0,0?q=" + latitude + "," + longitude); - Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); - - if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { - startActivity(mapIntent); - } + NearbyInfoDialog.showYourself(getActivity(), place); } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index 07702c6c0..de92a596b 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; @@ -11,7 +12,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.mapbox.mapboxsdk.Mapbox; -import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.geometry.LatLng; @@ -21,18 +22,17 @@ import com.mapbox.mapboxsdk.maps.MapboxMapOptions; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.services.android.telemetry.MapboxTelemetry; -import fr.free.nrw.commons.R; -import fr.free.nrw.commons.utils.UriDeserializer; - import java.lang.reflect.Type; import java.util.List; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.utils.UriDeserializer; + public class NearbyMapFragment extends android.support.v4.app.Fragment { - //private NearbyAsyncTask nearbyAsyncTask; private MapView mapView; private Gson gson; private List placeList; - private List baseMarkerOptionses; + private List baseMarkerOptionses; private fr.free.nrw.commons.location.LatLng curLatLng; public NearbyMapFragment() { @@ -79,9 +79,23 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public void onMapReady(MapboxMap mapboxMap) { mapboxMap.addMarkers(baseMarkerOptionses); + + mapboxMap.setOnMarkerClickListener(new MapboxMap.OnMarkerClickListener() { + @Override + public boolean onMarkerClick(@NonNull Marker marker) { + if (marker instanceof NearbyMarker) { + NearbyMarker nearbyMarker = (NearbyMarker) marker; + Place place = nearbyMarker.getNearbyBaseMarker().getPlace(); + NearbyInfoDialog.showYourself(getActivity(), place); + } + return false; + } + }); } }); + setHasOptionsMenu(false); + return mapView; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMarker.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMarker.java new file mode 100644 index 000000000..c65ede203 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMarker.java @@ -0,0 +1,31 @@ +package fr.free.nrw.commons.nearby; + +import com.mapbox.mapboxsdk.annotations.Marker; + +public class NearbyMarker extends Marker { + private Place place; + private NearbyBaseMarker nearbyBaseMarker; + + /** + * Creates a instance of {@link Marker} using the builder of Marker. + * + * @param baseMarkerOptions The builder used to construct the Marker. + */ + public NearbyMarker(NearbyBaseMarker baseMarkerOptions, Place place) { + super(baseMarkerOptions); + this.place = place; + this.nearbyBaseMarker = baseMarkerOptions; + } + + public NearbyBaseMarker getNearbyBaseMarker() { + return nearbyBaseMarker; + } + + public Place getPlace() { + return place; + } + + public void setNearbyBaseMarker(NearbyBaseMarker nearbyBaseMarker) { + this.nearbyBaseMarker = nearbyBaseMarker; + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java index 44d415505..a6d08be04 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java @@ -1,11 +1,9 @@ package fr.free.nrw.commons.nearby; +import android.content.Context; import android.net.Uri; import android.os.StrictMode; -import fr.free.nrw.commons.Utils; -import fr.free.nrw.commons.location.LatLng; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -19,6 +17,9 @@ import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.utils.FileUtils; import timber.log.Timber; public class NearbyPlaces { @@ -28,44 +29,6 @@ public class NearbyPlaces { private static final double MAX_RADIUS = 300.0; private static final double RADIUS_MULTIPLIER = 1.618; private static final String WIKIDATA_QUERY_URL = "https://query.wikidata.org/sparql?query=${QUERY}"; - private static final String WIKIDATA_QUERY_TEMPLATE = "SELECT\n" + - " (SAMPLE(?location) as ?location)\n" + - " ?item\n" + - " (SAMPLE(COALESCE(?item_label_preferred_language, ?item_label_any_language)) as ?label)\n" + - " (SAMPLE(?classId) as ?class)\n" + - " (SAMPLE(COALESCE(?class_label_preferred_language, ?class_label_any_language, \"?\")) as ?class_label)\n" + - " (SAMPLE(COALESCE(?icon0, ?icon1)) as ?icon)\n" + - " (SAMPLE(COALESCE(?emoji0, ?emoji1)) as ?emoji)\n" + - "WHERE {\n" + - " # Around given location...\n" + - " SERVICE wikibase:around {\n" + - " ?item wdt:P625 ?location.\n" + - " bd:serviceParam wikibase:center \"Point(${LONG} ${LAT})\"^^geo:wktLiteral. \n" + - " bd:serviceParam wikibase:radius \"${RADIUS}\" . # Radius in kilometers.\n" + - " }\n" + - " \n" + - " # ... and without an image.\n" + - " MINUS {?item wdt:P18 []}\n" + - " \n" + - " # Get the label in the preferred language of the user, or any other language if no label is available in that language.\n" + - " OPTIONAL {?item rdfs:label ?item_label_preferred_language. FILTER (lang(?item_label_preferred_language) = \"${LANG}\")}\n" + - " OPTIONAL {?item rdfs:label ?item_label_any_language}\n" + - " \n" + - " # Get the class label in the preferred language of the user, or any other language if no label is available in that language.\n" + - " OPTIONAL {\n" + - " ?item p:P31/ps:P31 ?classId.\n" + - " OPTIONAL {?classId rdfs:label ?class_label_preferred_language. FILTER (lang(?class_label_preferred_language) = \"${LANG}\")}\n" + - " OPTIONAL {?classId rdfs:label ?class_label_any_language}\n" + - "\n" + - " # Get icon\n" + - " OPTIONAL { ?classId wdt:P2910 ?icon0. }\n" + - " OPTIONAL { ?classId wdt:P279*/wdt:P2910 ?icon1. }\n" + - " # Get emoji\n" + - " OPTIONAL { ?classId wdt:P487 ?emoji0. }\n" + - " OPTIONAL { ?classId wdt:P279*/wdt:P487 ?emoji1. }\n" + - " }\n" + - "}\n" + - "GROUP BY ?item\n"; private static NearbyPlaces singleton; private double radius = INITIAL_RADIUS; private List places; @@ -73,13 +36,15 @@ public class NearbyPlaces { private NearbyPlaces(){ } - List getFromWikidataQuery(LatLng curLatLng, String lang) { + List getFromWikidataQuery(Context context, + LatLng curLatLng, + String lang) { List places = Collections.emptyList(); try { // increase the radius gradually to find a satisfactory number of nearby places while (radius < MAX_RADIUS) { - places = getFromWikidataQuery(curLatLng, lang, radius); + places = getFromWikidataQuery(context, curLatLng, lang, radius); Timber.d("%d results at radius: %f", places.size(), radius); if (places.size() >= MIN_RESULTS) { break; @@ -97,10 +62,18 @@ public class NearbyPlaces { return places; } - private List getFromWikidataQuery(LatLng cur, String lang, double radius) + private List getFromWikidataQuery(Context context, + LatLng cur, + String lang, + double radius) throws IOException { List places = new ArrayList<>(); - String query = WIKIDATA_QUERY_TEMPLATE.replace("${RADIUS}", "" + radius) + + String query = FileUtils.readFromFile(context, "queries/nearby_query.txt"); + + Timber.d(query); + + query = query.replace("${RADIUS}", "" + radius) .replace("${LAT}", "" + String.format(Locale.ROOT, "%.3f", cur.latitude)) .replace("${LONG}", "" + String.format(Locale.ROOT, "%.3f", cur.longitude)) .replace("${LANG}", "" + lang); @@ -124,6 +97,8 @@ public class NearbyPlaces { String point = fields[0]; String name = Utils.stripLocalizedString(fields[2]); String type = Utils.stripLocalizedString(fields[4]); + String sitelink = Utils.stripLocalizedString(fields[7]); + String wikiDataLink = Utils.stripLocalizedString(fields[3]); String icon = fields[5]; double latitude = 0; @@ -145,7 +120,9 @@ public class NearbyPlaces { type, // list type, // details Uri.parse(icon), - new LatLng(latitude, longitude) + new LatLng(latitude, longitude), + Uri.parse(sitelink), + Uri.parse(wikiDataLink) )); } in.close(); @@ -202,7 +179,9 @@ public class NearbyPlaces { type, // list type, // details null, - new LatLng(latitude, longitude) + new LatLng(latitude, longitude), + null, + null )); } in.close(); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java index f3e8e9438..a975282e9 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java @@ -16,15 +16,19 @@ public class Place { public Bitmap image; public Bitmap secondaryImage; public String distance; + public Uri siteLink; + public Uri wikiDataLink; public Place(String name, String description, String longDescription, - Uri secondaryImageUrl, LatLng location) { + Uri secondaryImageUrl, LatLng location, Uri siteLink, Uri wikiDataLink) { this.name = name; this.description = description; this.longDescription = longDescription; this.secondaryImageUrl = secondaryImageUrl; this.location = location; + this.siteLink = siteLink; + this.wikiDataLink = wikiDataLink; } public void setDistance(String distance) { diff --git a/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java new file mode 100644 index 000000000..69bc8549f --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java @@ -0,0 +1,48 @@ +package fr.free.nrw.commons.ui.widget; + +import android.app.Dialog; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import fr.free.nrw.commons.R; + +public abstract class OverlayDialog extends DialogFragment { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(STYLE_NORMAL, R.style.borderless_dialog); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + setDialogLayoutToFullScreen(); + super.onViewCreated(view, savedInstanceState); + } + + private void setDialogLayoutToFullScreen() { + Window window = getDialog().getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + window.requestFeature(Window.FEATURE_NO_TITLE); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.MATCH_PARENT; + window.setAttributes(wlp); + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Dialog dialog = super.onCreateDialog(savedInstanceState); + Window window = dialog.getWindow(); + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + return dialog; + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java b/app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java new file mode 100644 index 000000000..3992324b5 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java @@ -0,0 +1,80 @@ +package fr.free.nrw.commons.utils; + +import android.app.Activity; +import android.app.Dialog; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentActivity; + +import timber.log.Timber; + +public class DialogUtil { + + public static void dismissSafely(@Nullable Activity activity, @Nullable DialogFragment dialog) { + boolean isActivityDestroyed = false; + + if (activity == null || dialog == null) { + Timber.d("dismiss called with null activity / dialog. Ignoring."); + return; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + isActivityDestroyed = activity.isDestroyed(); + } + if (activity.isFinishing() || isActivityDestroyed) { + return; + } + try { + dialog.dismiss(); + + } catch (IllegalStateException e) { + Timber.e(e, "Could not dismiss dialog."); + } + } + + public static void showSafely(Activity activity, Dialog dialog) { + if (activity == null || dialog == null) { + Timber.d("Show called with null activity / dialog. Ignoring."); + return; + } + + boolean isActivityDestroyed = false; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + isActivityDestroyed = activity.isDestroyed(); + } + if (activity.isFinishing() || isActivityDestroyed) { + Timber.e("Activity is not running. Could not show dialog. "); + return; + } + try { + dialog.show(); + } catch (IllegalStateException e) { + Timber.e(e, "Could not show dialog."); + } + } + + public static void showSafely(FragmentActivity activity, DialogFragment dialog) { + boolean isActivityDestroyed = false; + + if (activity == null || dialog == null) { + Timber.d("show called with null activity / dialog. Ignoring."); + return; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + isActivityDestroyed = activity.isDestroyed(); + } + if (activity.isFinishing() || isActivityDestroyed) { + return; + } + + try { + if (dialog.getDialog() == null || !dialog.getDialog().isShowing()) { + dialog.show(activity.getSupportFragmentManager(), dialog.getClass().getSimpleName()); + } + } catch (IllegalStateException e) { + Timber.e(e, "Could not show dialog."); + } + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java new file mode 100644 index 000000000..4cb20ae0a --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java @@ -0,0 +1,33 @@ +package fr.free.nrw.commons.utils; + +import android.content.Context; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class FileUtils { + public static String readFromFile(Context context, String fileName) { + String stringBuilder = ""; + BufferedReader reader = null; + try { + reader = new BufferedReader( + new InputStreamReader(context.getAssets().open(fileName), "UTF-8")); + String mLine; + while ((mLine = reader.readLine()) != null) { + stringBuilder += mLine + "\n"; + } + } catch (IOException e) { + //log the exception + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + //log the exception + } + } + } + return stringBuilder; + } +} diff --git a/app/src/main/res/layout/dialog_nearby_info.xml b/app/src/main/res/layout/dialog_nearby_info.xml new file mode 100644 index 000000000..be21af18e --- /dev/null +++ b/app/src/main/res/layout/dialog_nearby_info.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d9f2fb74d..d48714b16 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,5 @@ 120dp 4dp 8dp + 240dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a253fef6a..39fa1e4c4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -45,4 +45,10 @@ + \ No newline at end of file From bb47332a37bec273d333dc356ac30f629a8b142c Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sun, 14 May 2017 14:26:16 +0300 Subject: [PATCH 12/19] Remove conflicts --- .../java/fr/free/nrw/commons/nearby/NearbyMapFragment.java | 6 ++++++ app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 8 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index de92a596b..c15a407c3 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; @@ -93,6 +94,11 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { }); } }); + if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("theme",true)) { + mapView.setStyleUrl(getResources().getString(R.string.map_theme_dark)); + } else { + mapView.setStyleUrl(getResources().getString(R.string.map_theme_light)); + } setHasOptionsMenu(false); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0414f98fa..536f66e41 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -170,5 +170,7 @@ Tap this message (or hit back) to skip this step. https://play.google.com/apps/testing/fr.free.nrw.commons Use Wikidata (Warning: disabling this may cause large mobile data consumption) + mapbox://styles/mapbox/traffic-day-v2 + mapbox://styles/mapbox/traffic-night-v2 pk.eyJ1IjoibWFza2FyYXZpdmVrIiwiYSI6ImNqMmxvdzFjMTAwMHYzM283ZWM3eW5tcDAifQ.ib5SZ9EVjwJe6GSKve0bcg From ec0da2f4af2026cb6551d55ef2e54e4295a3baa5 Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 14 May 2017 13:53:37 +0200 Subject: [PATCH 13/19] Close fragment when tapped on the empty section --- .../nrw/commons/nearby/NearbyInfoDialog.java | 5 + .../main/res/layout/dialog_nearby_info.xml | 169 ++++++++++-------- 2 files changed, 98 insertions(+), 76 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java index e777eb3ee..3bf6f7a50 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java @@ -107,4 +107,9 @@ public class NearbyInfoDialog extends OverlayDialog { Intent browserIntent = new Intent(Intent.ACTION_VIEW, articleLink); startActivity(browserIntent); } + + @OnClick(R.id.emptyLayout) + void onCloseClicked() { + dismissAllowingStateLoss(); + } } diff --git a/app/src/main/res/layout/dialog_nearby_info.xml b/app/src/main/res/layout/dialog_nearby_info.xml index be21af18e..b76934480 100644 --- a/app/src/main/res/layout/dialog_nearby_info.xml +++ b/app/src/main/res/layout/dialog_nearby_info.xml @@ -1,5 +1,5 @@ - + + - + android:layout_alignParentBottom="true" + android:background="@android:color/white"> + android:animateLayoutChanges="true" + android:minHeight="@dimen/bottom_peak_height" + android:orientation="vertical"> + + + + + + + + + + + + + + + + android:paddingBottom="16dp" + android:paddingTop="16dp" + android:text="GET DIRECTIONS" + android:textColor="@android:color/black" /> + + + + - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file From a8c950dee9c0a1d6ca0ba62ce6cc74be03d872ba Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Sun, 14 May 2017 21:01:26 +0900 Subject: [PATCH 14/19] Restore comments --- .../java/fr/free/nrw/commons/settings/SettingsFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index f30711c02..790ae2da8 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -25,6 +25,8 @@ public class SettingsFragment extends PreferenceFragment { // Update spinner to show selected value as summary ListPreference licensePreference = (ListPreference) findPreference(Prefs.DEFAULT_LICENSE); licensePreference.setSummary(getString(Utils.licenseNameFor(licensePreference.getValue()))); + + // Keep summary updated when changing value licensePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { @@ -81,4 +83,4 @@ public class SettingsFragment extends PreferenceFragment { } -} \ No newline at end of file +} From 198f3daf44996fd57e6abc74f0da6863925af430 Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 14 May 2017 14:22:52 +0200 Subject: [PATCH 15/19] Fix Info dialog width issue --- .../java/fr/free/nrw/commons/ui/widget/OverlayDialog.java | 4 +--- app/src/main/res/layout/dialog_nearby_info.xml | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java index 69bc8549f..6b2913d6d 100644 --- a/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java +++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java @@ -11,14 +11,12 @@ import android.view.View; import android.view.Window; import android.view.WindowManager; -import fr.free.nrw.commons.R; - public abstract class OverlayDialog extends DialogFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setStyle(STYLE_NORMAL, R.style.borderless_dialog); + setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light); } @Override diff --git a/app/src/main/res/layout/dialog_nearby_info.xml b/app/src/main/res/layout/dialog_nearby_info.xml index b76934480..1dc5c29f4 100644 --- a/app/src/main/res/layout/dialog_nearby_info.xml +++ b/app/src/main/res/layout/dialog_nearby_info.xml @@ -9,6 +9,7 @@ app:behavior_peekHeight="@dimen/bottom_peak_height"> Date: Sun, 14 May 2017 14:42:30 +0200 Subject: [PATCH 16/19] Fix Crash issue when GPS location is not available --- .../nrw/commons/nearby/NearbyMapFragment.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index c15a407c3..77512139e 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -66,6 +66,17 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + if (curLatLng != null) { + setupMapView(savedInstanceState); + } + + setHasOptionsMenu(false); + + return mapView; + } + + private void setupMapView(Bundle savedInstanceState) { MapboxMapOptions options = new MapboxMapOptions() .styleUrl(Style.OUTDOORS) .camera(new CameraPosition.Builder() @@ -99,10 +110,6 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { } else { mapView.setStyleUrl(getResources().getString(R.string.map_theme_light)); } - - setHasOptionsMenu(false); - - return mapView; } @Override @@ -112,31 +119,41 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public void onStart() { - mapView.onStart(); + if (mapView != null) { + mapView.onStart(); + } super.onStart(); } @Override public void onPause() { - mapView.onPause(); + if (mapView != null) { + mapView.onPause(); + } super.onPause(); } @Override public void onResume() { - mapView.onResume(); + if (mapView != null) { + mapView.onResume(); + } super.onResume(); } @Override public void onStop() { - mapView.onStop(); + if (mapView != null) { + mapView.onStop(); + } super.onStop(); } @Override public void onDestroyView() { - mapView.onDestroy(); + if (mapView != null) { + mapView.onDestroy(); + } super.onDestroyView(); } } From dc1b04f3ed773fa5b58e66513487579128d3ce9d Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sun, 14 May 2017 15:51:50 +0300 Subject: [PATCH 17/19] Switch map button accoding to map and list --- .../main/java/fr/free/nrw/commons/Utils.java | 10 ++++++ .../nrw/commons/nearby/NearbyActivity.java | 29 +++++++++++++----- .../free/nrw/commons/theme/BaseActivity.java | 5 +-- .../res/drawable-hdpi/ic_list_white_24dp.png | Bin 0 -> 116 bytes .../res/drawable-hdpi/ic_map_black_24dp.png | Bin 310 -> 0 bytes .../res/drawable-mdpi/ic_list_white_24dp.png | Bin 0 -> 86 bytes .../res/drawable-mdpi/ic_map_black_24dp.png | Bin 222 -> 0 bytes .../res/drawable-xhdpi/ic_list_white_24dp.png | Bin 0 -> 95 bytes .../res/drawable-xhdpi/ic_map_black_24dp.png | Bin 363 -> 0 bytes .../drawable-xxhdpi/ic_list_white_24dp.png | Bin 0 -> 94 bytes .../res/drawable-xxhdpi/ic_map_black_24dp.png | Bin 513 -> 0 bytes .../drawable-xxxhdpi/ic_list_white_24dp.png | Bin 0 -> 100 bytes .../drawable-xxxhdpi/ic_map_black_24dp.png | Bin 667 -> 0 bytes 13 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_map_black_24dp.png diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index 0ece6e119..52ff8422c 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -1,7 +1,9 @@ package fr.free.nrw.commons; +import android.content.Context; import android.net.Uri; import android.os.Build; +import android.preference.PreferenceManager; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.assist.ImageScaleType; @@ -306,4 +308,12 @@ public class Utils { public static boolean isNullOrWhiteSpace(String value) { return value == null || value.trim().isEmpty(); } + + public static boolean isDarkTheme(Context context){ + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean("theme",true)) { + return true; + }else { + return false; + } + } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index 0f8f176de..d2e14956e 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -3,6 +3,7 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.view.Menu; import android.view.MenuInflater; @@ -71,6 +72,11 @@ public class NearbyActivity extends BaseActivity { return true; case R.id.action_map: showMapView(); + if (isMapViewActive) { + item.setIcon(R.drawable.ic_list_white_24dp); + } else { + item.setIcon(R.drawable.ic_map_white_24dp); + } return true; default: return super.onOptionsItemSelected(item); @@ -83,9 +89,16 @@ public class NearbyActivity extends BaseActivity { if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { setMapFragment(); } + + } else { + isMapViewActive = false; + if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { + setListFragment(); + } } } + @Override protected void onResume() { super.onResume(); @@ -160,22 +173,22 @@ public class NearbyActivity extends BaseActivity { * Calls fragment for map view. */ public void setMapFragment() { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - NearbyMapFragment fragment = new NearbyMapFragment(); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + Fragment fragment = new NearbyMapFragment(); fragment.setArguments(bundle); - ft.add(R.id.container, fragment); - ft.commit(); + fragmentTransaction.replace(R.id.container, fragment); + fragmentTransaction.commit(); } /** * Calls fragment for list view. */ public void setListFragment() { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - NearbyListFragment fragment = new NearbyListFragment(); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + Fragment fragment = new NearbyListFragment(); fragment.setArguments(bundle); - ft.add(R.id.container, fragment); - ft.commit(); + fragmentTransaction.replace(R.id.container, fragment); + fragmentTransaction.commit(); } } diff --git a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java index f52ea84dd..b0be190a4 100644 --- a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java @@ -6,16 +6,17 @@ import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.Utils; public class BaseActivity extends AppCompatActivity { boolean currentTheme; @Override protected void onCreate(Bundle savedInstanceState) { - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("theme",true)) { + if(Utils.isDarkTheme(this)){ currentTheme = true; setTheme(R.style.DarkAppTheme); - }else { + } else { currentTheme = false; setTheme(R.style.LightAppTheme); // default } diff --git a/app/src/main/res/drawable-hdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f7e7dda6e4a5b45a97917c20dfaeddc3645077 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;wWo_?h{y5d1PRu~2@%cz`Tk2c zTwv_<E5juBY?z2sqDoGA^{8xbs2ogzZvA71C3$u MboFyt=akR{08!Q;k^lez literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_map_black_24dp.png deleted file mode 100644 index c81d0e068acbc551a151c33afe485465188c5df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmV-60m=S}P)KSap~0CWGw`{s-kMDGW;7V=~EZ@DG^oV6kA6>no9gQM#k7 zm)xTyT~D{8&K;fCXFAXG^sb`=nMsSrBpI+IFTuEqJMriKTQelorKIXjY)e}On{LIy zn$9ff1B}>F|GtX|{c{}zYVKRUUL9F=s`=whL?{vmi!f!^Q*fRt1Ub|8J$D`gx|N)F z9s;5)l!da;p9o!;(~~w7?!|!_xwN5hb$g0!-&B4JH62@4)o3|;P!s-qF)8$D+c2Ql zyc6%@U{}`VwN(*oI5aCKG-$=;SK`KoQ3>+O`XwnSn~+-O19Z^kOjb<{Qvd(}07*qo IM6N<$f~&QL(EtDd diff --git a/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..15d8fc2bb488d6654651ec05f3ecba1fb7163394 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1Sx*gTe~DWM4fOr#gq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_map_black_24dp.png deleted file mode 100644 index bcc500e96c932305d591e06d403c4c807984aac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+irJgR1Ar*{oCvD_A7$D(xe*Omz zA+}CEU!Gc~i8J=}99bij^q5tpZ1#77#S2X(kEk7C?g$bp|H0;L{qn(`w|Cy>*t;%2 z*&-|GY_rjAx~O)wbPuCF z&p$`Y{DM?R>C;jw?*#hKa2&b6kF}cZ%8CogXM>MLJJ|&I>AXxxl4@}|((^&nOh4uO W^;H*Q*G&XEn8DN4&t;ucLK6U1?pIL& diff --git a/app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7253975cc58f5814084bab87ca50729cbfa262 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZA`BpB)|k7xlYrjj7PUN*z7jegvM zQ%;@U%Ji=LeENKbdk^aUd~L7gA(u;D$88@>^c_-N%fQr7t=evx2+`iUW}o7=xZs69 z!oO8?MBi8_+|nzT?G|^;eKR3iX)Qe?p>hjPUDUM06+>ZVrOkxG9e2lc<(>N}6t1*T zGT@{Kz6kNw3&3WlZTOxJ0Jb^riA6d9*p(Xap8*-jKn609feh?P4gB`ZCCwy2w7Eyl zXe0rmef7{Oo7M^Z@NMOry6c2cxKHW>UhCR!t8*UvB~kiZdKD(zaZl|u7mO|l1 zdJY3sz|wPPH59kkRd0l7V>caDtD%p2_N(ro8z$Zx=*Z;~_ZO6jUUM=WXyO0>002ov JPDHLkV1ihOr%?a^ diff --git a/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2807e4ebe3f77a5b830c06d76082532d9a91de GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^9w5vJBp7O^^}Pa8OeH~n!3+##lh0ZJdE%Zfjv*C{ p$r5b~`u^Gr{8653n)QAHJHzX3N$>My@67>e^mO%eS?83{1OWFN8fX9j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png deleted file mode 100644 index 827c9fc9f114e51cbaa1db0e9dd47dff133ce1d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXoKNz<9#b#WAFU@$I?2-dD334tzXs z_|kQQ#>u4`OT{&dy4kX|IWjvGy2LUCn>;#LF0MEx(;}r6#ig`JQRbE2-Q6()DvmmS zVZjL(6rKu9N?iGq#V`HEkAgaTi#ZQ}*8Okn57CVvw9r=x$ViS zv!;`sPOgu+v}P0Ej#RgZ%D`jacC6C)^Hue~W&Yxd-d(+%OIPoR{k2zc(Rt~zTUAeA zeYh}3A%%VGD`UlwFKgWUq8D#jTU9G?N`~LJs+W7_|3`g%tff}G(E=?s3${CbDKq!w zTy67ovw*E!(~p3H8?o`NKdv$|ezmgwwztgT09(54_tii;?e4$tyMeS>xX%?Kj*Qi& z6Ii?!U_q-AFZ_#QW_7JC3y~G6yxGA$YZYJDo(J;JO+fr}!s=JTf%Gw3cac@Rvpxkz zJoRVW%6(D&Q*&L_s~JpuJ9DE>{MZy|Yxa~`^y`g9Tddq|Kdf~+Gvo9&=19lQ@2pqE zyq@#v%pQT-nDuiV$}V*1@jfzr_32WQAHBDw}vZo+3Bkj t#$Aj0GW*N9(%er|y_N>8w2$kY(z%DR8W^(-44$rjF6*2UngFD$=3D>( diff --git a/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6d3b0449b8c59366b29c2209bb23e80325080c GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc@?O(%@xS>XdsLA^!WH|)|0G!%Hn8t^oG?pW9;DsV)z4*}Q$iB}k@*`j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_map_black_24dp.png deleted file mode 100644 index da75c65bb5e60af90e8bcb091ef13d57d2f2afc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z?9_a;uuoF`1Y2+$K^zs;~&4z zx}tP}@1loG>}mm{#d@O3R;qGL3l9YcTvF^>qq8X{HTKd1gumq!>{DcJfBt;)VdMMP#sBT9<;#8>>N{~Lwg@b0``j~0!HeVe zs~yK!G^I4VOy?*!&e~|9%d&Cd6lR{6yHz&o_)OWp!g6|IL)xhidD^yroX*ZNRrE9L zIknq_|E4d4vE!{D7SC#YEsa`XVZm_k{e6epMLwm(C|L8j!>5-fV*mnJF)G9dkE5L2_ z(#eJ)jnXMMKJ44LW;y$|f@T%2-^S1WGTMK=lX&SWgYE%6xd~;a4%*4`%qcOv7n-&R zl$$$n3#J~q%doaj?^rA!!w11as{@B>IVUg>hZ=H!+~EtTdB`Pwm-oVN2lmx>crR4D zYHI^cKmBROU!77@2Yp|8Umc*W`CYqB0v=^G#7&y*@}Y9ae9f{03LBgD8_F*3E^Yf> z-7Ri#Ff@yC#UqpV0n?^G)nt#1=xNaTYx1|eN>}`6%cc#PNiqv%&So7**9-8>o4xZ~ z`JVq@EY^lBh~)io*!ESVLtWjr;@R_${a+>=vM7?zqo5~sM&uE{cb}!FmaorTEOoZ% zfXMb6E#*t!EVX~mz9BzDy(d-k%TI~3ItSaH$~ Date: Sun, 14 May 2017 15:59:00 +0300 Subject: [PATCH 18/19] Fix codacy --- app/src/main/java/fr/free/nrw/commons/Utils.java | 2 +- .../main/java/fr/free/nrw/commons/nearby/NearbyActivity.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index 52ff8422c..d296fdbcf 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -309,7 +309,7 @@ public class Utils { return value == null || value.trim().isEmpty(); } - public static boolean isDarkTheme(Context context){ + public static boolean isDarkTheme(Context context) { if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean("theme",true)) { return true; }else { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index d2e14956e..43966f7a4 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -98,7 +98,6 @@ public class NearbyActivity extends BaseActivity { } } - @Override protected void onResume() { super.onResume(); @@ -190,5 +189,4 @@ public class NearbyActivity extends BaseActivity { fragmentTransaction.replace(R.id.container, fragment); fragmentTransaction.commit(); } - } From 358c5862b625012f2cfef928997a2d13b3ba0aed Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Sun, 14 May 2017 15:53:19 +0100 Subject: [PATCH 19/19] Move pref values into newly created keys.xml Hopefully translatewiki won't try to translate these --- app/src/main/res/values/keys.xml | 8 ++++++++ app/src/main/res/values/strings.xml | 5 ----- 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/values/keys.xml diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml new file mode 100644 index 000000000..a2bb6860d --- /dev/null +++ b/app/src/main/res/values/keys.xml @@ -0,0 +1,8 @@ + + + CC0 + CC BY 3.0 + CC BY-SA 3.0 + CC BY 4.0 + CC BY-SA 4.0 + \ 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 68345ede5..bad2512de 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,9 +102,7 @@ Tap this message (or hit back) to skip this step. Attribution-ShareAlike 3.0 Attribution 3.0 CC0 - CC0 CC BY-SA 3.0 - CC BY-SA 3.0 CC BY-SA 3.0 (Austria) CC BY-SA 3.0 (Germany) CC BY-SA 3.0 (Estonia) @@ -116,11 +114,8 @@ Tap this message (or hit back) to skip this step. CC BY-SA 3.0 (Poland) CC BY-SA 3.0 (Romania) CC BY 3.0 - CC BY 3.0 CC BY-SA 4.0 - CC BY-SA 4.0 CC BY 4.0 - CC BY 4.0 CC Zero own-pd CC BY-SA 2.5