From 26fc6cf9fe8724e8d68f4f56855088082867e775 Mon Sep 17 00:00:00 2001 From: Suchit Kar Date: Sat, 17 Feb 2018 00:23:36 +0530 Subject: [PATCH 01/96] Fix alignment in category search for right to left language locales --- app/src/main/res/layout/fragment_categorization.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_categorization.xml b/app/src/main/res/layout/fragment_categorization.xml index fa258768b..e49396b37 100644 --- a/app/src/main/res/layout/fragment_categorization.xml +++ b/app/src/main/res/layout/fragment_categorization.xml @@ -24,6 +24,7 @@ android:layout_width="match_parent" android:hint="@string/categories_search_text_hint" android:maxLines="1" + android:gravity="left" android:inputType="textCapWords" android:imeOptions="flagNoExtractUi" /> @@ -36,7 +37,7 @@ android:indeterminateOnly="true" android:layout_marginRight="@dimen/tiny_gap" android:layout_marginEnd="@dimen/tiny_gap" - android:layout_gravity="center_vertical|right|end" + android:layout_gravity="center_vertical|right" style="?android:progressBarStyleSmall" android:visibility="gone" /> From 5860825a0945f8809572a1f250f14173e3cc997d Mon Sep 17 00:00:00 2001 From: hismaeel Date: Sat, 17 Feb 2018 11:02:35 -0500 Subject: [PATCH 02/96] Issue #1156 --- .../fr/free/nrw/commons/AboutActivity.java | 40 +++++++++++++++++-- .../commons/media/MediaDetailFragment.java | 23 ++++++++++- .../media/MediaDetailPagerFragment.java | 13 +++++- .../notification/NotificationActivity.java | 15 ++++++- 4 files changed, 83 insertions(+), 8 deletions(-) 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 260878b00..7fd96d9bb 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,13 @@ package fr.free.nrw.commons; +import android.annotation.SuppressLint; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.util.Log; import android.view.View; import android.widget.TextView; +import android.widget.Toast; import butterknife.BindView; import butterknife.ButterKnife; @@ -25,12 +28,12 @@ public class AboutActivity extends NavigationBaseActivity { * @param savedInstanceState Data bundle */ @Override + @SuppressLint("StringFormatInvalid") public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ButterKnife.bind(this); - String aboutText = getString(R.string.about_license, getString(R.string.trademarked_name)); aboutLicenseText.setHtmlText(aboutText); @@ -42,12 +45,25 @@ public class AboutActivity extends NavigationBaseActivity { public void launchFacebook(View view) { Intent intent; + try { intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://page/" + "1921335171459985")); intent.setPackage("com.facebook.katana"); startActivity(intent); + } catch (Exception e) { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/" + "1921335171459985"))); + intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/" + "1921335171459985\\")); + //check if web browser available + if(intent.resolveActivity(this.getPackageManager()) != null){ + startActivity(intent); + } else { + CharSequence text = "No app found to open URL"; + int duration = Toast.LENGTH_SHORT; + + Toast toast = Toast.makeText(this, text, duration); + toast.show(); + } + } } @@ -56,13 +72,29 @@ public class AboutActivity extends NavigationBaseActivity { public void launchGithub(View view) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/commons-app/apps-android-commons\\")); - startActivity(browserIntent); + //check if web browser available + if (browserIntent.resolveActivity(this.getPackageManager()) != null) { + startActivity(browserIntent); + } else { + CharSequence text = "No app found to open URL"; + int duration = Toast.LENGTH_SHORT; + Toast toast = Toast.makeText(this, text, duration); + toast.show(); + } } @OnClick(R.id.website_launch_icon) public void launchWebsite(View view) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://commons-app.github.io/\\")); - startActivity(browserIntent); + //check if web browser available + if (browserIntent.resolveActivity(this.getPackageManager()) != null) { + startActivity(browserIntent); + } else { + CharSequence text = "No app found to open URL"; + int duration = Toast.LENGTH_SHORT; + Toast toast = Toast.makeText(this, text, duration); + toast.show(); + } } } \ No newline at end of file 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 60577ead7..96ce8da29 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 @@ -14,6 +14,7 @@ import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; +import android.widget.Toast; import java.io.IOException; import java.text.SimpleDateFormat; @@ -298,7 +299,15 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { Intent viewIntent = new Intent(); viewIntent.setAction(Intent.ACTION_VIEW); viewIntent.setData(new PageTitle(selectedCategoryTitle).getCanonicalUri()); - startActivity(viewIntent); + //check if web browser available + if(viewIntent.resolveActivity(getActivity().getPackageManager()) != null){ + startActivity(viewIntent); + } else { + CharSequence text = "No app found to open URL"; + int duration = Toast.LENGTH_SHORT; + Toast toast = Toast.makeText(getContext(), text, duration); + toast.show(); + } }); } return item; @@ -377,7 +386,17 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { private void openWebBrowser(String url) { Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - startActivity(browser); + //check if web browser available + if(browser.resolveActivity(getActivity().getPackageManager()) != null){ + startActivity(browser); + } else { + CharSequence text = "No app found to open URL"; + int duration = Toast.LENGTH_SHORT; + + Toast toast = Toast.makeText(getContext(), text, duration); + toast.show(); + } + } private void openMap(LatLng coordinates) { diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index d70b515bb..f0e0c635b 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -24,6 +24,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import javax.inject.Inject; import javax.inject.Named; @@ -114,7 +115,17 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple Intent viewIntent = new Intent(); viewIntent.setAction(ACTION_VIEW); viewIntent.setData(m.getFilePageTitle().getMobileUri()); - startActivity(viewIntent); + //check if web browser available + if(viewIntent.resolveActivity(getActivity().getPackageManager()) != null){ + startActivity(viewIntent); + } else { + CharSequence text = "No app found to open URL"; + int duration = Toast.LENGTH_SHORT; + + Toast toast = Toast.makeText(getContext(), text, duration); + toast.show(); + } + return true; case R.id.menu_download_current_image: // Download diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java index c90e61318..20efa40e1 100644 --- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java @@ -7,6 +7,7 @@ import android.net.Uri; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.widget.Toast; import com.pedrogomez.renderers.RVRendererAdapter; @@ -66,10 +67,22 @@ public class NotificationActivity extends NavigationBaseActivity { } private void handleUrl(String url) { + if (url == null || url.equals("")) { return; } - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + + Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + //check if web browser available + if(browser.resolveActivity(this.getPackageManager()) != null){ + startActivity(browser); + } else { + CharSequence text = "No app found to open URL"; + int duration = Toast.LENGTH_SHORT; + Toast toast = Toast.makeText(this, text, duration); + toast.show(); + } + } private void setAdapter(List notificationList) { From 6b63fad4071ba6f299a9032afe98049fc8028204 Mon Sep 17 00:00:00 2001 From: hismaeel Date: Sat, 17 Feb 2018 12:42:57 -0500 Subject: [PATCH 03/96] issue 1130 (b) --- .../java/fr/free/nrw/commons/media/MediaDetailFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 5f41007ff..9b6bf02a1 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 @@ -274,7 +274,9 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { } private void setOnClickListeners(final Media media) { - license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); + if (licenseLink(media) != null) { + license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); + } if (media.getCoordinates() != null) { coordinates.setOnClickListener(v -> openMap(media.getCoordinates())); } From 1132e57feba143e88f1590baeb285a3d855e33a4 Mon Sep 17 00:00:00 2001 From: Hassan Date: Sun, 18 Feb 2018 01:17:55 -0500 Subject: [PATCH 04/96] Reverting 1130(b) Creating separate PR for 1130 --- .../java/fr/free/nrw/commons/media/MediaDetailFragment.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 9b6bf02a1..4437fc9e6 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 @@ -274,9 +274,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { } private void setOnClickListeners(final Media media) { - if (licenseLink(media) != null) { license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); - } if (media.getCoordinates() != null) { coordinates.setOnClickListener(v -> openMap(media.getCoordinates())); } From ce9795cdfa049a93b63b26e989a6f6d3de34442a Mon Sep 17 00:00:00 2001 From: Hassan Date: Sun, 18 Feb 2018 10:37:36 -0500 Subject: [PATCH 05/96] Indent fix --- .../java/fr/free/nrw/commons/media/MediaDetailFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4437fc9e6..5f41007ff 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 @@ -274,7 +274,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { } private void setOnClickListeners(final Media media) { - license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); + license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); if (media.getCoordinates() != null) { coordinates.setOnClickListener(v -> openMap(media.getCoordinates())); } From 88f0e65bcccf8bbf1008199d8e8e4ed76689b862 Mon Sep 17 00:00:00 2001 From: Suchit Kar Date: Tue, 20 Feb 2018 18:35:45 +0530 Subject: [PATCH 06/96] Fix crash while setting Title and Description in RTL languages --- .../commons/upload/SingleUploadFragment.java | 77 +++++++++++++------ 1 file changed, 54 insertions(+), 23 deletions(-) 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 099790495..8343f9861 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 @@ -5,10 +5,12 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; +import android.support.v4.view.ViewCompat; import android.support.v7.app.AlertDialog; import android.text.Editable; import android.text.TextWatcher; @@ -228,35 +230,64 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { */ @OnTouch(R.id.titleEdit) boolean titleInfo(View view, MotionEvent motionEvent) { - //Should replace right with end to support different right-to-left languages as well - final int value = titleEdit.getRight() - titleEdit.getCompoundDrawables()[2].getBounds().width(); - - if (motionEvent.getAction() == ACTION_UP && motionEvent.getRawX() >= value) { - new AlertDialog.Builder(getContext()) - .setTitle(R.string.media_detail_title) - .setMessage(R.string.title_info) - .setCancelable(true) - .setNeutralButton(android.R.string.ok, (dialog, id) -> dialog.cancel()) - .create() - .show(); - return true; + final int value; + if (ViewCompat.getLayoutDirection(getView()) == ViewCompat.LAYOUT_DIRECTION_LTR) { + value = titleEdit.getRight() - titleEdit.getCompoundDrawables()[2].getBounds().width(); + if (motionEvent.getAction() == ACTION_UP && motionEvent.getRawX() >= value) { + new AlertDialog.Builder(getContext()) + .setTitle(R.string.media_detail_title) + .setMessage(R.string.title_info) + .setCancelable(true) + .setNeutralButton(android.R.string.ok, (dialog, id) -> dialog.cancel()) + .create() + .show(); + return true; + } + } + else { + value = titleEdit.getLeft() + titleEdit.getCompoundDrawables()[0].getBounds().width(); + if (motionEvent.getAction() == ACTION_UP && motionEvent.getRawX() <= value) { + new AlertDialog.Builder(getContext()) + .setTitle(R.string.media_detail_title) + .setMessage(R.string.title_info) + .setCancelable(true) + .setNeutralButton(android.R.string.ok, (dialog, id) -> dialog.cancel()) + .create() + .show(); + return true; + } } return false; } @OnTouch(R.id.descEdit) boolean descriptionInfo(View view, MotionEvent motionEvent) { - final int value = descEdit.getRight() - descEdit.getCompoundDrawables()[2].getBounds().width(); - - if (motionEvent.getAction() == ACTION_UP && motionEvent.getRawX() >= value) { - new AlertDialog.Builder(getContext()) - .setTitle(R.string.media_detail_description) - .setMessage(R.string.description_info) - .setCancelable(true) - .setNeutralButton(android.R.string.ok, (dialog, id) -> dialog.cancel()) - .create() - .show(); - return true; + final int value; + if (ViewCompat.getLayoutDirection(getView()) == ViewCompat.LAYOUT_DIRECTION_LTR) { + value = descEdit.getRight() - descEdit.getCompoundDrawables()[2].getBounds().width(); + if (motionEvent.getAction() == ACTION_UP && motionEvent.getRawX() >= value) { + new AlertDialog.Builder(getContext()) + .setTitle(R.string.media_detail_description) + .setMessage(R.string.description_info) + .setCancelable(true) + .setNeutralButton(android.R.string.ok, (dialog, id) -> dialog.cancel()) + .create() + .show(); + return true; + } + } + else{ + value = descEdit.getLeft() + descEdit.getCompoundDrawables()[0].getBounds().width(); + if (motionEvent.getAction() == ACTION_UP && motionEvent.getRawX() <= value) { + new AlertDialog.Builder(getContext()) + .setTitle(R.string.media_detail_description) + .setMessage(R.string.description_info) + .setCancelable(true) + .setNeutralButton(android.R.string.ok, (dialog, id) -> dialog.cancel()) + .create() + .show(); + return true; + } } return false; } From 52a1ed459faed3e4d98455bd45374c4bb2e2757c Mon Sep 17 00:00:00 2001 From: hismaeel Date: Tue, 20 Feb 2018 17:42:25 -0500 Subject: [PATCH 07/96] issue #1130 (b) --- .../java/fr/free/nrw/commons/media/MediaDetailFragment.java | 3 +++ 1 file changed, 3 insertions(+) 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 9b6bf02a1..f582a778e 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 @@ -276,6 +276,9 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { private void setOnClickListeners(final Media media) { if (licenseLink(media) != null) { license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); + } else { + Toast toast = Toast.makeText(getContext(), getString(R.string.description_info), Toast.LENGTH_SHORT); + toast.show(); } if (media.getCoordinates() != null) { coordinates.setOnClickListener(v -> openMap(media.getCoordinates())); From 683eb158125355e27e0e8d17c91075b124140693 Mon Sep 17 00:00:00 2001 From: hismaeel Date: Tue, 20 Feb 2018 17:42:48 -0500 Subject: [PATCH 08/96] issue #1130 (b) --- app/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ceba924e1..fecfff942 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -211,6 +211,7 @@ Send log file Send log file to developers via email Login to your account + URL not found Location has not changed. Location not available. From 979e4076568489fa7e80bf16c2d5999513a8c8d6 Mon Sep 17 00:00:00 2001 From: hismaeel Date: Tue, 20 Feb 2018 18:14:00 -0500 Subject: [PATCH 09/96] issue #1130 (b) --- .../fr/free/nrw/commons/media/MediaDetailFragment.java | 8 +++++++- app/src/main/res/values/strings.xml | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) 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 ecf3cedb1..70bf281dc 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 @@ -14,6 +14,7 @@ import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; +import android.widget.Toast; import java.io.IOException; import java.text.SimpleDateFormat; @@ -273,7 +274,12 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { } private void setOnClickListeners(final Media media) { - license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); + if (licenseLink(media) != null) { + license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); + } else { + Toast toast = Toast.makeText(getContext(), getString(R.string.null_url), Toast.LENGTH_SHORT); + toast.show(); + } if (media.getCoordinates() != null) { coordinates.setOnClickListener(v -> openMap(media.getCoordinates())); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ceba924e1..e7054b232 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -211,6 +211,7 @@ Send log file Send log file to developers via email Login to your account + Error! URL not found Location has not changed. Location not available. From 33f6c5053055232c28d7b886ceec7d6a7bddb04b Mon Sep 17 00:00:00 2001 From: Hassan Date: Tue, 20 Feb 2018 18:58:22 -0500 Subject: [PATCH 10/96] Reverting 1130 Still finding way around VCS :-)) Will make separate PR for 1130 (b) --- .../fr/free/nrw/commons/media/MediaDetailFragment.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index f582a778e..5f41007ff 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 @@ -274,12 +274,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { } private void setOnClickListeners(final Media media) { - if (licenseLink(media) != null) { - license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); - } else { - Toast toast = Toast.makeText(getContext(), getString(R.string.description_info), Toast.LENGTH_SHORT); - toast.show(); - } + license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); if (media.getCoordinates() != null) { coordinates.setOnClickListener(v -> openMap(media.getCoordinates())); } From f9b99f9280d0d09a5d0c46ae7e17ffa3088b025e Mon Sep 17 00:00:00 2001 From: hismaeel Date: Tue, 20 Feb 2018 21:38:22 -0500 Subject: [PATCH 11/96] issue #1156 fix --- .../java/fr/free/nrw/commons/AboutActivity.java | 15 +++++---------- .../nrw/commons/media/MediaDetailFragment.java | 11 ++++------- .../commons/media/MediaDetailPagerFragment.java | 6 ++---- .../notification/NotificationActivity.java | 9 +++------ app/src/main/res/values/strings.xml | 2 +- 5 files changed, 15 insertions(+), 28 deletions(-) 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 46e1441d6..a2635d0dc 100644 --- a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java @@ -15,6 +15,8 @@ import butterknife.OnClick; import fr.free.nrw.commons.theme.NavigationBaseActivity; import fr.free.nrw.commons.ui.widget.HtmlTextView; +import static android.widget.Toast.LENGTH_SHORT; + /** * Represents about screen of this app */ @@ -57,10 +59,7 @@ public class AboutActivity extends NavigationBaseActivity { if(intent.resolveActivity(this.getPackageManager()) != null){ startActivity(intent); } else { - CharSequence text = "No app found to open URL"; - int duration = Toast.LENGTH_SHORT; - - Toast toast = Toast.makeText(this, text, duration); + Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); toast.show(); } @@ -76,9 +75,7 @@ public class AboutActivity extends NavigationBaseActivity { if (browserIntent.resolveActivity(this.getPackageManager()) != null) { startActivity(browserIntent); } else { - CharSequence text = "No app found to open URL"; - int duration = Toast.LENGTH_SHORT; - Toast toast = Toast.makeText(this, text, duration); + Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); toast.show(); } } @@ -91,9 +88,7 @@ public class AboutActivity extends NavigationBaseActivity { if (browserIntent.resolveActivity(this.getPackageManager()) != null) { startActivity(browserIntent); } else { - CharSequence text = "No app found to open URL"; - int duration = Toast.LENGTH_SHORT; - Toast toast = Toast.makeText(this, text, duration); + Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); toast.show(); } } 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 f582a778e..aabfe1c81 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 @@ -37,6 +37,8 @@ import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.ui.widget.CompatTextView; import timber.log.Timber; +import static android.widget.Toast.LENGTH_SHORT; + public class MediaDetailFragment extends CommonsDaggerSupportFragment { private boolean editable; @@ -309,9 +311,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { if(viewIntent.resolveActivity(getActivity().getPackageManager()) != null){ startActivity(viewIntent); } else { - CharSequence text = "No app found to open URL"; - int duration = Toast.LENGTH_SHORT; - Toast toast = Toast.makeText(getContext(), text, duration); + Toast toast = Toast.makeText(getContext(), getString(R.string.no_web_browser), LENGTH_SHORT); toast.show(); } }); @@ -397,10 +397,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { if(browser.resolveActivity(getActivity().getPackageManager()) != null){ startActivity(browser); } else { - CharSequence text = "No app found to open URL"; - int duration = Toast.LENGTH_SHORT; - - Toast toast = Toast.makeText(getContext(), text, duration); + Toast toast = Toast.makeText(getContext(), getString(R.string.no_web_browser), LENGTH_SHORT); toast.show(); } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index d1f4ffd97..be7aea836 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -41,6 +41,7 @@ import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.content.Context.DOWNLOAD_SERVICE; import static android.content.Intent.ACTION_VIEW; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.widget.Toast.LENGTH_SHORT; public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment implements ViewPager.OnPageChangeListener { @@ -123,10 +124,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple if(viewIntent.resolveActivity(getActivity().getPackageManager()) != null){ startActivity(viewIntent); } else { - CharSequence text = "No app found to open URL"; - int duration = Toast.LENGTH_SHORT; - - Toast toast = Toast.makeText(getContext(), text, duration); + Toast toast = Toast.makeText(getContext(), getString(R.string.no_web_browser), LENGTH_SHORT); toast.show(); } diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java index 43e880ba2..39d5252ee 100644 --- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java @@ -24,6 +24,8 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import timber.log.Timber; +import static android.widget.Toast.LENGTH_SHORT; + /** * Created by root on 18.12.2017. */ @@ -65,22 +67,17 @@ public class NotificationActivity extends NavigationBaseActivity { } private void handleUrl(String url) { - if (url == null || url.equals("")) { return; } - Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); //check if web browser available if(browser.resolveActivity(this.getPackageManager()) != null){ startActivity(browser); } else { - CharSequence text = "No app found to open URL"; - int duration = Toast.LENGTH_SHORT; - Toast toast = Toast.makeText(this, text, duration); + Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); toast.show(); } - } private void setAdapter(List notificationList) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fecfff942..9f8f30ccb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -211,7 +211,7 @@ Send log file Send log file to developers via email Login to your account - URL not found + No app found to open URL Location has not changed. Location not available. From f284a00de213c0b46612dabbe16d3bf43f63fbc6 Mon Sep 17 00:00:00 2001 From: Vishan Seru Date: Sun, 15 Oct 2017 10:22:01 +0530 Subject: [PATCH 12/96] Made changes to ensure that when attempting to upload multiple images, the GPS data is extracted and attached correctly. --- .../commons/contributions/Contribution.java | 5 ++ .../fr/free/nrw/commons/upload/FileUtils.java | 41 +++++++++- .../commons/upload/MultipleShareActivity.java | 80 +++++++++++++++++-- 3 files changed, 118 insertions(+), 8 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 00baac847..7861f96de 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 @@ -197,6 +197,10 @@ public class Contribution extends Media { this.localUri = localUri; } + public void setDecimalCoords(String decimalCoords) { + this.decimalCoords = decimalCoords; + } + @NonNull private String licenseTemplateFor(String license) { switch (license) { @@ -215,6 +219,7 @@ public class Contribution extends Media { case Prefs.Licenses.CC_BY_SA: return "{{self|cc-by-sa-3.0}}"; } + throw new RuntimeException("Unrecognized license value: " + license); } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java index 0026a6ce0..3f74dea61 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java @@ -3,21 +3,27 @@ package fr.free.nrw.commons.upload; import android.annotation.SuppressLint; import android.content.ContentUris; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; +import android.os.ParcelFileDescriptor; +import android.preference.PreferenceManager; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; +import java.util.Date; +import fr.free.nrw.commons.CommonsApplication; import timber.log.Timber; public class FileUtils { @@ -85,8 +91,41 @@ public class FileUtils { // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); + } else { + //fetching path may fail depending on the source URI and all hope is lost + //so we will create and use a copy of the file, which seems to work + String copyPath = null; + try { + ParcelFileDescriptor descriptor + = context.getContentResolver().openFileDescriptor(uri, "r"); + if (descriptor != null) { + SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(CommonsApplication.getInstance()); + boolean useExtStorage = sharedPref.getBoolean("useExternalStorage", true); + if (useExtStorage) { + copyPath = Environment.getExternalStorageDirectory().toString() + + "/CommonsApp/" + new Date().getTime() + ".jpg"; + File newFile = new File(Environment.getExternalStorageDirectory().toString() + "/CommonsApp"); + newFile.mkdir(); + FileUtils.copy( + descriptor.getFileDescriptor(), + copyPath); + Timber.d("Filepath (copied): %s", copyPath); + return copyPath; + } + copyPath = context.getCacheDir().getAbsolutePath() + + "/" + new Date().getTime() + ".jpg"; + FileUtils.copy( + descriptor.getFileDescriptor(), + copyPath); + Timber.d("Filepath (copied): %s", copyPath); + return copyPath; + } + } catch (IOException e) { + Timber.w(e, "Error in file " + copyPath); + return null; + } } - return null; } 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 a41938cf7..ac0afa979 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 @@ -11,7 +11,9 @@ import android.database.DataSetObserver; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.ParcelFileDescriptor; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; @@ -21,6 +23,7 @@ import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.Toast; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; @@ -51,11 +54,17 @@ public class MultipleShareActivity extends AuthenticatedActivity MultipleUploadListFragment.OnMultipleUploadInitiatedHandler, OnCategoriesSaveHandler { - @Inject MediaWikiApi mwApi; - @Inject SessionManager sessionManager; - @Inject UploadController uploadController; - @Inject ModifierSequenceDao modifierSequenceDao; - @Inject @Named("default_preferences") SharedPreferences prefs; + @Inject + MediaWikiApi mwApi; + @Inject + SessionManager sessionManager; + @Inject + UploadController uploadController; + @Inject + ModifierSequenceDao modifierSequenceDao; + @Inject + @Named("default_preferences") + SharedPreferences prefs; private ArrayList photosList = null; @@ -63,6 +72,8 @@ public class MultipleShareActivity extends AuthenticatedActivity private MediaDetailPagerFragment mediaDetails; private CategorizationFragment categorizationFragment; + private boolean locationPermitted = false; + @Override public Media getMediaAtPosition(int i) { return photosList.get(i); @@ -207,6 +218,14 @@ public class MultipleShareActivity extends AuthenticatedActivity getSupportFragmentManager().addOnBackStackChangedListener(this); requestAuthToken(); + + //TODO: 15/10/17 should location permission be explicitly requested if not provided? + //check if location permission is enabled + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + locationPermitted = true; + } + } } @Override @@ -240,7 +259,7 @@ public class MultipleShareActivity extends AuthenticatedActivity mwApi.setAuthCookie(authCookie); Intent intent = getIntent(); - if (intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) { + if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { if (photosList == null) { photosList = new ArrayList<>(); ArrayList urisList = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); @@ -252,6 +271,11 @@ public class MultipleShareActivity extends AuthenticatedActivity up.setTag("sequence", i); up.setSource(Contribution.SOURCE_EXTERNAL); up.setMultiple(true); + String imageGpsCoordinates = extractImageGpsData(uri); + if (imageGpsCoordinates != null) { + Timber.d("GPS data for image found!"); + up.setDecimalCoords(imageGpsCoordinates); + } photosList.add(up); } } @@ -278,7 +302,49 @@ public class MultipleShareActivity extends AuthenticatedActivity @Override public void onBackStackChanged() { - getSupportActionBar().setDisplayHomeAsUpEnabled(mediaDetails != null && mediaDetails.isVisible()) ; + getSupportActionBar().setDisplayHomeAsUpEnabled(mediaDetails != null && mediaDetails.isVisible()); } + /** + * Will attempt to extract the gps coordinates using exif data or by using the current + * location if available for the image who's imageUri has been provided. + * @param imageUri The uri of the image who's GPS coordinates data we wish to extract + * @return GPS coordinates as a String as is returned by {@link GPSExtractor} + */ + @Nullable + private String extractImageGpsData(Uri imageUri) { + Timber.d("Entering extractImagesGpsData"); + + if (imageUri == null) { + //now why would you do that??? + return null; + } + + GPSExtractor gpsExtractor = null; + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(imageUri,"r"); + if (fd != null) { + gpsExtractor = new GPSExtractor(fd.getFileDescriptor(),this,prefs); + } + } else { + String filePath = FileUtils.getPath(this,imageUri); + if (filePath != null) { + gpsExtractor = new GPSExtractor(filePath,this,prefs); + } + } + + if (gpsExtractor != null) { + //get image coordinates from exif data or user location + return gpsExtractor.getCoords(locationPermitted); + } + + } catch (FileNotFoundException fnfe) { + Timber.w(fnfe); + return null; + } + + return null; + } } \ No newline at end of file From 370a13b7112c0ecbc4ca604a9cf5d986fe317c20 Mon Sep 17 00:00:00 2001 From: junkiattan Date: Mon, 5 Feb 2018 21:41:10 +0800 Subject: [PATCH 13/96] Resolved xml errors in string tags by inserting false formatted attribute --- .../res/layout/fragment_categorization.xml | 3 +- .../layout/fragment_similar_image_dialog.xml | 57 +++++++++++++++++++ app/src/main/res/values-ast/strings.xml | 4 +- app/src/main/res/values-b+sr+Latn/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 4 +- app/src/main/res/values-da/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values-el/strings.xml | 4 +- app/src/main/res/values-es/strings.xml | 4 +- app/src/main/res/values-fa/strings.xml | 2 +- app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 3 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-is/strings.xml | 2 +- app/src/main/res/values-iw/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-kab/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-lb/strings.xml | 2 +- app/src/main/res/values-mk/strings.xml | 4 +- app/src/main/res/values-mr/strings.xml | 30 +++++----- app/src/main/res/values-nb/strings.xml | 2 +- app/src/main/res/values-pms/strings.xml | 4 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 4 +- app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values-sd/strings.xml | 2 +- app/src/main/res/values-skr/strings.xml | 2 +- app/src/main/res/values-sr/strings.xml | 13 +++-- app/src/main/res/values-su/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-ug/strings.xml | 12 ++-- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 4 +- app/src/main/res/values-zh/strings.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- build.gradle | 2 +- 42 files changed, 154 insertions(+), 62 deletions(-) create mode 100644 app/src/main/res/layout/fragment_similar_image_dialog.xml diff --git a/app/src/main/res/layout/fragment_categorization.xml b/app/src/main/res/layout/fragment_categorization.xml index e49396b37..1c7b0a9f7 100644 --- a/app/src/main/res/layout/fragment_categorization.xml +++ b/app/src/main/res/layout/fragment_categorization.xml @@ -24,7 +24,6 @@ android:layout_width="match_parent" android:hint="@string/categories_search_text_hint" android:maxLines="1" - android:gravity="left" android:inputType="textCapWords" android:imeOptions="flagNoExtractUi" /> @@ -37,7 +36,7 @@ android:indeterminateOnly="true" android:layout_marginRight="@dimen/tiny_gap" android:layout_marginEnd="@dimen/tiny_gap" - android:layout_gravity="center_vertical|right" + android:layout_gravity="center_vertical|end" style="?android:progressBarStyleSmall" android:visibility="gone" /> diff --git a/app/src/main/res/layout/fragment_similar_image_dialog.xml b/app/src/main/res/layout/fragment_similar_image_dialog.xml new file mode 100644 index 000000000..90fec6bcf --- /dev/null +++ b/app/src/main/res/layout/fragment_similar_image_dialog.xml @@ -0,0 +1,57 @@ + + + + + + + + + +