Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
e64b89bce6 | |||
fd14eea4b9 | |||
065ef2bea6 | |||
308474246b | |||
96b88a398c | |||
15cea67818 | |||
9e89879d5c | |||
a0c397b194 |
2
.idea/compiler.xml
generated
2
.idea/compiler.xml
generated
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="CompilerConfiguration">
|
<component name="CompilerConfiguration">
|
||||||
<bytecodeTargetLevel target="11" />
|
<bytecodeTargetLevel target="1.8" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@ -20,5 +20,5 @@
|
|||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK" />
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="11" project-jdk-type="JavaSDK" />
|
||||||
</project>
|
</project>
|
@ -2,9 +2,12 @@
|
|||||||
|
|
||||||
# Nextcloud Maps Geobookmarks Android app
|
# Nextcloud Maps Geobookmarks Android app
|
||||||
|
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="80">](https://f-droid.org/it/packages/it.danieleverducci.nextcloudmaps)
|
||||||
[<img src="https://cdn.rawgit.com/steverichey/google-play-badge-svg/master/img/en_get.svg" height="80">](https://play.google.com/store/apps/details?id=it.danieleverducci.nextcloudmaps)
|
[<img src="https://cdn.rawgit.com/steverichey/google-play-badge-svg/master/img/en_get.svg" height="80">](https://play.google.com/store/apps/details?id=it.danieleverducci.nextcloudmaps)
|
||||||
[<img src="https://raw.githubusercontent.com/andOTP/andOTP/master/assets/badges/get-it-on-github.png" height="80">](https://github.com/penguin86/nextcloud-maps-client/releases/latest)
|
[<img src="https://raw.githubusercontent.com/andOTP/andOTP/master/assets/badges/get-it-on-github.png" height="80">](https://github.com/penguin86/nextcloud-maps-client/releases/latest)
|
||||||
|
|
||||||
|
(Always prefer [F-Droid](https://f-droid.org) build, when possible).
|
||||||
|
|
||||||
Android app to show your Nextcloud Maps geobookmarks list. Geobookmarks can be opened in all apps supporting geo links (i.e. Google Maps, Organic Maps etc...).
|
Android app to show your Nextcloud Maps geobookmarks list. Geobookmarks can be opened in all apps supporting geo links (i.e. Google Maps, Organic Maps etc...).
|
||||||
A new geobookmark can be created on current location.
|
A new geobookmark can be created on current location.
|
||||||
|
|
||||||
@ -14,5 +17,3 @@ This work is heavily based on [matiasdelellis's Nextcloud SSO example](https://g
|
|||||||
|
|
||||||
 
|
 
|
||||||
|
|
||||||
Download it from [the releases page](https://github.com/penguin86/nextcloud-maps-client/releases)
|
|
||||||
|
|
||||||
|
@ -24,8 +24,8 @@ android {
|
|||||||
applicationId "it.danieleverducci.nextcloudmaps"
|
applicationId "it.danieleverducci.nextcloudmaps"
|
||||||
minSdkVersion 23
|
minSdkVersion 23
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
versionCode 4
|
versionCode 5
|
||||||
versionName "0.3.2"
|
versionName "0.3.3"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,17 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activity.detail.GeofavoriteDetailActivity"
|
android:name=".activity.detail.GeofavoriteDetailActivity"
|
||||||
android:theme="@style/AppTheme"/>
|
android:theme="@style/AppTheme">
|
||||||
|
<!-- standard "geo" scheme -->
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
|
|
||||||
|
<data android:scheme="geo"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activity.about.AboutActivity"
|
android:name=".activity.about.AboutActivity"
|
||||||
|
@ -62,6 +62,10 @@ public class AboutActivity extends AppCompatActivity {
|
|||||||
TextView tvIssues = findViewById(R.id.about_issues);
|
TextView tvIssues = findViewById(R.id.about_issues);
|
||||||
tvIssues.setText(Html.fromHtml(getString(R.string.about_issues, getString(R.string.url_issues))));
|
tvIssues.setText(Html.fromHtml(getString(R.string.about_issues, getString(R.string.url_issues))));
|
||||||
tvIssues.setOnClickListener(view -> openUtl(getString(R.string.url_issues)));
|
tvIssues.setOnClickListener(view -> openUtl(getString(R.string.url_issues)));
|
||||||
|
|
||||||
|
TextView tvMaps = findViewById(R.id.about_maps);
|
||||||
|
tvMaps.setText(Html.fromHtml(getString(R.string.about_maps)));
|
||||||
|
tvMaps.setOnClickListener(view -> openUtl(getString(R.string.url_maps)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -59,6 +59,7 @@ import it.danieleverducci.nextcloudmaps.activity.main.MainActivityViewModel;
|
|||||||
import it.danieleverducci.nextcloudmaps.api.ApiProvider;
|
import it.danieleverducci.nextcloudmaps.api.ApiProvider;
|
||||||
import it.danieleverducci.nextcloudmaps.databinding.ActivityGeofavoriteDetailBinding;
|
import it.danieleverducci.nextcloudmaps.databinding.ActivityGeofavoriteDetailBinding;
|
||||||
import it.danieleverducci.nextcloudmaps.model.Geofavorite;
|
import it.danieleverducci.nextcloudmaps.model.Geofavorite;
|
||||||
|
import it.danieleverducci.nextcloudmaps.utils.GeoUriParser;
|
||||||
import it.danieleverducci.nextcloudmaps.utils.IntentGenerator;
|
import it.danieleverducci.nextcloudmaps.utils.IntentGenerator;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
@ -158,8 +159,21 @@ public class GeofavoriteDetailActivity extends AppCompatActivity implements Loca
|
|||||||
mGeofavorite.setDateModified(System.currentTimeMillis() / 1000);
|
mGeofavorite.setDateModified(System.currentTimeMillis() / 1000);
|
||||||
mViewHolder.hideActions();
|
mViewHolder.hideActions();
|
||||||
|
|
||||||
// Precompile location
|
if (getIntent().getData() != null) {
|
||||||
getLocation();
|
// Opened by external generic intent: parse URI
|
||||||
|
try {
|
||||||
|
double[] coords = GeoUriParser.parseUri(getIntent().getData());
|
||||||
|
mGeofavorite.setLat(coords[0]);
|
||||||
|
mGeofavorite.setLng(coords[1]);
|
||||||
|
mViewHolder.hideAccuracy();
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
Toast.makeText(this, R.string.error_unsupported_uri, Toast.LENGTH_SHORT).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Precompile location with current one
|
||||||
|
getLocation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mViewHolder.updateView(mGeofavorite);
|
mViewHolder.updateView(mGeofavorite);
|
||||||
@ -306,6 +320,7 @@ public class GeofavoriteDetailActivity extends AppCompatActivity implements Loca
|
|||||||
// Set map properties
|
// Set map properties
|
||||||
this.binding.map.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.NEVER);
|
this.binding.map.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.NEVER);
|
||||||
this.binding.map.setMultiTouchControls(true);
|
this.binding.map.setMultiTouchControls(true);
|
||||||
|
// this.binding.map.setTilesScaledToDpi(true);
|
||||||
|
|
||||||
// Create marker
|
// Create marker
|
||||||
mapMarker = new Marker(binding.map);
|
mapMarker = new Marker(binding.map);
|
||||||
|
@ -56,6 +56,7 @@ import it.danieleverducci.nextcloudmaps.activity.login.LoginActivity;
|
|||||||
import it.danieleverducci.nextcloudmaps.activity.main.NavigationAdapter.NavigationItem;
|
import it.danieleverducci.nextcloudmaps.activity.main.NavigationAdapter.NavigationItem;
|
||||||
import it.danieleverducci.nextcloudmaps.activity.main.SortingOrderDialogFragment.OnSortingOrderListener;
|
import it.danieleverducci.nextcloudmaps.activity.main.SortingOrderDialogFragment.OnSortingOrderListener;
|
||||||
import it.danieleverducci.nextcloudmaps.model.Geofavorite;
|
import it.danieleverducci.nextcloudmaps.model.Geofavorite;
|
||||||
|
import it.danieleverducci.nextcloudmaps.utils.GeoUriParser;
|
||||||
import it.danieleverducci.nextcloudmaps.utils.IntentGenerator;
|
import it.danieleverducci.nextcloudmaps.utils.IntentGenerator;
|
||||||
|
|
||||||
import static android.view.View.GONE;
|
import static android.view.View.GONE;
|
||||||
|
@ -154,7 +154,7 @@ public class Geofavorite implements Serializable {
|
|||||||
*/
|
*/
|
||||||
public static Comparator<Geofavorite> ByTitleAZ = (gf0, gf1) -> gf0.name.compareTo(gf1.name);
|
public static Comparator<Geofavorite> ByTitleAZ = (gf0, gf1) -> gf0.name.compareTo(gf1.name);
|
||||||
public static Comparator<Geofavorite> ByLastCreated = (gf0, gf1) -> (int) (gf1.dateCreated - gf0.dateCreated);
|
public static Comparator<Geofavorite> ByLastCreated = (gf0, gf1) -> (int) (gf1.dateCreated - gf0.dateCreated);
|
||||||
public static Comparator<Geofavorite> ByCategory = (gf0, gf1) -> gf0.category.compareTo(gf1.category);
|
public static Comparator<Geofavorite> ByCategory = (gf0, gf1) -> (gf0.category + gf0.name).compareTo(gf1.category + gf1.name);
|
||||||
public static Comparator<Geofavorite> ByDistance = (gf0, gf1) -> 0; // (int) ((gf1.getDistanceFrom(userPosition) - gf0.getDistanceFrom(userPosition)) * 1000);
|
public static Comparator<Geofavorite> ByDistance = (gf0, gf1) -> 0; // (int) ((gf1.getDistanceFrom(userPosition) - gf0.getDistanceFrom(userPosition)) * 1000);
|
||||||
|
|
||||||
public String getCoordinatesString() {
|
public String getCoordinatesString() {
|
||||||
|
@ -107,7 +107,7 @@ public class GeofavoriteRepository {
|
|||||||
if (geofav.getId() != 0) {
|
if (geofav.getId() != 0) {
|
||||||
geofavs.remove(geofav);
|
geofavs.remove(geofav);
|
||||||
}
|
}
|
||||||
geofavs.add(geofav);
|
geofavs.add(response.body());
|
||||||
mGeofavorites.postValue(geofavs);
|
mGeofavorites.postValue(geofavs);
|
||||||
mIsUpdating.postValue(false);
|
mIsUpdating.postValue(false);
|
||||||
mOnFinished.postValue(true);
|
mOnFinished.postValue(true);
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
package it.danieleverducci.nextcloudmaps.utils;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import it.danieleverducci.nextcloudmaps.model.Geofavorite;
|
||||||
|
|
||||||
|
public class GeoUriParser {
|
||||||
|
private static final Pattern PATTERN_GEO = Pattern.compile("geo:(-?[\\d.]+),(-?[\\d.]+)");
|
||||||
|
|
||||||
|
public static double[] parseUri(Uri uri) throws IllegalArgumentException {
|
||||||
|
if (uri == null)
|
||||||
|
throw new IllegalArgumentException("no uri");
|
||||||
|
|
||||||
|
Matcher m = PATTERN_GEO.matcher(uri.toString());
|
||||||
|
if (m.find() && m.groupCount() == 2) {
|
||||||
|
String sLat = m.group(1);
|
||||||
|
String sLon = m.group(2);
|
||||||
|
try {
|
||||||
|
return new double[]{Double.parseDouble(sLat), Double.parseDouble(sLon)};
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new IllegalArgumentException("unable to parse uri");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("unable to parse uri");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -115,6 +115,20 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:padding="10dp"
|
android:padding="10dp"
|
||||||
android:text="@string/about_issues" />
|
android:text="@string/about_issues" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
style="?android:attr/listSeparatorTextViewStyle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/about_maps_title" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/about_maps"
|
||||||
|
style="?android:attr/editTextPreferenceStyle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:text="@string/about_maps" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
<string name="location_permission_required">Location permission is required to create a geofavorite.</string>
|
<string name="location_permission_required">Location permission is required to create a geofavorite.</string>
|
||||||
<string name="confirm">Save</string>
|
<string name="confirm">Save</string>
|
||||||
<string name="error_saving_geofavorite">Unable to save geofavorite</string>
|
<string name="error_saving_geofavorite">Unable to save geofavorite</string>
|
||||||
|
<string name="error_unsupported_uri">Unable to obtain coordinates from shared data</string>
|
||||||
<string name="geofavorite_saved">Geofavorite saved</string>
|
<string name="geofavorite_saved">Geofavorite saved</string>
|
||||||
<string name="incomplete_geofavorite">Incomplete geofavorite: Name and category are mandatory</string>
|
<string name="incomplete_geofavorite">Incomplete geofavorite: Name and category are mandatory</string>
|
||||||
|
|
||||||
@ -68,6 +69,8 @@
|
|||||||
<string name="about_source">This project is hosted on GitHub: <a href="%1$s">%1$s</a></string>
|
<string name="about_source">This project is hosted on GitHub: <a href="%1$s">%1$s</a></string>
|
||||||
<string name="about_issues_title">Issues</string>
|
<string name="about_issues_title">Issues</string>
|
||||||
<string name="about_issues">You can report bugs, enhancement proposals and feature requests at the GitHub issue tracker: <a href="%1$s">%1$s</a></string>
|
<string name="about_issues">You can report bugs, enhancement proposals and feature requests at the GitHub issue tracker: <a href="%1$s">%1$s</a></string>
|
||||||
|
<string name="about_maps_title">Maps</string>
|
||||||
|
<string name="about_maps">This app uses Open Street Maps tiles and servers to display the map. I do not accept any donation for this app, but strongly encourage to make any donation to <a href="%1$s">OpenStreetMap</a>, as this application could not exist without them.</string>
|
||||||
<string name="about_app_license_title">App license</string>
|
<string name="about_app_license_title">App license</string>
|
||||||
<string name="about_app_license">This application is licensed under the GNU GENERAL PUBLIC LICENSE v3+.</string>
|
<string name="about_app_license">This application is licensed under the GNU GENERAL PUBLIC LICENSE v3+.</string>
|
||||||
<string name="about_app_license_button">View license</string>
|
<string name="about_app_license_button">View license</string>
|
||||||
@ -78,8 +81,9 @@
|
|||||||
|
|
||||||
<!-- URLs -->
|
<!-- URLs -->
|
||||||
<string name="url_source" translatable="false">https://github.com/penguin86/nextcloud-maps-client</string>
|
<string name="url_source" translatable="false">https://github.com/penguin86/nextcloud-maps-client</string>
|
||||||
<string name="url_issues" translatable="false">https://github.com/penguin86/nextcloud-maps-client/issues/new/choose</string>
|
<string name="url_issues" translatable="false">https://github.com/penguin86/nextcloud-maps-client/issues</string>
|
||||||
<string name="url_license" translatable="false">https://raw.githubusercontent.com/penguin86/nextcloud-maps-client/master/LICENSE</string>
|
<string name="url_license" translatable="false">https://raw.githubusercontent.com/penguin86/nextcloud-maps-client/master/LICENSE</string>
|
||||||
|
<string name="url_maps" translatable="false">https://donate.openstreetmap.org</string>
|
||||||
|
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="setting_sort_by">SETTING_SORT_BY</string>
|
<string name="setting_sort_by">SETTING_SORT_BY</string>
|
||||||
|
1
fastlane/metadata/android/en-US/changelogs/2.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/2.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Added geofavorite detail and deletion
|
1
fastlane/metadata/android/en-US/changelogs/3.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/3.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Added map in geofavorite detail
|
1
fastlane/metadata/android/en-US/changelogs/4.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/4.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
First categories implementation
|
1
fastlane/metadata/android/en-US/changelogs/5.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/5.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Fixed bug when opening newly-created element
|
@ -1,4 +1,9 @@
|
|||||||
UNOFFICIAL Nextcloud Maps client at its earliest stages of developement. Shows your Nextcloud Maps geobookmarks list.
|
UNOFFICIAL and FOSS Nextcloud Maps client at its earliest stages of developement. Shows your Nextcloud Maps geobookmarks list.
|
||||||
Geobookmarks can be opened in all apps supporting geo links (i.e. Google Maps, Organic Maps etc...).
|
Geobookmarks can be opened in all apps supporting geo links (i.e. Google Maps, Organic Maps etc...).
|
||||||
A new geobookmark can be created on current location.
|
A new geobookmark can be created on current location or by sharing a geo: uri from another app.
|
||||||
|
|
||||||
Requires Maps app to be installed on the Nextcloud instance.
|
Requires Maps app to be installed on the Nextcloud instance.
|
||||||
|
As per Nextcloud's guidelines, the login is implemented using Nextcloud's Single Sign On module and thus requires Nextcloud app installed.
|
||||||
|
|
||||||
|
Promo banner by Gasteaud, Public domain, via Wikimedia Commons.
|
||||||
|
|
||||||
|
BIN
fastlane/metadata/android/en-US/images/featureGraphic.png
Normal file
BIN
fastlane/metadata/android/en-US/images/featureGraphic.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
BIN
fastlane/metadata/android/en-US/images/icon.png
Normal file
BIN
fastlane/metadata/android/en-US/images/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
fastlane/metadata/android/en-US/images/promoGraphic.png
Normal file
BIN
fastlane/metadata/android/en-US/images/promoGraphic.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 57 KiB |
Reference in New Issue
Block a user