1package eu.siacs.conversations.utils;
2
3import android.content.Intent;
4import android.net.Uri;
5
6import java.io.UnsupportedEncodingException;
7import java.net.URLEncoder;
8import java.util.ArrayList;
9import java.util.regex.Matcher;
10import java.util.regex.Pattern;
11
12import eu.siacs.conversations.entities.Contact;
13import eu.siacs.conversations.entities.Conversation;
14import eu.siacs.conversations.entities.Message;
15
16public class GeoHelper {
17 public static Pattern GEO_URI = Pattern.compile("geo:([\\-0-9.]+),([\\-0-9.]+)(?:,([\\-0-9.]+))?(?:\\?(.*))?", Pattern.CASE_INSENSITIVE);
18
19 public static boolean isGeoUri(String body) {
20 return body != null && GEO_URI.matcher(body).matches();
21 }
22
23 public static ArrayList<Intent> createGeoIntentsFromMessage(Message message) {
24 final ArrayList<Intent> intents = new ArrayList<>();
25 Matcher matcher = GEO_URI.matcher(message.getBody());
26 if (!matcher.matches()) {
27 return intents;
28 }
29 double latitude;
30 double longitude;
31 try {
32 latitude = Double.parseDouble(matcher.group(1));
33 if (latitude > 90.0 || latitude < -90.0) {
34 return intents;
35 }
36 longitude = Double.parseDouble(matcher.group(2));
37 if (longitude > 180.0 || longitude < -180.0) {
38 return intents;
39 }
40 } catch (NumberFormatException nfe) {
41 return intents;
42 }
43 final Conversation conversation = message.getConversation();
44 String label;
45 if (conversation.getMode() == Conversation.MODE_SINGLE && message.getStatus() == Message.STATUS_RECEIVED) {
46 try {
47 label = "(" + URLEncoder.encode(message.getConversation().getName(), "UTF-8") + ")";
48 } catch (UnsupportedEncodingException e) {
49 label = "";
50 }
51 } else {
52 label = "";
53 }
54
55 Intent locationPluginIntent = new Intent("eu.siacs.conversations.location.show");
56 locationPluginIntent.putExtra("latitude",latitude);
57 locationPluginIntent.putExtra("longitude",longitude);
58 if (message.getStatus() != Message.STATUS_RECEIVED) {
59 locationPluginIntent.putExtra("jid",conversation.getAccount().getJid().toString());
60 locationPluginIntent.putExtra("name",conversation.getAccount().getJid().getLocalpart());
61 } else {
62 Contact contact = message.getContact();
63 if (contact != null) {
64 locationPluginIntent.putExtra("name", contact.getDisplayName());
65 locationPluginIntent.putExtra("jid", contact.getJid().toString());
66 } else {
67 locationPluginIntent.putExtra("name", UIHelper.getDisplayedMucCounterpart(message.getCounterpart()));
68 }
69 }
70 intents.add(locationPluginIntent);
71
72 Intent geoIntent = new Intent(Intent.ACTION_VIEW);
73 geoIntent.setData(Uri.parse("geo:" + String.valueOf(latitude) + "," + String.valueOf(longitude) + "?q=" + String.valueOf(latitude) + "," + String.valueOf(longitude) + label));
74 intents.add(geoIntent);
75
76 Intent httpIntent = new Intent(Intent.ACTION_VIEW);
77 httpIntent.setData(Uri.parse("https://maps.google.com/maps?q=loc:"+String.valueOf(latitude) + "," + String.valueOf(longitude) +label));
78 intents.add(httpIntent);
79 return intents;
80 }
81}