From ce1e293d873eb19264b23901134ac2d86ca41d68 Mon Sep 17 00:00:00 2001 From: veyndan Date: Fri, 14 Apr 2017 13:49:18 +0100 Subject: [PATCH 001/168] Define a custom TextView that displays HTML --- .../fr/free/nrw/commons/AboutActivity.java | 25 ------------------- .../nrw/commons/ui/widget/HtmlTextView.java | 21 ++++++++++++++++ app/src/main/res/layout/activity_about.xml | 8 +++--- 3 files changed, 25 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/ui/widget/HtmlTextView.java diff --git a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java index c5156069b..dce387e1a 100644 --- a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java @@ -1,10 +1,6 @@ package fr.free.nrw.commons; -import android.content.Intent; -import android.net.Uri; import android.os.Bundle; -import android.text.Html; -import android.text.method.LinkMovementMethod; import android.widget.TextView; import fr.free.nrw.commons.theme.BaseActivity; @@ -14,11 +10,7 @@ import butterknife.ButterKnife; public class AboutActivity extends BaseActivity { @BindView(R.id.about_version) TextView versionText; - @BindView(R.id.about_license) TextView licenseText; - @BindView(R.id.about_improve) TextView improveText; - @BindView(R.id.about_privacy_policy) TextView privacyPolicyText; @BindView(R.id.about_uploads_to) TextView uploadsToText; - @BindView(R.id.about_credits) TextView creditsText; @Override public void onCreate(Bundle savedInstanceState) { @@ -29,22 +21,5 @@ public class AboutActivity extends BaseActivity { uploadsToText.setText(CommonsApplication.EVENTLOG_WIKI); versionText.setText(BuildConfig.VERSION_NAME); - - // We can't use formatted strings directly because it breaks with - // our localization tools. Grab an HTML string and turn it into - // a formatted string. - fixFormatting(licenseText, R.string.about_license); - fixFormatting(improveText, R.string.about_improve); - fixFormatting(privacyPolicyText, R.string.about_privacy_policy); - fixFormatting(creditsText, R.string.about_credits); - - licenseText.setMovementMethod(LinkMovementMethod.getInstance()); - improveText.setMovementMethod(LinkMovementMethod.getInstance()); - privacyPolicyText.setMovementMethod(LinkMovementMethod.getInstance()); - creditsText.setMovementMethod(LinkMovementMethod.getInstance()); - } - - private void fixFormatting(TextView textView, int resource) { - textView.setText(Html.fromHtml(getResources().getString(resource))); } } \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/ui/widget/HtmlTextView.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/HtmlTextView.java new file mode 100644 index 000000000..bc5fd71cd --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/HtmlTextView.java @@ -0,0 +1,21 @@ +package fr.free.nrw.commons.ui.widget; + +import android.content.Context; +import android.support.v7.widget.AppCompatTextView; +import android.text.Html; +import android.text.method.LinkMovementMethod; +import android.util.AttributeSet; + +/** + * An {@link AppCompatTextView} which formats the text to HTML displayable text and makes any + * links clickable. + */ +public class HtmlTextView extends AppCompatTextView { + + public HtmlTextView(Context context, AttributeSet attrs) { + super(context, attrs); + + setMovementMethod(LinkMovementMethod.getInstance()); + setText(Html.fromHtml(getText().toString())); + } +} diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 03534619e..397806016 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -27,7 +27,7 @@ android:layout_height="wrap_content" /> - - - - Date: Mon, 17 Apr 2017 16:24:50 +0100 Subject: [PATCH 002/168] Use Timber for logging --- app/build.gradle | 1 + .../free/nrw/commons/CommonsApplication.java | 9 +++-- .../java/fr/free/nrw/commons/EventLog.java | 6 +-- .../free/nrw/commons/MediaDataExtractor.java | 12 +++--- .../main/java/fr/free/nrw/commons/Utils.java | 12 +++--- .../free/nrw/commons/auth/LoginActivity.java | 12 +++--- .../free/nrw/commons/auth/SignupActivity.java | 8 ++-- .../nrw/commons/caching/CacheController.java | 27 +++++++------- .../category/CategorizationFragment.java | 37 +++++++++---------- .../category/CategoryContentProvider.java | 6 +-- .../nrw/commons/category/MethodAUpdater.java | 17 ++++----- .../nrw/commons/category/PrefixUpdater.java | 21 +++++------ .../nrw/commons/category/TitleCategories.java | 10 ++--- .../commons/contributions/Contribution.java | 2 - .../contributions/ContributionController.java | 8 ++-- .../contributions/ContributionsActivity.java | 11 +++--- .../ContributionsContentProvider.java | 8 ++-- .../ContributionsListFragment.java | 19 +++++----- .../ContributionsSyncAdapter.java | 12 +++--- .../location/LocationServiceManager.java | 22 +++++------ .../commons/media/MediaDetailFragment.java | 18 ++++----- .../ModificationsContentProvider.java | 6 +-- .../ModificationsSyncAdapter.java | 22 +++++------ .../nrw/commons/nearby/NearbyActivity.java | 2 - .../nrw/commons/nearby/NearbyAdapter.java | 5 ++- .../commons/nearby/NearbyListFragment.java | 17 +++------ .../free/nrw/commons/nearby/NearbyPlaces.java | 19 +++++----- .../nrw/commons/upload/ExistingFileAsync.java | 15 +++----- .../free/nrw/commons/upload/GPSExtractor.java | 36 +++++++++--------- .../commons/upload/MultipleShareActivity.java | 4 +- .../free/nrw/commons/upload/MwVolleyApi.java | 17 ++++----- .../nrw/commons/upload/ShareActivity.java | 30 +++++++-------- .../commons/upload/SingleUploadFragment.java | 10 ++--- .../nrw/commons/upload/UploadController.java | 10 ++--- .../nrw/commons/upload/UploadService.java | 26 ++++++------- 35 files changed, 238 insertions(+), 259 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bf9af869d..66ee38019 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,6 +16,7 @@ dependencies { compile 'com.google.code.gson:gson:2.7' compile "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION" annotationProcessor "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION" + compile 'com.jakewharton.timber:timber:4.5.1' testCompile 'junit:junit:4.12' } 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 ebfc29b90..5ba33a7e2 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -9,7 +9,6 @@ import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.os.Build; import android.support.v4.util.LruCache; -import android.util.Log; import com.android.volley.RequestQueue; import com.android.volley.toolbox.BasicNetwork; @@ -39,6 +38,7 @@ import java.io.IOException; import fr.free.nrw.commons.auth.WikiAccountAuthenticator; import fr.free.nrw.commons.caching.CacheController; +import timber.log.Timber; // TODO: Use ProGuard to rip out reporting when publishing @ReportsCrashes( @@ -92,6 +92,9 @@ public class CommonsApplication extends Application { @Override public void onCreate() { super.onCreate(); + + Timber.plant(new Timber.DebugTree()); + if (!BuildConfig.DEBUG) { ACRA.init(this); } @@ -112,11 +115,11 @@ public class CommonsApplication extends Application { long maxMem = Runtime.getRuntime().maxMemory(); if (maxMem < 48L * 1024L * 1024L) { // Cache only one bitmap if VM memory is too small (such as Nexus One); - Log.d("Commons", "Skipping bitmap cache; max mem is: " + maxMem); + Timber.d("Skipping bitmap cache; max mem is: %d", maxMem); imageCache = new LruCache<>(1); } else { int cacheSize = (int) (maxMem / (1024 * 8)); - Log.d("Commons", "Bitmap cache size " + cacheSize + " from max mem " + maxMem); + Timber.d("Bitmap cache size %d from max mem %d", cacheSize, maxMem); imageCache = new LruCache(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { 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 373a47ac9..d6c8d5059 100644 --- a/app/src/main/java/fr/free/nrw/commons/EventLog.java +++ b/app/src/main/java/fr/free/nrw/commons/EventLog.java @@ -4,7 +4,6 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.preference.PreferenceManager; -import android.util.Log; import org.apache.http.HttpResponse; import org.json.JSONException; @@ -17,6 +16,7 @@ import java.net.URL; import fr.free.nrw.commons.settings.Prefs; import in.yuvi.http.fluent.Http; +import timber.log.Timber; public class EventLog { @@ -38,11 +38,11 @@ public class EventLog { if(response.getStatusLine().getStatusCode() != 204) { allSuccess = false; } - Log.d("Commons", "EventLog hit " + url.toString()); + Timber.d("EventLog hit %s", url); } catch (IOException e) { // Probably just ignore for now. Can be much more robust with a service, etc later on. - Log.d("Commons", "IO Error, EventLog hit skipped"); + Timber.d("IO Error, EventLog hit skipped"); } } 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 f5d153e5a..b09ec1b76 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,5 @@ package fr.free.nrw.commons; -import android.util.Log; - import org.mediawiki.api.ApiResult; import org.mediawiki.api.MWApi; import org.w3c.dom.Document; @@ -23,6 +21,8 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import timber.log.Timber; + /** * Fetch additional media data from the network that we don't store locally. * @@ -131,20 +131,20 @@ public class MediaDataExtractor { * look for 'self' template and check its first parameter * if none, look for any of the known templates */ - Log.d("Commons", "MediaDataExtractor searching for license"); + Timber.d("MediaDataExtractor searching for license"); Node selfLicenseNode = findTemplate(doc.getDocumentElement(), "self"); if (selfLicenseNode != null) { Node firstNode = findTemplateParameter(selfLicenseNode, 1); String licenseTemplate = getFlatText(firstNode); License license = licenseList.licenseForTemplate(licenseTemplate); if (license == null) { - Log.d("Commons", "MediaDataExtractor found no matching license for self parameter: " + licenseTemplate + "; faking it"); + Timber.d("MediaDataExtractor found no matching license for self parameter: %s; faking it", licenseTemplate); this.license = licenseTemplate; // hack hack! For non-selectable licenses that are still in the system. } else { // fixme: record the self-ness in here too... sigh // all this needs better server-side metadata this.license = license.getKey(); - Log.d("Commons", "MediaDataExtractor found self-license " + this.license); + Timber.d("MediaDataExtractor found self-license %s", this.license); } } else { for (License license : licenseList.values()) { @@ -153,7 +153,7 @@ public class MediaDataExtractor { if (template != null) { // Found! this.license = license.getKey(); - Log.d("Commons", "MediaDataExtractor found non-self license " + this.license); + Timber.d("MediaDataExtractor found non-self license %s", this.license); break; } } 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 493a654e6..28f4238d6 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -2,13 +2,13 @@ package fr.free.nrw.commons; import android.net.Uri; import android.os.Build; -import android.util.Log; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import fr.free.nrw.commons.settings.Prefs; +import timber.log.Timber; import java.io.BufferedInputStream; import java.io.IOException; @@ -44,8 +44,6 @@ import org.xmlpull.v1.XmlPullParserException; public class Utils { - private static final String TAG = Utils.class.getName(); - // Get SHA1 of file from input stream public static String getSHA1(InputStream is) { @@ -53,7 +51,7 @@ public class Utils { try { digest = MessageDigest.getInstance("SHA1"); } catch (NoSuchAlgorithmException e) { - Log.e(TAG, "Exception while getting Digest", e); + Timber.e(e, "Exception while getting Digest"); return ""; } @@ -68,17 +66,17 @@ public class Utils { String output = bigInt.toString(16); // Fill to 40 chars output = String.format("%40s", output).replace(' ', '0'); - Log.i(TAG, "File SHA1: " + output); + Timber.i("File SHA1: %s", output); return output; } catch (IOException e) { - Log.e(TAG, "IO Exception", e); + Timber.e(e, "IO Exception"); return ""; } finally { try { is.close(); } catch (IOException e) { - Log.e(TAG, "Exception on closing MD5 input stream", e); + Timber.e(e, "Exception on closing MD5 input stream"); } } } 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 c66c82910..b86294e7e 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 @@ -14,9 +14,7 @@ import android.os.Bundle; import android.support.v4.app.NavUtils; import android.text.Editable; import android.text.TextWatcher; -import android.util.Log; import android.view.KeyEvent; -import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; @@ -26,7 +24,6 @@ import android.widget.TextView; import android.widget.Toast; import java.io.IOException; -import java.util.Locale; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.EventLog; @@ -36,6 +33,7 @@ import fr.free.nrw.commons.WelcomeActivity; import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.contributions.ContributionsContentProvider; import fr.free.nrw.commons.modifications.ModificationsContentProvider; +import timber.log.Timber; public class LoginActivity extends AccountAuthenticatorActivity { @@ -61,7 +59,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { @Override protected void onPostExecute(String result) { super.onPostExecute(result); - Log.d("Commons", "Login done!"); + Timber.d("Login done!"); EventLog.schema(CommonsApplication.EVENT_LOGIN_ATTEMPT) .param("username", username) @@ -80,7 +78,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { Bundle extras = context.getIntent().getExtras(); if (extras != null) { - Log.d("LoginActivity", "Bundle of extras: " + extras.toString()); + Timber.d("Bundle of extras: %s", extras); if (accountCreated) { // Pass the new account back to the account manager AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE); Bundle authResult = new Bundle(); @@ -116,7 +114,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { response = R.string.login_failed_blocked; } else { // Should never really happen - Log.d("Commons", "Login failed with reason: " + result); + Timber.d("Login failed with reason: %s", result); response = R.string.login_failed_generic; } Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show(); @@ -242,7 +240,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { String password = passwordEdit.getText().toString(); - Log.d("Commons", "Login to start!"); + Timber.d("Login to start!"); LoginTask task = new LoginTask(this); task.execute(canonicalUsername, password); } diff --git a/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java index cd65826b0..5965c8928 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java @@ -2,13 +2,13 @@ package fr.free.nrw.commons.auth; import android.content.Intent; import android.os.Bundle; -import android.util.Log; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import fr.free.nrw.commons.theme.BaseActivity; +import timber.log.Timber; public class SignupActivity extends BaseActivity { @@ -17,7 +17,7 @@ public class SignupActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Log.d("SignupActivity", "Signup Activity started"); + Timber.d("Signup Activity started"); getSupportActionBar().hide(); @@ -37,7 +37,7 @@ public class SignupActivity extends BaseActivity { public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.equals("https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes")) { //Signup success, so clear cookies, notify user, and load LoginActivity again - Log.d("SignupActivity", "Overriding URL" + url); + Timber.d("Overriding URL %s", url); Toast toast = Toast.makeText(getApplicationContext(), "Account created!", Toast.LENGTH_LONG); toast.show(); @@ -47,7 +47,7 @@ public class SignupActivity extends BaseActivity { return true; } else { //If user clicks any other links in the webview - Log.d("SignupActivity", "Not overriding URL, URL is: " + url); + Timber.d("Not overriding URL, URL is: %s", url); return false; } } 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 28215b8b2..2d8dafacb 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 @@ -1,7 +1,5 @@ package fr.free.nrw.commons.caching; -import android.util.Log; - import com.github.varunpant.quadtree.Point; import com.github.varunpant.quadtree.QuadTree; @@ -10,6 +8,7 @@ import java.util.Arrays; import java.util.List; import fr.free.nrw.commons.upload.MwVolleyApi; +import timber.log.Timber; public class CacheController { @@ -18,7 +17,6 @@ public class CacheController { private Point>[] pointsFound; private double xMinus, xPlus, yMinus, yPlus; - private static final String TAG = CacheController.class.getName(); private static final int EARTH_RADIUS = 6378137; public CacheController() { @@ -28,17 +26,17 @@ public class CacheController { public void setQtPoint(double decLongitude, double decLatitude) { x = decLongitude; y = decLatitude; - Log.d(TAG, "New QuadTree created"); - Log.d(TAG, "X (longitude) value: " + x + ", Y (latitude) value: " + y); + Timber.d("New QuadTree created"); + Timber.d("X (longitude) value: %f, Y (latitude) value: %f", x, y); } public void cacheCategory() { List pointCatList = new ArrayList<>(); if (MwVolleyApi.GpsCatExists.getGpsCatExists() == true) { pointCatList.addAll(MwVolleyApi.getGpsCat()); - Log.d(TAG, "Categories being cached: " + pointCatList); + Timber.d("Categories being cached: %s", pointCatList); } else { - Log.d(TAG, "No categories found, so no categories cached"); + Timber.d("No categories found, so no categories cached"); } quadTree.set(x, y, pointCatList); } @@ -48,20 +46,20 @@ public class CacheController { convertCoordRange(); pointsFound = quadTree.searchWithin(xMinus, yMinus, xPlus, yPlus); List displayCatList = new ArrayList<>(); - Log.d(TAG, "Points found in quadtree: " + Arrays.asList(pointsFound)); + Timber.d("Points found in quadtree: %s", Arrays.toString(pointsFound)); if (pointsFound.length != 0) { - Log.d(TAG, "Entering for loop"); + Timber.d("Entering for loop"); for (Point> point : pointsFound) { - Log.d(TAG, "Nearby point: " + point.toString()); + Timber.d("Nearby point: %s", point); displayCatList = point.getValue(); - Log.d(TAG, "Nearby cat: " + point.getValue()); + Timber.d("Nearby cat: %s", point.getValue()); } - Log.d(TAG, "Categories found in cache: " + displayCatList.toString()); + Timber.d("Categories found in cache: %s", displayCatList); } else { - Log.d(TAG, "No categories found in cache"); + Timber.d("No categories found in cache"); } return displayCatList; } @@ -84,6 +82,7 @@ public class CacheController { yMinus = lat - dLat * 180/Math.PI; xPlus = lon + dLon * 180/Math.PI; xMinus = lon - dLon * 180/Math.PI; - Log.d(TAG, "Search within: xMinus=" + xMinus + ", yMinus=" + yMinus + ", xPlus=" + xPlus + ", yPlus=" + yPlus); + Timber.d("Search within: xMinus=%s, yMinus=%s, xPlus=%s, yPlus=%s", + xMinus, yMinus, xPlus, yPlus); } } 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 b4f9d7078..0f71e329b 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 @@ -16,7 +16,6 @@ import android.support.v7.app.AlertDialog; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; -import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; @@ -44,6 +43,7 @@ import java.util.concurrent.TimeUnit; import fr.free.nrw.commons.R; import fr.free.nrw.commons.upload.MwVolleyApi; +import timber.log.Timber; /** * Displays the category suggestion and selection screen. Category search is initiated here. @@ -79,7 +79,6 @@ public class CategorizationFragment extends Fragment { private ContentProviderClient client; protected final static int SEARCH_CATS_LIMIT = 25; - private static final String TAG = CategorizationFragment.class.getName(); public static class CategoryItem implements Parcelable { public String name; @@ -130,28 +129,28 @@ public class CategorizationFragment extends Fragment { //Retrieve the title that was saved when user tapped submit icon SharedPreferences titleDesc = PreferenceManager.getDefaultSharedPreferences(getActivity()); String title = titleDesc.getString("Title", ""); - Log.d(TAG, "Title: " + title); + Timber.d("Title: %s", title); //Override onPostExecute to access the results of async API call titleCategoriesSub = new TitleCategories(title) { @Override protected void onPostExecute(ArrayList result) { super.onPostExecute(result); - Log.d(TAG, "Results in onPostExecute: " + result); + Timber.d("Results in onPostExecute: %s", result); titleCatItems.addAll(result); - Log.d(TAG, "TitleCatItems in onPostExecute: " + titleCatItems); + Timber.d("TitleCatItems in onPostExecute: %s", titleCatItems); mergeLatch.countDown(); } }; titleCategoriesSub.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - Log.d(TAG, "TitleCatItems in titleCatQuery: " + titleCatItems); + Timber.d("TitleCatItems in titleCatQuery: %s", titleCatItems); //Only return titleCatItems after API call has finished try { mergeLatch.await(5L, TimeUnit.SECONDS); } catch (InterruptedException e) { - Log.e(TAG, "Interrupted exception: ", e); + Timber.e(e, "Interrupted exception: "); } return titleCatItems; } @@ -191,7 +190,7 @@ public class CategorizationFragment extends Fragment { Set mergedItems = new LinkedHashSet<>(); - Log.d(TAG, "Calling APIs for GPS cats, title cats and recent cats..."); + Timber.d("Calling APIs for GPS cats, title cats and recent cats..."); List gpsItems = new ArrayList<>(); if (MwVolleyApi.GpsCatExists.getGpsCatExists()) { @@ -203,22 +202,22 @@ public class CategorizationFragment extends Fragment { //Await results of titleItems, which is likely to come in last try { mergeLatch.await(5L, TimeUnit.SECONDS); - Log.d(TAG, "Waited for merge"); + Timber.d("Waited for merge"); } catch (InterruptedException e) { - Log.e(TAG, "Interrupted Exception: ", e); + Timber.e(e, "Interrupted Exception: "); } mergedItems.addAll(gpsItems); - Log.d(TAG, "Adding GPS items: " + gpsItems); + Timber.d("Adding GPS items: %s", gpsItems); mergedItems.addAll(titleItems); - Log.d(TAG, "Adding title items: " + titleItems); + Timber.d("Adding title items: %s", titleItems); mergedItems.addAll(recentItems); - Log.d(TAG, "Adding recent items: " + recentItems); + Timber.d("Adding recent items: %s", recentItems); //Needs to be an ArrayList and not a List unless we want to modify a big portion of preexisting code ArrayList mergedItemsList = new ArrayList<>(mergedItems); - Log.d(TAG, "Merged item list: " + mergedItemsList); + Timber.d("Merged item list: %s", mergedItemsList); return mergedItemsList; } @@ -261,7 +260,7 @@ public class CategorizationFragment extends Fragment { } } else { - Log.e(TAG, "Error: Fragment is null"); + Timber.e("Error: Fragment is null"); } } @@ -285,7 +284,7 @@ public class CategorizationFragment extends Fragment { latch.await(); } catch (InterruptedException e) { - Log.w(TAG, e); + Timber.w(e); //Thread.currentThread().interrupt(); } return result; @@ -296,12 +295,12 @@ public class CategorizationFragment extends Fragment { super.onPostExecute(result); results.addAll(result); - Log.d(TAG, "Prefix result: " + result); + Timber.d("Prefix result: %s", result); String filter = categoriesFilter.getText().toString(); ArrayList resultsList = new ArrayList<>(results); categoriesCache.put(filter, resultsList); - Log.d(TAG, "Final results List: " + resultsList); + Timber.d("Final results List: %s", resultsList); categoriesAdapter.notifyDataSetChanged(); setCatsAfterAsync(resultsList, filter); @@ -315,7 +314,7 @@ public class CategorizationFragment extends Fragment { super.onPostExecute(result); results.addAll(result); - Log.d(TAG, "Method A result: " + result); + Timber.d("Method A result: %s", result); categoriesAdapter.notifyDataSetChanged(); latch.countDown(); diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java index 27ab42159..314ab33f2 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java @@ -8,9 +8,9 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; -import android.util.Log; import fr.free.nrw.commons.data.DBOpenHelper; +import timber.log.Timber; public class CategoryContentProvider extends ContentProvider { @@ -101,14 +101,14 @@ public class CategoryContentProvider extends ContentProvider { @Override public int bulkInsert(Uri uri, ContentValues[] values) { - Log.d("Commons", "Hello, bulk insert! (CategoryContentProvider)"); + Timber.d("Hello, bulk insert! (CategoryContentProvider)"); int uriType = uriMatcher.match(uri); SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); sqlDB.beginTransaction(); switch (uriType) { case CATEGORIES: for(ContentValues value: values) { - Log.d("Commons", "Inserting! " + value.toString()); + Timber.d("Inserting! %s", value); sqlDB.insert(Category.Table.TABLE_NAME, null, value); } break; 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 cbc31814b..74e379b37 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 @@ -1,7 +1,6 @@ package fr.free.nrw.commons.category; import android.os.AsyncTask; -import android.util.Log; import android.view.View; import org.mediawiki.api.ApiResult; @@ -13,6 +12,7 @@ import java.util.Calendar; import java.util.Iterator; import fr.free.nrw.commons.CommonsApplication; +import timber.log.Timber; /** * Sends asynchronous queries to the Commons MediaWiki API to retrieve categories that are close to @@ -22,7 +22,6 @@ import fr.free.nrw.commons.CommonsApplication; public class MethodAUpdater extends AsyncTask> { private String filter; - private static final String TAG = MethodAUpdater.class.getName(); CategorizationFragment catFragment; public MethodAUpdater(CategorizationFragment catFragment) { @@ -54,11 +53,11 @@ public class MethodAUpdater extends AsyncTask> { Calendar now = Calendar.getInstance(); int year = now.get(Calendar.YEAR); String yearInString = String.valueOf(year); - Log.d(TAG, "Year: " + yearInString); + Timber.d("Year: %s", yearInString); int prevYear = year - 1; String prevYearInString = String.valueOf(prevYear); - Log.d(TAG, "Previous year: " + prevYearInString); + Timber.d("Previous year: %s", prevYearInString); //Copy to Iterator to prevent ConcurrentModificationException when removing item for(iterator = items.iterator(); iterator.hasNext();) { @@ -67,12 +66,12 @@ public class MethodAUpdater extends AsyncTask> { //Check if s contains a 4-digit word anywhere within the string (.* is wildcard) //And that s does not equal the current year or previous year if(s.matches(".*(19|20)\\d{2}.*") && !s.contains(yearInString) && !s.contains(prevYearInString)) { - Log.d(TAG, "Filtering out year " + s); + Timber.d("Filtering out year %s", s); iterator.remove(); } } - Log.d(TAG, "Items: " + items.toString()); + Timber.d("Items: %s", items); return items; } @@ -94,9 +93,9 @@ public class MethodAUpdater extends AsyncTask> { .param("srlimit", catFragment.SEARCH_CATS_LIMIT) .param("srsearch", filter) .get(); - Log.d(TAG, "Method A URL filter" + result.toString()); + Timber.d("Method A URL filter %s", result); } catch (IOException e) { - Log.e(TAG, "IO Exception: ", e); + Timber.e(e, "IO Exception: "); //Return empty arraylist return categories; } @@ -108,7 +107,7 @@ public class MethodAUpdater extends AsyncTask> { categories.add(catString); } - Log.d(TAG, "Found categories from Method A search, waiting for filter"); + Timber.d("Found categories from Method A search, waiting for filter"); ArrayList filteredItems = new ArrayList<>(filterYears(categories)); return filteredItems; } 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 bacd1a520..17d7ab801 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 @@ -2,7 +2,6 @@ package fr.free.nrw.commons.category; import android.os.AsyncTask; import android.text.TextUtils; -import android.util.Log; import android.view.View; import org.mediawiki.api.ApiResult; @@ -14,6 +13,7 @@ import java.util.Calendar; import java.util.Iterator; import fr.free.nrw.commons.CommonsApplication; +import timber.log.Timber; /** * Sends asynchronous queries to the Commons MediaWiki API to retrieve categories that share the @@ -24,7 +24,6 @@ import fr.free.nrw.commons.CommonsApplication; public class PrefixUpdater extends AsyncTask> { private String filter; - private static final String TAG = PrefixUpdater.class.getName(); private CategorizationFragment catFragment; public PrefixUpdater(CategorizationFragment catFragment) { @@ -56,11 +55,11 @@ public class PrefixUpdater extends AsyncTask> { Calendar now = Calendar.getInstance(); int year = now.get(Calendar.YEAR); String yearInString = String.valueOf(year); - Log.d(TAG, "Year: " + yearInString); + Timber.d("Year: %s", yearInString); int prevYear = year - 1; String prevYearInString = String.valueOf(prevYear); - Log.d(TAG, "Previous year: " + prevYearInString); + Timber.d("Previous year: %s", prevYearInString); //Copy to Iterator to prevent ConcurrentModificationException when removing item for(iterator = items.iterator(); iterator.hasNext();) { @@ -69,12 +68,12 @@ public class PrefixUpdater extends AsyncTask> { //Check if s contains a 4-digit word anywhere within the string (.* is wildcard) //And that s does not equal the current year or previous year if(s.matches(".*(19|20)\\d{2}.*") && !s.contains(yearInString) && !s.contains(prevYearInString)) { - Log.d(TAG, "Filtering out year " + s); + Timber.d("Filtering out year %s", s); iterator.remove(); } } - Log.d(TAG, "Items: " + items.toString()); + Timber.d("Items: %s", items); return items; } @@ -83,7 +82,7 @@ public class PrefixUpdater extends AsyncTask> { //If user hasn't typed anything in yet, get GPS and recent items if(TextUtils.isEmpty(filter)) { ArrayList mergedItems = new ArrayList<>(catFragment.mergeItems()); - Log.d(TAG, "Merged items, waiting for filter"); + Timber.d("Merged items, waiting for filter"); ArrayList filteredItems = new ArrayList<>(filterYears(mergedItems)); return filteredItems; } @@ -91,7 +90,7 @@ public class PrefixUpdater extends AsyncTask> { //if user types in something that is in cache, return cached category if(catFragment.categoriesCache.containsKey(filter)) { ArrayList cachedItems = new ArrayList<>(catFragment.categoriesCache.get(filter)); - Log.d(TAG, "Found cache items, waiting for filter"); + Timber.d("Found cache items, waiting for filter"); ArrayList filteredItems = new ArrayList<>(filterYears(cachedItems)); return filteredItems; } @@ -107,9 +106,9 @@ public class PrefixUpdater extends AsyncTask> { .param("acprefix", filter) .param("aclimit", catFragment.SEARCH_CATS_LIMIT) .get(); - Log.d(TAG, "Prefix URL filter" + result.toString()); + Timber.d("Prefix URL filter %s", result); } catch (IOException e) { - Log.e(TAG, "IO Exception: ", e); + Timber.e(e, "IO Exception: "); //Return empty arraylist return categories; } @@ -119,7 +118,7 @@ public class PrefixUpdater extends AsyncTask> { categories.add(categoryNode.getDocument().getTextContent()); } - Log.d(TAG, "Found categories from Prefix search, waiting for filter"); + Timber.d("Found categories from Prefix search, waiting for filter"); ArrayList filteredItems = new ArrayList<>(filterYears(categories)); return filteredItems; } 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 5434c3f1b..9622d4d3b 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 @@ -1,7 +1,6 @@ package fr.free.nrw.commons.category; import android.os.AsyncTask; -import android.util.Log; import org.mediawiki.api.ApiResult; import org.mediawiki.api.MWApi; @@ -10,6 +9,7 @@ import java.io.IOException; import java.util.ArrayList; import fr.free.nrw.commons.CommonsApplication; +import timber.log.Timber; /** * Sends asynchronous queries to the Commons MediaWiki API to retrieve categories that are related to @@ -19,7 +19,7 @@ import fr.free.nrw.commons.CommonsApplication; public class TitleCategories extends AsyncTask> { private final static int SEARCH_CATS_LIMIT = 25; - private static final String TAG = TitleCategories.class.getName(); + private String title; public TitleCategories(String title) { @@ -48,9 +48,9 @@ public class TitleCategories extends AsyncTask> { .param("srlimit", SEARCH_CATS_LIMIT) .param("srsearch", title) .get(); - Log.d(TAG, "Searching for cats for title: " + result.toString()); + Timber.d("Searching for cats for title: %s", result); } catch (IOException e) { - Log.e(TAG, "IO Exception: ", e); + Timber.e(e, "IO Exception: "); //Return empty arraylist return items; } @@ -62,7 +62,7 @@ public class TitleCategories extends AsyncTask> { items.add(catString); } - Log.d(TAG, "Title cat query results: " + items); + Timber.d("Title cat query results: %s", items); return items; } 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 4a70151df..bcdf31d1b 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 @@ -44,8 +44,6 @@ public class Contribution extends Media { public static final String SOURCE_GALLERY = "gallery"; public static final String SOURCE_EXTERNAL = "external"; - private static final String TAG = "Contribution"; - private ContentProviderClient client; private Uri contentUri; private String source; 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 6581e7381..deaf655a1 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 @@ -7,7 +7,6 @@ import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v4.app.Fragment; -import android.util.Log; import java.io.File; import java.io.IOException; @@ -15,6 +14,7 @@ import java.util.Date; import fr.free.nrw.commons.upload.ShareActivity; import fr.free.nrw.commons.upload.UploadService; +import timber.log.Timber; public class ContributionController { private Fragment fragment; @@ -44,7 +44,7 @@ public class ContributionController { } } catch (IOException e) { - Log.e("Commons", "Could not create file: " + path, e); + Timber.e(e, "Could not create file: %s", path); } return Uri.fromFile(_photoFile); @@ -84,11 +84,11 @@ public class ContributionController { shareIntent.putExtra(UploadService.EXTRA_SOURCE, Contribution.SOURCE_CAMERA); break; } - Log.i("Image", "Image selected"); + Timber.i("Image selected"); try { activity.startActivity(shareIntent); } catch (SecurityException e) { - Log.e("ContributionController", "Security Exception", e); + Timber.e(e, "Security Exception"); } } 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 a098a4783..bbe6d7411 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 @@ -14,7 +14,6 @@ import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; -import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -22,7 +21,6 @@ import android.widget.Adapter; import android.widget.AdapterView; import java.util.ArrayList; -import java.util.Objects; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.HandlerService; @@ -32,6 +30,7 @@ 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.upload.UploadService; +import timber.log.Timber; public class ContributionsActivity extends AuthenticatedActivity @@ -158,9 +157,9 @@ public class ContributionsActivity Contribution c = Contribution.fromCursor(allContributions); if(c.getState() == Contribution.STATE_FAILED) { uploadService.queue(UploadService.ACTION_UPLOAD_FILE, c); - Log.d("Commons", "Restarting for" + c.toContentValues().toString()); + Timber.d("Restarting for %s", c.toContentValues()); } else { - Log.d("Commons", "Skipping re-upload for non-failed " + c.toContentValues().toString()); + Timber.d("Skipping re-upload for non-failed %s", c.toContentValues()); } } @@ -168,11 +167,11 @@ public class ContributionsActivity allContributions.moveToPosition(i); Contribution c = Contribution.fromCursor(allContributions); if(c.getState() == Contribution.STATE_FAILED) { - Log.d("Commons", "Deleting failed contrib " + c.toContentValues().toString()); + Timber.d("Deleting failed contrib %s", c.toContentValues()); c.setContentProviderClient(getContentResolver().acquireContentProviderClient(ContributionsContentProvider.AUTHORITY)); c.delete(); } else { - Log.d("Commons", "Skipping deletion for non-failed contrib " + c.toContentValues().toString()); + Timber.d("Skipping deletion for non-failed contrib %s", c.toContentValues()); } } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java index 07a4f586e..37d9dae18 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java @@ -8,9 +8,9 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; -import android.util.Log; import fr.free.nrw.commons.data.DBOpenHelper; +import timber.log.Timber; public class ContributionsContentProvider extends ContentProvider{ @@ -102,7 +102,7 @@ public class ContributionsContentProvider extends ContentProvider{ switch(uriType) { case CONTRIBUTIONS_ID: - Log.d("Commons", "Deleting contribution id " + uri.getLastPathSegment()); + Timber.d("Deleting contribution id %s", uri.getLastPathSegment()); rows = db.delete(Contribution.Table.TABLE_NAME, "_id = ?", new String[] { uri.getLastPathSegment() } @@ -117,14 +117,14 @@ public class ContributionsContentProvider extends ContentProvider{ @Override public int bulkInsert(Uri uri, ContentValues[] values) { - Log.d("Commons", "Hello, bulk insert! (ContributionsContentProvider)"); + Timber.d("Hello, bulk insert! (ContributionsContentProvider)"); int uriType = uriMatcher.match(uri); SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); sqlDB.beginTransaction(); switch (uriType) { case CONTRIBUTIONS: for(ContentValues value: values) { - Log.d("Commons", "Inserting! " + value.toString()); + Timber.d("Inserting! %s", value); sqlDB.insert(Contribution.Table.TABLE_NAME, null, value); } break; diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java index 4841ffab5..f5efb8061 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java @@ -10,7 +10,6 @@ import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; -import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -29,8 +28,9 @@ import fr.free.nrw.commons.AboutActivity; import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; -import fr.free.nrw.commons.settings.SettingsActivity; import fr.free.nrw.commons.nearby.NearbyActivity; +import fr.free.nrw.commons.settings.SettingsActivity; +import timber.log.Timber; import static android.app.Activity.RESULT_OK; @@ -45,7 +45,6 @@ public class ContributionsListFragment extends Fragment { @BindView(R.id.emptyMessage) TextView emptyMessage; private ContributionController controller; - private static final String TAG = "ContributionsList"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -54,14 +53,14 @@ public class ContributionsListFragment extends Fragment { contributionsList.setOnItemClickListener((AdapterView.OnItemClickListener)getActivity()); if(savedInstanceState != null) { - Log.d(TAG, "Scrolling to " + savedInstanceState.getInt("grid-position")); + Timber.d("Scrolling to %d", savedInstanceState.getInt("grid-position")); contributionsList.setSelection(savedInstanceState.getInt("grid-position")); } //TODO: Should this be in onResume? SharedPreferences prefs = this.getActivity().getSharedPreferences("prefs", Context.MODE_PRIVATE); String lastModified = prefs.getString("lastSyncTimestamp", ""); - Log.d(TAG, "Last Sync Timestamp: " + lastModified); + Timber.d("Last Sync Timestamp: %s", lastModified); if (lastModified.equals("")) { waitingMessage.setVisibility(View.VISIBLE); @@ -96,10 +95,12 @@ public class ContributionsListFragment extends Fragment { super.onActivityResult(requestCode, resultCode, data); if ( resultCode == RESULT_OK ) { - Log.d("Contributions", "OnActivityResult() parameters: Req code: " + requestCode + " Result code: " + resultCode + " Data: " + data); + Timber.d("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s", + requestCode, resultCode, data); controller.handleImagePicked(requestCode, data); } else { - Log.e("Contributions", "OnActivityResult() parameters: Req code: " + requestCode + " Result code: " + resultCode + " Data: " + data); + Timber.e("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s", + requestCode, resultCode, data); } } @@ -176,7 +177,7 @@ public class ContributionsListFragment extends Fragment { // 1 = Storage allowed when gallery selected case 1: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - Log.d("ContributionsList", "Call controller.startGalleryPick()"); + Timber.d("Call controller.startGalleryPick()"); controller.startGalleryPick(); } } @@ -184,7 +185,7 @@ public class ContributionsListFragment extends Fragment { // 2 = Location allowed when 'nearby places' selected case 2: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - Log.d("ContributionsList", "Location permission granted"); + Timber.d("Location permission granted"); Intent nearbyIntent = new Intent(getActivity(), NearbyActivity.class); startActivity(nearbyIntent); } 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 9cb01e02c..59f34d1da 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 @@ -11,7 +11,6 @@ import android.database.Cursor; import android.os.Bundle; import android.os.RemoteException; import android.text.TextUtils; -import android.util.Log; import org.mediawiki.api.ApiResult; import org.mediawiki.api.MWApi; @@ -22,6 +21,7 @@ import java.util.Date; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.Utils; +import timber.log.Timber; public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { private static int COMMIT_THRESHOLD = 10; @@ -85,18 +85,18 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { // There isn't really much we can do, eh? // FIXME: Perhaps add EventLogging? syncResult.stats.numIoExceptions += 1; // Not sure if this does anything. Shitty docs - Log.d("Commons", "Syncing failed due to " + e.toString()); + Timber.d("Syncing failed due to %s", e); return; } - Log.d("Commons", "Last modified at " + lastModified); + Timber.d("Last modified at %s", lastModified); ArrayList uploads = result.getNodes("/api/query/logevents/item"); - Log.d("Commons", uploads.size() + " results!"); + Timber.d("%d results!", uploads.size()); ArrayList imageValues = new ArrayList<>(); for(ApiResult image: uploads) { String filename = image.getString("@title"); if(fileExists(contentProviderClient, filename)) { - Log.d("Commons", "Skipping " + filename); + Timber.d("Skipping %s", filename); continue; } String thumbUrl = Utils.makeThumbBaseUrl(filename); @@ -128,6 +128,6 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { } } prefs.edit().putString("lastSyncTimestamp", Utils.toMWDate(curTime)).apply(); - Log.d("Commons", "Oh hai, everyone! Look, a kitty!"); + Timber.d("Oh hai, everyone! Look, a kitty!"); } } diff --git a/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java b/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java index cd428e9a3..3c0d2b23b 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java @@ -6,10 +6,11 @@ import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; -import android.util.Log; + +import timber.log.Timber; public class LocationServiceManager implements LocationListener { - public static final String TAG = "LocationServiceManager"; + private String provider; private LocationManager locationManager; private LatLng latestLocation; @@ -31,14 +32,14 @@ public class LocationServiceManager implements LocationListener { Location location = locationManager.getLastKnownLocation(provider); //Location works, just need to 'send' GPS coords // via emulator extended controls if testing on emulator - Log.d(TAG, "Checking for location..."); + Timber.d("Checking for location..."); if (location != null) { this.onLocationChanged(location); } } catch (IllegalArgumentException e) { - Log.e(TAG, "Illegal argument exception", e); + Timber.e(e, "Illegal argument exception"); } catch (SecurityException e) { - Log.e(TAG, "Security exception", e); + Timber.e(e, "Security exception"); } } @@ -48,7 +49,7 @@ public class LocationServiceManager implements LocationListener { try { locationManager.removeUpdates(this); } catch (SecurityException e) { - Log.e(TAG, "Security exception", e); + Timber.e(e, "Security exception"); } } @@ -56,24 +57,23 @@ public class LocationServiceManager implements LocationListener { public void onLocationChanged(Location location) { double currentLatitude = location.getLatitude(); double currentLongitude = location.getLongitude(); - Log.d(TAG, "Latitude: " + String.valueOf(currentLatitude) - + " Longitude: " + String.valueOf(currentLongitude)); + Timber.d("Latitude: %f Longitude: %f", currentLatitude, currentLongitude); latestLocation = new LatLng(currentLatitude, currentLongitude); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { - Log.d(TAG, provider + "'s status changed to " + status); + Timber.d("%s's status changed to %d", provider, status); } @Override public void onProviderEnabled(String provider) { - Log.d(TAG, "Provider " + provider + " enabled"); + Timber.d("Provider %s enabled", provider); } @Override public void onProviderDisabled(String provider) { - Log.d(TAG, "Provider " + provider + " disabled"); + Timber.d("Provider %s disabled", provider); } } 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 be5bf65db..91d45b982 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 @@ -6,7 +6,6 @@ import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; @@ -34,6 +33,7 @@ import fr.free.nrw.commons.MediaDataExtractor; import fr.free.nrw.commons.MediaWikiImageView; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; +import timber.log.Timber; public class MediaDetailFragment extends Fragment { @@ -130,11 +130,11 @@ public class MediaDetailFragment extends Fragment { Media media = detailProvider.getMediaAtPosition(index); if (media == null) { // Ask the detail provider to ping us when we're ready - Log.d("Commons", "MediaDetailFragment not yet ready to display details; registering observer"); + Timber.d("MediaDetailFragment not yet ready to display details; registering observer"); dataObserver = new DataSetObserver() { @Override public void onChanged() { - Log.d("Commons", "MediaDetailFragment ready to display delayed details!"); + Timber.d("MediaDetailFragment ready to display delayed details!"); detailProvider.unregisterDataSetObserver(dataObserver); dataObserver = null; displayMediaDetails(detailProvider.getMediaAtPosition(index)); @@ -142,7 +142,7 @@ public class MediaDetailFragment extends Fragment { }; detailProvider.registerDataSetObserver(dataObserver); } else { - Log.d("Commons", "MediaDetailFragment ready to display details"); + Timber.d("MediaDetailFragment ready to display details"); displayMediaDetails(media); } @@ -186,7 +186,7 @@ public class MediaDetailFragment extends Fragment { //Always load image from Internet to allow viewing the desc, license, and cats String actualUrl = media.getThumbnailUrl(640); if(actualUrl.startsWith("http")) { - Log.d("Volley", "Actual URL starts with http and is: " + actualUrl); + Timber.d("Actual URL starts with http and is: %s", actualUrl); ImageLoader loader = ((CommonsApplication)getActivity().getApplicationContext()).getImageLoader(); MediaWikiImageView mwImage = (MediaWikiImageView)image; @@ -238,7 +238,7 @@ public class MediaDetailFragment extends Fragment { } rebuildCatList(); } else { - Log.d("Commons", "Failed to load photo details."); + Timber.d("Failed to load photo details."); } } }; @@ -246,7 +246,7 @@ public class MediaDetailFragment extends Fragment { } else { //This should not usually happen, image along with associated details should always be loaded from Internet, but keeping this for now for backup. //Even if image is loaded from device storage, it will display, albeit with empty desc and cat. - Log.d("Volley", "Actual URL does not start with http and is: " + actualUrl); + Timber.d("Actual URL does not start with http and is: %s", actualUrl); com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(actualUrl, image, displayOptions, new ImageLoadingListener() { @Override public void onLoadingStarted(String s, View view) { @@ -286,7 +286,7 @@ public class MediaDetailFragment extends Fragment { @Override public void onLoadingCancelled(String s, View view) { - Log.e("Volley", "Image loading cancelled. But why?"); + Timber.e("Image loading cancelled. But why?"); } }); } @@ -377,7 +377,7 @@ public class MediaDetailFragment extends Fragment { private String prettyLicense(Media media) { String licenseKey = media.getLicense(); - Log.d("Commons", "Media license is: " + licenseKey); + Timber.d("Media license is: %s", licenseKey); if (licenseKey == null || licenseKey.equals("")) { return getString(R.string.detail_license_empty); } diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java index a422e5f33..baba01770 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java @@ -8,9 +8,9 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; -import android.util.Log; import fr.free.nrw.commons.data.DBOpenHelper; +import timber.log.Timber; public class ModificationsContentProvider extends ContentProvider{ @@ -101,14 +101,14 @@ public class ModificationsContentProvider extends ContentProvider{ @Override public int bulkInsert(Uri uri, ContentValues[] values) { - Log.d("Commons", "Hello, bulk insert! (ModificationsContentProvider)"); + Timber.d("Hello, bulk insert! (ModificationsContentProvider)"); int uriType = uriMatcher.match(uri); SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); sqlDB.beginTransaction(); switch (uriType) { case MODIFICATIONS: for(ContentValues value: values) { - Log.d("Commons", "Inserting! " + value.toString()); + Timber.d("Inserting! %s", value); sqlDB.insert(ModifierSequence.Table.TABLE_NAME, null, value); } break; 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 b17162705..228b01a80 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 @@ -11,7 +11,6 @@ import android.content.SyncResult; import android.database.Cursor; import android.os.Bundle; import android.os.RemoteException; -import android.util.Log; import org.mediawiki.api.ApiResult; import org.mediawiki.api.MWApi; @@ -22,6 +21,7 @@ import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.ContributionsContentProvider; +import timber.log.Timber; public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { @@ -42,7 +42,7 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { // Exit early if nothing to do if(allModifications == null || allModifications.getCount() == 0) { - Log.d("Commons", "No modifications to perform"); + Timber.d("No modifications to perform"); return; } @@ -52,12 +52,12 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { } catch (OperationCanceledException | AuthenticatorException e) { throw new RuntimeException(e); } catch (IOException e) { - Log.d("Commons", "Could not authenticate :("); + Timber.d("Could not authenticate :("); return; } if(Utils.isNullOrWhiteSpace(authCookie)) { - Log.d("Commons", "Could not authenticate :("); + Timber.d("Could not authenticate :("); return; } @@ -69,13 +69,13 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { try { editToken = api.getEditToken(); } catch (IOException e) { - Log.d("Commons", "Can not retreive edit token!"); + Timber.d("Can not retreive edit token!"); return; } allModifications.moveToFirst(); - Log.d("Commons", "Found " + allModifications.getCount() + " modifications to execute"); + Timber.d("Found %d modifications to execute", allModifications.getCount()); ContentProviderClient contributionsClient = null; try { @@ -104,11 +104,11 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { .param("titles", contrib.getFilename()) .get(); } catch (IOException e) { - Log.d("Commons", "Network fuckup on modifications sync!"); + Timber.d("Network fuckup on modifications sync!"); continue; } - Log.d("Commons", "Page content is " + Utils.getStringFromDOM(requestResult.getDocument())); + Timber.d("Page content is %s", Utils.getStringFromDOM(requestResult.getDocument())); String pageContent = requestResult.getString("/api/query/pages/page/revisions/rev"); String processedPageContent = sequence.executeModifications(contrib.getFilename(), pageContent); @@ -120,16 +120,16 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { .param("summary", sequence.getEditSummary()) .post(); } catch (IOException e) { - Log.d("Commons", "Network fuckup on modifications sync!"); + Timber.d("Network fuckup on modifications sync!"); continue; } - Log.d("Commons", "Response is" + Utils.getStringFromDOM(responseResult.getDocument())); + Timber.d("Response is %s", Utils.getStringFromDOM(responseResult.getDocument())); String result = responseResult.getString("/api/edit/@result"); if(!result.equals("Success")) { // FIXME: Log this somewhere else - Log.d("Commons", "Non success result!" + result); + Timber.d("Non success result! %s", result); } else { sequence.delete(); } 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 380d256fd..de1b3b6cc 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 @@ -14,8 +14,6 @@ public class NearbyActivity extends BaseActivity { private LocationServiceManager locationManager; - private static final String TAG = NearbyActivity.class.getName(); - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 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 c642e9602..63161f87b 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 @@ -1,7 +1,6 @@ package fr.free.nrw.commons.nearby; import android.content.Context; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,6 +10,8 @@ import fr.free.nrw.commons.R; import java.util.List; +import timber.log.Timber; + public class NearbyAdapter extends ArrayAdapter { private List placesList; private Context context; @@ -33,7 +34,7 @@ public class NearbyAdapter extends ArrayAdapter { public View getView(int position, View convertView, ViewGroup parent) { // Get the data item for this position Place place = getItem(position); - Log.v("NearbyAdapter", "" + place); + Timber.v(String.valueOf(place)); // Check if an existing view is being reused, otherwise inflate the view if (convertView == null) { 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 e7aedd249..537687567 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 @@ -10,7 +10,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.ListFragment; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -22,6 +21,7 @@ import butterknife.ButterKnife; import butterknife.OnItemClick; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; +import timber.log.Timber; import java.util.Collections; import java.util.Comparator; @@ -40,8 +40,6 @@ public class NearbyListFragment extends ListFragment implements TaskListener { private boolean isTaskRunning = false; - private static final String TAG = NearbyListFragment.class.getName(); - public NearbyListFragment() { } @@ -55,7 +53,7 @@ public class NearbyListFragment extends ListFragment implements TaskListener { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - Log.d(TAG, "NearbyListFragment created"); + Timber.d("NearbyListFragment created"); View view = inflater.inflate(R.layout.fragment_nearby, container, false); ButterKnife.bind(this, view); return view; @@ -69,7 +67,7 @@ public class NearbyListFragment extends ListFragment implements TaskListener { nearbyAsyncTask = new NearbyAsyncTask(this); nearbyAsyncTask.execute(); progressBar.setVisibility(View.VISIBLE); - Log.d(TAG, "Saved instance state is null, populating ListView"); + Timber.d("Saved instance state is null, populating ListView"); } else { progressBar.setVisibility(View.GONE); } @@ -174,10 +172,7 @@ public class NearbyListFragment extends ListFragment implements TaskListener { double latitude = placeLatLng.latitude; double longitude = placeLatLng.longitude; - Log.d(TAG, "Item at position " - + position + " has coords: Lat: " - + latitude + " Long: " - + longitude); + 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); @@ -189,7 +184,7 @@ public class NearbyListFragment extends ListFragment implements TaskListener { } private List loadAttractionsFromLocation(LatLng curLatLng) { - Log.d(TAG, "Loading attractions near " + curLatLng); + Timber.d("Loading attractions near %s", curLatLng); if (curLatLng == null) { return Collections.emptyList(); } @@ -199,7 +194,7 @@ public class NearbyListFragment extends ListFragment implements TaskListener { curLatLng, Locale.getDefault().getLanguage()) : NearbyPlaces.getInstance().getFromWikiNeedsPictures(); if (curLatLng != null) { - Log.d(TAG, "Sorting places by distance..."); + Timber.d("Sorting places by distance..."); final Map distances = new HashMap<>(); for (Place place: places) { distances.put(place, computeDistanceBetween(place.location, curLatLng)); 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 ecb0064d5..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 @@ -2,7 +2,6 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.StrictMode; -import android.util.Log; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.location.LatLng; @@ -20,10 +19,10 @@ import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import timber.log.Timber; public class NearbyPlaces { - private static final String TAG = NearbyPlaces.class.getName(); private static final int MIN_RESULTS = 40; private static final double INITIAL_RADIUS = 1.0; private static final double MAX_RADIUS = 300.0; @@ -81,7 +80,7 @@ public class NearbyPlaces { // increase the radius gradually to find a satisfactory number of nearby places while (radius < MAX_RADIUS) { places = getFromWikidataQuery(curLatLng, lang, radius); - Log.d(TAG, places.size() + " results at radius: " + radius); + Timber.d("%d results at radius: %f", places.size(), radius); if (places.size() >= MIN_RESULTS) { break; } else { @@ -89,10 +88,10 @@ public class NearbyPlaces { } } } catch (IOException e) { - Log.d(TAG, "" + e.toString()); + Timber.d(e.toString()); // errors tend to be caused by too many results (and time out) // try a small radius next time - Log.d(TAG, "back to initial radius: " + radius); + Timber.d("back to initial radius: %f", radius); radius = INITIAL_RADIUS; } return places; @@ -107,15 +106,15 @@ public class NearbyPlaces { .replace("${LANG}", "" + lang); query = URLEncoder.encode(query, "utf-8").replace("+", "%20"); String url = WIKIDATA_QUERY_URL.replace("${QUERY}", query); - Log.d(TAG, url); + Timber.d(url); URLConnection conn = new URL(url).openConnection(); conn.setRequestProperty("Accept", "text/tab-separated-values"); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; - Log.d(TAG, "Reading from query result..."); + Timber.d("Reading from query result..."); while ((line = in.readLine()) != null) { - Log.v(TAG, line); + Timber.v(line); line = line + "\n"; // to pad columns and make fields a fixed size if (!line.startsWith("\"Point")) { continue; @@ -170,7 +169,7 @@ public class NearbyPlaces { boolean firstLine = true; String line; - Log.d(TAG, "Reading from CSV file..."); + Timber.d("Reading from CSV file..."); while ((line = in.readLine()) != null) { @@ -209,7 +208,7 @@ public class NearbyPlaces { in.close(); } catch (IOException e) { - Log.d(TAG, e.toString()); + Timber.d(e.toString()); } } return places; 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 6d7854c26..6d7b08025 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 @@ -4,7 +4,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; -import android.util.Log; +import android.support.v7.app.AlertDialog; import org.mediawiki.api.ApiResult; import org.mediawiki.api.MWApi; @@ -12,11 +12,10 @@ import org.mediawiki.api.MWApi; import java.io.IOException; import java.util.ArrayList; -import android.support.v7.app.AlertDialog; - import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.contributions.ContributionsActivity; +import timber.log.Timber; /** * Sends asynchronous queries to the Commons MediaWiki API to check that file doesn't already exist @@ -24,8 +23,6 @@ import fr.free.nrw.commons.contributions.ContributionsActivity; */ public class ExistingFileAsync extends AsyncTask { - private static final String TAG = ExistingFileAsync.class.getName(); - private String fileSHA1; private Context context; @@ -51,14 +48,14 @@ public class ExistingFileAsync extends AsyncTask { .param("list", "allimages") .param("aisha1", fileSHA1) .get(); - Log.d(TAG, "Searching Commons API for existing file: " + result.toString()); + Timber.d("Searching Commons API for existing file: %s", result); } catch (IOException e) { - Log.e(TAG, "IO Exception: ", e); + Timber.e(e, "IO Exception: "); return false; } ArrayList resultNodes = result.getNodes("/api/query/allimages/img"); - Log.d(TAG, "Result nodes: " + resultNodes); + Timber.d("Result nodes: %s", resultNodes); boolean fileExists; if (!resultNodes.isEmpty()) { @@ -67,7 +64,7 @@ public class ExistingFileAsync extends AsyncTask { fileExists = false; } - Log.d(TAG, "File already exists in Commons:" + fileExists); + Timber.d("File already exists in Commons: %s", fileExists); return fileExists; } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/GPSExtractor.java b/app/src/main/java/fr/free/nrw/commons/upload/GPSExtractor.java index ea26cfa2c..e861a1803 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/GPSExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/GPSExtractor.java @@ -10,10 +10,11 @@ import android.media.ExifInterface; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; -import android.util.Log; import java.io.IOException; +import timber.log.Timber; + /** * Extracts geolocation to be passed to API for category suggestions. If a picture with geolocation * is uploaded, extract latitude and longitude from EXIF data of image. If a picture without @@ -21,8 +22,6 @@ import java.io.IOException; */ public class GPSExtractor { - private static final String TAG = GPSExtractor.class.getName(); - private String filePath; private double decLatitude, decLongitude; private Double currentLatitude = null; @@ -46,7 +45,7 @@ public class GPSExtractor { private boolean gpsPreferenceEnabled() { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); boolean gpsPref = sharedPref.getBoolean("allowGps", false); - Log.d(TAG, "Gps pref set to: " + gpsPref); + Timber.d("Gps pref set to: %b", gpsPref); return gpsPref; } @@ -66,9 +65,9 @@ public class GPSExtractor { myLocationListener.onLocationChanged(location); } } catch (IllegalArgumentException e) { - Log.e(TAG, "Illegal argument exception", e); + Timber.e(e, "Illegal argument exception"); } catch (SecurityException e) { - Log.e(TAG, "Security exception", e); + Timber.e(e, "Security exception"); } } @@ -76,7 +75,7 @@ public class GPSExtractor { try { locationManager.removeUpdates(myLocationListener); } catch (SecurityException e) { - Log.e(TAG, "Security exception", e); + Timber.e(e, "Security exception"); } } @@ -98,10 +97,10 @@ public class GPSExtractor { try { exif = new ExifInterface(filePath); } catch (IOException e) { - Log.w(TAG, e); + Timber.w(e); return null; } catch (IllegalArgumentException e) { - Log.w(TAG, e); + Timber.w(e); return null; } @@ -110,14 +109,15 @@ public class GPSExtractor { registerLocationManager(); imageCoordsExists = false; - Log.d(TAG, "EXIF data has no location info"); + Timber.d("EXIF data has no location info"); //Check what user's preference is for automatic location detection boolean gpsPrefEnabled = gpsPreferenceEnabled(); //Check that currentLatitude and currentLongitude have been explicitly set by MyLocationListener and do not default to (0.0,0.0) if (gpsPrefEnabled && currentLatitude != null && currentLongitude != null) { - Log.d(TAG, "Current location values: Lat = " + currentLatitude + " Long = " + currentLongitude); + Timber.d("Current location values: Lat = %f Long = %f", + currentLatitude, currentLongitude); return String.valueOf(currentLatitude) + "|" + String.valueOf(currentLongitude); } else { // No coords found @@ -128,7 +128,7 @@ public class GPSExtractor { } else { //If image has EXIF data, extract image coords imageCoordsExists = true; - Log.d(TAG, "EXIF data has location info"); + Timber.d("EXIF data has location info"); latitude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE); latitude_ref = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF); @@ -136,8 +136,8 @@ public class GPSExtractor { longitude_ref = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF); if (latitude!=null && latitude_ref!=null && longitude!=null && longitude_ref!=null) { - Log.d(TAG, "Latitude: " + latitude + " " + latitude_ref); - Log.d(TAG, "Longitude: " + longitude + " " + longitude_ref); + Timber.d("Latitude: %s %s", latitude, latitude_ref); + Timber.d("Longitude: %s %s", longitude, longitude_ref); decimalCoords = getDecimalCoords(latitude, latitude_ref, longitude, longitude_ref); return decimalCoords; @@ -160,17 +160,17 @@ public class GPSExtractor { @Override public void onStatusChanged(String provider, int status, Bundle extras) { - Log.d(TAG, provider + "'s status changed to " + status); + Timber.d("%s's status changed to %d", provider, status); } @Override public void onProviderEnabled(String provider) { - Log.d(TAG, "Provider " + provider + " enabled"); + Timber.d("Provider %s enabled", provider); } @Override public void onProviderDisabled(String provider) { - Log.d(TAG, "Provider " + provider + " disabled"); + Timber.d("Provider %s disabled", provider); } } @@ -201,7 +201,7 @@ public class GPSExtractor { } String decimalCoords = String.valueOf(decLatitude) + "|" + String.valueOf(decLongitude); - Log.d(TAG, "Latitude and Longitude are " + decimalCoords); + Timber.d("Latitude and Longitude are %s", decimalCoords); return decimalCoords; } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java index a39ca0d6c..27ab99e07 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java @@ -14,7 +14,6 @@ import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; -import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -36,6 +35,7 @@ import fr.free.nrw.commons.modifications.CategoryModifier; import fr.free.nrw.commons.modifications.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.modifications.TemplateRemoveModifier; +import timber.log.Timber; public class MultipleShareActivity extends AuthenticatedActivity @@ -116,7 +116,7 @@ public class MultipleShareActivity private void multipleUploadBegins() { - Log.d("MultipleShareActivity", "Multiple upload begins"); + Timber.d("Multiple upload begins"); final ProgressDialog dialog = new ProgressDialog(MultipleShareActivity.this); dialog.setIndeterminate(false); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java b/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java index f47e76dbd..6544b4fff 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java @@ -2,7 +2,6 @@ package fr.free.nrw.commons.upload; import android.content.Context; import android.net.Uri; -import android.util.Log; import com.android.volley.Cache; import com.android.volley.NetworkResponse; @@ -22,6 +21,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import timber.log.Timber; + /** * Uses the Volley library to implement asynchronous calls to the Commons MediaWiki API to match * GPS coordinates with nearby Commons categories. Parses the results using GSON to obtain a list @@ -38,7 +39,6 @@ public class MwVolleyApi { private static List categoryList; private static final String MWURL = "https://commons.wikimedia.org/"; - private static final String TAG = MwVolleyApi.class.getName(); public MwVolleyApi(Context context) { this.context = context; @@ -52,13 +52,13 @@ public class MwVolleyApi { public static void setGpsCat(List cachedList) { categoryList = new ArrayList<>(); categoryList.addAll(cachedList); - Log.d(TAG, "Setting GPS cats from cache: " + categoryList.toString()); + Timber.d("Setting GPS cats from cache: %s", categoryList); } public void request(String coords) { coordsLog = coords; String apiUrl = buildUrl(coords); - Log.d(TAG, "URL: " + apiUrl); + Timber.d("URL: %s", apiUrl); JsonRequest request = new QueryRequest(apiUrl, new LogResponseListener(), new LogResponseErrorListener()); @@ -110,7 +110,7 @@ public class MwVolleyApi { @Override public void onResponse(T response) { - Log.d(TAG, response.toString()); + Timber.d(response.toString()); } } @@ -118,12 +118,11 @@ public class MwVolleyApi { @Override public void onErrorResponse(VolleyError error) { - Log.e(TAG, error.toString()); + Timber.e(error.toString()); } } private static class QueryRequest extends JsonRequest { - private static final String TAG = QueryRequest.class.getName(); public QueryRequest(String url, Response.Listener listener, @@ -169,11 +168,11 @@ public class MwVolleyApi { private String printSet() { if (categorySet == null || categorySet.isEmpty()) { GpsCatExists.setGpsCatExists(false); - Log.d(TAG, "gpsCatExists=" + GpsCatExists.getGpsCatExists()); + Timber.d("gpsCatExists=%b", GpsCatExists.getGpsCatExists()); return "No collection of categories"; } else { GpsCatExists.setGpsCatExists(true); - Log.d(TAG, "gpsCatExists=" + GpsCatExists.getGpsCatExists()); + Timber.d("gpsCatExists=%b", GpsCatExists.getGpsCatExists()); return "CATEGORIES FOUND" + categorySet.toString(); } 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 0805ea462..b5be52a9f 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 @@ -12,7 +12,6 @@ import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.app.NavUtils; import android.support.v4.content.ContextCompat; -import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; @@ -38,6 +37,7 @@ import fr.free.nrw.commons.modifications.CategoryModifier; import fr.free.nrw.commons.modifications.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.modifications.TemplateRemoveModifier; +import timber.log.Timber; /** * Activity for the title/desc screen after image is selected. Also starts processing image @@ -48,8 +48,6 @@ public class ShareActivity implements SingleUploadFragment.OnUploadActionInitiated, CategorizationFragment.OnCategoriesSaveHandler { - private static final String TAG = ShareActivity.class.getName(); - private SingleUploadFragment shareView; private CategorizationFragment categorizationFragment; @@ -118,7 +116,7 @@ public class ShareActivity if (cacheFound == false) { //Has to be called after apiCall.request() app.cacheData.cacheCategory(); - Log.d(TAG, "Cache the categories found"); + Timber.d("Cache the categories found"); } uploadController.startUpload(title, mediaUri, description, mimeType, source, decimalCoords, new UploadController.ContributionUploadProgress() { @@ -245,15 +243,15 @@ public class ShareActivity //Test SHA1 of image to see if it matches SHA1 of a file on Commons try { InputStream inputStream = getContentResolver().openInputStream(mediaUri); - Log.d(TAG, "Input stream created from " + mediaUriString); + Timber.d("Input stream created from %s", mediaUriString); String fileSHA1 = Utils.getSHA1(inputStream); - Log.d(TAG, "File SHA1 is: " + fileSHA1); + Timber.d("File SHA1 is: %s", fileSHA1); ExistingFileAsync fileAsyncTask = new ExistingFileAsync(fileSHA1, this); fileAsyncTask.execute(); } catch (IOException e) { - Log.d(TAG, "IO Exception: ", e); + Timber.d(e, "IO Exception: "); } } @@ -263,8 +261,8 @@ public class ShareActivity requestAuthToken(); - Log.d(TAG, "Uri: " + mediaUriString); - Log.d(TAG, "Ext storage dir: " + Environment.getExternalStorageDirectory()); + Timber.d("Uri: %s", mediaUriString); + Timber.d("Ext storage dir: %s", Environment.getExternalStorageDirectory()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { useNewPermissions = true; @@ -378,8 +376,8 @@ public class ShareActivity */ public void getFileMetadata(boolean gpsEnabled) { filePath = FileUtils.getPath(this, mediaUri); - Log.d(TAG, "Filepath: " + filePath); - Log.d(TAG, "Calling GPSExtractor"); + Timber.d("Filepath: %s", filePath); + Timber.d("Calling GPSExtractor"); if(imageObj == null) { imageObj = new GPSExtractor(filePath, this); } @@ -397,7 +395,7 @@ public class ShareActivity */ public void useImageCoords() { if(decimalCoords != null) { - Log.d(TAG, "Decimal coords of image: " + decimalCoords); + Timber.d("Decimal coords of image: %s", decimalCoords); // Only set cache for this point if image has coords if (imageObj.imageCoordsExists) { @@ -415,10 +413,10 @@ public class ShareActivity if (catListEmpty) { cacheFound = false; apiCall.request(decimalCoords); - Log.d(TAG, "displayCatList size 0, calling MWAPI" + displayCatList.toString()); + Timber.d("displayCatList size 0, calling MWAPI %s", displayCatList); } else { cacheFound = true; - Log.d(TAG, "Cache found, setting categoryList in MwVolleyApi to " + displayCatList.toString()); + Timber.d("Cache found, setting categoryList in MwVolleyApi to %s", displayCatList); MwVolleyApi.setGpsCat(displayCatList); } } @@ -429,10 +427,10 @@ public class ShareActivity super.onPause(); try { imageObj.unregisterLocationManager(); - Log.d(TAG, "Unregistered locationManager"); + Timber.d("Unregistered locationManager"); } catch (NullPointerException e) { - Log.d(TAG, "locationManager does not exist, not unregistered"); + Timber.d("locationManager does not exist, not unregistered"); } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index 687bcabb0..e96c8768c 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -11,7 +11,6 @@ import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.text.Editable; import android.text.TextWatcher; -import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -37,6 +36,7 @@ import butterknife.OnTouch; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; +import timber.log.Timber; public class SingleUploadFragment extends Fragment { private SharedPreferences prefs; @@ -54,8 +54,6 @@ public class SingleUploadFragment extends Fragment { private OnUploadActionInitiated uploadActionInitiatedHandler; - private static final String TAG = SingleUploadFragment.class.getName(); - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.activity_share, menu); @@ -103,7 +101,7 @@ public class SingleUploadFragment extends Fragment { prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); license = prefs.getString(Prefs.DEFAULT_LICENSE, Prefs.Licenses.CC_BY_SA_3); - Log.d("Single Upload fragment", license); + Timber.d(license); ArrayAdapter adapter; if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("theme",true)) { @@ -117,7 +115,7 @@ public class SingleUploadFragment extends Fragment { licenseSpinner.setAdapter(adapter); int position = licenseItems.indexOf(getString(Utils.licenseNameFor(license))); - Log.d("Single Upload fragment", "Position:"+position+" "+getString(Utils.licenseNameFor(license))); + Timber.d("Position: %d %s", position, getString(Utils.licenseNameFor(license))); licenseSpinner.setSelection(position); TextWatcher uploadEnabler = new TextWatcher() { @@ -190,7 +188,7 @@ public class SingleUploadFragment extends Fragment { SharedPreferences titleDesc = PreferenceManager.getDefaultSharedPreferences(getActivity()); String title = titleDesc.getString("Title", ""); String desc = titleDesc.getString("Desc", ""); - Log.d(TAG, "Title: " + title + ", Desc: " + desc); + Timber.d("Title: %s, Desc: %s", title, desc); titleEdit.setText(title); descEdit.setText(desc); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java index f2c147249..2bdee55f5 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java @@ -13,7 +13,6 @@ import android.os.IBinder; import android.preference.PreferenceManager; import android.provider.MediaStore; import android.text.TextUtils; -import android.util.Log; import java.io.IOException; import java.util.Date; @@ -23,6 +22,7 @@ import fr.free.nrw.commons.HandlerService; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.contributions.Contribution; +import timber.log.Timber; public class UploadController { private UploadService uploadService; @@ -115,11 +115,11 @@ public class UploadController { contribution.setDataLength(length); } } catch(IOException e) { - Log.e("UploadController", "IO Exception: ", e); + Timber.e(e, "IO Exception: "); } catch(NullPointerException e) { - Log.e("UploadController", "Null Pointer Exception: ", e); + Timber.e(e, "Null Pointer Exception: "); } catch(SecurityException e) { - Log.e("UploadController", "Security Exception: ", e); + Timber.e(e, "Security Exception: "); } String mimeType = (String)contribution.getTag("mimeType"); @@ -132,7 +132,7 @@ public class UploadController { if(mimeType != null) { contribution.setTag("mimeType", mimeType); imagePrefix = mimeType.startsWith("image/"); - Log.d("UploadController", "MimeType is: " + mimeType); + Timber.d("MimeType is: %s", mimeType); } if(imagePrefix && contribution.getDateCreated() == null) { 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 567eb809c..dea134ac3 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 @@ -10,7 +10,6 @@ import android.content.Intent; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v4.app.NotificationCompat; -import android.util.Log; import android.webkit.MimeTypeMap; import android.widget.Toast; @@ -36,6 +35,7 @@ import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.contributions.ContributionsContentProvider; import fr.free.nrw.commons.modifications.ModificationsContentProvider; import in.yuvi.http.fluent.ProgressListener; +import timber.log.Timber; public class UploadService extends HandlerService { @@ -87,7 +87,7 @@ public class UploadService extends HandlerService { @Override public void onProgress(long transferred, long total) { - Log.d("Commons", String.format("Uploaded %d of %d", transferred, total)); + Timber.d("Uploaded %d of %d", transferred, total); if(!notificationTitleChanged) { curProgressNotification.setContentTitle(notificationProgressTitle); notificationTitleChanged = true; @@ -112,7 +112,7 @@ public class UploadService extends HandlerService { public void onDestroy() { super.onDestroy(); contributionsProviderClient.release(); - Log.d("Commons", "UploadService.onDestroy; " + unfinishedUploads + " are yet to be uploaded"); + Timber.d("UploadService.onDestroy; %s are yet to be uploaded", unfinishedUploads); } @Override @@ -149,7 +149,7 @@ public class UploadService extends HandlerService { toUpload++; if (curProgressNotification != null && toUpload != 1) { curProgressNotification.setContentText(getResources().getQuantityString(R.plurals.uploads_pending_notification_indicator, toUpload, toUpload)); - Log.d("Commons", String.format("%d uploads left", toUpload)); + Timber.d("%d uploads left", toUpload); this.startForeground(NOTIFICATION_UPLOAD_IN_PROGRESS, curProgressNotification.build()); } @@ -173,8 +173,8 @@ public class UploadService extends HandlerService { Contribution.Table.COLUMN_STATE + " = ? OR " + Contribution.Table.COLUMN_STATE + " = ?", new String[]{ String.valueOf(Contribution.STATE_QUEUED), String.valueOf(Contribution.STATE_IN_PROGRESS) } ); - Log.d("Commons", "Set " + updated + " uploads to failed"); - Log.d("Commons", "Flags is" + flags + " id is" + startId); + Timber.d("Set %d uploads to failed", updated); + Timber.d("Flags is %d id is %d", flags, startId); freshStart = false; } return START_REDELIVER_INTENT; @@ -192,12 +192,12 @@ public class UploadService extends HandlerService { //FIXME: Google Photos bug file = this.getContentResolver().openInputStream(contribution.getLocalUri()); } catch(FileNotFoundException e) { - Log.d("Exception", "File not found"); + Timber.d("File not found"); Toast fileNotFound = Toast.makeText(this, R.string.upload_failed, Toast.LENGTH_LONG); fileNotFound.show(); } - Log.d("Commons", "Before execution!"); + Timber.d("Before execution!"); curProgressNotification = new NotificationCompat.Builder(this).setAutoCancel(true) .setSmallIcon(R.drawable.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)) @@ -218,16 +218,16 @@ public class UploadService extends HandlerService { MimeTypeMap.getSingleton().getExtensionFromMimeType((String)contribution.getTag("mimeType"))); synchronized (unfinishedUploads) { - Log.d("Commons", "making sure of uniqueness of name: " + filename); + Timber.d("making sure of uniqueness of name: %s", filename); filename = findUniqueFilename(filename); unfinishedUploads.add(filename); } if(!api.validateLogin()) { // Need to revalidate! if(app.revalidateAuthToken()) { - Log.d("Commons", "Successfully revalidated token!"); + Timber.d("Successfully revalidated token!"); } else { - Log.d("Commons", "Unable to revalidate :("); + Timber.d("Unable to revalidate :("); // TODO: Put up a new notification, ask them to re-login stopForeground(true); Toast failureToast = Toast.makeText(this, R.string.authentication_failed, Toast.LENGTH_LONG); @@ -242,7 +242,7 @@ public class UploadService extends HandlerService { ); result = api.upload(filename, file, contribution.getDataLength(), contribution.getPageContents(), contribution.getEditSummary(), notificationUpdater); - Log.d("Commons", "Response is" + Utils.getStringFromDOM(result.getDocument())); + Timber.d("Response is %s", Utils.getStringFromDOM(result.getDocument())); curProgressNotification = null; @@ -277,7 +277,7 @@ public class UploadService extends HandlerService { .log(); } } catch(IOException e) { - Log.d("Commons", "I have a network fuckup"); + Timber.d("I have a network fuckup"); showFailedNotification(contribution); return; } finally { From d77d5cb40a6e5cdf5565122d8bfb578aae4a7014 Mon Sep 17 00:00:00 2001 From: veyndan Date: Mon, 17 Apr 2017 18:47:50 +0100 Subject: [PATCH 003/168] Make refresh icon for nearby places white (closes #483) --- .../main/res/drawable-mdpi/ic_action_refresh.png | Bin 856 -> 0 bytes .../main/res/drawable/ic_refresh_white_24dp.xml | 11 +++++++++++ app/src/main/res/menu/menu_nearby.xml | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_refresh.png create mode 100644 app/src/main/res/drawable/ic_refresh_white_24dp.xml diff --git a/app/src/main/res/drawable-mdpi/ic_action_refresh.png b/app/src/main/res/drawable-mdpi/ic_action_refresh.png deleted file mode 100644 index 4f5d2558fb4aa54734d28710db340662539af976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmV-e1E>6nP)F3ADH0n$Bm z4+oeYpglm?m)Q>-AhQn#C=;SPk<-D6W|FLGM;1~TrQWk%{>IUvcAl+?7y}EsyNl~cV`xWj0usb z^0^>#QB*!A^5qHv3nDX+Sn%8ph&U2Ca7f82V}v#nKqvP`=3DT;oz#0P93MuKE$Qew! zsQGgw5h$&50U6~_5Xkm|XO6Wrxt8?#SRsX?6R>Jfo=z;SDJL6CWCLEw1ATZI?$He2V-6dwguRVt4X6o#R6`O6+c@*0IPXYv_U{q zL&GNA+ujb_gqJ@00XBi<0*9dxu;3JDm!S~wYFeDROaLv+=A7E37y5UcA>s07HaXa?3&UVdWT4R}@vs=DrkPQaOylUbMsIQM*V-JsW}3t;W@Q_Q{u z1_3w0WHApr(N-Os09H?K18Io{vn0^J%yfg*&V!b^&uzHCredOH8!ZMhUf}0(Ls~rp zfvul8U=UDkKK$eO=LKY2*~&(Y)$aU^0W%Heuo;nc8!HY}uv}ngQjPVAk^jfZfx{Ev i3Gf7X0tSsA0R{j_QJq2(iHleO0000 + + + + diff --git a/app/src/main/res/menu/menu_nearby.xml b/app/src/main/res/menu/menu_nearby.xml index d6238016f..44b4c2d82 100644 --- a/app/src/main/res/menu/menu_nearby.xml +++ b/app/src/main/res/menu/menu_nearby.xml @@ -5,7 +5,7 @@ From 96b8a5fdc840f0da15da6dfcd1ff04bc142a35dd Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Sat, 15 Apr 2017 20:14:57 +0900 Subject: [PATCH 004/168] Move config file of PMD --- app/quality.gradle | 2 +- ruleset.xml => script/style/ruleset.xml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename ruleset.xml => script/style/ruleset.xml (100%) diff --git a/app/quality.gradle b/app/quality.gradle index a63a02720..7ea20916a 100644 --- a/app/quality.gradle +++ b/app/quality.gradle @@ -25,7 +25,7 @@ task checkstyle(type: Checkstyle) { task pmd(type: Pmd) { ignoreFailures = true - ruleSetFiles = files("${project.rootDir}/ruleset.xml") + ruleSetFiles = files("${project.rootDir}/script/style/ruleset.xml") ruleSets = [] source 'src' diff --git a/ruleset.xml b/script/style/ruleset.xml similarity index 100% rename from ruleset.xml rename to script/style/ruleset.xml From 7a7e1e7fbbbfc86432a0337b6621be8a2a18f908 Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Sun, 16 Apr 2017 17:54:06 +0900 Subject: [PATCH 005/168] Test license selection in Settings and run emulator on Travis --- .travis.yml | 22 +++- app/build.gradle | 4 + .../nrw/commons/SettingsActivityTest.java | 117 ++++++++++++++++++ script/style/checkstyle.xml | 3 +- 4 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java diff --git a/.travis.yml b/.travis.yml index 8c0af5731..8754b0e89 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,12 @@ language: android +addons: + apt: + packages: + - w3m +env: + global: + - ANDROID_TARGET=android-22 + - ANDROID_ABI=armeabi-v7a android: components: - platform-tools @@ -6,8 +14,20 @@ android: - build-tools-25.0.1 - extra-google-m2repository - extra-android-m2repository + - extra-google-google_play_services + - extra-android-support + - ${ANDROID_TARGET} - android-25 - - sys-img-x86-android-18 + - sys-img-${ANDROID_ABI}-${ANDROID_TARGET} +before_script: + - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI + - emulator -avd test -no-audio -no-window & + - android-wait-for-emulator + - adb shell input keyevent 82 & +script: + - ./gradlew test connectedAndroidTest -stacktrace +after_failure: + - w3m -dump ${TRAVIS_BUILD_DIR}/app/build/reports/androidTests/connected/*Test.html jdk: # - openjdk8 # not yet available - oraclejdk8 diff --git a/app/build.gradle b/app/build.gradle index fb42cd2a9..4500d9cf5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,11 +13,14 @@ dependencies { compile "com.android.support:support-v4:${project.supportLibVersion}" compile "com.android.support:appcompat-v7:${project.supportLibVersion}" compile "com.android.support:design:${project.supportLibVersion}" + compile "com.android.support:support-annotations:${project.supportLibVersion}" compile 'com.google.code.gson:gson:2.7' compile "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION" annotationProcessor "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION" testCompile 'junit:junit:4.12' + androidTestCompile "com.android.support:support-annotations:${project.supportLibVersion}" + androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' } android { @@ -32,6 +35,7 @@ android { versionName '2.2' minSdkVersion project.minSdkVersion targetSdkVersion project.targetSdkVersion + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java new file mode 100644 index 000000000..dc7ead0ab --- /dev/null +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -0,0 +1,117 @@ +package fr.free.nrw.commons; + +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.anyOf; +import static org.hamcrest.Matchers.anything; + +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.support.test.espresso.Espresso; +import android.support.test.espresso.action.ViewActions; +import android.support.test.espresso.assertion.ViewAssertions; +import android.support.test.espresso.matcher.ViewMatchers; +import android.support.test.filters.LargeTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.view.View; + +import fr.free.nrw.commons.settings.SettingsActivity; + +import java.util.Map; + +import org.hamcrest.Matcher; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@LargeTest +@RunWith(AndroidJUnit4.class) +public class SettingsActivityTest { + private SharedPreferences prefs; + private Map prefValues; + + @Rule + public ActivityTestRule activityRule = + new ActivityTestRule(SettingsActivity.class, + false /* Initial touch mode */, true /* launch activity */) { + + @Override + protected void afterActivityLaunched() { + // save preferences + prefs = PreferenceManager.getDefaultSharedPreferences(this.getActivity()); + prefValues = prefs.getAll(); + } + + @Override + protected void afterActivityFinished() { + // restore preferences + SharedPreferences.Editor editor = prefs.edit(); + for (Map.Entry entry: prefValues.entrySet()) { + String key = entry.getKey(); + Object val = entry.getValue(); + if (val instanceof String) { + editor.putString(key, (String)val); + } else if (val instanceof Boolean) { + editor.putBoolean(key, (Boolean)val); + } else if (val instanceof Integer) { + editor.putInt(key, (Integer)val); + } else { + throw new RuntimeException("type not implemented: " + entry); + } + } + editor.apply(); + } + }; + + @Test + public void oneLicenseIsChecked() { + // click "License" (the first item) + Espresso.onData(anything()) + .inAdapterView(findPreferenceList()) + .atPosition(0) + .perform(ViewActions.click()); + + // test the selected item + Espresso.onView(ViewMatchers.isChecked()) + .check(ViewAssertions.matches(ViewMatchers.isDisplayed())); + } + + @Test + public void afterClickingCcby4ItWillStay() { + // click "License" (the first item) + Espresso.onData(anything()) + .inAdapterView(findPreferenceList()) + .atPosition(0) + .perform(ViewActions.click()); + + // click "CC BY-4.0" + Espresso.onView( + // FIXME: just R.string.license_name_cc_by_four should be fine but fails on Travis + textAnyOf(R.string.license_name_cc_by_four, R.string.license_name_cc_by_4_0) + ).perform(ViewActions.click()); + + // click "License" (the first item) + Espresso.onData(anything()) + .inAdapterView(findPreferenceList()) + .atPosition(0) + .perform(ViewActions.click()); + + // test the value remains "CC BY-4.0" + Espresso.onView(ViewMatchers.isChecked()) + .check(ViewAssertions.matches( + textAnyOf(R.string.license_name_cc_by_four, R.string.license_name_cc_by_4_0) + )); + } + + private Matcher textAnyOf(int id1, int id2) { + return anyOf(ViewMatchers.withText(id1), ViewMatchers.withText(id2)); + } + + private static Matcher findPreferenceList() { + return allOf( + ViewMatchers.isDescendantOfA(ViewMatchers.withId(android.R.id.content)), + ViewMatchers.withId(android.R.id.list), + ViewMatchers.hasFocus() + ); + } +} diff --git a/script/style/checkstyle.xml b/script/style/checkstyle.xml index 339d9131f..a9e48a4fe 100644 --- a/script/style/checkstyle.xml +++ b/script/style/checkstyle.xml @@ -80,7 +80,8 @@ - + + From a497bf527af14fc8a5cb7386d7523a06f6d3ecd7 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 20 Apr 2017 07:26:02 +0200 Subject: [PATCH 006/168] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-br/strings.xml | 4 +++- app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-es/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values-lb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pms/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 4 +++- app/src/main/res/values-ru/strings.xml | 20 +++++++++++--------- 10 files changed, 27 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 6c3b1e2b4..ecb17e920 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -74,7 +74,7 @@ Pouezit war ar c\'hemenn-mañ (pe distroit en a-raok) evit mont dreist ar bazenn Arventennoù En em enskrivañ Diwar-benn - Meziant frank a wirioù embannet dindan <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">an Aotre-implijout Apache v2</a>. Merkoù kenwerzhel eus Diazezadur Wikimedia eo Wikimedia Commons hag e logoioù. Gallout a reont bezaén implijet gant aotre an Diazezadur. N\'omp nag aprouet gant Diazezadur Wiikimedia na staget outañ. + Meziant frank a wirioù embannet dindan <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">an Aotre-implijout Apache v2</a>. Merkoù kenwerzhel eus Diazezadur Wikimedia eo Wikimedia Commons hag e logoioù. Gallout a reont bezañ implijet gant aotre an Diazezadur. N\'omp nag aprouet gant Diazezadur Wiikimedia na stag outañ. <a href=\"https://github.com/commons-app/apps-android-commons\">Mammenn</a> ha <a href=\"https://commons-app.github.io/\">lec\'hienn</a> war GitHub. Krouiñ ur <a href=\"https://github.com/commons-app/apps-android-commons/issues\">gemennadenn GitHub nevez</a> evit kelaouiñ a-zivout un draen bennak pe bet kinnigoù. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Reolennoù prevezded</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">TRUGAREKADENNOÙ</a> @@ -170,4 +170,6 @@ Pouezit war ar c\'hemenn-mañ (pe distroit en a-raok) evit mont dreist ar bazenn Amañ e lakaer titl ar media. Gallout a ra bezañ hir-mat ha mont dre meur a linenn. Spi hon eus e vo bravik an disoc\'h koulskoude. Deuit da vezañ un amprouer beta En em enskrivañ en hor c\'hanol beta war Google Play ha kaout ur rakmoned d\'an arc\'hwelioù nevez d\'an drein difaziet + Ober gant Wikidata + (Diwallit mat : ma tiweredekait an dra-mañ e c\'hallfe kreskiñ kalz ar beveziñ roadennoù gant ho hezoug) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 004de0cbd..36aeed2a9 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -170,4 +170,6 @@ Η περιγραφή του πολυμέσου μπαίνει εδώ. Αυτή μπορεί να είναι σχετικά μεγάλη, και θα χρειαστεί να αναδιπλωθεί σε πολλές γραμμές. Ελπίζουμε ωστόσο ότι θα φαίνεται όμορφα. Γίνετε Δοκιμαστής Beta Συμμετέχετε στο κανάλι beta μας στο Google Play και αποκτήστε πρώιμη πρόσβαση σε νέες λειτουργίες και διορθώσεις σφαλμάτων + χρήση wikidata + (Προσοχή: η απενεργοποίηση αυτή μπορεί να προκαλέσει μεγάλη κατανάλωση κινητὠν δεδομένων) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 72526ea88..bcac18462 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -175,4 +175,6 @@ imágenes de carteles, portadas de libro, etc. Aquí va la descripción del multimedia. Potencialmente, puede ser bastante largo, y deberá agruparse en múltiples líneas. De todas formas, esperamos que se ve bien. Prueba la versión beta Opta por nuestro canal beta en Google Play y obtén acceso a funcionalidades nuevas y correcciones de errores + Usa Wikidata + (Advertencia: desactivar esto puede ocasionar un gran consumo de datos del móvil) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index cf478392f..f2df4bef5 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -170,4 +170,6 @@ Appuyez sur ce message (ou retournez en arrière) pour sauter cette étape.La description du média vient ici. Cela peut être potentiellement assez long, et devra être réparti sur plusieurs lignes. Nous espérons que cela restera joli néanmoins. Devenir un bêta-testeur S’inscrire à notre canal bêta sur Google Play et obtenir un accès anticipé aux nouvelles fonctionnalités et corrections de bogue + Utiliser Wikidata + (Attention : désactiver cela pourrait provoquer une consommation importante de données par mobile) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index bdeb28905..d8d0164ec 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -77,6 +77,7 @@ 오픈 소스 소프트웨어는 <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">아파치 라이선스 v2</a>에 따라 공개됩니다 소스 코드는 <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>에 있으며, 버그는<a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">버그질라</a>에 보고하세요. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy/ko\">개인정보 정책</a> + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">제작진</a> 정보 (이메일로) 피드백 보내기 설치된 이메일 클라이언트가 없습니다 diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index fcd701298..c68ffecd9 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -170,4 +170,5 @@ Leet w.e.g. <a href=\"https://github.com/commons-app/apps-android-commons/iss Beta-Tester ginn Schreift Iech op GooglePlay a fir eise Beta-Kanal a kritt fréi Zougang zu neie Funktiounen a Verbesserunge vu Feeler Wikidata benotzen + (Opgepasst: D\'Ausschalte kann zu engem héije mobilen Date-Konsum féieren) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f24a7401e..8951c80f7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -167,4 +167,5 @@ Klik op dit bericht, of ga terug, om deze stap over te slaan. Titel Titel van het bestand Beschrijving + Wikidata gebruiken diff --git a/app/src/main/res/values-pms/strings.xml b/app/src/main/res/values-pms/strings.xml index 18bae9598..5657c3c6a 100644 --- a/app/src/main/res/values-pms/strings.xml +++ b/app/src/main/res/values-pms/strings.xml @@ -170,4 +170,5 @@ Ch\'a sgnaca an s\'ën mëssage (o ch\'a sgnaca ël boton andaré) për sauté \ La descrission dël mojen a va ambelessì. Sòn a podrìa esse potensialman longh, e a dovrà esse spantià su vàire linie. I speroma comsëssìa ch\'a ven-a grassios. Dventé në sperimentador Beta Anscriv-se a nòstr canal beta su Google Play a oten-e n\'acess antissipà a le neuve fonsionalità e coression ëd givo + Dovré Wikidàit diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9d85b7f60..b33e90e7b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -74,7 +74,7 @@ Aperte nesta mensagem (ou aperte para voltar) para pular este passo Configurações Criar conta Sobre - Software livre distribuído sob a <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons e seu logotipo são marcas registradas da Wikimedia Foundation e são usadas com a permissão da Wikimedia Foundation. Não somos endossados nem afiliados à Wikimedia Foundation. + Software livre distribuído sob a <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons e seu logotipo são marcas registradas da Wikimedia Foundation e são usadas com a permissão da Wikimedia Foundation. Não somos endossados nem afiliados à Wikimedia Foundation. <a href=\"https://github.com/commons-app/apps-android-commons\">Fonte</a> e <a href=\"https://commons-app.github.io/\">site</a> em GitHub. Crie um novo <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub issue</a> para relatórios de bugs e sugestões. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Política de privacidade</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CRÉDITOS</a> @@ -170,4 +170,6 @@ Aperte nesta mensagem (ou aperte para voltar) para pular este passo Descrição da mídia aqui. Isso pode ser potencialmente longo e precisará envolver múltiplas linhas. Esperamos que seja agradável. Seja um Testador Beta Entre no nosso canal beta no Google Play e receba acesso prévio a novos recursos e correções de erros + Usa Wikidata + (Aviso: desabilitar isso pode causar grande consumo de dados móveis) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b17dfa88f..c504cdc0f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -85,8 +85,8 @@ Отправить отзыв (по эл. почте) Почтовый клиент не установлен Недавно использованные категории - Ожидание первой синхронизации... - Вы еще не загрузили ни одной фотографии. + Ожидание первой синхронизации… + Вы ещё не загрузили ни одной фотографии. Повторить Отмена Это изображение будет лицензировано под %1$s @@ -100,7 +100,7 @@ Attribution-ShareAlike 4.0 Attribution 4.0 Attribution-ShareAlike 3.0 - CCu00A0Attributionu00A03.0 + Attribution 3.0 CC0 CC BY-SA 3.0 CC BY-SA 3.0 (Австрия) @@ -137,20 +137,20 @@ Ваши изображения помогают образованию людей во всём мире! Пожалуйста, загрузите фотографии, которые были сняты или созданы исключительно вами: — Природные объекты (цветы, животные, горы) -— Полезные предметы (велосипеды, вокзалах) +— Полезные предметы (велосипеды, вокзалы) — Известные люди (ваш мэр, спортсмены-олимпийцы, которых вы встретили) Пожалуйста, НЕ загружайте: — Селфи или фотографии ваших друзей — Фотографии, которые вы скачали из Интернета — Скриншоты несвободных приложений Пример загрузки: - - Название: Сиднейский оперный театр -- Описание: Сиднейский оперный театр, вид через залив -- Категории: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views + — Название: Сиднейский оперный театр +— Описание: Сиднейский оперный театр, вид через залив +— Категории: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views Загрузите свои изображения. Помогите Википедии оживить статьи! - Изображения в Википедии доступны на Викискладе. + Изображения в Википедии хранятся на Викискладе. Ваши изображения помогают образованию людей во всём мире. - Избегайте материалов, найденных в интернете и защищенных авторским правом, а также изображений плакатов, книжных обложек и т.п. + Избегайте материалов, найденных в Интернете и защищённых авторским правом, а также изображений плакатов, книжных обложек и т.п. Вам это понятно? Да! Категории @@ -173,4 +173,6 @@ Здесь располагается описание носителя информации. Оно потенциально может быть весьма длинным и даже располагаться в несколько строк. Однако мы надеемся, что это выглядит симпатично Стать бета-тестером Подпишитесь на наш канал бета-версии на Google Play и получите ранний доступ к новым функциям и исправлениям ошибок + Использовать Викиданные + (Предупреждение: отключение может привести к большому потреблению мобильных данных) From 46b54e7312cf8f2fe51da7ca102af0ce73bbf277 Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Thu, 20 Apr 2017 17:48:04 +0900 Subject: [PATCH 007/168] Remove redundant Espresso/Travis settings --- .travis.yml | 3 --- app/build.gradle | 3 +-- .../java/fr/free/nrw/commons/SettingsActivityTest.java | 9 ++------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8754b0e89..267625fdd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,6 @@ android: - build-tools-25.0.1 - extra-google-m2repository - extra-android-m2repository - - extra-google-google_play_services - - extra-android-support - ${ANDROID_TARGET} - android-25 - sys-img-${ANDROID_ABI}-${ANDROID_TARGET} @@ -23,7 +21,6 @@ before_script: - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI - emulator -avd test -no-audio -no-window & - android-wait-for-emulator - - adb shell input keyevent 82 & script: - ./gradlew test connectedAndroidTest -stacktrace after_failure: diff --git a/app/build.gradle b/app/build.gradle index 925ee8855..c77aea346 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,7 +13,6 @@ dependencies { compile "com.android.support:support-v4:${project.supportLibVersion}" compile "com.android.support:appcompat-v7:${project.supportLibVersion}" compile "com.android.support:design:${project.supportLibVersion}" - compile "com.android.support:support-annotations:${project.supportLibVersion}" compile 'com.google.code.gson:gson:2.7' compile "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION" annotationProcessor "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION" @@ -51,4 +50,4 @@ android { disable 'ExtraTranslation' abortOnError false } -} \ No newline at end of file +} diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java index dc7ead0ab..f2047506b 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -86,8 +86,7 @@ public class SettingsActivityTest { // click "CC BY-4.0" Espresso.onView( - // FIXME: just R.string.license_name_cc_by_four should be fine but fails on Travis - textAnyOf(R.string.license_name_cc_by_four, R.string.license_name_cc_by_4_0) + ViewMatchers.withText(R.string.license_name_cc_by_4_0) ).perform(ViewActions.click()); // click "License" (the first item) @@ -99,14 +98,10 @@ public class SettingsActivityTest { // test the value remains "CC BY-4.0" Espresso.onView(ViewMatchers.isChecked()) .check(ViewAssertions.matches( - textAnyOf(R.string.license_name_cc_by_four, R.string.license_name_cc_by_4_0) + ViewMatchers.withText(R.string.license_name_cc_by_4_0) )); } - private Matcher textAnyOf(int id1, int id2) { - return anyOf(ViewMatchers.withText(id1), ViewMatchers.withText(id2)); - } - private static Matcher findPreferenceList() { return allOf( ViewMatchers.isDescendantOfA(ViewMatchers.withId(android.R.id.content)), From 559381d7f7f6db2a7c8da0856fc59af56c73d437 Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Fri, 21 Apr 2017 21:15:51 +0900 Subject: [PATCH 008/168] Fix initial emptiness of Nearby list + refactoring --- .../nrw/commons/nearby/NearbyAdapter.java | 18 ++---- .../commons/nearby/NearbyListFragment.java | 62 +++++++------------ .../free/nrw/commons/nearby/TaskListener.java | 10 --- app/src/main/res/layout/fragment_nearby.xml | 2 +- 4 files changed, 27 insertions(+), 65 deletions(-) delete mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/TaskListener.java 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 63161f87b..96a42e008 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 @@ -8,26 +8,15 @@ import android.widget.ArrayAdapter; import fr.free.nrw.commons.R; -import java.util.List; - import timber.log.Timber; public class NearbyAdapter extends ArrayAdapter { - private List placesList; - private Context context; - - public List getPlacesList() { - return placesList; - } /** Accepts activity context and list of places. * @param context activity context - * @param places list of places */ - public NearbyAdapter(Context context, List places) { - super(context, R.layout.item_place, places); - this.context = context; - placesList = places; + public NearbyAdapter(Context context) { + super(context, R.layout.item_place); } @Override @@ -43,13 +32,14 @@ public class NearbyAdapter extends ArrayAdapter { } NearbyViewHolder viewHolder = new NearbyViewHolder(convertView); - viewHolder.bindModel(context, place); + viewHolder.bindModel(getContext(), place); // Return the completed view to render on screen return convertView; } @Override public long getItemId(int position) { + // TODO: use Wikidata Q-ID instead? return position; } } 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 537687567..6dae3bc90 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 @@ -21,7 +21,6 @@ import butterknife.ButterKnife; import butterknife.OnItemClick; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; -import timber.log.Timber; import java.util.Collections; import java.util.Comparator; @@ -30,15 +29,17 @@ import java.util.List; import java.util.Locale; import java.util.Map; -public class NearbyListFragment extends ListFragment implements TaskListener { +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; + @BindView(R.id.listView) ListView listview; @BindView(R.id.progressBar) ProgressBar progressBar; - private boolean isTaskRunning = false; + private NearbyAdapter adapter; public NearbyListFragment() { } @@ -56,15 +57,19 @@ public class NearbyListFragment extends ListFragment implements TaskListener { Timber.d("NearbyListFragment created"); View view = inflater.inflate(R.layout.fragment_nearby, container, false); ButterKnife.bind(this, view); + adapter = new NearbyAdapter(getActivity()); + listview.setAdapter(adapter); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { - //Check that this is the first time view is created, to avoid double list when screen orientation changed + // Check that this is the first time view is created, + // to avoid double list when screen orientation changed if (savedInstanceState == null) { - nearbyAsyncTask = new NearbyAsyncTask(this); + adapter.clear(); + nearbyAsyncTask = new NearbyAsyncTask(); nearbyAsyncTask.execute(); progressBar.setVisibility(View.VISIBLE); Timber.d("Saved instance state is null, populating ListView"); @@ -74,29 +79,13 @@ public class NearbyListFragment extends ListFragment implements TaskListener { // If we are returning here from a screen orientation and the AsyncTask is still working, // re-create and display the progress dialog. - if (isTaskRunning) { + if (isTaskRunning()) { progressBar.setVisibility(View.VISIBLE); } } - @Override - public void onSaveInstanceState(Bundle outInstanceState) { - // See http://stackoverflow.com/questions/8942135/listview-added-dublicate-item-in-list-when-screen-orientation-changes - outInstanceState.putInt("value", 1); - } - - @Override - public void onTaskStarted() { - isTaskRunning = true; - progressBar.setVisibility(View.VISIBLE); - } - - @Override - public void onTaskFinished(List result) { - if (progressBar != null) { - progressBar.setVisibility(View.GONE); - } - isTaskRunning = false; + private boolean isTaskRunning() { + return nearbyAsyncTask != null && nearbyAsyncTask.getStatus() != AsyncTask.Status.FINISHED; } @Override @@ -114,23 +103,17 @@ public class NearbyListFragment extends ListFragment implements TaskListener { super.onDestroy(); // See http://stackoverflow.com/questions/18264408/incomplete-asynctask-crashes-my-app - if (nearbyAsyncTask != null && nearbyAsyncTask.getStatus() != AsyncTask.Status.FINISHED) { + if (isTaskRunning()) { nearbyAsyncTask.cancel(true); } } private class NearbyAsyncTask extends AsyncTask> { - private final TaskListener listener; - - public NearbyAsyncTask(TaskListener listener) { - this.listener = listener; - } - @Override protected void onPreExecute() { super.onPreExecute(); - listener.onTaskStarted(); + progressBar.setVisibility(View.VISIBLE); } @Override @@ -154,17 +137,16 @@ public class NearbyListFragment extends ListFragment implements TaskListener { return; } - progressBar.setVisibility(View.GONE); - NearbyAdapter adapter = new NearbyAdapter(getActivity(), places); - - listview.setAdapter(adapter); - - listener.onTaskFinished(places); + if (progressBar != null) { + progressBar.setVisibility(View.GONE); + } + adapter.clear(); + adapter.addAll(places); adapter.notifyDataSetChanged(); } } - @OnItemClick(R.id.listview) + @OnItemClick(R.id.listView) void onItemClicked(int position) { Place place = (Place) listview.getItemAtPosition(position); LatLng placeLatLng = place.location; diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/TaskListener.java b/app/src/main/java/fr/free/nrw/commons/nearby/TaskListener.java deleted file mode 100644 index 947575d31..000000000 --- a/app/src/main/java/fr/free/nrw/commons/nearby/TaskListener.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.free.nrw.commons.nearby; - -import java.util.List; - -// As per https://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/ -public interface TaskListener { - void onTaskStarted(); - - void onTaskFinished(List result); -} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_nearby.xml b/app/src/main/res/layout/fragment_nearby.xml index 2f8d6fc9b..aaa9586f2 100644 --- a/app/src/main/res/layout/fragment_nearby.xml +++ b/app/src/main/res/layout/fragment_nearby.xml @@ -12,7 +12,7 @@ /> From 138b3541fea898da95366e39d21380580844f81c Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 24 Apr 2017 19:44:18 +0200 Subject: [PATCH 009/168] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ja/strings.xml | 49 +++++++++++++++++++++---- app/src/main/res/values-pms/error.xml | 7 ++++ app/src/main/res/values-pms/strings.xml | 1 + app/src/main/res/values-sr/strings.xml | 3 ++ app/src/main/res/values-su/strings.xml | 2 +- 5 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/values-pms/error.xml diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index abe3c3d12..3887dfeab 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -43,6 +43,7 @@ 申し訳ありませんが、この利用者はコモンズでブロックされています。 ログイン失敗 アップロード + このセットに名前をつけてください 変更 アップロード 検索するカテゴリ @@ -69,13 +70,15 @@ 設定 利用者登録 このアプリについて - <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache ライセンス v2</a> のもとで公開されているオープン ソース ソフトウェア + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache ライセンス v2</a> のもとで公開されているオープン ソース ソフトウェアです。Wikimedia Commons ならびにそのロゴはウィキメディア財団の商標であり、ウィキメディア財団の許可により使用しています。このサイトはウィキメディア財団の公認3でも提携先でもありません。 ソースは <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a> にあります。バグとアイディアは <a href=\"https://github.com/commons-app/apps-android-commons/issues\">Github</a> へ。 <a href=\"https://wikimediafoundation.org/wiki/プライバシー・ポリシー\">プライバシー・ポリシー</a> + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CREDITS</a> このアプリについて フィードバックをメールで送信 メールアプリケーションが見つかりません 最近使用したカテゴリ + 同期を待機中... まだ写真をアップロードしていません。 再試行 キャンセル @@ -83,9 +86,14 @@ ダウンロード ライセンス 前回のタイトルと記述を使用 + 現在の位置を自動的に取得 + 画像にジオタグが付いていない場合、現在の位置を取得してカテゴリを提案 夜モード - CCu00A0表示-継承u00A03.0 - CCu00A0表示u00A03.0 + 暗いテーマを使う + 表示-継承 4.0 + 表示 4.0 + 表示-継承 3.0 + 表示 3.0 CC0 CC 表示-継承 3.0 CC 表示-継承 3.0 (オーストリア) @@ -99,6 +107,8 @@ CC 表示-継承 3.0 (ポーランド) CC 表示-継承 3.0 (ルーマニア) CC 表示 3.0 + CC 表示-継承 4.0 + CC 表示 4.0 CC Zero own-pd CC 表示-継承 2.5 @@ -106,23 +116,44 @@ CC 表示-継承 2.0 CC 表示-継承 2.0 CC 表示 2.0 + 自由芸術ライセンス + パブリックドメイン (著者の死後100年) パブリックドメイン (著作権期限切れ) - パブリック・ドメイン (アメリカ合衆国) + パブリックドメイン (絵画) + パブリックドメイン (アメリカ合衆国) パブリックドメイン (米国政府作成物) - パブリック・ドメイン (NASA) + パブリックドメイン (NASA) パブリックドメイン (著作権の対象外) 帰属 GNUフリー文書利用許諾契約書 (GNU Free Documentation License) + ウィキメディア・コモンズにはウィキペディアで使用する画像のほぼすべてが保管されています。 + あなたの画像は世界中の人々が学習する助けになります! + アップロードする画像はあなたご本人が撮影したものかあなたが単独で制作したものに限定します。 + - 自然物 (動植物、山) +- 道具 (自転車、駅) +- 著名人 (市区村長・都道府県知事、自分が会ったオリンピック選手) + アップロードが《禁止》のもの: + - あなたの友人の自撮り写真や画像 +- インターネットからダウンロードした画像 +- 著作権のあるアプリのスクリーンショット + アップロードの例: + - 題名: シドニー・オペラハウス +- 説明: 湾の向こうから見たシドニー・オペラハウス +- カテゴリ: シドニー・オペラハウス、シドニー・オペラハウスの西側、遠くから見たシドニー・オペラハウス 画像を投稿してください。ウィキペディアの記事に彩りを! + ウィキペディアの画像はウィキメディア・コモンズに保管されています。 + あなたの画像は世界中の人々が学習する助けになります インターネットで見つけた画像、ポスター、書籍の表紙など著作権のある素材は避けてください。 ご理解いただけましたか? はい カテゴリ 読み込み中... - 選択なし - 説明なし + ファイルを選択していません + 説明はありません。 不明なライセンス 更新 + 必要な権限:外部ストレージを読み込みます。これがなければアプリは機能しません。 + オプションの権限:カテゴリ候補の現在の位置を取得する 承認 周りの場所 警告 @@ -132,5 +163,9 @@ タイトル メディアのタイトル 記述 + ここにメディアの説明が入ります。かなり長文になる場合には数行にわたることがあります。それでも見栄えがよいと願っています。 ベータ版を使ってみましょう! + Google Playのベータ版チャンネルにオプトインして、新機能やバグ修正プログラムに早期にアクセス + ウィキデータを使用してください + (警告:これを無効にすると、モバイルデータを大量に消費する可能性があります) diff --git a/app/src/main/res/values-pms/error.xml b/app/src/main/res/values-pms/error.xml new file mode 100644 index 000000000..68e222238 --- /dev/null +++ b/app/src/main/res/values-pms/error.xml @@ -0,0 +1,7 @@ + + + Commons a l\'é piantasse + Contacc! Cheicòs a l\'é andàit mal! + Ch\'an disa lòn ch\'a l\'era an camin a fé, peui ch\'a lo partagia për pòsta eletrònica con noi. Sòn an giutrà a rangelo! + Mersì! + diff --git a/app/src/main/res/values-pms/strings.xml b/app/src/main/res/values-pms/strings.xml index 5657c3c6a..e51d95ae6 100644 --- a/app/src/main/res/values-pms/strings.xml +++ b/app/src/main/res/values-pms/strings.xml @@ -171,4 +171,5 @@ Ch\'a sgnaca an s\'ën mëssage (o ch\'a sgnaca ël boton andaré) për sauté \ Dventé në sperimentador Beta Anscriv-se a nòstr canal beta su Google Play a oten-e n\'acess antissipà a le neuve fonsionalità e coression ëd givo Dovré Wikidàit + (Atension: disabilité sòn a podrìa provoché un gròss consum ëd dàit con ël sacociàbil) diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index a7a1d15c1..d7388b53a 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -76,6 +76,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://wikimediafoundation.org/wiki/Privacy_policy\">Политика приватности</a> + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">ЗАСЛУГЕ</a> О апликацији Пошаљите повратне информације (путем е-поште) Није инсталиран имејл клијент @@ -163,4 +164,6 @@ Наслов медија Опис Постани Бета Тестер + Користи Википодатке + (Упозорење: онемогућавањем овога може се изазвати велика потрошња мобилних података) diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 7e21eda27..d873077ac 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -132,7 +132,7 @@ Toél ieu talatah (atawa toél deui) pikeun ngaliwatkeun ieu bagęan. Lisénsi Dokuméntasi Bébas GNU Wikimedia Commons ngimahan ampir sakabéh gambar anu dipaké di Wikipédia. Gambar-gambar anjeun ngabantu ngatik jalma di sakuliah dunya! - Mangga unggahkeun gambar-gambar jieunan anjeun: + Mangga unjalkeun gambar-gambar jieunan anjeun: - Obyék alam (kekembangan, sasatoan, gunung, jsb.) - Obyék mangpaat (sapédah, stasiun karéta, jsb.) - Inohong (bupati, atlit nasional, jsb.) From f9e5b88c6d7b3d0fcaa72885c57b94d71f078dea Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Tue, 25 Apr 2017 09:30:47 +0900 Subject: [PATCH 010/168] 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 6d942df387e960b61c8bc9b4b5ca3f80ce70d458 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 27 Apr 2017 08:08:51 +0200 Subject: [PATCH 011/168] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ast/strings.xml | 4 +- app/src/main/res/values-gl/strings.xml | 4 +- app/src/main/res/values-jv/error.xml | 6 ++ app/src/main/res/values-jv/strings.xml | 122 ++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/values-jv/error.xml create mode 100644 app/src/main/res/values-jv/strings.xml diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index b26cb1249..6c2666c59 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -74,7 +74,7 @@ Toque nesti mensaxe (o calque atrás) pa saltar esti pasu. Configuración Date d\'alta Tocante a - Software de códigu abiertu lliberáu baxo la <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Llicencia Apache v2</a>. Wikimedia Commons ya\'l so logotipu son marques rexistraes de la Fundación Wikimedia y utilícense col so permisu. Nun tamos acreditaos pola Fundación Wikimedia nin tamos afiliaos con ella. + Software de códigu abiertu lliberáu baxo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Llicencia Apache v2</a>. Wikimedia Commons ya\'l so logotipu son marques rexistraes de la Fundación Wikimedia y utilícense col so permisu. Nun tamos acreditaos pola Fundación Wikimedia nin tamos afiliaos con ella. El <a href=\"https://github.com/commons-app/apps-android-commons\">códigu fonte</a> ya\'l <a href=\"https://commons-app.github.io/\">sitiu web</a> tán en GitHub. Crea una nueva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia en GitHub</a> pa informar de problemes y suxerencies. Wikimedia:Commons-android-strings-about privacy policy/ast <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CRÉDITOS</a> @@ -171,4 +171,6 @@ Wikimedia Commons. Equí va la descripción del mediu. Posiblemente pué ser llargo enforma, y necesitará espardese per delles llinies. Sicasí, esperamos que se vea guapo. Faete probador beta Escueye\'l nuesu canal beta en Google Play y ten accesu tempranu a carauterístiques nueves ya igües de fallos + Usar Wikidata + (Avisu: desactivar esto pue causar un gran consumu de datos nel móvil) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 5ecc927c0..9e1cdd5c4 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -74,7 +74,7 @@ Prema nesta mensaxe (ou no botón \"Atrás\") para saltar este paso. Configuracións Rexistrarse Acerca de - Software de código aberto liberado baixo a <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">licenza Apache v2</a>. Wikimedia Commons e o seu logo son marcas rexistradas da Fundación Wikimedia e úsanse coa súa autorización. Non fomos acreditados pola Fundación Wikimedia nin estamos afiliados con ela. + Software de código aberto liberado baixo a <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licenza Apache v2</a>. Wikimedia Commons e o seu logo son marcas rexistradas da Fundación Wikimedia e úsanse coa súa autorización. Non fomos acreditados pola Fundación Wikimedia nin estamos afiliados con ela. <a href=\"https://github.com/commons-app/apps-android-commons\">Código fonte</a> e <a href=\"https://commons-app.github.io/\">sitio web</a> en GitHub. Crear unha nova <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia</a> para informar de problemas e suxestións. <a href=\"https://wikimediafoundation.org/wiki/Política_de_protección_de_datos_(gl)\">Política de protección de datos</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CRÉDITOS</a> @@ -170,4 +170,6 @@ Prema nesta mensaxe (ou no botón \"Atrás\") para saltar este paso. Aquí vai a descrición do ficheiro multimedia. Potencialmente, pode ser bastante longo, e necesitará agruparse en múltiples liñas. De tódolos xeitos esperamos que se vexa ben. Converterse en beta-tester Siga a nosa canle beta en Google Play e obteña acceso a novas funcionalidades e correccións de erros + Usar Wikidata + (Aviso: desactivar isto pode ocasionar un gran consumo de datos do móbil) diff --git a/app/src/main/res/values-jv/error.xml b/app/src/main/res/values-jv/error.xml new file mode 100644 index 000000000..bbe32d26a --- /dev/null +++ b/app/src/main/res/values-jv/error.xml @@ -0,0 +1,6 @@ + + + Commons lagi kaco + Wadhuh. Ana sing luput! + Matur nuwun! + diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml new file mode 100644 index 000000000..74b4fcbdf --- /dev/null +++ b/app/src/main/res/values-jv/strings.xml @@ -0,0 +1,122 @@ + + + Commons + Setèlan + Jeneng panganggo + Tembung wadi + Mlebu log + Dhaftar + Lagi mlebu log + Entènana sadhela... + Kasil mlebu log! + Wurung mlebu log! + Barkas ora katemu. Jajalana barkas liyané. + Wurung otèntifikasi! + Wiwit ngunggah! + %1$s kaunggah! + Dudulana kanggo ndeleng sing kokunggah + Wiwit nguggah %1$s + Ngunggah %1$s + Rampung ngunggah %1$s + Wurung ngunggah %1$s + Tunyuk saperlu ndeleng + + ngunggah barkas 1 + ngunggah barkas %d + + Unggahanku + Antrian + Wurung + %1$d%% rampung + Ngunggah + Saka Gladri + Motrèt + Cedhak kéné + Unggahanku + Dum + Delok ing Pangluru + Sesirah + Wedharan + Ora bisa mlebu log - jaringané gagal + Ora bisa mlebu log - tiliki jeneng panganggoné panjenengan + Ora bisa mlebu log - tiliki tembung wadiné panjenengan + Kakèhan upaya sing gagal. Jajalana manèh mengko. + Ngapunten, panganggo iki wis diblokir ing Commons + Wurung mlebu log + Unggah + Jenengi sèt iki + Owahan + Unggah + Golèk kategori + Simpen + Anyarana + + Durung ana unggahané + 1 unggahan + %d unggahan + + + Miwiti 1 unggahan + Miwiti %d unggahan + + + 1 unggahan + %d unggahan + + Ora ana kategori sing cocog karo %1$s + Kategori + Lapuran pangguna + Kirim lapurané pangguna nyang Wikimedia supaya kita kabantu ngapikaké aplikasiné + Setèlan + Ndhaftar + Ngenani + Ngenani + Kirim Pamrayoga (lumantar Layang-Èl) + Ora ana klièn layang-èl sing dipasang + Kategori sing mentas dianggo + Nunggu sinkronisasi pisanan... + Panjenengan durung tau ngunggah foto. + Jajal manèh + Wurung + Gambar iki bakal dilisènsèkaké nganggo %1$s + Undhuh + Lisènsi + Anggo sesirah/wedharan sadurungé + Otomatis masang lokasi saiki + Modhe wengi + Anggo pakulitan peteng + Atribusi-DumSaèmper 4.0 + Atribusi 4.0 + Atribusi-DumSaèmper 3.0 + Atribusi 3.0 + CC0 + CC BY-SA 3.0 + CC BY-SA 3.0 (Ostenrik) + CC BY-SA 3.0 (Dhitslan) + CC BY-SA 3.0 (Éstoniah) + CC BY-SA 3.0 (Spanyol) + CC BY-SA 3.0 (Kroasiah) + CC BY-SA 3.0 (Luksemberg) + CC BY-SA 3.0 (Néderlan) + CC BY-SA 3.0 (Nurwégen) + CC BY-SA 3.0 (Polen) + CC BY-SA 3.0 (Ruminiah) + CC BY-SA 3.0 + CC BY-SA 3.0 + CC BY 4.0 + CC Nul + own-pd + CC BY-SA 2.5 + CC BY 2.5 + CC BY-SA 2.0 + CC BY-SA 2.0 + CC BY 2.0 + Lisènsi Seni Bébas + Iya + Ora + Sesirah + Sesirahé médhia + Wedharan + Dadi Pangetès Béta + Anggo Wikidata + From 779c1380c23160192dbaa689cb870a944e19c5d6 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Tue, 2 May 2017 07:49:56 +0200 Subject: [PATCH 012/168] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-eu/strings.xml | 17 ++++++++++++++++- app/src/main/res/values-sd/strings.xml | 7 +++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 486056977..7c595fdb2 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -45,6 +45,12 @@ Igo Kategoriak bilatu Gorde + Eguneratu + + Oraindik igoerarik ez + igoera 1 + %d igoera + Ez da kategoriak aukritu %1$s izenarekin Gehitu kategoriak zure argazkiak Wikimedia Commonsen aurkitzen errazagoak izan daitezen. Kategoriak @@ -53,7 +59,7 @@ Hobespenak Eman izena Honi buruz - Open Source softwarea <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache v2 Lizentziaren</a> pean egina. Wikimedia Commons eta bere logoa Wikimedia Fundazioaren marka erregistratuak dira eta Wikimedia Fundazioaren baimenarekin erabiltzen dira. Ez gaude Wikimedia Fundaziora afiliatuta. + Open Source softwarea <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache v2 Lizentziaren</a> pean egina. Wikimedia Commons eta bere logoa Wikimedia Fundazioaren marka erregistratuak dira eta Wikimedia Fundazioaren baimenarekin erabiltzen dira. Ez gaude Wikimedia Fundaziora afiliatuta. GitHub-eko <a href=\"https://github.com/commons-app/apps-android-commons\">Iturria</a> eta <a href=\"https://commons-app.github.io/\">webgunea</a>. <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-eko gai</a> berria sortu erroreen berri emateko. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Pribatutasun politika</a> Honi buruz @@ -69,6 +75,8 @@ Lizentzia Aurreko izenburu/deskribapena erabili Oraingo kokapena automatikoki lortu + Aitortu-PartekatuBerdin 4.0 + Aitortu 4.0 Aitortu-PartekatuBerdin 3.0 Esleipena 3.0 CC0 @@ -116,6 +124,13 @@ Ados Gertuko lekuak Oharra + Fifxategia dagoeneko Commonsen existitzen da. Ziur zaude jarraitu nahi duzula? Bai Ez + Izenburua + Fitxategiaren izenburua + Deskribapena + Beta testatzaile bihurtu + Wikidata erabili + (Erne:hau kentzeak mugikorrak datu asko kontsumitzea ekar dezake) diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml index 5b7cd9630..0eac0c188 100644 --- a/app/src/main/res/values-sd/strings.xml +++ b/app/src/main/res/values-sd/strings.xml @@ -89,6 +89,9 @@ گذريل عنوان/تشريح استعمال ڪريو خوبخود ھاڻوڪي مڪانيت وٺو ھاڻوڪي مڪانيت لھو زمرن جون تجويزون پيش ڪرڻ لاءِ جيڪڏھن عڪس تي جيوٽيگ ناھي لڳل + رات جو ڏيک + گھرو نظارو استعمال ڪريو + انتساب-ھجھڙي ڀاڱيداري 4.0 وصف 4.0 ڪڪu00A0انتساب-ھڪجھڙي_ڀاڱيداريu00A03.0 ڪڪu00A0انتسابu00A03.0 @@ -154,8 +157,12 @@ u2022 زمرا: سڊني اوپيرا گھر، سڊني اوپيرا گھر او ٺيڪ ويجھڙائيءَ ۾ جڳھون چتاءُ + فائل اڳ ئي العام ۾ موجود آھي. ڇا توھان کي پڪ آھي تہ توھان اڳتي وڌڻ ٿا چاھيو؟ ها نہ عنوان + ابلاغ جو عنوان تشريح + آزمائشي آزمائيندڙ ٿيو + وڪيڊيٽا استعماڪ ڪريو From fe470d64a9db37d84b3cbcd93c01e54023439c5a Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 4 May 2017 07:39:53 +0200 Subject: [PATCH 013/168] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-ka/strings.xml | 13 ++++++++++++- app/src/main/res/values-vi/strings.xml | 16 +++++++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index bcac18462..af75d3462 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -175,6 +175,6 @@ imágenes de carteles, portadas de libro, etc. Aquí va la descripción del multimedia. Potencialmente, puede ser bastante largo, y deberá agruparse en múltiples líneas. De todas formas, esperamos que se ve bien. Prueba la versión beta Opta por nuestro canal beta en Google Play y obtén acceso a funcionalidades nuevas y correcciones de errores - Usa Wikidata + Utilizar Wikidata (Advertencia: desactivar esto puede ocasionar un gran consumo de datos del móvil) diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index c2395f3d4..208f5fcfe 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -5,10 +5,21 @@ მომხმარებლის სახელი პაროლი შესვლა + რეგისტრაცია სისტემაში შესვლა გთხოვთ მოიცადოთ... სისტემაში შესვლა წარმატებით განხორციელდა! სისტემაში შესვლა ვერ განხორციელდა! + ფაილი არ მოიძებნა. გთხოვთ, სცადოთ სხვა ფაილი. + ავთენტიფიკაცია ვერ მოხერხდა! + ატვირთვა დაიწყო! + %1$ ატვირთულია! + დააჭირეთ თქვენი ატვირთვის სანახავად + დაიწყო %1$ ატვირთვა + %1$ ატვირთვა + ატვირთვის დასრულება %1$ + %1$ ატვირთვა ვერ მოხერხდა + დააჭირეთ სანახავად ჩემი ატვირთვები %1$d%% დასრულდა გალერეიდან @@ -61,6 +72,6 @@ საზოგადოებრივი საკუთრება (ნასა) საზოგადოებრივი საკუთრება (არ ექვემდებარება საავტორო უფლებების დაცვას) დიახ! - კატეგორია + კატეგორიები იტვირთება... diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e0ae4679b..f00d3820f 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -46,6 +46,7 @@ Tải lên Tìm thể loại Lưu + Làm mới Chưa tải lên tập tin %d tập tin tải lên @@ -63,9 +64,10 @@ Chạm vào thông điệp này (hoặc bấm Quay lại) để bỏ qua bước Cài đặt Mở tài khoản Giới thiệu - Phần mềm mã nguồn mở được phát hành theo <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Giấy phép Apache v2</a>. Wikimedia Commons và biểu trưng của nó là nhãn hiệu của Quỹ Wikimedia và được sử dụng do Quỹ Wikimedia cho phép. Chúng tôi không được Quỹ Wikimedia ủng hộ hoặc nhận làm chi nhánh. + Phần mềm mã nguồn mở được phát hành theo <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Giấy phép Apache v2</a>. Wikimedia Commons và biểu trưng của nó là nhãn hiệu của Quỹ Wikimedia và được sử dụng do Quỹ Wikimedia cho phép. Chúng tôi không được Quỹ Wikimedia ủng hộ hoặc nhận làm chi nhánh. <a href=\"https://github.com/commons-app/apps-android-commons\">Mã nguồn</a> và <a href=\"https://commons-app.github.io/\">trang chủ</a> tại GitHub. <a href=\"https://github.com/commons-app/apps-android-commons/issues\">Tạo vấn đề GitHub mới</a> để báo cáo lỗi hoặc gợi ý thay đổi. + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CÔNG TRẠNG</a> Giới thiệu Gửi Phản hồi (qua Thư điện tử) Không có chương trình thư điện tử nào được cài đặt @@ -80,6 +82,10 @@ Chạm vào thông điệp này (hoặc bấm Quay lại) để bỏ qua bước Sử dụng tiêu đề/miêu tả trước Lấy vị trí hiện tại tự động Định vị hiện tại để nhận gợi ý thể loại trong trường hợp hình ảnh chưa được gắn thẻ địa lý + Chế độ ban đêm + Dùng chủ đề tối + Ghi công–Chia sẻ tương tự 4.0 + Ghi công 4.0 Ghi công–Chia sẻ tương tự 3.0 Ghi công 3.0 CC0 @@ -148,4 +154,12 @@ Chạm vào thông điệp này (hoặc bấm Quay lại) để bỏ qua bước Tập tin này đã tồn tại ở Commons. Bạn có chắc chắn muốn tiếp tục? Không + Tiêu đề + Tiêu đề phương tiện + Mô tả + Mô tả phương tiện xuất hiện tại đây. Nó có thể khá dài và sẽ cần phải ngắt thành nhiều dòng. Nhưng chúng tôi hy vọng sẽ trông ưa nhìn. + Trở thành người dùng thử nghiệm + Tham gia kênh thử nghiệm của chúng tôi trên Google Play và nhận các tính năng mới cùng những bản sửa lỗi sớm hơn + Dùng Wikidata + (Cảnh báo: tắt đi có thể tăng sử dụng dữ liệu di động rất lớn) From b08a0a39640e9d7c9fb29fe1736d94dc44faa558 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Mon, 8 May 2017 00:30:56 +0100 Subject: [PATCH 014/168] Remove unused code in settingsFragment --- .../nrw/commons/settings/SettingsFragment.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index 68d174013..c67f745da 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -19,23 +19,9 @@ public class SettingsFragment extends PreferenceFragment { // Update spinner to show selected value as summary ListPreference licensePreference = (ListPreference) findPreference(Prefs.DEFAULT_LICENSE); - // WARNING: ORDERING NEEDS TO MATCH FOR THE LICENSE NAMES AND DISPLAY VALUES - licensePreference.setEntries(new String[]{ - getString(R.string.license_name_cc0), - getString(R.string.license_name_cc_by_3_0), - getString(R.string.license_name_cc_by_4_0), - getString(R.string.license_name_cc_by_sa_3_0), - getString(R.string.license_name_cc_by_sa_4_0) - }); - licensePreference.setEntryValues(new String[]{ - Prefs.Licenses.CC0, - Prefs.Licenses.CC_BY_3, - Prefs.Licenses.CC_BY_4, - Prefs.Licenses.CC_BY_SA_3, - Prefs.Licenses.CC_BY_SA_4 - }); - licensePreference.setSummary(getString(Utils.licenseNameFor(licensePreference.getValue()))); + + // Keep summary updated when changing value licensePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { From 2b91abed22990b8760ee2b4e8e9288c2b065c0fb Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Tue, 9 May 2017 19:59:42 +0100 Subject: [PATCH 015/168] Hardcode arrays.xml values --- app/src/main/res/values/arrays.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 80dd58a0e..8db2c9ccc 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -8,10 +8,10 @@ @string/license_name_cc_by_sa_four - @string/license_name_cc0 - @string/license_name_cc_by_3_0 - @string/license_name_cc_by_4_0 - @string/license_name_cc_by_sa_3_0 - @string/license_name_cc_by_sa_4_0 + CC0 + CC BY 3.0 + CC BY 4.0 + CC BY-SA 3.0 + CC BY-SA 4.0 \ No newline at end of file From 654471c0980bb04731db9ed5baa57b0eaf204591 Mon Sep 17 00:00:00 2001 From: srv-twry Date: Wed, 10 May 2017 00:38:58 +0530 Subject: [PATCH 016/168] 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 87fe6cf5859993527a852cd0a8eeec34d70dffe4 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Wed, 10 May 2017 22:51:19 +0100 Subject: [PATCH 017/168] Create untranslatable strings for pref constants --- app/src/main/res/values/arrays.xml | 10 +++++----- app/src/main/res/values/strings.xml | 5 +++++ app/src/main/res/xml/preferences.xml | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 8db2c9ccc..3cfe500d4 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -8,10 +8,10 @@ @string/license_name_cc_by_sa_four - CC0 - CC BY 3.0 - CC BY 4.0 - CC BY-SA 3.0 - CC BY-SA 4.0 + @string/license_pref_cc0 + @string/license_pref_cc_by_3_0 + @string/license_pref_cc_by_4_0 + @string/license_pref_cc_by_sa_3_0 + @string/license_pref_cc_by_sa_4_0 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67ddd2396..b39719d57 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,7 +99,9 @@ Tap this message (or hit back) to skip this step. Attribution-ShareAlike 3.0 Attribution 3.0 CC0 + CC0 CC BY-SA 3.0 + CC BY-SA 3.0 CC BY-SA 3.0 (Austria) CC BY-SA 3.0 (Germany) CC BY-SA 3.0 (Estonia) @@ -111,8 +113,11 @@ Tap this message (or hit back) to skip this step. CC BY-SA 3.0 (Poland) CC BY-SA 3.0 (Romania) CC BY 3.0 + CC BY 3.0 CC BY-SA 4.0 + CC BY-SA 4.0 CC BY 4.0 + CC BY 4.0 CC Zero own-pd CC BY-SA 2.5 diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 847f01e1c..a75cfbd5a 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -8,7 +8,7 @@ android:title="@string/preference_license" android:entries="@array/pref_defaultLicense_entries" android:entryValues="@array/pref_defaultLicense_values" - android:defaultValue="@string/license_name_cc_by_sa_4_0" + android:defaultValue="@string/license_pref_cc_by_sa_4_0" /> Date: Wed, 10 May 2017 22:51:33 +0100 Subject: [PATCH 018/168] Check in SingleUploadFragment that spinner position is valid before applying --- .../fr/free/nrw/commons/upload/SingleUploadFragment.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index e96c8768c..716af6c79 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -115,6 +115,13 @@ public class SingleUploadFragment extends Fragment { licenseSpinner.setAdapter(adapter); int position = licenseItems.indexOf(getString(Utils.licenseNameFor(license))); + + // Check position is valid + if(position < 0) { + Timber.d("Invalid position: %d. Using default license", position); + position = 4; + } + Timber.d("Position: %d %s", position, getString(Utils.licenseNameFor(license))); licenseSpinner.setSelection(position); From e5d7caf5f24869e292695a992abd8c473cd4295d Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Wed, 10 May 2017 23:15:15 +0100 Subject: [PATCH 019/168] Update SettingsActivityTest to correctly pass test on LicenseSpinner --- .../java/fr/free/nrw/commons/SettingsActivityTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java index f2047506b..7ba617730 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -84,9 +84,9 @@ public class SettingsActivityTest { .atPosition(0) .perform(ViewActions.click()); - // click "CC BY-4.0" + // click "Attribution 4.0" Espresso.onView( - ViewMatchers.withText(R.string.license_name_cc_by_4_0) + ViewMatchers.withText(R.string.license_name_cc_by_four) ).perform(ViewActions.click()); // click "License" (the first item) @@ -95,10 +95,10 @@ public class SettingsActivityTest { .atPosition(0) .perform(ViewActions.click()); - // test the value remains "CC BY-4.0" + // test the value remains "Attribution 4.0" Espresso.onView(ViewMatchers.isChecked()) .check(ViewAssertions.matches( - ViewMatchers.withText(R.string.license_name_cc_by_4_0) + ViewMatchers.withText(R.string.license_name_cc_by_four) )); } From d9afd0e4bfe4e71b36b2655595bbb0cdf7c5e38c Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Wed, 10 May 2017 23:16:35 +0100 Subject: [PATCH 020/168] Improve code style --- .../java/fr/free/nrw/commons/upload/SingleUploadFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index 716af6c79..2cf23318c 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -117,7 +117,7 @@ public class SingleUploadFragment extends Fragment { int position = licenseItems.indexOf(getString(Utils.licenseNameFor(license))); // Check position is valid - if(position < 0) { + if (position < 0) { Timber.d("Invalid position: %d. Using default license", position); position = 4; } From 5639be077e943fd4bd7d0859ed10ee94531ecd7c Mon Sep 17 00:00:00 2001 From: srv-twry Date: Thu, 11 May 2017 04:01:06 +0530 Subject: [PATCH 021/168] 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 022/168] 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 023/168] 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 024/168] 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 025/168] 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 026/168] 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 027/168] 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 028/168] 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 029/168] 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 030/168] 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 031/168] 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 032/168] 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 033/168] 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 034/168] 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 035/168] 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 036/168] 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 037/168] 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 038/168] 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 039/168] 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 040/168] 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 041/168] 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 042/168] 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 043/168] 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 044/168] 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 045/168] 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 046/168] 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 047/168] 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 048/168] 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 049/168] 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 050/168] 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 051/168] 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 052/168] 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 053/168] 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 054/168] 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 055/168] 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 056/168] 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 057/168] 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 058/168] 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 059/168] 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 060/168] Remove conflicts --- .../java/fr/free/nrw/commons/nearby/NearbyMapFragment.java | 6 ++++++ app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 8 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index de92a596b..c15a407c3 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; @@ -93,6 +94,11 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { }); } }); + if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("theme",true)) { + mapView.setStyleUrl(getResources().getString(R.string.map_theme_dark)); + } else { + mapView.setStyleUrl(getResources().getString(R.string.map_theme_light)); + } setHasOptionsMenu(false); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0414f98fa..536f66e41 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -170,5 +170,7 @@ Tap this message (or hit back) to skip this step. https://play.google.com/apps/testing/fr.free.nrw.commons Use Wikidata (Warning: disabling this may cause large mobile data consumption) + mapbox://styles/mapbox/traffic-day-v2 + mapbox://styles/mapbox/traffic-night-v2 pk.eyJ1IjoibWFza2FyYXZpdmVrIiwiYSI6ImNqMmxvdzFjMTAwMHYzM283ZWM3eW5tcDAifQ.ib5SZ9EVjwJe6GSKve0bcg From ec0da2f4af2026cb6551d55ef2e54e4295a3baa5 Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 14 May 2017 13:53:37 +0200 Subject: [PATCH 061/168] Close fragment when tapped on the empty section --- .../nrw/commons/nearby/NearbyInfoDialog.java | 5 + .../main/res/layout/dialog_nearby_info.xml | 169 ++++++++++-------- 2 files changed, 98 insertions(+), 76 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java index e777eb3ee..3bf6f7a50 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java @@ -107,4 +107,9 @@ public class NearbyInfoDialog extends OverlayDialog { Intent browserIntent = new Intent(Intent.ACTION_VIEW, articleLink); startActivity(browserIntent); } + + @OnClick(R.id.emptyLayout) + void onCloseClicked() { + dismissAllowingStateLoss(); + } } diff --git a/app/src/main/res/layout/dialog_nearby_info.xml b/app/src/main/res/layout/dialog_nearby_info.xml index be21af18e..b76934480 100644 --- a/app/src/main/res/layout/dialog_nearby_info.xml +++ b/app/src/main/res/layout/dialog_nearby_info.xml @@ -1,5 +1,5 @@ - + + - + android:layout_alignParentBottom="true" + android:background="@android:color/white"> + android:animateLayoutChanges="true" + android:minHeight="@dimen/bottom_peak_height" + android:orientation="vertical"> + + + + + + + + + + + + + + + + android:paddingBottom="16dp" + android:paddingTop="16dp" + android:text="GET DIRECTIONS" + android:textColor="@android:color/black" /> + + + + - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file From a8c950dee9c0a1d6ca0ba62ce6cc74be03d872ba Mon Sep 17 00:00:00 2001 From: Yusuke Matsubara Date: Sun, 14 May 2017 21:01:26 +0900 Subject: [PATCH 062/168] Restore comments --- .../java/fr/free/nrw/commons/settings/SettingsFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index f30711c02..790ae2da8 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -25,6 +25,8 @@ public class SettingsFragment extends PreferenceFragment { // Update spinner to show selected value as summary ListPreference licensePreference = (ListPreference) findPreference(Prefs.DEFAULT_LICENSE); licensePreference.setSummary(getString(Utils.licenseNameFor(licensePreference.getValue()))); + + // Keep summary updated when changing value licensePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { @@ -81,4 +83,4 @@ public class SettingsFragment extends PreferenceFragment { } -} \ No newline at end of file +} From 198f3daf44996fd57e6abc74f0da6863925af430 Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 14 May 2017 14:22:52 +0200 Subject: [PATCH 063/168] Fix Info dialog width issue --- .../java/fr/free/nrw/commons/ui/widget/OverlayDialog.java | 4 +--- app/src/main/res/layout/dialog_nearby_info.xml | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java index 69bc8549f..6b2913d6d 100644 --- a/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java +++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java @@ -11,14 +11,12 @@ import android.view.View; import android.view.Window; import android.view.WindowManager; -import fr.free.nrw.commons.R; - public abstract class OverlayDialog extends DialogFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setStyle(STYLE_NORMAL, R.style.borderless_dialog); + setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light); } @Override diff --git a/app/src/main/res/layout/dialog_nearby_info.xml b/app/src/main/res/layout/dialog_nearby_info.xml index b76934480..1dc5c29f4 100644 --- a/app/src/main/res/layout/dialog_nearby_info.xml +++ b/app/src/main/res/layout/dialog_nearby_info.xml @@ -9,6 +9,7 @@ app:behavior_peekHeight="@dimen/bottom_peak_height"> Date: Sun, 14 May 2017 14:33:19 +0200 Subject: [PATCH 064/168] Fix the issue of not reloading the cursor after the setting changed --- .../contributions/ContributionsActivity.java | 12 +++++++++-- .../fr/free/nrw/commons/settings/Prefs.java | 1 + .../commons/settings/SettingsFragment.java | 20 ++++++++++--------- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 23 insertions(+), 12 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 7900151c7..8043f99be 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,8 +42,7 @@ public class ContributionsActivity AdapterView.OnItemClickListener, MediaDetailPagerFragment.MediaDetailProvider, FragmentManager.OnBackStackChangedListener, - ContributionsListFragment.SourceRefresher -{ + ContributionsListFragment.SourceRefresher { private Cursor allContributions; private ContributionsListFragment contributionsList; @@ -92,6 +91,15 @@ public class ContributionsActivity @Override protected void onResume() { super.onResume(); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + boolean isSettingsChanged = + sharedPreferences.getBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,false); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,false); + editor.apply(); + if(isSettingsChanged){ + refreshSource(); + } } @Override 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 4c2209153..722733393 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 @@ -6,6 +6,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 final String IS_CONTRIBUTION_COUNT_CHANGED = "ccontributionCountChanged"; 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 d5eeda7e7..c2d508acd 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,12 +41,13 @@ public class SettingsFragment extends PreferenceFragment { }); licensePreference.setSummary(getString(Utils.licenseNameFor(licensePreference.getValue()))); - licensePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener(){ - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - preference.setSummary(getString(Utils.licenseNameFor((String) newValue))); - return true; - } + licensePreference + .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener(){ + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + preference.setSummary(getString(Utils.licenseNameFor((String) newValue))); + return true; + } }); CheckBoxPreference themePreference = (CheckBoxPreference) findPreference("theme"); @@ -59,17 +60,16 @@ public class SettingsFragment extends PreferenceFragment { }); final EditTextPreference uploadLimit = (EditTextPreference) findPreference("uploads"); - SharedPreferences sharedPref = PreferenceManager + final SharedPreferences sharedPref = PreferenceManager .getDefaultSharedPreferences(getActivity().getApplicationContext()); int uploads = sharedPref.getInt(Prefs.UPLOADS_SHOWING, 100); + uploadLimit.setText(uploads + ""); uploadLimit.setSummary(uploads + ""); uploadLimit.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { int value = Integer.parseInt(newValue.toString()); - final SharedPreferences sharedPref = PreferenceManager - .getDefaultSharedPreferences(getActivity().getApplicationContext()); final SharedPreferences.Editor editor = sharedPref.edit(); if (value > 500) { new AlertDialog.Builder(getActivity()) @@ -83,10 +83,12 @@ public class SettingsFragment extends PreferenceFragment { .setIcon(android.R.drawable.ic_dialog_alert) .show(); editor.putInt(Prefs.UPLOADS_SHOWING, 500); + editor.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,true); uploadLimit.setSummary(500 + ""); uploadLimit.setText(500 + ""); } else { editor.putInt(Prefs.UPLOADS_SHOWING, Integer.parseInt(newValue.toString())); + editor.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,true); uploadLimit.setSummary(newValue.toString()); } editor.apply(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f501975e8..4ec2b88ff 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -173,7 +173,7 @@ Tap this message (or hit back) to skip this step. pk.eyJ1IjoibWFza2FyYXZpdmVrIiwiYSI6ImNqMmxvdzFjMTAwMHYzM283ZWM3eW5tcDAifQ.ib5SZ9EVjwJe6GSKve0bcg My Recent Upload Limit Maximum Limit - Maximum limit should be 500 + Unable to display more than 500 Set Recent Upload Limit From c426451ffbf359d45a21a245d969179b8911425c Mon Sep 17 00:00:00 2001 From: Dinu Kumarasiri Date: Sun, 14 May 2017 14:38:06 +0200 Subject: [PATCH 065/168] Fix Codecy Failures --- .../free/nrw/commons/contributions/ContributionsActivity.java | 2 +- .../java/fr/free/nrw/commons/settings/SettingsFragment.java | 2 +- 2 files changed, 2 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 8043f99be..9be4b836c 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 @@ -97,7 +97,7 @@ public class ContributionsActivity SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean(Prefs.IS_CONTRIBUTION_COUNT_CHANGED,false); editor.apply(); - if(isSettingsChanged){ + if (isSettingsChanged) { refreshSource(); } } 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 c2d508acd..65709c6da 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 @@ -42,7 +42,7 @@ public class SettingsFragment extends PreferenceFragment { licensePreference.setSummary(getString(Utils.licenseNameFor(licensePreference.getValue()))); licensePreference - .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener(){ + .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { preference.setSummary(getString(Utils.licenseNameFor((String) newValue))); From fd72e4593017c8d65ae262af6236dfacaadd5315 Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 14 May 2017 14:42:30 +0200 Subject: [PATCH 066/168] Fix Crash issue when GPS location is not available --- .../nrw/commons/nearby/NearbyMapFragment.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index c15a407c3..77512139e 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -66,6 +66,17 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + if (curLatLng != null) { + setupMapView(savedInstanceState); + } + + setHasOptionsMenu(false); + + return mapView; + } + + private void setupMapView(Bundle savedInstanceState) { MapboxMapOptions options = new MapboxMapOptions() .styleUrl(Style.OUTDOORS) .camera(new CameraPosition.Builder() @@ -99,10 +110,6 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { } else { mapView.setStyleUrl(getResources().getString(R.string.map_theme_light)); } - - setHasOptionsMenu(false); - - return mapView; } @Override @@ -112,31 +119,41 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { @Override public void onStart() { - mapView.onStart(); + if (mapView != null) { + mapView.onStart(); + } super.onStart(); } @Override public void onPause() { - mapView.onPause(); + if (mapView != null) { + mapView.onPause(); + } super.onPause(); } @Override public void onResume() { - mapView.onResume(); + if (mapView != null) { + mapView.onResume(); + } super.onResume(); } @Override public void onStop() { - mapView.onStop(); + if (mapView != null) { + mapView.onStop(); + } super.onStop(); } @Override public void onDestroyView() { - mapView.onDestroy(); + if (mapView != null) { + mapView.onDestroy(); + } super.onDestroyView(); } } From dc1b04f3ed773fa5b58e66513487579128d3ce9d Mon Sep 17 00:00:00 2001 From: Neslihan Date: Sun, 14 May 2017 15:51:50 +0300 Subject: [PATCH 067/168] Switch map button accoding to map and list --- .../main/java/fr/free/nrw/commons/Utils.java | 10 ++++++ .../nrw/commons/nearby/NearbyActivity.java | 29 +++++++++++++----- .../free/nrw/commons/theme/BaseActivity.java | 5 +-- .../res/drawable-hdpi/ic_list_white_24dp.png | Bin 0 -> 116 bytes .../res/drawable-hdpi/ic_map_black_24dp.png | Bin 310 -> 0 bytes .../res/drawable-mdpi/ic_list_white_24dp.png | Bin 0 -> 86 bytes .../res/drawable-mdpi/ic_map_black_24dp.png | Bin 222 -> 0 bytes .../res/drawable-xhdpi/ic_list_white_24dp.png | Bin 0 -> 95 bytes .../res/drawable-xhdpi/ic_map_black_24dp.png | Bin 363 -> 0 bytes .../drawable-xxhdpi/ic_list_white_24dp.png | Bin 0 -> 94 bytes .../res/drawable-xxhdpi/ic_map_black_24dp.png | Bin 513 -> 0 bytes .../drawable-xxxhdpi/ic_list_white_24dp.png | Bin 0 -> 100 bytes .../drawable-xxxhdpi/ic_map_black_24dp.png | Bin 667 -> 0 bytes 13 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_map_black_24dp.png diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index 0ece6e119..52ff8422c 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -1,7 +1,9 @@ package fr.free.nrw.commons; +import android.content.Context; import android.net.Uri; import android.os.Build; +import android.preference.PreferenceManager; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.assist.ImageScaleType; @@ -306,4 +308,12 @@ public class Utils { public static boolean isNullOrWhiteSpace(String value) { return value == null || value.trim().isEmpty(); } + + public static boolean isDarkTheme(Context context){ + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean("theme",true)) { + return true; + }else { + return false; + } + } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index 0f8f176de..d2e14956e 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -3,6 +3,7 @@ package fr.free.nrw.commons.nearby; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.view.Menu; import android.view.MenuInflater; @@ -71,6 +72,11 @@ public class NearbyActivity extends BaseActivity { return true; case R.id.action_map: showMapView(); + if (isMapViewActive) { + item.setIcon(R.drawable.ic_list_white_24dp); + } else { + item.setIcon(R.drawable.ic_map_white_24dp); + } return true; default: return super.onOptionsItemSelected(item); @@ -83,9 +89,16 @@ public class NearbyActivity extends BaseActivity { if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { setMapFragment(); } + + } else { + isMapViewActive = false; + if (nearbyAsyncTask.getStatus() == AsyncTask.Status.FINISHED) { + setListFragment(); + } } } + @Override protected void onResume() { super.onResume(); @@ -160,22 +173,22 @@ public class NearbyActivity extends BaseActivity { * Calls fragment for map view. */ public void setMapFragment() { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - NearbyMapFragment fragment = new NearbyMapFragment(); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + Fragment fragment = new NearbyMapFragment(); fragment.setArguments(bundle); - ft.add(R.id.container, fragment); - ft.commit(); + fragmentTransaction.replace(R.id.container, fragment); + fragmentTransaction.commit(); } /** * Calls fragment for list view. */ public void setListFragment() { - FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - NearbyListFragment fragment = new NearbyListFragment(); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + Fragment fragment = new NearbyListFragment(); fragment.setArguments(bundle); - ft.add(R.id.container, fragment); - ft.commit(); + fragmentTransaction.replace(R.id.container, fragment); + fragmentTransaction.commit(); } } diff --git a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java index f52ea84dd..b0be190a4 100644 --- a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java @@ -6,16 +6,17 @@ import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.Utils; public class BaseActivity extends AppCompatActivity { boolean currentTheme; @Override protected void onCreate(Bundle savedInstanceState) { - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("theme",true)) { + if(Utils.isDarkTheme(this)){ currentTheme = true; setTheme(R.style.DarkAppTheme); - }else { + } else { currentTheme = false; setTheme(R.style.LightAppTheme); // default } diff --git a/app/src/main/res/drawable-hdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f7e7dda6e4a5b45a97917c20dfaeddc3645077 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;wWo_?h{y5d1PRu~2@%cz`Tk2c zTwv_<E5juBY?z2sqDoGA^{8xbs2ogzZvA71C3$u MboFyt=akR{08!Q;k^lez literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_map_black_24dp.png deleted file mode 100644 index c81d0e068acbc551a151c33afe485465188c5df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmV-60m=S}P)KSap~0CWGw`{s-kMDGW;7V=~EZ@DG^oV6kA6>no9gQM#k7 zm)xTyT~D{8&K;fCXFAXG^sb`=nMsSrBpI+IFTuEqJMriKTQelorKIXjY)e}On{LIy zn$9ff1B}>F|GtX|{c{}zYVKRUUL9F=s`=whL?{vmi!f!^Q*fRt1Ub|8J$D`gx|N)F z9s;5)l!da;p9o!;(~~w7?!|!_xwN5hb$g0!-&B4JH62@4)o3|;P!s-qF)8$D+c2Ql zyc6%@U{}`VwN(*oI5aCKG-$=;SK`KoQ3>+O`XwnSn~+-O19Z^kOjb<{Qvd(}07*qo IM6N<$f~&QL(EtDd diff --git a/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..15d8fc2bb488d6654651ec05f3ecba1fb7163394 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1Sx*gTe~DWM4fOr#gq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_map_black_24dp.png deleted file mode 100644 index bcc500e96c932305d591e06d403c4c807984aac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+irJgR1Ar*{oCvD_A7$D(xe*Omz zA+}CEU!Gc~i8J=}99bij^q5tpZ1#77#S2X(kEk7C?g$bp|H0;L{qn(`w|Cy>*t;%2 z*&-|GY_rjAx~O)wbPuCF z&p$`Y{DM?R>C;jw?*#hKa2&b6kF}cZ%8CogXM>MLJJ|&I>AXxxl4@}|((^&nOh4uO W^;H*Q*G&XEn8DN4&t;ucLK6U1?pIL& diff --git a/app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7253975cc58f5814084bab87ca50729cbfa262 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZA`BpB)|k7xlYrjj7PUN*z7jegvM zQ%;@U%Ji=LeENKbdk^aUd~L7gA(u;D$88@>^c_-N%fQr7t=evx2+`iUW}o7=xZs69 z!oO8?MBi8_+|nzT?G|^;eKR3iX)Qe?p>hjPUDUM06+>ZVrOkxG9e2lc<(>N}6t1*T zGT@{Kz6kNw3&3WlZTOxJ0Jb^riA6d9*p(Xap8*-jKn609feh?P4gB`ZCCwy2w7Eyl zXe0rmef7{Oo7M^Z@NMOry6c2cxKHW>UhCR!t8*UvB~kiZdKD(zaZl|u7mO|l1 zdJY3sz|wPPH59kkRd0l7V>caDtD%p2_N(ro8z$Zx=*Z;~_ZO6jUUM=WXyO0>002ov JPDHLkV1ihOr%?a^ diff --git a/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2807e4ebe3f77a5b830c06d76082532d9a91de GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^9w5vJBp7O^^}Pa8OeH~n!3+##lh0ZJdE%Zfjv*C{ p$r5b~`u^Gr{8653n)QAHJHzX3N$>My@67>e^mO%eS?83{1OWFN8fX9j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_map_black_24dp.png deleted file mode 100644 index 827c9fc9f114e51cbaa1db0e9dd47dff133ce1d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXoKNz<9#b#WAFU@$I?2-dD334tzXs z_|kQQ#>u4`OT{&dy4kX|IWjvGy2LUCn>;#LF0MEx(;}r6#ig`JQRbE2-Q6()DvmmS zVZjL(6rKu9N?iGq#V`HEkAgaTi#ZQ}*8Okn57CVvw9r=x$ViS zv!;`sPOgu+v}P0Ej#RgZ%D`jacC6C)^Hue~W&Yxd-d(+%OIPoR{k2zc(Rt~zTUAeA zeYh}3A%%VGD`UlwFKgWUq8D#jTU9G?N`~LJs+W7_|3`g%tff}G(E=?s3${CbDKq!w zTy67ovw*E!(~p3H8?o`NKdv$|ezmgwwztgT09(54_tii;?e4$tyMeS>xX%?Kj*Qi& z6Ii?!U_q-AFZ_#QW_7JC3y~G6yxGA$YZYJDo(J;JO+fr}!s=JTf%Gw3cac@Rvpxkz zJoRVW%6(D&Q*&L_s~JpuJ9DE>{MZy|Yxa~`^y`g9Tddq|Kdf~+Gvo9&=19lQ@2pqE zyq@#v%pQT-nDuiV$}V*1@jfzr_32WQAHBDw}vZo+3Bkj t#$Aj0GW*N9(%er|y_N>8w2$kY(z%DR8W^(-44$rjF6*2UngFD$=3D>( diff --git a/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6d3b0449b8c59366b29c2209bb23e80325080c GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc@?O(%@xS>XdsLA^!WH|)|0G!%Hn8t^oG?pW9;DsV)z4*}Q$iB}k@*`j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_map_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_map_black_24dp.png deleted file mode 100644 index da75c65bb5e60af90e8bcb091ef13d57d2f2afc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z?9_a;uuoF`1Y2+$K^zs;~&4z zx}tP}@1loG>}mm{#d@O3R;qGL3l9YcTvF^>qq8X{HTKd1gumq!>{DcJfBt;)VdMMP#sBT9<;#8>>N{~Lwg@b0``j~0!HeVe zs~yK!G^I4VOy?*!&e~|9%d&Cd6lR{6yHz&o_)OWp!g6|IL)xhidD^yroX*ZNRrE9L zIknq_|E4d4vE!{D7SC#YEsa`XVZm_k{e6epMLwm(C|L8j!>5-fV*mnJF)G9dkE5L2_ z(#eJ)jnXMMKJ44LW;y$|f@T%2-^S1WGTMK=lX&SWgYE%6xd~;a4%*4`%qcOv7n-&R zl$$$n3#J~q%doaj?^rA!!w11as{@B>IVUg>hZ=H!+~EtTdB`Pwm-oVN2lmx>crR4D zYHI^cKmBROU!77@2Yp|8Umc*W`CYqB0v=^G#7&y*@}Y9ae9f{03LBgD8_F*3E^Yf> z-7Ri#Ff@yC#UqpV0n?^G)nt#1=xNaTYx1|eN>}`6%cc#PNiqv%&So7**9-8>o4xZ~ z`JVq@EY^lBh~)io*!ESVLtWjr;@R_${a+>=vM7?zqo5~sM&uE{cb}!FmaorTEOoZ% zfXMb6E#*t!EVX~mz9BzDy(d-k%TI~3ItSaH$~ Date: Sun, 14 May 2017 15:59:00 +0300 Subject: [PATCH 068/168] Fix codacy --- app/src/main/java/fr/free/nrw/commons/Utils.java | 2 +- .../main/java/fr/free/nrw/commons/nearby/NearbyActivity.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index 52ff8422c..d296fdbcf 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -309,7 +309,7 @@ public class Utils { return value == null || value.trim().isEmpty(); } - public static boolean isDarkTheme(Context context){ + public static boolean isDarkTheme(Context context) { if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean("theme",true)) { return true; }else { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index d2e14956e..43966f7a4 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -98,7 +98,6 @@ public class NearbyActivity extends BaseActivity { } } - @Override protected void onResume() { super.onResume(); @@ -190,5 +189,4 @@ public class NearbyActivity extends BaseActivity { fragmentTransaction.replace(R.id.container, fragment); fragmentTransaction.commit(); } - } From ea051c119ab072057a3ec4edb2e98d6728f7643b Mon Sep 17 00:00:00 2001 From: addshore Date: Sat, 13 May 2017 17:35:33 +0200 Subject: [PATCH 069/168] Add 2fa to login activity Fixes #328 --- .../main/java/fr/free/nrw/commons/MWApi.java | 72 +++++++++++++------ .../free/nrw/commons/auth/LoginActivity.java | 41 +++++++++-- .../auth/WikiAccountAuthenticator.java | 1 + app/src/main/res/layout/activity_login.xml | 18 +++++ app/src/main/res/values/strings.xml | 3 +- 5 files changed, 106 insertions(+), 29 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 aef8b5cd0..785ea7886 100644 --- a/app/src/main/java/fr/free/nrw/commons/MWApi.java +++ b/app/src/main/java/fr/free/nrw/commons/MWApi.java @@ -10,6 +10,9 @@ import org.mediawiki.api.ApiResult; */ public class MWApi extends org.mediawiki.api.MWApi { + /** We don't actually use this but need to pass it in requests */ + private static String LOGIN_RETURN_TO_URL = "https://commons.wikimedia.org"; + public MWApi(String apiURL, AbstractHttpClient client) { super(apiURL, client); } @@ -17,41 +20,69 @@ public class MWApi extends org.mediawiki.api.MWApi { /** * @param username String * @param password String - * @return String On success: "PASS" - * continue: "2FA" (More information required for 2FA) - * failure: A failure message code (defined by mediawiki) - * misc: genericerror-UI, genericerror-REDIRECT, genericerror-RESTART + * @return String as returned by this.getErrorCodeToReturn() * @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") + String token = this.getLoginToken(); + ApiResult loginApiResult = this.action("clientlogin") .param("rememberMe", "1") .param("username", username) .param("password", password) .param("logintoken", token) - .param("loginreturnurl", "http://example.com/")//TODO return to url? + .param("loginreturnurl", LOGIN_RETURN_TO_URL) .post(); - String status = loginData.getString("/api/clientlogin/@status"); + return this.getErrorCodeToReturn( loginApiResult ); + } + /** + * @param username String + * @param password String + * @param twoFactorCode String + * @return String as returned by this.getErrorCodeToReturn() + * @throws IOException On api request IO issue + */ + public String login(String username, String password, String twoFactorCode) throws IOException { + String token = this.getLoginToken();//TODO cache this instead of calling again when 2FAing + ApiResult loginApiResult = this.action("clientlogin") + .param("rememberMe", "1") + .param("username", username) + .param("password", password) + .param("logintoken", token) + .param("logincontinue", "1") + .param("OATHToken", twoFactorCode) + .post(); + + return this.getErrorCodeToReturn( loginApiResult ); + } + + private String getLoginToken() throws IOException { + ApiResult tokenResult = this.action("query") + .param("action", "query") + .param("meta", "tokens") + .param("type", "login") + .post(); + return tokenResult.getString("/api/query/tokens/@logintoken"); + } + + /** + * @param loginApiResult ApiResult Any clientlogin api result + * @return String On success: "PASS" + * continue: "2FA" (More information required for 2FA) + * failure: A failure message code (defined by mediawiki) + * misc: genericerror-UI, genericerror-REDIRECT, genericerror-RESTART + */ + private String getErrorCodeToReturn( ApiResult loginApiResult ) { + String status = loginApiResult.getString("/api/clientlogin/@status"); if (status.equals("PASS")) { this.isLoggedIn = true; return status; } else if (status.equals("FAIL")) { - return loginData.getString("/api/clientlogin/@messagecode"); + return loginApiResult.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).") + && loginApiResult.getString("/api/clientlogin/requests/_v/@id").equals("TOTPAuthenticationRequest") + && loginApiResult.getString("/api/clientlogin/requests/_v/@provider").equals("Two-factor authentication (OATH).") ) { return "2FA"; } @@ -60,5 +91,4 @@ public class MWApi extends org.mediawiki.api.MWApi { return "genericerror-" + status; } - } 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 6c3f6a389..57a369bad 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 @@ -48,6 +48,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { Button signupButton; EditText usernameEdit; EditText passwordEdit; + EditText twoFactorEdit; ProgressDialog dialog; private class LoginTask extends AsyncTask { @@ -55,6 +56,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { Activity context; String username; String password; + String twoFactorCode = ""; @Override protected void onPostExecute(String result) { @@ -107,12 +109,11 @@ public class LoginActivity extends AccountAuthenticatorActivity { } else if (result.toLowerCase().contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) { // Matches nosuchuser, nosuchusershort, noname response = R.string.login_failed_username; - passwordEdit.setText(""); - + emptySensitiveEditFields(); } else if (result.toLowerCase().contains("wrongpassword".toLowerCase())) { // Matches wrongpassword, wrongpasswordempty response = R.string.login_failed_password; - passwordEdit.setText(""); + emptySensitiveEditFields(); } else if (result.toLowerCase().contains("throttle".toLowerCase())) { // Matches unknown throttle error codes response = R.string.login_failed_throttled; @@ -120,7 +121,8 @@ public class LoginActivity extends AccountAuthenticatorActivity { // Matches login-userblocked response = R.string.login_failed_blocked; } else if (result.equals("2FA")){ - response = R.string.login_failed_2fa_not_supported; + twoFactorEdit.setVisibility(View.VISIBLE); + response = R.string.login_failed_2fa_needed; } else { // Occurs with unhandled login failure codes Timber.d("Login failed with reason: %s", result); @@ -131,6 +133,11 @@ public class LoginActivity extends AccountAuthenticatorActivity { } } + private void emptySensitiveEditFields() { + passwordEdit.setText(""); + twoFactorEdit.setText(""); + } + @Override protected void onPreExecute() { super.onPreExecute(); @@ -150,8 +157,16 @@ public class LoginActivity extends AccountAuthenticatorActivity { protected String doInBackground(String... params) { username = params[0]; password = params[1]; + if(params.length > 2) { + twoFactorCode = params[2]; + } + try { - return app.getApi().login(username, password); + if(twoFactorCode.isEmpty()) { + return app.getApi().login(username, password); + } else { + return app.getApi().login(username, password, twoFactorCode); + } } catch (IOException e) { // Do something better! return "NetworkFailure"; @@ -168,6 +183,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { signupButton = (Button) findViewById(R.id.signupButton); usernameEdit = (EditText) findViewById(R.id.loginUsername); passwordEdit = (EditText) findViewById(R.id.loginPassword); + twoFactorEdit = (EditText) findViewById(R.id.loginTwoFactor); final LoginActivity that = this; prefs = getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE); @@ -181,7 +197,11 @@ public class LoginActivity extends AccountAuthenticatorActivity { @Override public void afterTextChanged(Editable editable) { - if(usernameEdit.getText().length() != 0 && passwordEdit.getText().length() != 0) { + if( + usernameEdit.getText().length() != 0 && + passwordEdit.getText().length() != 0 && + ( twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE ) + ) { loginButton.setEnabled(true); } else { loginButton.setEnabled(false); @@ -191,6 +211,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { usernameEdit.addTextChangedListener(loginEnabler); passwordEdit.addTextChangedListener(loginEnabler); + twoFactorEdit.addTextChangedListener(loginEnabler); passwordEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { @@ -249,9 +270,15 @@ public class LoginActivity extends AccountAuthenticatorActivity { String password = passwordEdit.getText().toString(); + String twoFactorCode = twoFactorEdit.getText().toString(); + Timber.d("Login to start!"); LoginTask task = new LoginTask(this); - task.execute(canonicalUsername, password); + if(twoFactorCode.isEmpty()) { + task.execute(canonicalUsername, password); + } else { + task.execute(canonicalUsername, password, twoFactorCode); + } } @Override 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 42448ace0..c134af4da 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 @@ -44,6 +44,7 @@ public class WikiAccountAuthenticator extends AbstractAccountAuthenticator { private String getAuthCookie(String username, String password) throws IOException { MWApi api = CommonsApplication.createMWApi(); + //TODO add 2fa support here String result = api.login(username, password); if(result.equals("PASS")) { return api.getAuthCookie(); diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index aeda37b39..c81f78a33 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -62,6 +62,24 @@ + + + + + +