From f9e5b88c6d7b3d0fcaa72885c57b94d71f078dea Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Tue, 25 Apr 2017 09:30:47 +0900 Subject: [PATCH 01/42] Rename and refactor tests --- .../nrw/commons/UtilsFixExtensionTest.java | 57 +++++++++++++++++++ .../java/fr/free/nrw/commons/UtilsTest.java | 49 ++-------------- 2 files changed, 61 insertions(+), 45 deletions(-) create mode 100644 app/src/test/java/fr/free/nrw/commons/UtilsFixExtensionTest.java diff --git a/app/src/test/java/fr/free/nrw/commons/UtilsFixExtensionTest.java b/app/src/test/java/fr/free/nrw/commons/UtilsFixExtensionTest.java new file mode 100644 index 000000000..de0a90f4b --- /dev/null +++ b/app/src/test/java/fr/free/nrw/commons/UtilsFixExtensionTest.java @@ -0,0 +1,57 @@ +package fr.free.nrw.commons; + +import static org.hamcrest.CoreMatchers.is; + +import org.junit.Assert; +import org.junit.Test; + +public class UtilsFixExtensionTest { + + @Test public void jpegResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile.jpeg", "jpeg"), is("SampleFile.jpg")); + } + + @Test public void capitalJpegWithNoHintResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile.JPEG", null), is("SampleFile.jpg")); + } + + @Test public void jpegWithBogusHintResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile.jpeg", null), is("SampleFile.jpg")); + } + + @Test public void jpegToCapitalJpegResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile.jpeg", "JPEG"), is("SampleFile.jpg")); + } + + @Test public void jpgToJpegResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile.jpg", "jpeg"), is("SampleFile.jpg")); + } + + @Test public void jpegToJpgResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile.jpeg", "jpg"), is("SampleFile.jpg")); + } + + @Test public void jpgRemainsJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile.jpg", "jpg"), is("SampleFile.jpg")); + } + + @Test public void pngRemainsPng() { + Assert.assertThat(Utils.fixExtension("SampleFile.png", "png"), is("SampleFile.png")); + } + + @Test public void jpgHintResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile", "jpg"), is("SampleFile.jpg")); + } + + @Test public void jpegHintResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SampleFile", "jpeg"), is("SampleFile.jpg")); + } + + @Test public void dotLessJpgToJpgResultsInJpg() { + Assert.assertThat(Utils.fixExtension("SAMPLEjpg", "jpg"), is("SAMPLEjpg.jpg")); + } + + @Test public void inWordJpegToJpgResultsInJpg() { + Assert.assertThat(Utils.fixExtension("X.jpeg.SAMPLE", "jpg"),is("X.jpeg.SAMPLE.jpg")); + } +} diff --git a/app/src/test/java/fr/free/nrw/commons/UtilsTest.java b/app/src/test/java/fr/free/nrw/commons/UtilsTest.java index b684c7bbf..06e26ede4 100644 --- a/app/src/test/java/fr/free/nrw/commons/UtilsTest.java +++ b/app/src/test/java/fr/free/nrw/commons/UtilsTest.java @@ -1,57 +1,16 @@ package fr.free.nrw.commons; -import org.junit.Test; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; +import org.junit.Assert; +import org.junit.Test; public class UtilsTest { - - @Test public void fixExtensionJpegToJpeg() { - assertThat(Utils.fixExtension("SampleFile.jpeg", "jpeg"), is("SampleFile.jpg")); - } - - @Test public void fixExtensionJpegToJpg() { - assertThat(Utils.fixExtension("SampleFile.JPEG", null), is("SampleFile.jpg")); - } - - @Test public void fixExtensionNull() { - assertThat(Utils.fixExtension("SampleFile.jpeg", "JPEG"), is("SampleFile.jpg")); - } - - @Test public void fixExtensionJpgToJpeg() { - assertThat(Utils.fixExtension("SampleFile.jpg", "jpeg"), is("SampleFile.jpg")); - } - - @Test public void fixExtensionJpgToJpg() { - assertThat(Utils.fixExtension("SampleFile.jpg", "jpg"), is("SampleFile.jpg")); - } - - @Test public void fixExtensionPngToPng() { - assertThat(Utils.fixExtension("SampleFile.png", "png"), is("SampleFile.png")); - } - - @Test public void fixExtensionEmptyToJpg() { - assertThat(Utils.fixExtension("SampleFile", "jpg"), is("SampleFile.jpg")); - } - - @Test public void fixExtensionEmptyToJpeg() { - assertThat(Utils.fixExtension("SampleFile", "jpeg"), is("SampleFile.jpg")); - } - - @Test public void fixExtensionJpgNotExtension() { - assertThat(Utils.fixExtension("SAMPLEjpg", "jpg"), is("SAMPLEjpg.jpg")); - } - - @Test public void fixExtensionJpegNotExtension() { - assertThat(Utils.fixExtension("SAMPLE.jpeg.SAMPLE", "jpg"), is("SAMPLE.jpeg.SAMPLE.jpg")); - } - @Test public void stripLocalizedStringPass() { - assertThat(Utils.stripLocalizedString("Hello"), is("Hello")); + Assert.assertThat(Utils.stripLocalizedString("Hello"), is("Hello")); } @Test public void stripLocalizedStringJa() { - assertThat(Utils.stripLocalizedString("\"こんにちは\"@ja"), is("こんにちは")); + Assert.assertThat(Utils.stripLocalizedString("\"こんにちは\"@ja"), is("こんにちは")); } } From 654471c0980bb04731db9ed5baa57b0eaf204591 Mon Sep 17 00:00:00 2001 From: srv-twry Date: Wed, 10 May 2017 00:38:58 +0530 Subject: [PATCH 02/42] Added 'Up navigation' for settings activity --- .../nrw/commons/settings/SettingsActivity.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java index 551d7752c..1838619c0 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatDelegate; +import android.view.MenuItem; import fr.free.nrw.commons.R; @@ -34,5 +35,20 @@ public class SettingsActivity extends PreferenceActivity { settingsDelegate = AppCompatDelegate.create(this, null); } settingsDelegate.onPostCreate(savedInstanceState); + + //Get an up button + settingsDelegate.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + //Handle action-bar clicks + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + default: + return super.onOptionsItemSelected(item); + } } } \ No newline at end of file From 5639be077e943fd4bd7d0859ed10ee94531ecd7c Mon Sep 17 00:00:00 2001 From: srv-twry Date: Thu, 11 May 2017 04:01:06 +0530 Subject: [PATCH 03/42] Plural declarations in the strings resource file now according to guidelines --- app/src/main/res/values/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67ddd2396..698ce7d75 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,7 +21,7 @@ Uploading %1$s failed Tap to view - 1 file uploading + %d file uploading %d files uploading My uploads @@ -52,15 +52,15 @@ Refresh No uploads yet - 1 upload + %d upload %d uploads - Starting 1 upload + Starting %d upload Starting %d uploads - 1 upload + %d upload %d uploads No categories matching %1$s found From 2e7aaddafbf8eb514ff04c873005033693fca91d Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 11 May 2017 08:29:05 +0200 Subject: [PATCH 04/42] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-bs/strings.xml | 2 +- app/src/main/res/values-ckb/strings.xml | 56 +++++++++++++++++++++++++ app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-hi/strings.xml | 4 ++ app/src/main/res/values-nb/strings.xml | 4 +- app/src/main/res/values-sr/strings.xml | 10 ++++- 6 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/values-ckb/strings.xml diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index c69e2e131..ba7b05240 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -73,7 +73,7 @@ Dodirnite ovu poruku (ili pritisnite dugme \"nazad\") da biste preskočili ovaj Postavke Registracija O - Program otvorenog kod objavljen pod licencom <a href=\"https://github.com/wikimedia/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> O diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml new file mode 100644 index 000000000..079ac9294 --- /dev/null +++ b/app/src/main/res/values-ckb/strings.xml @@ -0,0 +1,56 @@ + + + کۆمنز + ڕێکخستنەکان + ناوی بەکارھێنەر + تێپەڕوشە + چوونە ژوورەوە + خۆ تۆمارکردن + چوونە ژوورەوە... + تکایە چاوەڕوان بە... + بە سەرکەوتووانە چوویتە ژوورەوە! + چوونە ژوورەوە شکستی ھێنا! + پەڕگە نەدۆزرایەوە. تکایە پەڕگەیەکی تر تاقی بکەرەوە. + بارکردن دەستی پێکرد! + %1$ بارکرا! + کرتە بکە بۆ بینینی بارەکەت + دەستپێکردنی بارکردنی %1 + %1$ بار دەکرێت + تەواو بوونی بارکردنی %1$ + بارکردنی %1 شکستی ھێنا + کرتە بکە بۆ بینین + سەبارەت + تاکو ئێستا ھیچ پەڕگەیەکت بار نەکردووە. + ھەوڵداناوە + ھەڵوەشاندنەوە + ئەم پەڕەیە مۆڵەتنامەی %1 پێ دەدرێت + داگرتن + مۆڵەتنامە + مۆدی شەو + مۆڵەتنامەی ھونەری ئازاد + پاوانی گشتی (دروستکەر ١٠٠ ساڵ لەمەوبەر مردووە) + پاوانی گشتی (مافی لەبەرگرتنەوە بەسەرچووە) + پاوانی گشتی (ھونەر) + پاوانی گشتی (ویلایەتە یەکگرتووەکان) + وێنەکانی سەر ویکیپیدیا لە ویکیمیدیا کۆمنزەوە دەھێندرێن. + وێنەکانت یارمەتی فێرکردنی خەڵکی دەدات لە سەرانسەری جیھان دا. + خۆت لەو کارانە لابدە کە مافی بڵاوکردنەوەیان پارێزراوە وەک ئەو شتانەی کە لەسەر ئینتەرنێت دەیان دۆزیتەوە، بە تایبەتی وێنەی پۆستەر، بەرگی کتێب و یاری، ھتد... + پێت وایە تێگەیشتوویت؟ + بەڵێ! + پۆلەكان + باركردن‌... + ھیچ ھەڵنەبژێردراوە + بێ وەسف... + مۆڵەتنامە نەزانراوە + نوێکردنەوە + باشە + شوێنە نزیکەکان + ئاگاداری + ئەم پەڕگەیە لەسەر کۆمنز ھەیە. دڵنیایت کە دەتەوێت بەردەوام بیت؟ + بەڵێ + نەخێر + ناونیشان + ناونیشانی میدیا + وەسف + بەکارھێنانی ویکیدراوە + diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index df6e04e81..99ab3b272 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -162,4 +162,5 @@ Napauta tätä viestiä (tai paina takaisin) ohittaaksesi tämän vaiheen.Otsikko Kuvaus Ryhdy beetatestaajaksi + Käytä Wikidataa diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 642ee513c..d9c8cf019 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -92,6 +92,9 @@ पिछले शीर्षक/विवरण का उपयोग करें वर्तमान स्थान स्वतः ज्ञात करें यदि छवि जियोटैगेड नहीं है तो श्रेणियों के सुझाव हेतु वर्तमान स्थान ज्ञात करें। + रात्रि मोड + डार्क थीम का प्रयोग करें + विशेषता-साझेदारी 4.0 एट्रिब्यूशन 4.0 एट्रीबुसन-शेयरअलाइक 3.0 एट्रीबुसन 3.0 @@ -165,4 +168,5 @@ मीडिया का शीर्षक विवरण बीटा परीक्षक बनें + विकिडेटा का प्रयोग करें diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index dbf8380f9..adc632cec 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -74,7 +74,7 @@ Trykk på denne meldingen (eller trykk tilbake) for å hoppe over dette steget.< Innstillinger Registrer deg Om - Programvare med åpen kildekode sluppet under <a href=\"https://github.com/wikimedia/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\">CREDITS</a> @@ -170,4 +170,6 @@ Trykk på denne meldingen (eller trykk tilbake) for å hoppe over dette steget.< Beskrivelse av mediet skal være her. Denne kan potensielt være ganske lang, og vil trenge å strekke seg over flere linjer. Vi håper det ser bra nok ut. Bli betatester Registrer deg på vår betakanal på Google Play og få tidlig tilgang til nye funksjoner og feilrettinger + Bruk Wikidata + (Advarsel: Store mengder mobildata kan bli brukt om denne slås av) diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index d7388b53a..1bd75bf19 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -10,6 +10,7 @@ Сачекајте… Успешно сте пријављени. Пријављивање није успело. + Датотека није пронађена. Покушајте са другом датотеком. Провера идентитета није успела. Отпремање је започето. Датотека „%1$s“ је отпремљена. @@ -74,7 +75,7 @@ Отвори налог О апликацији Софтвер отвореног кода доступан под лиценцом <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache вер. 2</a> Викимедијина Остава и њен лого су заштитни знаци Викимедијине Фондације и користе се са дозволом Викимедијине Фондацине. Ми не одобравамо или подржавмо Викимедијину Фондацију. - Изворни кôд се налази на <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub-у</a>. Програмске грешке су на сајту <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</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> О апликацији @@ -89,7 +90,7 @@ Преузми Лиценца Користи претходан наслов/опис - Аутоматски дохвати тренутну локацију + Аутоматски детектуј тренутну локацију Прими тренутну локацију да би предложили категорију ако слика није географски означена Ноћни режим Користити тамну тему @@ -140,6 +141,9 @@ - Слике које сте преузели са интернета - Скриншотове из сопствених апликација Пример отпремања: + — Наслов: Сиднејска опера +— Опис: Сиднејска опера, поглед преко залива +— Категорије: Сиднејска опера, Сиднејска опера са запада, погледи на Сиднејксу оперу из даљине Делите своје слике. Оживите чланке на Википедији! Слике на Википедији долазе из Оставе. Са вашим сликама помажете у образовању људи широм света. @@ -163,7 +167,9 @@ Наслов Наслов медија Опис + Опис датотеке иде овде. Може да буде поприлично дуг и приказиваће се у више редова. Надамо се да ће изгледати лепо. Постани Бета Тестер + Прикључите се на наш бета канал на Гугл плеју и приступајте новим информацијама и поправкама багова Користи Википодатке (Упозорење: онемогућавањем овога може се изазвати велика потрошња мобилних података) From a2634e69a10fbd941703ef65b56fa2ea297ebc29 Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Fri, 12 May 2017 17:05:07 +0800 Subject: [PATCH 05/42] Add local files to .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 692e4a404..1ab05305e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,7 @@ local.properties # OS files *.DS_Store Thumbs.db +app/gradle/wrapper/gradle-wrapper.jar +app/gradlew +app/gradlew.bat +app/gradle/wrapper/gradle-wrapper.properties From 5f273c9c6d1bff5cf4a1c1402f4958a8c2b86646 Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Fri, 12 May 2017 18:08:57 +0800 Subject: [PATCH 06/42] Update credits to include 3rd party libraries used Including MapBox --- CREDITS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CREDITS b/CREDITS index 812b5329f..20a64ad9f 100644 --- a/CREDITS +++ b/CREDITS @@ -19,3 +19,9 @@ their contribution to the product. * Veyndan Stuart * Vivek Maskara * Neslihan Turan + +3rd party open source libraries used: +* Butterknife +* GSON +* Timber +* MapBox From 784b51e29d0a07a3f343dcf1cd374bae25fc5636 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Fri, 12 May 2017 13:53:47 +0300 Subject: [PATCH 07/42] Add icon to map --- .../free/nrw/commons/nearby/NearbyActivity.java | 4 ++++ .../main/res/drawable-hdpi/ic_map_black_24dp.png | Bin 0 -> 310 bytes .../main/res/drawable-hdpi/ic_map_white_24dp.png | Bin 0 -> 317 bytes .../main/res/drawable-mdpi/ic_map_black_24dp.png | Bin 0 -> 222 bytes .../main/res/drawable-mdpi/ic_map_white_24dp.png | Bin 0 -> 231 bytes .../main/res/drawable-xhdpi/ic_map_black_24dp.png | Bin 0 -> 363 bytes .../main/res/drawable-xhdpi/ic_map_white_24dp.png | Bin 0 -> 373 bytes .../res/drawable-xxhdpi/ic_map_black_24dp.png | Bin 0 -> 513 bytes .../res/drawable-xxhdpi/ic_map_white_24dp.png | Bin 0 -> 528 bytes .../res/drawable-xxxhdpi/ic_map_black_24dp.png | Bin 0 -> 667 bytes .../res/drawable-xxxhdpi/ic_map_white_24dp.png | Bin 0 -> 678 bytes app/src/main/res/menu/menu_nearby.xml | 8 ++++++++ 12 files changed, 12 insertions(+) create mode 100644 app/src/main/res/drawable-hdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_map_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_map_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_map_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_map_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_map_white_24dp.png 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 de1b3b6cc..54657c2f8 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,6 +2,7 @@ package fr.free.nrw.commons.nearby; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -45,6 +46,9 @@ public class NearbyActivity extends BaseActivity { case R.id.action_refresh: refreshView(); return true; + case R.id.action_map: + Log.d("Nearby","map is clicked"); + return true; default: return super.onOptionsItemSelected(item); } diff --git a/app/src/main/res/drawable-hdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_map_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c81d0e068acbc551a151c33afe485465188c5df3 GIT binary patch literal 310 zcmV-60m=S}P)KSap~0CWGw`{s-kMDGW;7V=~EZ@DG^oV6kA6>no9gQM#k7 zm)xTyT~D{8&K;fCXFAXG^sb`=nMsSrBpI+IFTuEqJMriKTQelorKIXjY)e}On{LIy zn$9ff1B}>F|GtX|{c{}zYVKRUUL9F=s`=whL?{vmi!f!^Q*fRt1Ub|8J$D`gx|N)F z9s;5)l!da;p9o!;(~~w7?!|!_xwN5hb$g0!-&B4JH62@4)o3|;P!s-qF)8$D+c2Ql zyc6%@U{}`VwN(*oI5aCKG-$=;SK`KoQ3>+O`XwnSn~+-O19Z^kOjb<{Qvd(}07*qo IM6N<$f~&QL(EtDd literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..b7631d7d76fb46081b1bbc0f38e99436e572ec69 GIT binary patch literal 317 zcmV-D0mA-?P)#Y|WVl#6e|~YC{#k-kvSPbO9!pG0^Hd&8s4H%R#Cqora46uzg+{#+v(63)D~4ER_8?c P00000NkvXXu0mjftW}8f literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_map_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc500e96c932305d591e06d403c4c807984aac6 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+irJgR1Ar*{oCvD_A7$D(xe*Omz zA+}CEU!Gc~i8J=}99bij^q5tpZ1#77#S2X(kEk7C?g$bp|H0;L{qn(`w|Cy>*t;%2 z*&-|GY_rjAx~O)wbPuCF z&p$`Y{DM?R>C;jw?*#hKa2&b6kF}cZ%8CogXM>MLJJ|&I>AXxxl4@}|((^&nOh4uO W^;H*Q*G&XEn8DN4&t;ucLK6U1?pIL& literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..4edb178dc91bdb1388e7bd150995757e2fdd598c GIT binary patch literal 231 zcmVt0I4V?X{casvx2f_73_+u-bQT}AK41*=ir?6A z;f0AHwlWu_Uj+YPbuM^wX;(HCv>Nc_T&e4Q3_LipVa literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_map_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ecc719089c9d3fdac82e4486b2e70697d019c7 GIT binary patch literal 363 zcmV-x0hIoUP)N*z7jegvM zQ%;@U%Ji=LeENKbdk^aUd~L7gA(u;D$88@>^c_-N%fQr7t=evx2+`iUW}o7=xZs69 z!oO8?MBi8_+|nzT?G|^;eKR3iX)Qe?p>hjPUDUM06+>ZVrOkxG9e2lc<(>N}6t1*T zGT@{Kz6kNw3&3WlZTOxJ0Jb^riA6d9*p(Xap8*-jKn609feh?P4gB`ZCCwy2w7Eyl zXe0rmef7{Oo7M^Z@NMOry6c2cxKHW>UhCR!t8*UvB~kiZdKD(zaZl|u7mO|l1 zdJY3sz|wPPH59kkRd0l7V>caDtD%p2_N(ro8z$Zx=*Z;~_ZO6jUUM=WXyO0>002ov JPDHLkV1ihOr%?a^ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..301162e71baaafd76225314b2b3441586753f876 GIT binary patch literal 373 zcmV-*0gC>KP)i5HG0|Up6TAXrsgcU%T3b)&3ujCuJ?r?Zj2K2nwwpUiU{jM2$tE;*AG81_T_z!^J>e(n7 T(CC?}00000NkvXXu0mjf%iXV@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..827c9fc9f114e51cbaa1db0e9dd47dff133ce1d1 GIT binary patch literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXoKNz<9#b#WAFU@$I?2-dD334tzXs z_|kQQ#>u4`OT{&dy4kX|IWjvGy2LUCn>;#LF0MEx(;}r6#ig`JQRbE2-Q6()DvmmS zVZjL(6rKu9N?iGq#V`HEkAgaTi#ZQ}*8Okn57CVvw9r=x$ViS zv!;`sPOgu+v}P0Ej#RgZ%D`jacC6C)^Hue~W&Yxd-d(+%OIPoR{k2zc(Rt~zTUAeA zeYh}3A%%VGD`UlwFKgWUq8D#jTU9G?N`~LJs+W7_|3`g%tff}G(E=?s3${CbDKq!w zTy67ovw*E!(~p3H8?o`NKdv$|ezmgwwztgT09(54_tii;?e4$tyMeS>xX%?Kj*Qi& z6Ii?!U_q-AFZ_#QW_7JC3y~G6yxGA$YZYJDo(J;JO+fr}!s=JTf%Gw3cac@Rvpxkz zJoRVW%6(D&Q*&L_s~JpuJ9DE>{MZy|Yxa~`^y`g9Tddq|Kdf~+Gvo9&=19lQ@2pqE zyq@#v%pQT-nDuiV$}V*1@jfzr_32WQAHBDw}vZo+3Bkj t#$Aj0GW*N9(%er|y_N>8w2$kY(z%DR8W^(-44$rjF6*2UngFD$=3D>( literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..0c38abeecc1814d8cdc677bbf3b4da09bbb44738 GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXoKNz3#TCb7TBNk1xRe$t%B)%%#pEb-q2J4u48x0k91jn+FnNXNZ(Rj+1bc^}mm{#d@O3R;qGL3l9YcTvF^>qq8X{HTKd1gumq!>{DcJfBt;)VdMMP#sBT9<;#8>>N{~Lwg@b0``j~0!HeVe zs~yK!G^I4VOy?*!&e~|9%d&Cd6lR{6yHz&o_)OWp!g6|IL)xhidD^yroX*ZNRrE9L zIknq_|E4d4vE!{D7SC#YEsa`XVZm_k{e6epMLwm(C|L8j!>5-fV*mnJF)G9dkE5L2_ z(#eJ)jnXMMKJ44LW;y$|f@T%2-^S1WGTMK=lX&SWgYE%6xd~;a4%*4`%qcOv7n-&R zl$$$n3#J~q%doaj?^rA!!w11as{@B>IVUg>hZ=H!+~EtTdB`Pwm-oVN2lmx>crR4D zYHI^cKmBROU!77@2Yp|8Umc*W`CYqB0v=^G#7&y*@}Y9ae9f{03LBgD8_F*3E^Yf> z-7Ri#Ff@yC#UqpV0n?^G)nt#1=xNaTYx1|eN>}`6%cc#PNiqv%&So7**9-8>o4xZ~ z`JVq@EY^lBh~)io*!ESVLtWjr;@R_${a+>=vM7?zqo5~sM&uE{cb}!FmaorTEOoZ% zfXMb6E#*t!EVX~mz9BzDy(d-k%TI~3ItSaH$~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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/menu/menu_nearby.xml b/app/src/main/res/menu/menu_nearby.xml index 44b4c2d82..f7f5d8acc 100644 --- a/app/src/main/res/menu/menu_nearby.xml +++ b/app/src/main/res/menu/menu_nearby.xml @@ -2,6 +2,14 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> + + Date: Fri, 12 May 2017 12:51:39 +0200 Subject: [PATCH 08/42] Added support for MapView in Nearby --- app/build.gradle | 3 + .../nrw/commons/nearby/NearbyActivity.java | 19 ++++- .../nrw/commons/nearby/NearbyMapFragment.java | 83 +++++++++++++++++++ .../main/res/layout/fragment_nearby_map.xml | 16 ++++ app/src/main/res/values/strings.xml | 1 + gradle.properties | 3 +- 6 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java create mode 100644 app/src/main/res/layout/fragment_nearby_map.xml diff --git a/app/build.gradle b/app/build.gradle index c77aea346..ca3651fbd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,6 +17,9 @@ dependencies { compile "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION" annotationProcessor "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION" compile 'com.jakewharton.timber:timber:4.5.1' + compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:5.0.2@aar'){ + transitive=true + } testCompile 'junit:junit:4.12' androidTestCompile "com.android.support:support-annotations:${project.supportLibVersion}" 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 54657c2f8..ec410ca69 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.os.Bundle; import android.support.v4.app.FragmentTransaction; -import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -12,6 +11,7 @@ import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.theme.BaseActivity; public class NearbyActivity extends BaseActivity { + private boolean isMapViewActive = false; private LocationServiceManager locationManager; @@ -47,21 +47,32 @@ public class NearbyActivity extends BaseActivity { refreshView(); return true; case R.id.action_map: - Log.d("Nearby","map is clicked"); + showMapView(); return true; default: return super.onOptionsItemSelected(item); } } + private void showMapView() { + isMapViewActive = true; + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, new NearbyMapFragment()).commit(); + } + @Override protected void onResume() { super.onResume(); } protected void refreshView() { - getSupportFragmentManager().beginTransaction() - .replace(R.id.container, new NearbyListFragment()).commit(); + if (isMapViewActive) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, new NearbyMapFragment()).commit(); + } else { + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, new NearbyListFragment()).commit(); + } } public LocationServiceManager getLocationManager() { 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 new file mode 100644 index 000000000..2535aaa4b --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -0,0 +1,83 @@ +package fr.free.nrw.commons.nearby; + +import android.app.Fragment; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; +import com.mapbox.services.android.telemetry.MapboxTelemetry; + +import butterknife.BindView; +import butterknife.ButterKnife; +import fr.free.nrw.commons.R; + +public class NearbyMapFragment extends android.support.v4.app.Fragment { + @BindView(R.id.mapview) MapView mapView; + + public NearbyMapFragment() { + + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Mapbox.getInstance(getActivity(), + getString(R.string.mapbox_commons_app_token)); + MapboxTelemetry.getInstance().setTelemetryEnabled(false); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_nearby_map, container, false); + ButterKnife.bind(this, view); + + mapView.onCreate(savedInstanceState); + + setHasOptionsMenu(false); + + mapView.getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(MapboxMap mapboxMap) { + + } + }); + + return view; + } + + @Override + public void onStart() { + mapView.onStart(); + super.onStart(); + } + + @Override + public void onPause() { + mapView.onPause(); + super.onPause(); + } + + @Override + public void onResume() { + mapView.onResume(); + super.onResume(); + } + + @Override + public void onStop() { + mapView.onStop(); + super.onStop(); + } + + @Override + public void onDestroyView() { + mapView.onDestroy(); + super.onDestroyView(); + } +} diff --git a/app/src/main/res/layout/fragment_nearby_map.xml b/app/src/main/res/layout/fragment_nearby_map.xml new file mode 100644 index 000000000..ff4ba4d54 --- /dev/null +++ b/app/src/main/res/layout/fragment_nearby_map.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67ddd2396..981c617e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -167,4 +167,5 @@ Tap this message (or hit back) to skip this step. https://play.google.com/apps/testing/fr.free.nrw.commons Use Wikidata (Warning: disabling this may cause large mobile data consumption) + pk.eyJ1IjoibWFza2FyYXZpdmVrIiwiYSI6ImNqMmxvdzFjMTAwMHYzM283ZWM3eW5tcDAifQ.ib5SZ9EVjwJe6GSKve0bcg diff --git a/gradle.properties b/gradle.properties index 8bc6a1463..95e1dd81b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -gradleVersion = 2.3.0 +gradleVersion = 2.2.0 supportLibVersion = 25.2.0 @@ -13,3 +13,4 @@ android.useDeprecatedNdk=true # Library dependencies BUTTERKNIFE_VERSION=8.4.0 + From f004a0dd4326b0fa6eb49dbea733a9c0c2af5f9e Mon Sep 17 00:00:00 2001 From: maskara Date: Fri, 12 May 2017 13:52:54 +0200 Subject: [PATCH 09/42] Undo gradle change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 95e1dd81b..ccb036712 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -gradleVersion = 2.2.0 +gradleVersion = 2.3.0 supportLibVersion = 25.2.0 From 01948c431659b0b56085dd2b9e193b22a0e41aef Mon Sep 17 00:00:00 2001 From: maskara Date: Fri, 12 May 2017 14:27:00 +0200 Subject: [PATCH 10/42] Codacy fixes --- .../fr/free/nrw/commons/nearby/NearbyMapFragment.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index 2535aaa4b..367ecc039 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 @@ -1,19 +1,19 @@ package fr.free.nrw.commons.nearby; -import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import butterknife.BindView; +import butterknife.ButterKnife; + import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.services.android.telemetry.MapboxTelemetry; -import butterknife.BindView; -import butterknife.ButterKnife; import fr.free.nrw.commons.R; public class NearbyMapFragment extends android.support.v4.app.Fragment { @@ -33,7 +33,8 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_nearby_map, container, false); ButterKnife.bind(this, view); From 040d99638c2369470ec0ea1e2367fe6aac678364 Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Fri, 12 May 2017 21:30:24 +0900 Subject: [PATCH 11/42] Show failed value on license-related RuntimeException --- app/src/main/java/fr/free/nrw/commons/Utils.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index 28f4238d6..d4a049f5d 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -217,7 +217,7 @@ public class Utils { } else if (license.equals(Prefs.Licenses.CC_BY_SA)) { return "{{self|cc-by-sa-3.0}}"; } - throw new RuntimeException("Unrecognized license value"); + throw new RuntimeException("Unrecognized license value: " + license); } public static int licenseNameFor(String license) { @@ -236,7 +236,7 @@ public class Utils { } else if (license.equals(Prefs.Licenses.CC_BY_SA)) { // for backward compatibility to v2.1 return R.string.license_name_cc_by_sa_3_0; } - throw new RuntimeException("Unrecognized license value"); + throw new RuntimeException("Unrecognized license value: " + license); } public static String licenseUrlFor(String license) { @@ -251,7 +251,7 @@ public class Utils { } else if (license.equals(Prefs.Licenses.CC0)) { return "https://creativecommons.org/publicdomain/zero/1.0/"; } - throw new RuntimeException("Unrecognized license value"); + throw new RuntimeException("Unrecognized license value: " + license); } public static Uri uriForWikiPage(String name) { From d38dde0ec4a4113b3dcc6a1c1c689295b90d01e5 Mon Sep 17 00:00:00 2001 From: addshore Date: Fri, 12 May 2017 13:04:22 +0200 Subject: [PATCH 12/42] Use clientlogin API module This is the first step to allowing 2 factor authentication #328. This uses the new API module clientlogin instead of the login module. We still report the same set of errors in a 'nice' way with real error messages, how ever there are lots more that can probably be handled, for example #507. --- .../free/nrw/commons/CommonsApplication.java | 1 - .../main/java/fr/free/nrw/commons/MWApi.java | 58 +++++++++++++++++++ .../free/nrw/commons/MediaDataExtractor.java | 1 - .../free/nrw/commons/auth/LoginActivity.java | 19 ++++-- .../auth/WikiAccountAuthenticator.java | 5 +- .../nrw/commons/category/MethodAUpdater.java | 2 +- .../nrw/commons/category/PrefixUpdater.java | 2 +- .../nrw/commons/category/TitleCategories.java | 2 +- .../ContributionsSyncAdapter.java | 2 +- .../ModificationsSyncAdapter.java | 2 +- .../nrw/commons/upload/ExistingFileAsync.java | 2 +- .../nrw/commons/upload/UploadService.java | 7 +-- 12 files changed, 80 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/MWApi.java 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 5ba33a7e2..5e45d97df 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -32,7 +32,6 @@ import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.CoreProtocolPNames; -import org.mediawiki.api.MWApi; import java.io.IOException; diff --git a/app/src/main/java/fr/free/nrw/commons/MWApi.java b/app/src/main/java/fr/free/nrw/commons/MWApi.java new file mode 100644 index 000000000..37a4d02e7 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/MWApi.java @@ -0,0 +1,58 @@ +package fr.free.nrw.commons; + +import java.io.IOException; + +import org.apache.http.impl.client.AbstractHttpClient; +import org.mediawiki.api.ApiResult; + +/** + * @author Addshore + */ +public class MWApi extends org.mediawiki.api.MWApi { + + public MWApi(String apiURL, AbstractHttpClient client) { + super(apiURL, client); + } + + /** + * @param username String + * @param password String + * @return String On success: "PASS" + * failure: A failure message code (deifned by mediawiki) + * misc: genericerror-UI, genericerror-REDIRECT, genericerror-RESTART + * @throws IOException On api request IO issue + */ + public String login(String username, String password) throws IOException { + + /** Request a login token to be used later to log in. */ + ApiResult tokenData = this.action("query") + .param("action", "query") + .param("meta", "tokens") + .param("type", "login") + .post(); + String token = tokenData.getString("/api/query/tokens/@logintoken"); + + /** Actually log in. */ + ApiResult loginData = this.action("clientlogin") + .param("rememberMe", "1") + .param("username", username) + .param("password", password) + .param("logintoken", token) + .param("loginreturnurl", "http://example.com/")//TODO return to url? + .post(); + String status = loginData.getString("/api/clientlogin/@status"); + + if (status.equals("PASS")) { + this.isLoggedIn = true; + return status; + + } else if (status.equals("FAIL")) { + return loginData.getString("/api/clientlogin/@messagecode"); + } + + // UI, REDIRECT, RESTART + return "genericerror-" + status; + } + + +} 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 b09ec1b76..df9d5a4de 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -1,7 +1,6 @@ package fr.free.nrw.commons; import org.mediawiki.api.ApiResult; -import org.mediawiki.api.MWApi; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; 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 b86294e7e..b104eb2e2 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 @@ -66,7 +66,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { .param("result", result) .log(); - if (result.equals("Success")) { + if (result.equals("PASS")) { if (dialog != null && dialog.isShowing()) { dialog.dismiss(); } @@ -100,20 +100,27 @@ public class LoginActivity extends AccountAuthenticatorActivity { } else { int response; + // Match known failure message codes and provide messages if(result.equals("NetworkFailure")) { + // Matches NetworkFailure which is created by the doInBackground method response = R.string.login_failed_network; - } else if(result.equals("NotExists") || result.equals("Illegal") || result.equals("NotExists")) { + } else if (result.toLowerCase().contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) { + // Matches nosuchuser, nosuchusershort, noname response = R.string.login_failed_username; passwordEdit.setText(""); - } else if(result.equals("EmptyPass") || result.equals("WrongPass") || result.equals("WrongPluginPass")) { + + } else if (result.toLowerCase().contains("wrongpassword".toLowerCase())) { + // Matches wrongpassword, wrongpasswordempty response = R.string.login_failed_password; passwordEdit.setText(""); - } else if(result.equals("Throttled")) { + } else if (result.toLowerCase().contains("throttle".toLowerCase())) { + // Matches unknown throttle error codes response = R.string.login_failed_throttled; - } else if(result.equals("Blocked")) { + } else if (result.toLowerCase().contains("userblocked".toLowerCase())) { + // Matches login-userblocked response = R.string.login_failed_blocked; } else { - // Should never really happen + // Occurs with unhandled login failure codes Timber.d("Login failed with reason: %s", result); response = R.string.login_failed_generic; } diff --git a/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java b/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java index 9194fa316..42448ace0 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java @@ -9,11 +9,10 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import org.mediawiki.api.MWApi; - import java.io.IOException; import fr.free.nrw.commons.CommonsApplication; +import fr.free.nrw.commons.MWApi; public class WikiAccountAuthenticator extends AbstractAccountAuthenticator { @@ -46,7 +45,7 @@ public class WikiAccountAuthenticator extends AbstractAccountAuthenticator { private String getAuthCookie(String username, String password) throws IOException { MWApi api = CommonsApplication.createMWApi(); String result = api.login(username, password); - if(result.equals("Success")) { + if(result.equals("PASS")) { return api.getAuthCookie(); } else { return null; 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 74e379b37..35ab0ef17 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 @@ -3,8 +3,8 @@ package fr.free.nrw.commons.category; import android.os.AsyncTask; import android.view.View; +import fr.free.nrw.commons.MWApi; import org.mediawiki.api.ApiResult; -import org.mediawiki.api.MWApi; import java.io.IOException; import java.util.ArrayList; 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 17d7ab801..10499acbd 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 @@ -4,8 +4,8 @@ import android.os.AsyncTask; import android.text.TextUtils; import android.view.View; +import fr.free.nrw.commons.MWApi; import org.mediawiki.api.ApiResult; -import org.mediawiki.api.MWApi; import java.io.IOException; import java.util.ArrayList; 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 9622d4d3b..a372b353d 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 @@ -2,8 +2,8 @@ package fr.free.nrw.commons.category; import android.os.AsyncTask; +import fr.free.nrw.commons.MWApi; import org.mediawiki.api.ApiResult; -import org.mediawiki.api.MWApi; import java.io.IOException; import java.util.ArrayList; diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java index 59f34d1da..b3d1e8fda 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java @@ -12,8 +12,8 @@ import android.os.Bundle; import android.os.RemoteException; import android.text.TextUtils; +import fr.free.nrw.commons.MWApi; import org.mediawiki.api.ApiResult; -import org.mediawiki.api.MWApi; import java.io.IOException; import java.util.ArrayList; diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java index 228b01a80..fdc9e28a5 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java @@ -12,8 +12,8 @@ import android.database.Cursor; import android.os.Bundle; import android.os.RemoteException; +import fr.free.nrw.commons.MWApi; import org.mediawiki.api.ApiResult; -import org.mediawiki.api.MWApi; import java.io.IOException; 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 6d7b08025..14988c60c 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 @@ -6,8 +6,8 @@ import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.AlertDialog; +import fr.free.nrw.commons.MWApi; import org.mediawiki.api.ApiResult; -import org.mediawiki.api.MWApi; import java.io.IOException; import java.util.ArrayList; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java index dea134ac3..523b6a479 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java @@ -13,8 +13,8 @@ import android.support.v4.app.NotificationCompat; import android.webkit.MimeTypeMap; import android.widget.Toast; +import fr.free.nrw.commons.*; import org.mediawiki.api.ApiResult; -import org.mediawiki.api.MWApi; import java.io.FileNotFoundException; import java.io.IOException; @@ -25,11 +25,6 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import fr.free.nrw.commons.CommonsApplication; -import fr.free.nrw.commons.EventLog; -import fr.free.nrw.commons.HandlerService; -import fr.free.nrw.commons.R; -import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.contributions.ContributionsContentProvider; From a5dc7f79c1bd76c6c45ecafe068ff2e2eab2902a Mon Sep 17 00:00:00 2001 From: Udit Date: Fri, 12 May 2017 19:01:13 +0530 Subject: [PATCH 13/42] Fix - zero quantity in messages doesn't work in English #343 (#546) --- .../commons/contributions/ContributionsActivity.java | 11 ++++++++++- app/src/main/res/values/strings.xml | 4 +++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java index bbe6d7411..6b1ad3d0d 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java @@ -21,6 +21,7 @@ import android.widget.Adapter; import android.widget.AdapterView; import java.util.ArrayList; +import java.util.Locale; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.HandlerService; @@ -216,7 +217,15 @@ public class ContributionsActivity ((CursorAdapter)contributionsList.getAdapter()).swapCursor(cursor); } - getSupportActionBar().setSubtitle(getResources().getQuantityString(R.plurals.contributions_subtitle, cursor.getCount(), cursor.getCount())); + if (cursor.getCount() == 0 + && Locale.getDefault().getISO3Language().equals(Locale.ENGLISH.getISO3Language())) { + //cursor count is zero and language is english - + // we need to set the message for 0 case explicitly. + getSupportActionBar().setSubtitle(getResources() + .getString(R.string.contributions_subtitle_zero)); + } else { + getSupportActionBar().setSubtitle(getResources().getQuantityString(R.plurals.contributions_subtitle, cursor.getCount(), cursor.getCount())); + } contributionsList.clearSyncMessage(); notifyAndMigrateDataSetObservers(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cfe25cda3..e741c211b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,8 +50,10 @@ Search categories Save Refresh + No uploads yet - No uploads yet + + @string/contributions_subtitle_zero %d upload %d uploads From c2e018ae9e322e332278e98386e49be7b1040409 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Fri, 12 May 2017 17:13:06 +0300 Subject: [PATCH 14/42] Nearby places displayed on the map --- .../nrw/commons/nearby/NearbyController.java | 80 +++++++++++++++++++ .../commons/nearby/NearbyListFragment.java | 56 +------------ .../nrw/commons/nearby/NearbyMapFragment.java | 63 +++++++++++++-- .../main/res/layout/fragment_nearby_map.xml | 7 ++ 4 files changed, 146 insertions(+), 60 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java 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 new file mode 100644 index 000000000..ebf370ce4 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -0,0 +1,80 @@ +package fr.free.nrw.commons.nearby; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.annotations.MarkerOptions; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import fr.free.nrw.commons.location.LatLng; +import timber.log.Timber; + +import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; +import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; + + +public class NearbyController { + private static final int MAX_RESULTS = 1000; + private static List loadAttractionsFromLocation(LatLng curLatLng, Context context) { + Timber.d("Loading attractions near %s", curLatLng); + if (curLatLng == null) { + return Collections.emptyList(); + } + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + List places = prefs.getBoolean("useWikidata", true) + ? NearbyPlaces.getInstance().getFromWikidataQuery( + curLatLng, Locale.getDefault().getLanguage()) + : NearbyPlaces.getInstance().getFromWikiNeedsPictures(); + if (curLatLng != null) { + Timber.d("Sorting places by distance..."); + final Map distances = new HashMap<>(); + for (Place place: places) { + 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); + } + } + ); + } + return places; + } + public static List loadAttractionsFromLocationToPlaces(LatLng curLatLng, Context context){ + + List places = loadAttractionsFromLocation(curLatLng,context); + places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); + for (Place place: places) { + String distance = formatDistanceBetween(curLatLng, place.location); + place.setDistance(distance); + } + return places; + } + public static List loadAttractionsFromLocationToBaseMarkerOptions(LatLng curLatLng, Context context){ + List baseMarkerOptionses = new ArrayList<>(); + List places = loadAttractionsFromLocation(curLatLng,context); + places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); + for (Place place: places) { + String distance = formatDistanceBetween(curLatLng, place.location); + place.setDistance(distance); + baseMarkerOptionses.add(new MarkerOptions() + .position(new com.mapbox.mapboxsdk.geometry.LatLng(place.location.latitude,place.location.longitude)) + .title(place.name) + .snippet(place.description)); + } + return baseMarkerOptionses; + } +} 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 6dae3bc90..a686d66c5 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 @@ -1,14 +1,9 @@ package fr.free.nrw.commons.nearby; -import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; -import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; - import android.content.Intent; -import android.content.SharedPreferences; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.View; @@ -16,24 +11,17 @@ import android.view.ViewGroup; import android.widget.ListView; import android.widget.ProgressBar; +import java.util.List; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnItemClick; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; - -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - import timber.log.Timber; public class NearbyListFragment extends ListFragment { - private static final int MAX_RESULTS = 1000; private NearbyAsyncTask nearbyAsyncTask; @BindView(R.id.listView) ListView listview; @@ -124,8 +112,8 @@ public class NearbyListFragment extends ListFragment { @Override protected List doInBackground(Void... params) { - return loadAttractionsFromLocation( - ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation() + return NearbyController.loadAttractionsFromLocationToPlaces( + ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation(), getActivity() ); } @@ -164,40 +152,4 @@ public class NearbyListFragment extends ListFragment { startActivity(mapIntent); } } - - private List loadAttractionsFromLocation(LatLng curLatLng) { - Timber.d("Loading attractions near %s", curLatLng); - if (curLatLng == null) { - return Collections.emptyList(); - } - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - List places = prefs.getBoolean("useWikidata", true) - ? NearbyPlaces.getInstance().getFromWikidataQuery( - curLatLng, Locale.getDefault().getLanguage()) - : NearbyPlaces.getInstance().getFromWikiNeedsPictures(); - if (curLatLng != null) { - Timber.d("Sorting places by distance..."); - final Map distances = new HashMap<>(); - for (Place place: places) { - 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); - } - } - ); - } - - places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); - for (Place place: places) { - String distance = formatDistanceBetween(curLatLng, place.location); - place.setDistance(distance); - } - return places; - } } 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 367ecc039..7ed2ab03d 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 @@ -1,23 +1,34 @@ package fr.free.nrw.commons.nearby; +import android.os.AsyncTask; import android.os.Bundle; +import android.support.annotation.Nullable; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ProgressBar; import butterknife.BindView; import butterknife.ButterKnife; import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.services.android.telemetry.MapboxTelemetry; +import java.util.List; + import fr.free.nrw.commons.R; public class NearbyMapFragment extends android.support.v4.app.Fragment { + private NearbyAsyncTask nearbyAsyncTask; + @BindView(R.id.mapview) MapView mapView; + @BindView(R.id.progressBar) + ProgressBar progressBar; public NearbyMapFragment() { @@ -41,17 +52,16 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { mapView.onCreate(savedInstanceState); setHasOptionsMenu(false); - - mapView.getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(MapboxMap mapboxMap) { - - } - }); - return view; } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + nearbyAsyncTask = new NearbyAsyncTask(); + nearbyAsyncTask.execute(); + } + @Override public void onStart() { mapView.onStart(); @@ -81,4 +91,41 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { mapView.onDestroy(); super.onDestroyView(); } + + private class NearbyAsyncTask extends AsyncTask> { + + @Override + protected void onPreExecute() { + super.onPreExecute(); + progressBar.setVisibility(View.VISIBLE); + } + + @Override + protected void onProgressUpdate(Integer... values) { + super.onProgressUpdate(values); + progressBar.setProgress(values[0]); + } + + @Override + protected List doInBackground(Void... params) { + return NearbyController.loadAttractionsFromLocationToBaseMarkerOptions( + ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation(), getActivity() + ); + } + + @Override + protected void onPostExecute(final List baseMarkerOptionses) { + super.onPostExecute(baseMarkerOptionses); + + if (isCancelled()) { + return; + } + mapView.getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(MapboxMap mapboxMap) { + mapboxMap.addMarkers(baseMarkerOptionses); + } + }); + } + } } diff --git a/app/src/main/res/layout/fragment_nearby_map.xml b/app/src/main/res/layout/fragment_nearby_map.xml index ff4ba4d54..715e0d532 100644 --- a/app/src/main/res/layout/fragment_nearby_map.xml +++ b/app/src/main/res/layout/fragment_nearby_map.xml @@ -13,4 +13,11 @@ mapbox:mapbox_cameraTargetLat="50.0755" mapbox:mapbox_cameraTargetLng="14.4378" mapbox:mapbox_styleUrl="@string/style_mapbox_streets" /> + + \ No newline at end of file From 111c09bac5c1c02794683c3d92dbb864b34f588e Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Fri, 12 May 2017 22:33:54 +0800 Subject: [PATCH 15/42] Add logs to ContributionsSyncAdapter --- .../nrw/commons/contributions/ContributionsSyncAdapter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java index 59f34d1da..c5509e09b 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java @@ -30,7 +30,10 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { } private int getLimit() { - return 500; // FIXME: Parameterize! + + int limit = 100; + Timber.d("Max number of uploads set to %d", limit); + return limit; // FIXME: Parameterize! } private static final String[] existsQuery = { Contribution.Table.COLUMN_FILENAME }; @@ -68,6 +71,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { while(!done) { try { + Timber.d("Example API query: https://commons.wikimedia.org/w/api.php?action=query&list=logevents&letype=upload&leuser=Sandaru&lelimit=5"); MWApi.RequestBuilder builder = api.action("query") .param("list", "logevents") .param("letype", "upload") From f6ac8fd1a543f01b59690ebfde873767c287e0da Mon Sep 17 00:00:00 2001 From: Neslihan Date: Fri, 12 May 2017 17:55:21 +0300 Subject: [PATCH 16/42] Display nearby places on the map --- .../nrw/commons/nearby/NearbyMapFragment.java | 27 ++++++++++++------- .../main/res/layout/fragment_nearby_map.xml | 15 ----------- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index 7ed2ab03d..664b48aa2 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 @@ -14,8 +14,12 @@ import butterknife.ButterKnife; import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.camera.CameraPosition; +import com.mapbox.mapboxsdk.constants.Style; +import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.MapboxMapOptions; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.services.android.telemetry.MapboxTelemetry; @@ -25,10 +29,8 @@ import fr.free.nrw.commons.R; public class NearbyMapFragment extends android.support.v4.app.Fragment { private NearbyAsyncTask nearbyAsyncTask; - - @BindView(R.id.mapview) MapView mapView; - @BindView(R.id.progressBar) - ProgressBar progressBar; + private fr.free.nrw.commons.location.LatLng currentLocation; + private MapView mapView; public NearbyMapFragment() { @@ -37,7 +39,7 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + currentLocation = ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation(); Mapbox.getInstance(getActivity(), getString(R.string.mapbox_commons_app_token)); MapboxTelemetry.getInstance().setTelemetryEnabled(false); @@ -48,9 +50,17 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_nearby_map, container, false); ButterKnife.bind(this, view); + MapboxMapOptions options = new MapboxMapOptions() + .styleUrl(Style.OUTDOORS) + .camera(new CameraPosition.Builder() + .target(new LatLng(currentLocation.latitude, currentLocation.longitude)) + .zoom(11) + .build()); + // create map + mapView = new MapView(getActivity(), options); mapView.onCreate(savedInstanceState); - + getActivity().setContentView(mapView); setHasOptionsMenu(false); return view; } @@ -97,19 +107,16 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override protected void onPreExecute() { super.onPreExecute(); - progressBar.setVisibility(View.VISIBLE); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); - progressBar.setProgress(values[0]); } @Override protected List doInBackground(Void... params) { - return NearbyController.loadAttractionsFromLocationToBaseMarkerOptions( - ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation(), getActivity() + return NearbyController.loadAttractionsFromLocationToBaseMarkerOptions(currentLocation, getActivity() ); } diff --git a/app/src/main/res/layout/fragment_nearby_map.xml b/app/src/main/res/layout/fragment_nearby_map.xml index 715e0d532..33be54cdf 100644 --- a/app/src/main/res/layout/fragment_nearby_map.xml +++ b/app/src/main/res/layout/fragment_nearby_map.xml @@ -5,19 +5,4 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - \ No newline at end of file From 470ad29380c469a0171e52dfdafb2b865f056e66 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Fri, 12 May 2017 18:41:25 +0300 Subject: [PATCH 17/42] Fix double click to map icon and refresh icon click --- .../java/fr/free/nrw/commons/nearby/NearbyActivity.java | 9 ++++++--- .../fr/free/nrw/commons/nearby/NearbyMapFragment.java | 5 +---- app/src/main/res/layout/fragment_nearby_map.xml | 8 -------- 3 files changed, 7 insertions(+), 15 deletions(-) delete mode 100644 app/src/main/res/layout/fragment_nearby_map.xml 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 ec410ca69..9e0ce1c13 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 @@ -55,9 +55,12 @@ public class NearbyActivity extends BaseActivity { } private void showMapView() { - isMapViewActive = true; - getSupportFragmentManager().beginTransaction() - .replace(R.id.container, new NearbyMapFragment()).commit(); + if(!isMapViewActive){ + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, new NearbyMapFragment()).commit(); + isMapViewActive = true; + } + } @Override 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 664b48aa2..d590ed3a2 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 @@ -48,8 +48,6 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_nearby_map, container, false); - ButterKnife.bind(this, view); MapboxMapOptions options = new MapboxMapOptions() .styleUrl(Style.OUTDOORS) .camera(new CameraPosition.Builder() @@ -60,9 +58,8 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { // create map mapView = new MapView(getActivity(), options); mapView.onCreate(savedInstanceState); - getActivity().setContentView(mapView); setHasOptionsMenu(false); - return view; + return mapView; } @Override diff --git a/app/src/main/res/layout/fragment_nearby_map.xml b/app/src/main/res/layout/fragment_nearby_map.xml deleted file mode 100644 index 33be54cdf..000000000 --- a/app/src/main/res/layout/fragment_nearby_map.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file From 08501b9348ecb9e069c73c51931c0455d1d3cab7 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Fri, 12 May 2017 18:45:33 +0300 Subject: [PATCH 18/42] Organize imports --- .../main/java/fr/free/nrw/commons/nearby/NearbyAdapter.java | 1 - .../java/fr/free/nrw/commons/nearby/NearbyMapFragment.java | 5 ----- .../main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java | 5 ++--- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyAdapter.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyAdapter.java index 96a42e008..d2ad0b978 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyAdapter.java @@ -7,7 +7,6 @@ import android.view.ViewGroup; import android.widget.ArrayAdapter; import fr.free.nrw.commons.R; - import timber.log.Timber; public class NearbyAdapter extends ArrayAdapter { 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 d590ed3a2..bf463e87e 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 @@ -3,14 +3,9 @@ package fr.free.nrw.commons.nearby; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ProgressBar; - -import butterknife.BindView; -import butterknife.ButterKnife; import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java index 44d415505..6fe319c85 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java @@ -3,9 +3,6 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.StrictMode; -import fr.free.nrw.commons.Utils; -import fr.free.nrw.commons.location.LatLng; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -19,6 +16,8 @@ import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; public class NearbyPlaces { From f9fd354d0066ca4ad8b559bc5cf5c8d6cf684e09 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Fri, 12 May 2017 18:55:29 +0300 Subject: [PATCH 19/42] Fix Codacy issues --- .../nrw/commons/nearby/NearbyController.java | 25 ++++++++++++++++--- .../commons/nearby/NearbyListFragment.java | 4 ++- .../nrw/commons/nearby/NearbyMapFragment.java | 3 ++- 3 files changed, 27 insertions(+), 5 deletions(-) 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 ebf370ce4..fab043d14 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 @@ -24,6 +24,7 @@ import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; public class NearbyController { private static final int MAX_RESULTS = 1000; + private static List loadAttractionsFromLocation(LatLng curLatLng, Context context) { Timber.d("Loading attractions near %s", curLatLng); if (curLatLng == null) { @@ -53,7 +54,15 @@ public class NearbyController { } return places; } - public static List loadAttractionsFromLocationToPlaces(LatLng curLatLng, Context context){ + + /** + * Loads attractions from location for list view, we need to return Place data type + * @param curLatLng + * @param context + * @return + */ + + public static List loadAttractionsFromLocationToPlaces(LatLng curLatLng, Context context) { List places = loadAttractionsFromLocation(curLatLng,context); places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); @@ -63,7 +72,16 @@ public class NearbyController { } return places; } - public static List loadAttractionsFromLocationToBaseMarkerOptions(LatLng curLatLng, Context context){ + + /** + *Loads attractions from location for map view, we need to return BaseMarkerOption data type + * @param curLatLng + * @param context + * @return + */ + public static List loadAttractionsFromLocationToBaseMarkerOptions( + LatLng curLatLng, + Context context) { List baseMarkerOptionses = new ArrayList<>(); List places = loadAttractionsFromLocation(curLatLng,context); places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); @@ -71,7 +89,8 @@ public class NearbyController { String distance = formatDistanceBetween(curLatLng, place.location); place.setDistance(distance); baseMarkerOptionses.add(new MarkerOptions() - .position(new com.mapbox.mapboxsdk.geometry.LatLng(place.location.latitude,place.location.longitude)) + .position(new com.mapbox.mapboxsdk.geometry + .LatLng(place.location.latitude,place.location.longitude)) .title(place.name) .snippet(place.description)); } 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 a686d66c5..5921c0e30 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 @@ -113,7 +113,9 @@ public class NearbyListFragment extends ListFragment { @Override protected List doInBackground(Void... params) { return NearbyController.loadAttractionsFromLocationToPlaces( - ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation(), getActivity() + ((NearbyActivity)getActivity()) + .getLocationManager() + .getLatestLocation(), getActivity() ); } 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 bf463e87e..7b627ecdf 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 @@ -108,7 +108,8 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override protected List doInBackground(Void... params) { - return NearbyController.loadAttractionsFromLocationToBaseMarkerOptions(currentLocation, getActivity() + return NearbyController + .loadAttractionsFromLocationToBaseMarkerOptions(currentLocation, getActivity() ); } From ed32ebbb62a289ad48894bd27226ce9fcc974349 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Fri, 12 May 2017 19:05:20 +0300 Subject: [PATCH 20/42] Fix Codacy issues --- .../nrw/commons/nearby/NearbyActivity.java | 3 +-- .../nrw/commons/nearby/NearbyController.java | 24 ++++++++++--------- .../free/nrw/commons/nearby/NearbyPlaces.java | 5 ++-- 3 files changed, 17 insertions(+), 15 deletions(-) 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 9e0ce1c13..53e01af86 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 @@ -55,12 +55,11 @@ public class NearbyActivity extends BaseActivity { } private void showMapView() { - if(!isMapViewActive){ + if (!isMapViewActive) { getSupportFragmentManager().beginTransaction() .replace(R.id.container, new NearbyMapFragment()).commit(); isMapViewActive = true; } - } @Override 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 fab043d14..c2834dba8 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 @@ -7,6 +7,8 @@ import android.preference.PreferenceManager; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.annotations.MarkerOptions; +import fr.free.nrw.commons.location.LatLng; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -15,7 +17,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; @@ -56,13 +57,14 @@ public class NearbyController { } /** - * Loads attractions from location for list view, we need to return Place data type - * @param curLatLng - * @param context + * Loads attractions from location for list view, we need to return Place data type. + * @param curLatLng users current location + * @param context current activity * @return */ - public static List loadAttractionsFromLocationToPlaces(LatLng curLatLng, Context context) { + public static List loadAttractionsFromLocationToPlaces(LatLng curLatLng, + Context context) { List places = loadAttractionsFromLocation(curLatLng,context); places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); @@ -74,9 +76,9 @@ public class NearbyController { } /** - *Loads attractions from location for map view, we need to return BaseMarkerOption data type - * @param curLatLng - * @param context + *Loads attractions from location for map view, we need to return BaseMarkerOption data type. + * @param curLatLng users current location + * @param context the activity * @return */ public static List loadAttractionsFromLocationToBaseMarkerOptions( @@ -89,10 +91,10 @@ public class NearbyController { String distance = formatDistanceBetween(curLatLng, place.location); place.setDistance(distance); baseMarkerOptionses.add(new MarkerOptions() - .position(new com.mapbox.mapboxsdk.geometry + .position(new com.mapbox.mapboxsdk.geometry .LatLng(place.location.latitude,place.location.longitude)) - .title(place.name) - .snippet(place.description)); + .title(place.name) + .snippet(place.description)); } return baseMarkerOptionses; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java index 6fe319c85..44d415505 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java @@ -3,6 +3,9 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.StrictMode; +import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.location.LatLng; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -16,8 +19,6 @@ import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; -import fr.free.nrw.commons.Utils; -import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; public class NearbyPlaces { From c906d6d3d490004e4168875bd9a68991c6b30dcd Mon Sep 17 00:00:00 2001 From: Neslihan Date: Fri, 12 May 2017 19:12:39 +0300 Subject: [PATCH 21/42] Fix Codacy issues --- .../fr/free/nrw/commons/nearby/NearbyController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 c2834dba8..0d0712e1b 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -1,5 +1,8 @@ package fr.free.nrw.commons.nearby; +import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; +import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; + import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; @@ -19,9 +22,6 @@ import java.util.Map; import timber.log.Timber; -import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; -import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; - public class NearbyController { private static final int MAX_RESULTS = 1000; @@ -60,7 +60,7 @@ public class NearbyController { * Loads attractions from location for list view, we need to return Place data type. * @param curLatLng users current location * @param context current activity - * @return + * @return Place list that holds nearby places */ public static List loadAttractionsFromLocationToPlaces(LatLng curLatLng, @@ -79,7 +79,7 @@ public class NearbyController { *Loads attractions from location for map view, we need to return BaseMarkerOption data type. * @param curLatLng users current location * @param context the activity - * @return + * @return BaseMarkerOprions list that holds nearby places */ public static List loadAttractionsFromLocationToBaseMarkerOptions( LatLng curLatLng, From e8bbbe78d80090539ba9666da3683cc69e1f3555 Mon Sep 17 00:00:00 2001 From: addshore Date: Sat, 13 May 2017 11:57:16 +0200 Subject: [PATCH 22/42] Detect when 2FA is needed and error nicely Fixes #507 --- app/src/main/java/fr/free/nrw/commons/MWApi.java | 10 ++++++++-- .../java/fr/free/nrw/commons/auth/LoginActivity.java | 2 ++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/MWApi.java b/app/src/main/java/fr/free/nrw/commons/MWApi.java index 37a4d02e7..aef8b5cd0 100644 --- a/app/src/main/java/fr/free/nrw/commons/MWApi.java +++ b/app/src/main/java/fr/free/nrw/commons/MWApi.java @@ -18,7 +18,8 @@ public class MWApi extends org.mediawiki.api.MWApi { * @param username String * @param password String * @return String On success: "PASS" - * failure: A failure message code (deifned by mediawiki) + * continue: "2FA" (More information required for 2FA) + * failure: A failure message code (defined by mediawiki) * misc: genericerror-UI, genericerror-REDIRECT, genericerror-RESTART * @throws IOException On api request IO issue */ @@ -45,9 +46,14 @@ public class MWApi extends org.mediawiki.api.MWApi { if (status.equals("PASS")) { this.isLoggedIn = true; return status; - } else if (status.equals("FAIL")) { return loginData.getString("/api/clientlogin/@messagecode"); + } else if ( + status.equals("UI") + && loginData.getString("/api/clientlogin/requests/_v/@id").equals("TOTPAuthenticationRequest") + && loginData.getString("/api/clientlogin/requests/_v/@provider").equals("Two-factor authentication (OATH).") + ) { + return "2FA"; } // UI, REDIRECT, RESTART 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 b104eb2e2..6c3f6a389 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 @@ -119,6 +119,8 @@ public class LoginActivity extends AccountAuthenticatorActivity { } else if (result.toLowerCase().contains("userblocked".toLowerCase())) { // Matches login-userblocked response = R.string.login_failed_blocked; + } else if (result.equals("2FA")){ + response = R.string.login_failed_2fa_not_supported; } else { // Occurs with unhandled login failure codes Timber.d("Login failed with reason: %s", result); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e741c211b..0414f98fa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,6 +42,7 @@ Unable to login - please check your password Too many unsuccessful attempts. Please try again in a few minutes. Sorry, this user has been blocked on Commons + The app doesn\'t currently support 2 Factor Authentication. Login failed Upload Name this set From 0901e67853b24a8760129a0dc238c56417a17115 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sat, 13 May 2017 13:41:53 +0300 Subject: [PATCH 23/42] Optimise unnecesarry method call --- .../nrw/commons/nearby/NearbyActivity.java | 95 +++++++++++++++++-- .../nrw/commons/nearby/NearbyController.java | 28 +++--- .../commons/nearby/NearbyListFragment.java | 53 ++++++++--- .../nrw/commons/nearby/NearbyMapFragment.java | 9 +- .../fr/free/nrw/commons/nearby/Place.java | 3 +- .../nrw/commons/utils/UriDeserializer.java | 19 ++++ .../free/nrw/commons/utils/UriSerializer.java | 17 ++++ app/src/main/res/layout/activity_nearby.xml | 7 ++ app/src/main/res/layout/fragment_nearby.xml | 7 -- 9 files changed, 192 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/utils/UriDeserializer.java create mode 100644 app/src/main/java/fr/free/nrw/commons/utils/UriSerializer.java 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 53e01af86..0d1c19d9b 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 @@ -1,35 +1,57 @@ package fr.free.nrw.commons.nearby; +import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; +import android.widget.ProgressBar; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.theme.BaseActivity; +import fr.free.nrw.commons.utils.UriDeserializer; +import fr.free.nrw.commons.utils.UriSerializer; public class NearbyActivity extends BaseActivity { + @BindView(R.id.progressBar) + ProgressBar progressBar; private boolean isMapViewActive = false; + //public List placeList; private LocationServiceManager locationManager; + private LatLng curLatLang; + private Gson gson; + private String gsonPlaceList; + private String gsonCurLatLng; + private Bundle bundle; + private NearbyAsyncTask nearbyAsyncTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_nearby); + ButterKnife.bind(this); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } locationManager = new LocationServiceManager(this); locationManager.registerLocationManager(); + curLatLang = locationManager.getLatestLocation(); + nearbyAsyncTask = new NearbyAsyncTask(); + nearbyAsyncTask.execute(); - // Begin the transaction - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - NearbyListFragment fragment = new NearbyListFragment(); - ft.add(R.id.container, fragment); - ft.commit(); } @Override @@ -56,8 +78,15 @@ public class NearbyActivity extends BaseActivity { private void showMapView() { if (!isMapViewActive) { - getSupportFragmentManager().beginTransaction() - .replace(R.id.container, new NearbyMapFragment()).commit(); + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); + NearbyMapFragment fragment = new NearbyMapFragment(); + fragment.setArguments(bundle); + ft.add(R.id.container, fragment); + ft.commit(); + + //NearbyController.loadAttractionsFromLocationToBaseMarkerOptions(curLatLang, placeList); + /*getSupportFragmentManager().beginTransaction() + .replace(R.id.container, new NearbyMapFragment()).commit();*/ isMapViewActive = true; } } @@ -68,6 +97,8 @@ public class NearbyActivity extends BaseActivity { } protected void refreshView() { + //placeList = NearbyController.loadAttractionsFromLocation(curLatLang, this); + nearbyAsyncTask.execute(); if (isMapViewActive) { getSupportFragmentManager().beginTransaction() .replace(R.id.container, new NearbyMapFragment()).commit(); @@ -86,4 +117,54 @@ public class NearbyActivity extends BaseActivity { super.onDestroy(); locationManager.unregisterLocationManager(); } + + private class NearbyAsyncTask extends AsyncTask> { + + @Override + protected void onPreExecute() { + super.onPreExecute(); + } + + @Override + protected void onProgressUpdate(Integer... values) { + super.onProgressUpdate(values); + } + + @Override + protected List doInBackground(Void... params) { + return NearbyController + .loadAttractionsFromLocation(curLatLang, getApplicationContext() + ); + } + + @Override + protected void onPostExecute(List placeList) { + super.onPostExecute(placeList); + + if (isCancelled()) { + return; + } + //placeList = NearbyController.loadAttractionsFromLocation(curLatLang, getApplicationContext()); + Gson gson = new GsonBuilder() + .registerTypeAdapter(Uri.class, new UriSerializer()) + .create(); + gsonPlaceList = gson.toJson(placeList); + gsonCurLatLng = gson.toJson(curLatLang); + + bundle = new Bundle(); + bundle.putString("PlaceList", gsonPlaceList); + bundle.putString("CurLatLng", gsonCurLatLng); + + // Begin the transaction + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); + NearbyListFragment fragment = new NearbyListFragment(); + fragment.setArguments(bundle); + ft.add(R.id.container, fragment); + ft.commit(); + + if (progressBar != null) { + progressBar.setVisibility(View.GONE); + } + } + } } 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 0d0712e1b..aca2a2113 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 @@ -26,7 +26,7 @@ import timber.log.Timber; public class NearbyController { private static final int MAX_RESULTS = 1000; - private static List loadAttractionsFromLocation(LatLng curLatLng, Context context) { + public static List loadAttractionsFromLocation(LatLng curLatLng, Context context) { Timber.d("Loading attractions near %s", curLatLng); if (curLatLng == null) { return Collections.emptyList(); @@ -59,35 +59,33 @@ public class NearbyController { /** * Loads attractions from location for list view, we need to return Place data type. * @param curLatLng users current location - * @param context current activity + * @param placeList list of nearby places in Place data type * @return Place list that holds nearby places */ - public static List loadAttractionsFromLocationToPlaces(LatLng curLatLng, - Context context) { - - List places = loadAttractionsFromLocation(curLatLng,context); - places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); - for (Place place: places) { + public static List loadAttractionsFromLocationToPlaces( + LatLng curLatLng, + List placeList) { + placeList = placeList.subList(0, Math.min(placeList.size(), MAX_RESULTS)); + for (Place place: placeList) { String distance = formatDistanceBetween(curLatLng, place.location); place.setDistance(distance); } - return places; + return placeList; } /** *Loads attractions from location for map view, we need to return BaseMarkerOption data type. * @param curLatLng users current location - * @param context the activity + * @param placeList list of nearby places in Place data type * @return BaseMarkerOprions list that holds nearby places */ - public static List loadAttractionsFromLocationToBaseMarkerOptions( + public static List loadAttractionsFromLocationToBaseMarkerOptions ( LatLng curLatLng, - Context context) { + List placeList) { List baseMarkerOptionses = new ArrayList<>(); - List places = loadAttractionsFromLocation(curLatLng,context); - places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); - for (Place place: places) { + placeList = placeList.subList(0, Math.min(placeList.size(), MAX_RESULTS)); + for (Place place: placeList) { String distance = formatDistanceBetween(curLatLng, place.location); place.setDistance(distance); baseMarkerOptionses.add(new MarkerOptions() 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 5921c0e30..e72636ae6 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 @@ -11,6 +11,12 @@ import android.view.ViewGroup; import android.widget.ListView; import android.widget.ProgressBar; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.List; import butterknife.BindView; @@ -18,14 +24,18 @@ import butterknife.ButterKnife; import butterknife.OnItemClick; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.utils.UriDeserializer; import timber.log.Timber; public class NearbyListFragment extends ListFragment { - private NearbyAsyncTask nearbyAsyncTask; + //private NearbyAsyncTask nearbyAsyncTask; + private Gson gson; + private List placeList; + private LatLng curLatLng; @BindView(R.id.listView) ListView listview; - @BindView(R.id.progressBar) ProgressBar progressBar; + private NearbyAdapter adapter; @@ -35,6 +45,19 @@ public class NearbyListFragment extends ListFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Bundle bundle = this.getArguments(); + gson = new GsonBuilder() + .registerTypeAdapter(Uri.class, new UriDeserializer()) + .create(); + if (bundle != null){ + String gsonPlaceList = bundle.getString("PlaceList"); + String gsonLatLng = bundle.getString("CurLatLng"); + Type listType = new TypeToken>() {}.getType(); + placeList = gson.fromJson(gsonPlaceList, listType); + Type curLatLngType = new TypeToken() {}.getType(); + curLatLng = gson.fromJson(gsonLatLng, curLatLngType); + NearbyController.loadAttractionsFromLocationToPlaces(curLatLng, placeList); + } setRetainInstance(true); } @@ -57,32 +80,37 @@ public class NearbyListFragment extends ListFragment { // to avoid double list when screen orientation changed if (savedInstanceState == null) { adapter.clear(); - nearbyAsyncTask = new NearbyAsyncTask(); - nearbyAsyncTask.execute(); - progressBar.setVisibility(View.VISIBLE); + //nearbyAsyncTask = new NearbyAsyncTask(); + //nearbyAsyncTask.execute(); + //progressBar.setVisibility(View.VISIBLE); Timber.d("Saved instance state is null, populating ListView"); } else { - progressBar.setVisibility(View.GONE); + //progressBar.setVisibility(View.GONE); } // If we are returning here from a screen orientation and the AsyncTask is still working, // re-create and display the progress dialog. if (isTaskRunning()) { - progressBar.setVisibility(View.VISIBLE); + //progressBar.setVisibility(View.VISIBLE); } + + adapter.clear(); + adapter.addAll(placeList); + adapter.notifyDataSetChanged(); } private boolean isTaskRunning() { - return nearbyAsyncTask != null && nearbyAsyncTask.getStatus() != AsyncTask.Status.FINISHED; + //return nearbyAsyncTask != null && nearbyAsyncTask.getStatus() != AsyncTask.Status.FINISHED; + return false; } @Override public void onDetach() { // All dialogs should be closed before leaving the activity in order to avoid // the: Activity has leaked window com.android.internal.policy... exception - if (progressBar != null && progressBar.isShown()) { + /* if (progressBar != null && progressBar.isShown()) { progressBar.setVisibility(View.GONE); - } + }*/ super.onDetach(); } @@ -92,10 +120,10 @@ public class NearbyListFragment extends ListFragment { // See http://stackoverflow.com/questions/18264408/incomplete-asynctask-crashes-my-app if (isTaskRunning()) { - nearbyAsyncTask.cancel(true); + //nearbyAsyncTask.cancel(true); } } - +/* private class NearbyAsyncTask extends AsyncTask> { @Override @@ -135,6 +163,7 @@ public class NearbyListFragment extends ListFragment { adapter.notifyDataSetChanged(); } } + */ @OnItemClick(R.id.listView) void onItemClicked(int position) { 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 7b627ecdf..3bf75e193 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 @@ -23,7 +23,7 @@ import java.util.List; import fr.free.nrw.commons.R; public class NearbyMapFragment extends android.support.v4.app.Fragment { - private NearbyAsyncTask nearbyAsyncTask; + //private NearbyAsyncTask nearbyAsyncTask; private fr.free.nrw.commons.location.LatLng currentLocation; private MapView mapView; @@ -60,8 +60,8 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - nearbyAsyncTask = new NearbyAsyncTask(); - nearbyAsyncTask.execute(); + //nearbyAsyncTask = new NearbyAsyncTask(); + //nearbyAsyncTask.execute(); } @Override @@ -93,7 +93,7 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { mapView.onDestroy(); super.onDestroyView(); } - +/* private class NearbyAsyncTask extends AsyncTask> { @Override @@ -128,4 +128,5 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { }); } } + */ } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java index 222a992cc..3439763c1 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java @@ -5,7 +5,7 @@ import android.net.Uri; import fr.free.nrw.commons.location.LatLng; -public class Place { +public class Place{ public final String name; public final String description; @@ -17,6 +17,7 @@ public class Place { public Bitmap secondaryImage; public String distance; + public Place(String name, String description, String longDescription, Uri secondaryImageUrl, LatLng location) { this.name = name; diff --git a/app/src/main/java/fr/free/nrw/commons/utils/UriDeserializer.java b/app/src/main/java/fr/free/nrw/commons/utils/UriDeserializer.java new file mode 100644 index 000000000..e63cfefa8 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/UriDeserializer.java @@ -0,0 +1,19 @@ +package fr.free.nrw.commons.utils; + + +import android.net.Uri; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; + +public class UriDeserializer implements JsonDeserializer { + @Override + public Uri deserialize(final JsonElement src, final Type srcType, + final JsonDeserializationContext context) throws JsonParseException { + return Uri.parse(src.getAsString()); + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/utils/UriSerializer.java b/app/src/main/java/fr/free/nrw/commons/utils/UriSerializer.java new file mode 100644 index 000000000..d5a4c28ec --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/UriSerializer.java @@ -0,0 +1,17 @@ +package fr.free.nrw.commons.utils; + +import android.net.Uri; + +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import java.lang.reflect.Type; + + +public class UriSerializer implements JsonSerializer { + public JsonElement serialize(Uri src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(src.toString()); + } +} diff --git a/app/src/main/res/layout/activity_nearby.xml b/app/src/main/res/layout/activity_nearby.xml index d03ae8381..53f31056b 100644 --- a/app/src/main/res/layout/activity_nearby.xml +++ b/app/src/main/res/layout/activity_nearby.xml @@ -5,6 +5,13 @@ android:layout_height="match_parent" > + + - - Date: Sat, 13 May 2017 12:51:43 +0200 Subject: [PATCH 24/42] Collapse try blocks --- app/src/main/java/fr/free/nrw/commons/EventLog.java | 4 +--- .../main/java/fr/free/nrw/commons/MediaDataExtractor.java | 4 +--- app/src/main/java/fr/free/nrw/commons/Utils.java | 5 +---- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/EventLog.java b/app/src/main/java/fr/free/nrw/commons/EventLog.java index d6c8d5059..694c03b6b 100644 --- a/app/src/main/java/fr/free/nrw/commons/EventLog.java +++ b/app/src/main/java/fr/free/nrw/commons/EventLog.java @@ -94,9 +94,7 @@ public class EventLog { data.put("appversion", "Android/" + BuildConfig.VERSION_NAME); fullData.put("event", data); return new URL(CommonsApplication.EVENTLOG_URL + "?" + Utils.urlEncode(fullData.toString()) + ";"); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } catch (JSONException e) { + } catch (MalformedURLException | JSONException e) { throw new RuntimeException(e); } } 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 df9d5a4de..630cfeaff 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -110,9 +110,7 @@ public class MediaDataExtractor { doc = docBuilder.parse(new ByteArrayInputStream(source.getBytes("UTF-8"))); } catch (ParserConfigurationException e) { throw new RuntimeException(e); - } catch (IllegalStateException e) { - throw new IOException(e); - } catch (SAXException e) { + } catch (IllegalStateException | SAXException e) { throw new IOException(e); } Node templateNode = findTemplate(doc.getDocumentElement(), "information"); diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index d4a049f5d..2ed73424f 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -122,10 +122,7 @@ public class Utils { Transformer transformer = null; try { transformer = TransformerFactory.newInstance().newTransformer(); - } catch (TransformerConfigurationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (TransformerFactoryConfigurationError e) { + } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) { // TODO Auto-generated catch block e.printStackTrace(); } From 5f6f67d3e2d9d16920234714444bcab67d2414cf Mon Sep 17 00:00:00 2001 From: addshore Date: Sat, 13 May 2017 12:52:22 +0200 Subject: [PATCH 25/42] Use switch statements instead of long if elseifs --- .../main/java/fr/free/nrw/commons/Utils.java | 79 ++++++++++--------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index 2ed73424f..0ece6e119 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -199,54 +199,57 @@ public class Utils { } public static String licenseTemplateFor(String license) { - if (license.equals(Prefs.Licenses.CC_BY_3)) { - return "{{self|cc-by-3.0}}"; - } else if (license.equals(Prefs.Licenses.CC_BY_4)) { - return "{{self|cc-by-4.0}}"; - } else if (license.equals(Prefs.Licenses.CC_BY_SA_3)) { - return "{{self|cc-by-sa-3.0}}"; - } else if (license.equals(Prefs.Licenses.CC_BY_SA_4)) { - return "{{self|cc-by-sa-4.0}}"; - } else if (license.equals(Prefs.Licenses.CC0)) { - return "{{self|cc-zero}}"; - } else if (license.equals(Prefs.Licenses.CC_BY)) { - return "{{self|cc-by-3.0}}"; - } else if (license.equals(Prefs.Licenses.CC_BY_SA)) { - return "{{self|cc-by-sa-3.0}}"; + switch (license) { + case Prefs.Licenses.CC_BY_3: + return "{{self|cc-by-3.0}}"; + case Prefs.Licenses.CC_BY_4: + return "{{self|cc-by-4.0}}"; + case Prefs.Licenses.CC_BY_SA_3: + return "{{self|cc-by-sa-3.0}}"; + case Prefs.Licenses.CC_BY_SA_4: + return "{{self|cc-by-sa-4.0}}"; + case Prefs.Licenses.CC0: + return "{{self|cc-zero}}"; + case Prefs.Licenses.CC_BY: + return "{{self|cc-by-3.0}}"; + case Prefs.Licenses.CC_BY_SA: + return "{{self|cc-by-sa-3.0}}"; } throw new RuntimeException("Unrecognized license value: " + license); } public static int licenseNameFor(String license) { - if (license.equals(Prefs.Licenses.CC_BY_3)) { - return R.string.license_name_cc_by; - } else if (license.equals(Prefs.Licenses.CC_BY_4)) { - return R.string.license_name_cc_by_four; - } else if (license.equals(Prefs.Licenses.CC_BY_SA_3)) { - return R.string.license_name_cc_by_sa; - } else if (license.equals(Prefs.Licenses.CC_BY_SA_4)) { - return R.string.license_name_cc_by_sa_four; - } else if (license.equals(Prefs.Licenses.CC0)) { - return R.string.license_name_cc0; - } else if (license.equals(Prefs.Licenses.CC_BY)) { // for backward compatibility to v2.1 - return R.string.license_name_cc_by_3_0; - } else if (license.equals(Prefs.Licenses.CC_BY_SA)) { // for backward compatibility to v2.1 - return R.string.license_name_cc_by_sa_3_0; + switch (license) { + case Prefs.Licenses.CC_BY_3: + return R.string.license_name_cc_by; + case Prefs.Licenses.CC_BY_4: + return R.string.license_name_cc_by_four; + case Prefs.Licenses.CC_BY_SA_3: + return R.string.license_name_cc_by_sa; + case Prefs.Licenses.CC_BY_SA_4: + return R.string.license_name_cc_by_sa_four; + case Prefs.Licenses.CC0: + return R.string.license_name_cc0; + case Prefs.Licenses.CC_BY: // for backward compatibility to v2.1 + return R.string.license_name_cc_by_3_0; + case Prefs.Licenses.CC_BY_SA: // for backward compatibility to v2.1 + return R.string.license_name_cc_by_sa_3_0; } throw new RuntimeException("Unrecognized license value: " + license); } public static String licenseUrlFor(String license) { - if (license.equals(Prefs.Licenses.CC_BY_3)) { - return "https://creativecommons.org/licenses/by/3.0/"; - } else if (license.equals(Prefs.Licenses.CC_BY_4)) { - return "https://creativecommons.org/licenses/by/4.0/"; - } else if (license.equals(Prefs.Licenses.CC_BY_SA_3)) { - return "https://creativecommons.org/licenses/by-sa/3.0/"; - } else if (license.equals(Prefs.Licenses.CC_BY_SA_4)) { - return "https://creativecommons.org/licenses/by-sa/4.0/"; - } else if (license.equals(Prefs.Licenses.CC0)) { - return "https://creativecommons.org/publicdomain/zero/1.0/"; + switch (license) { + case Prefs.Licenses.CC_BY_3: + return "https://creativecommons.org/licenses/by/3.0/"; + case Prefs.Licenses.CC_BY_4: + return "https://creativecommons.org/licenses/by/4.0/"; + case Prefs.Licenses.CC_BY_SA_3: + return "https://creativecommons.org/licenses/by-sa/3.0/"; + case Prefs.Licenses.CC_BY_SA_4: + return "https://creativecommons.org/licenses/by-sa/4.0/"; + case Prefs.Licenses.CC0: + return "https://creativecommons.org/publicdomain/zero/1.0/"; } throw new RuntimeException("Unrecognized license value: " + license); } From 85182e3fb7c6e192e73e59ec8ca6ad06487d7379 Mon Sep 17 00:00:00 2001 From: addshore Date: Sat, 13 May 2017 12:53:00 +0200 Subject: [PATCH 26/42] Stop unnecesary unboxing of values --- .../java/fr/free/nrw/commons/contributions/Contribution.java | 2 +- .../java/fr/free/nrw/commons/media/MediaDetailFragment.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java index bcdf31d1b..c39298810 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java @@ -195,7 +195,7 @@ public class Contribution extends Media { cv.put(Table.COLUMN_LOCAL_URI, getLocalUri().toString()); } if(getImageUrl() != null) { - cv.put(Table.COLUMN_IMAGE_URL, getImageUrl().toString()); + cv.put(Table.COLUMN_IMAGE_URL, getImageUrl()); } if(getDateUploaded() != null) { cv.put(Table.COLUMN_UPLOADED, getDateUploaded().getTime()); 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 91d45b982..befc3f9cf 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 @@ -220,7 +220,7 @@ public class MediaDetailFragment extends Fragment { protected void onPostExecute(Boolean success) { detailFetchTask = null; - if (success.booleanValue()) { + if (success) { extractor.fill(media); // Set text of desc, license, and categories From f019aa2865bec77fc72d4f511d454b19ce91e33c Mon Sep 17 00:00:00 2001 From: addshore Date: Sat, 13 May 2017 13:01:05 +0200 Subject: [PATCH 27/42] Don't create local vars when returning straight away --- app/src/main/java/fr/free/nrw/commons/LicenseList.java | 3 +-- .../nrw/commons/category/CategorizationFragment.java | 3 +-- .../fr/free/nrw/commons/category/MethodAUpdater.java | 3 +-- .../java/fr/free/nrw/commons/category/PrefixUpdater.java | 9 +++------ 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/LicenseList.java b/app/src/main/java/fr/free/nrw/commons/LicenseList.java index 0ef067496..f3edf3be0 100644 --- a/app/src/main/java/fr/free/nrw/commons/LicenseList.java +++ b/app/src/main/java/fr/free/nrw/commons/LicenseList.java @@ -69,9 +69,8 @@ public class LicenseList { int nameId = stringIdByName(stringId); //Log.d("Commons", "LicenseList.nameForTemplate: nameId: " + nameId); if(nameId != 0) { - String name = res.getString(nameId); //Log.d("Commons", "LicenseList.nameForTemplate: name: " + name); - return name; + return res.getString(nameId); } return template; } 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 0f71e329b..2d7b77024 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 @@ -357,8 +357,7 @@ public class CategorizationFragment extends Fragment { new String[] {name}, null); if (cursor.moveToFirst()) { - Category cat = Category.fromCursor(cursor); - return cat; + return Category.fromCursor(cursor); } } catch (RemoteException e) { // This feels lazy, but to hell with checked exceptions. :) 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 35ab0ef17..33835119e 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 @@ -108,7 +108,6 @@ public class MethodAUpdater extends AsyncTask> { } Timber.d("Found categories from Method A search, waiting for filter"); - ArrayList filteredItems = new ArrayList<>(filterYears(categories)); - return filteredItems; + return new ArrayList<>(filterYears(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 10499acbd..350c0b21f 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 @@ -83,16 +83,14 @@ public class PrefixUpdater extends AsyncTask> { if(TextUtils.isEmpty(filter)) { ArrayList mergedItems = new ArrayList<>(catFragment.mergeItems()); Timber.d("Merged items, waiting for filter"); - ArrayList filteredItems = new ArrayList<>(filterYears(mergedItems)); - return filteredItems; + return new ArrayList<>(filterYears(mergedItems)); } //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)); Timber.d("Found cache items, waiting for filter"); - ArrayList filteredItems = new ArrayList<>(filterYears(cachedItems)); - return filteredItems; + return new ArrayList<>(filterYears(cachedItems)); } //otherwise if user has typed something in that isn't in cache, search API for matching categories @@ -119,7 +117,6 @@ public class PrefixUpdater extends AsyncTask> { } Timber.d("Found categories from Prefix search, waiting for filter"); - ArrayList filteredItems = new ArrayList<>(filterYears(categories)); - return filteredItems; + return new ArrayList<>(filterYears(categories)); } } From 5fe95813df860ebe67e81c241307bdd913228726 Mon Sep 17 00:00:00 2001 From: addshore Date: Sat, 13 May 2017 13:01:45 +0200 Subject: [PATCH 28/42] Simplify boolean expressions --- .../main/java/fr/free/nrw/commons/caching/CacheController.java | 2 +- .../free/nrw/commons/contributions/ContributionController.java | 2 +- app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/caching/CacheController.java b/app/src/main/java/fr/free/nrw/commons/caching/CacheController.java index 2d8dafacb..3cf61385d 100644 --- a/app/src/main/java/fr/free/nrw/commons/caching/CacheController.java +++ b/app/src/main/java/fr/free/nrw/commons/caching/CacheController.java @@ -32,7 +32,7 @@ public class CacheController { public void cacheCategory() { List pointCatList = new ArrayList<>(); - if (MwVolleyApi.GpsCatExists.getGpsCatExists() == true) { + if (MwVolleyApi.GpsCatExists.getGpsCatExists()) { pointCatList.addAll(MwVolleyApi.getGpsCat()); Timber.d("Categories being cached: %s", pointCatList); } else { diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java index deaf655a1..5ef34335a 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java @@ -38,7 +38,7 @@ public class ContributionController { String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Commons/images/" + new Date().getTime() + ".jpg"; File _photoFile = new File(path); try { - if(_photoFile.exists() == false) { + if(!_photoFile.exists()) { _photoFile.getParentFile().mkdirs(); _photoFile.createNewFile(); } 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 b5be52a9f..2ead068ac 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 @@ -113,7 +113,7 @@ public class ShareActivity Toast startingToast = Toast.makeText(getApplicationContext(), R.string.uploading_started, Toast.LENGTH_LONG); startingToast.show(); - if (cacheFound == false) { + if (!cacheFound) { //Has to be called after apiCall.request() app.cacheData.cacheCategory(); Timber.d("Cache the categories found"); From fc2557d47f08d272445f6bd2a66f433b3ba341e6 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sat, 13 May 2017 14:11:20 +0300 Subject: [PATCH 29/42] Fix map fragment --- .../nrw/commons/nearby/NearbyActivity.java | 54 ++++----- .../commons/nearby/NearbyListFragment.java | 106 +++--------------- .../nrw/commons/nearby/NearbyMapFragment.java | 74 ++++++------ 3 files changed, 73 insertions(+), 161 deletions(-) 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 0d1c19d9b..663c40345 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 @@ -21,7 +21,6 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.theme.BaseActivity; -import fr.free.nrw.commons.utils.UriDeserializer; import fr.free.nrw.commons.utils.UriSerializer; public class NearbyActivity extends BaseActivity { @@ -46,6 +45,7 @@ public class NearbyActivity extends BaseActivity { if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } + bundle = new Bundle(); locationManager = new LocationServiceManager(this); locationManager.registerLocationManager(); curLatLang = locationManager.getLatestLocation(); @@ -78,15 +78,7 @@ public class NearbyActivity extends BaseActivity { private void showMapView() { if (!isMapViewActive) { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - NearbyMapFragment fragment = new NearbyMapFragment(); - fragment.setArguments(bundle); - ft.add(R.id.container, fragment); - ft.commit(); - - //NearbyController.loadAttractionsFromLocationToBaseMarkerOptions(curLatLang, placeList); - /*getSupportFragmentManager().beginTransaction() - .replace(R.id.container, new NearbyMapFragment()).commit();*/ + setMapFragment(); isMapViewActive = true; } } @@ -97,15 +89,8 @@ public class NearbyActivity extends BaseActivity { } protected void refreshView() { - //placeList = NearbyController.loadAttractionsFromLocation(curLatLang, this); + nearbyAsyncTask = new NearbyAsyncTask(); nearbyAsyncTask.execute(); - if (isMapViewActive) { - getSupportFragmentManager().beginTransaction() - .replace(R.id.container, new NearbyMapFragment()).commit(); - } else { - getSupportFragmentManager().beginTransaction() - .replace(R.id.container, new NearbyListFragment()).commit(); - } } public LocationServiceManager getLocationManager() { @@ -144,27 +129,44 @@ public class NearbyActivity extends BaseActivity { if (isCancelled()) { return; } - //placeList = NearbyController.loadAttractionsFromLocation(curLatLang, getApplicationContext()); - Gson gson = new GsonBuilder() + + gson = new GsonBuilder() .registerTypeAdapter(Uri.class, new UriSerializer()) .create(); gsonPlaceList = gson.toJson(placeList); gsonCurLatLng = gson.toJson(curLatLang); - bundle = new Bundle(); + bundle.clear(); bundle.putString("PlaceList", gsonPlaceList); bundle.putString("CurLatLng", gsonCurLatLng); // Begin the transaction - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - NearbyListFragment fragment = new NearbyListFragment(); - fragment.setArguments(bundle); - ft.add(R.id.container, fragment); - ft.commit(); + if (isMapViewActive) { + setMapFragment(); + } else { + setListFragment(); + } if (progressBar != null) { progressBar.setVisibility(View.GONE); } } } + + public void setMapFragment() { + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); + NearbyMapFragment fragment = new NearbyMapFragment(); + fragment.setArguments(bundle); + ft.add(R.id.container, fragment); + ft.commit(); + } + + public void setListFragment() { + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); + NearbyListFragment fragment = new NearbyListFragment(); + fragment.setArguments(bundle); + ft.add(R.id.container, fragment); + ft.commit(); + } + } 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 e72636ae6..315082e9c 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 @@ -2,21 +2,18 @@ package fr.free.nrw.commons.nearby; import android.content.Intent; import android.net.Uri; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; -import android.widget.ProgressBar; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; -import java.util.ArrayList; import java.util.List; import butterknife.BindView; @@ -45,19 +42,6 @@ public class NearbyListFragment extends ListFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Bundle bundle = this.getArguments(); - gson = new GsonBuilder() - .registerTypeAdapter(Uri.class, new UriDeserializer()) - .create(); - if (bundle != null){ - String gsonPlaceList = bundle.getString("PlaceList"); - String gsonLatLng = bundle.getString("CurLatLng"); - Type listType = new TypeToken>() {}.getType(); - placeList = gson.fromJson(gsonPlaceList, listType); - Type curLatLngType = new TypeToken() {}.getType(); - curLatLng = gson.fromJson(gsonLatLng, curLatLngType); - NearbyController.loadAttractionsFromLocationToPlaces(curLatLng, placeList); - } setRetainInstance(true); } @@ -78,20 +62,22 @@ public class NearbyListFragment extends ListFragment { // Check that this is the first time view is created, // to avoid double list when screen orientation changed + Bundle bundle = this.getArguments(); + gson = new GsonBuilder() + .registerTypeAdapter(Uri.class, new UriDeserializer()) + .create(); + if (bundle != null){ + String gsonPlaceList = bundle.getString("PlaceList"); + String gsonLatLng = bundle.getString("CurLatLng"); + Type listType = new TypeToken>() {}.getType(); + placeList = gson.fromJson(gsonPlaceList, listType); + Type curLatLngType = new TypeToken() {}.getType(); + curLatLng = gson.fromJson(gsonLatLng, curLatLngType); + placeList = NearbyController.loadAttractionsFromLocationToPlaces(curLatLng, placeList); + } if (savedInstanceState == null) { adapter.clear(); - //nearbyAsyncTask = new NearbyAsyncTask(); - //nearbyAsyncTask.execute(); - //progressBar.setVisibility(View.VISIBLE); Timber.d("Saved instance state is null, populating ListView"); - } else { - //progressBar.setVisibility(View.GONE); - } - - // If we are returning here from a screen orientation and the AsyncTask is still working, - // re-create and display the progress dialog. - if (isTaskRunning()) { - //progressBar.setVisibility(View.VISIBLE); } adapter.clear(); @@ -99,72 +85,6 @@ public class NearbyListFragment extends ListFragment { adapter.notifyDataSetChanged(); } - private boolean isTaskRunning() { - //return nearbyAsyncTask != null && nearbyAsyncTask.getStatus() != AsyncTask.Status.FINISHED; - return false; - } - - @Override - public void onDetach() { - // All dialogs should be closed before leaving the activity in order to avoid - // the: Activity has leaked window com.android.internal.policy... exception - /* if (progressBar != null && progressBar.isShown()) { - progressBar.setVisibility(View.GONE); - }*/ - super.onDetach(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - - // See http://stackoverflow.com/questions/18264408/incomplete-asynctask-crashes-my-app - if (isTaskRunning()) { - //nearbyAsyncTask.cancel(true); - } - } -/* - private class NearbyAsyncTask extends AsyncTask> { - - @Override - protected void onPreExecute() { - super.onPreExecute(); - progressBar.setVisibility(View.VISIBLE); - } - - @Override - protected void onProgressUpdate(Integer... values) { - super.onProgressUpdate(values); - progressBar.setProgress(values[0]); - } - - @Override - protected List doInBackground(Void... params) { - return NearbyController.loadAttractionsFromLocationToPlaces( - ((NearbyActivity)getActivity()) - .getLocationManager() - .getLatestLocation(), getActivity() - ); - } - - @Override - protected void onPostExecute(List places) { - super.onPostExecute(places); - - if (isCancelled()) { - return; - } - - if (progressBar != null) { - progressBar.setVisibility(View.GONE); - } - adapter.clear(); - adapter.addAll(places); - adapter.notifyDataSetChanged(); - } - } - */ - @OnItemClick(R.id.listView) void onItemClicked(int position) { Place place = (Place) listview.getItemAtPosition(position); 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 3bf75e193..d0fbd9055 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 @@ -1,12 +1,15 @@ package fr.free.nrw.commons.nearby; -import android.os.AsyncTask; +import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.camera.CameraPosition; @@ -18,14 +21,19 @@ import com.mapbox.mapboxsdk.maps.MapboxMapOptions; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.services.android.telemetry.MapboxTelemetry; +import java.lang.reflect.Type; import java.util.List; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.utils.UriDeserializer; public class NearbyMapFragment extends android.support.v4.app.Fragment { //private NearbyAsyncTask nearbyAsyncTask; - private fr.free.nrw.commons.location.LatLng currentLocation; private MapView mapView; + private Gson gson; + private List placeList; + private List baseMarkerOptionses; + private fr.free.nrw.commons.location.LatLng curLatLng; public NearbyMapFragment() { @@ -34,7 +42,21 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - currentLocation = ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation(); + Bundle bundle = this.getArguments(); + gson = new GsonBuilder() + .registerTypeAdapter(Uri.class, new UriDeserializer()) + .create(); + if (bundle != null){ + String gsonPlaceList = bundle.getString("PlaceList"); + String gsonLatLng = bundle.getString("CurLatLng"); + Type listType = new TypeToken>() {}.getType(); + placeList = gson.fromJson(gsonPlaceList, listType); + Type curLatLngType = new TypeToken() {}.getType(); + curLatLng = gson.fromJson(gsonLatLng, curLatLngType); + baseMarkerOptionses = NearbyController + .loadAttractionsFromLocationToBaseMarkerOptions(curLatLng, placeList); + + } Mapbox.getInstance(getActivity(), getString(R.string.mapbox_commons_app_token)); MapboxTelemetry.getInstance().setTelemetryEnabled(false); @@ -46,13 +68,19 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { MapboxMapOptions options = new MapboxMapOptions() .styleUrl(Style.OUTDOORS) .camera(new CameraPosition.Builder() - .target(new LatLng(currentLocation.latitude, currentLocation.longitude)) + .target(new LatLng(curLatLng.latitude, curLatLng.longitude)) .zoom(11) .build()); // create map mapView = new MapView(getActivity(), options); mapView.onCreate(savedInstanceState); + mapView.getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(MapboxMap mapboxMap) { + mapboxMap.addMarkers(baseMarkerOptionses); + } + }); setHasOptionsMenu(false); return mapView; } @@ -60,8 +88,6 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - //nearbyAsyncTask = new NearbyAsyncTask(); - //nearbyAsyncTask.execute(); } @Override @@ -93,40 +119,4 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { mapView.onDestroy(); super.onDestroyView(); } -/* - private class NearbyAsyncTask extends AsyncTask> { - - @Override - protected void onPreExecute() { - super.onPreExecute(); - } - - @Override - protected void onProgressUpdate(Integer... values) { - super.onProgressUpdate(values); - } - - @Override - protected List doInBackground(Void... params) { - return NearbyController - .loadAttractionsFromLocationToBaseMarkerOptions(currentLocation, getActivity() - ); - } - - @Override - protected void onPostExecute(final List baseMarkerOptionses) { - super.onPostExecute(baseMarkerOptionses); - - if (isCancelled()) { - return; - } - mapView.getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(MapboxMap mapboxMap) { - mapboxMap.addMarkers(baseMarkerOptionses); - } - }); - } - } - */ } From 2dafd88a6cd8383b1ad03e06c2c39c1bcf3ba606 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sat, 13 May 2017 15:07:30 +0300 Subject: [PATCH 30/42] Fix Codacy issues --- .../nrw/commons/nearby/NearbyActivity.java | 18 ++++++++++++------ .../nrw/commons/nearby/NearbyController.java | 9 +++++++-- .../nrw/commons/nearby/NearbyListFragment.java | 17 ++++++++++------- .../nrw/commons/nearby/NearbyMapFragment.java | 2 +- .../java/fr/free/nrw/commons/nearby/Place.java | 2 +- .../nrw/commons/utils/UriDeserializer.java | 1 - 6 files changed, 31 insertions(+), 18 deletions(-) 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 663c40345..f0420f873 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 @@ -10,24 +10,24 @@ import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; +import butterknife.BindView; +import butterknife.ButterKnife; + import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; -import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; +import fr.free.nrw.commons.R; import fr.free.nrw.commons.theme.BaseActivity; import fr.free.nrw.commons.utils.UriSerializer; +import java.util.List; + public class NearbyActivity extends BaseActivity { @BindView(R.id.progressBar) ProgressBar progressBar; private boolean isMapViewActive = false; - //public List placeList; private LocationServiceManager locationManager; private LatLng curLatLang; @@ -153,6 +153,9 @@ public class NearbyActivity extends BaseActivity { } } + /** + * Calls fragment for map view + */ public void setMapFragment() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); NearbyMapFragment fragment = new NearbyMapFragment(); @@ -161,6 +164,9 @@ public class NearbyActivity extends BaseActivity { ft.commit(); } + /** + * Calls fragment for list view + */ public void setListFragment() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); NearbyListFragment fragment = new NearbyListFragment(); 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 aca2a2113..dc36d165e 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 @@ -26,6 +26,12 @@ import timber.log.Timber; public class NearbyController { private static final int MAX_RESULTS = 1000; + /** + * Prepares Place list to make their distance information update later. + * @param curLatLng current location for user + * @param context context + * @return Place list without distance information + */ public static List loadAttractionsFromLocation(LatLng curLatLng, Context context) { Timber.d("Loading attractions near %s", curLatLng); if (curLatLng == null) { @@ -62,7 +68,6 @@ public class NearbyController { * @param placeList list of nearby places in Place data type * @return Place list that holds nearby places */ - public static List loadAttractionsFromLocationToPlaces( LatLng curLatLng, List placeList) { @@ -80,7 +85,7 @@ public class NearbyController { * @param placeList list of nearby places in Place data type * @return BaseMarkerOprions list that holds nearby places */ - public static List loadAttractionsFromLocationToBaseMarkerOptions ( + public static List loadAttractionsFromLocationToBaseMarkerOptions( LatLng curLatLng, List placeList) { List baseMarkerOptionses = new ArrayList<>(); 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 315082e9c..eafa10382 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 @@ -9,19 +9,22 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ListView; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnItemClick; + import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; -import java.lang.reflect.Type; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnItemClick; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.utils.UriDeserializer; + +import java.lang.reflect.Type; +import java.util.List; + + import timber.log.Timber; public class NearbyListFragment extends ListFragment { @@ -66,7 +69,7 @@ public class NearbyListFragment extends ListFragment { gson = new GsonBuilder() .registerTypeAdapter(Uri.class, new UriDeserializer()) .create(); - if (bundle != null){ + if (bundle != null) { String gsonPlaceList = bundle.getString("PlaceList"); String gsonLatLng = bundle.getString("CurLatLng"); Type listType = new TypeToken>() {}.getType(); 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 d0fbd9055..f3fd6b6bf 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 @@ -46,7 +46,7 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { gson = new GsonBuilder() .registerTypeAdapter(Uri.class, new UriDeserializer()) .create(); - if (bundle != null){ + if (bundle != null) { String gsonPlaceList = bundle.getString("PlaceList"); String gsonLatLng = bundle.getString("CurLatLng"); Type listType = new TypeToken>() {}.getType(); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java index 3439763c1..f3e8e9438 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java @@ -5,7 +5,7 @@ import android.net.Uri; import fr.free.nrw.commons.location.LatLng; -public class Place{ +public class Place { public final String name; public final String description; diff --git a/app/src/main/java/fr/free/nrw/commons/utils/UriDeserializer.java b/app/src/main/java/fr/free/nrw/commons/utils/UriDeserializer.java index e63cfefa8..ad37b27fc 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/UriDeserializer.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/UriDeserializer.java @@ -1,6 +1,5 @@ package fr.free.nrw.commons.utils; - import android.net.Uri; import com.google.gson.JsonDeserializationContext; From 59ad9c5c91558166006efa5e2a5b2a09ae0999d8 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sat, 13 May 2017 15:14:25 +0300 Subject: [PATCH 31/42] Fix Codacy issues --- .../java/fr/free/nrw/commons/nearby/NearbyActivity.java | 7 ++++--- .../java/fr/free/nrw/commons/nearby/NearbyMapFragment.java | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) 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 f0420f873..a2921fd9c 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 @@ -18,10 +18,11 @@ import com.google.gson.GsonBuilder; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; -import fr.free.nrw.commons.R; import fr.free.nrw.commons.theme.BaseActivity; import fr.free.nrw.commons.utils.UriSerializer; +import fr.free.nrw.commons.R; + import java.util.List; public class NearbyActivity extends BaseActivity { @@ -154,7 +155,7 @@ public class NearbyActivity extends BaseActivity { } /** - * Calls fragment for map view + * Calls fragment for map view. */ public void setMapFragment() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); @@ -165,7 +166,7 @@ public class NearbyActivity extends BaseActivity { } /** - * Calls fragment for list view + * Calls fragment for list view. */ public void setListFragment() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 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 f3fd6b6bf..07702c6c0 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 @@ -21,12 +21,12 @@ import com.mapbox.mapboxsdk.maps.MapboxMapOptions; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.services.android.telemetry.MapboxTelemetry; -import java.lang.reflect.Type; -import java.util.List; - import fr.free.nrw.commons.R; import fr.free.nrw.commons.utils.UriDeserializer; +import java.lang.reflect.Type; +import java.util.List; + public class NearbyMapFragment extends android.support.v4.app.Fragment { //private NearbyAsyncTask nearbyAsyncTask; private MapView mapView; From 200625dccaf254a042a84092e4e212329d905a39 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sat, 13 May 2017 15:22:20 +0300 Subject: [PATCH 32/42] bug fix --- .../main/java/fr/free/nrw/commons/nearby/NearbyActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 a2921fd9c..0f8f176de 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 @@ -79,8 +79,10 @@ public class NearbyActivity extends BaseActivity { private void showMapView() { if (!isMapViewActive) { - setMapFragment(); isMapViewActive = true; + if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { + setMapFragment(); + } } } From c6a2f2c7ea8486696f59fe4fd6a6144382b3aa43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Sat, 13 May 2017 16:09:01 +0200 Subject: [PATCH 33/42] Get coordinate template when parsing image page Currently the image detail view does not display the coordinates. This commit adds the coordinate template to the parser and displays the results rounded to 4 digits. --- .../main/java/fr/free/nrw/commons/Media.java | 9 +++++ .../free/nrw/commons/MediaDataExtractor.java | 39 +++++++++++++++++++ .../commons/media/MediaDetailFragment.java | 14 +++++++ .../main/res/layout/fragment_media_detail.xml | 29 ++++++++++++++ 4 files changed, 91 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java index 924427cef..34cfa255c 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -144,6 +144,14 @@ public class Media implements Parcelable { this.license = license; } + public String getCoordinates() { + return coordinates; + } + + public void setCoordinates(String coordinates) { + this.coordinates = coordinates; + } + // Primary metadata fields protected Uri localUri; protected String imageUrl; @@ -155,6 +163,7 @@ public class Media implements Parcelable { protected int width; protected int height; protected String license; + protected String coordinates; protected String creator; protected ArrayList categories; // as loaded at runtime? protected Map descriptions; // multilingual descriptions as loaded diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index 630cfeaff..aa39ae0e0 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -38,6 +38,7 @@ public class MediaDataExtractor { private String author; private Date date; private String license; + private String coordinates; private LicenseList licenseList; /** @@ -122,6 +123,14 @@ public class MediaDataExtractor { author = getFlatText(authorNode); } + Node coordinateTemplateNode = findTemplate(doc.getDocumentElement(), "location"); + + if (coordinateTemplateNode != null) { + coordinates = getCoordinates(coordinateTemplateNode); + } else { + coordinates = "No coordinates found"; + } + /* Pull up the license data list... look for the templates in two ways: @@ -242,6 +251,35 @@ public class MediaDataExtractor { return parentNode.getTextContent(); } + /** + * Rounds the float to 4 digits. + * + * @param coordinate A coordinate value as string. + * @return String of the rounded number. + */ + private String formatCoordinate(String coordinate) { + Float floatNumber = Float.parseFloat(coordinate); + double roundedNumber = Math.round(floatNumber * 10000d) / 10000d; + return String.valueOf(roundedNumber); + } + + /** + * Extracts the coordinates from the template and returns them as pretty formatted string. + * Loops over the children of the coordinate template: + * {{Location|47.50111007666667|19.055700301944444}} + * and extracts the latitude and longitude as a pretty string. + * + * @param parentNode The node of the coordinates template. + * @return Pretty formatted coordinates. + * @throws IOException + */ + private String getCoordinates(Node parentNode) throws IOException { + NodeList childNodes = parentNode.getChildNodes(); + String latitudeText = formatCoordinate(childNodes.item(1).getTextContent()); + String longitudeText = formatCoordinate(childNodes.item(2).getTextContent()); + return latitudeText + " N," + longitudeText + " E"; + } + // Extract a dictionary of multilingual texts from a subset of the parse tree. // Texts are wrapped in things like {{en|foo} or {{en|1=foo bar}}. // Text outside those wrappers is stuffed into a 'default' faux language key if present. @@ -287,6 +325,7 @@ public class MediaDataExtractor { media.setCategories(categories); media.setDescriptions(descriptions); + media.setCoordinates(coordinates); if (license != null) { media.setLicense(license); } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index befc3f9cf..b32d83a31 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -70,6 +70,7 @@ public class MediaDetailFragment extends Fragment { private TextView title; private TextView desc; private TextView license; + private TextView coordinates; private LinearLayout categoryContainer; private ScrollView scrollView; private ArrayList categoryNames; @@ -123,6 +124,7 @@ public class MediaDetailFragment extends Fragment { title = (TextView) view.findViewById(R.id.mediaDetailTitle); desc = (TextView) view.findViewById(R.id.mediaDetailDesc); license = (TextView) view.findViewById(R.id.mediaDetailLicense); + coordinates = (TextView) view.findViewById(R.id.mediaDetailCoordinates); categoryContainer = (LinearLayout) view.findViewById(R.id.mediaDetailCategoryContainer); licenseList = new LicenseList(getActivity()); @@ -226,6 +228,7 @@ public class MediaDetailFragment extends Fragment { // Set text of desc, license, and categories desc.setText(prettyDescription(media)); license.setText(prettyLicense(media)); + coordinates.setText(prettyCoordinates(media)); categoryNames.removeAll(categoryNames); categoryNames.addAll(media.getCategories()); @@ -388,4 +391,15 @@ public class MediaDetailFragment extends Fragment { return licenseObj.getName(); } } + + /** + * Returns the coordinates nicely formatted. + * + * @return Coordinates as text. + */ + private String prettyCoordinates(Media media) { + String coordinates = media.getCoordinates(); + + return coordinates; + } } diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index db03bccba..279957270 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -159,6 +159,35 @@ /> + + + + + Date: Sat, 13 May 2017 16:21:08 +0200 Subject: [PATCH 34/42] Code style, Codacy fixes --- app/src/main/java/fr/free/nrw/commons/Media.java | 2 +- app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java index 34cfa255c..f8f90896a 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -163,7 +163,7 @@ public class Media implements Parcelable { protected int width; protected int height; protected String license; - protected String coordinates; + private String coordinates; protected String creator; protected ArrayList categories; // as loaded at runtime? protected Map descriptions; // multilingual descriptions as loaded diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index aa39ae0e0..cb22d9b3c 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -271,7 +271,7 @@ public class MediaDataExtractor { * * @param parentNode The node of the coordinates template. * @return Pretty formatted coordinates. - * @throws IOException + * @throws IOException Parsing failed. */ private String getCoordinates(Node parentNode) throws IOException { NodeList childNodes = parentNode.getChildNodes(); From 94b19f27b9508131c050a215bc4308677ef46117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Sat, 13 May 2017 17:22:09 +0200 Subject: [PATCH 35/42] Move coordinate logic to LatLng class --- .../free/nrw/commons/MediaDataExtractor.java | 21 +++----- .../fr/free/nrw/commons/location/LatLng.java | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index cb22d9b3c..dd012926a 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -20,6 +20,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; /** @@ -251,18 +252,6 @@ public class MediaDataExtractor { return parentNode.getTextContent(); } - /** - * Rounds the float to 4 digits. - * - * @param coordinate A coordinate value as string. - * @return String of the rounded number. - */ - private String formatCoordinate(String coordinate) { - Float floatNumber = Float.parseFloat(coordinate); - double roundedNumber = Math.round(floatNumber * 10000d) / 10000d; - return String.valueOf(roundedNumber); - } - /** * Extracts the coordinates from the template and returns them as pretty formatted string. * Loops over the children of the coordinate template: @@ -275,9 +264,11 @@ public class MediaDataExtractor { */ private String getCoordinates(Node parentNode) throws IOException { NodeList childNodes = parentNode.getChildNodes(); - String latitudeText = formatCoordinate(childNodes.item(1).getTextContent()); - String longitudeText = formatCoordinate(childNodes.item(2).getTextContent()); - return latitudeText + " N," + longitudeText + " E"; + double latitudeText = Double.parseDouble(childNodes.item(1).getTextContent()); + double longitudeText = Double.parseDouble(childNodes.item(2).getTextContent()); + LatLng coordinates = new LatLng(latitudeText, longitudeText); + + return coordinates.getPrettyCoordinateString(); } // Extract a dictionary of multilingual texts from a subset of the parse tree. diff --git a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java index 839cba14e..c84095eb6 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java @@ -42,4 +42,52 @@ public class LatLng { public String toString() { return "lat/lng: (" + this.latitude + "," + this.longitude + ")"; } + + /** + * Rounds the float to 4 digits. + * + * @param coordinate A coordinate value as string. + * @return String of the rounded number. + */ + private String formatCoordinate(double coordinate) { + double roundedNumber = Math.round(coordinate * 10000d) / 10000d; + return String.valueOf(roundedNumber); + } + + /** + * Returns "N" or "S" depending on the latitude. + * + * @return "N" or "S". + */ + private String getNorthSouth() { + if (this.latitude < 0) { + return "S"; + } + + return "N"; + } + + /** + * Returns "E" or "W" depending on the longitude. + * + * @return "E" or "W". + */ + private String getEastWest() { + if (this.longitude < 180) { + return "E"; + } + + return "W"; + } + + /** + * Returns a nicely formatted coordinate string. Used e.g. in + * the detail view. + * + * @return The formatted string. + */ + public String getPrettyCoordinateString() { + return formatCoordinate(this.latitude) + " " + this.getNorthSouth() + ", " + + formatCoordinate(this.longitude) + " " + this.getEastWest(); + } } From 93b867af4fb782b82131522bed6fcdebad6f50f3 Mon Sep 17 00:00:00 2001 From: Dinu Kumarasiri Date: Sat, 13 May 2017 11:02:54 +0200 Subject: [PATCH 36/42] Change the Title in 'My Uploads' to 'My Recent Uploads' --- 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 0414f98fa..f1404b14d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,7 +24,7 @@ %d file uploading %d files uploading - My uploads + My Recent Uploads Queued Failed %1$d%% complete From 6feed8cab11aea4fce0a0494e88e36aef9daefbb Mon Sep 17 00:00:00 2001 From: Dinu Kumarasiri Date: Sat, 13 May 2017 16:49:36 +0200 Subject: [PATCH 37/42] Add a new preference to set the upload limit --- .../fr/free/nrw/commons/settings/Prefs.java | 1 + .../commons/settings/SettingsFragment.java | 42 +++++++++++++++++++ app/src/main/res/values/strings.xml | 5 +++ app/src/main/res/xml/preferences.xml | 8 ++++ 4 files changed, 56 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/settings/Prefs.java b/app/src/main/java/fr/free/nrw/commons/settings/Prefs.java index f4ddd54ae..4c2209153 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/Prefs.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/Prefs.java @@ -5,6 +5,7 @@ public class Prefs { public static String TRACKING_ENABLED = "eventLogging"; public static final String DEFAULT_LICENSE = "defaultLicense"; + public static final String UPLOADS_SHOWING = "uploadsshowing"; public static class Licenses { public static final String CC_BY_SA_3 = "CC BY-SA 3.0"; diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index 68d174013..55048f544 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 @@ -1,10 +1,15 @@ package fr.free.nrw.commons.settings; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.SharedPreferences; import android.os.Bundle; import android.preference.CheckBoxPreference; +import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; @@ -52,5 +57,42 @@ public class SettingsFragment extends PreferenceFragment { return true; } }); + + final EditTextPreference uploadLimit = (EditTextPreference) findPreference("uploads"); + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); + int uploads = sharedPref.getInt(Prefs.UPLOADS_SHOWING, 100); + uploadLimit.setSummary(uploads+""); + uploadLimit.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + int value = Integer.parseInt(newValue.toString()); + final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); + 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); + uploadLimit.setSummary(500+""); + uploadLimit.setText(500+""); + }else{ + editor.putInt(Prefs.UPLOADS_SHOWING, Integer.parseInt(newValue.toString())); + uploadLimit.setSummary(newValue.toString()); + } + editor.apply(); + return true; + } + + }); + + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1404b14d..f501975e8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -171,4 +171,9 @@ Tap this message (or hit back) to skip this step. Use Wikidata (Warning: disabling this may cause large mobile data consumption) pk.eyJ1IjoibWFza2FyYXZpdmVrIiwiYSI6ImNqMmxvdzFjMTAwMHYzM283ZWM3eW5tcDAifQ.ib5SZ9EVjwJe6GSKve0bcg + My Recent Upload Limit + Maximum Limit + Maximum limit should be 500 + Set Recent Upload Limit + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 847f01e1c..5b8778702 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -38,4 +38,12 @@ android:summary="@string/use_wikidata_summary" /> + + \ No newline at end of file From 28ca9ec3945e797fe8c773e7791294cf1a772ce4 Mon Sep 17 00:00:00 2001 From: Dinu Kumarasiri Date: Sat, 13 May 2017 17:30:44 +0200 Subject: [PATCH 38/42] Apply the upload limit --- .../nrw/commons/contributions/ContributionsActivity.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java index 6b1ad3d0d..3621979b4 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java @@ -5,10 +5,12 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.SharedPreferences; import android.database.Cursor; import android.database.DataSetObserver; import android.os.Bundle; import android.os.IBinder; +import android.preference.PreferenceManager; import android.support.v4.app.FragmentManager; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; @@ -30,6 +32,7 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.AuthenticatedActivity; import fr.free.nrw.commons.auth.WikiAccountAuthenticator; import fr.free.nrw.commons.media.MediaDetailPagerFragment; +import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.upload.UploadService; import timber.log.Timber; @@ -206,7 +209,9 @@ public class ContributionsActivity @Override public Loader onCreateLoader(int i, Bundle bundle) { - return new CursorLoader(this, ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT); + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + int uploads = sharedPref.getInt(Prefs.UPLOADS_SHOWING, 100); + return new CursorLoader(this, ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT+ "LIMIT "+uploads); } @Override From 7050efc996a7363d2b296cb30e3615342727be82 Mon Sep 17 00:00:00 2001 From: Dinu Kumarasiri Date: Sat, 13 May 2017 17:45:16 +0200 Subject: [PATCH 39/42] Fix Codecy Failures Fix Codecy Failures Fix Codecy Failures --- .../contributions/ContributionsActivity.java | 10 +++++-- .../commons/settings/SettingsFragment.java | 28 ++++++++++--------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java index 3621979b4..7900151c7 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java @@ -42,7 +42,8 @@ public class ContributionsActivity AdapterView.OnItemClickListener, MediaDetailPagerFragment.MediaDetailProvider, FragmentManager.OnBackStackChangedListener, - ContributionsListFragment.SourceRefresher { + ContributionsListFragment.SourceRefresher +{ private Cursor allContributions; private ContributionsListFragment contributionsList; @@ -209,9 +210,12 @@ public class ContributionsActivity @Override public Loader onCreateLoader(int i, Bundle bundle) { - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences sharedPref = + PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); int uploads = sharedPref.getInt(Prefs.UPLOADS_SHOWING, 100); - return new CursorLoader(this, ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT+ "LIMIT "+uploads); + return new CursorLoader(this, ContributionsContentProvider.BASE_URI, + Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, + CONTRIBUTION_SORT + "LIMIT " + uploads); } @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 55048f544..d5eeda7e7 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 @@ -41,7 +41,7 @@ public class SettingsFragment extends PreferenceFragment { }); licensePreference.setSummary(getString(Utils.licenseNameFor(licensePreference.getValue()))); - licensePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + licensePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener(){ @Override public boolean onPreferenceChange(Preference preference, Object newValue) { preference.setSummary(getString(Utils.licenseNameFor((String) newValue))); @@ -59,31 +59,33 @@ public class SettingsFragment extends PreferenceFragment { }); final EditTextPreference uploadLimit = (EditTextPreference) findPreference("uploads"); - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); + SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(getActivity().getApplicationContext()); int uploads = sharedPref.getInt(Prefs.UPLOADS_SHOWING, 100); - uploadLimit.setSummary(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 sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); + final SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(getActivity().getApplicationContext()); final SharedPreferences.Editor editor = sharedPref.edit(); - if(value > 500){ + 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) { - - } - }) + .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); - uploadLimit.setSummary(500+""); - uploadLimit.setText(500+""); - }else{ + uploadLimit.setSummary(500 + ""); + uploadLimit.setText(500 + ""); + } else { editor.putInt(Prefs.UPLOADS_SHOWING, Integer.parseInt(newValue.toString())); uploadLimit.setSummary(newValue.toString()); } From e299536c8a7b260824848a4df5825dd8347025ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Sun, 14 May 2017 10:00:17 +0200 Subject: [PATCH 40/42] Code style --- app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java | 3 ++- app/src/main/java/fr/free/nrw/commons/location/LatLng.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index dd012926a..344546c7a 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -1,5 +1,7 @@ package fr.free.nrw.commons; +import fr.free.nrw.commons.location.LatLng; + import org.mediawiki.api.ApiResult; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -20,7 +22,6 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; /** diff --git a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java index c84095eb6..47d112991 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java @@ -87,7 +87,7 @@ public class LatLng { * @return The formatted string. */ public String getPrettyCoordinateString() { - return formatCoordinate(this.latitude) + " " + this.getNorthSouth() + ", " + - formatCoordinate(this.longitude) + " " + this.getEastWest(); + return formatCoordinate(this.latitude) + " " + this.getNorthSouth() + ", " + + formatCoordinate(this.longitude) + " " + this.getEastWest(); } } From cce8715fad808d9f894b4ccf096c3c8f73836ac2 Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 14 May 2017 11:33:39 +0200 Subject: [PATCH 41/42] Showing an overlay dialog when a nearby item is tapped --- app/src/main/assets/queries/nearby_query.txt | 43 +++++++ .../nrw/commons/nearby/NearbyBaseMarker.java | 88 ++++++++++++++ .../nrw/commons/nearby/NearbyController.java | 36 +++--- .../nrw/commons/nearby/NearbyInfoDialog.java | 110 ++++++++++++++++++ .../commons/nearby/NearbyListFragment.java | 10 +- .../nrw/commons/nearby/NearbyMapFragment.java | 26 ++++- .../free/nrw/commons/nearby/NearbyMarker.java | 31 +++++ .../free/nrw/commons/nearby/NearbyPlaces.java | 73 +++++------- .../fr/free/nrw/commons/nearby/Place.java | 6 +- .../nrw/commons/ui/widget/OverlayDialog.java | 48 ++++++++ .../fr/free/nrw/commons/utils/DialogUtil.java | 80 +++++++++++++ .../fr/free/nrw/commons/utils/FileUtils.java | 33 ++++++ .../main/res/layout/dialog_nearby_info.xml | 97 +++++++++++++++ app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/styles.xml | 6 + 15 files changed, 609 insertions(+), 79 deletions(-) create mode 100644 app/src/main/assets/queries/nearby_query.txt create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/NearbyBaseMarker.java create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/NearbyMarker.java create mode 100644 app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java create mode 100644 app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java create mode 100644 app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java create mode 100644 app/src/main/res/layout/dialog_nearby_info.xml diff --git a/app/src/main/assets/queries/nearby_query.txt b/app/src/main/assets/queries/nearby_query.txt new file mode 100644 index 000000000..02f741228 --- /dev/null +++ b/app/src/main/assets/queries/nearby_query.txt @@ -0,0 +1,43 @@ +SELECT + (SAMPLE(?location) as ?location) + ?item + (SAMPLE(COALESCE(?item_label_preferred_language, ?item_label_any_language)) as ?label) + (SAMPLE(?classId) as ?class) + (SAMPLE(COALESCE(?class_label_preferred_language, ?class_label_any_language, "?")) as ?class_label) + (SAMPLE(COALESCE(?icon0, ?icon1)) as ?icon) + (SAMPLE(COALESCE(?emoji0, ?emoji1)) as ?emoji) + (SAMPLE(?sitelink) as ?sitelink) + WHERE { + # Around given location... + SERVICE wikibase:around { + ?item wdt:P625 ?location. + bd:serviceParam wikibase:center "Point(${LONG} ${LAT})"^^geo:wktLiteral. + bd:serviceParam wikibase:radius "${RADIUS}" . # Radius in kilometers. + } + + # ... and without an image. + MINUS {?item wdt:P18 []} + + # Get the label in the preferred language of the user, or any other language if no label is available in that language. + OPTIONAL {?item rdfs:label ?item_label_preferred_language. FILTER (lang(?item_label_preferred_language) = "${LANG}")} + OPTIONAL {?item rdfs:label ?item_label_any_language} + + # Get the class label in the preferred language of the user, or any other language if no label is available in that language. + OPTIONAL { + ?item p:P31/ps:P31 ?classId. + OPTIONAL {?classId rdfs:label ?class_label_preferred_language. FILTER (lang(?class_label_preferred_language) = "${LANG}")} + OPTIONAL {?classId rdfs:label ?class_label_any_language} + + # Get icon + OPTIONAL { ?classId wdt:P2910 ?icon0. } + OPTIONAL { ?classId wdt:P279*/wdt:P2910 ?icon1. } + # Get emoji + OPTIONAL { ?classId wdt:P487 ?emoji0. } + OPTIONAL { ?classId wdt:P279*/wdt:P487 ?emoji1. } + OPTIONAL { + ?sitelink schema:about ?item . + ?sitelink schema:inLanguage "en" + } + } + } + GROUP BY ?item \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyBaseMarker.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyBaseMarker.java new file mode 100644 index 000000000..686b3e6ce --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyBaseMarker.java @@ -0,0 +1,88 @@ +package fr.free.nrw.commons.nearby; + +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.annotations.Icon; +import com.mapbox.mapboxsdk.annotations.IconFactory; +import com.mapbox.mapboxsdk.geometry.LatLng; + +import fr.free.nrw.commons.utils.UriDeserializer; +import fr.free.nrw.commons.utils.UriSerializer; + +public class NearbyBaseMarker extends BaseMarkerOptions { + private Place place; + public NearbyBaseMarker() { + + } + + public NearbyBaseMarker place(Place place) { + this.place = place; + return getThis(); + } + + public NearbyBaseMarker(Parcel in) { + Gson gson = new GsonBuilder() + .registerTypeAdapter(Uri.class, new UriDeserializer()) + .create(); + + position((LatLng) in.readParcelable(LatLng.class.getClassLoader())); + snippet(in.readString()); + String iconId = in.readString(); + Bitmap iconBitmap = in.readParcelable(Bitmap.class.getClassLoader()); + Icon icon = IconFactory.recreate(iconId, iconBitmap); + icon(icon); + title(in.readString()); + String gsonString = in.readString(); + place(gson.fromJson(gsonString, Place.class)); + } + + @Override + public NearbyBaseMarker getThis() { + return this; + } + + @Override + public NearbyMarker getMarker() { + return new NearbyMarker(this, place); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + Gson gson = new GsonBuilder() + .registerTypeAdapter(Uri.class, new UriSerializer()) + .create(); + + dest.writeParcelable(position, flags); + dest.writeString(snippet); + dest.writeString(icon.getId()); + dest.writeParcelable(icon.getBitmap(), flags); + dest.writeString(title); + dest.writeString(gson.toJson(place)); + } + + public Place getPlace() { + return place; + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public NearbyBaseMarker createFromParcel(Parcel in) { + return new NearbyBaseMarker(in); + } + + public NearbyBaseMarker[] newArray(int size) { + return new NearbyBaseMarker[size]; + } + }; +} diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java index dc36d165e..ba2aec1d9 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -1,17 +1,10 @@ package fr.free.nrw.commons.nearby; -import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; -import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; - import android.content.Context; import android.content.SharedPreferences; +import android.graphics.drawable.Icon; import android.preference.PreferenceManager; -import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; -import com.mapbox.mapboxsdk.annotations.MarkerOptions; - -import fr.free.nrw.commons.location.LatLng; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -20,8 +13,12 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; +import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; +import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; + public class NearbyController { private static final int MAX_RESULTS = 1000; @@ -40,7 +37,9 @@ public class NearbyController { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); List places = prefs.getBoolean("useWikidata", true) ? NearbyPlaces.getInstance().getFromWikidataQuery( - curLatLng, Locale.getDefault().getLanguage()) + context, + curLatLng, + Locale.getDefault().getLanguage()) : NearbyPlaces.getInstance().getFromWikiNeedsPictures(); if (curLatLng != null) { Timber.d("Sorting places by distance..."); @@ -85,19 +84,24 @@ public class NearbyController { * @param placeList list of nearby places in Place data type * @return BaseMarkerOprions list that holds nearby places */ - public static List loadAttractionsFromLocationToBaseMarkerOptions( + public static List loadAttractionsFromLocationToBaseMarkerOptions( LatLng curLatLng, List placeList) { - List baseMarkerOptionses = new ArrayList<>(); + List baseMarkerOptionses = new ArrayList<>(); placeList = placeList.subList(0, Math.min(placeList.size(), MAX_RESULTS)); for (Place place: placeList) { String distance = formatDistanceBetween(curLatLng, place.location); place.setDistance(distance); - baseMarkerOptionses.add(new MarkerOptions() - .position(new com.mapbox.mapboxsdk.geometry - .LatLng(place.location.latitude,place.location.longitude)) - .title(place.name) - .snippet(place.description)); + + NearbyBaseMarker nearbyBaseMarker = new NearbyBaseMarker(); + nearbyBaseMarker.title(place.name); + nearbyBaseMarker.position( + new com.mapbox.mapboxsdk.geometry.LatLng( + place.location.latitude, + place.location.longitude)); + nearbyBaseMarker.place(place); + + baseMarkerOptionses.add(nearbyBaseMarker); } return baseMarkerOptionses; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java new file mode 100644 index 000000000..e777eb3ee --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java @@ -0,0 +1,110 @@ +package fr.free.nrw.commons.nearby; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import butterknife.Unbinder; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.ui.widget.OverlayDialog; +import fr.free.nrw.commons.utils.DialogUtil; + +public class NearbyInfoDialog extends OverlayDialog { + + private final static String ARG_TITLE = "placeTitle"; + private final static String ARG_DESC = "placeDesc"; + private final static String ARG_LATITUDE = "latitude"; + private final static String ARG_LONGITUDE = "longitude"; + private final static String ARG_ARTICLE_LINK = "articleLink"; + private final static String ARG_WIKI_DATA_LINK = "wikiDataLink"; + + @BindView(R.id.link_preview_title) + TextView placeTitle; + @BindView(R.id.link_preview_extract) + TextView placeDescription; + + @BindView(R.id.link_preview_go_button) + TextView goToButton; + + private Unbinder unbinder; + + private LatLng location; + private Uri articleLink; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.dialog_nearby_info, container, false); + unbinder = ButterKnife.bind(this, view); + initUi(); + return view; + } + + private void initUi() { + Bundle bundle = getArguments(); + placeTitle.setText(bundle.getString(ARG_TITLE)); + placeDescription.setText(bundle.getString(ARG_DESC)); + location = new LatLng(bundle.getDouble(ARG_LATITUDE), bundle.getDouble(ARG_LONGITUDE)); + getArticleLink(bundle); + } + + private void getArticleLink(Bundle bundle) { + String articleLink = bundle.getString(ARG_ARTICLE_LINK); + articleLink = articleLink.replace("<", "").replace(">", ""); + + if (Utils.isNullOrWhiteSpace(articleLink) || articleLink == "\n") { + articleLink = bundle.getString(ARG_WIKI_DATA_LINK).replace("<", "").replace(">", ""); + } + + if (!Utils.isNullOrWhiteSpace(articleLink) && articleLink != "\n") { + this.articleLink = Uri.parse(articleLink); + } else { + goToButton.setVisibility(View.GONE); + } + } + + public static void showYourself(FragmentActivity fragmentActivity, Place place) { + NearbyInfoDialog mDialog = new NearbyInfoDialog(); + Bundle bundle = new Bundle(); + bundle.putString(ARG_TITLE, place.name); + bundle.putString(ARG_DESC, place.description); + bundle.putDouble(ARG_LATITUDE, place.location.latitude); + bundle.putDouble(ARG_LONGITUDE, place.location.longitude); + bundle.putString(ARG_ARTICLE_LINK, place.siteLink.toString()); + bundle.putString(ARG_WIKI_DATA_LINK, place.wikiDataLink.toString()); + mDialog.setArguments(bundle); + DialogUtil.showSafely(fragmentActivity, mDialog); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unbinder.unbind(); + } + + @OnClick(R.id.link_preview_directions_button) + void onDirectionsClick() { + //Open map app at given position + Uri gmmIntentUri = Uri.parse("geo:0,0?q=" + location.latitude + "," + location.longitude); + Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); + + if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { + startActivity(mapIntent); + } + } + + @OnClick(R.id.link_preview_go_button) + void onReadArticleClick() { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, articleLink); + startActivity(browserIntent); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java index eafa10382..048f1d450 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java @@ -28,8 +28,6 @@ import java.util.List; import timber.log.Timber; public class NearbyListFragment extends ListFragment { - - //private NearbyAsyncTask nearbyAsyncTask; private Gson gson; private List placeList; private LatLng curLatLng; @@ -98,12 +96,6 @@ public class NearbyListFragment extends ListFragment { Timber.d("Item at position %d has coords: Lat: %f Long: %f", position, latitude, longitude); - //Open map app at given position - Uri gmmIntentUri = Uri.parse("geo:0,0?q=" + latitude + "," + longitude); - Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); - - if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { - startActivity(mapIntent); - } + NearbyInfoDialog.showYourself(getActivity(), place); } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index 07702c6c0..de92a596b 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; @@ -11,7 +12,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.mapbox.mapboxsdk.Mapbox; -import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.geometry.LatLng; @@ -21,18 +22,17 @@ import com.mapbox.mapboxsdk.maps.MapboxMapOptions; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.services.android.telemetry.MapboxTelemetry; -import fr.free.nrw.commons.R; -import fr.free.nrw.commons.utils.UriDeserializer; - import java.lang.reflect.Type; import java.util.List; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.utils.UriDeserializer; + public class NearbyMapFragment extends android.support.v4.app.Fragment { - //private NearbyAsyncTask nearbyAsyncTask; private MapView mapView; private Gson gson; private List placeList; - private List baseMarkerOptionses; + private List baseMarkerOptionses; private fr.free.nrw.commons.location.LatLng curLatLng; public NearbyMapFragment() { @@ -79,9 +79,23 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public void onMapReady(MapboxMap mapboxMap) { mapboxMap.addMarkers(baseMarkerOptionses); + + mapboxMap.setOnMarkerClickListener(new MapboxMap.OnMarkerClickListener() { + @Override + public boolean onMarkerClick(@NonNull Marker marker) { + if (marker instanceof NearbyMarker) { + NearbyMarker nearbyMarker = (NearbyMarker) marker; + Place place = nearbyMarker.getNearbyBaseMarker().getPlace(); + NearbyInfoDialog.showYourself(getActivity(), place); + } + return false; + } + }); } }); + setHasOptionsMenu(false); + return mapView; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMarker.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMarker.java new file mode 100644 index 000000000..c65ede203 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMarker.java @@ -0,0 +1,31 @@ +package fr.free.nrw.commons.nearby; + +import com.mapbox.mapboxsdk.annotations.Marker; + +public class NearbyMarker extends Marker { + private Place place; + private NearbyBaseMarker nearbyBaseMarker; + + /** + * Creates a instance of {@link Marker} using the builder of Marker. + * + * @param baseMarkerOptions The builder used to construct the Marker. + */ + public NearbyMarker(NearbyBaseMarker baseMarkerOptions, Place place) { + super(baseMarkerOptions); + this.place = place; + this.nearbyBaseMarker = baseMarkerOptions; + } + + public NearbyBaseMarker getNearbyBaseMarker() { + return nearbyBaseMarker; + } + + public Place getPlace() { + return place; + } + + public void setNearbyBaseMarker(NearbyBaseMarker nearbyBaseMarker) { + this.nearbyBaseMarker = nearbyBaseMarker; + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java index 44d415505..a6d08be04 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java @@ -1,11 +1,9 @@ package fr.free.nrw.commons.nearby; +import android.content.Context; import android.net.Uri; import android.os.StrictMode; -import fr.free.nrw.commons.Utils; -import fr.free.nrw.commons.location.LatLng; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -19,6 +17,9 @@ import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.utils.FileUtils; import timber.log.Timber; public class NearbyPlaces { @@ -28,44 +29,6 @@ public class NearbyPlaces { private static final double MAX_RADIUS = 300.0; private static final double RADIUS_MULTIPLIER = 1.618; private static final String WIKIDATA_QUERY_URL = "https://query.wikidata.org/sparql?query=${QUERY}"; - private static final String WIKIDATA_QUERY_TEMPLATE = "SELECT\n" + - " (SAMPLE(?location) as ?location)\n" + - " ?item\n" + - " (SAMPLE(COALESCE(?item_label_preferred_language, ?item_label_any_language)) as ?label)\n" + - " (SAMPLE(?classId) as ?class)\n" + - " (SAMPLE(COALESCE(?class_label_preferred_language, ?class_label_any_language, \"?\")) as ?class_label)\n" + - " (SAMPLE(COALESCE(?icon0, ?icon1)) as ?icon)\n" + - " (SAMPLE(COALESCE(?emoji0, ?emoji1)) as ?emoji)\n" + - "WHERE {\n" + - " # Around given location...\n" + - " SERVICE wikibase:around {\n" + - " ?item wdt:P625 ?location.\n" + - " bd:serviceParam wikibase:center \"Point(${LONG} ${LAT})\"^^geo:wktLiteral. \n" + - " bd:serviceParam wikibase:radius \"${RADIUS}\" . # Radius in kilometers.\n" + - " }\n" + - " \n" + - " # ... and without an image.\n" + - " MINUS {?item wdt:P18 []}\n" + - " \n" + - " # Get the label in the preferred language of the user, or any other language if no label is available in that language.\n" + - " OPTIONAL {?item rdfs:label ?item_label_preferred_language. FILTER (lang(?item_label_preferred_language) = \"${LANG}\")}\n" + - " OPTIONAL {?item rdfs:label ?item_label_any_language}\n" + - " \n" + - " # Get the class label in the preferred language of the user, or any other language if no label is available in that language.\n" + - " OPTIONAL {\n" + - " ?item p:P31/ps:P31 ?classId.\n" + - " OPTIONAL {?classId rdfs:label ?class_label_preferred_language. FILTER (lang(?class_label_preferred_language) = \"${LANG}\")}\n" + - " OPTIONAL {?classId rdfs:label ?class_label_any_language}\n" + - "\n" + - " # Get icon\n" + - " OPTIONAL { ?classId wdt:P2910 ?icon0. }\n" + - " OPTIONAL { ?classId wdt:P279*/wdt:P2910 ?icon1. }\n" + - " # Get emoji\n" + - " OPTIONAL { ?classId wdt:P487 ?emoji0. }\n" + - " OPTIONAL { ?classId wdt:P279*/wdt:P487 ?emoji1. }\n" + - " }\n" + - "}\n" + - "GROUP BY ?item\n"; private static NearbyPlaces singleton; private double radius = INITIAL_RADIUS; private List places; @@ -73,13 +36,15 @@ public class NearbyPlaces { private NearbyPlaces(){ } - List getFromWikidataQuery(LatLng curLatLng, String lang) { + List getFromWikidataQuery(Context context, + LatLng curLatLng, + String lang) { List places = Collections.emptyList(); try { // increase the radius gradually to find a satisfactory number of nearby places while (radius < MAX_RADIUS) { - places = getFromWikidataQuery(curLatLng, lang, radius); + places = getFromWikidataQuery(context, curLatLng, lang, radius); Timber.d("%d results at radius: %f", places.size(), radius); if (places.size() >= MIN_RESULTS) { break; @@ -97,10 +62,18 @@ public class NearbyPlaces { return places; } - private List getFromWikidataQuery(LatLng cur, String lang, double radius) + private List getFromWikidataQuery(Context context, + LatLng cur, + String lang, + double radius) throws IOException { List places = new ArrayList<>(); - String query = WIKIDATA_QUERY_TEMPLATE.replace("${RADIUS}", "" + radius) + + String query = FileUtils.readFromFile(context, "queries/nearby_query.txt"); + + Timber.d(query); + + query = query.replace("${RADIUS}", "" + radius) .replace("${LAT}", "" + String.format(Locale.ROOT, "%.3f", cur.latitude)) .replace("${LONG}", "" + String.format(Locale.ROOT, "%.3f", cur.longitude)) .replace("${LANG}", "" + lang); @@ -124,6 +97,8 @@ public class NearbyPlaces { String point = fields[0]; String name = Utils.stripLocalizedString(fields[2]); String type = Utils.stripLocalizedString(fields[4]); + String sitelink = Utils.stripLocalizedString(fields[7]); + String wikiDataLink = Utils.stripLocalizedString(fields[3]); String icon = fields[5]; double latitude = 0; @@ -145,7 +120,9 @@ public class NearbyPlaces { type, // list type, // details Uri.parse(icon), - new LatLng(latitude, longitude) + new LatLng(latitude, longitude), + Uri.parse(sitelink), + Uri.parse(wikiDataLink) )); } in.close(); @@ -202,7 +179,9 @@ public class NearbyPlaces { type, // list type, // details null, - new LatLng(latitude, longitude) + new LatLng(latitude, longitude), + null, + null )); } in.close(); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java index f3e8e9438..a975282e9 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java @@ -16,15 +16,19 @@ public class Place { public Bitmap image; public Bitmap secondaryImage; public String distance; + public Uri siteLink; + public Uri wikiDataLink; public Place(String name, String description, String longDescription, - Uri secondaryImageUrl, LatLng location) { + Uri secondaryImageUrl, LatLng location, Uri siteLink, Uri wikiDataLink) { this.name = name; this.description = description; this.longDescription = longDescription; this.secondaryImageUrl = secondaryImageUrl; this.location = location; + this.siteLink = siteLink; + this.wikiDataLink = wikiDataLink; } public void setDistance(String distance) { diff --git a/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java new file mode 100644 index 000000000..69bc8549f --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java @@ -0,0 +1,48 @@ +package fr.free.nrw.commons.ui.widget; + +import android.app.Dialog; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import fr.free.nrw.commons.R; + +public abstract class OverlayDialog extends DialogFragment { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(STYLE_NORMAL, R.style.borderless_dialog); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + setDialogLayoutToFullScreen(); + super.onViewCreated(view, savedInstanceState); + } + + private void setDialogLayoutToFullScreen() { + Window window = getDialog().getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + window.requestFeature(Window.FEATURE_NO_TITLE); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.MATCH_PARENT; + window.setAttributes(wlp); + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Dialog dialog = super.onCreateDialog(savedInstanceState); + Window window = dialog.getWindow(); + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + return dialog; + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java b/app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java new file mode 100644 index 000000000..3992324b5 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/DialogUtil.java @@ -0,0 +1,80 @@ +package fr.free.nrw.commons.utils; + +import android.app.Activity; +import android.app.Dialog; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentActivity; + +import timber.log.Timber; + +public class DialogUtil { + + public static void dismissSafely(@Nullable Activity activity, @Nullable DialogFragment dialog) { + boolean isActivityDestroyed = false; + + if (activity == null || dialog == null) { + Timber.d("dismiss called with null activity / dialog. Ignoring."); + return; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + isActivityDestroyed = activity.isDestroyed(); + } + if (activity.isFinishing() || isActivityDestroyed) { + return; + } + try { + dialog.dismiss(); + + } catch (IllegalStateException e) { + Timber.e(e, "Could not dismiss dialog."); + } + } + + public static void showSafely(Activity activity, Dialog dialog) { + if (activity == null || dialog == null) { + Timber.d("Show called with null activity / dialog. Ignoring."); + return; + } + + boolean isActivityDestroyed = false; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + isActivityDestroyed = activity.isDestroyed(); + } + if (activity.isFinishing() || isActivityDestroyed) { + Timber.e("Activity is not running. Could not show dialog. "); + return; + } + try { + dialog.show(); + } catch (IllegalStateException e) { + Timber.e(e, "Could not show dialog."); + } + } + + public static void showSafely(FragmentActivity activity, DialogFragment dialog) { + boolean isActivityDestroyed = false; + + if (activity == null || dialog == null) { + Timber.d("show called with null activity / dialog. Ignoring."); + return; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + isActivityDestroyed = activity.isDestroyed(); + } + if (activity.isFinishing() || isActivityDestroyed) { + return; + } + + try { + if (dialog.getDialog() == null || !dialog.getDialog().isShowing()) { + dialog.show(activity.getSupportFragmentManager(), dialog.getClass().getSimpleName()); + } + } catch (IllegalStateException e) { + Timber.e(e, "Could not show dialog."); + } + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java new file mode 100644 index 000000000..4cb20ae0a --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java @@ -0,0 +1,33 @@ +package fr.free.nrw.commons.utils; + +import android.content.Context; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class FileUtils { + public static String readFromFile(Context context, String fileName) { + String stringBuilder = ""; + BufferedReader reader = null; + try { + reader = new BufferedReader( + new InputStreamReader(context.getAssets().open(fileName), "UTF-8")); + String mLine; + while ((mLine = reader.readLine()) != null) { + stringBuilder += mLine + "\n"; + } + } catch (IOException e) { + //log the exception + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + //log the exception + } + } + } + return stringBuilder; + } +} diff --git a/app/src/main/res/layout/dialog_nearby_info.xml b/app/src/main/res/layout/dialog_nearby_info.xml new file mode 100644 index 000000000..be21af18e --- /dev/null +++ b/app/src/main/res/layout/dialog_nearby_info.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d9f2fb74d..d48714b16 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,5 @@ 120dp 4dp 8dp + 240dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a253fef6a..39fa1e4c4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -45,4 +45,10 @@ + \ No newline at end of file From bb47332a37bec273d333dc356ac30f629a8b142c Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sun, 14 May 2017 14:26:16 +0300 Subject: [PATCH 42/42] Remove conflicts --- .../java/fr/free/nrw/commons/nearby/NearbyMapFragment.java | 6 ++++++ app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 8 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index de92a596b..c15a407c3 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; @@ -93,6 +94,11 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { }); } }); + if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("theme",true)) { + mapView.setStyleUrl(getResources().getString(R.string.map_theme_dark)); + } else { + mapView.setStyleUrl(getResources().getString(R.string.map_theme_light)); + } setHasOptionsMenu(false); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0414f98fa..536f66e41 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -170,5 +170,7 @@ Tap this message (or hit back) to skip this step. https://play.google.com/apps/testing/fr.free.nrw.commons Use Wikidata (Warning: disabling this may cause large mobile data consumption) + mapbox://styles/mapbox/traffic-day-v2 + mapbox://styles/mapbox/traffic-night-v2 pk.eyJ1IjoibWFza2FyYXZpdmVrIiwiYSI6ImNqMmxvdzFjMTAwMHYzM283ZWM3eW5tcDAifQ.ib5SZ9EVjwJe6GSKve0bcg