From 0b901deb01a6942d735a38136968bcd1bc29bbbf Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 15 Jul 2017 09:20:36 +0200 Subject: [PATCH 01/40] Extract hardcoded strings to make them localizable --- .../main/res/layout/fragment_media_detail.xml | 19 ++++++++++++------- app/src/main/res/values/strings.xml | 4 +++- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index 8cfa45d17..cf031990f 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -1,6 +1,7 @@ + + + tools:text="License link" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1867f3f8..722939204 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -152,7 +152,9 @@ Tap this message (or hit back) to skip this step. Title of the media Description Description of the media goes here. This can potentially be fairly long, and will need to wrap across multiple lines. We hope it looks nice though. - Uploaded date> + Uploaded date + License + Coordinates Become a Beta Tester Opt-in to our beta channel on Google Play and get early access to new features and bug fixes https://play.google.com/apps/testing/fr.free.nrw.commons From 0a6e8b0cc850329922ee6a650da390b4dc54a7ca Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 15 Jul 2017 09:21:01 +0200 Subject: [PATCH 02/40] Improve RTL support in MediaDetail --- app/src/main/res/layout/fragment_media_detail.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index cf031990f..16dba06e5 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -77,7 +77,7 @@ android:layout_height="wrap_content" android:text="@string/media_detail_media_title" android:id="@+id/mediaDetailTitle" - android:layout_gravity="left|start" + android:layout_gravity="start" android:textColor="@android:color/white" android:background="?attr/subBackground" android:textSize="14sp" @@ -113,7 +113,7 @@ android:background="?attr/subBackground" android:id="@+id/mediaDetailDesc" android:textColor="@android:color/white" - android:layout_gravity="left|start" + android:layout_gravity="start" android:textSize="14sp" android:padding="12dp" /> @@ -146,7 +146,7 @@ android:id="@+id/mediaDetailLicense" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="left|start" + android:layout_gravity="start" android:background="?attr/subBackground" android:foreground="?attr/selectableItemBackground" android:text="@string/media_detail_license" @@ -204,7 +204,7 @@ android:layout_height="wrap_content" android:text="@string/detail_panel_cats_label" android:textSize="16sp" - android:layout_gravity="left|start" + android:layout_gravity="start" android:textColor="@android:color/white" android:paddingBottom="6dp" /> @@ -244,7 +244,7 @@ android:background="?attr/subBackground" android:id="@+id/mediaDetailuploadeddate" android:textColor="@android:color/white" - android:layout_gravity="left|start" + android:layout_gravity="start" android:textSize="14sp" android:padding="12dp" /> From 1044fe13ae6de6a7d533e3aaa3aa49a9684ab152 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 15 Jul 2017 09:21:35 +0200 Subject: [PATCH 03/40] Make license in MediaDetail clickable --- .../java/fr/free/nrw/commons/License.java | 4 ++- .../commons/media/MediaDetailFragment.java | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/License.java b/app/src/main/java/fr/free/nrw/commons/License.java index d7b5c28e2..d1aea6269 100644 --- a/app/src/main/java/fr/free/nrw/commons/License.java +++ b/app/src/main/java/fr/free/nrw/commons/License.java @@ -1,5 +1,7 @@ package fr.free.nrw.commons; +import android.support.annotation.Nullable; + public class License { String key; String template; @@ -36,7 +38,7 @@ public class License { } } - public String getUrl(String language) { + public @Nullable String getUrl(String language) { if (url == null) { return null; } else { 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 a076a7d25..973d0f593 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 @@ -2,8 +2,10 @@ package fr.free.nrw.commons.media; import android.content.Intent; import android.database.DataSetObserver; +import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.util.TypedValue; import android.view.LayoutInflater; @@ -18,6 +20,7 @@ import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.Locale; import fr.free.nrw.commons.License; import fr.free.nrw.commons.LicenseList; @@ -228,6 +231,14 @@ public class MediaDetailFragment extends Fragment { categoryNames.add(getString(R.string.detail_panel_cats_none)); } rebuildCatList(); + + // Set hyperlinks + license.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + openWebBrowser(licenseLink(media)); + } + }); } else { Timber.d("Failed to load photo details."); } @@ -342,4 +353,22 @@ public class MediaDetailFragment extends Fragment { private String prettyCoordinates(Media media) { return media.getCoordinates(); } + + private @Nullable String licenseLink(Media media) { + String licenseKey = media.getLicense(); + if (licenseKey == null || licenseKey.equals("")) { + return null; + } + License licenseObj = licenseList.get(licenseKey); + if (licenseObj == null) { + return null; + } else { + return licenseObj.getUrl(Locale.getDefault().getLanguage()); + } + } + + private void openWebBrowser(String url) { + Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + startActivity(browser); + } } From 7667180bc59b173927a4aaa924e2f275d0095327 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 15 Jul 2017 17:53:37 +0200 Subject: [PATCH 04/40] Make uploaded image's coordinates clickable --- .../main/java/fr/free/nrw/commons/Media.java | 8 +- .../free/nrw/commons/MediaDataExtractor.java | 18 ++-- .../commons/media/MediaDetailFragment.java | 82 +++++++++++++------ app/src/main/res/values/strings.xml | 1 + 4 files changed, 70 insertions(+), 39 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 d8f73cae9..8a5fc14c1 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -12,6 +12,8 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import fr.free.nrw.commons.location.LatLng; + public class Media implements Parcelable { public static Creator CREATOR = new Creator() { @@ -135,11 +137,11 @@ public class Media implements Parcelable { this.license = license; } - public String getCoordinates() { + public LatLng getCoordinates() { return coordinates; } - public void setCoordinates(String coordinates) { + public void setCoordinates(LatLng coordinates) { this.coordinates = coordinates; } @@ -154,7 +156,7 @@ public class Media implements Parcelable { protected int width; protected int height; protected String license; - private String coordinates; + private LatLng 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 e5906502d..765052dee 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 android.support.annotation.Nullable; + import org.mediawiki.api.ApiResult; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -37,7 +39,7 @@ public class MediaDataExtractor { private Map descriptions; private Date date; private String license; - private String coordinates; + private @Nullable LatLng coordinates; private LicenseList licenseList; /** @@ -125,7 +127,7 @@ public class MediaDataExtractor { if (coordinateTemplateNode != null) { coordinates = getCoordinates(coordinateTemplateNode); } else { - coordinates = "No coordinates found"; + coordinates = null; } /* @@ -249,22 +251,20 @@ public class MediaDataExtractor { } /** - * Extracts the coordinates from the template and returns them as pretty formatted string. + * Extracts the coordinates from the template. * Loops over the children of the coordinate template: * {{Location|47.50111007666667|19.055700301944444}} - * and extracts the latitude and longitude as a pretty string. + * and extracts the latitude and longitude. * * @param parentNode The node of the coordinates template. - * @return Pretty formatted coordinates. + * @return Extracted coordinates. * @throws IOException Parsing failed. */ - private String getCoordinates(Node parentNode) throws IOException { + private LatLng getCoordinates(Node parentNode) throws IOException { NodeList childNodes = parentNode.getChildNodes(); double latitudeText = Double.parseDouble(childNodes.item(1).getTextContent()); double longitudeText = Double.parseDouble(childNodes.item(2).getTextContent()); - LatLng coordinates = new LatLng(latitudeText, longitudeText, 0); - - return coordinates.getPrettyCoordinateString(); + return new LatLng(latitudeText, longitudeText, 0); } // Extract a dictionary of multilingual texts from a subset of the parse tree. 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 973d0f593..afc6f271f 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 @@ -29,6 +29,7 @@ import fr.free.nrw.commons.MediaDataExtractor; import fr.free.nrw.commons.MediaWikiImageView; import fr.free.nrw.commons.PageTitle; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; public class MediaDetailFragment extends Fragment { @@ -215,31 +216,9 @@ public class MediaDetailFragment extends Fragment { if (success) { extractor.fill(media); - // Set text of desc, license, and categories - desc.setText(prettyDescription(media)); - license.setText(prettyLicense(media)); - coordinates.setText(prettyCoordinates(media)); - uploadedDate.setText(prettyUploadedDate(media)); - - categoryNames.clear(); - categoryNames.addAll(media.getCategories()); - - categoriesLoaded = true; - categoriesPresent = (categoryNames.size() > 0); - if (!categoriesPresent) { - // Stick in a filler element. - categoryNames.add(getString(R.string.detail_panel_cats_none)); - } - rebuildCatList(); - - // Set hyperlinks - license.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - openWebBrowser(licenseLink(media)); - } - }); - } else { + setTextFields(media); + setOnClickListeners(media); + } else { Timber.d("Failed to load photo details."); } } @@ -272,6 +251,41 @@ public class MediaDetailFragment extends Fragment { super.onDestroyView(); } + private void setTextFields(Media media) { + desc.setText(prettyDescription(media)); + license.setText(prettyLicense(media)); + coordinates.setText(prettyCoordinates(media)); + uploadedDate.setText(prettyUploadedDate(media)); + + categoryNames.clear(); + categoryNames.addAll(media.getCategories()); + + categoriesLoaded = true; + categoriesPresent = (categoryNames.size() > 0); + if (!categoriesPresent) { + // Stick in a filler element. + categoryNames.add(getString(R.string.detail_panel_cats_none)); + } + rebuildCatList(); + } + + private void setOnClickListeners(final Media media) { + license.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + openWebBrowser(licenseLink(media)); + } + }); + if (media.getCoordinates() != null) { + coordinates.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + openMap(media.getCoordinates()); + } + }); + } + } + private void rebuildCatList() { // @fixme add the category items for (String cat : categoryNames) { @@ -338,7 +352,7 @@ public class MediaDetailFragment extends Fragment { private String prettyUploadedDate(Media media) { Date date = media.getDateUploaded(); - if (date.toString() == null || date.toString().isEmpty()) { + if (date == null || date.toString() == null || date.toString().isEmpty()) { return "Uploaded date not available"; } SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy"); @@ -351,7 +365,10 @@ public class MediaDetailFragment extends Fragment { * @return Coordinates as text. */ private String prettyCoordinates(Media media) { - return media.getCoordinates(); + if (media.getCoordinates() == null) { + return getString(R.string.media_detail_coordinates_empty); + } + return media.getCoordinates().getPrettyCoordinateString(); } private @Nullable String licenseLink(Media media) { @@ -371,4 +388,15 @@ public class MediaDetailFragment extends Fragment { Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(browser); } + + private void openMap(LatLng coordinates) { + //Open map app at given position + Uri gmmIntentUri = Uri.parse( + "geo:0,0?q=" + coordinates.getLatitude() + "," + coordinates.getLatitude()); + Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); + + if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { + startActivity(mapIntent); + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 722939204..3b5b8307e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,6 +155,7 @@ Tap this message (or hit back) to skip this step. Uploaded date License Coordinates + None provided Become a Beta Tester Opt-in to our beta channel on Google Play and get early access to new features and bug fixes https://play.google.com/apps/testing/fr.free.nrw.commons From 9d23907728db686b49855e493f507c2cc9315255 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 15 Jul 2017 18:16:45 +0200 Subject: [PATCH 05/40] Fix Issue with repeating categories in MediaDetail --- .../main/java/fr/free/nrw/commons/media/MediaDetailFragment.java | 1 + 1 file changed, 1 insertion(+) 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 afc6f271f..784db337d 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 @@ -287,6 +287,7 @@ public class MediaDetailFragment extends Fragment { } private void rebuildCatList() { + categoryContainer.removeAllViews(); // @fixme add the category items for (String cat : categoryNames) { View catLabel = buildCatLabel(cat); From 65ddc1a4bb45be2b57214c89c1fb44403c0e8310 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 15 Jul 2017 18:41:10 +0200 Subject: [PATCH 06/40] Add Nullable annotations to reduce risk of NPE --- app/src/main/java/fr/free/nrw/commons/Media.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 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 8a5fc14c1..a1ae1cc84 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -3,6 +3,7 @@ package fr.free.nrw.commons; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.Nullable; import java.util.ArrayList; import java.util.Date; @@ -101,7 +102,7 @@ public class Media implements Parcelable { this.dateCreated = date; } - public Date getDateUploaded() { + public @Nullable Date getDateUploaded() { return dateUploaded; } @@ -137,7 +138,7 @@ public class Media implements Parcelable { this.license = license; } - public LatLng getCoordinates() { + public @Nullable LatLng getCoordinates() { return coordinates; } @@ -152,11 +153,11 @@ public class Media implements Parcelable { protected String description; // monolingual description on input... protected long dataLength; protected Date dateCreated; - protected Date dateUploaded; + protected @Nullable Date dateUploaded; protected int width; protected int height; protected String license; - private LatLng coordinates; + private @Nullable LatLng coordinates; protected String creator; protected ArrayList categories; // as loaded at runtime? protected Map descriptions; // multilingual descriptions as loaded From 142e1edaaee10a9a4ce2fd4929108a49a320332a Mon Sep 17 00:00:00 2001 From: Jan Piotrowski Date: Tue, 18 Jul 2017 15:39:19 +0200 Subject: [PATCH 07/40] add information about translations I added a small paragraph about translating the app with links to the "Commons Android App project" on translatewiki.net where changes have to be made. --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 687b53ebb..c1a9eeee9 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,16 @@ Captured files are not currently stored within the app, but are passed by conten Thumbnail images are not currently cached. +## Translating the app ## + +Thanks to the translation work of many volunteers this app is available in a multitude of languages. + +Translation of the text content of the Wikimedia Commons Android app happens on the [Commons Android App project][10] on [translatewiki.net][11]. If you want to help translate the app please create an account there. + +The translations from the translatewiki project are [periodically committed directly to this project][12] and later released with the normal updates to the Play Store. + + + [1]: https://developer.android.com/studio/index.html [2]: http://www.jetbrains.com/idea/download/index.html @@ -90,3 +100,6 @@ Thumbnail images are not currently cached. [7]: https://github.com/commons-app/apps-android-commons/issues [8]: https://play.google.com/store/apps/details?id=fr.free.nrw.commons [9]: https://commons-app.github.io/ +[10]: https://translatewiki.net/w/i.php?title=Special:Translate&group=commons-android +[11]: https://translatewiki.net +[12]: https://github.com/commons-app/apps-android-commons/commits/master?author=translatewiki From bd08c6dc831f0eb244e84e63cbc4efeeb386ac02 Mon Sep 17 00:00:00 2001 From: Jan Piotrowski Date: Tue, 18 Jul 2017 16:31:16 +0200 Subject: [PATCH 08/40] add more information about translation rights and automatic commit --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c1a9eeee9..701a1b283 100644 --- a/README.md +++ b/README.md @@ -84,9 +84,9 @@ Thumbnail images are not currently cached. Thanks to the translation work of many volunteers this app is available in a multitude of languages. -Translation of the text content of the Wikimedia Commons Android app happens on the [Commons Android App project][10] on [translatewiki.net][11]. If you want to help translate the app please create an account there. +Translation of the text content of the Wikimedia Commons Android app happens on the [Commons Android App project][10] on [translatewiki.net][11]. If you want to help translate the app please create an account there (to get "translate rights" edit 20 [random keys][13] or ask in their [chat][14]). -The translations from the translatewiki project are [periodically committed directly to this project][12] and later released with the normal updates to the Play Store. +The translations from the translatewiki project are [periodically committed directly to this project][12] by the translatewiki team and later released with the normal updates to the Play Store. @@ -103,3 +103,5 @@ The translations from the translatewiki project are [periodically committed dire [10]: https://translatewiki.net/w/i.php?title=Special:Translate&group=commons-android [11]: https://translatewiki.net [12]: https://github.com/commons-app/apps-android-commons/commits/master?author=translatewiki +[13]: https://translatewiki.net/wiki/Special:TranslationStash? +[14]: https://translatewiki.net/wiki/Special:WebChat From 4989a188f5b14f936e9636d4e846257425d10938 Mon Sep 17 00:00:00 2001 From: Jorge Casariego Date: Tue, 18 Jul 2017 13:22:48 -0400 Subject: [PATCH 09/40] Changed "Commons Article" to "Commons file page" #690 --- 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 d4e688e50..b9c52258b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -197,7 +197,7 @@ Tap this message (or hit back) to skip this step. Nearby places cannot be displayed without location permissions no description found - Commons Article + Commons file page Wikidata item Error while caching pictures From 2ce7a464ca7b683ade954a27e56275bcf553ede7 Mon Sep 17 00:00:00 2001 From: Mikel Date: Tue, 18 Jul 2017 20:20:44 +0100 Subject: [PATCH 10/40] Remove Clickable behaviour of License and Coordinates --- .../commons/media/MediaDetailFragment.java | 84 ++++--------------- .../main/res/layout/fragment_media_detail.xml | 1 - 2 files changed, 17 insertions(+), 68 deletions(-) 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 784db337d..cb879395c 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 @@ -216,9 +216,23 @@ public class MediaDetailFragment extends Fragment { if (success) { extractor.fill(media); - setTextFields(media); - setOnClickListeners(media); - } else { + // Set text of desc, license, and categories + desc.setText(prettyDescription(media)); + license.setText(prettyLicense(media)); + coordinates.setText(prettyCoordinates(media)); + uploadedDate.setText(prettyUploadedDate(media)); + + categoryNames.clear(); + categoryNames.addAll(media.getCategories()); + + categoriesLoaded = true; + categoriesPresent = (categoryNames.size() > 0); + if (!categoriesPresent) { + // Stick in a filler element. + categoryNames.add(getString(R.string.detail_panel_cats_none)); + } + rebuildCatList(); + } else { Timber.d("Failed to load photo details."); } } @@ -251,41 +265,6 @@ public class MediaDetailFragment extends Fragment { super.onDestroyView(); } - private void setTextFields(Media media) { - desc.setText(prettyDescription(media)); - license.setText(prettyLicense(media)); - coordinates.setText(prettyCoordinates(media)); - uploadedDate.setText(prettyUploadedDate(media)); - - categoryNames.clear(); - categoryNames.addAll(media.getCategories()); - - categoriesLoaded = true; - categoriesPresent = (categoryNames.size() > 0); - if (!categoriesPresent) { - // Stick in a filler element. - categoryNames.add(getString(R.string.detail_panel_cats_none)); - } - rebuildCatList(); - } - - private void setOnClickListeners(final Media media) { - license.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - openWebBrowser(licenseLink(media)); - } - }); - if (media.getCoordinates() != null) { - coordinates.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - openMap(media.getCoordinates()); - } - }); - } - } - private void rebuildCatList() { categoryContainer.removeAllViews(); // @fixme add the category items @@ -371,33 +350,4 @@ public class MediaDetailFragment extends Fragment { } return media.getCoordinates().getPrettyCoordinateString(); } - - private @Nullable String licenseLink(Media media) { - String licenseKey = media.getLicense(); - if (licenseKey == null || licenseKey.equals("")) { - return null; - } - License licenseObj = licenseList.get(licenseKey); - if (licenseObj == null) { - return null; - } else { - return licenseObj.getUrl(Locale.getDefault().getLanguage()); - } - } - - private void openWebBrowser(String url) { - Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - startActivity(browser); - } - - private void openMap(LatLng coordinates) { - //Open map app at given position - Uri gmmIntentUri = Uri.parse( - "geo:0,0?q=" + coordinates.getLatitude() + "," + coordinates.getLatitude()); - Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); - - if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { - startActivity(mapIntent); - } - } } diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index 16dba06e5..b7d69290e 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -148,7 +148,6 @@ android:layout_height="wrap_content" android:layout_gravity="start" android:background="?attr/subBackground" - android:foreground="?attr/selectableItemBackground" android:text="@string/media_detail_license" android:textColor="@android:color/white" android:textSize="14sp" From d75c99ffcb3ae80827bfc664c53107c81a7a2e26 Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Wed, 19 Jul 2017 17:07:48 +0900 Subject: [PATCH 11/40] Update gradle from 4.0-rc-1 to 4.0.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 53637 -> 54712 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 100 +++++++++++++---------- gradlew.bat | 14 +--- 4 files changed, 61 insertions(+), 56 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 05ef575b0cd0173fc735f2857ce4bd594ce4f6bd..7d2af2435a06917c9d1cabbbec68a0cbbb3ba5d3 100644 GIT binary patch delta 28633 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 delta 27494 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 H-(LM6wqM>l diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c8d3575db..4dde7c991 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ - distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-rc-1-all.zip \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0.1-bin.zip diff --git a/gradlew b/gradlew index 9d82f7891..cccdd3d51 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,42 +6,6 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -60,6 +24,46 @@ cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -150,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec99730b..e95643d6a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From e530b2c8661273b8574812c5ed47949baa05205a Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Thu, 20 Jul 2017 02:25:49 +1000 Subject: [PATCH 12/40] Update readme to include temporary IEG link --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 701a1b283..c9ad17415 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,14 @@ The Wikimedia Commons Android app allows users to upload pictures from their And Initially started by the Wikimedia Foundation, this app is now maintained by volunteers. Anyone is welcome to improve it, just choose among the [open issues](https://github.com/commons-app/apps-android-commons/issues) and send us a pull request :-) +We are currently applying for an [IEG renewal][15] to work on the app for the next 6 months. Feedback is very much welcomed. + Get it on F-Droid Get it on Google Play + ## Develop with Android Studio or IntelliJ ## [Download Android Studio][1] (recommended) or [IntelliJ][2]. @@ -105,3 +108,4 @@ The translations from the translatewiki project are [periodically committed dire [12]: https://github.com/commons-app/apps-android-commons/commits/master?author=translatewiki [13]: https://translatewiki.net/wiki/Special:TranslationStash? [14]: https://translatewiki.net/wiki/Special:WebChat +[15]: https://meta.wikimedia.org/wiki/Grants:Project/Improve_%27Upload_to_Commons%27_Android_App/Renewal From b9bca1f69db5518cf43520f26fb98297c1a4edcc Mon Sep 17 00:00:00 2001 From: Nicolas Raoul Date: Thu, 20 Jul 2017 12:53:41 +0900 Subject: [PATCH 13/40] Added dev instructions about our Git/issue tracking --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index c9ad17415..6c2c9c0ee 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,22 @@ Captured files are not currently stored within the app, but are passed by conten Thumbnail images are not currently cached. +## Volunteers welcome! ## + +We are always looking for volunteers, feel free to step in! It is very easy: + +1. Fork the repository and clone it to your computer, then follow the build instructions above. +2. Choose an [unassigned issue](https://github.com/commons-app/apps-android-commons/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee) that sounds interesting to you. +3. Read the issue's comments to make sure you understand what is the bug, or what feature is being proposed. +4. Write a "I start working on this" comment on the issue +5. Write the code :-) +6. Commit and push +7. Go to your fork's Github webpage, select the "Pull Requests" tab and click "create a pull request", as a comment, write something like "Fix for issue #12345 crash when rotating screen", then submit the pull request. +8. Within a few hours or days, a core developer will review your patch, and either merge it or suggest a few corrections. +9. If you change your mind, or if it is too difficult, no problem, just write "Sorry I don't work on this anymore" on the issue, if possible including feedback (for instance what approaches failed) and ideas. + +Thanks a lot! + ## Translating the app ## Thanks to the translation work of many volunteers this app is available in a multitude of languages. From e95edc696b8608de220ce0e660c38025b6d42091 Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Thu, 20 Jul 2017 23:19:06 +0900 Subject: [PATCH 14/40] Remove lint results from Travis reports --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 898b0a8cf..fc6f81ad7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,8 +33,6 @@ after_success: after_failure: - echo '*** Connected Test Rsults ***' - w3m -dump ${TRAVIS_BUILD_DIR}/app/build/reports/androidTests/connected/*Test.html - - echo '*** Lint Results ***' - - cat ${TRAVIS_BUILD_DIR}/app/build/reports/lint-results.xml jdk: # - openjdk8 # not yet available - oraclejdk8 From 84a655a1ecbb672b5040a09140bb24da77d874c9 Mon Sep 17 00:00:00 2001 From: Mikel Date: Fri, 21 Jul 2017 23:46:01 +0100 Subject: [PATCH 15/40] Replace Exit icon in Drawer with vector --- .../drawable-hdpi/ic_exit_to_app_black_24dp.png | Bin 251 -> 0 bytes .../drawable-mdpi/ic_exit_to_app_black_24dp.png | Bin 171 -> 0 bytes .../drawable-xhdpi/ic_exit_to_app_black_24dp.png | Bin 246 -> 0 bytes .../drawable-xxhdpi/ic_exit_to_app_black_24dp.png | Bin 354 -> 0 bytes .../ic_exit_to_app_black_24dp.png | Bin 432 -> 0 bytes .../res/drawable/ic_exit_to_app_black_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_exit_to_app_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable/ic_exit_to_app_black_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png deleted file mode 100644 index ad0f63e5b8a97d5951f1b4e8576dadee1ed7b06c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmV7p6eU`=zZX-N|=GVrD^) zClqF&$Jv?-QOwy=^+Y}F$nfc4Bot;$_dOXQ9RzHI`#%>oY-)%aZoJrjFFFv3NmVRr z2?Sa`S#md3dQVyL$W)m~R+X1#=Sa*{6V0AVQq>n#Elps}Q)srP(H~^4sXZe4&|XbV z{WbCr8*-?%{P#rkbYwX65AuY=z)4@Wr^6vI^9JtMV7dP`o`V1Y002ovPDHLkV1iCn BWIO-> diff --git a/app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png deleted file mode 100644 index dee407b59836072bd89a0f869c53cc8e47f3f7b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iB2O2`kP60Ri9HGv9;zO$xA`F2 zY~NKip@`{&YFE_;0j&cQmak%SZDZ!)T9OgL`NY;CL-7rhUE5<0T@KzKTjw-n9DJ$2{8En0ePbXTEv8+xH$tl7$*|>0Q(JcpPKIn>;M1&07*qoM6N<$f)PV!8UO$Q diff --git a/app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png deleted file mode 100644 index 53b79d4c7b9cdad40cb666c5bb30ed44daa143a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmV-o0iFJdP)3fpZFa4cDyL4)iGZOvQJns;a8`1-tx#POU72+yDRo07*qoM6N<$g3C0W AH~;_u diff --git a/app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png deleted file mode 100644 index e30632b6b1dc6d3b8e1c7556a9f73e231851051f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmV;h0Z;ykP)Q*LDW#NB5A+;4Q?5K`4y@^Lb;E`dIs-k^@$0`)8kp@^!iLhwtjC@G(##BWRM%4) znibU@n*!{q?%WjMM0MrY_zL*@!2kgS5I_I{49g67rckh~fcf`zmJu-jaiwJgy!^S= zG69|_|BU4U-16=r!~^_<;O`+n!4HTh!~@)fcz~A>4{#FV0Zu|Zz)6S)I0 zK*6#D3YHyEFadOg#*gV^^a{-azQ_XBZxk@&BjU$g{QB_#=lbyg-}>=@8K0T|slW5A zAAe)ZwSGLnxqdw0G5gJ3umrc)s|c3y5tHS9!~|fD_4Sxl54r^qKmY**NdMyNp(((Q z>efvG7F5?UH1zuYJ!F0Xf61t(Y@1mBl?jX`^uY&dV95km9V_;n0zNo*EH0gWrIb=i aDfI + + From da0913ab75c50fa233235ff13b649aa23e3437c2 Mon Sep 17 00:00:00 2001 From: Mikel Date: Fri, 21 Jul 2017 23:49:07 +0100 Subject: [PATCH 16/40] Replace Feedback icon in Drawer with vector --- .../res/drawable-hdpi/ic_feedback_black_24dp.png | Bin 149 -> 0 bytes .../res/drawable-mdpi/ic_feedback_black_24dp.png | Bin 127 -> 0 bytes .../res/drawable-xhdpi/ic_feedback_black_24dp.png | Bin 187 -> 0 bytes .../drawable-xxhdpi/ic_feedback_black_24dp.png | Bin 246 -> 0 bytes .../drawable-xxxhdpi/ic_feedback_black_24dp.png | Bin 311 -> 0 bytes .../main/res/drawable/ic_feedback_black_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_feedback_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_feedback_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_feedback_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_feedback_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_feedback_black_24dp.png create mode 100644 app/src/main/res/drawable/ic_feedback_black_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_feedback_black_24dp.png deleted file mode 100644 index f03168559b3ca90ff3223edcca99bdeb69fab070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K8jHioZNCo5DOB;C`40v2F#hkaU{$pwX`Q{|-xzl;s!!o(ZPixsi1yiwa(I*%-G}&=ob-s4h wtig%3lvSkUmTbzJB}oB>DmdKI;Vst0I{<%xc~qF diff --git a/app/src/main/res/drawable-mdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_feedback_black_24dp.png deleted file mode 100644 index 8be6849cbc05874a2aa44d7103d49acf1630b3bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1H%}MGkP61+1;QLD6(>K;XQ(;) zfIpl+%uiyUOU4g>nI)^(6eNVC+VV9N7512(jy6 ZU}$NyaNHmn{TXN?gQu&X%Q~loCID#lCawSg diff --git a/app/src/main/res/drawable-xhdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_feedback_black_24dp.png deleted file mode 100644 index 63bec23315f1d4c4239102fb5ff07c23815834fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DCQlc~kP61Pmkjw1IqSf^O2*--OcVX9fx*LjPh=D zd*wSN?p5*vrXT4G>e==kXJI?nu-}8BMNYz=xteK~RK%78rw8U{~SKbLh*2~7YkkxJ_T diff --git a/app/src/main/res/drawable-xxhdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_feedback_black_24dp.png deleted file mode 100644 index e68ceb906ae6b9192e3bfe3b5b77139d8f871f8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw_IkQFhEy=Vz2eAq$Uws7;r6cb z74B0Oxqm2W3e~9+a^%pvvO_#c(DQ%fnc1~JPCPnpXZRf|fP6E-N(i{Hi$zB#mC!UpTGM%;a!Y zGG&6}K4&&lhN&+lMT~$lE8cFB$_QZo8ns~J5*DeK4$M;|UwD47&hU;%lDT5BqA=j` rf@6-o%~I^9d|5z&BgJ!y-&Qlv?EZPH<*5`i&?5|C5 z0U~ZGtWyrOOR&voRMJSkp!#RyOTj~JZRJag?=gM9e&fdWnKN&)aSFYa7jweIF5ED9(-rq)o#eL=sSjs1Ouy8ie7Nt+ zCG$5b4h;=l>JA5{v-mK_v2q9~0Qo5gW-~A{vGA-j0dmTLES35cCKiq#D;Nb79^|V# zG%zsw9^hAhFoW;La^`I}8;)5?Z)i?AV4J?P;aFat9jp8~+vsaPW=t_b`#$_!a$ddG x?&W9C`ToCZE + + From 42c6749e9d6143ad160bf2300279d979f9eb92ad Mon Sep 17 00:00:00 2001 From: Mikel Date: Fri, 21 Jul 2017 23:50:39 +0100 Subject: [PATCH 17/40] Remove unused Upload icon --- .../drawable-hdpi/ic_file_upload_black_24dp.png | Bin 139 -> 0 bytes .../drawable-mdpi/ic_file_upload_black_24dp.png | Bin 114 -> 0 bytes .../drawable-xhdpi/ic_file_upload_black_24dp.png | Bin 144 -> 0 bytes .../drawable-xxhdpi/ic_file_upload_black_24dp.png | Bin 175 -> 0 bytes .../ic_file_upload_black_24dp.png | Bin 214 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_file_upload_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_file_upload_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_file_upload_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_file_upload_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_file_upload_black_24dp.png diff --git a/app/src/main/res/drawable-hdpi/ic_file_upload_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_file_upload_black_24dp.png deleted file mode 100644 index 5e5b9fc4ac45134e7fc93da768e8730bd06734f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K8kf)1dNCo5DGaGpw3^|ws-A=CP z`DLzH68?wnq{+mZb$^po%d51{T(_3?`MN-a%`0UAi`$|E6)p&|G$EzyQ~7y`l#B_A h(*qAb&7M%bkXz5?Z!+^^k2av`44$rjF6*2UngDS|nb&%Fb3ug|-}yriBQ0#W+tVLn7qpS_ zP~Tf$6T85n@f^2^MgWjr<#oZ@0>}sr4gL3m|Lx7MUUi92n}IH1@O1TaS?83{1OQ8~ BM!^68 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_file_upload_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_file_upload_black_24dp.png deleted file mode 100644 index 9ce5b8a7b0f464d42bcc455c8649337e2c417d7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeG3?%1&o4*=JaR&H=xB_ViXik240LWr03GxeO zXqc_-CjsPDdAc};R4~3hyOH;>fxyuV-isA&dY@l3kvio2ZwliL$%Lg^W_`Nd;nAh@ zH}Bba%6i?WXWQp^$Vi?nQYuVQYjTiaO5|Ya5bOdoS`-Boyc#4JlYk-$ZVeoaN-YWk s5H&!lrhpY0`CndqJXiEO^YQ;zbrQ36Ec&9=#Xzp}boFyt=akR{0EMJP4gdfE From a0963b913acfe34171f86fc3c6c9abfba4e7aead Mon Sep 17 00:00:00 2001 From: Mikel Date: Fri, 21 Jul 2017 23:51:29 +0100 Subject: [PATCH 18/40] Replace Home icon in Drawer with vector --- .../main/res/drawable-hdpi/ic_home_black_24dp.png | Bin 214 -> 0 bytes .../main/res/drawable-mdpi/ic_home_black_24dp.png | Bin 177 -> 0 bytes .../res/drawable-xhdpi/ic_home_black_24dp.png | Bin 239 -> 0 bytes .../res/drawable-xxhdpi/ic_home_black_24dp.png | Bin 303 -> 0 bytes .../res/drawable-xxxhdpi/ic_home_black_24dp.png | Bin 356 -> 0 bytes app/src/main/res/drawable/ic_home_black_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_home_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_home_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_home_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_home_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_home_black_24dp.png create mode 100644 app/src/main/res/drawable/ic_home_black_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_home_black_24dp.png deleted file mode 100644 index 9f61d7bf25be9f17f17688cc948ddf7bb65a5f2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpTu&FrkP61Pmp1Y?C5X5_baq^> z%l&}uOoQ_S37rE>ISaiFn)41YT`3WX(bUkm@?9j!=~Mmk{Z~_k9j&%D_T*_LFEzGx z`toE=L83!3GpoIpqpofCTIo7I*N{}&pFv^CjQFumQ;FJ@X8kqC4s NgQu&X%Q~loCID<(Ql|g_ diff --git a/app/src/main/res/drawable-mdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_home_black_24dp.png deleted file mode 100644 index 9f2c3d2f75d467de0bb9ab7db131a0d04840492f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i3QrfukP61Pr`KO?VvupT=)E8_ zmGN$aWC@3Cv*jJ9=?QJ;c_SKpls{Z{cu?>|T&HT^?@ym~g|?S>_6G4Q-dSpPL)$ez zGu`!>CfnbWIu@&rtT=VBCq`Fo)l;=Orb)|=ojeh$EtVC_BVx5NXt{w9cOyUF-v1BV a_b`O!Zw%F1#TE>71B0ilpUXO@geCyf)Iq)g diff --git a/app/src/main/res/drawable-xhdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_home_black_24dp.png deleted file mode 100644 index dcdcfc0a80de0fe05a62160fc706e9363a0239e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DZJsWUAr*{oC+`((au8vg-ry4~ zb%Adko37L81$?_NsI6eMUeMTmlA}UM!ovJt4Ria&+qwyhkN!0FJD9pDLDeho#*?X& zL~mS5@Rv4AS@x)J?~R~|6K!Ru-Pous+}N?#Q0T;giE_Ua&NsHsk=&rqHz&g3Y{%b% zCG+g3b}svTGWaEe*cS3BWY?jZLm|5+D)=nbIHT^Pss$vLYM)6rp1RSpO5rH8+y{qq d4eT<ojwUa*oC)#{gQu&X%Q~loCIET=VpRYD diff --git a/app/src/main/res/drawable-xxhdpi/ic_home_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_home_black_24dp.png deleted file mode 100644 index 2e86cc2557d602e22c29bf90ff3cd9b76c86bc6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhawzInPhhEy=Vow70Tu!9I|c%#we zRg9M#vkY8k7=^U&Ht=1+cDYe1V2w|s9SaLj^TVd&_GdqoN#Dr$$=zdk%p~Ss?hQ^| zeU^h$r^$Xe;89~yw7^Jq{So#2l8`48JAXVnGSTbHnIq=szJxsJY~AtrP-n`#$WHkf z%gHAWxczx_Y=ZegjW141kUOFI fTfgBkiO*~+jBKNAm>6EUQ`Ct*wSx>5qK>6$=Oo3Qm;g)G0o&@&xPba3#K6 z%^S&y&BmS5-@bSqnrJIp9eMMi%d*6LGb28kmp9tyGS|O5b6}s$oE^sD?xs9P9R!Z_ z75`B8Z(s2HaaOv+jvdD3_xj(@iQ5wQ?NL}~*gq)I8fJEYcY)~s9ia=R@)j^>s50MS zi2B(b%@}o%$-H0e=-I`tg`YD5@7P3%U~s1aWuF3ND}l0d=Ka%-V{k(oZvXyV8UMT3 y0~izy3@`p?t4o+3U}gb + + From 8d422c83010f91884802d3800f09a6f2ac942189 Mon Sep 17 00:00:00 2001 From: Mikel Date: Fri, 21 Jul 2017 23:52:18 +0100 Subject: [PATCH 19/40] Replace Info icon in Drawer with vector --- .../drawable-hdpi/ic_info_outline_black_24dp.png | Bin 487 -> 0 bytes .../drawable-mdpi/ic_info_outline_black_24dp.png | Bin 323 -> 0 bytes .../ic_info_outline_black_24dp.png | Bin 640 -> 0 bytes .../ic_info_outline_black_24dp.png | Bin 940 -> 0 bytes .../ic_info_outline_black_24dp.png | Bin 1256 -> 0 bytes .../res/drawable/ic_info_outline_black_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png create mode 100644 app/src/main/res/drawable/ic_info_outline_black_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png deleted file mode 100644 index 4b5ab06e19d61515cf3a7395db43a81bb30a8203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487 zcmVS-P=?%O3jv@aJa6HGW<0ceyC!`rEoc~?j{U=`ic|b z9N*QPsMv*+MQv@1i8kR%)UIh1`=XoCqqIYBOKErvea{GWZ!y>;D~RpT`=%tUi9cM8 zjMJd-5IZXpx*;AQpQG66NVp4e3Hh{Q=T<@);yl@>u@F125nkF002ovPDHLkV1kFY-~<2w diff --git a/app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png deleted file mode 100644 index e0c9fe0eb8457013fbfa6e2efea61fca70bb9303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmV-J0lfZ+P)&s5ci5fY}sT-yed|rRg0)~VyRe(RxP5| ziKSu?+iDTDUGbuL5L2~?+LgFdoQk=|C}Pxj7RQRtyXcJ~MwepHsvL@iJ?s4SCH8$Y z6AQgYt#Ro~-1uQ)CSvZwj!tLSm1hyxCe}LeCL$stVz6(6)`@$smX==JIoA4R{{X3C VfQx`Hg^K_H002ovPDHLkV1oM>kN^Mx diff --git a/app/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png deleted file mode 100644 index b706f0d06a9a1e5e2f6606c01e84094ee6a99b42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmV-`0)PF9P)o#88fEO5na|OlO{3G z*yIPEVO{WsIjnKnVT>2DMzkql!ApMPMO=L<#3I9oI}LubOO+CNvScYxqQ)LKcQkDr zB9h}Xp02N~GG)+JIYyNnkc)PDZOnzu*#; zB8R%~1(i4Rl0>e>Eb#WLtxfOV(#vvo;8MrfX8# zOJwj-6bRC^RW#U^^>`Uk%GqUlp=9>%y-#&$qZ(w=qV2=#%SNueJg~}R_Q4VL}5`+@9~aM z91c`Iph*TZkfp^?^`Dp^0y)$Ij}vN48)8+LhbiruA|j3sO47|fb;`I*GKou>Ivq)^ z4u=V1QQ;ad;<{u73-W9;3T-}Qiy5qW$_D4g=4Y%kOJdS2(WFCmdcfcOtJM6uO{+z8D@UxkKMBq1+Buz@6?P#P0jG1VJo zr4$sRhK5k2Z=fXRN~6nW@y^{1KD~XI=}gYdoFjX&pWp3sm>a@9yM-m0@&}6isAEB(Qj;>qRst`p9~=6q zAu7LO=u+TQ_K7Dd@dg8*_ZUX>5!&WBSSti4^<9Bi7`TY2+y<+KU=~psWnX%OzQeO# z$Y%%reeR=-{wJ-1^+Iq9eT6F#>jwG=^_&zcppV__#9BjN7F^M%z)NCy=&SoFTsf2ppC<<**2_ZI5@SJo9Db@pv9Dwel>@Q2Y|A^pR+ zXm)h0I4$&8t(hXy6*cz3S)t(J`aO{jqc{F(SB1>4AMjd@E;uWs|KhZ2{;};ky2AQ2 z)rxDxD$`NJH=PukQuA$!?4zc}-&3$&Xn>Du{t5dULsafqFEod!oWp?rpGSuiRtueB z&+LQNE+8tK3|cF6gtuz;3+FNP08y#Yj|~U-15sJR*io8@$}eQs#}cB_phN-_NT5>I zKj|$a=v*bC1q7WMgQRsN@Unzi63g)%L1&Ybq;ZC~2s(dqkQ990An0_M#V3gY=Ga5f z`5TXvN})=^4!0;^!e^R~NT^Pc418W7q3m*(v-Aa=K4XNz?fnc_RXp{J*(OZ^8ac7(2N>$@cY O0000P)W$LQv#I8j8T_{yf~=m$~;IXzu5?eh%l+bI*O5LnIQ3L?S-g zNEKIT<0XBJGshx}%rQL6n2^)65BytPpur(aAq3mzkx5L*!vp z0a@Ola>x)hq%a~$J)clM5drmH23z#q<|xU<0`*qKPGo7Si~n z%wqBU&0hSlj{%E?RDuuU7MJcXB=Jj%b`&x_e(Xp;ExUAT@Y|(jm(qjWZ(B;_Uor&Y z6!R#Nv*chaGsx+GPf(5^TbQOC&z>U}Plh0!MlPf-JUW9CsUc{WQ6klNkmN0L=W$Hb zI`=E``6_{H*O2>uGL!}iknh%)aH)U^vHJHyC=I|j;!5~HKCWcN1R5Z;2B2BgU%-W! zczBp#L#PcDi)Yo>;Taa!Y@Ptv;<}7l4r)8NeQGlwNF& zYb9ky8`z|cGKQ@=tt4)=frR*F&DNq;5;NLBOdDlk)i+CZzQKZh$R zK8n3)UuX^N7uDk=aj8xWGC(Sn1_~Jx)mdCiFf4{?52b-lQTv8C9#o@5E)leAD3OzR z)Fn^Gaf%@QAdedG1kbj}b8XCXgrFSb3rcL@n*sbhFEP*Qfd2Kr_;5}_cz_aF;&K3M ze+ebhM9$XHgOZ`06n-hB6D318YwImEMS(?`<%O>vfHEvXL&vNpLe#!|zDLp9b&_k9T z*x5;~c-Pf0-68_APCn*}yr+}vWZ1(d62yp+WD|SHaD&H;+SWI+mO!0l8Wm6`sU`&F zbfE&s6E+i?YKBohW{8u7EWu?ypnS+US>hOx&jq=;y2>EuNMckT2YAG1l*`QUkZ)PT z3X$L_jr@gjkUknXOq>;|goD)5%rkl!W0nOLm}QJ!o^qco2Ph^Ii9{k1-~0zqnGDmx SqDLYC0000 diff --git a/app/src/main/res/drawable/ic_info_outline_black_24dp.xml b/app/src/main/res/drawable/ic_info_outline_black_24dp.xml new file mode 100644 index 000000000..cf53e145c --- /dev/null +++ b/app/src/main/res/drawable/ic_info_outline_black_24dp.xml @@ -0,0 +1,9 @@ + + + From 07ee6b2d71cd486dda0e13c5684505e1feb86972 Mon Sep 17 00:00:00 2001 From: Mikel Date: Fri, 21 Jul 2017 23:54:57 +0100 Subject: [PATCH 20/40] Replace List icon in NearbyActivity with vector --- .../main/res/drawable-hdpi/ic_list_white_24dp.png | Bin 116 -> 0 bytes .../main/res/drawable-mdpi/ic_list_white_24dp.png | Bin 86 -> 0 bytes .../res/drawable-xhdpi/ic_list_white_24dp.png | Bin 95 -> 0 bytes .../res/drawable-xxhdpi/ic_list_white_24dp.png | Bin 94 -> 0 bytes .../res/drawable-xxxhdpi/ic_list_white_24dp.png | Bin 100 -> 0 bytes app/src/main/res/drawable/ic_list_white_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_list_white_24dp.xml 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 deleted file mode 100644 index f8f7e7dda6e4a5b45a97917c20dfaeddc3645077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index 15d8fc2bb488d6654651ec05f3ecba1fb7163394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1Sx*gTe~DWM4fOr#gq 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 deleted file mode 100644 index 2b7253975cc58f5814084bab87ca50729cbfa262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZA`BpB)|k7xlYrjj7PUMy@67>e^mO%eS?83{1OWFN8fX9j 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 deleted file mode 100644 index 2a6d3b0449b8c59366b29c2209bb23e80325080c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/app/src/main/res/drawable/ic_list_white_24dp.xml b/app/src/main/res/drawable/ic_list_white_24dp.xml new file mode 100644 index 000000000..7f5d99c3b --- /dev/null +++ b/app/src/main/res/drawable/ic_list_white_24dp.xml @@ -0,0 +1,9 @@ + + + From 77ff73e7d09151170e1af73d37af9e3d5fcde661 Mon Sep 17 00:00:00 2001 From: Mikel Date: Fri, 21 Jul 2017 23:56:32 +0100 Subject: [PATCH 21/40] Replace Map icon in NearbyActivity with vector --- .../main/res/drawable-hdpi/ic_map_white_24dp.png | Bin 317 -> 0 bytes .../main/res/drawable-mdpi/ic_map_white_24dp.png | Bin 231 -> 0 bytes .../main/res/drawable-xhdpi/ic_map_white_24dp.png | Bin 373 -> 0 bytes .../res/drawable-xxhdpi/ic_map_white_24dp.png | Bin 528 -> 0 bytes .../res/drawable-xxxhdpi/ic_map_white_24dp.png | Bin 678 -> 0 bytes app/src/main/res/drawable/ic_map_white_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_map_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_map_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_map_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_map_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_map_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_map_white_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_map_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_map_white_24dp.png deleted file mode 100644 index b7631d7d76fb46081b1bbc0f38e99436e572ec69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmV-D0mA-?P)#Y|WVl#6e|~YC{#k-kvSPbO9!pG0^Hd&8s4H%R#Cqora46uzg+{#+v(63)D~4ER_8?c P00000NkvXXu0mjftW}8f diff --git a/app/src/main/res/drawable-mdpi/ic_map_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_map_white_24dp.png deleted file mode 100644 index 4edb178dc91bdb1388e7bd150995757e2fdd598c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmVt0I4V?X{casvx2f_73_+u-bQT}AK41*=ir?6A z;f0AHwlWu_Uj+YPbuM^wX;(HCv>Nc_T&e4Q3_LipVa diff --git a/app/src/main/res/drawable-xhdpi/ic_map_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_map_white_24dp.png deleted file mode 100644 index 301162e71baaafd76225314b2b3441586753f876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmV-*0gC>KP)i5HG0|Up6TAXrsgcU%T3b)&3ujCuJ?r?Zj2K2nwwpUiU{jM2$tE;*AG81_T_z!^J>e(n7 T(CC?}00000NkvXXu0mjf%iXV@ diff --git a/app/src/main/res/drawable-xxhdpi/ic_map_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_map_white_24dp.png deleted file mode 100644 index 0c38abeecc1814d8cdc677bbf3b4da09bbb44738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXoKNz3#TCb7TBNk1xRe$t%B)%%#pEb-q2J4u48x0k91jn+FnNXNZ(Rj+1bc^QV=)9&$e1R#c6PHdc^=xi>(LY@;b^D@CtDRUVX_&;RDs)>Ze))?1z4qyt3S(^ovuQFh5#%Cmfr z);a^f9;=vNPs{2=(>o?a+4qV(64^GPmPg5TE928GpW410eYv!eDdyU3A8~s{Q(Ff~ zb%~^B%PJ1|9b#NBe(4OmN~#0raY>a3;gUe_I=1VdZya;}$MAx=%kmWWCVe;ct1UDB zvEMu=t`h1X*k0)-)O&2lfm`+O+HW3B-npKeqqt$Y%Ei2v%R0v&M!2irpLm7wF3ajk zWo{?8Ft$xdV`tS;LgK=hdl2sifvMVldkuRLFh}s|NAem&UvmZrTX%*fNN2t_=nD7 zox{Gndt;tP^U3d>uh#W+mfi#N@)e1GZu(d9pQ_n&Tw^%?Wc5XM7mGtlF$>NnTYvv? z^vvExGlPCw=N?cozcJx*{gF4z+AUsI`*J_En8~NmcEz2UyMQbDkmJ0`x2*j(3aMXa zxgz*fTYTjK&Gl2nlz1*LE4=;iG%y7INpUXO@geCx| C%_g1z diff --git a/app/src/main/res/drawable/ic_map_white_24dp.xml b/app/src/main/res/drawable/ic_map_white_24dp.xml new file mode 100644 index 000000000..4cb341e6e --- /dev/null +++ b/app/src/main/res/drawable/ic_map_white_24dp.xml @@ -0,0 +1,9 @@ + + + From a8f1a95b0650bd77a222422935d0cb3c3c31da32 Mon Sep 17 00:00:00 2001 From: Mikel Date: Fri, 21 Jul 2017 23:58:25 +0100 Subject: [PATCH 22/40] Remove unused Photo icon --- .../res/drawable-hdpi/ic_photo_black_24dp.png | Bin 256 -> 0 bytes .../res/drawable-mdpi/ic_photo_black_24dp.png | Bin 183 -> 0 bytes .../res/drawable-xhdpi/ic_photo_black_24dp.png | Bin 295 -> 0 bytes .../res/drawable-xxhdpi/ic_photo_black_24dp.png | Bin 424 -> 0 bytes .../res/drawable-xxxhdpi/ic_photo_black_24dp.png | Bin 548 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_photo_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_photo_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_photo_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_photo_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_photo_black_24dp.png diff --git a/app/src/main/res/drawable-hdpi/ic_photo_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_photo_black_24dp.png deleted file mode 100644 index 52c788746551c8c56b0b0c007d6d88b86e2491e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpaZeY=kP60R1X|{Hu@&s|&Ag-FGDXro&V_2U(SdKn8~3KLrKrI|Wt)y~N<@>gTe~DWM4f DxdmAD diff --git a/app/src/main/res/drawable-mdpi/ic_photo_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_photo_black_24dp.png deleted file mode 100644 index 377ce1331881a9e3a65230890c53d75a1afadf2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iI!_nJkP60Ri9HGv9;zO$xA`F2 zY~NKip@`{&>Z-Q?EsCWkJy}1F2%PyabwitRK^RAXP2+^NT%I#L+6ULftvJI}BlXUh zgYo7Zp5>B!h8rAGcSx*zbm_y~gB+(OCrxmebUEoqSFE$qxh-=XS`%tr1AcOc@c!e` h=hXNvyJe<4!{gtg&1u^v`~|v%!PC{xWt~$(698OCMb!WR diff --git a/app/src/main/res/drawable-xhdpi/ic_photo_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_photo_black_24dp.png deleted file mode 100644 index 6b7cd7838b5ab18a63036d58a054a7f7588df8d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmV+?0oeYDP)A-PL#CT5Az5qiARtADF310vJ002ovPDHLkV1k7`cx3

