package ru.perm.trubnikov.gps2sms;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.preference.PreferenceManager;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GpsHelper {
@TargetApi(23)
public static boolean hasPermission(String perm, BaseActivity a) {
return (PackageManager.PERMISSION_GRANTED == a.checkSelfPermission(perm));
}
@TargetApi(23)
public static boolean canAccessLocation(BaseActivity a) {
// All needed permissions
return (hasPermission(android.Manifest.permission.ACCESS_FINE_LOCATION, a) && hasPermission(android.Manifest.permission.SEND_SMS, a) &&
hasPermission(android.Manifest.permission.RECEIVE_SMS, a) && hasPermission(android.Manifest.permission.READ_SMS, a) &&
hasPermission(android.Manifest.permission.READ_CONTACTS, a) && hasPermission(android.Manifest.permission.READ_PHONE_STATE, a));
}
public static String latLonToDMS (double val, boolean is_lat) {
String mod = (is_lat) ? ((val >= 0) ? "N" : "S") : ((val >= 0) ? "E" : "W");
double degrees = Math.floor(val);
double mmgg = (val - degrees) * 60;
double minutes = Math.floor(mmgg);
double seconds = Math.floor((mmgg - minutes) * 60);
String dms = String.format(Locale.US, "%2.0f", degrees) + "°" + String.format(Locale.US, "%2.0f", minutes) + "'" + String.format(Locale.US, "%2.0f", seconds) + "''";
return (mod + dms.replace(" ", ""));
}
public static String latLonToDM (double val, boolean is_lat) {
String mod = (is_lat) ? ((val >= 0) ? "N" : "S") : ((val >= 0) ? "E" : "W");
double degrees = Math.floor(val);
double mmgg = (val - degrees) * 60;
String dm = String.format(Locale.US, "%2.0f", degrees) + "°" + String.format(Locale.US, "%2.4f", mmgg) + "'";
return (mod + dm.replace(" ", ""));
}
public static String getLinkByProvType(String settVal, String crds) {
switch (settVal) {
case "2":
return GpsHelper.getGoogleMapsLink(crds);
case "3":
return GpsHelper.getOSMLink(crds);
case "4":
return GpsHelper.getNavitelMessage(crds);
case "5":
return GpsHelper.getYandexMapsLink(crds);
case "6":
return GpsHelper.getDmCoords(crds);
case "7":
return GpsHelper.getDmsCoords(crds);
default:
return crds;
}
}
public static String getDmCoords(String crds) {
String[] split = crds.split(",");
return GpsHelper.latLonToDM(Double.parseDouble(split[0]), true) + ", " + GpsHelper.latLonToDM(Double.parseDouble(split[1]), false);
}
public static String getDmsCoords(String crds) {
String[] split = crds.split(",");
return GpsHelper.latLonToDMS(Double.parseDouble(split[0]), true) + ", " + GpsHelper.latLonToDMS(Double.parseDouble(split[1]), false);
}
public static String getNavitelMessage(String crds) {
return "<NavitelLoc>" + crds + "<N>";
}
public static String getGoogleMapsLink(String crds) {
return "https://maps.google.com/maps?q=loc:" + crds;
}
public static String getYandexMapsLink(String crds) {
return "https://yandex.ru/maps/?mode=search&text=" + crds.replace(",", "%20");
}
public static String getOSMLink(String crds) {
crds = crds.replace(",", "&mlon=");
return "https://openstreetmap.org/?mlat=" + crds + "&zoom=17";
}
public static void clipboardCopy(Context context, String crds) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
.getSystemService(Context.CLIPBOARD_SERVICE);
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
clipboard.setText(getLinkByProvType(sharedPrefs.getString("prefClipboard", "2"), crds));
}
public static void shareCoordinates(Context context, String crds) {
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
context.getString(R.string.share_topic));
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, crds);
context.startActivity(Intent.createChooser(sharingIntent,
context.getString(R.string.share_via)));
}
public static String extractCoordinates(String message) {
message = message.replace("&mlon=", ",");
Pattern p = Pattern.compile("(\\-?\\d+\\.(\\d+)?),\\s*(\\-?\\d+\\.(\\d+)?)");
Matcher m = p.matcher(message);
return m.find() ? m.group(0) : "0,0";
}
public static String getShareBody(Context context, String crds, String accuracy) {
String separ = System.getProperty("line.separator");
String crds1 = crds.replace(",",
separ + context.getString(R.string.info_longitude) + ": ");
String res = context.getString(R.string.info_latitude) + ": " + crds1;
if (!accuracy.equalsIgnoreCase("")) {
res = res + separ + context.getString(R.string.info_accuracy) + ": "
+ accuracy + " " + context.getString(R.string.info_print2);
}
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
return res + separ + separ + getLinkByProvType(sharedPrefs.getString("prefShareButtonsContent", "2"), crds);
}
public static Intent getIntentForMap(String crds) {
String uri = getGoogleMapsLink(crds);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
return intent;
}
public static void openOnMap(Context context, String crds) {
// http://developer.android.com/guide/components/intents-common.html
// Example: "geo:0,0?q=34.99,-106.61(Treasure)"
// с Меткой глючат Яндекс.Карты
Intent intent = GpsHelper.getIntentForMap(crds);
context.startActivity(intent);
}
}