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 f0dfee9e7..01b50137f 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -1,15 +1,11 @@ package fr.free.nrw.commons; -import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; -import androidx.annotation.NonNull; -import androidx.browser.customtabs.CustomTabsIntent; -import androidx.core.content.ContextCompat; import android.view.View; import android.widget.Toast; @@ -24,7 +20,12 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import androidx.annotation.NonNull; +import androidx.browser.customtabs.CustomTabsIntent; +import androidx.core.content.ContextCompat; +import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.settings.Prefs; +import fr.free.nrw.commons.utils.ViewUtil; import timber.log.Timber; import static android.widget.Toast.LENGTH_SHORT; @@ -175,7 +176,7 @@ public class Utils { context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName))); } catch (android.content.ActivityNotFoundException anfe) { - context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName))); + handleWebUrl(context, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)); } } @@ -204,15 +205,18 @@ public class Utils { customTabsIntent.launchUrl(context, url); } - public static void handleGeoCoordinates(Context context, String coords) { - try { - Uri gmmIntentUri = Uri.parse("google.streetview:cbll=" + coords); - Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); - mapIntent.setPackage("com.google.android.apps.maps"); + /** + * Util function to handle geo coordinates + * It no longer depends on google maps and any app capable of handling the map intent can handle it + * @param context + * @param latLng + */ + public static void handleGeoCoordinates(Context context, LatLng latLng) { + Intent mapIntent = new Intent(Intent.ACTION_VIEW, latLng.getGmmIntentUri()); + if (mapIntent.resolveActivity(context.getPackageManager()) != null) { context.startActivity(mapIntent); - } catch (ActivityNotFoundException ex) { - Toast toast = Toast.makeText(context, context.getString(R.string.map_application_missing), LENGTH_SHORT); - toast.show(); + } else { + ViewUtil.showShortToast(context, context.getString(R.string.map_application_missing)); } } diff --git a/app/src/main/java/fr/free/nrw/commons/campaigns/CampaignView.java b/app/src/main/java/fr/free/nrw/commons/campaigns/CampaignView.java index 87be56132..122581a54 100644 --- a/app/src/main/java/fr/free/nrw/commons/campaigns/CampaignView.java +++ b/app/src/main/java/fr/free/nrw/commons/campaigns/CampaignView.java @@ -1,10 +1,7 @@ package fr.free.nrw.commons.campaigns; import android.content.Context; -import android.content.Intent; import android.net.Uri; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import android.widget.TextView; @@ -13,9 +10,12 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.utils.SwipableCardView; import fr.free.nrw.commons.utils.ViewUtil; @@ -66,21 +66,11 @@ public class CampaignView extends SwipableCardView { viewHolder = new ViewHolder(rootView); setOnClickListener(view -> { if (campaign != null) { - showCampaignInBrowser(campaign.getLink()); + Utils.handleWebUrl(getContext(), Uri.parse(campaign.getLink())); } }); } - /** - * open the url associated with the campaign in the system's default browser - */ - private void showCampaignInBrowser(String link) { - Intent view = new Intent(); - view.setAction(Intent.ACTION_VIEW); - view.setData(Uri.parse(link)); - getContext().startActivity(view); - } - public class ViewHolder { @BindView(R.id.tv_title) TextView tvTitle; diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java index 325e470f3..fa319689c 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java @@ -4,32 +4,31 @@ import android.content.Context; import android.content.Intent; import android.database.DataSetObserver; import android.os.Bundle; -import com.google.android.material.tabs.TabLayout; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.viewpager.widget.ViewPager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.FrameLayout; -import android.widget.Toast; + +import com.google.android.material.tabs.TabLayout; import java.util.ArrayList; import java.util.List; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.viewpager.widget.ViewPager; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.PageTitle; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.explore.ViewPagerAdapter; import fr.free.nrw.commons.media.MediaDetailPagerFragment; import fr.free.nrw.commons.theme.NavigationBaseActivity; -import static android.widget.Toast.LENGTH_SHORT; - /** * This activity displays details of a particular category * Its generic and simply takes the name of category name in its start intent to load all images, subcategories in @@ -220,16 +219,7 @@ public class CategoryDetailsActivity extends NavigationBaseActivity // Handle item selection switch (item.getItemId()) { case R.id.menu_browser_current_category: - Intent viewIntent = new Intent(); - viewIntent.setAction(Intent.ACTION_VIEW); - viewIntent.setData(new PageTitle(categoryName).getCanonicalUri()); - //check if web browser available - if (viewIntent.resolveActivity(this.getPackageManager()) != null) { - startActivity(viewIntent); - } else { - Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); - toast.show(); - } + Utils.handleWebUrl(this, new PageTitle(categoryName).getCanonicalUri()); return true; default: return super.onOptionsItemSelected(item); 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 99cbfb375..5a378b803 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 @@ -4,6 +4,7 @@ import android.location.Location; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; + import androidx.annotation.NonNull; /** 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 5e177c685..1533fd0e7 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 @@ -10,7 +10,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; import android.text.Html; -import android.text.TextUtils; import android.text.TextWatcher; import android.util.TypedValue; import android.view.LayoutInflater; @@ -51,10 +50,10 @@ import fr.free.nrw.commons.contributions.ContributionsFragment; import fr.free.nrw.commons.delete.DeleteTask; import fr.free.nrw.commons.delete.ReasonBuilder; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; -import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.ui.widget.CompatTextView; import fr.free.nrw.commons.utils.DateUtils; +import fr.free.nrw.commons.utils.StringUtils; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -62,7 +61,6 @@ import timber.log.Timber; import static android.view.View.GONE; import static android.view.View.VISIBLE; -import static android.widget.Toast.LENGTH_SHORT; public class MediaDetailFragment extends CommonsDaggerSupportFragment { @@ -371,8 +369,9 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { @OnClick(R.id.mediaDetailLicense) public void onMediaDetailLicenceClicked(){ - if (!TextUtils.isEmpty(licenseLink(media))) { - openWebBrowser(licenseLink(media)); + String url = licenseLink(media); + if (!StringUtils.isNullOrWhiteSpace(url) && getActivity() != null) { + Utils.handleWebUrl(getActivity(), Uri.parse(url)); } else { if (isCategoryImage) { Timber.d("Unable to fetch license URL for %s", media.getLicense()); @@ -385,8 +384,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { @OnClick(R.id.mediaDetailCoordinates) public void onMediaDetailCoordinatesClicked(){ - if (media.getCoordinates() != null) { - openMap(media.getCoordinates()); + if (media.getCoordinates() != null && getActivity() != null) { + Utils.handleGeoCoordinates(getActivity(), media.getCoordinates()); } } @@ -484,8 +483,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { @OnClick(R.id.seeMore) public void onSeeMoreClicked(){ - if (nominatedForDeletion.getVisibility()== VISIBLE) { - openWebBrowser(media.getFilePageTitle().getMobileUri().toString()); + if (nominatedForDeletion.getVisibility() == VISIBLE && getActivity() != null) { + Utils.handleWebUrl(getActivity(), media.getFilePageTitle().getMobileUri()); } } @@ -623,26 +622,4 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { } } - private void openWebBrowser(String url) { - Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - //check if web browser available - if (browser.resolveActivity(getActivity().getPackageManager()) != null) { - startActivity(browser); - } else { - Toast toast = Toast.makeText(getContext(), getString(R.string.no_web_browser), LENGTH_SHORT); - toast.show(); - } - - } - - private void openMap(LatLng coordinates) { - //Open map app at given position - Uri gmmIntentUri = Uri.parse( - "geo:0,0?q=" + coordinates.getLatitude() + "," + coordinates.getLongitude()); - Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); - - if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { - startActivity(mapIntent); - } - } } 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 99ad96abe..77cc9917e 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 @@ -9,13 +9,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; -import com.google.android.material.snackbar.Snackbar; -import androidx.core.app.ActivityCompat; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import androidx.core.content.ContextCompat; -import androidx.viewpager.widget.ViewPager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -24,9 +17,17 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; +import com.google.android.material.snackbar.Snackbar; + import javax.inject.Inject; import javax.inject.Named; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.ViewPager; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.Media; 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 0b15d703a..fc17ae7f5 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 @@ -847,13 +847,7 @@ public class NearbyMapFragment extends DaggerFragment { wikidataButton.setVisibility(place.hasWikidataLink()?View.VISIBLE:View.GONE); wikidataButton.setOnClickListener(view -> openWebView(this.place.siteLinks.getWikidataLink())); - directionsButton.setOnClickListener(view -> { - //Open map app at given position - Intent mapIntent = new Intent(Intent.ACTION_VIEW, this.place.location.getGmmIntentUri()); - if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { - startActivity(mapIntent); - } - }); + directionsButton.setOnClickListener(view -> Utils.handleGeoCoordinates(getActivity(), this.place.getLocation())); commonsButton.setVisibility(this.place.hasCommonsLink()?View.VISIBLE:View.GONE); commonsButton.setOnClickListener(view -> openWebView(this.place.siteLinks.getCommonsLink())); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java b/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java index e0fffd717..3d45b080f 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java @@ -2,12 +2,6 @@ package fr.free.nrw.commons.nearby; import android.content.Intent; import android.net.Uri; -import androidx.transition.TransitionManager; -import androidx.fragment.app.Fragment; -import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.appcompat.widget.PopupMenu; -import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -24,6 +18,12 @@ import java.util.ArrayList; import javax.inject.Inject; import javax.inject.Named; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.transition.TransitionManager; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.R; @@ -223,13 +223,7 @@ public class PlaceRenderer extends Renderer { icon.setImageResource(place.getLabel().getIcon()); - directionsButton.setOnClickListener(view -> { - //Open map app at given position - Intent mapIntent = new Intent(Intent.ACTION_VIEW, place.location.getGmmIntentUri()); - if (mapIntent.resolveActivity(view.getContext().getPackageManager()) != null) { - view.getContext().startActivity(mapIntent); - } - }); + directionsButton.setOnClickListener(view -> Utils.handleGeoCoordinates(getContext(), this.place.getLocation())); iconOverflow.setVisibility(showMenu() ? View.VISIBLE : View.GONE); iconOverflow.setOnClickListener(v -> popupMenuListener()); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java index 4f6b4f056..7ef5717ab 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java @@ -57,6 +57,7 @@ import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.ContributionController; import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.kvstore.JsonKvStore; +import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.theme.BaseActivity; @@ -415,7 +416,7 @@ public class UploadActivity extends BaseActivity implements UploadView, SimilarI } @Override - public void launchMapActivity(String decCoords) { + public void launchMapActivity(LatLng decCoords) { Utils.handleGeoCoordinates(this, decCoords); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java index 49008c4fa..9ddf3ecf1 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java @@ -7,6 +7,7 @@ import fr.free.nrw.commons.category.CategoriesModel; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.kvstore.JsonKvStore; +import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.utils.CustomProxy; @@ -225,7 +226,7 @@ public class UploadPresenter { void openCoordinateMap() { GPSExtractor gpsObj = uploadModel.getCurrentItem().getGpsCoords(); if (gpsObj != null && gpsObj.imageCoordsExists) { - view.launchMapActivity(gpsObj.getDecLatitude() + "," + gpsObj.getDecLongitude()); + view.launchMapActivity(new LatLng(gpsObj.getDecLatitude(), gpsObj.getDecLongitude(), 0.0f)); } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadView.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadView.java index dff659474..9fb50c7ca 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadView.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadView.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.upload; import android.net.Uri; import androidx.annotation.IntDef; +import fr.free.nrw.commons.location.LatLng; import java.lang.annotation.Retention; import java.util.List; @@ -70,7 +71,7 @@ public interface UploadView { void finish(); - void launchMapActivity(String decCoords); + void launchMapActivity(LatLng decCoords); void showErrorMessage(int resourceId);