From 4256719484b2fa72f48550d3490c59ce7ab10639 Mon Sep 17 00:00:00 2001 From: Zahnstocher <1073398+Zahnstocher@users.noreply.github.com> Date: Fri, 8 Nov 2024 18:36:17 +0100 Subject: [PATCH 001/145] fix Gradle checksum (#448) --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 52821cfa7..5b5c106f1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2 +distributionSha256Sum=3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 70fb5c560eee488db950710062a398ec107b88ad Mon Sep 17 00:00:00 2001 From: Binnette Date: Mon, 28 Oct 2024 00:13:42 +0100 Subject: [PATCH 002/145] Add a simple scrollview in available layouts --- app/src/main/res/layout/available_layouts.xml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/available_layouts.xml b/app/src/main/res/layout/available_layouts.xml index 3a6d16c14..564b85984 100644 --- a/app/src/main/res/layout/available_layouts.xml +++ b/app/src/main/res/layout/available_layouts.xml @@ -1,9 +1,13 @@ - + android:contentDescription="@string/prefs_ui_available_layout" + android:paddingTop="4dp"> - - \ No newline at end of file + + \ No newline at end of file From 1114efe837c678ae2f5aa5b33fe5e09586cf514e Mon Sep 17 00:00:00 2001 From: Zahnstocher <1073398+Zahnstocher@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:55:09 +0200 Subject: [PATCH 003/145] fix notifications (Fix #453) --- app/src/main/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a2b63e2b8..2daa57697 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,8 @@ + + Date: Thu, 1 Aug 2024 15:35:07 +0200 Subject: [PATCH 004/145] Export to public directory (Fix #443, Fix #440) --- app/src/main/java/net/osmtracker/activity/About.java | 12 ++++++++++-- app/src/main/java/net/osmtracker/db/DataHelper.java | 2 +- .../java/net/osmtracker/gpx/ExportToStorageTask.java | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/osmtracker/activity/About.java b/app/src/main/java/net/osmtracker/activity/About.java index 8386ef4f9..69406cb30 100644 --- a/app/src/main/java/net/osmtracker/activity/About.java +++ b/app/src/main/java/net/osmtracker/activity/About.java @@ -10,6 +10,7 @@ import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; +import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; @@ -76,7 +77,7 @@ public void onClick(View view) { File dbFile = getDatabasePath(DatabaseHelper.DB_NAME); File targetFolder = new File( - view.getContext().getExternalFilesDir(null), + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), //Environment.getExternalStorageDirectory(), PreferenceManager.getDefaultSharedPreferences(About.this).getString( OSMTracker.Preferences.KEY_STORAGE_DIR, @@ -128,10 +129,17 @@ public ProgressDialog getExportDbProgressDialog() { private String getDebugInfo() { File externalStorageDir = this.getExternalFilesDir(null); + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + String exportDirectoryNameInPreferences = preferences.getString( + OSMTracker.Preferences.KEY_STORAGE_DIR, OSMTracker.Preferences.VAL_STORAGE_DIR); + File baseExportDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), + exportDirectoryNameInPreferences); return "External Storage Directory: '" + externalStorageDir + "'\n" + "External Storage State: '" + Environment.getExternalStorageState() + "'\n" + "Can write to external storage: " - + Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) + "\n"; + + Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) + "\n" + + "Export External Public Storage Directory: '" + + baseExportDirectory + "'\n"; } } diff --git a/app/src/main/java/net/osmtracker/db/DataHelper.java b/app/src/main/java/net/osmtracker/db/DataHelper.java index 3dd174563..ea8daa96b 100644 --- a/app/src/main/java/net/osmtracker/db/DataHelper.java +++ b/app/src/main/java/net/osmtracker/db/DataHelper.java @@ -396,7 +396,7 @@ public static File getTrackDirectory(long trackId, Context context) { File _return = null; String trackStorageDirectory = context.getExternalFilesDir(null) - + "/osmtracker/track" + trackId; + + OSMTracker.Preferences.VAL_STORAGE_DIR + File.separator + "track" + trackId; _return = new File(trackStorageDirectory); return _return; diff --git a/app/src/main/java/net/osmtracker/gpx/ExportToStorageTask.java b/app/src/main/java/net/osmtracker/gpx/ExportToStorageTask.java index 32d97718d..b53d65a65 100644 --- a/app/src/main/java/net/osmtracker/gpx/ExportToStorageTask.java +++ b/app/src/main/java/net/osmtracker/gpx/ExportToStorageTask.java @@ -97,7 +97,7 @@ public File getBaseExportDirectory(SharedPreferences prefs) throws ExportTrackEx OSMTracker.Preferences.KEY_STORAGE_DIR, OSMTracker.Preferences.VAL_STORAGE_DIR); Log.d(TAG,"exportDirectoryNameInPreferences: " + exportDirectoryNameInPreferences); - File baseExportDirectory = new File(context.getExternalFilesDir(null), + File baseExportDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), exportDirectoryNameInPreferences); if(! baseExportDirectory.exists()){ From 211580a00a386bd3ae6d6b453f2f4269d993b5ee Mon Sep 17 00:00:00 2001 From: Binnette Date: Tue, 19 Nov 2024 00:00:16 +0100 Subject: [PATCH 005/145] README: update transifex URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 47bf24e02..09538cd22 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,4 @@ For more information about the project, documentation and bug reports please vis If you are interested in contribute to this project, please visit https://github.com/labexp/osmtracker-android/blob/master/CONTRIBUTING.md to know the way you could do it. -To help translate OSMTracker, please visit https://www.transifex.com/projects/p/osmtracker-android/ +To help translate OSMTracker, please visit https://explore.transifex.com/labexp/osmtracker-android/ From 7a18caaa3c53436e68410845e533a191124552f9 Mon Sep 17 00:00:00 2001 From: Zahnstocher <1073398+Zahnstocher@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:31:42 +0200 Subject: [PATCH 006/145] display number of satellites (Fix #442) --- .../osmtracker/layout/GpsStatusRecord.java | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/net/osmtracker/layout/GpsStatusRecord.java b/app/src/main/java/net/osmtracker/layout/GpsStatusRecord.java index a7b3a4caa..70dd94b9f 100644 --- a/app/src/main/java/net/osmtracker/layout/GpsStatusRecord.java +++ b/app/src/main/java/net/osmtracker/layout/GpsStatusRecord.java @@ -9,6 +9,7 @@ import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; +import android.location.GnssStatus; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; @@ -114,15 +115,42 @@ public void requestLocationUpdates(boolean request) { if (request) { if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { lmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); + lmgr.registerGnssStatusCallback(mStatusCallback); } else { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_GPS_PERMISSIONS); } } else { lmgr.removeUpdates(this); + lmgr.unregisterGnssStatusCallback(mStatusCallback); } } + private GnssStatus.Callback mStatusCallback = new GnssStatus.Callback() { + @Override + public void onSatelliteStatusChanged(GnssStatus status) { + satCount = status.getSatelliteCount(); + fixCount = 0; + + for (int i = 0; i < satCount; i++) { + if (status.usedInFix(i)) { + fixCount++; + } + } + + if (fixCount == 0) { + TextView tvAccuracy = findViewById(R.id.gpsstatus_record_tvAccuracy); + tvAccuracy.setText(getResources().getString(R.string.various_waiting_gps_fix) + .replace("{0}", Long.toString(fixCount)) + .replace("{1}", Long.toString(satCount))); + + ((ImageView) findViewById(R.id.gpsstatus_record_imgSatIndicator)).setImageResource(R.drawable.sat_indicator_unknown); + } + + Log.v(TAG, "Found " + satCount + " satellites. " + fixCount + " used in fix."); + } + }; + @Override public void onLocationChanged(Location location) { // first of all we check if the time from the last used fix to the current fix is greater than the logging interval @@ -136,20 +164,14 @@ public void onLocationChanged(Location location) { manageRecordingIndicator(true); } - //TODO: get number of satellites used and visible. - //Log.v(TAG, "Found " + satCount + " satellites. " + fixCount + " used in fix. - TextView tvAccuracy = findViewById(R.id.gpsstatus_record_tvAccuracy); if (location.hasAccuracy()) { Log.d(TAG, "location accuracy: "+ ACCURACY_FORMAT.format(location.getAccuracy())); tvAccuracy.setText(getResources().getString(R.string.various_accuracy_with_sats) .replace("{0}", ACCURACY_FORMAT.format(location.getAccuracy())) .replace("{1}", getResources().getString(R.string.various_unit_meters)) - //TODO: use the number of satellites used and visible - //.replace("{2}", Long.toString(fixCount)) - //.replace("{3}", Long.toString(satCount))); - .replace("{2}", "?") - .replace("{3}", "?")); + .replace("{2}", Long.toString(fixCount)) + .replace("{3}", Long.toString(satCount))); manageSatelliteStatusIndicator((int) location.getAccuracy()); From d9430c9b77b463dc97d840ff9d16d7ca3f3ffa3e Mon Sep 17 00:00:00 2001 From: Zahnstocher <1073398+Zahnstocher@users.noreply.github.com> Date: Tue, 19 Nov 2024 08:48:10 +0100 Subject: [PATCH 007/145] Grant camera write permissions, remove obsolete permissions (Fix #441) (#449) * Grant camera write permissions, remove obsolete permissions (Fix #441) * Capture photo via camera app (intent) does not require camera permission * Add back requestLegacyExternalStorage --- app/src/main/AndroidManifest.xml | 1 - .../net/osmtracker/activity/TrackLogger.java | 60 +++--------------- .../listener/StillImageOnClickListener.java | 62 +------------------ 3 files changed, 9 insertions(+), 114 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2daa57697..f7f29281b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,6 @@ - diff --git a/app/src/main/java/net/osmtracker/activity/TrackLogger.java b/app/src/main/java/net/osmtracker/activity/TrackLogger.java index f384d9d05..dd76dc053 100644 --- a/app/src/main/java/net/osmtracker/activity/TrackLogger.java +++ b/app/src/main/java/net/osmtracker/activity/TrackLogger.java @@ -44,7 +44,6 @@ import android.net.Uri; import android.os.Bundle; -import android.os.Environment; import android.os.StrictMode; import android.preference.PreferenceManager; import android.provider.MediaStore; @@ -53,6 +52,7 @@ import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import androidx.core.content.FileProvider; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; @@ -75,7 +75,6 @@ public class TrackLogger extends Activity { private static final String TAG = TrackLogger.class.getSimpleName(); final private int RC_STORAGE_AUDIO_PERMISSIONS = 1; - final private int RC_STORAGE_CAMERA_PERMISSIONS = 2; /** * Request code for callback after the camera application had taken a @@ -526,34 +525,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { case KeyEvent.KEYCODE_CAMERA: Log.d(TAG, "click on camera button"); if (gpsLogger.isTracking()) { - if (ContextCompat.checkSelfPermission(this, - Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { - Log.d(TAG, "camera permission isn't granted, will request"); - // Should we show an explanation? - if ( (ActivityCompat.shouldShowRequestPermissionRationale(this, - Manifest.permission.CAMERA)) ) { - - // Show an expanation to the user *asynchronously* -- don't block - // this thread waiting for the user's response! After the user - // sees the explanation, try again to request the permission. - // TODO: explain why we need permission. - Log.w(TAG, "we should explain why we need write and record audio permission"); - - } else { - - // No explanation needed, we can request the permission. - ActivityCompat.requestPermissions(this, - new String[]{ - Manifest.permission.CAMERA}, - RC_STORAGE_CAMERA_PERMISSIONS); - break; - } - - } else { - requestStillImage(); - //return true; - } - + requestStillImage(); } break; case KeyEvent.KEYCODE_DPAD_CENTER: @@ -800,8 +772,13 @@ public long getCurrentTrackId() { private void startCamera(File imageFile) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); + + Uri imageUriContent = FileProvider.getUriForFile(this, + DataHelper.FILE_PROVIDER_AUTHORITY, imageFile); + Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile)); + cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); + cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUriContent); startActivityForResult(cameraIntent, REQCODE_IMAGE_CAPTURE); } @@ -837,27 +814,6 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis } return; } - - case RC_STORAGE_CAMERA_PERMISSIONS: { - Log.d(TAG, "camera case"); - // If request is cancelled, the result arrays are empty. - if (grantResults.length > 1) { - // TODO: fix permission management - //&& grantResults[0] == PackageManager.PERMISSION_GRANTED - //&& grantResults[1] == PackageManager.PERMISSION_GRANTED) { - - // permission was granted, yay! - requestStillImage(); - - } else { - - // permission denied, boo! Disable the - // functionality that depends on this permission. - //TODO: add an informative message. - Log.v(TAG, "Camera permission is denied."); - } - return; - } } } diff --git a/app/src/main/java/net/osmtracker/listener/StillImageOnClickListener.java b/app/src/main/java/net/osmtracker/listener/StillImageOnClickListener.java index c53cbd936..bfd963b5c 100644 --- a/app/src/main/java/net/osmtracker/listener/StillImageOnClickListener.java +++ b/app/src/main/java/net/osmtracker/listener/StillImageOnClickListener.java @@ -2,11 +2,6 @@ import net.osmtracker.activity.TrackLogger; -import android.Manifest; -import android.content.pm.PackageManager; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - import android.view.View; import android.view.View.OnClickListener; @@ -22,8 +17,6 @@ public class StillImageOnClickListener implements OnClickListener { * Parent activity */ TrackLogger activity; - - final private int RC_STORAGE_CAMERA_PERMISSIONS = 2; public StillImageOnClickListener(TrackLogger parent) { activity = parent; @@ -31,59 +24,6 @@ public StillImageOnClickListener(TrackLogger parent) { @Override public void onClick(View v) { - if (ContextCompat.checkSelfPermission(activity, - Manifest.permission.WRITE_EXTERNAL_STORAGE) + ContextCompat.checkSelfPermission(activity, - Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { - - // Should we show an explanation? - if ( (ActivityCompat.shouldShowRequestPermissionRationale(activity, - Manifest.permission.WRITE_EXTERNAL_STORAGE)) - || (ActivityCompat.shouldShowRequestPermissionRationale(activity, - Manifest.permission.CAMERA)) ) { - - // Show an expanation to the user *asynchronously* -- don't block - // this thread waiting for the user's response! After the user - // sees the explanation, try again to request the permission. - // TODO: explain why we need permission. - //"we should explain why we need write and record audio permission" - - } else { - - // No explanation needed, we can request the permission. - ActivityCompat.requestPermissions(activity, - new String[]{ - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.CAMERA}, - RC_STORAGE_CAMERA_PERMISSIONS); - } - - } else { - activity.requestStillImage(); - } - + activity.requestStillImage(); } - - public void onRequestPermissionsResult(int requestCode, - String permissions[], int[] grantResults) { - switch (requestCode) { - case RC_STORAGE_CAMERA_PERMISSIONS: { - // If request is cancelled, the result arrays are empty. - if (grantResults.length == 2 - && grantResults[0] == PackageManager.PERMISSION_GRANTED - && grantResults[1] == PackageManager.PERMISSION_GRANTED) { - - // permission was granted, yay! - activity.requestStillImage(); - - } else { - - // permission denied, boo! Disable the - // functionality that depends on this permission. - //TODO: add an informative message. - } - return; - } - } - } - } From 115a1606cd3f348e53b06781474b0d1f3cc5bf32 Mon Sep 17 00:00:00 2001 From: Binnette Date: Tue, 19 Nov 2024 12:08:34 +0100 Subject: [PATCH 008/145] Gradle: remove deprecated option 'android.defaults.buildfeatures.buildconfig' --- gradle.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index e3dfef4e0..918826a7c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,3 @@ -android.defaults.buildfeatures.buildconfig=true android.enableJetifier=true android.nonFinalResIds=false android.nonTransitiveRClass=false From 015346e518c0cb49af0ad073e18fb641aa8c17f8 Mon Sep 17 00:00:00 2001 From: Binnette Date: Tue, 19 Nov 2024 12:10:24 +0100 Subject: [PATCH 009/145] Gradle: replace jcenter() by mavenCentral() --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index c8c635a6b..cb24a257c 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { ext.kotlin_version = '1.6.21' repositories { google() - jcenter() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:8.3.0' @@ -15,6 +15,6 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() } } From 5648bd77bebfba8424f6a7bbb67b8777cc7ccc2a Mon Sep 17 00:00:00 2001 From: Binnette Date: Tue, 19 Nov 2024 12:13:43 +0100 Subject: [PATCH 010/145] Tests: update powermock to 2.0.9; workaround for 'unnamed modules'; restore commons-io dependency --- app/build.gradle | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2087fcec9..5e8f23640 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,6 +59,12 @@ android { testOptions { unitTests.returnDefaultValues = true + unitTests.all { + it.jvmArgs '--add-opens', 'java.base/java.io=ALL-UNNAMED', + '--add-opens', 'java.base/java.lang=ALL-UNNAMED', + '--add-opens', 'java.base/java.lang.reflect=ALL-UNNAMED', + '--add-opens', 'java.base/java.util=ALL-UNNAMED' + } animationsDisabled = true } namespace 'net.osmtracker' @@ -77,7 +83,7 @@ dependencies { //implementation 'oauth.signpost:signpost-commonshttp4:1.2.1.2' implementation 'org.slf4j:slf4j-android:1.7.30' implementation 'androidx.core:core:1.6.0' - //implementation 'org.apache.commons:commons-io:1.3.2' + implementation 'org.apache.commons:commons-io:1.3.2' // For upload traces to osm server implementation 'net.openid:appauth:0.11.1' @@ -87,9 +93,9 @@ dependencies { testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.4.0' - testImplementation 'org.powermock:powermock-core:1.7.0RC2' - testImplementation 'org.powermock:powermock-module-junit4:1.7.0RC2' - testImplementation 'org.powermock:powermock-api-mockito2:1.7.0RC2' + testImplementation 'org.powermock:powermock-core:2.0.9' + testImplementation 'org.powermock:powermock-module-junit4:2.0.9' + testImplementation 'org.powermock:powermock-api-mockito2:2.0.9' // Required for instrumented tests androidTestImplementation 'androidx.test.ext:junit:1.1.3' @@ -111,7 +117,7 @@ dependencies { configurations.all { // it's already included in Android and not need from osmapi - exclude group:'net.sf.kxml', module:'kxml2' + exclude group: 'net.sf.kxml', module: 'kxml2' exclude group: 'xmlpull', module: 'xmlpull' } From f2286612c7078490160a1e013ef11134b46706a8 Mon Sep 17 00:00:00 2001 From: Binnette Date: Tue, 19 Nov 2024 12:14:45 +0100 Subject: [PATCH 011/145] Tests: add missing 'gpx-test.gpx' file --- app/src/test/assets/gpx/gpx-test.gpx | 45 ++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 app/src/test/assets/gpx/gpx-test.gpx diff --git a/app/src/test/assets/gpx/gpx-test.gpx b/app/src/test/assets/gpx/gpx-test.gpx new file mode 100644 index 000000000..5509a41ec --- /dev/null +++ b/app/src/test/assets/gpx/gpx-test.gpx @@ -0,0 +1,45 @@ + + + + 5812.2 + + + + http://link1.com + + 2 + 0.0625 + + + 75.4 + + + + http://link2.com + + 6 + 0.1525000035762787 + + + + + + + 4321.7 + + 0.10499999672174454 + + 45.79999923706055 + + + + 12.1 + + 0.05999999865889549 + + 12.600000381469727 + + + + + From 7f262c54dd23ad9bb3e4eb6f7f8143966a18d4aa Mon Sep 17 00:00:00 2001 From: Milton Barrera <66586151+miltonials@users.noreply.github.com> Date: Tue, 19 Nov 2024 07:48:50 -0600 Subject: [PATCH 012/145] Updating the target SDK to 35 with the necessary changes in dependencies, permissions and execution flows (#457) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Gradle update * Target SDK update from 33 to 35 * Explicit execution of buttons presets window * Fix: Enabled UI buttons for marking waypoint features after accurate position fix is obtained After the SDK update, UI buttons for marking waypoints remained disabled even after an accurate fix was acquired. This fix ensures that the UI buttons are enabled as soon as an accurate fix is confirmed, improving user experience in "hot start" situations. * Add distributionSha256Sum for integrity verification in Gradle wrapper * small fix Ensured broadcast intents are set with the package name in TagButtonOnClickListener.java, this was causing that the waypoints select meanwhile a track is recorded weren´t been saved. --------- Co-authored-by: Fredd Badilla Víquez Co-authored-by: Binnette --- app/build.gradle | 4 ++-- app/src/main/AndroidManifest.xml | 1 + .../main/java/net/osmtracker/activity/Preferences.java | 10 ++++++++++ .../main/java/net/osmtracker/activity/TrackLogger.java | 7 +++++++ .../java/net/osmtracker/activity/TrackManager.java | 1 + .../java/net/osmtracker/layout/GpsStatusRecord.java | 5 +++++ .../osmtracker/listener/TagButtonOnClickListener.java | 4 ++++ .../java/net/osmtracker/service/gps/GPSLogger.java | 2 +- .../service/gps/GPSLoggerServiceConnection.java | 1 + app/src/main/res/xml/preferences.xml | 2 +- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 5 +++-- 12 files changed, 37 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5e8f23640..055c312c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,12 +5,12 @@ apply plugin: 'kotlin-android-extensions' android { useLibrary 'org.apache.http.legacy' - compileSdk 33 + compileSdk 35 defaultConfig { applicationId "net.osmtracker" minSdkVersion 25 - targetSdkVersion 33 + targetSdkVersion 35 multiDexEnabled true testApplicationId "net.osmtracker.test" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f7f29281b..d5928439a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + diff --git a/app/src/main/java/net/osmtracker/activity/Preferences.java b/app/src/main/java/net/osmtracker/activity/Preferences.java index b32133503..415170f7b 100644 --- a/app/src/main/java/net/osmtracker/activity/Preferences.java +++ b/app/src/main/java/net/osmtracker/activity/Preferences.java @@ -68,6 +68,16 @@ protected void onCreate(Bundle savedInstanceState) { // and register a change listener to set again the summary in case of change final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + // Explicit execution of buttons presets window + Preference buttonLayoutPref = findPreference("prefs_ui_buttons_layout"); + if (buttonLayoutPref != null) { + buttonLayoutPref.setOnPreferenceClickListener(preference -> { + Intent intent = new Intent(this, ButtonsPresets.class); + startActivity(intent); + return true; + }); + } + // External storage directory EditTextPreference storageDirPref = (EditTextPreference) findPreference(OSMTracker.Preferences.KEY_STORAGE_DIR); storageDirPref.setSummary(prefs.getString(OSMTracker.Preferences.KEY_STORAGE_DIR, OSMTracker.Preferences.VAL_STORAGE_DIR)); diff --git a/app/src/main/java/net/osmtracker/activity/TrackLogger.java b/app/src/main/java/net/osmtracker/activity/TrackLogger.java index dd76dc053..c3d8d0d0f 100644 --- a/app/src/main/java/net/osmtracker/activity/TrackLogger.java +++ b/app/src/main/java/net/osmtracker/activity/TrackLogger.java @@ -179,6 +179,10 @@ public class TrackLogger extends Activity { */ private HashSet layoutNameTags = new HashSet(); + public boolean getButtonsEnabled() { + return buttonsEnabled; + } + @Override protected void onCreate(Bundle savedInstanceState) { @@ -475,6 +479,7 @@ public boolean onOptionsItemSelected(MenuItem item) { saveTagsForTrack(); Intent intent = new Intent(OSMTracker.INTENT_STOP_TRACKING); + intent.setPackage(getPackageName()); sendBroadcast(intent); ((GpsStatusRecord) findViewById(R.id.gpsStatus)).manageRecordingIndicator(false); finish(); @@ -606,6 +611,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { intent.putExtra(TrackContentProvider.Schema.COL_TRACK_ID, currentTrackId); intent.putExtra(OSMTracker.INTENT_KEY_NAME, getResources().getString(R.string.wpt_stillimage)); intent.putExtra(OSMTracker.INTENT_KEY_LINK, imageFile.getName()); + intent.setPackage(this.getPackageName()); sendBroadcast(intent); } } @@ -628,6 +634,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { intent.putExtra(TrackContentProvider.Schema.COL_TRACK_ID, currentTrackId); intent.putExtra(OSMTracker.INTENT_KEY_NAME, getResources().getString(R.string.wpt_stillimage)); intent.putExtra(OSMTracker.INTENT_KEY_LINK, imageFile.getName()); + intent.setPackage(this.getPackageName()); sendBroadcast(intent); } } diff --git a/app/src/main/java/net/osmtracker/activity/TrackManager.java b/app/src/main/java/net/osmtracker/activity/TrackManager.java index 337485293..0c6c9b577 100644 --- a/app/src/main/java/net/osmtracker/activity/TrackManager.java +++ b/app/src/main/java/net/osmtracker/activity/TrackManager.java @@ -688,6 +688,7 @@ private void stopActiveTrack(){ if(currentTrackId != TRACK_ID_NO_TRACK){ // we send a broadcast to inform all registered services to stop tracking Intent intent = new Intent(OSMTracker.INTENT_STOP_TRACKING); + intent.setPackage(this.getPackageName()); sendBroadcast(intent); // need to get sure, that the database is up to date diff --git a/app/src/main/java/net/osmtracker/layout/GpsStatusRecord.java b/app/src/main/java/net/osmtracker/layout/GpsStatusRecord.java index 70dd94b9f..f2b264d9d 100644 --- a/app/src/main/java/net/osmtracker/layout/GpsStatusRecord.java +++ b/app/src/main/java/net/osmtracker/layout/GpsStatusRecord.java @@ -8,6 +8,7 @@ import android.Manifest; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; import android.location.GnssStatus; import android.location.Location; @@ -163,6 +164,10 @@ public void onLocationChanged(Location location) { activity.onGpsEnabled(); manageRecordingIndicator(true); } + else if (gpsActive && !activity.getButtonsEnabled()) { + activity.onGpsEnabled(); + manageRecordingIndicator(true); + } TextView tvAccuracy = findViewById(R.id.gpsstatus_record_tvAccuracy); if (location.hasAccuracy()) { diff --git a/app/src/main/java/net/osmtracker/listener/TagButtonOnClickListener.java b/app/src/main/java/net/osmtracker/listener/TagButtonOnClickListener.java index b4a8da875..149f9af5b 100644 --- a/app/src/main/java/net/osmtracker/listener/TagButtonOnClickListener.java +++ b/app/src/main/java/net/osmtracker/listener/TagButtonOnClickListener.java @@ -36,6 +36,10 @@ public void onClick(View view) { Intent intent = new Intent(OSMTracker.INTENT_TRACK_WP); intent.putExtra(TrackContentProvider.Schema.COL_TRACK_ID, currentTrackId); intent.putExtra(OSMTracker.INTENT_KEY_NAME, label); + + String packageName = view.getContext().getPackageName(); + intent.setPackage(packageName); + view.getContext().sendBroadcast(intent); // Inform user that the waypoint was tracked diff --git a/app/src/main/java/net/osmtracker/service/gps/GPSLogger.java b/app/src/main/java/net/osmtracker/service/gps/GPSLogger.java index d02ecdb24..4f2dba3a6 100644 --- a/app/src/main/java/net/osmtracker/service/gps/GPSLogger.java +++ b/app/src/main/java/net/osmtracker/service/gps/GPSLogger.java @@ -222,7 +222,7 @@ public void onCreate() { filter.addAction(OSMTracker.INTENT_DELETE_WP); filter.addAction(OSMTracker.INTENT_START_TRACKING); filter.addAction(OSMTracker.INTENT_STOP_TRACKING); - registerReceiver(receiver, filter); + registerReceiver(receiver, filter, Context.RECEIVER_NOT_EXPORTED); // Register ourselves for location updates lmgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE); diff --git a/app/src/main/java/net/osmtracker/service/gps/GPSLoggerServiceConnection.java b/app/src/main/java/net/osmtracker/service/gps/GPSLoggerServiceConnection.java index fcf26a7c6..e7d22f67b 100644 --- a/app/src/main/java/net/osmtracker/service/gps/GPSLoggerServiceConnection.java +++ b/app/src/main/java/net/osmtracker/service/gps/GPSLoggerServiceConnection.java @@ -50,6 +50,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { activity.setEnabledActionButtons(false); Intent intent = new Intent(OSMTracker.INTENT_START_TRACKING); intent.putExtra(TrackContentProvider.Schema.COL_TRACK_ID, activity.getCurrentTrackId()); + intent.setPackage(activity.getPackageName()); activity.sendBroadcast(intent); } } diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 55bb33f7d..108a29550 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -100,7 +100,7 @@ android:key="ui.theme" android:summary="@string/prefs_theme_summary" android:defaultValue="@style/DefaultTheme" /> - + Date: Tue, 19 Nov 2024 12:58:27 -0600 Subject: [PATCH 013/145] Update GPX export path to Documents folder for user accessibility (#458) * SDK and MinSKD update * Change GPX export to user-accessible location Modifies the GPX export path to save files in a user-accessible location. Previously, files were exported to a default location that was not visible to the user, making access difficult. Exports are now saved in the Downloads folder. The solution works up to the latest version, Android 14. Co-Authored-By: Kevin Salazar <80077213+Kevin-Salazar-itcr@users.noreply.github.com> * Update strings-preferences.xml Changed the GPX export location to the Documents folder for better organization and user accessibility, as per feedback. Adjusted related strings and resolved conflicts with PR #451 * Update GPX export logic * Update GpsStatusRecord.java * Update About.java * Update ExportToStorageTask.java * Update strings-preferences.xml * Update ExportToStorageTask.java * Update ExportToStorageTask.java * Update AndroidManifest.xml --------- Co-authored-by: Kevin Salazar <80077213+Kevin-Salazar-itcr@users.noreply.github.com> Co-authored-by: Binnette --- app/src/main/AndroidManifest.xml | 7 +------ .../main/java/net/osmtracker/activity/About.java | 2 +- .../net/osmtracker/gpx/ExportToStorageTask.java | 16 ++++++++-------- app/src/main/res/values/strings-preferences.xml | 2 +- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d5928439a..6f1526cff 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,11 +17,6 @@ - - - - - - \ No newline at end of file + diff --git a/app/src/main/java/net/osmtracker/activity/About.java b/app/src/main/java/net/osmtracker/activity/About.java index 69406cb30..84aa7804c 100644 --- a/app/src/main/java/net/osmtracker/activity/About.java +++ b/app/src/main/java/net/osmtracker/activity/About.java @@ -48,7 +48,7 @@ protected void onCreate(Bundle savedInstanceState) { } catch (NameNotFoundException nnfe) { // Should not occur } - + findViewById(R.id.about_debug_info_button).setOnClickListener( new OnClickListener() { diff --git a/app/src/main/java/net/osmtracker/gpx/ExportToStorageTask.java b/app/src/main/java/net/osmtracker/gpx/ExportToStorageTask.java index b53d65a65..6abc1023d 100644 --- a/app/src/main/java/net/osmtracker/gpx/ExportToStorageTask.java +++ b/app/src/main/java/net/osmtracker/gpx/ExportToStorageTask.java @@ -41,6 +41,7 @@ protected File getExportDirectory(Date startDate) throws ExportTrackException { String trackName = getSanitizedTrackNameByStartDate(startDate); boolean shouldCreateDirectoryPerTrack = shouldCreateDirectoryPerTrack(preferences); File finalExportDirectory = getBaseExportDirectory(preferences); + Log.d(TAG, "absolute dir: " + finalExportDirectory.getAbsolutePath().toString()); if( shouldCreateDirectoryPerTrack && trackName.length() >= 1){ String uniqueFolderName = getUniqueChildNameFor(finalExportDirectory, trackName, ""); @@ -86,32 +87,31 @@ private boolean isExternalStorageWritable() { } // Create before returning if not exists - public File getBaseExportDirectory(SharedPreferences prefs) throws ExportTrackException { + public File getBaseExportDirectory(SharedPreferences prefs) throws ExportTrackException { if (!isExternalStorageWritable()) { throw new ExportTrackException( context.getResources().getString(R.string.error_externalstorage_not_writable)); } - String exportDirectoryNameInPreferences = prefs.getString( OSMTracker.Preferences.KEY_STORAGE_DIR, OSMTracker.Preferences.VAL_STORAGE_DIR); Log.d(TAG,"exportDirectoryNameInPreferences: " + exportDirectoryNameInPreferences); File baseExportDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), exportDirectoryNameInPreferences); - - if(! baseExportDirectory.exists()){ + + // if folder not exists, create it + if (!baseExportDirectory.exists()) { boolean ok = baseExportDirectory.mkdirs(); if (!ok) { throw new ExportTrackException( - context.getResources().getString( - R.string.error_externalstorage_not_writable)); + context.getResources().getString(R.string.error_externalstorage_not_writable)); } } - Log.d(TAG, "BaseExportDirectory: " + baseExportDirectory); + Log.d(TAG, "BaseExportDirectory: " + baseExportDirectory.getAbsolutePath()); return baseExportDirectory; - } + } @Override protected boolean exportMediaFiles() { diff --git a/app/src/main/res/values/strings-preferences.xml b/app/src/main/res/values/strings-preferences.xml index 685476434..7f908c769 100644 --- a/app/src/main/res/values/strings-preferences.xml +++ b/app/src/main/res/values/strings-preferences.xml @@ -73,7 +73,7 @@ Always display OpenStreetMap background? Requires a data connection GPX settings - External storage (SD) directory + Storage folder in documents Effective for the next track (not the current one) One directory per track Save each track and associated files to its own directory From 8727ea644a8a22b7df95fdf37e24f8274efc9d39 Mon Sep 17 00:00:00 2001 From: Binnette Date: Tue, 19 Nov 2024 18:06:59 +0100 Subject: [PATCH 014/145] Test: set java version to 17 to solve compatibility issue with powermock --- app/build.gradle | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 055c312c2..b1a144e1b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,6 +17,15 @@ android { testInstrumentationRunner "android.test.InstrumentationTestRunner" } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } + signingConfigs { // Create a file $HOME/.gradle/gradle.properties // containing the values signing.storeFile=..., etc. From ee97a0d104f9d80e91ea43f15bb80fe534be9774 Mon Sep 17 00:00:00 2001 From: Binnette Date: Wed, 20 Nov 2024 00:00:38 +0100 Subject: [PATCH 015/145] Tests: fix encoding issue in test getStringFromStream --- .../osmtracker/util/CustomLayoutsUtils.java | 4 ++- .../util/CustomLayoutsUtilsTest.java | 28 ++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/net/osmtracker/util/CustomLayoutsUtils.java b/app/src/main/java/net/osmtracker/util/CustomLayoutsUtils.java index ca12f4e8f..dbd38ea2b 100644 --- a/app/src/main/java/net/osmtracker/util/CustomLayoutsUtils.java +++ b/app/src/main/java/net/osmtracker/util/CustomLayoutsUtils.java @@ -16,6 +16,8 @@ import java.io.Reader; import java.io.StringWriter; import java.io.Writer; +import java.nio.charset.StandardCharsets; + /** * Created by adma9717 on 12/8/17. */ @@ -74,7 +76,7 @@ public static String getStringFromStream(InputStream stream) throws IOException Writer writer = new StringWriter(); char[] buffer = new char[2048]; try { - Reader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); + Reader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)); int counter; while ((counter = reader.read(buffer)) != -1) { writer.write(buffer, 0, counter); diff --git a/app/src/test/java/net/osmtracker/util/CustomLayoutsUtilsTest.java b/app/src/test/java/net/osmtracker/util/CustomLayoutsUtilsTest.java index d78e68f02..0d0a2efaa 100644 --- a/app/src/test/java/net/osmtracker/util/CustomLayoutsUtilsTest.java +++ b/app/src/test/java/net/osmtracker/util/CustomLayoutsUtilsTest.java @@ -13,9 +13,12 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.Scanner; import static org.junit.Assert.assertEquals; @@ -85,17 +88,22 @@ public void createFileName() { @Test public void getStringFromStream() throws IOException { setupMocks(); - InputStream is = mockAssetManager.open("result.gpx"); - String result = CustomLayoutsUtils.getStringFromStream(is); - is.close(); - is = mockAssetManager.open("expected.gpx"); - Scanner s = new Scanner(is).useDelimiter("\\A"); - String expected = s.hasNext() ? s.next() : ""; - is.close(); - System.out.println(expected); - - assertEquals(expected, result); + InputStream resultIs = mockAssetManager.open("result.gpx"); + String result = CustomLayoutsUtils.getStringFromStream(resultIs); + + String expected; + try (InputStream expectedIs = mockAssetManager.open("expected.gpx"); + InputStreamReader expectedIsr = new InputStreamReader(expectedIs, StandardCharsets.UTF_8); + BufferedReader expectedReader = new BufferedReader(expectedIsr)) { + StringBuilder expectedBuilder = new StringBuilder(); + String line; + while ((line = expectedReader.readLine()) != null) { + expectedBuilder.append(line).append(System.lineSeparator()); + } + expected = expectedBuilder.toString(); + } + assertEquals("String should have same content", expected, result); } @Test From ae5632642c84b7a60c0e05822659152bd36d54e1 Mon Sep 17 00:00:00 2001 From: Binnette Date: Wed, 20 Nov 2024 00:22:28 +0100 Subject: [PATCH 016/145] Add GitHub Android Workflow --- .github/workflows/android.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/android.yml diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 000000000..8381af8f0 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,35 @@ +name: Android CI + +on: + push: + branches: + - main + - develop + pull_request: + branches: + - develop + +jobs: + build: + name: Build and Test + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4.2.2 + + - name: Setup Java JDK + uses: actions/setup-java@v4.5.0 + with: + distribution: 'temurin' + java-version: '17' + cache: 'gradle' + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + run: ./gradlew build --stacktrace + + - name: Run unit tests + run: ./gradlew testDebugUnitTest --stacktrace From d684075656a40cbef12f591872071ab7a2bd1375 Mon Sep 17 00:00:00 2001 From: Binnette Date: Thu, 21 Nov 2024 13:54:24 +0100 Subject: [PATCH 017/145] Update README. Add build badge --- README.md | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 09538cd22..0403e78f1 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,27 @@ +# OSMTracker for Android™ + +![Build](https://github.com/labexp/osmtracker-android/actions/workflows/android.yml/badge.svg) + +**OSMTracker for Android™** is a mobile app designed for OpenStreetMap mappers and outdoor adventurers. It lets you log a GPS track to document your journey. Its customizable buttons let you simply add POIs as track points directly inside your GPX track. + +It also supports voice recording, picture taking, and note-taking. This is the perfect app to survey a place or a path whether you are hiking, cycling, or exploring new areas. + +![Main screen](https://wiki.openstreetmap.org/w/images/thumb/7/7b/OSMTracker-Android-main-screen-en.jpg/200px-OSMTracker-Android-main-screen-en.jpg) + +Here is a screenshot of the main screen with its default buttons. You can [customize](https://github.com/labexp/osmtracker-android/wiki/Custom-buttons-layouts) these buttons to your liking. + +## Get the App 📲 + [Get it on Google Play](https://play.google.com/store/apps/details?id=net.osmtracker) [Get it on F-Droid](https://f-droid.org/app/net.osmtracker) -OSMTracker for Android™ official source code repository is [https://github.com/labexp/osmtracker-android](https://github.com/labexp/osmtracker-android). - -[![Build Status](https://travis-ci.org/labexp/osmtracker-android.svg?branch=master)](https://travis-ci.org/labexp/osmtracker-android) +## More Info ℹ -For more information about the project, documentation and bug reports please visit https://github.com/labexp/osmtracker-android/wiki +- Find more information in the [documentation](https://github.com/labexp/osmtracker-android/wiki) +- Submit bug reports in the [issue tracker](https://github.com/labexp/osmtracker-android/issues) +- Contributions are welcome, please visit our [contributor guide](https://github.com/labexp/osmtracker-android/blob/master/CONTRIBUTING.md) +- Translations can be done on [Transifex](https://explore.transifex.com/labexp/osmtracker-android/) -If you are interested in contribute to this project, please visit https://github.com/labexp/osmtracker-android/blob/master/CONTRIBUTING.md to know the way you could do it. +## Note 📝 -To help translate OSMTracker, please visit https://explore.transifex.com/labexp/osmtracker-android/ +OSMTracker for Android™ official source code repository is [https://github.com/labexp/osmtracker-android](https://github.com/labexp/osmtracker-android). \ No newline at end of file From e1251f4d8d7f25da0f8964e1321ded9321a8c3b5 Mon Sep 17 00:00:00 2001 From: Binnette Date: Thu, 21 Nov 2024 13:55:36 +0100 Subject: [PATCH 018/145] Change workflow name to 'Build' --- .github/workflows/android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 8381af8f0..4bf46b482 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -1,4 +1,4 @@ -name: Android CI +name: Build on: push: From 800610f74bdaaf3cdba00e872117c36c1e79a9db Mon Sep 17 00:00:00 2001 From: Binnette Date: Thu, 21 Nov 2024 18:40:47 +0100 Subject: [PATCH 019/145] Update Transifex link in App --- app/src/main/res/values/values.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/values.xml b/app/src/main/res/values/values.xml index 91590768b..18fd850ac 100644 --- a/app/src/main/res/values/values.xml +++ b/app/src/main/res/values/values.xml @@ -2,6 +2,6 @@ https://github.com/labexp/osmtracker-android - https://www.transifex.com/projects/p/osmtracker-android/ + https://explore.transifex.com/labexp/osmtracker-android/ From b37cd98f7747dc349e668691a383e75a5a50cdc0 Mon Sep 17 00:00:00 2001 From: Binnette Date: Thu, 21 Nov 2024 18:42:43 +0100 Subject: [PATCH 020/145] Fix #323 #322: Texts on about page --- app/src/main/res/layout/about.xml | 166 ++++++++++++++---------------- 1 file changed, 76 insertions(+), 90 deletions(-) diff --git a/app/src/main/res/layout/about.xml b/app/src/main/res/layout/about.xml index 9234145c3..2c728fec4 100644 --- a/app/src/main/res/layout/about.xml +++ b/app/src/main/res/layout/about.xml @@ -1,125 +1,111 @@ + android:id="@+id/about_root" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:padding="10dp"> - - - - - + android:layout_alignParentTop="true"> - - - - - + - - - + + + + + + + + + + + + - + android:text="@string/about_text" /> - - - - + android:text="@string/about_link" /> - + android:text="@string/about_translate_text" /> - - + android:text="@string/about_translate_link" /> + - + -