diff --git a/app/build.gradle b/app/build.gradle index b20aa3b..d1ca136 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,17 +68,17 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0" implementation 'androidx.appcompat:appcompat:1.1.0' - implementation "androidx.core:core-ktx:1.2.0" + implementation "androidx.core:core-ktx:1.3.0" implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' implementation "androidx.preference:preference-ktx:1.1.1" - implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2' - implementation 'androidx.navigation:navigation-ui-ktx:2.2.2' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.0' - implementation "com.google.android.material:material:1.1.0-beta01" + implementation "com.google.android.material:material:1.2.0-beta01" implementation "com.google.code.gson:gson:2.8.6" implementation "org.osmdroid:osmdroid-android:6.1.6" diff --git a/app/src/main/java/org/y20k/trackbook/MainActivity.kt b/app/src/main/java/org/y20k/trackbook/MainActivity.kt index 157c11e..585ba3d 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivity.kt +++ b/app/src/main/java/org/y20k/trackbook/MainActivity.kt @@ -19,7 +19,10 @@ package org.y20k.trackbook import android.content.Context import android.content.SharedPreferences +import android.os.Build import android.os.Bundle +import android.os.StrictMode +import android.os.StrictMode.VmPolicy import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController @@ -50,6 +53,16 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // todo remove after testing finished + if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + StrictMode.setVmPolicy( + VmPolicy.Builder() + .detectNonSdkApiUsage() + .penaltyLog() + .build() + ) + } + // set user agent to prevent getting banned from the osm servers Configuration.getInstance().userAgentValue = BuildConfig.APPLICATION_ID // set the path for osmdroid's files (e.g. tile cache) diff --git a/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt b/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt index 1507088..ed33fc7 100644 --- a/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt @@ -19,9 +19,14 @@ package org.y20k.trackbook import YesNoDialog +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context +import android.content.Intent +import android.net.Uri import android.os.Bundle import android.view.View +import android.widget.Toast import androidx.preference.* import kotlinx.coroutines.* import org.y20k.trackbook.core.Tracklist @@ -123,6 +128,36 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList return@setOnPreferenceClickListener true } + // set up "App Version" preference + val preferenceAppVersion: Preference = Preference(context) + preferenceAppVersion.title = getString(R.string.pref_app_version_title) + preferenceAppVersion.setIcon(R.drawable.ic_info_24dp) + preferenceAppVersion.summary = "${getString(R.string.pref_app_version_summary)} ${BuildConfig.VERSION_NAME} (${getString( + R.string.app_version_name)})" + preferenceAppVersion.setOnPreferenceClickListener { + // copy to clipboard + val clip: ClipData = ClipData.newPlainText("simple text", preferenceAppVersion.summary) + val cm: ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + cm.setPrimaryClip(clip) + Toast.makeText(activity as Context, R.string.toast_message_copied_to_clipboard, Toast.LENGTH_LONG).show() + return@setOnPreferenceClickListener true + } + + // set up "Report Issue" preference + val preferenceReportIssue: Preference = Preference(context) + preferenceReportIssue.title = getString(R.string.pref_report_issue_title) + preferenceReportIssue.setIcon(R.drawable.ic_bug_report_24dp) + preferenceReportIssue.summary = getString(R.string.pref_report_issue_summary) + preferenceReportIssue.setOnPreferenceClickListener { + // open web browser + val intent = Intent().apply { + action = Intent.ACTION_VIEW + data = Uri.parse("https://github.com/y20k/trackbook/issues") + } + startActivity(intent) + return@setOnPreferenceClickListener true + } + // set preference categories val preferenceCategoryGeneral: PreferenceCategory = PreferenceCategory(activity as Context) preferenceCategoryGeneral.title = getString(R.string.pref_general_title) @@ -137,6 +172,11 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList preferenceCategoryAdvanced.contains(preferenceAccuracyThreshold) preferenceCategoryAdvanced.contains(preferenceResetAdvanced) + val preferenceCategoryAbout: PreferenceCategory = PreferenceCategory(context) + preferenceCategoryAbout.title = getString(R.string.pref_about_title) + preferenceCategoryAbout.contains(preferenceAppVersion) + preferenceCategoryAbout.contains(preferenceReportIssue) + // setup preference screen screen.addPreference(preferenceCategoryGeneral) screen.addPreference(preferenceGpsOnly) @@ -147,6 +187,9 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList screen.addPreference(preferenceCategoryAdvanced) screen.addPreference(preferenceAccuracyThreshold) screen.addPreference(preferenceResetAdvanced) + screen.addPreference(preferenceCategoryAbout) + screen.addPreference(preferenceAppVersion) + screen.addPreference(preferenceReportIssue) preferenceScreen = screen } diff --git a/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt b/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt index b17a17b..ea6e5ac 100644 --- a/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt +++ b/app/src/main/java/org/y20k/trackbook/ui/MapFragmentLayoutHolder.kt @@ -90,6 +90,7 @@ data class MapFragmentLayoutHolder(var context: Context, var inflater: LayoutInf // basic map setup controller = mapView.controller mapView.isTilesScaledToDpi = true + mapView.setTilesScaledToDpi(true) mapView.setTileSource(TileSourceFactory.MAPNIK) mapView.setMultiTouchControls(true) mapView.zoomController.setVisibility(org.osmdroid.views.CustomZoomButtonsController.Visibility.NEVER) diff --git a/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt b/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt index 5ed80ce..6029963 100644 --- a/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt +++ b/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt @@ -99,7 +99,7 @@ data class TrackFragmentLayoutHolder(var context: Context, var inflater: LayoutI // basic map setup controller = mapView.controller - mapView.isTilesScaledToDpi = true + mapView.setTilesScaledToDpi(true) mapView.setTileSource(TileSourceFactory.MAPNIK) mapView.setMultiTouchControls(true) mapView.zoomController.setVisibility(org.osmdroid.views.CustomZoomButtonsController.Visibility.NEVER) diff --git a/app/src/main/res/drawable/ic_bug_report_24dp.xml b/app/src/main/res/drawable/ic_bug_report_24dp.xml new file mode 100644 index 0000000..d3767ca --- /dev/null +++ b/app/src/main/res/drawable/ic_bug_report_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_info_24dp.xml b/app/src/main/res/drawable/ic_info_24dp.xml new file mode 100644 index 0000000..31b21e7 --- /dev/null +++ b/app/src/main/res/drawable/ic_info_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_track.xml b/app/src/main/res/layout/fragment_track.xml index 0b92770..8a93a54 100755 --- a/app/src/main/res/layout/fragment_track.xml +++ b/app/src/main/res/layout/fragment_track.xml @@ -29,6 +29,7 @@ android:background="@drawable/shape_statistics_background_collapsed" app:behavior_hideable="false" app:behavior_peekHeight="54dp" + app:gestureInsetBottomIgnored="true" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> Trackbook hat noch keine Wegpunkte aufgenommen. Aufnahme fortsetzen + In die Zwischenablage kopiert. Hinweis: Die Genauigkeit der Höhenmeter-Werte ist geräteabhängig. Gemessen werden Steigungen und Gefälle der Gesamtstrecke. Speichern nicht möglich. Bitte zunächst einen Dateimanager installieren. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 09e1726..304cd47 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ Trackbook + \"Echoes\" Map Tracks @@ -39,6 +40,7 @@ Delete all non-starred recordings? This action cannot be undone. Delete this recording? + Copied to clipboard. Hint: The accuracy of elevation data depends on your device. The uphill and downhill elevation of the whole route is measured. Unable to save. Please install a file manager first. Saving recording as GPX. @@ -69,6 +71,9 @@ Your recorded tracks … will show up here. + About + Version + App Version Discard location fixes with an accuracy larger than: Accuracy Threshold Advanced @@ -82,6 +87,8 @@ Currently using metric units (Kilometer, Meter). Currently using imperial units (Miles, Feet). Use Imperial Measurements + Report bugs and suggest improvements on GitHub. + Report Issue Reset advanced settings to defaults. Reset Dark mode diff --git a/build.gradle b/build.gradle index 05b374b..786648a 100644 --- a/build.gradle +++ b/build.gradle @@ -8,9 +8,9 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + classpath 'com.android.tools.build:gradle:4.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.2" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7ef0e62..1fa8765 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Feb 26 14:43:25 CET 2020 +#Sat May 30 22:16:24 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip