diff --git a/app/build.gradle b/app/build.gradle
index b2afc7dd..42a15f9f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -36,19 +36,7 @@ android {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
- userdebug {
- initWith release
- minifyEnabled false
- versionNameSuffix "-userdebug_"+new Date().format("yyyyMMDD")
- }
- debug {
- initWith release
- minifyEnabled false
- signingConfig signingConfigs.debug
- versionNameSuffix "-debug_"+new Date().format("yyyyMMDD-HHmm00ss")
- }
}
-
}
dependencies {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 52183b6d..e30d7015 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -50,6 +50,7 @@
+
diff --git a/app/src/main/java/de/kaffeemitkoffein/tinyweatherforecastgermany/MainActivity.java b/app/src/main/java/de/kaffeemitkoffein/tinyweatherforecastgermany/MainActivity.java
index e8d485e8..20852b6a 100644
--- a/app/src/main/java/de/kaffeemitkoffein/tinyweatherforecastgermany/MainActivity.java
+++ b/app/src/main/java/de/kaffeemitkoffein/tinyweatherforecastgermany/MainActivity.java
@@ -53,6 +53,8 @@ import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class MainActivity extends Activity {
@@ -485,46 +487,13 @@ public class MainActivity extends Activity {
}
});
// check if a geo intent was sent
- Intent geo_intent = getIntent();
- if (geo_intent!=null){
- String intent_action = geo_intent.getAction();
- if (intent_action!=null){
- if (intent_action.equals(Intent.ACTION_VIEW)){
- String intent_scheme = geo_intent.getScheme();
- if (intent_scheme!=null){
- if (intent_scheme.equals("geo")){
- String received_geolocation = geo_intent.getData().toString();
- if (received_geolocation!=null){
- try {
- String received_latitude = received_geolocation.substring(received_geolocation.indexOf(":")+1,received_geolocation.indexOf(","));
- String received_longitude = received_geolocation.substring(received_geolocation.indexOf(",")+1,received_geolocation.indexOf("?"));
- String received_zoom = received_geolocation.substring(received_geolocation.indexOf("z=")+2);
- Location own_location = new Location("manual");
- own_location.setTime(Calendar.getInstance().getTimeInMillis());
- try {
- double latitude = Location.convert(standardizeGeo(received_latitude));
- double longitude = Location.convert(standardizeGeo(received_longitude));
- own_location.setLatitude(latitude);
- own_location.setLongitude(longitude);
- launchStationSearchByLocation(own_location);
- } catch (Exception e){
- // invalid geo coordinates
- PrivateLog.log(getApplicationContext(),PrivateLog.MAIN, PrivateLog.ERR,"received geo intent, but unable to read it: "+e.getMessage());
- PrivateLog.log(getApplicationContext(),PrivateLog.MAIN, PrivateLog.ERR,"geo content was: "+received_geolocation);
- Toast.makeText(getApplicationContext(),getApplicationContext().getResources().getString(R.string.georeceive_error),Toast.LENGTH_LONG).show();
- }
- } catch (IndexOutOfBoundsException e){
- PrivateLog.log(getApplicationContext(),PrivateLog.MAIN, PrivateLog.ERR,"received geo intent, but unable to parse it poroperly: "+e.getMessage());
- PrivateLog.log(getApplicationContext(),PrivateLog.MAIN, PrivateLog.ERR,"geo content was: "+received_geolocation);
- // invalid geo-string (uri)
- Toast.makeText(getApplicationContext(),getApplicationContext().getResources().getString(R.string.georeceive_error),Toast.LENGTH_LONG).show();
- }
- }
- }
- }
- }
- }
+
+ Location intentLocation = getLocationForGeoIntent(getIntent());
+
+ if (intentLocation!=null){
+ launchStationSearchByLocation(intentLocation);
}
+
executor.execute(new Runnable() {
@Override
public void run() {
@@ -533,6 +502,63 @@ public class MainActivity extends Activity {
});
}
+
+ /**
+ * Returns a location for a geo intent.
+ *
+ * Checks if an intent's scheme is "geo". If so, and the intent data is following the pattern
+ * "latitude,longitude[optional parameters with non-numeric separator]", the content is used to populate a new location
+ * object. If it's a geo intent, but it's not following the mentioned pattern, the user is
+ * informed about the mismatch via a toast and a log message is written.
+ *
+ * @param intent the intent to analyze
+ * @return a new Location object with latitude/longitude from the intent or null if the intent is not a valid geo scheme intent.
+ */
+ private Location getLocationForGeoIntent(Intent intent) {
+ if (intent==null)
+ {
+ return null;
+ }
+ String intent_action = intent.getAction();
+
+ if (!Objects.equals(intent_action, Intent.ACTION_VIEW))
+ {
+ return null;
+ }
+
+ String intent_scheme = intent.getScheme();
+ if (intent_scheme==null || !intent_scheme.equalsIgnoreCase("geo"))
+ {
+ return null;
+ }
+
+ String received_geolocation = intent.getData().toString();
+ if (received_geolocation!=null) {
+ try {
+ Pattern pattern_lat_long = Pattern.compile("geo:(?-?[\\d]*\\.?[\\d]*),(?-?[\\d]*\\.?[\\d]*)", Pattern.CASE_INSENSITIVE);
+ Matcher m = pattern_lat_long.matcher(received_geolocation);
+ m.find();
+ String received_latitude = m.group(1); //Can be replaced with 'm.group("latitude")' for better readability as soon as min API level is 26
+ String received_longitude = m.group(2); //Can be replaced with 'm.group("longitude")' for better readability as soon as min API level is 26
+
+ Location own_location = new Location("manual");
+ own_location.setTime(Calendar.getInstance().getTimeInMillis());
+ double latitude = Location.convert(standardizeGeo(received_latitude));
+ double longitude = Location.convert(standardizeGeo(received_longitude));
+ own_location.setLatitude(latitude);
+ own_location.setLongitude(longitude);
+ return own_location;
+ }
+ catch (Exception e) {
+ // invalid geo-string (uri)
+ PrivateLog.log(getApplicationContext(), PrivateLog.MAIN, PrivateLog.ERR, "received geo intent, but unable to read it: " + e.getMessage());
+ PrivateLog.log(getApplicationContext(), PrivateLog.MAIN, PrivateLog.ERR, "geo content was: " + received_geolocation);
+ Toast.makeText(getApplicationContext(), getApplicationContext().getResources().getString(R.string.georeceive_error), Toast.LENGTH_LONG).show();
+ }
+ }
+ return null;
+ }
+
private void errorDialog(Exception e){
AlertDialog.Builder builder = new AlertDialog.Builder(this,0);
builder.setCancelable(true);
diff --git a/build.gradle b/build.gradle
index a9203aac..00157145 100644
--- a/build.gradle
+++ b/build.gradle
@@ -21,11 +21,11 @@ buildscript {
repositories {
google()
- jcenter()
+ mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.3'
+ classpath 'com.android.tools.build:gradle:7.0.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
@@ -34,7 +34,7 @@ buildscript {
allprojects {
repositories {
google()
- jcenter()
+ mavenCentral()
}
}