diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index e37b5ab36..24265da61 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -64,6 +64,9 @@
+
+
+
diff --git a/src/main/java/eu/siacs/conversations/ui/ShowLocationActivity.java b/src/main/java/eu/siacs/conversations/ui/ShowLocationActivity.java
index 43c55de49..d4b6a2e30 100644
--- a/src/main/java/eu/siacs/conversations/ui/ShowLocationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ShowLocationActivity.java
@@ -3,8 +3,8 @@ package eu.siacs.conversations.ui;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ClipboardManager;
-import android.content.ComponentName;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
import android.location.Location;
import android.location.LocationListener;
import android.net.Uri;
@@ -17,6 +17,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
+import org.jetbrains.annotations.NotNull;
import org.osmdroid.util.GeoPoint;
import java.util.HashMap;
@@ -32,198 +33,214 @@ import eu.siacs.conversations.ui.widget.Marker;
import eu.siacs.conversations.ui.widget.MyLocation;
import eu.siacs.conversations.utils.LocationProvider;
-
public class ShowLocationActivity extends LocationActivity implements LocationListener {
- private GeoPoint loc = LocationProvider.FALLBACK;
- private ActivityShowLocationBinding binding;
+ private GeoPoint loc = LocationProvider.FALLBACK;
+ private ActivityShowLocationBinding binding;
+ private Uri createGeoUri() {
+ return Uri.parse("geo:" + this.loc.getLatitude() + "," + this.loc.getLongitude());
+ }
- private Uri createGeoUri() {
- return Uri.parse("geo:" + this.loc.getLatitude() + "," + this.loc.getLongitude());
- }
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ this.binding = DataBindingUtil.setContentView(this, R.layout.activity_show_location);
+ setSupportActionBar(binding.toolbar);
- this.binding = DataBindingUtil.setContentView(this,R.layout.activity_show_location);
- setSupportActionBar(binding.toolbar);
+ configureActionBar(getSupportActionBar());
+ setupMapView(this.binding.map, this.loc);
- configureActionBar(getSupportActionBar());
- setupMapView(this.binding.map, this.loc);
+ this.binding.fab.setOnClickListener(view -> startNavigation());
- this.binding.fab.setOnClickListener(view -> startNavigation());
+ final Intent intent = getIntent();
+ if (intent != null) {
+ final String action = intent.getAction();
+ if (action == null) {
+ return;
+ }
+ switch (action) {
+ case "eu.siacs.conversations.location.show":
+ if (intent.hasExtra("longitude") && intent.hasExtra("latitude")) {
+ final double longitude = intent.getDoubleExtra("longitude", 0);
+ final double latitude = intent.getDoubleExtra("latitude", 0);
+ this.loc = new GeoPoint(latitude, longitude);
+ }
+ break;
+ case Intent.ACTION_VIEW:
+ final Uri geoUri = intent.getData();
- final Intent intent = getIntent();
- if (intent != null) {
- final String action = intent.getAction();
- if (action == null) {
- return;
- }
- switch (action) {
- case "eu.siacs.conversations.location.show":
- if (intent.hasExtra("longitude") && intent.hasExtra("latitude")) {
- final double longitude = intent.getDoubleExtra("longitude", 0);
- final double latitude = intent.getDoubleExtra("latitude", 0);
- this.loc = new GeoPoint(latitude, longitude);
- }
- break;
- case Intent.ACTION_VIEW:
- final Uri geoUri = intent.getData();
+ // Attempt to set zoom level if the geo URI specifies it
+ if (geoUri != null) {
+ final HashMap query =
+ UriHelper.parseQueryString(geoUri.getQuery());
- // Attempt to set zoom level if the geo URI specifies it
- if (geoUri != null) {
- final HashMap query = UriHelper.parseQueryString(geoUri.getQuery());
+ // Check for zoom level.
+ final String z = query.get("z");
+ if (z != null) {
+ try {
+ mapController.setZoom(Double.valueOf(z));
+ } catch (final Exception ignored) {
+ }
+ }
- // Check for zoom level.
- final String z = query.get("z");
- if (z != null) {
- try {
- mapController.setZoom(Double.valueOf(z));
- } catch (final Exception ignored) {
- }
- }
+ // Check for the actual geo query.
+ boolean posInQuery = false;
+ final String q = query.get("q");
+ if (q != null) {
+ final Pattern latlng =
+ Pattern.compile(
+ "/^([-+]?[0-9]+(\\.[0-9]+)?),([-+]?[0-9]+(\\.[0-9]+)?)(\\(.*\\))?/");
+ final Matcher m = latlng.matcher(q);
+ if (m.matches()) {
+ try {
+ this.loc =
+ new GeoPoint(
+ Double.valueOf(m.group(1)),
+ Double.valueOf(m.group(3)));
+ posInQuery = true;
+ } catch (final Exception ignored) {
+ }
+ }
+ }
- // Check for the actual geo query.
- boolean posInQuery = false;
- final String q = query.get("q");
- if (q != null) {
- final Pattern latlng = Pattern.compile("/^([-+]?[0-9]+(\\.[0-9]+)?),([-+]?[0-9]+(\\.[0-9]+)?)(\\(.*\\))?/");
- final Matcher m = latlng.matcher(q);
- if (m.matches()) {
- try {
- this.loc = new GeoPoint(Double.valueOf(m.group(1)), Double.valueOf(m.group(3)));
- posInQuery = true;
- } catch (final Exception ignored) {
- }
- }
- }
+ final String schemeSpecificPart = geoUri.getSchemeSpecificPart();
+ if (schemeSpecificPart != null && !schemeSpecificPart.isEmpty()) {
+ try {
+ final GeoPoint latlong =
+ LocationHelper.parseLatLong(schemeSpecificPart);
+ if (latlong != null && !posInQuery) {
+ this.loc = latlong;
+ }
+ } catch (final NumberFormatException ignored) {
+ }
+ }
+ }
- final String schemeSpecificPart = geoUri.getSchemeSpecificPart();
- if (schemeSpecificPart != null && !schemeSpecificPart.isEmpty()) {
- try {
- final GeoPoint latlong = LocationHelper.parseLatLong(schemeSpecificPart);
- if (latlong != null && !posInQuery) {
- this.loc = latlong;
- }
- } catch (final NumberFormatException ignored) {
- }
- }
- }
+ break;
+ }
+ updateLocationMarkers();
+ }
+ }
- break;
- }
- updateLocationMarkers();
- }
- }
+ @Override
+ protected void gotoLoc(final boolean setZoomLevel) {
+ if (this.loc != null && mapController != null) {
+ if (setZoomLevel) {
+ mapController.setZoom(Config.Map.FINAL_ZOOM_LEVEL);
+ }
+ mapController.animateTo(new GeoPoint(this.loc));
+ }
+ }
- @Override
- protected void gotoLoc(final boolean setZoomLevel) {
- if (this.loc != null && mapController != null) {
- if (setZoomLevel) {
- mapController.setZoom(Config.Map.FINAL_ZOOM_LEVEL);
- }
- mapController.animateTo(new GeoPoint(this.loc));
- }
- }
+ @Override
+ public void onRequestPermissionsResult(
+ final int requestCode,
+ @NonNull final String[] permissions,
+ @NonNull final int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ updateUi();
+ }
- @Override
- public void onRequestPermissionsResult(final int requestCode,
- @NonNull final String[] permissions,
- @NonNull final int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- updateUi();
- }
+ @Override
+ protected void setMyLoc(final Location location) {
+ this.myLoc = location;
+ }
- @Override
- protected void setMyLoc(final Location location) {
- this.myLoc = location;
- }
+ @Override
+ public boolean onCreateOptionsMenu(@NotNull final Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_show_location, menu);
+ updateUi();
+ return true;
+ }
- @Override
- public boolean onCreateOptionsMenu(final Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_show_location, menu);
- updateUi();
- return true;
- }
+ @Override
+ protected void updateLocationMarkers() {
+ super.updateLocationMarkers();
+ if (this.myLoc != null) {
+ this.binding.map.getOverlays().add(new MyLocation(this, null, this.myLoc));
+ }
+ this.binding.map.getOverlays().add(new Marker(this.marker_icon, this.loc));
+ }
- @Override
- protected void updateLocationMarkers() {
- super.updateLocationMarkers();
- if (this.myLoc != null) {
- this.binding.map.getOverlays().add(new MyLocation(this, null, this.myLoc));
- }
- this.binding.map.getOverlays().add(new Marker(this.marker_icon, this.loc));
- }
+ @Override
+ protected void onPause() {
+ super.onPause();
+ }
- @Override
- protected void onPause() {
- super.onPause();
- }
+ @Override
+ public boolean onOptionsItemSelected(final MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_copy_location:
+ final ClipboardManager clipboard =
+ (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
+ if (clipboard != null) {
+ final ClipData clip =
+ ClipData.newPlainText("location", createGeoUri().toString());
+ clipboard.setPrimaryClip(clip);
+ Toast.makeText(this, R.string.url_copied_to_clipboard, Toast.LENGTH_SHORT)
+ .show();
+ }
+ return true;
+ case R.id.action_share_location:
+ final Intent shareIntent = new Intent();
+ shareIntent.setAction(Intent.ACTION_SEND);
+ shareIntent.putExtra(Intent.EXTRA_TEXT, createGeoUri().toString());
+ shareIntent.setType("text/plain");
+ try {
+ startActivity(Intent.createChooser(shareIntent, getText(R.string.share_with)));
+ } catch (final ActivityNotFoundException e) {
+ // This should happen only on faulty androids because normally chooser is always
+ // available
+ Toast.makeText(
+ this,
+ R.string.no_application_found_to_open_file,
+ Toast.LENGTH_SHORT)
+ .show();
+ }
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
- @Override
- public boolean onOptionsItemSelected(final MenuItem item) {
- switch (item.getItemId()) {
- case R.id.action_copy_location:
- final ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
- if (clipboard != null) {
- final ClipData clip = ClipData.newPlainText("location", createGeoUri().toString());
- clipboard.setPrimaryClip(clip);
- Toast.makeText(this,R.string.url_copied_to_clipboard,Toast.LENGTH_SHORT).show();
- }
- return true;
- case R.id.action_share_location:
- final Intent shareIntent = new Intent();
- shareIntent.setAction(Intent.ACTION_SEND);
- shareIntent.putExtra(Intent.EXTRA_TEXT, createGeoUri().toString());
- shareIntent.setType("text/plain");
- try {
- startActivity(Intent.createChooser(shareIntent, getText(R.string.share_with)));
- } catch (final ActivityNotFoundException e) {
- //This should happen only on faulty androids because normally chooser is always available
- Toast.makeText(this, R.string.no_application_found_to_open_file, Toast.LENGTH_SHORT).show();
- }
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
+ private void startNavigation() {
+ final Intent intent = getStartNavigationIntent();
+ startActivity(intent);
+ }
- private void startNavigation() {
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(
- "google.navigation:q=" +
- this.loc.getLatitude() + "," + this.loc.getLongitude()
- )));
- }
+ private Intent getStartNavigationIntent() {
+ return new Intent(
+ Intent.ACTION_VIEW,
+ Uri.parse(
+ "google.navigation:q="
+ + this.loc.getLatitude()
+ + ","
+ + this.loc.getLongitude()));
+ }
- @Override
- protected void updateUi() {
- final Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=0,0"));
- final ComponentName component = i.resolveActivity(getPackageManager());
- this.binding.fab.setVisibility(component == null ? View.GONE : View.VISIBLE);
- }
+ @Override
+ protected void updateUi() {
+ final Intent intent = getStartNavigationIntent();
+ final ActivityInfo activityInfo = intent.resolveActivityInfo(getPackageManager(), 0);
+ this.binding.fab.setVisibility(activityInfo == null ? View.GONE : View.VISIBLE);
+ }
- @Override
- public void onLocationChanged(final Location location) {
- if (LocationHelper.isBetterLocation(location, this.myLoc)) {
- this.myLoc = location;
- updateLocationMarkers();
- }
- }
+ @Override
+ public void onLocationChanged(@NotNull final Location location) {
+ if (LocationHelper.isBetterLocation(location, this.myLoc)) {
+ this.myLoc = location;
+ updateLocationMarkers();
+ }
+ }
- @Override
- public void onStatusChanged(final String provider, final int status, final Bundle extras) {
+ @Override
+ public void onStatusChanged(final String provider, final int status, final Bundle extras) {}
- }
+ @Override
+ public void onProviderEnabled(@NotNull final String provider) {}
- @Override
- public void onProviderEnabled(final String provider) {
-
- }
-
- @Override
- public void onProviderDisabled(final String provider) {
-
- }
+ @Override
+ public void onProviderDisabled(@NotNull final String provider) {}
}