Consistent handling of web and geo urls (#2750)

* Consistent handling of web and geo urls

* Remove Google map intent
This commit is contained in:
Vivek Maskara 2019-03-28 18:23:36 +05:30 committed by Ashish Kumar
parent 7c77530c2e
commit 2021baa080
11 changed files with 59 additions and 105 deletions

View file

@ -1,15 +1,11 @@
package fr.free.nrw.commons; package fr.free.nrw.commons;
import android.content.ActivityNotFoundException;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.browser.customtabs.CustomTabsIntent;
import androidx.core.content.ContextCompat;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
@ -24,7 +20,12 @@ import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; 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.settings.Prefs;
import fr.free.nrw.commons.utils.ViewUtil;
import timber.log.Timber; import timber.log.Timber;
import static android.widget.Toast.LENGTH_SHORT; 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))); context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
} }
catch (android.content.ActivityNotFoundException anfe) { 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); customTabsIntent.launchUrl(context, url);
} }
public static void handleGeoCoordinates(Context context, String coords) { /**
try { * Util function to handle geo coordinates
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=" + coords); * It no longer depends on google maps and any app capable of handling the map intent can handle it
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); * @param context
mapIntent.setPackage("com.google.android.apps.maps"); * @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); context.startActivity(mapIntent);
} catch (ActivityNotFoundException ex) { } else {
Toast toast = Toast.makeText(context, context.getString(R.string.map_application_missing), LENGTH_SHORT); ViewUtil.showShortToast(context, context.getString(R.string.map_application_missing));
toast.show();
} }
} }

View file

@ -1,10 +1,7 @@
package fr.free.nrw.commons.campaigns; package fr.free.nrw.commons.campaigns;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
@ -13,9 +10,12 @@ import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.utils.SwipableCardView; import fr.free.nrw.commons.utils.SwipableCardView;
import fr.free.nrw.commons.utils.ViewUtil; import fr.free.nrw.commons.utils.ViewUtil;
@ -66,21 +66,11 @@ public class CampaignView extends SwipableCardView {
viewHolder = new ViewHolder(rootView); viewHolder = new ViewHolder(rootView);
setOnClickListener(view -> { setOnClickListener(view -> {
if (campaign != null) { 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 { public class ViewHolder {
@BindView(R.id.tv_title) TextView tvTitle; @BindView(R.id.tv_title) TextView tvTitle;

View file

@ -4,32 +4,31 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.database.DataSetObserver; import android.database.DataSetObserver;
import android.os.Bundle; 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.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.Toast;
import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import fr.free.nrw.commons.Media; import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.PageTitle; import fr.free.nrw.commons.PageTitle;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.explore.ViewPagerAdapter; import fr.free.nrw.commons.explore.ViewPagerAdapter;
import fr.free.nrw.commons.media.MediaDetailPagerFragment; import fr.free.nrw.commons.media.MediaDetailPagerFragment;
import fr.free.nrw.commons.theme.NavigationBaseActivity; import fr.free.nrw.commons.theme.NavigationBaseActivity;
import static android.widget.Toast.LENGTH_SHORT;
/** /**
* This activity displays details of a particular category * 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 * 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 // Handle item selection
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.menu_browser_current_category: case R.id.menu_browser_current_category:
Intent viewIntent = new Intent(); Utils.handleWebUrl(this, new PageTitle(categoryName).getCanonicalUri());
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();
}
return true; return true;
default: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);

View file

@ -4,6 +4,7 @@ import android.location.Location;
import android.net.Uri; import android.net.Uri;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
/** /**

View file

@ -10,7 +10,6 @@ import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.Html; import android.text.Html;
import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.LayoutInflater; 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.DeleteTask;
import fr.free.nrw.commons.delete.ReasonBuilder; import fr.free.nrw.commons.delete.ReasonBuilder;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; 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.mwapi.MediaWikiApi;
import fr.free.nrw.commons.ui.widget.CompatTextView; import fr.free.nrw.commons.ui.widget.CompatTextView;
import fr.free.nrw.commons.utils.DateUtils; import fr.free.nrw.commons.utils.DateUtils;
import fr.free.nrw.commons.utils.StringUtils;
import io.reactivex.Single; import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
@ -62,7 +61,6 @@ import timber.log.Timber;
import static android.view.View.GONE; import static android.view.View.GONE;
import static android.view.View.VISIBLE; import static android.view.View.VISIBLE;
import static android.widget.Toast.LENGTH_SHORT;
public class MediaDetailFragment extends CommonsDaggerSupportFragment { public class MediaDetailFragment extends CommonsDaggerSupportFragment {
@ -371,8 +369,9 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
@OnClick(R.id.mediaDetailLicense) @OnClick(R.id.mediaDetailLicense)
public void onMediaDetailLicenceClicked(){ public void onMediaDetailLicenceClicked(){
if (!TextUtils.isEmpty(licenseLink(media))) { String url = licenseLink(media);
openWebBrowser(licenseLink(media)); if (!StringUtils.isNullOrWhiteSpace(url) && getActivity() != null) {
Utils.handleWebUrl(getActivity(), Uri.parse(url));
} else { } else {
if (isCategoryImage) { if (isCategoryImage) {
Timber.d("Unable to fetch license URL for %s", media.getLicense()); Timber.d("Unable to fetch license URL for %s", media.getLicense());
@ -385,8 +384,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
@OnClick(R.id.mediaDetailCoordinates) @OnClick(R.id.mediaDetailCoordinates)
public void onMediaDetailCoordinatesClicked(){ public void onMediaDetailCoordinatesClicked(){
if (media.getCoordinates() != null) { if (media.getCoordinates() != null && getActivity() != null) {
openMap(media.getCoordinates()); Utils.handleGeoCoordinates(getActivity(), media.getCoordinates());
} }
} }
@ -484,8 +483,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
@OnClick(R.id.seeMore) @OnClick(R.id.seeMore)
public void onSeeMoreClicked(){ public void onSeeMoreClicked(){
if (nominatedForDeletion.getVisibility()== VISIBLE) { if (nominatedForDeletion.getVisibility() == VISIBLE && getActivity() != null) {
openWebBrowser(media.getFilePageTitle().getMobileUri().toString()); 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);
}
}
} }

View file

@ -9,13 +9,6 @@ import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.os.Handler; 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.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -24,9 +17,17 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.material.snackbar.Snackbar;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; 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.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import fr.free.nrw.commons.Media; import fr.free.nrw.commons.Media;

View file

@ -847,13 +847,7 @@ public class NearbyMapFragment extends DaggerFragment {
wikidataButton.setVisibility(place.hasWikidataLink()?View.VISIBLE:View.GONE); wikidataButton.setVisibility(place.hasWikidataLink()?View.VISIBLE:View.GONE);
wikidataButton.setOnClickListener(view -> openWebView(this.place.siteLinks.getWikidataLink())); wikidataButton.setOnClickListener(view -> openWebView(this.place.siteLinks.getWikidataLink()));
directionsButton.setOnClickListener(view -> { directionsButton.setOnClickListener(view -> Utils.handleGeoCoordinates(getActivity(), this.place.getLocation()));
//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);
}
});
commonsButton.setVisibility(this.place.hasCommonsLink()?View.VISIBLE:View.GONE); commonsButton.setVisibility(this.place.hasCommonsLink()?View.VISIBLE:View.GONE);
commonsButton.setOnClickListener(view -> openWebView(this.place.siteLinks.getCommonsLink())); commonsButton.setOnClickListener(view -> openWebView(this.place.siteLinks.getCommonsLink()));

View file

@ -2,12 +2,6 @@ package fr.free.nrw.commons.nearby;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; 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.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -24,6 +18,12 @@ import java.util.ArrayList;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; 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.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
@ -223,13 +223,7 @@ public class PlaceRenderer extends Renderer<Place> {
icon.setImageResource(place.getLabel().getIcon()); icon.setImageResource(place.getLabel().getIcon());
directionsButton.setOnClickListener(view -> { directionsButton.setOnClickListener(view -> Utils.handleGeoCoordinates(getContext(), this.place.getLocation()));
//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);
}
});
iconOverflow.setVisibility(showMenu() ? View.VISIBLE : View.GONE); iconOverflow.setVisibility(showMenu() ? View.VISIBLE : View.GONE);
iconOverflow.setOnClickListener(v -> popupMenuListener()); iconOverflow.setOnClickListener(v -> popupMenuListener());

View file

@ -57,6 +57,7 @@ import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionController; import fr.free.nrw.commons.contributions.ContributionController;
import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.filepicker.UploadableFile;
import fr.free.nrw.commons.kvstore.JsonKvStore; 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.mwapi.MediaWikiApi;
import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.theme.BaseActivity; import fr.free.nrw.commons.theme.BaseActivity;
@ -415,7 +416,7 @@ public class UploadActivity extends BaseActivity implements UploadView, SimilarI
} }
@Override @Override
public void launchMapActivity(String decCoords) { public void launchMapActivity(LatLng decCoords) {
Utils.handleGeoCoordinates(this, decCoords); Utils.handleGeoCoordinates(this, decCoords);
} }

View file

@ -7,6 +7,7 @@ import fr.free.nrw.commons.category.CategoriesModel;
import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.filepicker.UploadableFile;
import fr.free.nrw.commons.kvstore.JsonKvStore; 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.nearby.Place;
import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.settings.Prefs;
import fr.free.nrw.commons.utils.CustomProxy; import fr.free.nrw.commons.utils.CustomProxy;
@ -225,7 +226,7 @@ public class UploadPresenter {
void openCoordinateMap() { void openCoordinateMap() {
GPSExtractor gpsObj = uploadModel.getCurrentItem().getGpsCoords(); GPSExtractor gpsObj = uploadModel.getCurrentItem().getGpsCoords();
if (gpsObj != null && gpsObj.imageCoordsExists) { if (gpsObj != null && gpsObj.imageCoordsExists) {
view.launchMapActivity(gpsObj.getDecLatitude() + "," + gpsObj.getDecLongitude()); view.launchMapActivity(new LatLng(gpsObj.getDecLatitude(), gpsObj.getDecLongitude(), 0.0f));
} }
} }

View file

@ -2,6 +2,7 @@ package fr.free.nrw.commons.upload;
import android.net.Uri; import android.net.Uri;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import fr.free.nrw.commons.location.LatLng;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.util.List; import java.util.List;
@ -70,7 +71,7 @@ public interface UploadView {
void finish(); void finish();
void launchMapActivity(String decCoords); void launchMapActivity(LatLng decCoords);
void showErrorMessage(int resourceId); void showErrorMessage(int resourceId);