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
20
21 public static ArrayList<Intent> createGeoIntentsFromMessage(Message message) {
22 final ArrayList<Intent> intents = new ArrayList<>();
23 Matcher matcher = GEO_URI.matcher(message.getBody());
24 if (!matcher.matches()) {
25 return intents;
26 }
27 double latitude;
28 double longitude;
29 try {
30 latitude = Double.parseDouble(matcher.group(1));
31 if (latitude > 90.0 || latitude < -90.0) {
32 return intents;
33 }
34 longitude = Double.parseDouble(matcher.group(2));
35 if (longitude > 180.0 || longitude < -180.0) {
36 return intents;
37 }
38 } catch (NumberFormatException nfe) {
39 return intents;
40 }
41 final Conversation conversation = message.getConversation();
42 String label;
43 if (conversation.getMode() == Conversation.MODE_SINGLE && message.getStatus() == Message.STATUS_RECEIVED) {
44 try {
45 label = "(" + URLEncoder.encode(message.getConversation().getName(), "UTF-8") + ")";
46 } catch (UnsupportedEncodingException e) {
47 label = "";
48 }
49 } else {
50 label = "";
51 }
52
53 Intent locationPluginIntent = new Intent("eu.siacs.conversations.location.show");
54 locationPluginIntent.putExtra("latitude",latitude);
55 locationPluginIntent.putExtra("longitude",longitude);
56 if (message.getStatus() != Message.STATUS_RECEIVED) {
57 locationPluginIntent.putExtra("jid",conversation.getAccount().getJid().toString());
58 locationPluginIntent.putExtra("name",conversation.getAccount().getJid().getLocal());
59 } else {
60 Contact contact = message.getContact();
61 if (contact != null) {
62 locationPluginIntent.putExtra("name", contact.getDisplayName());
63 locationPluginIntent.putExtra("jid", contact.getJid().toString());
64 } else {
65 locationPluginIntent.putExtra("name", UIHelper.getDisplayedMucCounterpart(message.getCounterpart()));
66 }
67 }
68 intents.add(locationPluginIntent);
69
70 Intent geoIntent = new Intent(Intent.ACTION_VIEW);
71 geoIntent.setData(Uri.parse("geo:" + String.valueOf(latitude) + "," + String.valueOf(longitude) + "?q=" + String.valueOf(latitude) + "," + String.valueOf(longitude) + label));
72 intents.add(geoIntent);
73
74 Intent httpIntent = new Intent(Intent.ACTION_VIEW);
75 httpIntent.setData(Uri.parse("https://maps.google.com/maps?q=loc:"+String.valueOf(latitude) + "," + String.valueOf(longitude) +label));
76 intents.add(httpIntent);
77 return intents;
78 }
79}