0IdihI998&O^-W#$ zE8eR<`gyLR?O%&Chls5choVhVmCp&?Gd)wx?0#|VP~L8%%w$p-R(yr$;{~C~*0aQ- zs?IgBWz4kTp0!A|+(Jmj5e0owZ&G_RIaKonL&qxNl4CJJy$iIb&5VA0&o>}y-{Vf+ zDHG1r1x#19Qr&G{7AbO*Pb!!_%zNG?L)Xr;3&OX}$oL zDwTSQHR(l^wA|V&5Tv(BaLS|4S6@E=HsQVMvgUa=7p*v^YH9g=O3?HaqZf1cUXtJS zaF%GD*rb`FVdQ&MBb@09A9bRsaA1 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_photo_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_photo_black_24dp.png deleted file mode 100644 index ebe206ff7bb1de48d109e24282501264d1c85251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7!1&tJ#WAFU@$D_&t}6}_?H}DG zUtF78%ap#9!};-X(IfrAEF$5LMBUCCTvqAkux#a8#IvsSCC_EOFHChgM@+0V!-Go} ztWHi{v5xCs{noXv_7lwYO&kTx1qB6n`W>9Znszw-prK{(xhG7jYOgXiB))yeH<#dZofRb8aKMh65v4Km(J=0tQxe zrh}*HlLr2tohObjWUF~<#BlwG<&g&AcZFKgNe6i} zfNYr$^8};!yxS34JUMjJ3C3@0i#mVas^%|TnZ!1yV0v))k9T{%%dlH>PGl;JESr7* z+|{QE>WW?mxX)euR&jJ~e$Hi8Zm9Tj<;&2I@{RDB)ul%4IcxY~~shuCjiJz7=%!}+XkP3S}BH?LlOXmQ{1 zbtX&xyQ`v;<^mP(Zkg7~vthON3ayZa*jUD$>Ib8bzq<89<;SOp*oW$l^*Ndhtbf|& z_sOY?7IbX4S=nH_$2U{x*PlA}wm*#j?DqCp9#AQ`XVkQh)Ab4a%EbAC=|-u?1WQ}Q jpDR|sd7z>M1oey&Pa+y;l`K*O#y*3mtDnm{r-UW|Gl}p9 From 251046cbf300aaefb4af935ac6be342a7ed3b9a3 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 22 Jul 2017 00:01:40 +0100 Subject: [PATCH 23/40] Replace Camera icon in ContributionsList with vector --- .../drawable-hdpi/ic_photo_camera_white_24dp.png | Bin 364 -> 0 bytes .../drawable-mdpi/ic_photo_camera_white_24dp.png | Bin 240 -> 0 bytes .../drawable-xhdpi/ic_photo_camera_white_24dp.png | Bin 446 -> 0 bytes .../ic_photo_camera_white_24dp.png | Bin 666 -> 0 bytes .../ic_photo_camera_white_24dp.png | Bin 894 -> 0 bytes .../res/drawable/ic_photo_camera_white_24dp.xml | 12 ++++++++++++ 6 files changed, 12 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_photo_camera_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_photo_camera_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_photo_camera_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_photo_camera_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_photo_camera_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_photo_camera_white_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_photo_camera_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_photo_camera_white_24dp.png deleted file mode 100644 index 497c88ca82b139d8523f62d272569b97777cdec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmV-y0h9iTP)S{uX;NkkS)#&21u+#OWT?<*8xnfup2(UyYu`|TWayHRle3^B=LUseC>Hz3 z2?03L6F2Y)Y1vJelVK0EWmn2Ql$Ly?Q}HYJ&`ey8O(uTi9vWT@jom{_aSLoF;#2pK zl4W-|8up!*EPLl3g1*=uhfkRYaWVLWw$#P9nUaw)p(W=g$}a?K8bsDKc?-L=1LM-h zsPJb*v0}uSlpQ7f(8IPT6#ZR~|J)2!gMLSvx$!&t+WdOxKlA~ZoD~H=l;~Ih0000< KMNUMnLSTYiKb+YB diff --git a/app/src/main/res/drawable-mdpi/ic_photo_camera_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_photo_camera_white_24dp.png deleted file mode 100644 index e830522008b0a1b1f39fdde1156ff1bae3f955e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmVHkAXPXi!ebT=lL4K1x)6Wg_MY91 zzt7rrmFO;X_oUmq$FIPH+E8b!7Su|rTTt3JU}I)<+1$1SJPXOxL=vhYuo3Q@z)==< z{b1(CNz*~H=m#TH*Ja}&F!>pnOOBdeCCh%W6|%$U`K_?;2UJ3mWl4Bp2(Ys-zHDi) q+wWiFtfaRVtkebP_bn*je*_=o)*|^)1w=Uj0000S3bFt5nS?tU*5U+ zuRv$a3fXL!qPq!nmZ-`S-6wEv!Im}!G@?dn#;*=rm4ZHT$3Hy5 zK#ky=d(UOmFsQV^o<2gJx=}eIwnA3W7xau83lN!8vECcV2)4w<^v@2~67MD11sAjh ztGUt}LA${P1=0J3E1eNGc`3L+Gf5t=WKEt5E{OV^X;qWQ4p$&rl*20-lc(iB^4yia zijQ0lF6anWaiv8;dol|xA!y6No&?ck78<-*{Fa&B9E#TSq3mYYuttQ*QZ*_=*n0M$ zV!JjJ9`z`_U5gAzIwsc`sys4xbSaS{W>lIoJ$6TM=qna%_I>f1qB5iXUVh&=cfY<* oSSx7G$evyZ)YnOH5*(G_7e~OF#v^w+0000007*qoM6N<$g3E)#tN;K2 diff --git a/app/src/main/res/drawable-xxhdpi/ic_photo_camera_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_photo_camera_white_24dp.png deleted file mode 100644 index c8e69dcebb98d43695027fcc7e39a339c84dda51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 666 zcmV;L0%iS)P)y zDuP#FBS9M!QcYr?x(Xj5^OKhEOrZ0;%Xt?M^PS1$oUvkJVg?bG2*VOq|FP&lUkJx< zKARBwK%20%c&{z=j$iacgSVPOZ>ZBRKY6Vs^pYxn!v)X(MaU+{KDTId#}NxSK|*6x zFv$sHenK`COmmFwEtDe)3f@BdM8ToA&@EBW@D_@SSjd>rJ=jul4hPAn$ZYd zQ(^?GM-r@1H!ZY@i{+CPWphGpzG8()mbM9@HXpGBsG>9Ms~`YLf6Qp{EBmWamEC4dDr!XN=Tg=UR*LRnyXqu_l$^Po#V$T zj`&?_>IiL%W{Dt*qP?plloe0b6+u)P>h$wELg`L#hA>QZ`WYP|H+WzkLrdxi*`3}7 zVOSR<9(Dx^Vxd?l7V1BL0REY1s|}3R@&Et;07*qoM6N<$f_%9k Avj6}9 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_photo_camera_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_photo_camera_white_24dp.png deleted file mode 100644 index 777658e95515ca47c9852d00621e2e6d45abc5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 894 zcmV-^1A+XBP)zI9LJx5Cecy~F=}h8lwKtS@9n)MRxm2`AkqpItJs@p>)C(tu-V-#=CId=UD(s^ z#Zy@d`v;fOn~Tzu?OJHHNtIePI-lk`KN@Bx3G-g)`+Uz|m=FBkykXu`7K_DVu`~_~ z1Z4r$j3}CsFA0vr7p4ddb45K=_{;=>kNJmsIpZVU0%^)LLWz`4fe-nOMmgjIT>|g$ zGtFS1ZXE(|^ApYDN8W0_z#v8Txj;7;?6E~Um_R#sF$;$xalZoX{D6r(A?{D$E~c{O zM_>?haY%a$6fv1Q-U9oW%qwq!3ryzRTflV87q9|W;F{;GFv0){qSYiAAj>K*xHezl zfJJ&yHS#`7{A#YiA58NG$|F%`I5JV-9to7sbaLM;flIzZ1Lw!X3#^Fu{wYByi=R|$;R}qoTB8JI$kiVUUtqx1 zx=B!Su6`5*yii_yR9b4GhtSXus6)G54OU*Fzb<9Fuf)`*nQG!IEfB;+M}w za~X69{6e&@G0KTnj6*#FFeADVZuofoh-l4&E`cLDWuFO3wP#-rPc_|?^a;Rylnh;L z@)wd48zfOOJOnKQa*Rac43Xn8&v?osa%9ANUyhGPfeM+%FRSSkfU`OkhV}j2l~kBT z1bVSYwP7Nn+I` zNiohkFLCTaw-vAgjq*RZ@U(}??0O4qVKTS91=2W}ibKjn!0?Ng1(Y9wI8QK + + + From 94444210e79e62556dd1d7799fab6f6a3ac398c4 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 22 Jul 2017 00:03:03 +0100 Subject: [PATCH 24/40] Replace Photo icon in ContributionsList with vector --- .../res/drawable-hdpi/ic_photo_white_24dp.png | Bin 261 -> 0 bytes .../res/drawable-mdpi/ic_photo_white_24dp.png | Bin 185 -> 0 bytes .../res/drawable-xhdpi/ic_photo_white_24dp.png | Bin 304 -> 0 bytes .../res/drawable-xxhdpi/ic_photo_white_24dp.png | Bin 450 -> 0 bytes .../res/drawable-xxxhdpi/ic_photo_white_24dp.png | Bin 570 -> 0 bytes app/src/main/res/drawable/ic_photo_white_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_photo_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_photo_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_photo_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_photo_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_photo_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_photo_white_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_photo_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_photo_white_24dp.png deleted file mode 100644 index b414cf5b6881d6ec172d2a7fbd73ada5bbf167ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmV+g0s8)lP)kmVzj-6zmROnb2dbs~(^j5ic0>pDDE2 jzES4mqy6s}oc+sic8*Qfk2kwOj%4t3^>bP0l+XkKat%vT diff --git a/app/src/main/res/drawable-xhdpi/ic_photo_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_photo_white_24dp.png deleted file mode 100644 index 2642b9e09ec00be308649f62d9323f22ae2b6c6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmV-00nh%4P)0++mR7nD4pd~x$TQLGba6~{cu-M!3I>jYZG8L#~C$dSzGCa?>% zii{qBH_l~3H}Ow_R&mWIA6&_uY{DqeDkOK@%2_vI7ibl>$R-Q|t-=u5gh8NHSX1ob zZ91p^`0a>6o%RQ$Cqo6Qpk>-nPOXnuLHxL2AA)bf8YiVe5h%F;0000q8m|@f&vEk zXhJXy z)&q8Jdy{=h?m>-(r*@dK*d3epCi{|HgU+qz4*BYtIwp6bB0wo2#+nm8I>3B8iEGdk zTNzJQxB%cRn_*v)JJ1{dbN|paSFGhz>`QV3I>zMAKdKnfM6N&`Di|k|EDy3@h4PVK zk{o2e3gsieq-8-3jN^&)U)Wy&nw9O-LW-|?GEfU&#WGOH2p`=L$UkuoJ#eZRDaa7g sq|daVQ|=KHU?d>_qaXz-NI@l=ck_!~>**H-(*OVf07*qoM6N<$f*#evGXMYp diff --git a/app/src/main/res/drawable-xxxhdpi/ic_photo_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_photo_white_24dp.png deleted file mode 100644 index 2ffdb55f264ecd3610f90890f8202f93c00f72e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z{Ke3;uuoF`1aP>Ea5IfQowI9-hvuwR$tP^fy(>8sSO2|8{wRtGpvc@#B$n~B~Rwm&yIIB)&jy;7gW zTKL?7mzK@v|L<(N|7b3=;GHmT*|XKxR_ zisKEuaTo73N#D@a7GnOhx@e+huI&M-u%#?A#q8EMMfY92V!WoXj#HDtTEZ^x>C~Zf8IWQby>8Ib0dT5wN0yQ*dG`x>m;y#Wc*hW`8x0OY*zD)2SPUjd28<` z%OxHB?A^isVY&9DKSD{2WgAXtCo%nb*|kec?7;kW6+k(LjH+Fa;+@JJK3|^tK + + From f9846d1bbf73cc540019240ea626239d533bb67b Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 22 Jul 2017 00:06:08 +0100 Subject: [PATCH 25/40] Replace Save icon in Categorization with vector --- .../main/res/drawable-hdpi/ic_save_white_24dp.png | Bin 247 -> 0 bytes .../main/res/drawable-mdpi/ic_save_white_24dp.png | Bin 168 -> 0 bytes .../res/drawable-xhdpi/ic_save_white_24dp.png | Bin 273 -> 0 bytes .../res/drawable-xxhdpi/ic_save_white_24dp.png | Bin 391 -> 0 bytes .../res/drawable-xxxhdpi/ic_save_white_24dp.png | Bin 504 -> 0 bytes app/src/main/res/drawable/ic_save_white_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_save_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_save_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_save_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_save_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_save_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_save_white_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_save_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_save_white_24dp.png deleted file mode 100644 index dd3f1066462df2ed7e407b3443a8ab28ae8064f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmV42EYy@ILa0M5s>6LU8FOEP0!EMA1UJnE#X>H4|#tUDM{qm&kf2dMhR)ifj z8WUZ|7;_;tCIr>VOqfCg&;~EnCQz8@q32GR5=%FAqdn+F@^p=hssQl$U@002ovPDHLkV1jXsV!!|Z diff --git a/app/src/main/res/drawable-mdpi/ic_save_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_save_white_24dp.png deleted file mode 100644 index 015062ed3b316909362e3bfe43579715a4f2c14e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+id`}n05R2ZcmmRqp6hvGD%@cNQ zTrf?MD{tY`DCrY!+h+!7)MX@<|M>91UCT6U&6_Q^vKIW^bNn|gNPwG~q2dAY{6@(2Ul)|NDzIgd>D5-Nv3R_&pT)_9!>hC0v RLqMw;JYD@<);T3K0RZw0JMaJi diff --git a/app/src/main/res/drawable-xhdpi/ic_save_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_save_white_24dp.png deleted file mode 100644 index adda095754f015a58403af02df101e7213f3fa2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0D8=fwXAr*{ouiIy}ILNd;e0ik1 zL&59A`M*Vsf!~yN-&Ah(m2P6Y@~YRDtG;K#iRnrf@56a{K3{q4q*%J-j>M1L^E>wD z_G`*BEKt%ZU=9!xlW_2kcwqhg@J~+L1PJQf&&tujU~xgSfq^Aq(NdMD@Qa448^br9 zJv*meXvT?xG}dmujKXXo3#U&Y*@0w|JqSu;kW8`%L1_GX^wikkMku z+!nN<`{#6z$_n(rC9(4bD+|yj&iNr#+MqpM!jbj0K{JA|g)V3yf=0TarU+{5f*K+y z*9B$&4b&1r9bM2+1dVk;a}l)E1wrp9=N7a<6~#f$6D?x75&I%ZEatS z3r4ib$>}g=S;qtI3$1o(pck}Sr-AO#YLW)JV1q`lWa+;+-xWC5gj7%<=ZrvIc=k>%>fl|gI;!tRK{Z;84l|>e7(Vy4L%kU(lfKjiFI>oQ3X>ech^2hYjIl+l`2ky&>*QB4^6 + + From 570853593d1c9d731015fde1bac089e5d4011e8d Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 22 Jul 2017 00:13:36 +0100 Subject: [PATCH 26/40] Replace Send icon in MultipleUpload with vector --- .../main/res/drawable-hdpi/ic_send_white_24dp.png | Bin 251 -> 0 bytes .../drawable-ldrtl-hdpi/ic_send_white_24dp.png | Bin 255 -> 0 bytes .../drawable-ldrtl-mdpi/ic_send_white_24dp.png | Bin 207 -> 0 bytes .../drawable-ldrtl-xhdpi/ic_send_white_24dp.png | Bin 352 -> 0 bytes .../drawable-ldrtl-xxhdpi/ic_send_white_24dp.png | Bin 446 -> 0 bytes .../drawable-ldrtl-xxxhdpi/ic_send_white_24dp.png | Bin 590 -> 0 bytes .../main/res/drawable-mdpi/ic_send_white_24dp.png | Bin 208 -> 0 bytes .../res/drawable-xhdpi/ic_send_white_24dp.png | Bin 344 -> 0 bytes .../res/drawable-xxhdpi/ic_send_white_24dp.png | Bin 446 -> 0 bytes .../res/drawable-xxxhdpi/ic_send_white_24dp.png | Bin 586 -> 0 bytes app/src/main/res/drawable/ic_send_white_24dp.xml | 10 ++++++++++ 11 files changed, 10 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-ldrtl-hdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-ldrtl-mdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-ldrtl-xhdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-ldrtl-xxhdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-ldrtl-xxxhdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_send_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_send_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_send_white_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_send_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_send_white_24dp.png deleted file mode 100644 index 0f0017201499e7cb3f317605bb05a0536bd70227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpAx{^_kP61PS2yxD1&Fjhyx+o@ z!eDqYGlqYQ*!G6d0v@&svsndQ(kFL@9CLR5`tjeMCRypX-xn4oE?BbQ)3g~o3e(Ry zGZ^z*Ez|i@DV?c$rG;U_1s;`!nI2A?C$yv~a-MY-n$_?qpf$^{d-=jB`Bf9vEfU=E zPe{sf(~mtuyTq*Y7c@J?yi{KCNF)6QdnU8);w7y2d(1Ci{#dd;K8Yd5BPqrs*~cSU l2TUR}axyl@m+i6t!c>+yg|(=5O)$_m44$rjF6*2UngCSUU-bY0 diff --git a/app/src/main/res/drawable-ldrtl-hdpi/ic_send_white_24dp.png b/app/src/main/res/drawable-ldrtl-hdpi/ic_send_white_24dp.png deleted file mode 100644 index 0cc14e7541455d7ac67d50d2fdfdd1c555047ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmV(cd_rXU-@1`zD_5C^0~SMi^&ef(Y!D!#OT$Pc!n=K@e0 z@fwbtXer2{mXQMuKnfK-6CDMhP!b~(D2T}*6B9r_#zIMqg_0NxB{3HIJZ5F)Ccj0X zotQ-*WM(yIZ6?ON)678w=Qrpf%yl2qw2q11r}5PLxcf9@e~b(?nC;!G5P%EKKS&MD zAs?DUJ~W4XXbAbx7}C%j@}W88Lo>*PDikmO%l7+e=mpYZYz2W_D-Zwx002ovPDHLk FV1h%3WfuSd diff --git a/app/src/main/res/drawable-ldrtl-mdpi/ic_send_white_24dp.png b/app/src/main/res/drawable-ldrtl-mdpi/ic_send_white_24dp.png deleted file mode 100644 index d5fe50b36804643e509dcad7925ec3707dc1680c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iX`U{QAr*{g&pUD*G7xEbXwO~E zT0QBR(k<;7y*oEHeP#H_(At%9xsknDx^UB3_W#~BJNGl*K5%9#Pv+sgB?XBrlh|jT z>SR37C}((4yjg*X+2jyIZ-GKzMC6Y5alaXQGd?9Ix?Vfz^3;c2pRr$pK}K_m!pohH z&1cEgCM^54_@d_m_LfFD7BKQy!0MP_rf`G*fV8NNJIls*MVo*wWbkzLb6Mw<&;$Vc CrAyNQ diff --git a/app/src/main/res/drawable-ldrtl-xhdpi/ic_send_white_24dp.png b/app/src/main/res/drawable-ldrtl-xhdpi/ic_send_white_24dp.png deleted file mode 100644 index 4735a7d71186c6c3762b44d2e6686dc793d9e7cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352 zcmV-m0iXVfP)c)f~kIRddy&k<*_Najm@&Oh&~$75AJC z{Bl0x<*Le*DO09QtA-A1TvL5*MZWE^M-9BU0W{AkuK@W$qew&2$q4GPOAXKl&>)HA zf`mxl=fejDB6%Pok_QqZ2_P$y1o9&VCI$JC@`Jibr0k#pCrPBNpbo3tAdCPKA_*WN zk^mAS2_QL=59$k%1W=Qa-ni$2LpE7rhKT@3kMzVXXY8}i0#l6re1upe;Rex-N78N( z2X)!u@n1I(HjVV6-9P}%ar`UjnLExoV1q@bn+A<`lI=ewd*G5IwpeD?O_uIBD}f*C z==}sxJfLvDI4J%*=iD#;ry~$hxL+J(1@u2Z! o7eIQzD-q;x0ToaI6;ST|1o-RvuW?C35dZ)H07*qoM6N<$f>2Jlvj6}9 diff --git a/app/src/main/res/drawable-ldrtl-xxxhdpi/ic_send_white_24dp.png b/app/src/main/res/drawable-ldrtl-xxxhdpi/ic_send_white_24dp.png deleted file mode 100644 index 76d135b90f5ef53cdbda489af6f936bdb5b97fb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590 zcmV-U0Jt#p7>-Ipu8(Q1JDaQT7JRh-~a#s07*qoM6N<$f^nArkN^Mx diff --git a/app/src/main/res/drawable-mdpi/ic_send_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_send_white_24dp.png deleted file mode 100644 index 048d3eb29d98d77149a0294270eedc869d3a6205..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i>7Fi*Ar*{AFC64Nm;#-%`{{Gnlwc zD^Lx5bil0BL3{yoEg12Bky(|#;Buq}gpb{DQUO1+WZP}|7e`EqW_nz$RCOMIS* z{e5}lgl$P!_lNUZN-70PCSatZ;n%{D^q+-4{d6?TjhRilKqoSIy85}Sb4q9e0N(CT AmjD0& diff --git a/app/src/main/res/drawable-xhdpi/ic_send_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_send_white_24dp.png deleted file mode 100644 index ef59e77678dbd3f5d866bca9058b6e90cb8d6098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmV-e0jK_nP)&W`22C;JryNwK41(MIA#GvFb#~s zwsao25E&6n03w(GL@)`A!D$_85` z%9!`-s3_@X0OI`y_5>OaJWhc7Ux1pxX-=Z&t1o;=Bq}NC$3*rSV}~5rah@Eqct#)^ z#sARKe>b^SMWD8;A|0im5z9_QQGnQ=9+)gN{ZC&+5rBvy01-u99ZM?OT$kUFh@ye? qUBLr0?$ZKzW0Q{J0Y5k327Cd{Pq+sr^Mm~W0000^MovOQy2%69g!l`1nlRu9q5pvE zX@myYNfB_YP>O(!La_r*Bos5CgHW7+xT6~oU$g=ef(baElh82WwP-+Oc&05B5IJN5 zB1?EcGzbZZ7QO+|!~|S(6`Ez4Z4SBMo;QAS3pm9ho9xr!mKQ!VTYnjTO4rC9j|;f3SF@(pKOI4j=1E3cc)~>%*CI9?W5jhI{pl# zB8ki(Y+Z@Yz#eJxok#U>^@^m0@8+i>;}%I($V3X;e=~@rA`}uySSUP_ppeEjA|O&b zm&b-m^(N!^U}YjHKUfWtNAeJ=)UTTkLOu0J4no~1k!nKyNvNc!iiyj@9(xVOVg#(7p003K_Gj#>nXC*>~ z2iWpwKJ$p7Er1B+1Rz;*lb$1h2o)J%M>$)bF?9w|p{xKzs8|5sDMy8xSOSPpT{8g5 znuiPw03r#cM?d%dGk^-^0w6*?WzsCbPb2|^Y6(Duas&{e0sur3N{^b!ng=Cx8fL2p~fB9RWlrPXH0B4&V$IxXN9QdBq2I(S<5~;1uV$%xw;N!HTa93iX6> zJwV&@S#X1H4M2eTh)@*(jm}4e8dU%UnU4rn28cJGPt5680EC#&=C@E00M2uTI~?(n z_k8;+fX7^FN1=;c;~pox=Hovrbf2@TP>>!Mvfw(W^-CP6$7N}>LiM=(yQ3AL#|3FB zA0?`LTp`VfPPtm@aakJIKQ#KdU<05JY(@YojR$~8V*nu1_+Bl}8TelAsx&45de>kA zp!d-R03wa+OFosx13;uP01#X7fJkEiAS(mD zi?1q;4S-5x1E8C59snYZ0l=obUhDy&(ij2gMzj&Y8 + + From d9c591e06e1a9e864b052ee500bc89ba9a8b2472 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 22 Jul 2017 00:14:37 +0100 Subject: [PATCH 27/40] Replace Settings icon in Drawer with vector --- .../res/drawable-hdpi/ic_settings_black_24dp.png | Bin 453 -> 0 bytes .../res/drawable-mdpi/ic_settings_black_24dp.png | Bin 322 -> 0 bytes .../drawable-xhdpi/ic_settings_black_24dp.png | Bin 557 -> 0 bytes .../drawable-xxhdpi/ic_settings_black_24dp.png | Bin 827 -> 0 bytes .../drawable-xxxhdpi/ic_settings_black_24dp.png | Bin 1073 -> 0 bytes .../main/res/drawable/ic_settings_black_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable/ic_settings_black_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png deleted file mode 100644 index acf1ddf85b3388b4fb02a683664d7599d96ebfe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 453 zcmV;$0XqJPP)bdAc8oEppaIOE(LXPbaD_uiXgfuI0y=Ui?$Rg z3N9|rijvq&CiQlchlhJevpDqnjrr%mb8?c{t6qzumxlIL6n!zIh8Gl(U}e3LlM0Ef;V2BeJSjZb=;SQ|z+u z4yaibL-bf>PG6*TZCbM}(t2i;JWOXDi<+RJrJZgbD4Fy&xy-!MTym*5Ce+-mj<=}R zs*bfH=Sq2RG}Riq#p042E*7&*ne}3EUJe(E*_zBou{bA(tHo?vL#bs|A+IvyeHm7t#M^wEtHOK?m*3tk?OFDx*kh6Lst!v$eu1NdssLB&DM32-Q z^h4~jZ>A+~7n2>4r=NU@Dq}tg9ji`Suql$(%vHn+eg}v!7dsOm%)+nCb00000NkvXXu0mjfkE75f diff --git a/app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png deleted file mode 100644 index c59419c02b6273e09063a0529d2239784818207f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmV-I0lof-P)J%}fHzV<>iUk{yCv=|P(yFM9CIKrv6;vdj!^e)OQ=oM~3L z3Hov zYMc*TMS6^4Y*s#v8YK}AT(ig&XB4{J=afm7xZ$2C{CQWp)PoCx)G7YcXPY7T1DnU) UWG_v5V*mgE07*qoM6N<$f<$+V!TNkla9V}f0{{|82kXi@9MRd@?$weK4A^ju7 zLRBcZi6~YV4Y?x0YCBk^ee93}@A5qN9`;=V`Fy9md5-r894+Q7Vwa zKGHbsTJ3CbB>k$}G!3du63TIxO+;yvI}8$@RV#hZwGsJa1 zG(UeLOQIW*%YP$A_S8JsifkZzY=a`Er-+B1U^vMR;-MW*pvdqV@zg66vq)lJDKSEJ zw`0sxb4<_B;v8FuS(#q`)kg&}+hPL6xOrb?GQ?%fExvFHL!Kq|$LU4WPhFXQ&M?@z zxR1mtVOeOIy~lo>;tz)rETgf>fK;}TNLegBvB^KiQ=u3Ot|-Y( z2Uu+mzU3;1m}L#YE?|a1uJMlWb*&qR^Q=+kG@*msHr|$gaEk##XL&}z6#u1a9Hidf vu2=2VHre2#z3N8+Q5wRd6(rV6I@-ivWBUX&LwAlh00000NkvXXu0mjfs0IG% diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png deleted file mode 100644 index 3023ff8daa925ac79e863caf679d03c56c3afc93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 827 zcmV-B1H}A^P)>`06 zl!7Kix5q+Fq6=w?Bq2zRX%{Q=l9q~JFAfaD-fMk(ql{OMJp*hZ8Le@FKzb36b`fRvPbJZ#ihbmi`-huQ`v`H+dnnz5 zIO;AGB7BE9YM!%LJ&ic*2`mcPKpgfvmoR!03D^-c43Z$hAhR4H0ecmL8#qMtu}v3c zWQvny2hqm?F??uNd0r4z>Rub{-SwiV_KcJlc$@G(Y7OnY{oYXaZ@4M{dXjJ$v z`$eh=sKvO?Cei3I?)A;6Md`CXq2t(8SWgZw6G7n$pCQ&JiDGgU(}=YRim_lq5{{Tt>$z%L(Sw8>(002ovPDHLk FV1g%Ge~AD9 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png deleted file mode 100644 index 476d5c9780b6904004c7da0d86c1f02e4c37f892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1073 zcmV-11kU@3P)?ENDOXxEq##k{R3pG`V_=<^3NWfR4)j)KkE?kf% zU}CHb1trze6>4h;sTD;rtpyq(711_6TOXmFPeL**CLQm0&Kbrt$^HG8P44Zq_ne-d zIYT6GB9TZWvWW>Kq@TD8Z%rbKCJFFT3Q=|)UTQ^@t;I_ZBg!7bOS=$dFXN?m5M}%E z(wB&`ukq3!h_Yz{ypu!>x)$#=AqKVLoh^t#k5E8sIL>$MVhOq3&gY0hM`8YgceIr|YY&iqQ@`QK~6 zQos?!gFYj`%4WoqwqT*0?-5V>feMW6L_F#x3@zbr#H0S91|$0r&w3vNHzOXl4y8E9 z5Dz;}9F@lr$I={PD~(h#??P2Hv5k*OBaS_R%D0F^Gwfz5bE%<=S;V1HRE7}izM+=? zvXWuMx}&JnaTc-a1LhN^j9$d5v#dlZNx#*%UxG%$>Lq+a5(6c?YW(obN2{C>#Hd#& z!B{)f219oRCRP~?=PB;R(sE89s&->)k9y|05eEzCQO)~HF|~}eY5{Q-jsl(y{dFJ0 zLg+*>%Tom8#bC&-wqj#@$W=cjZ_b3=su3H_Ay*wEUqWZ2%FD7H{2O^AAiF$gQgUe1!CaxCt9AAy+*GP?%|S8#ZFe%*GOO> z#bLy_Ugb>^^dZI#kVL7TbBI;FloO_cKI?z#>rnXuv2KJ_AwQf^#JVG>3?mNBvWI0k zCeFQ%8(UwY@+jh1ntry^Op?+IC23&?1EdS}PEAbz5c&FESu5gU4Th($JgXZci}?%j zAcuGCUqC#n17l^3BOc^%YUO^!lkUMvz+uFL`muJC2Zudosl~w?NY31kB51DEg_A{d zo(4V7yWC2^CMFTbCfGp0ZS3d#oLeiEIC_%o8Q~cgkx|9lh(m9&kc<=^oYC)hXq9s6 z($m<(9mL4iY&qBmXe3*lJNfX^nst-}xU1(FC+XyRa$C!w;mW?1+!pg9Cm5oZ0(uZJ z=)Phh(s diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings_black_24dp.xml new file mode 100644 index 000000000..ace746c40 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_black_24dp.xml @@ -0,0 +1,9 @@ + + + From 52b235f8b0d6c7285cbb9fa747195fcb7d774fa7 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 22 Jul 2017 00:16:57 +0100 Subject: [PATCH 28/40] Replace Undo/Retry icon in ImageDetail with vector --- .../main/res/drawable-hdpi/ic_undo_white_24dp.png | Bin 274 -> 0 bytes .../main/res/drawable-mdpi/ic_undo_white_24dp.png | Bin 196 -> 0 bytes .../res/drawable-xhdpi/ic_undo_white_24dp.png | Bin 339 -> 0 bytes .../res/drawable-xxhdpi/ic_undo_white_24dp.png | Bin 477 -> 0 bytes .../res/drawable-xxxhdpi/ic_undo_white_24dp.png | Bin 606 -> 0 bytes app/src/main/res/drawable/ic_undo_white_24dp.xml | 9 +++++++++ 6 files changed, 9 insertions(+) delete mode 100644 app/src/main/res/drawable-hdpi/ic_undo_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_undo_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_undo_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_undo_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_undo_white_24dp.png create mode 100644 app/src/main/res/drawable/ic_undo_white_24dp.xml diff --git a/app/src/main/res/drawable-hdpi/ic_undo_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_undo_white_24dp.png deleted file mode 100644 index eb7522cdb1bb95fcb5d48e1d018fdf7a505079d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmV+t0qy>YP)4&L<^}8G*Fn!6XpzR}Y@(EyK0Tihl%XpP!XLjqhwZF}SQ1py zTugwTv#Usu@L$nUy9-I_jI3fC}yCvtVKF!sca`eyb>*4FKdrw*xulirCLeRN& z^QFUAPo7a=d*Zn${r%>-c`OmTn@=6Q2_V^9|xQ)mki()6{CLnr9^_ w5bLw-m>HX4WMdr<)1s$ItM2}Jv;PZ=BijL0ndfp*KxZ*{y85}Sb4q9e0MIo~B>(^b diff --git a/app/src/main/res/drawable-xhdpi/ic_undo_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_undo_white_24dp.png deleted file mode 100644 index c4c28d0a4a8bf7746fff7a34a8df15aabc510bc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339 zcmV-Z0j&OsP)9KVVSO%^j7PWo5BRDgS~&Qbd>xvN%`yeR`YD z)4BDW`aIihmI&-SWsJ<(rgS(atdBC2BU0ko1l(JHGNkqUyB%Gpj!n6!HqQ(vxYCmi;AOMb-;F8eJ8CL;#qq`0VG)Wkymp(?Q z(`28N?w+ZuK(Pmw81!Da#v->AOG(0jPuBdmb?aw^cW^y1rUS1uh=k2>hl?{}70`e8 zC>OYBD?m7LPu>@kI-nD?e2{mj0O7D3GFD?@r<9B$_L#^*SyGd&g+Jmb7Sxo&$S^B*)YMEYl&O*2x^UI}yvXEwskcI2a*TTj-XPl1no0^H|`&&J`&+2iOWm%SGS(at}!x7@3b0c$+x9+x;wpo2(B+Ch~TpGoc$kEya<2PKmZ(&Q`Y`$Cfg z0w|GGrbCv-v?+_A7-<*xiO60=gQ5iTNay%~-h0k!pkJf{b!OLX@(Kv9^NOT?(5J;6 zu5pDM+@(XGh@@V!TL2~WmKrD7HuWu>pvDG&s?VNTgPw7U94>J=j?-q$wBGn64b$Up`%kb!;z6yinR TJ@r{w00000NkvXXu0mjf?+@0e diff --git a/app/src/main/res/drawable-xxxhdpi/ic_undo_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_undo_white_24dp.png deleted file mode 100644 index 6b10718b9ad10de899e3f46394b0d3e2e55eb055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z@+Nw;uuoF`1ZQJ$CN^u;~(c= zm*@7D(X#A*aX!gK#j)7gTVUGX=&ZuR%npS`8r%nc7ixAW7;jSS&F+}y(bbmSwT*3h z28Z4$h4mpW?<%*meYd&$@~>UfhsyeG@4rdyKWO=UPVqS?5yQbF5O#T${|nBnhItC? zFF1=Flw0o3d1#irC%G&0*~$$kcvP3oNNI_llhiJ^LB?sGo!SpS+o>}aOfS=2Q0F8q zt~qJL6``gsS~ake<1QEYNahySGrW0t_K3dcEGA}@j%HgVpTR8~wAb;}TE2;#8R z`z-C6s&`RDbb`|jXTj9`8=|}uoGjcWOH->JF()+0IIr>HY<`l&{6P3?=pqOE<(4k< zdY?piYgh6WPm{KJuKhK1fu-4kGWngy>YRGtKIVGA@@{ri7@xs$TRx#_8~oa4KKw75 z>ByfjFL9gDw2fwY*BtgF?Unk_Gq;6pTkmg`l + + From e9d77a0716a3431a99944de8ddf88650e69afc9c Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 22 Jul 2017 02:01:08 +0100 Subject: [PATCH 29/40] Use vector icons for nearby-map markers (#786) --- .../nrw/commons/NearbyControllerTest.java | 2 +- .../nrw/commons/nearby/NearbyController.java | 15 ++++++++---- .../fr/free/nrw/commons/utils/UiUtils.java | 22 +++++++++++++++++ .../res/drawable-mdpi/custom_map_marker.png | Bin 993 -> 0 bytes .../res/drawable/ic_custom_map_marker.xml | 23 ++++++++++++++++++ 5 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/utils/UiUtils.java delete mode 100644 app/src/main/res/drawable-mdpi/custom_map_marker.png create mode 100644 app/src/main/res/drawable/ic_custom_map_marker.xml diff --git a/app/src/androidTest/java/fr/free/nrw/commons/NearbyControllerTest.java b/app/src/androidTest/java/fr/free/nrw/commons/NearbyControllerTest.java index ab528c2ab..aa32d2637 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/NearbyControllerTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/NearbyControllerTest.java @@ -25,7 +25,7 @@ public class NearbyControllerTest { @Before public void setup() { - instrumentationContext = InstrumentationRegistry.getContext(); + instrumentationContext = InstrumentationRegistry.getTargetContext(); } @Test public void testNullAttractions() { 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 b38c01022..c5103117d 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 @@ -2,9 +2,10 @@ package fr.free.nrw.commons.nearby; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.Bitmap; import android.preference.PreferenceManager; +import android.support.graphics.drawable.VectorDrawableCompat; -import com.mapbox.mapboxsdk.annotations.Icon; import com.mapbox.mapboxsdk.annotations.IconFactory; import java.util.ArrayList; @@ -18,6 +19,7 @@ import java.util.Map; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.utils.UiUtils; import timber.log.Timber; import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; @@ -98,13 +100,15 @@ public class NearbyController { placeList = placeList.subList(0, Math.min(placeList.size(), MAX_RESULTS)); + Bitmap icon = UiUtils.getBitmap( + VectorDrawableCompat.create( + context.getResources(), R.drawable.ic_custom_map_marker, context.getTheme() + )); + for (Place place: placeList) { String distance = formatDistanceBetween(curLatLng, place.location); place.setDistance(distance); - Icon icon = IconFactory.getInstance(context) - .fromResource(R.drawable.custom_map_marker); - NearbyBaseMarker nearbyBaseMarker = new NearbyBaseMarker(); nearbyBaseMarker.title(place.name); nearbyBaseMarker.position( @@ -112,7 +116,8 @@ public class NearbyController { place.location.getLatitude(), place.location.getLongitude())); nearbyBaseMarker.place(place); - nearbyBaseMarker.icon(icon); + nearbyBaseMarker.icon(IconFactory.getInstance(context) + .fromBitmap(icon)); baseMarkerOptions.add(nearbyBaseMarker); } diff --git a/app/src/main/java/fr/free/nrw/commons/utils/UiUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/UiUtils.java new file mode 100644 index 000000000..b2c073850 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/UiUtils.java @@ -0,0 +1,22 @@ +package fr.free.nrw.commons.utils; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.support.graphics.drawable.VectorDrawableCompat; + +public class UiUtils { + + /** + * Draws a vectorial image onto a bitmap. + * @param vectorDrawable vectorial image + * @return bitmap representation of the vectorial image + */ + public static Bitmap getBitmap(VectorDrawableCompat vectorDrawable) { + Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), + vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + vectorDrawable.draw(canvas); + return bitmap; + } +} diff --git a/app/src/main/res/drawable-mdpi/custom_map_marker.png b/app/src/main/res/drawable-mdpi/custom_map_marker.png deleted file mode 100644 index 0634167c52db9b1331f1cd671b211f2b16b9faaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 993 zcmV<710MW|P) zDCy;#_SE=GPELN8|M&C1obx+Ji3ny)-P5s$+UA`&oL(%pR+O@k$&8>aju4Ly%IWvM zG^JAxsP1^c!!6rirg6gos;bu*7S2Xa68!U7IrrHg{~4(EJpK?jc{^EK<1RDt>y}O> z2#+3;o;N!y2CBOrZldM>U%8>C*%T~mT566!|9x`yU}itKB$+f)*Vpi*}-xG=-rphtDdy}8CKhi zfP4G8@?cr3LfAia2KVHp{Djrks+1~PkUmi1$aA$cJFX1rmI7FpmuZ{u7bsWRq0wdz zn8}Rgy3Uyp4cek15TGFu%MYZJ6C#m$bHJrkAlFUQx`|nIpYm0UIqM5Fmd5q!^nue8 zXL4P!*ck9^F@&X+;?m6p$38!M$~>^|*m2_1!Q4=Hdk15#`l8Zhpli!+LbqQvqDbIYR53=-cFD)a%P19Gy5OU%mKPWx(4X zY~;?p1K3^W8h6&xsU-ehpY(V6_0opDR4#r$#q`*#6~O?mPIel>N&*4s`Ry(Ki4K~E zEyTkF{V$a&DG3z$T_ZB~0Md z9zIf(mNGAwwO*7hkC=;6|Vhu&z$7 z##6_>r#{4DbMnKdPZ08tt_%?%4a@>D5h>pOGQisar*5+K-fh?%O$?saZP36XFf2Oa zrGV=J4`4A6HL?s45s|2_Zpj~Er4+CZu&sctId{eNE!0--*=tV3xKsQKDk)1U7KRrI P00000NkvXXu0mjfN=e#{ diff --git a/app/src/main/res/drawable/ic_custom_map_marker.xml b/app/src/main/res/drawable/ic_custom_map_marker.xml new file mode 100644 index 000000000..01b540076 --- /dev/null +++ b/app/src/main/res/drawable/ic_custom_map_marker.xml @@ -0,0 +1,23 @@ + + + + + From f73a9f15fc39152d99a542eb785894ed6471021d Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Sat, 22 Jul 2017 13:06:02 +0200 Subject: [PATCH 30/40] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ast/strings.xml | 8 +++- app/src/main/res/values-b+tg+Cyrl/strings.xml | 7 ++++ app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-br/strings.xml | 4 +- app/src/main/res/values-bs/strings.xml | 4 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 14 ++++--- app/src/main/res/values-es/strings.xml | 9 ++++- app/src/main/res/values-eu/strings.xml | 7 +++- app/src/main/res/values-fi/strings.xml | 6 ++- app/src/main/res/values-fr/strings.xml | 9 ++++- app/src/main/res/values-frr/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 9 ++++- app/src/main/res/values-hu/strings.xml | 4 +- app/src/main/res/values-it/strings.xml | 6 ++- app/src/main/res/values-iw/strings.xml | 6 ++- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-jv/strings.xml | 2 +- app/src/main/res/values-ka/strings.xml | 4 +- app/src/main/res/values-ko/strings.xml | 6 ++- app/src/main/res/values-lb/strings.xml | 8 +++- app/src/main/res/values-mk/strings.xml | 8 +++- app/src/main/res/values-nb/strings.xml | 4 +- app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pms/strings.xml | 8 +++- app/src/main/res/values-pt-rBR/strings.xml | 38 +++++++++++++++---- app/src/main/res/values-qq/strings.xml | 6 ++- app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values-sr/strings.xml | 4 +- app/src/main/res/values-su/strings.xml | 4 +- app/src/main/res/values-sv/strings.xml | 8 +++- app/src/main/res/values-uk/strings.xml | 4 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 8 +++- app/src/main/res/values-zh/strings.xml | 8 +++- 37 files changed, 168 insertions(+), 66 deletions(-) diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index af3286f06..c25bfc778 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -75,7 +75,8 @@ Configuración Date d\'alta Tocante a - Software de códigu abiertu lliberáu baxo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Llicencia Apache v2</a>. Wikimedia Commons ya\'l so logotipu son marques rexistraes de la Fundación Wikimedia y utilícense col so permisu. Nun tamos acreditaos pola Fundación Wikimedia nin tamos afiliaos con ella. + Software de códigu abiertu lliberáu baxo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Llicencia Apache v2</a>. %1$s ya\'l so logotipu son marques rexistraes de la Fundación Wikimedia y utilícense col so permisu. Nun tamos acreditaos pola Fundación Wikimedia nin tamos afiliaos con ella. + Wikimedia Commons El <a href=\"https://github.com/commons-app/apps-android-commons\">códigu fonte</a> ya\'l <a href=\"https://commons-app.github.io/\">sitiu web</a> tán en GitHub. Crea una nueva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia en GitHub</a> pa informar de problemes y suxerencies. Wikimedia:Commons-android-strings-about privacy policy/ast <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a> @@ -149,6 +150,9 @@ Descripción Equí va la descripción del mediu. Posiblemente pué ser llargo enforma, y necesitará espardese per delles llinies. Sicasí, esperamos que se vea guapo. Data d\'unviu + Llicencia + Coordenaes + Nun se dio Faete probador beta Escueye\'l nuesu canal beta en Google Play y ten accesu tempranu a carauterístiques nueves ya igües de fallos Usar Wikidata @@ -187,7 +191,7 @@ Tutorial Los sitios cercanos nun pueden amosase ensin los permisos d\'allugamientu nun s\'atoparon descripciones - Artículu en Commons + Páxina del ficheru en Commons Elementu de WikiData Error al poner les fotos na caché diff --git a/app/src/main/res/values-b+tg+Cyrl/strings.xml b/app/src/main/res/values-b+tg+Cyrl/strings.xml index 138d88bf7..d9af68e06 100644 --- a/app/src/main/res/values-b+tg+Cyrl/strings.xml +++ b/app/src/main/res/values-b+tg+Cyrl/strings.xml @@ -32,6 +32,7 @@ Ҳисоботи истифода Танзимот Дар бораи + Викианбор Дар бораи Ирсоли Пешниҳод (тавассути Email) Дубора саъй кунед @@ -53,6 +54,7 @@ CC BY-SA 3.0 (Руминия) CC BY 3.0 CC Zero + Викианбор дорои бисёр файлҳое аст, ки тарафи Википедиа истифода мешаванд. Аксҳои шумо барои таълими одамон аз тамоми ҷаҳон кӯмак мерасонанд. Фикр мекунед дарк кардед? Бале! @@ -60,4 +62,9 @@ Дар ҳоли кушодашавӣ… Ҳеҷ яке интихоб нашудааст Иҷозатномаи ношинос + Иҷозатнома + Координатҳо + Истифодаи Викимаълумот + Элементи Викимаълумот + Хатогӣ ҳангоми кэшкунии тасвир diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 441f807c8..37516ce67 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -182,6 +182,6 @@ ভূমিকা অবস্থানের অনুমতি ছাড়া কাছাকাছি জায়গাগুলি প্রদর্শন করা যাবে না কোন বিবরণ পাওয়া যায়নি - কমন্স নিবন্ধ + কমন্স নিবন্ধ উইকিউপাত্ত পদ diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 3340f59c8..ae698f6a9 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -75,7 +75,7 @@ Arventennoù En em enskrivañ Diwar-benn - Meziant frank a wirioù embannet dindan <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">an Aotre-implijout Apache v2</a>. Merkoù kenwerzhel eus Diazezadur Wikimedia eo Wikimedia Commons hag e logoioù. Gallout a reont bezañ implijet gant aotre an Diazezadur. N\'omp nag aprouet gant Diazezadur Wiikimedia na stag outañ. + Meziant frank a wirioù embannet dindan <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">an Aotre-implijout Apache v2</a>. Merkoù kenwerzhel eus Diazezadur Wikimedia eo Wikimedia Commons hag e logoioù. Gallout a reont bezañ implijet gant aotre an Diazezadur. N\'omp nag aprouet gant Diazezadur Wiikimedia na stag outañ. <a href=\"https://github.com/commons-app/apps-android-commons\">Mammenn</a> ha <a href=\"https://commons-app.github.io/\">lec\'hienn</a> war GitHub. Krouiñ ur <a href=\"https://github.com/commons-app/apps-android-commons/issues\">gemennadenn GitHub nevez</a> evit kelaouiñ a-zivout un draen bennak pe bet kinnigoù. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Reolennoù prevezded</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Trugarekadennoù</a> @@ -183,6 +183,6 @@ Tutorial Ne c\'haller ket diskwel al lec\'hioù tost ma ne rannit ket ho lec\'hiadur N\'eus bet kavet deskrivadur ebet - Pennad Commons + Pennad Commons Elfenn Wikidata diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index d02b603e4..47027f176 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -75,7 +75,7 @@ Postavke Registracija O - Program otvorenog kod objavljen pod licencom <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache v2</a>. Wikimedia Commons i njen logo zaštitni su znaci Zadužbine Wikimedia i koriste se s njenom dozvolom. Nismo povezani niti nas podržava Zadužbina Wikimedia. + Program otvorenog kod objavljen pod licencom <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache v2</a>. Wikimedia Commons i njen logo zaštitni su znaci Zadužbine Wikimedia i koriste se s njenom dozvolom. Nismo povezani niti nas podržava Zadužbina Wikimedia. <a href=\"https://github.com/commons-app/apps-android-commons\">Izvorni kod</a> i <a href=\"https://commons-app.github.io/\">veb-sajt</a> na GitHubu. Započnite novi <a href=\"https://github.com/commons-app/apps-android-commons/issues\">slučaj na GitHubu</a> da biste prijavili greške i dali prijedloge. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Politika privatnosti</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Zasluge</a> @@ -187,6 +187,6 @@ Uputstva Mjesta u blizini ne mogu se prikazati bez dozvole za lokaciju nema opisa - Članak na Commonsu + Članak na Commonsu Stavka na Wikipodacima diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 6282effe5..39c90dd15 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -144,6 +144,6 @@ Comentaris Finalitza la sessió no s\'ha trobat cap descripció - Article al Commons + Article al Commons Element del Wikidata diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4e00cc03d..49a1cb378 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -75,7 +75,7 @@ Nastavení Zaregistrovat se O aplikaci - Open Source software dostupný za podmínek <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons a logo Wikimedia Commons jsou ochranné známky Wikimedia Foundation a jsou použity se svolením Wikimedia Foundation. Nejsme podporováni Wikimedia Foundation ani nejsme její součástí. + Open Source software dostupný za podmínek <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons a logo Wikimedia Commons jsou ochranné známky Wikimedia Foundation a jsou použity se svolením Wikimedia Foundation. Nejsme podporováni Wikimedia Foundation ani nejsme její součástí. <a href=\"https://github.com/commons-app/apps-android-commons\">Zdrojový kód</a>, <a href=\"https://commons-app.github.io/\">webová stránka</a> a <a href=\"https://github.com/commons-app/apps-android-commons/issues\">hlášení chyb a sdílení nápadů</a> na GitHubu. <a href=\"https://wikimediafoundation.org/wiki/Ochrana_osobních_údajů\">Ochrana osobních údajů</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Autoři</a> @@ -186,6 +186,6 @@ Průvodce Místa poblíž nebude možné zobrazit, neuvedete-li svojí polohu. nebyl nalezen žádný popisek - Článek na Commons + Článek na Commons Položka Wikidat diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4caaa96cf..7fec6dd65 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -75,7 +75,8 @@ Einstellungen Registrieren Über - Die Open-Source-Software wurde veröffentlicht unter der <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache-Lizenz v2</a>. Wikimedia Commons und das Wikimedia-Commons-Logo sind Markenzeichen der Wikimedia Foundation und wurden mit Genehmigung der Wikimedia Foundation verwendet. Wir wurden nicht von der Wikimedia Foundation bestätigt oder sind nicht mit ihr verbunden. + Die Open-Source-Software wurde veröffentlicht unter der <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache-Lizenz v2</a>. %1$s und das entsprechende Logo sind Markenzeichen der Wikimedia Foundation und wurden mit Genehmigung der Wikimedia Foundation verwendet. Wir wurden nicht von der Wikimedia Foundation bestätigt oder sind nicht mit ihr verbunden. + Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Quellcode</a> und <a href=\"https://commons-app.github.io/\">Website</a> auf GitHub. Einen neuen <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-Eintrag</a> für Fehlerberichte und Vorschläge erstellen. <a href=\"//de.wikipedia.org/wiki/Wikipedia:Datenschutz\">Datenschutzrichtlinie</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Danksagungen</a> @@ -118,11 +119,11 @@ Wikimedia Commons speichert die meisten Bilder, die in Wikipedia verwendet werden. Deine Bilder helfen bei der Ausbildung von Menschen auf der ganzen Welt! Bitte lade Bilder hoch, die du völlig selbst aufgenommen oder erstellt hast: - u2022 Natürliche Objekte (Blumen, Tiere, Berge)\nu2022 Nützliche Objekte (Fahrräder, Bahnhöfe)\nu2022 Berühmte Personen (deinen Bürgermeister, olympische Athleten, die du getroffen hast) + - Natürliche Objekte (Blumen, Tiere, Berge)\n- Nützliche Objekte (Fahrräder, Bahnhöfe)\n- Berühmte Personen (deinen Bürgermeister, olympische Athleten, die du getroffen hast) Bitte NICHT hochladen: - u2022 Selfies oder Bilder deiner Freunde\nu2022 Bilder, die du aus dem Internet heruntergeladen hast\nu2022 Screenshots von proprietären Softwareanwendungen + - Selfies oder Bilder deiner Freunde\n- Bilder, die du aus dem Internet heruntergeladen hast\n- Screenshots von proprietären Softwareanwendungen Beispiel-Upload: - u2022 Titel: Opernhaus von Sydney\nu2022 Beschreibung: Opernhaus von Sydney, von der Bucht aus gesehen\nu2022 Kategorien: Opernhaus von Sydney, Opernhaus von Sydney von Westen, Opernhaus von Sydney (Fernansicht) + - Titel: Opernhaus von Sydney\n- Beschreibung: Opernhaus von Sydney, von der Bucht aus gesehen\n- Kategorien: Opernhaus von Sydney, Opernhaus von Sydney von Westen, Opernhaus von Sydney (Fernansicht) Teile deine Bilder. Erwecke Wikipedia-Artikel zum Leben! Die Bilder auf Wikipedia kommen von Wikimedia Commons. Deine Bilder helfen dabei, Menschen auf der ganzen Welt zu bilden. @@ -149,6 +150,9 @@ Beschreibung Hier folgt die Beschreibung des Mediums. Diese kann möglicherweise ziemlich lang sein und erfordert dann einen Umbruch auf mehreren Zeilen. Wir hoffen, dass sie dennoch gut aussieht. Hochgeladen am + Lizenz + Koordinaten + Keine angegeben Beta-Tester werden Melde dich bei unserem Beta-Kanal auf Google Play an und erhalte frühen Zugriff auf neue Funktionen und Fehlerbehebungen Wikidata verwenden @@ -187,7 +191,7 @@ Anleitung Orte in der Nähe können ohne Berechtigung zur Standortbestimmung nicht ermittelt werden Keine Beschreibung gefunden - Commons-Artikel + Commons-Dateiseite Wikidata-Objekt Fehler beim Zwischenspeichern der Bilder diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9d0759fa2..452693303 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -75,7 +75,8 @@ Ajustes Regístrate Acerca de - Programa de código abierto publicado bajo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Licencia Apache ver. 2</a>. Wikimedia Commons y su logotipo son marcas registradas de la Fundación Wikimedia y se utilizan con su permiso. No hemos sido acreditados por la Fundación Wikimedia ni estamos afiliados con ella. + Programa de código abierto publicado bajo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Licencia Apache ver. 2</a>. %1$s y su logotipo son marcas registradas de la Fundación Wikimedia y se utilizan con su permiso. No hemos sido acreditados por la Fundación Wikimedia ni estamos afiliados con ella. + Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Código fuente</a> y <a href=\"https://commons-app.github.io/\">sitio web</a> en GitHub. Crea <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencias</a> para informar de problemas y sugerencias. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Normativa de privacidad</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a> @@ -149,6 +150,9 @@ Descripción Aquí va la descripción del multimedia. Potencialmente, puede ser bastante largo, y deberá agruparse en múltiples líneas. De todas formas, esperamos que se ve bien. Fecha de subida + Licencia + Coordenadas + No se proporcionaron Prueba la versión beta Opta por nuestro canal beta en Google Play y obtén acceso a funcionalidades nuevas y correcciones de errores Utilizar Wikidata @@ -187,6 +191,7 @@ Tutorial Los sitios cercanos no pueden mostrarse sin los permisos de ubicación no se encontró ninguna descripción - Artículo en Commons + Página del archivo en Commons Elemento de Wikidata + Error mientras se guardaban imágenes en la caché diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 81b9a7588..713f4e2c7 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -62,6 +62,7 @@ Eman izena Honi buruz Open Source softwarea <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache v2 Lizentziaren</a> pean egina. Wikimedia Commons eta bere logoa Wikimedia Fundazioaren marka erregistratuak dira eta Wikimedia Fundazioaren baimenarekin erabiltzen dira. Ez gaude Wikimedia Fundaziora afiliatuta. + Wikimedia Commons GitHub-eko <a href=\"https://github.com/commons-app/apps-android-commons\">Iturria</a> eta <a href=\"https://commons-app.github.io/\">webgunea</a>. <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-eko gai</a> berria sortu erroreen berri emateko. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Pribatutasun politika</a> Honi buruz @@ -116,6 +117,9 @@ Izenburua Fitxategiaren izenburua Deskribapena + Lizentzia + Koordenatuak + Ez da eskeini Beta testatzaile bihurtu Wikidata erabili (Erne:hau kentzeak mugikorrak datu asko kontsumitzea ekar dezake) @@ -132,6 +136,7 @@ Ezarpenak Saioa itxi Sarrera - Commons Artikulua + Artxibo orrialde komuna WikiData Artikulua + Argazkiak hartzerakoan sortutako akatsa diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index a85d669a5..213fb6699 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -75,7 +75,8 @@ Asetukset Rekisteröidy Tietoja - Tämä on vapaan lähdekoodin ohjelmisto, joka on julkaistu <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> -lisenssin alaisena. Wikimedia Commons ja sen logo ovat Wikimedia Foundationin tavaramerkkejä ja niitä käytetään Wikimedia Foundationin luvalla. Emme ole hyväksyttyjä tai sidoksissa Wikimedia Foundationioniin. + Tämä on vapaan lähdekoodin ohjelmisto, joka on julkaistu <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> -lisenssin alaisena. Wikimedia Commons ja sen logo ovat Wikimedia Foundationin tavaramerkkejä ja niitä käytetään Wikimedia Foundationin luvalla. Emme ole hyväksyttyjä tai sidoksissa Wikimedia Foundationioniin. + Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Lähde</a> ja <a href=\"https://commons-app.github.io/\">nettisivusto</a> GitHubissa. Luo uusi <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-issue</a> bugiraporteille ja ehdotuksille. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Yksityisyydensuoja</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Tekijät</a> @@ -95,6 +96,7 @@ Nouda nykyinen sijainti asettaaksesi käyttöön luokkaehdotuksia jos kuva ei ole paikkamerkitty Yötila Käytä tummaa teemaa + Nimeä-JaaSamoin 4.0 Nimeä 4.0 Nimeä-JaaSamoin 3.0 Nimeä 3.0 @@ -160,6 +162,6 @@ Asetukset Palaute Kirjaudu ulos - Commons-artikkeli + Commons-artikkeli Wikidata-kohde diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c1e5d8896..9e6ea1e79 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -75,7 +75,8 @@ Paramètres S’inscrire À propos - Les logiciels Open Source sont publiés sous la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licence Apache v2</a>. Wikimédia Commons et son logo sont des marques déposées de la Fondation Wikimédia et sont utilisées avec l’autorisation de la Fondation Wikimédia. Nous ne sommes pas approuvés par ou affiliés à la Fondation Wikimédia. + Les logiciels Open Source sont publiés sous la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licence Apache v2</a>. %1$s et son logo sont des marques déposées de la Fondation Wikimédia qui sont utilisées avec l’autorisation de la Fondation Wikimédia. Nous ne sommes pas approuvés par ou affiliés à la Fondation Wikimédia. + Wikimédia Communs <a href=\"https://github.com/commons-app/apps-android-commons\">Sources</a> et <a href=\"https://commons-app.github.io/\">site web</a> sur GitHub. Créer un nouveau <a href=\"https://github.com/commons-app/apps-android-commons/issues\">signalement GitHub</a> pour signales des bogues ou des suggestions. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Politique de confidentialité</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Remerciements</a> @@ -149,6 +150,9 @@ Description La description du média vient ici. Cela peut être potentiellement assez long, et devra être réparti sur plusieurs lignes. Nous espérons que cela restera joli néanmoins. Date de téléversement + Licence + Coordonnées + Non fourni Devenir un bêta-testeur S’inscrire à notre canal bêta sur Google Play et obtenir un accès anticipé aux nouvelles fonctionnalités et corrections de bogue Utiliser Wikidata @@ -187,6 +191,7 @@ Tutoriel Les endroits proches ne peuvent pas être affichés si vous ne partagez pas votre position géographique. aucune description trouvée - Article de Communs + Page des fichiers de Communs Élément de Wikidata + Erreur en mettant les images en cache diff --git a/app/src/main/res/values-frr/strings.xml b/app/src/main/res/values-frr/strings.xml index ad4f79e51..7bde8ad92 100644 --- a/app/src/main/res/values-frr/strings.xml +++ b/app/src/main/res/values-frr/strings.xml @@ -170,6 +170,6 @@ Iinstelangen Ragmeldang Ufmelde - Commons-artiikel + Commons-artiikel WikiData-artiikel diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 0fb064a95..7a76c3c6c 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -75,7 +75,8 @@ Configuracións Rexistrarse Acerca de - Software de código aberto liberado baixo a <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licenza Apache v2</a>. Wikimedia Commons e o seu logo son marcas rexistradas da Fundación Wikimedia e úsanse coa súa autorización. Non fomos acreditados pola Fundación Wikimedia nin estamos afiliados con ela. + Software de código aberto liberado baixo a <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licenza Apache v2</a>. %1$s e o seu logo son marcas rexistradas da Fundación Wikimedia e úsanse coa súa autorización. Non fomos acreditados pola Fundación Wikimedia nin estamos afiliados con ela. + Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Código fonte</a> e <a href=\"https://commons-app.github.io/\">sitio web</a> en GitHub. Crear unha nova <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia</a> para informar de problemas e suxestións. <a href=\"https://wikimediafoundation.org/wiki/Política_de_protección_de_datos_(gl)\">Política de protección de datos</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a> @@ -149,6 +150,9 @@ Descrición Aquí vai a descrición do ficheiro multimedia. Potencialmente, pode ser bastante longo, e necesitará agruparse en múltiples liñas. De tódolos xeitos esperamos que se vexa ben. Data de suba + Licenza + Coordenadas + Non proporcionado Converterse en beta-tester Siga a nosa canle beta en Google Play e obteña acceso a novas funcionalidades e correccións de erros Usar Wikidata @@ -187,6 +191,7 @@ Titorial Os sitios situados preto non poden visualizarse sen permisos de localización non se atopou descrición - Artigo en Commons + Páxina do ficheiro en Commons Elemento en Wikidata + Erro mentras se gardaban as imaxes na caché diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 3a45d92f1..71f9afd7b 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -75,7 +75,7 @@ Beállítások Regisztráció Névjegy - Nyílt forráskódú szoftver <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> alatt kiadva. A Wikimédia Commons és a logója a Wikimédia Alapítvány védjegyei, és a Wikimédia Alapítvány engedélyével vannak használva. Az alkalmazás fejlesztői nincsenek semmilyen kapcsolatban Wikimédia Alapítvánnyal. + Nyílt forráskódú szoftver <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> alatt kiadva. A Wikimédia Commons és a logója a Wikimédia Alapítvány védjegyei, és a Wikimédia Alapítvány engedélyével vannak használva. Az alkalmazás fejlesztői nincsenek semmilyen kapcsolatban Wikimédia Alapítvánnyal. <a href=\"https://github.com/commons-app/apps-android-commons\">Forráskód</a> és <a href=\"https://commons-app.github.io/\">weboldal</a> a GitHubon. Nyiss egy új <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-problémát</a> hibabejelentéssel vagy fejlesztési javaslattal. <a href=\"https://wikimediafoundation.org/wiki/Adatvédelmi_irányelv\">Adatvédelmi irányelvek</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Köszönetnyilvánítás</a> @@ -177,6 +177,6 @@ Kijelentkezés Bevezető nincs leírás - Commons szócikk + Commons szócikk Wikidata tétel diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 0048678bd..7b58f94c4 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -75,7 +75,8 @@ Impostazioni Registrati Informazioni - Software open source rilasciato con <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licenza Apache v2</a>. Wikimedia Commons ed il suo logo sono marchi registrati della Wikimedia Foundation e sono utilizzati con il permesso della Wikimedia Foundation. Non siamo approvati o affiliati con la Wikimedia Foundation. + Software open source rilasciato con <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licenza Apache v2</a>. %1$s ed il suo logo sono marchi registrati della Wikimedia Foundation e sono utilizzati con il permesso della Wikimedia Foundation. Non siamo approvati o affiliati con la Wikimedia Foundation. + Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Codice sorgente</a> e <a href=\"https://commons-app.github.io/\">sito web</a> su GitHub. Crea una nuova <a href=\"https://github.com/commons-app/apps-android-commons/issues\">segnalazione GitHub</a> per riportare errori e suggerimenti. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Politica sulla privacy</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Crediti</a> @@ -140,6 +141,8 @@ Titolo del file multimediale Descrizione Data di caricamento + Licenza + Coordinate Usa Wikidata Codice 2FA Limite massimo @@ -164,5 +167,6 @@ Esci Tutorial nessuna descrizione trovata + Pagina di Commons del file Elemento Wikidata diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 2018e0774..749b35ab7 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -74,7 +74,7 @@ הגדרות רישום אודות - תכנת קוד פתוח המתפרסמת לפי תנאי <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. השם Wikimedia Commons והסמל שלו הם סימני מסחר של קרן ויקימדיה ומשמשים באישור קרן ויקימדיה. איננו נתמכים על־ידי קרן ויקימדיה או קשורים אליה בשותפות. + תכנת קוד פתוח המתפרסמת לפי תנאי <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. השם %1$s והסמל שמשויך אליו הם סימני מסחר של קרן ויקימדיה ומשמשים באישור קרן ויקימדיה. איננו נתמכים על־ידי קרן ויקימדיה או קשורים אליה בשותפות. <a href=\"https://github.com/commons-app/apps-android-commons\">קוד מקור</a> ו<a href=\"https://commons-app.github.io/\">אתר</a> בגיטהאב. נא ליצור <a href=\"https://github.com/commons-app/apps-android-commons/issues\">דיווח בגיטהאב</a> בשביל באגים והצעות. <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">יוצרים</a> @@ -148,6 +148,9 @@ תיאור תיאור המדיה יהיה כאן. זה יכול להיות ארוך למדי, ולהתפרס על מספר שורות. אנחנו מקווים שזה נראה טוב. תאריך העלאה + רישיון + נקודות ציון + לא סופקו להפוך לבודק בטא להירשם לערוץ הבטא שלנו בחנות גוגל Play ולקבל גישה מוקדמת לאפשרויות חדשות ותיקוני באגים להשתמש בוויקינתונים @@ -183,6 +186,7 @@ מדריך אי־אפשר להציג מקומות בסביבה ללא הרשאות מיקום לא נמצא תיאור + דף קובץ בוויקישיתוף פריט ויקינתונים שגיאה במשירת תמונות במטמון diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index cdd6dbbc3..a5dc309b8 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -67,7 +67,7 @@ 設定 利用者登録 このアプリについて - <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache ライセンス v2</a> のもとで公開されているオープン ソース ソフトウェアです。Wikimedia Commons ならびにそのロゴはウィキメディア財団の商標であり、ウィキメディア財団の許可により使用しています。このサイトはウィキメディア財団の公認3でも提携先でもありません。 + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache ライセンス v2</a> のもとで公開されているオープン ソース ソフトウェアです。Wikimedia Commons ならびにそのロゴはウィキメディア財団の商標であり、ウィキメディア財団の許可により使用しています。このサイトはウィキメディア財団の公認3でも提携先でもありません。 ソースは <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a> にあります。バグとアイディアは <a href=\"https://github.com/commons-app/apps-android-commons/issues\">Github</a> へ。 <a href=\"https://wikimediafoundation.org/wiki/プライバシー・ポリシー\">プライバシー・ポリシー</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">クレジット</a> diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 87bfeaf51..dc719f622 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -165,6 +165,6 @@ Setèlan Pamrayoga Metu log - Artikel Commons + Artikel Commons Wiji Wikidata diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index a7762f304..300d463bf 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -71,7 +71,7 @@ კონფიგურაცია რეგისტრაცია პროგრამის შესახებ - ღია კოდის მქონე აპლიკაცია, ვრცელდება ლიცენზიით <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. ვიკისაწყობი და მისი ლოგო ფონდი ვიკიმედიის სავაჭრო ნიშნებია და ფონდი ვიკიმედიის ნებართვით გამოიყენება. ჩვენ არ ვართ დაკავშირებული ფონდ ვიკიმედიასთან. + ღია კოდის მქონე აპლიკაცია, ვრცელდება ლიცენზიით <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. ვიკისაწყობი და მისი ლოგო ფონდი ვიკიმედიის სავაჭრო ნიშნებია და ფონდი ვიკიმედიის ნებართვით გამოიყენება. ჩვენ არ ვართ დაკავშირებული ფონდ ვიკიმედიასთან. <a href=\"https://github.com/commons-app/apps-android-commons\">წყარო</a> და <a href=\"https://commons-app.github.io/\">საიტი</a> GitHub-ზე. შეცდომის შესატყობინებლად ან წინადადებისათვის შექმენით ახალი <a href=\"https://github.com/commons-app/apps-android-commons/issues\">მოთხოვნა GitHub-ზე</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">კონფიდენციალურობის პოლიტიკა</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">მადლობები</a> @@ -170,6 +170,6 @@ სახელმძღვანელო ახლომდებარე ადგილების ჩვენება მდებარეობის განსაზღვრის ნებართვის გარეშე შეუძლებელია აღწერა ვერ მოიძებნა - ვიკისაწყობის სტატია + ვიკისაწყობის სტატია ვიკიმონაცემების ელემენტი diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 90c3faf50..50b3c9db6 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -75,6 +75,7 @@ 가입하기 정보 오픈 소스 소프트웨어는 <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">아파치 라이선스 v2</a>에 따라 공개됩니다 + 위키미디어 공용 소스 코드는 <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>에 있으며, 버그는<a href=\" https://github.com/commons-app/apps-android-commons/issues\">버그질라</a>에 보고하세요. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy/ko\">개인정보 정책</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">제작진</a> @@ -142,6 +143,9 @@ 미디어 제목 설명 올린 날짜 + 라이선스 + 좌표 + 제공되지 않음 베타 테스터가 되세요 위키데이터 사용 (경고: 이것을 끄면 대량의 모바일 데이터를 소비할 수 있습니다) @@ -178,7 +182,7 @@ 강좌 위치 권한이 없으면 주변 장소를 표시할 수 없습니다 설명이 없습니다 - 공용 문서 + 공용 파일 문서 위키데이터 항목 그림 캐시 처리 오류 diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 4e8146f50..41b1ce975 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -74,7 +74,8 @@ Astellungen Mellt Iech un Iwwer - \'Open-Source-Software\' verëffentlecht ënner der <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache Lizenz v2</a>. Wikimedia Commons a säi Logo si Markenzeeche vun der Wikimedia Foundation a gi mat der Autorisatioun vun der Wikimedia Foundation benotzt. Mir sinn net confirméiert vun oder liéiert mat der Wikimedia Foundation. + \'Open-Source-Software\' verëffentlecht ënner der <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache Lizenz v2</a>. %1$s a säi Logo si Markenzeeche vun der Wikimedia Foundation a gi mat der Autorisatioun vun der Wikimedia Foundation benotzt. Mir sinn net confirméiert vun oder liéiert mat der Wikimedia Foundation. + Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Quell</a> an <a href=\"https://commons-app.github.io/\">Internetsite</a> vu GitHub.\nLeet w.e.g. <a href=\"https://github.com/commons-app/apps-android-commons/issues\"> e GitHub Problem</a> fir Problemer ze mellen a Proposen ze maachen. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Dateschutzerklärung</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Merci</a> @@ -148,6 +149,9 @@ Beschreiwung D\' Beschreiwung vum Medium kënnt hei. Dëst ka méiglecherweis laang sinn a gëtt eventuell op méi Zeile verdeelt. Mir hoffen et gesäit trotzdeem gutt aus. Datum vum Eroplueden + Lizenz + Koordinaten + Keng uginn Beta-Tester ginn Schreift Iech op GooglePlay a fir eise Beta-Kanal a kritt fréi Zougang zu neie Funktiounen a Verbesserunge vu Feeler Wikidata benotzen @@ -182,6 +186,6 @@ Uleedung Plazen nobäi kënnen net gewise ginn ouni Rechter fir d\'Lokalisatioun keng Beschreiwung fonnt - Commons-Artikel + Commons-Fichierssäit Wikidata-Element diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 20743c676..aa7172d91 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -75,7 +75,8 @@ Нагодувања Регистрација За извршникот - Програм со отворен код, издаден под лиценцата <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Апачи вер. 2</a>. ризницата и нејзиното лого се заштитни знаци на Фондацијата Викимедија и се користат со нејзина дозвола. Ние не сме поддржани и поврзани со Фондацијата Викимедија. + Програм со отворен код, издаден под лиценцата <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Апачи вер. 2</a>. %1$s и нејзиното лого се заштитни знаци на Фондацијата Викимедија и се користат со нејзина дозвола. Ние не сме поддржани и поврзани со Фондацијата Викимедија. + Ризницата <a href=\"https://github.com/commons-app/apps-android-commons\">Извор</a> и <a href=\"https://commons-app.github.io/\">мреж. место</a> на GitHub</a>. Создајте нов <a href=\"https://github.com/commons-app/apps-android-commons/issues\">случај на GitHub</a> за пријавување грешки и давање предлози. <a href=\"https://wikimediafoundation.org/wiki/Заштита на личните податоци\">Заштита_на_личните_податоци</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Заслуги</a> @@ -149,6 +150,9 @@ Опис Тука оди описот на податотеката. Ова потенцијално може да биде прилично долго, и ќе треба да се преломи во неколку реда. Се надеваме дека ќе изгледа добро. Датум на подигање + Лиценца + Координати + не се укажани Станете бета-испробувач Пријавете се на нашиот бета-канал на Google Play и добивајте ран пристап до нови можности и исправки на грешки Користи Википодатоци @@ -187,7 +191,7 @@ Упатства Местата во близина не можат да се прикажат без дозволи за местоположба. не најдов описи - Статија на Ризницата + Податотечна страница Предмет на Википодатоците Грешка при меѓускладирање на сликите diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 510fc6367..e1b03ad5d 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -75,7 +75,7 @@ Innstillinger Registrer deg Om - Programvare med åpen kildekode sluppet under <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons og dets logo er varemerker fra Wikimedia Foundation og brukes med tillatelse fra dem. Vi er verken støttet av eller koblet til Wikimedia Foundation. + Programvare med åpen kildekode sluppet under <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons og dets logo er varemerker fra Wikimedia Foundation og brukes med tillatelse fra dem. Vi er verken støttet av eller koblet til Wikimedia Foundation. <a href=\"https://github.com/commons-app/apps-android-commons\">Kildekode</a> og <a href=\"https://commons-app.github.io/\">nettside</a> på GitHub. Opprett en ny <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-sak</a> for feilrapporter og forslag. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Personvernpolicy</a> <a href=\"https://github.com/commons-app/apps-android-comons/blob/master/CREDITS\">Bidragsytere</a> @@ -187,6 +187,6 @@ Veiviser Steder i nærheten kan ikke vises uten tillatelse for stedsbestemmelse ingen beskrivelse funnet - Commons-artikkel + Commons-artikkel Wikidata-element diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ee04c11fa..12af46170 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -155,4 +155,5 @@ Instellingen Terugkoppeling Afmelden + Error tijdens het laden van de afbeeldingen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 9b4dddab2..8109303a2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -73,7 +73,7 @@ Ustawienia Zarejestruj się O aplikacji - Oprogramowanie Open Source, wydane na licencji <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons i jego logo są znakami towarowymi Wikimedia Foundation i są wykorzystywane za zgodą Wikimedia Foundation. Nie jesteśmy powiązani z Wikimedia Foundation. + Oprogramowanie Open Source, wydane na licencji <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons i jego logo są znakami towarowymi Wikimedia Foundation i są wykorzystywane za zgodą Wikimedia Foundation. Nie jesteśmy powiązani z Wikimedia Foundation. <a href=\"https://github.com/commons-app/apps-android-commons\">Kod źródłowy</a> oraz <a href=\"https://commons-app.github.io/\">strona internetowa</a> na GitHub. Aby zgłosić błąd lub sugestię, utwórz nowe <a href=\"https://github.com/commons-app/apps-android-commons/issues\">zgłoszenie na GitHub</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Polityka prywatności</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Twórcy</a> diff --git a/app/src/main/res/values-pms/strings.xml b/app/src/main/res/values-pms/strings.xml index 050449b25..6b031275f 100644 --- a/app/src/main/res/values-pms/strings.xml +++ b/app/src/main/res/values-pms/strings.xml @@ -75,7 +75,8 @@ Paràmeter Marchesse A propòsit - Ij programa Open Source a son publicà sota la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licensa Apache v2</a>. Wikimedia Commons e sò sìmbol a son dle marche argistrà dla Fondassion Wikimedia e a son dovrà con ël përmess ëd la Fondassion Wikimedia. Nojàutri i soma nen aprovà da o afilià a la Fondassion Wikimedia. + Ij programa Open Source a son publicà sota la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licensa Apache v2</a>. %1$s e sò sìmbol a son dle marche argistrà dla Fondassion Wikimedia e a son dovrà con ël përmess ëd la Fondassion Wikimedia. Nojàutri i soma nen aprovà da o afilià a la Fondassion Wikimedia. + Wikimedia Comun <a href=\"https://github.com/commons-app/apps-android-commons\">Sorgiss</a> e <a href=\"https://commons-app.github.io/\">sit an sl\'aragnà</a> su GitHub. Creé na neuva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">signalassion GitHub</a> për signalé dij givo e dij sugeriment. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Régole ëd confidensialità</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Ringrassiament</a> @@ -149,6 +150,9 @@ Descrission La descrission dël mojen a va ambelessì. Sòn a podrìa esse potensialman longh, e a dovrà esse spantià su vàire linie. I speroma comsëssìa ch\'a ven-a grassios. Dàita ëd cariament + Licensa + Coordinà + Nen fornì Dventé në sperimentador Beta Anscriv-se a nòstr canal beta su Google Play a oten-e n\'acess antissipà a le neuve fonsionalità e coression ëd givo Dovré Wikidàit @@ -187,7 +191,7 @@ Cors d\'antrodussion Ij pòst ant j\'anviron a peulo nen esse smonù sensa ij përmess ëd localisassion gnun-a descrission trovà - Artìcol ëd Comun + Pàgina dj\'archivi ëd Comun Element ëd WikiData Eror antramentre ch\'as butavo le plance an memòria local diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 8ff19136f..3b38b8a3f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -24,7 +24,7 @@ carregando arquivo carregando %d arquivos - Meus envios + Meus envios recentes Na fila Falhou %1$d%% concluída @@ -53,9 +53,10 @@ Atualizar O GPS está desligado no seu aparelho. Gostarias de ligá-lo ? GPS inapto. - - Nenhum envio - 1 envio + Ainda não carregado + + \@string/contributions_subtitle_zero + %d envio %d envios @@ -74,10 +75,10 @@ Configurações Criar conta Sobre - Software livre distribuído sob a <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons e seu logotipo são marcas registradas da Wikimedia Foundation e são usadas com a permissão da Wikimedia Foundation. Não somos endossados nem afiliados à Wikimedia Foundation. + Software livre distribuído sob a <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons e seu logotipo são marcas registradas da Wikimedia Foundation e são usadas com a permissão da Wikimedia Foundation. Não somos endossados nem afiliados à Wikimedia Foundation. <a href=\"https://github.com/commons-app/apps-android-commons\">Fonte</a> e <a href=\"https://commons-app.github.io/\">site</a> em GitHub. Crie um novo <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub issue</a> para relatórios de bugs e sugestões. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Política de privacidade</a> - <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CRÉDITOS</a> + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a> Sobre Enviar comentários (por e-mail) Nenhum cliente de e-mail instalado @@ -129,7 +130,7 @@ Você acha que conseguiu? Sim! Categorias - Carregando… + Carregando… Nenhum selecionado Sem descrição Licença desconhecida @@ -153,9 +154,26 @@ Usa Wikidata (Aviso: desabilitar isso pode causar grande consumo de dados móveis) Código 2FA + Meu limite de upload recente + Limite máximo Incapaz de exibir mais de 500. + Definir o limite de carregamento recente Dois fatores de autenticação não são suportados. Quer realmente sair ? + Logotipo do Commons + Imagem de fundo + Falha na imagem de mídia + Nenhuma imagem encontrada + Enviar Imagem + Mount Zao + Llamas + Ponte de Arco-Íris + Tulipa + Sem Selfies + Imagem proprietária + Bem-vindo à Wikipédia + Direitos de autor são bem vindo + Ópera de Sydney Cancelar Abrir Fechar @@ -166,4 +184,10 @@ Configurações Comentários Sair + Tutorial + Os locais próximos não podem ser exibidos sem permissões de localização + Nenhuma descrição encontrada + Artigo de Commons + Item do Wikidata + Erro durante o cache de imagens diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index a32d64b55..eb0684112 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -58,7 +58,8 @@ {{Identical|Settings}} {{Identical|Sign up}} {{Identical|About}} - {{doc-important|The name \"Wikimedia Commons\" is a trademark in English, and in most cases you should not translate that. You should only translate \"Wikimedia Commons\" here, however, if you agree that your translation of \"Wikimedia Commons\" is also registered as trademark in countries which your language is commonly used. This means that, for example, by translating \"Wikimedia Commons\" to Macedonian \"Фондацијата Викимедија\", you agree that \"Фондацијата Викимедија\" is also a trademark in the Republic of Macedonia.}}\n\nLicense and legal notice. + License and legal notice. %1$s is {{msg-wm|Commons-android-strings-trademarked name}} + {{Ignored}}\n\nUsed in {{msg-wm|Commons-android-strings-about license}}\n\n{{Identical|Wikimedia Commons}} {{doc-important|Please make sure that your translation of \"source\" means \"source code\", not \"reference source\".}}\nSource and Bugs HTML fragment linking to Wikimedia\'s privacy policy. Note: avoid percent-encoding in the URL, as this causes problems with Android\'s resource compiler. Use accented/non-ASCII characters \"as is\" if possible. (We can fix it manually, so don\'t worry too much about it.)\n{{Identical|Privacy policy}} {{Identical|Credit}} @@ -97,6 +98,9 @@ {{Identical|No}} {{Identical|Title}} {{Identical|Description}} + {{Identical|License}} + {{Identical|Coordinate}} + Describes \"coordinates\". This is a mountain between Yamagata and Miyagi Prefectures in Japan, see [[d:Q167951]] for details. An animal. See [[:d:Q42569|Wikidata item Q42569]] for a list of possible translations. A bridge in Japan. See [[:d:Q1046736|Wikidata item Q1046736]] for a list of possible translations. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8c9939039..e47aea906 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -79,7 +79,7 @@ Настройки Зарегистрироваться О приложении - Приложение с открытым исходным кодом, выпущено по лицензии <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Викисклад и его логотип являются товарными знаками Фонда Викимедиа и используются с разрешения Фонда Викимедиа. Мы не поддерживаемся и не связаны с Фондом Викимедиа. + Приложение с открытым исходным кодом, выпущено по лицензии <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Викисклад и его логотип являются товарными знаками Фонда Викимедиа и используются с разрешения Фонда Викимедиа. Мы не поддерживаемся и не связаны с Фондом Викимедиа. <a href=\"https://github.com/commons-app/apps-android-commons\">Исходный код</a> и <a href=\"https://commons-app.github.io/\">сайт</a> на GitHub. Создайте новый <a href=\"https://github.com/commons-app/apps-android-commons/issues\">запрос на GitHub</a>, чтоб сообщить об ошибке или внести предложение. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy/ru\">Политика конфиденциальности</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Благодарности</a> @@ -191,7 +191,7 @@ Руководство Ближайшие места не могут быть отображены без разрешения на геолокацию описание не найдено - Статья на Викискладе + Статья на Викискладе Элемент Викиданных Ошибка при кэшировании картинок diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index e59d87719..4d161d896 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -75,7 +75,7 @@ Поставке Отвори налог О апликацији - Софтвер отвореног кода доступан под лиценцом <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache вер. 2</a> Викимедијина Остава и њен лого су заштитни знаци Викимедијине Фондације и користе се са дозволом Викимедијине Фондацине. Ми не одобравамо или подржавмо Викимедијину Фондацију. + Софтвер отвореног кода доступан под лиценцом <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache вер. 2</a> Викимедијина Остава и њен лого су заштитни знаци Викимедијине Фондације и користе се са дозволом Викимедијине Фондацине. Ми не одобравамо или подржавмо Викимедијину Фондацију. <a href=\"https://github.com/commons-app/apps-android-commons\">Изворни кôд</a> и <a href=\"https://commons-app.github.io/\">веб-сајт</a> на GitHub-у. Направите нови <a href=\"https://github.com/commons-app/apps-android-commons/issues\">захтев на GitHub-у</a> да бисте пријавили грешке или дали предлоге. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Политика приватности</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Заслуге</a> @@ -184,6 +184,6 @@ Подешавања Повратне информације Одјави ме - Чланак на Остави + Чланак на Остави Чланак на Википодацима diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 13e0b0931..fc9da0a9d 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -75,7 +75,7 @@ Séting Daptar Ngeunaan - Pakakas lemes kodeu nembrak dirilis di handapeun <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Lisénsi Apache v2</a>. Wikimedia Commons sarta logona téh mérk dagang anu Yayasan Wikimédia ogé dipakéna kudu meunang widi ti Yayasan Wikimédia. Kami teu disatujuan ku atawa digawé bareng jeung Yayasan Wikimédia. + Pakakas lemes kodeu nembrak dirilis di handapeun <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Lisénsi Apache v2</a>. Wikimedia Commons sarta logona téh mérk dagang anu Yayasan Wikimédia ogé dipakéna kudu meunang widi ti Yayasan Wikimédia. Kami teu disatujuan ku atawa digawé bareng jeung Yayasan Wikimédia. <a href=\"https://github.com/commons-app/apps-android-commons\">Sumber</a> sarta <a href=\"https://commons-app.github.io/\">situ wéb</a> dina GitHub. Jieun anyar <a href=\"https://github.com/commons-app/apps-android-commons/issues\">perkara GitHub</a> pikeun saran jeung laporan kutu. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Kawijakan privasi</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Pangajén</a> @@ -187,7 +187,7 @@ Pituduh Tempat sabudeureun teu bisa ditémbongkeun tanpa idin lokasi teu manggihan pedaran - Artikel Common + Artikel Common item Wikidata Kasalahan nalika muat gambar diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index e033133bc..23c051f2e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -75,7 +75,8 @@ Inställningar Registrera Om - Programvara med öppen källkod släppt under <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licensen Apache v2</a>. Wikimedia Commons och dess logotyp är varumärken av Wikimedia Foundation och används med tillstånd från Wikimedia Foundation. Vi varken stöds eller är kopplade med Wikimedia Foundation. + Programvara med öppen källkod släppt under <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licensen Apache v2</a>. %1$s och dess logotyp är varumärken av Wikimedia Foundation och används med tillstånd från Wikimedia Foundation. Vi varken stöds eller är kopplade med Wikimedia Foundation. + Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Källkoden</a> och <a href=\"https://commons-app.github.io/\">webbplatsen</a> på GitHub. Skapa ett nytt <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-ärende</a> för att rapportera buggar och förslag. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Integritetspolicy</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Erkännande</a> @@ -149,6 +150,9 @@ Beskrivning Beskrivningen för mediafilen ska vara här. Den kan vara riktig lång och kommer att behöva sträcka sig över flera rader. Vi hoppas i alla fall att det kommer se bra ut. Uppladdningsdatum + Licens + Koordinater + Inte angivet Bli en betatestare Registrera dig på våra betakanal på Google Play och få tidig åtkomst till nya funktioner och buggfixar Använd Wikidata @@ -187,7 +191,7 @@ Guide Platser i närheten kan inte visas utan platsbehörigheter ingen beskrivning hittades - Commons-artikel + Commons-filsida Wikidata-objekt Fel uppstod när bilder cachelagras diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 57a64218f..49b201474 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -83,7 +83,7 @@ Налаштування Зареєструватися Про програму - Програмне забезпечення з відкритим кодом випущено під <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">ліцензією Apache в.2</a>. Вікісховище і його логотип є товарними знаками Фонду Вікімедіа і використовуються за дозволом Фонду Вікімедіа. Ми не користуємось підтримкою Фонду Вікімедіа і не є його афіліатом. + Програмне забезпечення з відкритим кодом випущено під <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">ліцензією Apache в.2</a>. Вікісховище і його логотип є товарними знаками Фонду Вікімедіа і використовуються за дозволом Фонду Вікімедіа. Ми не користуємось підтримкою Фонду Вікімедіа і не є його афіліатом. <a href=\"https://github.com/commons-app/apps-android-commons\">Вихідний код</a> і <a href=\"https://commons-app.github.io/\">веб-сайт</a> на GitHub. Створіть нове <a href=\"https://github.com/commons-app/apps-android-commons/issues\">завдання на GitHub</a> для повідомлення про баги або для висловлення пропозицій. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Політика приватності</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Автори</a> @@ -195,6 +195,6 @@ Посібник Місця поблизу неможливо показати без дозволу на визначення місця розташування. опис не знайдено - Стаття на Вікісховищі + Стаття на Вікісховищі Елемент Вікіданих diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 494e094f7..714ef04a3 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -61,7 +61,7 @@ Cài đặt Mở tài khoản Giới thiệu - Phần mềm mã nguồn mở được phát hành theo <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Giấy phép Apache v2</a>. Wikimedia Commons và biểu trưng của nó là nhãn hiệu của Quỹ Wikimedia và được sử dụng do Quỹ Wikimedia cho phép. Chúng tôi không được Quỹ Wikimedia ủng hộ hoặc nhận làm chi nhánh. + Phần mềm mã nguồn mở được phát hành theo <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Giấy phép Apache v2</a>. Wikimedia Commons và biểu trưng của nó là nhãn hiệu của Quỹ Wikimedia và được sử dụng do Quỹ Wikimedia cho phép. Chúng tôi không được Quỹ Wikimedia ủng hộ hoặc nhận làm chi nhánh. <a href=\"https://github.com/commons-app/apps-android-commons\">Mã nguồn</a> và <a href=\"https://commons-app.github.io/\">trang chủ</a> tại GitHub. <a href=\"https://github.com/commons-app/apps-android-commons/issues\">Tạo vấn đề GitHub mới</a> để báo cáo lỗi hoặc gợi ý thay đổi. <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CÔNG TRẠNG</a> diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a0c245ccf..9ec84098c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -75,7 +75,8 @@ 設定 註冊 關於 - 以<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache許可證 v2</a>釋放的開放源碼軟體。Wikimedia Commons和其標誌圖像是維基媒體基金會的標記;並在維基媒體基金會的許可下使用。我們並非由維基媒體基金會所認可、也不隸屬於維基媒體基金會。 + 以<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache許可證 v2</a>釋放的開放源碼軟體。%1$s和其標誌圖像是維基媒體基金會的標記;並在維基媒體基金會的許可下使用。我們並非由維基媒體基金會所認可、也不隸屬於維基媒體基金會。 + 維基共享資源 <a href=\"https://github.com/commons-app/apps-android-commons\">原始碼</a>和<a href=\"https://commons-app.github.io/\">網站</a>位於GitHub上。建立一個新的<a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub問題</a>來回報問題和提出建議。 <a href=\"https://meta.wikimedia.org/wiki/Privacy_policy/zh\">隱私政策</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">製作群</a> @@ -149,6 +150,9 @@ 描述 描述使用在此的媒體。若內容可能會很長的話,請斷開換行。我們希望這樣可以讓內容看起來較好些。 上傳日期 + 授權協議 + 座標 + 未提供 成為測試人員 選擇加入我們在 Google Play 上的 beta channel 來早期獲得新功能並修正程式臭蟲 使用維基數據 @@ -187,7 +191,7 @@ 教程 附近地點需要位置權限才可顯示 找不到描述 - 共享資源條目 + 共享資源檔案頁面 維基數據項目 在快取圖片時發生錯誤 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index bb4a5ac8d..4fdc17ebd 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -75,7 +75,8 @@ 设置 注册 关于 - 本开源软件采用<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache许可证第二版</a>授权。Wikimedia Commons及其标志是维基媒体基金会的商标,并在维基媒体基金会的许可下使用。我们并不被维基媒体基金会认可,也不与基金会有任何联系。 + 本开源软件采用<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache许可证第二版</a>授权。%1$s及其标志是维基媒体基金会的商标,并在维基媒体基金会的许可下使用。我们并不被维基媒体基金会认可,也不与基金会有任何联系。 + 维基共享资源 <a href=\"https://github.com/commons-app/apps-android-commons\">源代码</a>和<a href=\"https://commons-app.github.io/\">网站</a>位于GitHub。创建新的<a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub问题</a>以发送错误报告和建议。 <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">隐私政策</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">制作人员</a> @@ -149,6 +150,9 @@ 说明 在此填写媒体的说明。这可能会相当长,并将需要包裹在多行中。我们希望它看起来很好。 上传日期 + 许可协议 + 坐标 + 未提供 成为测试版的测试者 加入我们在Google Play上的测试频道,并更早获取新功能以及错误修复 使用维基数据 @@ -187,7 +191,7 @@ 教程 附近地点不能在没有位置权限的情况下显示 找不到描述 - 共享资源条目 + 共享资源文件页面 维基数据项 缓存图片时出错 From e39f6974810317ece0c0902d5f02477e9d1432e8 Mon Sep 17 00:00:00 2001 From: Mikel Date: Sat, 22 Jul 2017 12:17:23 +0100 Subject: [PATCH 31/40] Fix color of Photo icon --- app/src/main/res/drawable/ic_photo_camera_white_24dp.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/drawable/ic_photo_camera_white_24dp.xml b/app/src/main/res/drawable/ic_photo_camera_white_24dp.xml index c872f1670..4fa7158a0 100644 --- a/app/src/main/res/drawable/ic_photo_camera_white_24dp.xml +++ b/app/src/main/res/drawable/ic_photo_camera_white_24dp.xml @@ -4,9 +4,9 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> From 815255db1a028ea23c6be4186f11488d59a747a4 Mon Sep 17 00:00:00 2001 From: mebr1416 Date: Sat, 22 Jul 2017 16:22:02 +0300 Subject: [PATCH 32/40] Issue 721 --- app/src/main/res/layout/fragment_single_upload.xml | 10 ++++++++++ app/src/main/res/values/strings.xml | 1 + 2 files changed, 11 insertions(+) diff --git a/app/src/main/res/layout/fragment_single_upload.xml b/app/src/main/res/layout/fragment_single_upload.xml index c2e7acc4f..911943116 100644 --- a/app/src/main/res/layout/fragment_single_upload.xml +++ b/app/src/main/res/layout/fragment_single_upload.xml @@ -56,4 +56,14 @@ android:gravity="center" android:layout_marginTop="16dp" /> + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f981902b3..38cb3d5de 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -93,6 +93,7 @@ Tap this message (or hit back) to skip this step. Retry Cancel This image will be licensed under %1$s + By submitting this picture, I declare that this is my own work, that it does not contain copyright material or selfies, and otherwise adheres to <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">Wikimedia Commons policies</a>. Download License Use previous title/description From 9c987efbd2d448ecd5c587e9dcd36201cb81b650 Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Sat, 22 Jul 2017 13:57:46 -0500 Subject: [PATCH 33/40] Swapped the ListView for a RecyclerView, made the fragment cleaner and fixed a whole bunch of code inspection issues. --- .../commons/category/CategoriesAdapter.java | 67 --- .../category/CategoriesAdapterFactory.java | 24 + .../commons/category/CategoriesRenderer.java | 57 ++ .../category/CategorizationFragment.java | 509 +++++++----------- .../free/nrw/commons/category/Category.java | 8 +- .../category/CategoryContentProvider.java | 21 +- .../category/CategoryCountUpdater.java | 59 ++ .../nrw/commons/category/CategoryItem.java | 42 ++ .../nrw/commons/category/MethodAUpdater.java | 6 +- .../category/OnCategoriesSaveHandler.java | 7 + .../nrw/commons/category/PrefixUpdater.java | 16 +- .../nrw/commons/category/TitleCategories.java | 7 +- .../commons/upload/MultipleShareActivity.java | 3 +- .../nrw/commons/upload/ShareActivity.java | 3 +- .../res/layout/fragment_categorization.xml | 2 +- .../res/layout/layout_categories_item.xml | 6 +- 16 files changed, 435 insertions(+), 402 deletions(-) delete mode 100644 app/src/main/java/fr/free/nrw/commons/category/CategoriesAdapter.java create mode 100644 app/src/main/java/fr/free/nrw/commons/category/CategoriesAdapterFactory.java create mode 100644 app/src/main/java/fr/free/nrw/commons/category/CategoriesRenderer.java create mode 100644 app/src/main/java/fr/free/nrw/commons/category/CategoryCountUpdater.java create mode 100644 app/src/main/java/fr/free/nrw/commons/category/CategoryItem.java create mode 100644 app/src/main/java/fr/free/nrw/commons/category/OnCategoriesSaveHandler.java diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoriesAdapter.java b/app/src/main/java/fr/free/nrw/commons/category/CategoriesAdapter.java deleted file mode 100644 index 2c0055c73..000000000 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoriesAdapter.java +++ /dev/null @@ -1,67 +0,0 @@ -package fr.free.nrw.commons.category; - - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.CheckedTextView; - -import java.util.ArrayList; - -import fr.free.nrw.commons.R; - -public class CategoriesAdapter extends BaseAdapter { - - private LayoutInflater mInflater; - - private ArrayList items; - - public CategoriesAdapter(Context context, ArrayList items) { - this.items = items; - mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - } - - @Override - public int getCount() { - return items.size(); - } - - @Override - public Object getItem(int i) { - return items.get(i); - } - - public ArrayList getItems() { - return items; - } - - public void setItems(ArrayList items) { - this.items = items; - } - - @Override - public long getItemId(int i) { - return i; - } - - @Override - public View getView(int i, View view, ViewGroup viewGroup) { - CheckedTextView checkedView; - - if(view == null) { - checkedView = (CheckedTextView) mInflater.inflate(R.layout.layout_categories_item, null); - - } else { - checkedView = (CheckedTextView) view; - } - - CategorizationFragment.CategoryItem item = (CategorizationFragment.CategoryItem) this.getItem(i); - checkedView.setChecked(item.selected); - checkedView.setText(item.name); - checkedView.setTag(i); - - return checkedView; - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoriesAdapterFactory.java b/app/src/main/java/fr/free/nrw/commons/category/CategoriesAdapterFactory.java new file mode 100644 index 000000000..417121c44 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoriesAdapterFactory.java @@ -0,0 +1,24 @@ +package fr.free.nrw.commons.category; + +import com.pedrogomez.renderers.ListAdapteeCollection; +import com.pedrogomez.renderers.RVRendererAdapter; +import com.pedrogomez.renderers.RendererBuilder; + +import java.util.Collections; +import java.util.List; + +class CategoriesAdapterFactory { + private final CategoriesRenderer.CategoryClickedListener listener; + + CategoriesAdapterFactory(CategoriesRenderer.CategoryClickedListener listener) { + this.listener = listener; + } + + public RVRendererAdapter create(List placeList) { + RendererBuilder builder = new RendererBuilder() + .bind(CategoryItem.class, new CategoriesRenderer(listener)); + ListAdapteeCollection collection = new ListAdapteeCollection<>( + placeList != null ? placeList : Collections.emptyList()); + return new RVRendererAdapter<>(builder, collection); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoriesRenderer.java b/app/src/main/java/fr/free/nrw/commons/category/CategoriesRenderer.java new file mode 100644 index 000000000..426b0640e --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoriesRenderer.java @@ -0,0 +1,57 @@ +package fr.free.nrw.commons.category; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckedTextView; + +import com.pedrogomez.renderers.Renderer; + +import butterknife.BindView; +import butterknife.ButterKnife; +import fr.free.nrw.commons.R; + +class CategoriesRenderer extends Renderer { + @BindView(R.id.tvName) CheckedTextView checkedView; + private final CategoryClickedListener listener; + + CategoriesRenderer(CategoryClickedListener listener) { + this.listener = listener; + } + + @Override + protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) { + return layoutInflater.inflate(R.layout.layout_categories_item, viewGroup, false); + } + + @Override + protected void setUpView(View view) { + ButterKnife.bind(this, view); + } + + @Override + protected void hookListeners(View view) { + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CategoryItem item = getContent(); + item.selected = !item.selected; + checkedView.setChecked(item.selected); + if (listener != null) { + listener.categoryClicked(item); + } + } + }); + } + + @Override + public void render() { + CategoryItem item = getContent(); + checkedView.setChecked(item.selected); + checkedView.setText(item.name); + } + + interface CategoryClickedListener { + void categoryClicked(CategoryItem item); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java index 3f467183d..748329ab8 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java @@ -6,12 +6,12 @@ import android.content.SharedPreferences; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; import android.os.RemoteException; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -22,15 +22,14 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.CheckedTextView; import android.widget.EditText; -import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; +import com.pedrogomez.renderers.ListAdapteeCollection; +import com.pedrogomez.renderers.RVRendererAdapter; + import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -40,6 +39,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import butterknife.BindView; +import butterknife.ButterKnife; import fr.free.nrw.commons.R; import fr.free.nrw.commons.upload.MwVolleyApi; import timber.log.Timber; @@ -47,83 +48,180 @@ import timber.log.Timber; /** * Displays the category suggestion and selection screen. Category search is initiated here. */ -public class CategorizationFragment extends Fragment { - public interface OnCategoriesSaveHandler { - void onCategoriesSave(ArrayList categories); - } +public class CategorizationFragment extends Fragment implements CategoriesRenderer.CategoryClickedListener { + public static final int SEARCH_CATS_LIMIT = 25; - ListView categoriesList; - protected EditText categoriesFilter; - ProgressBar categoriesSearchInProgress; - TextView categoriesNotFoundView; - TextView categoriesSkip; - private CategoryTextWatcher textWatcher = new CategoryTextWatcher(); - - CategoriesAdapter categoriesAdapter; - ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2); + @BindView(R.id.categoriesListBox) RecyclerView categoriesList; + @BindView(R.id.categoriesSearchBox) EditText categoriesFilter; + @BindView(R.id.categoriesSearchInProgress) ProgressBar categoriesSearchInProgress; + @BindView(R.id.categoriesNotFound) TextView categoriesNotFoundView; + @BindView(R.id.categoriesExplanation) TextView categoriesSkip; + private RVRendererAdapter categoriesAdapter; private OnCategoriesSaveHandler onCategoriesSaveHandler; - - protected HashMap> categoriesCache; - + private HashMap> categoriesCache; private ArrayList selectedCategories = new ArrayList<>(); - + private ContentProviderClient client; + private PrefixUpdater prefixUpdaterSub; + private MethodAUpdater methodAUpdaterSub; + private final CategoryTextWatcher textWatcher = new CategoryTextWatcher(); + private final CategoriesAdapterFactory adapterFactory = new CategoriesAdapterFactory(this); + private final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2); + private final ArrayList titleCatItems = new ArrayList<>(); + private final CountDownLatch mergeLatch = new CountDownLatch(1); // LHS guarantees ordered insertions, allowing for prioritized method A results private final Set results = new LinkedHashSet<>(); - PrefixUpdater prefixUpdaterSub; - MethodAUpdater methodAUpdaterSub; - private final ArrayList titleCatItems = new ArrayList<>(); - final CountDownLatch mergeLatch = new CountDownLatch(1); + @SuppressWarnings("unchecked") + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_categorization, container, false); + ButterKnife.bind(this, rootView); - private ContentProviderClient client; + categoriesList.setLayoutManager(new LinearLayoutManager(getContext())); - protected final static int SEARCH_CATS_LIMIT = 25; - - public static class CategoryItem implements Parcelable { - public String name; - public boolean selected; - - public static Creator CREATOR = new Creator() { + categoriesSkip.setOnClickListener(new View.OnClickListener() { @Override - public CategoryItem createFromParcel(Parcel parcel) { - return new CategoryItem(parcel); + public void onClick(View view) { + getActivity().onBackPressed(); + getActivity().finish(); } + }); - @Override - public CategoryItem[] newArray(int i) { - return new CategoryItem[0]; - } - }; - - public CategoryItem(String name, boolean selected) { - this.name = name; - this.selected = selected; + ArrayList items; + if (savedInstanceState == null) { + items = new ArrayList<>(); + categoriesCache = new HashMap<>(); + } else { + items = savedInstanceState.getParcelableArrayList("currentCategories"); + categoriesCache = (HashMap>) savedInstanceState.getSerializable("categoriesCache"); } - public CategoryItem(Parcel in) { - name = in.readString(); - selected = in.readInt() == 1; - } + categoriesAdapter = adapterFactory.create(items); + categoriesList.setAdapter(categoriesAdapter); + categoriesFilter.addTextChangedListener(textWatcher); - @Override - public int describeContents() { - return 0; - } + startUpdatingCategoryList(); - @Override - public void writeToParcel(Parcel parcel, int flags) { - parcel.writeString(name); - parcel.writeInt(selected ? 1 : 0); + return rootView; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + menu.clear(); + inflater.inflate(R.menu.fragment_categorization, menu); + } + + @Override + public void onResume() { + super.onResume(); + + View rootView = getView(); + if (rootView != null) { + rootView.setFocusableInTouchMode(true); + rootView.requestFocus(); + rootView.setOnKeyListener(new View.OnKeyListener() { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { + backButtonDialog(); + return true; + } + return false; + } + }); } } + @Override + public void onDestroyView() { + categoriesFilter.removeTextChangedListener(textWatcher); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + client.release(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + int itemCount = categoriesAdapter.getItemCount(); + ArrayList items = new ArrayList<>(itemCount); + for (int i = 0; i < itemCount; i++) { + items.add(categoriesAdapter.getItem(i)); + } + outState.putParcelableArrayList("currentCategories", items); + outState.putSerializable("categoriesCache", categoriesCache); + } + + @Override + public boolean onOptionsItemSelected(MenuItem menuItem) { + switch (menuItem.getItemId()) { + case R.id.menu_save_categories: + + int numberSelected = 0; + + selectedCategories = new ArrayList<>(); + int count = categoriesAdapter.getItemCount(); + for (int i = 0; i < count; i++) { + CategoryItem item = categoriesAdapter.getItem(i); + if (item.selected) { + selectedCategories.add(item.name); + numberSelected++; + } + } + + //If no categories selected, display warning to user + if (numberSelected == 0) { + new AlertDialog.Builder(getActivity()) + .setMessage("Images without categories are rarely usable. Are you sure you want to submit without selecting categories?") + .setTitle("No Categories Selected") + .setPositiveButton("No, go back", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + //Exit menuItem so user can select their categories + } + }) + .setNegativeButton("Yes, submit", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + //Proceed to submission + onCategoriesSaveHandler.onCategoriesSave(selectedCategories); + } + }) + .create() + .show(); + } else { + //Proceed to submission + onCategoriesSaveHandler.onCategoriesSave(selectedCategories); + return true; + } + } + return super.onOptionsItemSelected(menuItem); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + setHasOptionsMenu(true); + onCategoriesSaveHandler = (OnCategoriesSaveHandler) getActivity(); + getActivity().setTitle(R.string.categories_activity_title); + client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY); + } + + public HashMap> getCategoriesCache() { + return categoriesCache; + } + /** * Retrieves category suggestions from title input + * * @return a list containing title-related categories */ - protected ArrayList titleCatQuery() { - + private ArrayList titleCatQuery() { TitleCategories titleCategoriesSub; //Retrieve the title that was saved when user tapped submit icon @@ -157,37 +255,41 @@ public class CategorizationFragment extends Fragment { /** * Retrieves recently-used categories + * * @return a list containing recent categories */ - protected ArrayList recentCatQuery() { + private ArrayList recentCatQuery() { ArrayList items = new ArrayList<>(); - + Cursor cursor = null; try { - Cursor cursor = client.query( + cursor = client.query( CategoryContentProvider.BASE_URI, Category.Table.ALL_FIELDS, null, new String[]{}, Category.Table.COLUMN_LAST_USED + " DESC"); // fixme add a limit on the original query instead of falling out of the loop? - while (cursor.moveToNext() && cursor.getPosition() < SEARCH_CATS_LIMIT) { + while (cursor != null && cursor.moveToNext() + && cursor.getPosition() < SEARCH_CATS_LIMIT) { Category cat = Category.fromCursor(cursor); items.add(cat.getName()); } - cursor.close(); - } - catch (RemoteException e) { + } catch (RemoteException e) { throw new RuntimeException(e); + } finally { + if (cursor != null) { + cursor.close(); + } } return items; } /** * Merges nearby categories, categories suggested based on title, and recent categories... without duplicates. + * * @return a list containing merged categories */ - protected ArrayList mergeItems() { - + ArrayList mergeItems() { Set mergedItems = new LinkedHashSet<>(); Timber.d("Calling APIs for GPS cats, title cats and recent cats..."); @@ -213,7 +315,7 @@ public class CategorizationFragment extends Fragment { Timber.d("Adding title items: %s", titleItems); mergedItems.addAll(recentItems); Timber.d("Adding recent items: %s", recentItems); - + //Needs to be an ArrayList and not a List unless we want to modify a big portion of preexisting code ArrayList mergedItemsList = new ArrayList<>(mergedItems); @@ -223,15 +325,17 @@ public class CategorizationFragment extends Fragment { /** * Displays categories found to the user as they type in the search box + * * @param categories a list of all categories found for the search string - * @param filter the search string + * @param filter the search string */ - protected void setCatsAfterAsync(ArrayList categories, String filter) { - + private void setCatsAfterAsync(ArrayList categories, String filter) { if (getActivity() != null) { ArrayList items = new ArrayList<>(); HashSet existingKeys = new HashSet<>(); - for (CategoryItem item : categoriesAdapter.getItems()) { + int count = categoriesAdapter.getItemCount(); + for (int i = 0; i < count; i++) { + CategoryItem item = categoriesAdapter.getItem(i); if (item.selected) { items.add(item); existingKeys.add(item.name); @@ -243,8 +347,8 @@ public class CategorizationFragment extends Fragment { } } - categoriesAdapter.setItems(items); - categoriesAdapter.notifyDataSetInvalidated(); + categoriesAdapter.setCollection(new ListAdapteeCollection<>(items)); + categoriesAdapter.notifyDataSetChanged(); categoriesSearchInProgress.setVisibility(View.GONE); if (categories.isEmpty()) { @@ -258,8 +362,7 @@ public class CategorizationFragment extends Fragment { } else { categoriesList.smoothScrollToPosition(existingKeys.size()); } - } - else { + } else { Timber.e("Error: Fragment is null"); } } @@ -272,7 +375,6 @@ public class CategorizationFragment extends Fragment { * above Prefix results. */ private void requestSearchResults() { - final CountDownLatch latch = new CountDownLatch(1); prefixUpdaterSub = new PrefixUpdater(this) { @@ -282,8 +384,7 @@ public class CategorizationFragment extends Fragment { try { result = super.doInBackground(); latch.await(); - } - catch (InterruptedException e) { + } catch (InterruptedException e) { Timber.w(e); //Thread.currentThread().interrupt(); } @@ -325,7 +426,6 @@ public class CategorizationFragment extends Fragment { } private void startUpdatingCategoryList() { - if (prefixUpdaterSub != null) { prefixUpdaterSub.cancel(true); } @@ -339,238 +439,41 @@ public class CategorizationFragment extends Fragment { public int getCurrentSelectedCount() { int count = 0; - for(CategoryItem item: categoriesAdapter.getItems()) { - if(item.selected) { + int numberOfItems = categoriesAdapter.getItemCount(); + for (int i = 0; i < numberOfItems; i++) { + CategoryItem item = categoriesAdapter.getItem(i); + if (item.selected) { count++; } } return count; } - private Category lookupCategory(String name) { - Cursor cursor = null; - try { - cursor = client.query( - CategoryContentProvider.BASE_URI, - Category.Table.ALL_FIELDS, - Category.Table.COLUMN_NAME + "=?", - new String[] {name}, - null); - if (cursor.moveToFirst()) { - return Category.fromCursor(cursor); - } - } catch (RemoteException e) { - // This feels lazy, but to hell with checked exceptions. :) - throw new RuntimeException(e); - } finally { - if ( cursor != null ) { - cursor.close(); - } - } - - // Newly used category... - Category cat = new Category(); - cat.setName(name); - cat.setLastUsed(new Date()); - cat.setTimesUsed(0); - return cat; - } - - private class CategoryCountUpdater extends AsyncTask { - - private String name; - - public CategoryCountUpdater(String name) { - this.name = name; - } - - @Override - protected Void doInBackground(Void... voids) { - Category cat = lookupCategory(name); - cat.incTimesUsed(); - - cat.setContentProviderClient(client); - cat.save(); - - return null; // Make the compiler happy. - } - } - - private void updateCategoryCount(String name) { - new CategoryCountUpdater(name).executeOnExecutor(executor); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_categorization, null); - categoriesList = (ListView) rootView.findViewById(R.id.categoriesListBox); - categoriesFilter = (EditText) rootView.findViewById(R.id.categoriesSearchBox); - categoriesSearchInProgress = (ProgressBar) rootView.findViewById(R.id.categoriesSearchInProgress); - categoriesNotFoundView = (TextView) rootView.findViewById(R.id.categoriesNotFound); - categoriesSkip = (TextView) rootView.findViewById(R.id.categoriesExplanation); - - categoriesSkip.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - getActivity().onBackPressed(); - getActivity().finish(); - } - }); - - ArrayList items; - if(savedInstanceState == null) { - items = new ArrayList<>(); - categoriesCache = new HashMap<>(); - } else { - items = savedInstanceState.getParcelableArrayList("currentCategories"); - categoriesCache = (HashMap>) savedInstanceState.getSerializable("categoriesCache"); - } - - categoriesAdapter = new CategoriesAdapter(getActivity(), items); - categoriesList.setAdapter(categoriesAdapter); - - categoriesList.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int index, long id) { - CheckedTextView checkedView = (CheckedTextView) view; - CategoryItem item = (CategoryItem) adapterView.getAdapter().getItem(index); - item.selected = !item.selected; - checkedView.setChecked(item.selected); - if (item.selected) { - updateCategoryCount(item.name); - } - } - }); - - categoriesFilter.addTextChangedListener(textWatcher); - - startUpdatingCategoryList(); - - return rootView; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - menu.clear(); - inflater.inflate(R.menu.fragment_categorization, menu); - } - - @Override - public void onResume() { - super.onResume(); - - View rootView = getView(); - if (rootView != null) { - rootView.setFocusableInTouchMode(true); - rootView.requestFocus(); - rootView.setOnKeyListener(new View.OnKeyListener() { - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { - backButtonDialog(); - return true; - } - return false; - } - }); - } - } - - @Override - public void onDestroyView() { - categoriesFilter.removeTextChangedListener(textWatcher); - super.onDestroyView(); - } - public void backButtonDialog() { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - - builder.setMessage("Are you sure you want to go back? The image will not have any categories saved.") - .setTitle("Warning"); - builder.setPositiveButton("No", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - //No need to do anything, user remains on categorization screen - } - }); - builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - getActivity().finish(); - } - }); - - AlertDialog dialog = builder.create(); - dialog.show(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - client.release(); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putParcelableArrayList("currentCategories", categoriesAdapter.getItems()); - outState.putSerializable("categoriesCache", categoriesCache); - } - - @Override - public boolean onOptionsItemSelected(MenuItem menuItem) { - switch(menuItem.getItemId()) { - case R.id.menu_save_categories: - - int numberSelected = 0; - - for(CategoryItem item: categoriesAdapter.getItems()) { - if(item.selected) { - selectedCategories.add(item.name); - numberSelected++; + new AlertDialog.Builder(getActivity()) + .setMessage("Are you sure you want to go back? The image will not have any categories saved.") + .setTitle("Warning") + .setPositiveButton("No", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + //No need to do anything, user remains on categorization screen } - } - - //If no categories selected, display warning to user - if (numberSelected == 0) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - - builder.setMessage("Images without categories are rarely usable. Are you sure you want to submit without selecting categories?") - .setTitle("No Categories Selected"); - builder.setPositiveButton("No, go back", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - //Exit menuItem so user can select their categories - return; - } - }); - builder.setNegativeButton("Yes, submit", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - //Proceed to submission - onCategoriesSaveHandler.onCategoriesSave(selectedCategories); - return; - } - }); - - AlertDialog dialog = builder.create(); - dialog.show(); - } else { - //Proceed to submission - onCategoriesSaveHandler.onCategoriesSave(selectedCategories); - return true; - } - } - return super.onOptionsItemSelected(menuItem); + }) + .setNegativeButton("Yes", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + getActivity().finish(); + } + }) + .create() + .show(); } @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - setHasOptionsMenu(true); - onCategoriesSaveHandler = (OnCategoriesSaveHandler) getActivity(); - getActivity().setTitle(R.string.categories_activity_title); - client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY); + public void categoryClicked(CategoryItem item) { + if (item.selected) { + new CategoryCountUpdater(item.name, client).executeOnExecutor(executor); + } } private class CategoryTextWatcher implements TextWatcher { diff --git a/app/src/main/java/fr/free/nrw/commons/category/Category.java b/app/src/main/java/fr/free/nrw/commons/category/Category.java index 9cb8d001e..68dd9200e 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/Category.java +++ b/app/src/main/java/fr/free/nrw/commons/category/Category.java @@ -26,7 +26,7 @@ public class Category { this.name = name; } - public Date getLastUsed() { + private Date getLastUsed() { // warning: Date objects are mutable. return (Date)lastUsed.clone(); } @@ -36,11 +36,11 @@ public class Category { this.lastUsed = (Date)lastUsed.clone(); } - public void touch() { + private void touch() { lastUsed = new Date(); } - public int getTimesUsed() { + private int getTimesUsed() { return timesUsed; } @@ -70,7 +70,7 @@ public class Category { } } - public ContentValues toContentValues() { + private ContentValues toContentValues() { ContentValues cv = new ContentValues(); cv.put(Table.COLUMN_NAME, getName()); cv.put(Table.COLUMN_LAST_USED, getLastUsed().getTime()); diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java index de157265b..b7bc96ab2 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java @@ -7,6 +7,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; +import android.support.annotation.NonNull; import android.text.TextUtils; import fr.free.nrw.commons.CommonsApplication; @@ -41,8 +42,9 @@ public class CategoryContentProvider extends ContentProvider { return false; } + @SuppressWarnings("ConstantConditions") @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables(Category.Table.TABLE_NAME); @@ -75,15 +77,16 @@ public class CategoryContentProvider extends ContentProvider { } @Override - public String getType(Uri uri) { + public String getType(@NonNull Uri uri) { return null; } + @SuppressWarnings("ConstantConditions") @Override - public Uri insert(Uri uri, ContentValues contentValues) { + public Uri insert(@NonNull Uri uri, ContentValues contentValues) { int uriType = uriMatcher.match(uri); SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); - long id = 0; + long id; switch (uriType) { case CATEGORIES: id = sqlDB.insert(Category.Table.TABLE_NAME, null, contentValues); @@ -96,12 +99,13 @@ public class CategoryContentProvider extends ContentProvider { } @Override - public int delete(Uri uri, String s, String[] strings) { + public int delete(@NonNull Uri uri, String s, String[] strings) { return 0; } + @SuppressWarnings("ConstantConditions") @Override - public int bulkInsert(Uri uri, ContentValues[] values) { + public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) { Timber.d("Hello, bulk insert! (CategoryContentProvider)"); int uriType = uriMatcher.match(uri); SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); @@ -122,8 +126,9 @@ public class CategoryContentProvider extends ContentProvider { return values.length; } + @SuppressWarnings("ConstantConditions") @Override - public int update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) { + public int update(@NonNull Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) { /* SQL Injection warnings: First, note that we're not exposing this to the outside world (exported="false") Even then, we should make sure to sanitize all user input appropriately. Input that passes through ContentValues @@ -133,7 +138,7 @@ public class CategoryContentProvider extends ContentProvider { */ int uriType = uriMatcher.match(uri); SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); - int rowsUpdated = 0; + int rowsUpdated; switch (uriType) { case CATEGORIES_ID: int id = Integer.valueOf(uri.getLastPathSegment()); diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryCountUpdater.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryCountUpdater.java new file mode 100644 index 000000000..bebbc03a8 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryCountUpdater.java @@ -0,0 +1,59 @@ +package fr.free.nrw.commons.category; + +import android.content.ContentProviderClient; +import android.database.Cursor; +import android.os.AsyncTask; +import android.os.RemoteException; + +import java.util.Date; + +class CategoryCountUpdater extends AsyncTask { + + private final String name; + private final ContentProviderClient client; + + CategoryCountUpdater(String name, ContentProviderClient client) { + this.name = name; + this.client = client; + } + + @Override + protected Void doInBackground(Void... voids) { + Category cat = lookupCategory(name); + cat.incTimesUsed(); + + cat.setContentProviderClient(client); + cat.save(); + + return null; // Make the compiler happy. + } + + private Category lookupCategory(String name) { + Cursor cursor = null; + try { + cursor = client.query( + CategoryContentProvider.BASE_URI, + Category.Table.ALL_FIELDS, + Category.Table.COLUMN_NAME + "=?", + new String[]{name}, + null); + if (cursor != null && cursor.moveToFirst()) { + return Category.fromCursor(cursor); + } + } catch (RemoteException e) { + // This feels lazy, but to hell with checked exceptions. :) + throw new RuntimeException(e); + } finally { + if (cursor != null) { + cursor.close(); + } + } + + // Newly used category... + Category cat = new Category(); + cat.setName(name); + cat.setLastUsed(new Date()); + cat.setTimesUsed(0); + return cat; + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.java new file mode 100644 index 000000000..7198b6207 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.java @@ -0,0 +1,42 @@ +package fr.free.nrw.commons.category; + +import android.os.Parcel; +import android.os.Parcelable; + +class CategoryItem implements Parcelable { + public final String name; + public boolean selected; + + public static Creator CREATOR = new Creator() { + @Override + public CategoryItem createFromParcel(Parcel parcel) { + return new CategoryItem(parcel); + } + + @Override + public CategoryItem[] newArray(int i) { + return new CategoryItem[0]; + } + }; + + CategoryItem(String name, boolean selected) { + this.name = name; + this.selected = selected; + } + + private CategoryItem(Parcel in) { + name = in.readString(); + selected = in.readInt() == 1; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeString(name); + parcel.writeInt(selected ? 1 : 0); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java b/app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java index 326f85ee3..72b1f5732 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java +++ b/app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java @@ -13,6 +13,8 @@ import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; +import static fr.free.nrw.commons.category.CategorizationFragment.SEARCH_CATS_LIMIT; + /** * Sends asynchronous queries to the Commons MediaWiki API to retrieve categories that are close to * the keyword typed in by the user. The 'srsearch' action-specific parameter is used for this @@ -20,8 +22,8 @@ import timber.log.Timber; */ class MethodAUpdater extends AsyncTask> { + private final CategorizationFragment catFragment; private String filter; - private CategorizationFragment catFragment; MethodAUpdater(CategorizationFragment catFragment) { this.catFragment = catFragment; @@ -84,7 +86,7 @@ class MethodAUpdater extends AsyncTask> { //URL https://commons.wikimedia.org/w/api.php?action=query&format=xml&list=search&srwhat=text&srenablerewrites=1&srnamespace=14&srlimit=10&srsearch= try { - categories = api.searchCategories(CategorizationFragment.SEARCH_CATS_LIMIT, filter); + categories = api.searchCategories(SEARCH_CATS_LIMIT, filter); Timber.d("Method A URL filter %s", categories); } catch (IOException e) { Timber.e(e, "IO Exception: "); diff --git a/app/src/main/java/fr/free/nrw/commons/category/OnCategoriesSaveHandler.java b/app/src/main/java/fr/free/nrw/commons/category/OnCategoriesSaveHandler.java new file mode 100644 index 000000000..a7ae0bfed --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/category/OnCategoriesSaveHandler.java @@ -0,0 +1,7 @@ +package fr.free.nrw.commons.category; + +import java.util.ArrayList; + +public interface OnCategoriesSaveHandler { + void onCategoriesSave(ArrayList categories); +} diff --git a/app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java b/app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java index 773f758d0..7df56eff5 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java +++ b/app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java @@ -7,6 +7,7 @@ import android.view.View; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; +import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -14,18 +15,20 @@ import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; +import static fr.free.nrw.commons.category.CategorizationFragment.SEARCH_CATS_LIMIT; + /** * Sends asynchronous queries to the Commons MediaWiki API to retrieve categories that share the * same prefix as the keyword typed in by the user. The 'acprefix' action-specific parameter is used * for this purpose. This class should be subclassed in CategorizationFragment.java to aggregate * the results. */ -public class PrefixUpdater extends AsyncTask> { +class PrefixUpdater extends AsyncTask> { + private final CategorizationFragment catFragment; private String filter; - private CategorizationFragment catFragment; - public PrefixUpdater(CategorizationFragment catFragment) { + PrefixUpdater(CategorizationFragment catFragment) { this.catFragment = catFragment; } @@ -90,8 +93,9 @@ public class PrefixUpdater extends AsyncTask> { } //if user types in something that is in cache, return cached category - if (catFragment.categoriesCache.containsKey(filter)) { - ArrayList cachedItems = new ArrayList<>(catFragment.categoriesCache.get(filter)); + HashMap> categoriesCache = catFragment.getCategoriesCache(); + if (categoriesCache.containsKey(filter)) { + ArrayList cachedItems = new ArrayList<>(categoriesCache.get(filter)); Timber.d("Found cache items, waiting for filter"); return new ArrayList<>(filterIrrelevantResults(cachedItems)); } @@ -101,7 +105,7 @@ public class PrefixUpdater extends AsyncTask> { MediaWikiApi api = CommonsApplication.getInstance().getMWApi(); List categories = new ArrayList<>(); try { - categories = api.allCategories(CategorizationFragment.SEARCH_CATS_LIMIT, this.filter); + categories = api.allCategories(SEARCH_CATS_LIMIT, this.filter); Timber.d("Prefix URL filter %s", categories); } catch (IOException e) { Timber.e(e, "IO Exception: "); diff --git a/app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java b/app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java index 414c87e8a..a4a94cf1d 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java +++ b/app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java @@ -19,17 +19,12 @@ class TitleCategories extends AsyncTask> { private final static int SEARCH_CATS_LIMIT = 25; - private String title; + private final String title; TitleCategories(String title) { this.title = title; } - @Override - protected void onPreExecute() { - super.onPreExecute(); - } - @Override protected List doInBackground(Void... voids) { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java index d7c807777..69a61cdfb 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java @@ -28,6 +28,7 @@ import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.AuthenticatedActivity; import fr.free.nrw.commons.category.CategorizationFragment; +import fr.free.nrw.commons.category.OnCategoriesSaveHandler; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.media.MediaDetailPagerFragment; import fr.free.nrw.commons.modifications.CategoryModifier; @@ -43,7 +44,7 @@ public class MultipleShareActivity AdapterView.OnItemClickListener, FragmentManager.OnBackStackChangedListener, MultipleUploadListFragment.OnMultipleUploadInitiatedHandler, - CategorizationFragment.OnCategoriesSaveHandler { + OnCategoriesSaveHandler { private CommonsApplication app; private ArrayList photosList = null; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index 7b9111841..95d091006 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -36,6 +36,7 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.auth.AuthenticatedActivity; import fr.free.nrw.commons.category.CategorizationFragment; +import fr.free.nrw.commons.category.OnCategoriesSaveHandler; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.modifications.CategoryModifier; import fr.free.nrw.commons.modifications.ModificationsContentProvider; @@ -51,7 +52,7 @@ import timber.log.Timber; public class ShareActivity extends AuthenticatedActivity implements SingleUploadFragment.OnUploadActionInitiated, - CategorizationFragment.OnCategoriesSaveHandler { + OnCategoriesSaveHandler { private static final int REQUEST_PERM_ON_CREATE_STORAGE = 1; private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2; diff --git a/app/src/main/res/layout/fragment_categorization.xml b/app/src/main/res/layout/fragment_categorization.xml index a0b9b3c2f..83a8a746a 100644 --- a/app/src/main/res/layout/fragment_categorization.xml +++ b/app/src/main/res/layout/fragment_categorization.xml @@ -60,7 +60,7 @@ android:visibility="gone" /> - + android:padding="4dp" + android:theme="@style/DarkAppTheme"> \ No newline at end of file From eaffed24719e629cf17755f8e7093bddf5ed4adb Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Sat, 22 Jul 2017 14:12:35 -0500 Subject: [PATCH 34/40] Changes suggested by Codacy --- .../commons/category/CategoriesRenderer.java | 8 ++-- .../category/CategorizationFragment.java | 44 ++++++++++++------- .../category/CategoryContentProvider.java | 12 +++-- .../nrw/commons/category/CategoryItem.java | 16 ++++++- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoriesRenderer.java b/app/src/main/java/fr/free/nrw/commons/category/CategoriesRenderer.java index 426b0640e..a138736cc 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoriesRenderer.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoriesRenderer.java @@ -35,8 +35,8 @@ class CategoriesRenderer extends Renderer { @Override public void onClick(View v) { CategoryItem item = getContent(); - item.selected = !item.selected; - checkedView.setChecked(item.selected); + item.setSelected(!item.isSelected()); + checkedView.setChecked(item.isSelected()); if (listener != null) { listener.categoryClicked(item); } @@ -47,8 +47,8 @@ class CategoriesRenderer extends Renderer { @Override public void render() { CategoryItem item = getContent(); - checkedView.setChecked(item.selected); - checkedView.setText(item.name); + checkedView.setChecked(item.isSelected()); + checkedView.setText(item.getName()); } interface CategoryClickedListener { diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java index 748329ab8..15f1c8e1e 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java @@ -42,13 +42,18 @@ import java.util.concurrent.TimeUnit; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.category.CategoriesRenderer.CategoryClickedListener; import fr.free.nrw.commons.upload.MwVolleyApi; import timber.log.Timber; +import static android.view.KeyEvent.ACTION_UP; +import static android.view.KeyEvent.KEYCODE_BACK; +import static fr.free.nrw.commons.category.CategoryContentProvider.AUTHORITY; + /** * Displays the category suggestion and selection screen. Category search is initiated here. */ -public class CategorizationFragment extends Fragment implements CategoriesRenderer.CategoryClickedListener { +public class CategorizationFragment extends Fragment implements CategoryClickedListener { public static final int SEARCH_CATS_LIMIT = 25; @BindView(R.id.categoriesListBox) RecyclerView categoriesList; @@ -74,7 +79,8 @@ public class CategorizationFragment extends Fragment implements CategoriesRender @SuppressWarnings("unchecked") @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_categorization, container, false); ButterKnife.bind(this, rootView); @@ -94,7 +100,8 @@ public class CategorizationFragment extends Fragment implements CategoriesRender categoriesCache = new HashMap<>(); } else { items = savedInstanceState.getParcelableArrayList("currentCategories"); - categoriesCache = (HashMap>) savedInstanceState.getSerializable("categoriesCache"); + categoriesCache = (HashMap>) savedInstanceState + .getSerializable("categoriesCache"); } categoriesAdapter = adapterFactory.create(items); @@ -123,7 +130,7 @@ public class CategorizationFragment extends Fragment implements CategoriesRender rootView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { + if (event.getAction() == ACTION_UP && keyCode == KEYCODE_BACK) { backButtonDialog(); return true; } @@ -168,8 +175,8 @@ public class CategorizationFragment extends Fragment implements CategoriesRender int count = categoriesAdapter.getItemCount(); for (int i = 0; i < count; i++) { CategoryItem item = categoriesAdapter.getItem(i); - if (item.selected) { - selectedCategories.add(item.name); + if (item.isSelected()) { + selectedCategories.add(item.getName()); numberSelected++; } } @@ -177,7 +184,9 @@ public class CategorizationFragment extends Fragment implements CategoriesRender //If no categories selected, display warning to user if (numberSelected == 0) { new AlertDialog.Builder(getActivity()) - .setMessage("Images without categories are rarely usable. Are you sure you want to submit without selecting categories?") + .setMessage("Images without categories are rarely usable. " + + "Are you sure you want to submit without selecting " + + "categories?") .setTitle("No Categories Selected") .setPositiveButton("No, go back", new DialogInterface.OnClickListener() { @Override @@ -209,7 +218,7 @@ public class CategorizationFragment extends Fragment implements CategoriesRender setHasOptionsMenu(true); onCategoriesSaveHandler = (OnCategoriesSaveHandler) getActivity(); getActivity().setTitle(R.string.categories_activity_title); - client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY); + client = getActivity().getContentResolver().acquireContentProviderClient(AUTHORITY); } public HashMap> getCategoriesCache() { @@ -285,7 +294,8 @@ public class CategorizationFragment extends Fragment implements CategoriesRender } /** - * Merges nearby categories, categories suggested based on title, and recent categories... without duplicates. + * Merges nearby categories, categories suggested based on title, and recent categories... + * without duplicates. * * @return a list containing merged categories */ @@ -316,7 +326,8 @@ public class CategorizationFragment extends Fragment implements CategoriesRender mergedItems.addAll(recentItems); Timber.d("Adding recent items: %s", recentItems); - //Needs to be an ArrayList and not a List unless we want to modify a big portion of preexisting code + // Needs to be an ArrayList and not a List unless we want to modify a big portion + // of preexisting code ArrayList mergedItemsList = new ArrayList<>(mergedItems); Timber.d("Merged item list: %s", mergedItemsList); @@ -336,9 +347,9 @@ public class CategorizationFragment extends Fragment implements CategoriesRender int count = categoriesAdapter.getItemCount(); for (int i = 0; i < count; i++) { CategoryItem item = categoriesAdapter.getItem(i); - if (item.selected) { + if (item.isSelected()) { items.add(item); - existingKeys.add(item.name); + existingKeys.add(item.getName()); } } for (String category : categories) { @@ -442,7 +453,7 @@ public class CategorizationFragment extends Fragment implements CategoriesRender int numberOfItems = categoriesAdapter.getItemCount(); for (int i = 0; i < numberOfItems; i++) { CategoryItem item = categoriesAdapter.getItem(i); - if (item.selected) { + if (item.isSelected()) { count++; } } @@ -451,7 +462,8 @@ public class CategorizationFragment extends Fragment implements CategoriesRender public void backButtonDialog() { new AlertDialog.Builder(getActivity()) - .setMessage("Are you sure you want to go back? The image will not have any categories saved.") + .setMessage("Are you sure you want to go back? The image will not " + + "have any categories saved.") .setTitle("Warning") .setPositiveButton("No", new DialogInterface.OnClickListener() { @Override @@ -471,8 +483,8 @@ public class CategorizationFragment extends Fragment implements CategoriesRender @Override public void categoryClicked(CategoryItem item) { - if (item.selected) { - new CategoryCountUpdater(item.name, client).executeOnExecutor(executor); + if (item.isSelected()) { + new CategoryCountUpdater(item.getName(), client).executeOnExecutor(executor); } } diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java index b7bc96ab2..c95e17cf6 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java @@ -44,7 +44,8 @@ public class CategoryContentProvider extends ContentProvider { @SuppressWarnings("ConstantConditions") @Override - public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + public Cursor query(@NonNull Uri uri, String[] projection, String selection, + String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables(Category.Table.TABLE_NAME); @@ -55,7 +56,8 @@ public class CategoryContentProvider extends ContentProvider { switch(uriType) { case CATEGORIES: - cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); + cursor = queryBuilder.query(db, projection, selection, selectionArgs, + null, null, sortOrder); break; case CATEGORIES_ID: cursor = queryBuilder.query(db, @@ -128,7 +130,8 @@ public class CategoryContentProvider extends ContentProvider { @SuppressWarnings("ConstantConditions") @Override - public int update(@NonNull Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) { + public int update(@NonNull Uri uri, ContentValues contentValues, String selection, + String[] selectionArgs) { /* SQL Injection warnings: First, note that we're not exposing this to the outside world (exported="false") Even then, we should make sure to sanitize all user input appropriately. Input that passes through ContentValues @@ -149,7 +152,8 @@ public class CategoryContentProvider extends ContentProvider { Category.Table.COLUMN_ID + " = ?", new String[] { String.valueOf(id) } ); } else { - throw new IllegalArgumentException("Parameter `selection` should be empty when updating an ID"); + throw new IllegalArgumentException( + "Parameter `selection` should be empty when updating an ID"); } break; default: diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.java index 7198b6207..1063979ad 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryItem.java @@ -4,8 +4,8 @@ import android.os.Parcel; import android.os.Parcelable; class CategoryItem implements Parcelable { - public final String name; - public boolean selected; + private final String name; + private boolean selected; public static Creator CREATOR = new Creator() { @Override @@ -29,6 +29,18 @@ class CategoryItem implements Parcelable { selected = in.readInt() == 1; } + public String getName() { + return name; + } + + public boolean isSelected() { + return selected; + } + + public void setSelected(boolean selected) { + this.selected = selected; + } + @Override public int describeContents() { return 0; From 3824f31ef9cb1788ae5026880a51aa14cc7ad86c Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Sat, 22 Jul 2017 17:46:53 -0500 Subject: [PATCH 35/40] Added Retrolambda and set the language level to JavaVersion.VERSION_1_8 --- app/build.gradle | 6 ++++++ build.gradle | 1 + 2 files changed, 7 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 197e6b4d9..f400c035a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.application' +apply plugin: 'me.tatarka.retrolambda' apply plugin: 'jacoco-android' apply from: 'quality.gradle' apply plugin: 'com.getkeepsafe.dexcount' @@ -75,6 +76,11 @@ android { abortOnError false } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + //FIXME: Temporary fix for https://github.com/commons-app/apps-android-commons/issues/709 configurations.all { resolutionStrategy.force 'com.android.support:support-annotations:25.2.0' diff --git a/build.gradle b/build.gradle index 4929fec36..ebdb2fa23 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,7 @@ buildscript { classpath "com.android.tools.build:gradle:${project.gradleVersion}" classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1' classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.7.1' + classpath 'me.tatarka:gradle-retrolambda:3.6.1' } } From 4796557fb77a2f65318c3aca745bd361f91f59ad Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Sat, 22 Jul 2017 18:04:40 -0500 Subject: [PATCH 36/40] Made a pass through the code to introduce lambdas / method references in the places the Android Studio suggested. --- .../free/nrw/commons/CommonsApplication.java | 4 +- .../fr/free/nrw/commons/WelcomeActivity.java | 7 +- .../free/nrw/commons/auth/LoginActivity.java | 40 ++++------- .../category/CategorizationFragment.java | 71 ++++++------------- .../BackgroundPoolExceptionHandler.java | 7 +- .../concurrency/ThreadFactoryMaker.java | 14 ++-- .../ContributionsListFragment.java | 19 ++--- .../contributions/UploadCountClient.java | 41 +++++------ .../commons/media/MediaDetailFragment.java | 22 ++---- .../media/MediaDetailPagerFragment.java | 29 +++----- .../mwapi/ApacheHttpClientMediaWikiApi.java | 7 +- .../nrw/commons/nearby/NearbyActivity.java | 49 +++++-------- .../nrw/commons/nearby/NearbyController.java | 11 ++- .../nrw/commons/nearby/NearbyInfoDialog.java | 9 +-- .../commons/nearby/NearbyListFragment.java | 7 +- .../nrw/commons/nearby/NearbyMapFragment.java | 28 +++----- .../nrw/commons/nearby/PlaceRenderer.java | 12 +--- .../commons/settings/SettingsFragment.java | 67 +++++++---------- .../commons/theme/NavigationBaseActivity.java | 35 +++------ .../nrw/commons/upload/ExistingFileAsync.java | 20 ++---- .../commons/upload/MultipleShareActivity.java | 23 +++--- .../free/nrw/commons/upload/MwVolleyApi.java | 2 +- .../nrw/commons/upload/ShareActivity.java | 39 ++++------ .../free/nrw/commons/utils/ExecutorUtils.java | 13 ++-- .../fr/free/nrw/commons/utils/FileUtils.java | 4 +- 25 files changed, 206 insertions(+), 374 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 b78bfdc6f..2af125032 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -197,8 +197,8 @@ public class CommonsApplication extends Application { AccountManager accountManager = AccountManager.get(this); Account[] allAccounts = accountManager.getAccountsByType(AccountUtil.accountType()); - for (int index = 0; index < allAccounts.length; index++) { - accountManager.removeAccount(allAccounts[index], null, null); + for (Account allAccount : allAccounts) { + accountManager.removeAccount(allAccount, null, null); } //TODO: fix preference manager diff --git a/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java b/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java index e35c7e6d0..f6c5999e9 100644 --- a/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java @@ -27,12 +27,7 @@ public class WelcomeActivity extends BaseActivity { pager.setAdapter(adapter); indicator.setViewPager(pager); - adapter.setCallback(new WelcomePagerAdapter.Callback() { - @Override - public void onYesClicked() { - finish(); - } - }); + adapter.setCallback(this::finish); } @Override diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java index 9d9f021ea..aca419b9c 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java @@ -26,6 +26,9 @@ import fr.free.nrw.commons.PageTitle; import fr.free.nrw.commons.contributions.ContributionsActivity; import timber.log.Timber; +import static android.view.KeyEvent.KEYCODE_ENTER; +import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE; + public class LoginActivity extends AccountAuthenticatorActivity { @@ -63,18 +66,8 @@ public class LoginActivity extends AccountAuthenticatorActivity { twoFactorEdit.addTextChangedListener(textWatcher); passwordEdit.setOnEditorActionListener(newLoginInputActionListener()); - loginButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - performLogin(); - } - }); - signupButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - signUp(v); - } - }); + loginButton.setOnClickListener(this::performLogin); + signupButton.setOnClickListener(this::signUp); } private class LoginTextWatcher implements TextWatcher { @@ -98,20 +91,17 @@ public class LoginActivity extends AccountAuthenticatorActivity { } private TextView.OnEditorActionListener newLoginInputActionListener() { - return new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { - if (loginButton.isEnabled()) { - if (actionId == EditorInfo.IME_ACTION_DONE) { - performLogin(); - return true; - } else if ((keyEvent != null) && keyEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER) { - performLogin(); - return true; - } + return (textView, actionId, keyEvent) -> { + if (loginButton.isEnabled()) { + if (actionId == IME_ACTION_DONE) { + performLogin(textView); + return true; + } else if ((keyEvent != null) && keyEvent.getKeyCode() == KEYCODE_ENTER) { + performLogin(textView); + return true; } - return false; } + return false; }; } @@ -142,7 +132,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { super.onDestroy(); } - private void performLogin() { + private void performLogin(View view) { Timber.d("Login to start!"); LoginTask task = getLoginTask(); task.execute(); diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java index 3f467183d..d2d9f317f 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java @@ -409,12 +409,9 @@ public class CategorizationFragment extends Fragment { categoriesNotFoundView = (TextView) rootView.findViewById(R.id.categoriesNotFound); categoriesSkip = (TextView) rootView.findViewById(R.id.categoriesExplanation); - categoriesSkip.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - getActivity().onBackPressed(); - getActivity().finish(); - } + categoriesSkip.setOnClickListener(view -> { + getActivity().onBackPressed(); + getActivity().finish(); }); ArrayList items; @@ -429,16 +426,13 @@ public class CategorizationFragment extends Fragment { categoriesAdapter = new CategoriesAdapter(getActivity(), items); categoriesList.setAdapter(categoriesAdapter); - categoriesList.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int index, long id) { - CheckedTextView checkedView = (CheckedTextView) view; - CategoryItem item = (CategoryItem) adapterView.getAdapter().getItem(index); - item.selected = !item.selected; - checkedView.setChecked(item.selected); - if (item.selected) { - updateCategoryCount(item.name); - } + categoriesList.setOnItemClickListener((adapterView, view, index, id) -> { + CheckedTextView checkedView = (CheckedTextView) view; + CategoryItem item = (CategoryItem) adapterView.getAdapter().getItem(index); + item.selected = !item.selected; + checkedView.setChecked(item.selected); + if (item.selected) { + updateCategoryCount(item.name); } }); @@ -463,15 +457,12 @@ public class CategorizationFragment extends Fragment { if (rootView != null) { rootView.setFocusableInTouchMode(true); rootView.requestFocus(); - rootView.setOnKeyListener(new View.OnKeyListener() { - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { - backButtonDialog(); - return true; - } - return false; + rootView.setOnKeyListener((v, keyCode, event) -> { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { + backButtonDialog(); + return true; } + return false; }); } } @@ -487,18 +478,10 @@ public class CategorizationFragment extends Fragment { builder.setMessage("Are you sure you want to go back? The image will not have any categories saved.") .setTitle("Warning"); - builder.setPositiveButton("No", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - //No need to do anything, user remains on categorization screen - } - }); - builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - getActivity().finish(); - } + builder.setPositiveButton("No", (dialog, id) -> { + //No need to do anything, user remains on categorization screen }); + builder.setNegativeButton("Yes", (dialog, id) -> getActivity().finish()); AlertDialog dialog = builder.create(); dialog.show(); @@ -537,20 +520,12 @@ public class CategorizationFragment extends Fragment { builder.setMessage("Images without categories are rarely usable. Are you sure you want to submit without selecting categories?") .setTitle("No Categories Selected"); - builder.setPositiveButton("No, go back", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - //Exit menuItem so user can select their categories - return; - } + builder.setPositiveButton("No, go back", (dialog, id) -> { + //Exit menuItem so user can select their categories }); - builder.setNegativeButton("Yes, submit", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - //Proceed to submission - onCategoriesSaveHandler.onCategoriesSave(selectedCategories); - return; - } + builder.setNegativeButton("Yes, submit", (dialog, id) -> { + //Proceed to submission + onCategoriesSaveHandler.onCategoriesSave(selectedCategories); }); AlertDialog dialog = builder.create(); diff --git a/app/src/main/java/fr/free/nrw/commons/concurrency/BackgroundPoolExceptionHandler.java b/app/src/main/java/fr/free/nrw/commons/concurrency/BackgroundPoolExceptionHandler.java index 2c730a0d1..489a45c4e 100644 --- a/app/src/main/java/fr/free/nrw/commons/concurrency/BackgroundPoolExceptionHandler.java +++ b/app/src/main/java/fr/free/nrw/commons/concurrency/BackgroundPoolExceptionHandler.java @@ -9,11 +9,8 @@ public class BackgroundPoolExceptionHandler implements ExceptionHandler { public void onException(@NonNull final Throwable t) { //Crash for debug build if (BuildConfig.DEBUG) { - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - throw new RuntimeException(t); - } + Thread thread = new Thread(() -> { + throw new RuntimeException(t); }); thread.start(); } diff --git a/app/src/main/java/fr/free/nrw/commons/concurrency/ThreadFactoryMaker.java b/app/src/main/java/fr/free/nrw/commons/concurrency/ThreadFactoryMaker.java index 221ebef41..d535fe5bd 100644 --- a/app/src/main/java/fr/free/nrw/commons/concurrency/ThreadFactoryMaker.java +++ b/app/src/main/java/fr/free/nrw/commons/concurrency/ThreadFactoryMaker.java @@ -11,17 +11,13 @@ class ThreadFactoryMaker { private int count = 0; @Override - public Thread newThread(final Runnable runnable) { + public Thread newThread(@NonNull final Runnable runnable) { count++; - Runnable wrapperRunnable = new Runnable() { - @Override - public void run() { - Process.setThreadPriority(priority); - runnable.run(); - } + Runnable wrapperRunnable = () -> { + Process.setThreadPriority(priority); + runnable.run(); }; - Thread t = new Thread(wrapperRunnable, String.format("%s-%s", name, count)); - return t; + return new Thread(wrapperRunnable, String.format("%s-%s", name, count)); } }; } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java index 8025b94bf..c009243b9 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java @@ -29,6 +29,7 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.nearby.NearbyActivity; import timber.log.Timber; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.app.Activity.RESULT_OK; public class ContributionsListFragment extends Fragment { @@ -110,11 +111,11 @@ public class ContributionsListFragment extends Fragment { // Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(getActivity(), - Manifest.permission.READ_EXTERNAL_STORAGE) + READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? - if (shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)) { + if (shouldShowRequestPermissionRationale(READ_EXTERNAL_STORAGE)) { // Show an explanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user @@ -122,15 +123,9 @@ public class ContributionsListFragment extends Fragment { new AlertDialog.Builder(getActivity()) .setMessage(getString(R.string.storage_permission_rationale)) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - - requestPermissions( - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - 1); - dialog.dismiss(); - } + .setPositiveButton("OK", (dialog, which) -> { + requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, 1); + dialog.dismiss(); }) .setNegativeButton("Cancel", null) .create() @@ -140,7 +135,7 @@ public class ContributionsListFragment extends Fragment { // No explanation needed, we can request the permission. - requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, 1); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/UploadCountClient.java b/app/src/main/java/fr/free/nrw/commons/contributions/UploadCountClient.java index 9667f9057..4a04e3888 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/UploadCountClient.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/UploadCountClient.java @@ -14,10 +14,10 @@ import fr.free.nrw.commons.concurrency.BackgroundPoolExceptionHandler; import fr.free.nrw.commons.concurrency.ThreadPoolExecutorService; import timber.log.Timber; -public class UploadCountClient { +class UploadCountClient { private ThreadPoolExecutorService threadPoolExecutor; - public UploadCountClient() { + UploadCountClient() { threadPoolExecutor = new ThreadPoolExecutorService.Builder("bg-pool") .setPoolSize(Runtime.getRuntime().availableProcessors()) .setExceptionHandler(new BackgroundPoolExceptionHandler()) @@ -27,29 +27,26 @@ public class UploadCountClient { private static final String UPLOAD_COUNT_URL_TEMPLATE = "https://tools.wmflabs.org/urbanecmbot/uploadsbyuser/uploadsbyuser.py?user=%s"; - public ListenableFuture getUploadCount(final String userName) { + ListenableFuture getUploadCount(final String userName) { final SettableFuture future = SettableFuture.create(); - threadPoolExecutor.schedule(new Runnable() { - @Override - public void run() { - URL url; + threadPoolExecutor.schedule(() -> { + URL url; + try { + url = new URL(String.format(Locale.ENGLISH, UPLOAD_COUNT_URL_TEMPLATE, + new PageTitle(userName).getText())); + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); try { - url = new URL(String.format(Locale.ENGLISH, UPLOAD_COUNT_URL_TEMPLATE, - new PageTitle(userName).getText())); - HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); - try { - BufferedReader bufferedReader = new BufferedReader(new - InputStreamReader(urlConnection.getInputStream())); - String uploadCount = bufferedReader.readLine(); - bufferedReader.close(); - future.set(Integer.parseInt(uploadCount)); - } finally { - urlConnection.disconnect(); - } - } catch (Exception e) { - Timber.e("Error getting upload count Error", e); - future.setException(e); + BufferedReader bufferedReader = new BufferedReader(new + InputStreamReader(urlConnection.getInputStream())); + String uploadCount = bufferedReader.readLine(); + bufferedReader.close(); + future.set(Integer.parseInt(uploadCount)); + } finally { + urlConnection.disconnect(); } + } catch (Exception e) { + Timber.e("Error getting upload count Error", e); + future.setException(e); } }); return future; 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 cb879395c..d739e9040 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 @@ -119,12 +119,7 @@ public class MediaDetailFragment extends Fragment { licenseList = new LicenseList(getActivity()); // Progressively darken the image in the background when we scroll detail pane up - scrollListener = new ViewTreeObserver.OnScrollChangedListener() { - @Override - public void onScrollChanged() { - updateTheDarkness(); - } - }; + scrollListener = this::updateTheDarkness; view.getViewTreeObserver().addOnScrollChangedListener(scrollListener); // Layout layoutListener to size the spacer item relative to the available space. @@ -280,15 +275,12 @@ public class MediaDetailFragment extends Fragment { textView.setText(catName); if (categoriesLoaded && categoriesPresent) { - textView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - String selectedCategoryTitle = "Category:" + catName; - Intent viewIntent = new Intent(); - viewIntent.setAction(Intent.ACTION_VIEW); - viewIntent.setData(new PageTitle(selectedCategoryTitle).getCanonicalUri()); - startActivity(viewIntent); - } + textView.setOnClickListener(view -> { + String selectedCategoryTitle = "Category:" + catName; + Intent viewIntent = new Intent(); + viewIntent.setAction(Intent.ACTION_VIEW); + viewIntent.setData(new PageTitle(selectedCategoryTitle).getCanonicalUri()); + startActivity(viewIntent); }); } return item; 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 d0b2236ca..271ac5c92 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 @@ -72,12 +72,7 @@ public class MediaDetailPagerFragment extends Fragment implements ViewPager.OnPa public Fragment getItem(int i) { if (i == 0) { // See bug https://code.google.com/p/android/issues/detail?id=27526 - pager.postDelayed(new Runnable() { - @Override - public void run() { - getActivity().supportInvalidateOptionsMenu(); - } - }, 5); + pager.postDelayed(() -> getActivity().supportInvalidateOptionsMenu(), 5); } return MediaDetailFragment.forMedia(i, editable); } @@ -100,14 +95,11 @@ public class MediaDetailPagerFragment extends Fragment implements ViewPager.OnPa final int pageNumber = savedInstanceState.getInt("current-page"); // Adapter doesn't seem to be loading immediately. // Dear God, please forgive us for our sins - view.postDelayed(new Runnable() { - @Override - public void run() { - pager.setAdapter(adapter); - pager.setCurrentItem(pageNumber, false); - getActivity().supportInvalidateOptionsMenu(); - adapter.notifyDataSetChanged(); - } + view.postDelayed(() -> { + pager.setAdapter(adapter); + pager.setCurrentItem(pageNumber, false); + getActivity().supportInvalidateOptionsMenu(); + adapter.notifyDataSetChanged(); }, 100); } else { pager.setAdapter(adapter); @@ -196,13 +188,8 @@ public class MediaDetailPagerFragment extends Fragment implements ViewPager.OnPa if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) { Snackbar.make(getView(), R.string.storage_permission_rationale, Snackbar.LENGTH_INDEFINITE) - .setAction(R.string.ok, new View.OnClickListener() { - @Override - public void onClick(View view) { - ActivityCompat.requestPermissions(getActivity(), - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); - } - }).show(); + .setAction(R.string.ok, view -> ActivityCompat.requestPermissions(getActivity(), + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1)).show(); } else { final DownloadManager manager = (DownloadManager)getActivity().getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(req); diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java index bb2356dd6..9dd0f9939 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java @@ -351,12 +351,7 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi { @Override @NonNull public UploadResult uploadFile(String filename, InputStream file, long dataLength, String pageContents, String editSummary, final ProgressListener progressListener) throws IOException { - ApiResult result = api.upload(filename, file, dataLength, pageContents, editSummary, new in.yuvi.http.fluent.ProgressListener() { - @Override - public void onProgress(long transferred, long total) { - progressListener.onProgress(transferred, total); - } - }); + ApiResult result = api.upload(filename, file, dataLength, pageContents, editSummary, progressListener::onProgress); Log.e("WTF", "Result: "+result.toString()); 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 3d26b22f1..d58eb3566 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 @@ -2,7 +2,6 @@ package fr.free.nrw.commons.nearby; import android.Manifest; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.LocationManager; @@ -41,7 +40,8 @@ import timber.log.Timber; public class NearbyActivity extends NavigationBaseActivity { - @BindView(R.id.progressBar) ProgressBar progressBar; + @BindView(R.id.progressBar) + ProgressBar progressBar; private boolean isMapViewActive = false; private static final int LOCATION_REQUEST = 1; @@ -115,15 +115,11 @@ public class NearbyActivity extends NavigationBaseActivity { new AlertDialog.Builder(this) .setMessage(getString(R.string.location_permission_rationale)) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - - ActivityCompat.requestPermissions(NearbyActivity.this, - new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, - LOCATION_REQUEST); - dialog.dismiss(); - } + .setPositiveButton("OK", (dialog, which) -> { + ActivityCompat.requestPermissions(NearbyActivity.this, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, + LOCATION_REQUEST); + dialog.dismiss(); }) .setNegativeButton("Cancel", null) .create() @@ -175,26 +171,19 @@ public class NearbyActivity extends NavigationBaseActivity { LocationManager manager = (LocationManager) getSystemService(LOCATION_SERVICE); if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { Timber.d("GPS is not enabled"); - AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); - alertDialogBuilder.setMessage(R.string.gps_disabled) + new AlertDialog.Builder(this) + .setMessage(R.string.gps_disabled) .setCancelable(false) .setPositiveButton(R.string.enable_gps, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - Intent callGPSSettingIntent = new Intent( - android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); - Timber.d("Loaded settings page"); - startActivityForResult(callGPSSettingIntent, 1); - } - }); - alertDialogBuilder.setNegativeButton(R.string.menu_cancel_upload, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); - AlertDialog alert = alertDialogBuilder.create(); - alert.show(); + (dialog, id) -> { + Intent callGPSSettingIntent = new Intent( + android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); + Timber.d("Loaded settings page"); + startActivityForResult(callGPSSettingIntent, 1); + }) + .setNegativeButton(R.string.menu_cancel_upload, (dialog, id) -> dialog.cancel()) + .create() + .show(); } else { Timber.d("GPS is enabled"); } @@ -257,7 +246,7 @@ public class NearbyActivity extends NavigationBaseActivity { private final Context mContext; - private NearbyAsyncTask (Context context) { + private NearbyAsyncTask(Context context) { mContext = context; } 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 c5103117d..b08b99d72 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 @@ -52,13 +52,10 @@ public class NearbyController { distances.put(place, computeDistanceBetween(place.location, curLatLng)); } Collections.sort(places, - new Comparator() { - @Override - public int compare(Place lhs, Place rhs) { - double lhsDistance = distances.get(lhs); - double rhsDistance = distances.get(rhs); - return (int) (lhsDistance - rhsDistance); - } + (lhs, rhs) -> { + double lhsDistance = distances.get(lhs); + double rhsDistance = distances.get(rhs); + return (int) (lhsDistance - rhsDistance); } ); } 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 bb2d2fed9..1203d5a0d 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 @@ -63,15 +63,10 @@ public class NearbyInfoDialog extends OverlayDialog { overflowButton.setVisibility(showMenu() ? View.VISIBLE : View.GONE); - overflowButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - popupMenuListener(); - } - }); + overflowButton.setOnClickListener(this::popupMenuListener); } - private void popupMenuListener() { + private void popupMenuListener(View v) { PopupMenu popupMenu = new PopupMenu(getActivity(), overflowButton); popupMenu.inflate(R.menu.nearby_info_dialog_options); 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 ea7ce3478..00b8a2840 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 @@ -48,12 +48,7 @@ public class NearbyListFragment extends Fragment { View view = inflater.inflate(R.layout.fragment_nearby, container, false); recyclerView = (RecyclerView) view.findViewById(R.id.listView); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - adapterFactory = new NearbyAdapterFactory(new PlaceRenderer.PlaceClickedListener() { - @Override - public void placeClicked(Place place) { - NearbyInfoDialog.showYourself(getActivity(), place); - } - }); + adapterFactory = new NearbyAdapterFactory(place -> NearbyInfoDialog.showYourself(getActivity(), place)); return view; } 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 54c1a565e..bc5830809 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 @@ -88,25 +88,19 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { // create map mapView = new MapView(getActivity(), options); mapView.onCreate(savedInstanceState); - mapView.getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(MapboxMap mapboxMap) { - mapboxMap.addMarkers(baseMarkerOptions); + mapView.getMapAsync(mapboxMap -> { + mapboxMap.addMarkers(baseMarkerOptions); - 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; - } - }); + mapboxMap.setOnMarkerClickListener(marker -> { + if (marker instanceof NearbyMarker) { + NearbyMarker nearbyMarker = (NearbyMarker) marker; + Place place = nearbyMarker.getNearbyBaseMarker().getPlace(); + NearbyInfoDialog.showYourself(getActivity(), place); + } + return false; + }); - addCurrentLocationMarker(mapboxMap); - } + addCurrentLocationMarker(mapboxMap); }); if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("theme",true)) { mapView.setStyleUrl(getResources().getString(R.string.map_theme_dark)); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java b/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java index 12e24f1ae..f4c8a5d61 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons.nearby; +import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -19,7 +20,7 @@ class PlaceRenderer extends Renderer { @BindView(R.id.icon) ImageView icon; private final PlaceClickedListener listener; - PlaceRenderer(PlaceClickedListener listener) { + PlaceRenderer(@NonNull PlaceClickedListener listener) { this.listener = listener; } @@ -35,14 +36,7 @@ class PlaceRenderer extends Renderer { @Override protected void hookListeners(View view) { - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (listener != null) { - listener.placeClicked(getContent()); - } - } - }); + view.setOnClickListener(v -> listener.placeClicked(getContent())); } @Override 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 bdac4a0f5..cfeda91d1 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 @@ -28,21 +28,15 @@ public class SettingsFragment extends PreferenceFragment { 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) { - preference.setSummary(getString(Utils.licenseNameFor((String) newValue))); - return true; - } + licensePreference.setOnPreferenceChangeListener((preference, newValue) -> { + preference.setSummary(getString(Utils.licenseNameFor((String) newValue))); + return true; }); CheckBoxPreference themePreference = (CheckBoxPreference) findPreference("theme"); - themePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - getActivity().recreate(); - return true; - } + themePreference.setOnPreferenceChangeListener((preference, newValue) -> { + getActivity().recreate(); + return true; }); final EditTextPreference uploadLimit = (EditTextPreference) findPreference("uploads"); @@ -51,36 +45,27 @@ public class SettingsFragment extends PreferenceFragment { int uploads = sharedPref.getInt(Prefs.UPLOADS_SHOWING, 100); uploadLimit.setText(uploads + ""); uploadLimit.setSummary(uploads + ""); - uploadLimit.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - int value = Integer.parseInt(newValue.toString()); - final SharedPreferences.Editor editor = sharedPref.edit(); - if (value > 500) { - new AlertDialog.Builder(getActivity()) - .setTitle(R.string.maximum_limit) - .setMessage(R.string.maximum_limit_alert) - .setPositiveButton(android.R.string.yes, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - } - }) - .setIcon(android.R.drawable.ic_dialog_alert) - .show(); - editor.putInt(Prefs.UPLOADS_SHOWING, 500); - editor.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,true); - uploadLimit.setSummary(500 + ""); - uploadLimit.setText(500 + ""); - } else { - editor.putInt(Prefs.UPLOADS_SHOWING, Integer.parseInt(newValue.toString())); - editor.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,true); - uploadLimit.setSummary(newValue.toString()); - } - editor.apply(); - return true; + uploadLimit.setOnPreferenceChangeListener((preference, newValue) -> { + int value = Integer.parseInt(newValue.toString()); + final SharedPreferences.Editor editor = sharedPref.edit(); + if (value > 500) { + new AlertDialog.Builder(getActivity()) + .setTitle(R.string.maximum_limit) + .setMessage(R.string.maximum_limit_alert) + .setPositiveButton(android.R.string.yes, (dialog, which) -> {}) + .setIcon(android.R.drawable.ic_dialog_alert) + .show(); + editor.putInt(Prefs.UPLOADS_SHOWING, 500); + editor.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,true); + uploadLimit.setSummary(500 + ""); + uploadLimit.setText(500 + ""); + } else { + editor.putInt(Prefs.UPLOADS_SHOWING, Integer.parseInt(newValue.toString())); + editor.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,true); + uploadLimit.setSummary(newValue.toString()); } - + editor.apply(); + return true; }); diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java index a9c27e5e3..f689f04dd 100644 --- a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java @@ -55,12 +55,7 @@ public class NavigationBaseActivity extends BaseActivity public void initBackButton() { int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount(); toggle.setDrawerIndicatorEnabled(backStackEntryCount == 0); - toggle.setToolbarNavigationClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onBackPressed(); - } - }); + toggle.setToolbarNavigationClickListener(v -> onBackPressed()); } public void initBack() { @@ -118,25 +113,17 @@ public class NavigationBaseActivity extends BaseActivity new AlertDialog.Builder(this) .setMessage(R.string.logout_verification) .setCancelable(false) - .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - ((CommonsApplication) getApplicationContext()) - .clearApplicationData(NavigationBaseActivity.this); - Intent nearbyIntent = new Intent( - NavigationBaseActivity.this, LoginActivity.class); - nearbyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - nearbyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(nearbyIntent); - finish(); - } - }) - .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } + .setPositiveButton(R.string.yes, (dialog, which) -> { + ((CommonsApplication) getApplicationContext()) + .clearApplicationData(NavigationBaseActivity.this); + Intent nearbyIntent = new Intent( + NavigationBaseActivity.this, LoginActivity.class); + nearbyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + nearbyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(nearbyIntent); + finish(); }) + .setNegativeButton(R.string.no, (dialog, which) -> dialog.cancel()) .show(); return true; default: diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java b/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java index cacc75596..09fed56ea 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java @@ -72,21 +72,13 @@ public class ExistingFileAsync extends AsyncTask { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage(R.string.file_exists) .setTitle(R.string.warning); - builder.setPositiveButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - //Go back to ContributionsActivity - Intent intent = new Intent(context, ContributionsActivity.class); - context.startActivity(intent); - callback.onResult(Result.DUPLICATE_CANCELLED); - } - }); - builder.setNegativeButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - callback.onResult(Result.DUPLICATE_PROCEED); - } + builder.setPositiveButton(R.string.no, (dialog, id) -> { + //Go back to ContributionsActivity + Intent intent = new Intent(context, ContributionsActivity.class); + context.startActivity(intent); + callback.onResult(Result.DUPLICATE_CANCELLED); }); + builder.setNegativeButton(R.string.yes, (dialog, id) -> callback.onResult(Result.DUPLICATE_PROCEED)); AlertDialog dialog = builder.create(); dialog.show(); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java index d7c807777..a3a1f8604 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java @@ -125,19 +125,16 @@ public class MultipleShareActivity Contribution up = photosList.get(i); final int uploadCount = i + 1; // Goddamn Java - uploadController.startUpload(up, new UploadController.ContributionUploadProgress() { - @Override - public void onUploadStarted(Contribution contribution) { - dialog.setProgress(uploadCount); - if(uploadCount == photosList.size()) { - dialog.dismiss(); - Toast startingToast = Toast.makeText( - CommonsApplication.getInstance(), - R.string.uploading_started, - Toast.LENGTH_LONG - ); - startingToast.show(); - } + uploadController.startUpload(up, contribution -> { + dialog.setProgress(uploadCount); + if (uploadCount == photosList.size()) { + dialog.dismiss(); + Toast startingToast = Toast.makeText( + CommonsApplication.getInstance(), + R.string.uploading_started, + Toast.LENGTH_LONG + ); + startingToast.show(); } }); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java b/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java index 666b8cb31..f515f2d0c 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java @@ -57,7 +57,7 @@ public class MwVolleyApi { Timber.d("URL: %s", apiUrl); JsonRequest request = new QueryRequest(apiUrl, - new LogResponseListener(), new LogResponseErrorListener()); + new LogResponseListener<>(), new LogResponseErrorListener()); getQueue().add(request); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index 7b9111841..8b09403f7 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -44,6 +44,9 @@ import fr.free.nrw.commons.modifications.TemplateRemoveModifier; import fr.free.nrw.commons.mwapi.EventLog; import timber.log.Timber; +import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.DUPLICATE_PROCEED; +import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE; + /** * Activity for the title/desc screen after image is selected. Also starts processing image * GPS coordinates or user location (if enabled in Settings) for category suggestions. @@ -133,12 +136,9 @@ public class ShareActivity Timber.d("Cache the categories found"); } - uploadController.startUpload(title, mediaUri, description, mimeType, source, decimalCoords, new UploadController.ContributionUploadProgress() { - @Override - public void onUploadStarted(Contribution contribution) { - ShareActivity.this.contribution = contribution; - showPostUpload(); - } + uploadController.startUpload(title, mediaUri, description, mimeType, source, decimalCoords, c -> { + ShareActivity.this.contribution = c; + showPostUpload(); }); } @@ -379,14 +379,10 @@ public class ShareActivity Timber.d("File SHA1 is: %s", fileSHA1); ExistingFileAsync fileAsyncTask = - new ExistingFileAsync(fileSHA1, this, new ExistingFileAsync.Callback() { - @Override - public void onResult(ExistingFileAsync.Result result) { - Timber.d("%s duplicate check: %s", mediaUri.toString(), result); - duplicateCheckPassed = - result == ExistingFileAsync.Result.DUPLICATE_PROCEED - || result == ExistingFileAsync.Result.NO_DUPLICATE; - } + new ExistingFileAsync(fileSHA1, this, result -> { + Timber.d("%s duplicate check: %s", mediaUri.toString(), result); + duplicateCheckPassed = (result == DUPLICATE_PROCEED + || result == NO_DUPLICATE); }); fileAsyncTask.execute(); } catch (IOException e) { @@ -401,17 +397,12 @@ public class ShareActivity } } - private Snackbar requestPermissionUsingSnackBar( - String rationale, final String[] perms, final int code) { + private Snackbar requestPermissionUsingSnackBar(String rationale, + final String[] perms, + final int code) { Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), rationale, - Snackbar.LENGTH_INDEFINITE) - .setAction(R.string.ok, new View.OnClickListener() { - @Override - public void onClick(View view) { - ActivityCompat.requestPermissions(ShareActivity.this, - perms, code); - } - }); + Snackbar.LENGTH_INDEFINITE).setAction(R.string.ok, + view -> ActivityCompat.requestPermissions(ShareActivity.this, perms, code)); snackbar.show(); return snackbar; } diff --git a/app/src/main/java/fr/free/nrw/commons/utils/ExecutorUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/ExecutorUtils.java index 2cb93a058..df67cfea7 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/ExecutorUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/ExecutorUtils.java @@ -7,14 +7,11 @@ import java.util.concurrent.Executor; public class ExecutorUtils { - private static final Executor uiExecutor = new Executor() { - @Override - public void execute(Runnable command) { - if (Looper.myLooper() == Looper.getMainLooper()) { - command.run(); - } else { - new Handler(Looper.getMainLooper()).post(command); - } + private static final Executor uiExecutor = command -> { + if (Looper.myLooper() == Looper.getMainLooper()) { + command.run(); + } else { + new Handler(Looper.getMainLooper()).post(command); } }; 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 index 0596327e3..4d50f32aa 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java @@ -42,8 +42,8 @@ public class FileUtils { if (file != null) { if (file.isDirectory()) { String[] children = file.list(); - for (int i = 0; i < children.length; i++) { - deletedAll = deleteFile(new File(file, children[i])) && deletedAll; + for (String child : children) { + deletedAll = deleteFile(new File(file, child)) && deletedAll; } } else { deletedAll = file.delete(); From 02315c2ae7cd24cdd515ad7884a850d7522261dc Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Sat, 22 Jul 2017 18:08:56 -0500 Subject: [PATCH 37/40] Propagated the @NonNull annotation for place click listener and removed a test that made no sense. --- .../fr/free/nrw/commons/nearby/NearbyAdapterFactory.java | 4 +++- .../free/nrw/commons/nearby/NearbyAdapterFactoryTest.java | 8 -------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyAdapterFactory.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyAdapterFactory.java index 5fffcab2a..d5eb05851 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyAdapterFactory.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyAdapterFactory.java @@ -1,5 +1,7 @@ package fr.free.nrw.commons.nearby; +import android.support.annotation.NonNull; + import com.pedrogomez.renderers.ListAdapteeCollection; import com.pedrogomez.renderers.RVRendererAdapter; import com.pedrogomez.renderers.RendererBuilder; @@ -10,7 +12,7 @@ import java.util.List; class NearbyAdapterFactory { private PlaceRenderer.PlaceClickedListener listener; - NearbyAdapterFactory(PlaceRenderer.PlaceClickedListener listener) { + NearbyAdapterFactory(@NonNull PlaceRenderer.PlaceClickedListener listener) { this.listener = listener; } diff --git a/app/src/test/java/fr/free/nrw/commons/nearby/NearbyAdapterFactoryTest.java b/app/src/test/java/fr/free/nrw/commons/nearby/NearbyAdapterFactoryTest.java index e54e4d7f2..76125aa43 100644 --- a/app/src/test/java/fr/free/nrw/commons/nearby/NearbyAdapterFactoryTest.java +++ b/app/src/test/java/fr/free/nrw/commons/nearby/NearbyAdapterFactoryTest.java @@ -113,14 +113,6 @@ public class NearbyAdapterFactoryTest { assertEquals(PLACE, clickedPlace); } - @Test - public void clickViewHandlesMisconfiguredListener() { - NearbyAdapterFactory testObject = new NearbyAdapterFactory(null); - RVRendererAdapter result = testObject.create(Collections.singletonList(PLACE)); - RendererViewHolder viewHolder = renderComponent(result); - viewHolder.itemView.performClick(); - } - @NonNull private RendererViewHolder renderComponent(RVRendererAdapter result) { FrameLayout viewGroup = new FrameLayout(RuntimeEnvironment.application); From 815465bbd3fe3bcdead622ac1fd448e1e576a67b Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 24 Jul 2017 06:40:38 +0200 Subject: [PATCH 38/40] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ast/strings.xml | 1 - app/src/main/res/values-b+tg+Cyrl/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ji/strings.xml | 2 ++ app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lb/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-pms/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-th/error.xml | 7 +++++++ app/src/main/res/values-uk/strings.xml | 3 +++ app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values-zh/strings.xml | 1 - 19 files changed, 12 insertions(+), 16 deletions(-) create mode 100644 app/src/main/res/values-th/error.xml diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index c25bfc778..dcee85e89 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -76,7 +76,6 @@ Date d\'alta Tocante a Software de códigu abiertu lliberáu baxo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Llicencia Apache v2</a>. %1$s ya\'l so logotipu son marques rexistraes de la Fundación Wikimedia y utilícense col so permisu. Nun tamos acreditaos pola Fundación Wikimedia nin tamos afiliaos con ella. - Wikimedia Commons El <a href=\"https://github.com/commons-app/apps-android-commons\">códigu fonte</a> ya\'l <a href=\"https://commons-app.github.io/\">sitiu web</a> tán en GitHub. Crea una nueva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia en GitHub</a> pa informar de problemes y suxerencies. Wikimedia:Commons-android-strings-about privacy policy/ast <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a> diff --git a/app/src/main/res/values-b+tg+Cyrl/strings.xml b/app/src/main/res/values-b+tg+Cyrl/strings.xml index d9af68e06..0785618e9 100644 --- a/app/src/main/res/values-b+tg+Cyrl/strings.xml +++ b/app/src/main/res/values-b+tg+Cyrl/strings.xml @@ -32,7 +32,6 @@ Ҳисоботи истифода Танзимот Дар бораи - Викианбор Дар бораи Ирсоли Пешниҳод (тавассути Email) Дубора саъй кунед diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7fec6dd65..b849c81e3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -76,7 +76,6 @@ Registrieren Über Die Open-Source-Software wurde veröffentlicht unter der <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache-Lizenz v2</a>. %1$s und das entsprechende Logo sind Markenzeichen der Wikimedia Foundation und wurden mit Genehmigung der Wikimedia Foundation verwendet. Wir wurden nicht von der Wikimedia Foundation bestätigt oder sind nicht mit ihr verbunden. - Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Quellcode</a> und <a href=\"https://commons-app.github.io/\">Website</a> auf GitHub. Einen neuen <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-Eintrag</a> für Fehlerberichte und Vorschläge erstellen. <a href=\"//de.wikipedia.org/wiki/Wikipedia:Datenschutz\">Datenschutzrichtlinie</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Danksagungen</a> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 452693303..136b6f218 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -76,7 +76,6 @@ Regístrate Acerca de Programa de código abierto publicado bajo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Licencia Apache ver. 2</a>. %1$s y su logotipo son marcas registradas de la Fundación Wikimedia y se utilizan con su permiso. No hemos sido acreditados por la Fundación Wikimedia ni estamos afiliados con ella. - Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Código fuente</a> y <a href=\"https://commons-app.github.io/\">sitio web</a> en GitHub. Crea <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencias</a> para informar de problemas y sugerencias. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Normativa de privacidad</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a> diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 713f4e2c7..543f630c1 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -62,7 +62,6 @@ Eman izena Honi buruz Open Source softwarea <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache v2 Lizentziaren</a> pean egina. Wikimedia Commons eta bere logoa Wikimedia Fundazioaren marka erregistratuak dira eta Wikimedia Fundazioaren baimenarekin erabiltzen dira. Ez gaude Wikimedia Fundaziora afiliatuta. - Wikimedia Commons GitHub-eko <a href=\"https://github.com/commons-app/apps-android-commons\">Iturria</a> eta <a href=\"https://commons-app.github.io/\">webgunea</a>. <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-eko gai</a> berria sortu erroreen berri emateko. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Pribatutasun politika</a> Honi buruz diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 213fb6699..5925d548d 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -76,7 +76,6 @@ Rekisteröidy Tietoja Tämä on vapaan lähdekoodin ohjelmisto, joka on julkaistu <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> -lisenssin alaisena. Wikimedia Commons ja sen logo ovat Wikimedia Foundationin tavaramerkkejä ja niitä käytetään Wikimedia Foundationin luvalla. Emme ole hyväksyttyjä tai sidoksissa Wikimedia Foundationioniin. - Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Lähde</a> ja <a href=\"https://commons-app.github.io/\">nettisivusto</a> GitHubissa. Luo uusi <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-issue</a> bugiraporteille ja ehdotuksille. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Yksityisyydensuoja</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Tekijät</a> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9e6ea1e79..118ce4b97 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -76,7 +76,6 @@ S’inscrire À propos Les logiciels Open Source sont publiés sous la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licence Apache v2</a>. %1$s et son logo sont des marques déposées de la Fondation Wikimédia qui sont utilisées avec l’autorisation de la Fondation Wikimédia. Nous ne sommes pas approuvés par ou affiliés à la Fondation Wikimédia. - Wikimédia Communs <a href=\"https://github.com/commons-app/apps-android-commons\">Sources</a> et <a href=\"https://commons-app.github.io/\">site web</a> sur GitHub. Créer un nouveau <a href=\"https://github.com/commons-app/apps-android-commons/issues\">signalement GitHub</a> pour signales des bogues ou des suggestions. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Politique de confidentialité</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Remerciements</a> diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 7a76c3c6c..836bcfa01 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -76,7 +76,6 @@ Rexistrarse Acerca de Software de código aberto liberado baixo a <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licenza Apache v2</a>. %1$s e o seu logo son marcas rexistradas da Fundación Wikimedia e úsanse coa súa autorización. Non fomos acreditados pola Fundación Wikimedia nin estamos afiliados con ela. - Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Código fonte</a> e <a href=\"https://commons-app.github.io/\">sitio web</a> en GitHub. Crear unha nova <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia</a> para informar de problemas e suxestións. <a href=\"https://wikimediafoundation.org/wiki/Política_de_protección_de_datos_(gl)\">Política de protección de datos</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a> diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7b58f94c4..6d837dda5 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -76,7 +76,6 @@ Registrati Informazioni Software open source rilasciato con <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licenza Apache v2</a>. %1$s ed il suo logo sono marchi registrati della Wikimedia Foundation e sono utilizzati con il permesso della Wikimedia Foundation. Non siamo approvati o affiliati con la Wikimedia Foundation. - Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Codice sorgente</a> e <a href=\"https://commons-app.github.io/\">sito web</a> su GitHub. Crea una nuova <a href=\"https://github.com/commons-app/apps-android-commons/issues\">segnalazione GitHub</a> per riportare errori e suggerimenti. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Politica sulla privacy</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Crediti</a> diff --git a/app/src/main/res/values-ji/strings.xml b/app/src/main/res/values-ji/strings.xml index d7fbf831f..4f8aed92b 100644 --- a/app/src/main/res/values-ji/strings.xml +++ b/app/src/main/res/values-ji/strings.xml @@ -93,6 +93,8 @@ ווארענונג יא ניין + ליצענץ + קאארדינאטן טולפאן אַנולירן אפֿן diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 50b3c9db6..938d53c38 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -75,7 +75,6 @@ 가입하기 정보 오픈 소스 소프트웨어는 <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">아파치 라이선스 v2</a>에 따라 공개됩니다 - 위키미디어 공용 소스 코드는 <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>에 있으며, 버그는<a href=\" https://github.com/commons-app/apps-android-commons/issues\">버그질라</a>에 보고하세요. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy/ko\">개인정보 정책</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">제작진</a> diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 41b1ce975..2aaaeaf67 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -75,7 +75,6 @@ Mellt Iech un Iwwer \'Open-Source-Software\' verëffentlecht ënner der <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache Lizenz v2</a>. %1$s a säi Logo si Markenzeeche vun der Wikimedia Foundation a gi mat der Autorisatioun vun der Wikimedia Foundation benotzt. Mir sinn net confirméiert vun oder liéiert mat der Wikimedia Foundation. - Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Quell</a> an <a href=\"https://commons-app.github.io/\">Internetsite</a> vu GitHub.\nLeet w.e.g. <a href=\"https://github.com/commons-app/apps-android-commons/issues\"> e GitHub Problem</a> fir Problemer ze mellen a Proposen ze maachen. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Dateschutzerklärung</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Merci</a> diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index aa7172d91..a830cc6bc 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -76,7 +76,6 @@ Регистрација За извршникот Програм со отворен код, издаден под лиценцата <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Апачи вер. 2</a>. %1$s и нејзиното лого се заштитни знаци на Фондацијата Викимедија и се користат со нејзина дозвола. Ние не сме поддржани и поврзани со Фондацијата Викимедија. - Ризницата <a href=\"https://github.com/commons-app/apps-android-commons\">Извор</a> и <a href=\"https://commons-app.github.io/\">мреж. место</a> на GitHub</a>. Создајте нов <a href=\"https://github.com/commons-app/apps-android-commons/issues\">случај на GitHub</a> за пријавување грешки и давање предлози. <a href=\"https://wikimediafoundation.org/wiki/Заштита на личните податоци\">Заштита_на_личните_податоци</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Заслуги</a> diff --git a/app/src/main/res/values-pms/strings.xml b/app/src/main/res/values-pms/strings.xml index 6b031275f..ad1aaf210 100644 --- a/app/src/main/res/values-pms/strings.xml +++ b/app/src/main/res/values-pms/strings.xml @@ -76,7 +76,6 @@ Marchesse A propòsit Ij programa Open Source a son publicà sota la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licensa Apache v2</a>. %1$s e sò sìmbol a son dle marche argistrà dla Fondassion Wikimedia e a son dovrà con ël përmess ëd la Fondassion Wikimedia. Nojàutri i soma nen aprovà da o afilià a la Fondassion Wikimedia. - Wikimedia Comun <a href=\"https://github.com/commons-app/apps-android-commons\">Sorgiss</a> e <a href=\"https://commons-app.github.io/\">sit an sl\'aragnà</a> su GitHub. Creé na neuva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">signalassion GitHub</a> për signalé dij givo e dij sugeriment. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Régole ëd confidensialità</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Ringrassiament</a> diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 23c051f2e..2bfa69c7f 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -76,7 +76,6 @@ Registrera Om Programvara med öppen källkod släppt under <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licensen Apache v2</a>. %1$s och dess logotyp är varumärken av Wikimedia Foundation och används med tillstånd från Wikimedia Foundation. Vi varken stöds eller är kopplade med Wikimedia Foundation. - Wikimedia Commons <a href=\"https://github.com/commons-app/apps-android-commons\">Källkoden</a> och <a href=\"https://commons-app.github.io/\">webbplatsen</a> på GitHub. Skapa ett nytt <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-ärende</a> för att rapportera buggar och förslag. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Integritetspolicy</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Erkännande</a> diff --git a/app/src/main/res/values-th/error.xml b/app/src/main/res/values-th/error.xml new file mode 100644 index 000000000..bdacb80a8 --- /dev/null +++ b/app/src/main/res/values-th/error.xml @@ -0,0 +1,7 @@ + + + คอมมอนส์หยุดทำงาน + อ๊ะ มีบางอย่างผิดพลาดไป! + บอกให้เราทราบว่าคุณกำลังทำอะไรอยู่ แล้วแบ่งปันให้เราผ่านทางอีเมล จะได้ช่วยเราแก้ไขได้! + ขอบคุณ! + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 49b201474..b6d7d46f3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -157,6 +157,9 @@ Опис Сюди потрапляє опис медіафайлу. Він потенційно може бути досить довгим і розтягнутися на декілька рядків. Однак ми сподіваємось, що він виглядатиме гарно. Дата завантаження + Ліцензія + Координати + Не передбачено Станьте бета-тестером Увійдіть на наш бета-канал на Google Play і отримайте ранній доступ до нових функцій та виправлень багів Використати Вікідані diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9ec84098c..0961ebe06 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -76,7 +76,6 @@ 註冊 關於 以<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache許可證 v2</a>釋放的開放源碼軟體。%1$s和其標誌圖像是維基媒體基金會的標記;並在維基媒體基金會的許可下使用。我們並非由維基媒體基金會所認可、也不隸屬於維基媒體基金會。 - 維基共享資源 <a href=\"https://github.com/commons-app/apps-android-commons\">原始碼</a>和<a href=\"https://commons-app.github.io/\">網站</a>位於GitHub上。建立一個新的<a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub問題</a>來回報問題和提出建議。 <a href=\"https://meta.wikimedia.org/wiki/Privacy_policy/zh\">隱私政策</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">製作群</a> diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4fdc17ebd..d2c740f89 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -76,7 +76,6 @@ 注册 关于 本开源软件采用<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache许可证第二版</a>授权。%1$s及其标志是维基媒体基金会的商标,并在维基媒体基金会的许可下使用。我们并不被维基媒体基金会认可,也不与基金会有任何联系。 - 维基共享资源 <a href=\"https://github.com/commons-app/apps-android-commons\">源代码</a>和<a href=\"https://commons-app.github.io/\">网站</a>位于GitHub。创建新的<a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub问题</a>以发送错误报告和建议。 <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">隐私政策</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">制作人员</a> From 244af93f1971c12987643b87b1adcc7cafb9708c Mon Sep 17 00:00:00 2001 From: mebr1416 Date: Mon, 24 Jul 2017 10:26:48 +0300 Subject: [PATCH 39/40] "Copyrighted material" --- 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 38cb3d5de..1979c60b0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -93,7 +93,7 @@ Tap this message (or hit back) to skip this step. Retry Cancel This image will be licensed under %1$s - By submitting this picture, I declare that this is my own work, that it does not contain copyright material or selfies, and otherwise adheres to <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">Wikimedia Commons policies</a>. + By submitting this picture, I declare that this is my own work, that it does not contain copyrighted material or selfies, and otherwise adheres to <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">Wikimedia Commons policies</a>. Download License Use previous title/description From 3b797751a3f2184592999e088f422412c575e3ce Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Tue, 25 Jul 2017 21:19:56 -0500 Subject: [PATCH 40/40] Cleanup - got rid of unused imports --- .../category/CategorizationFragment.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java index 70700512a..bda7eecc9 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java @@ -1,7 +1,6 @@ package fr.free.nrw.commons.category; import android.content.ContentProviderClient; -import android.content.DialogInterface; import android.content.SharedPreferences; import android.database.Cursor; import android.os.AsyncTask; @@ -15,7 +14,6 @@ import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -56,11 +54,16 @@ import static fr.free.nrw.commons.category.CategoryContentProvider.AUTHORITY; public class CategorizationFragment extends Fragment implements CategoryClickedListener { public static final int SEARCH_CATS_LIMIT = 25; - @BindView(R.id.categoriesListBox) RecyclerView categoriesList; - @BindView(R.id.categoriesSearchBox) EditText categoriesFilter; - @BindView(R.id.categoriesSearchInProgress) ProgressBar categoriesSearchInProgress; - @BindView(R.id.categoriesNotFound) TextView categoriesNotFoundView; - @BindView(R.id.categoriesExplanation) TextView categoriesSkip; + @BindView(R.id.categoriesListBox) + RecyclerView categoriesList; + @BindView(R.id.categoriesSearchBox) + EditText categoriesFilter; + @BindView(R.id.categoriesSearchInProgress) + ProgressBar categoriesSearchInProgress; + @BindView(R.id.categoriesNotFound) + TextView categoriesNotFoundView; + @BindView(R.id.categoriesExplanation) + TextView categoriesSkip; private RVRendererAdapter categoriesAdapter; private OnCategoriesSaveHandler onCategoriesSaveHandler; @@ -450,7 +453,7 @@ public class CategorizationFragment extends Fragment implements CategoryClickedL public void backButtonDialog() { new AlertDialog.Builder(getActivity()) - .setMessage("Are you sure you want to go back? The image will not " + .setMessage("Are you sure you want to go back? The image will not " + "have any categories saved.") .setTitle("Warning") .setPositiveButton("No", (dialog, id) -> {