diff --git a/apk/GPSLogger-3.2.3.apk b/apk/GPSLogger-3.2.3.apk new file mode 100644 index 00000000..47662650 Binary files /dev/null and b/apk/GPSLogger-3.2.3.apk differ diff --git a/apk/GPSLogger-latest.apk b/apk/GPSLogger-latest.apk index 344711f5..47662650 100644 Binary files a/apk/GPSLogger-latest.apk and b/apk/GPSLogger-latest.apk differ diff --git a/app/build.gradle b/app/build.gradle index 9e07498f..beb78e34 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,18 +23,17 @@ apply plugin: 'com.android.application' android { namespace 'eu.basicairdata.graziano.gpslogger' - compileSdk 33 - buildToolsVersion '33.0.1' + compileSdk 34 defaultConfig { applicationId "eu.basicairdata.graziano.gpslogger" minSdkVersion 14 - targetSdkVersion 33 + targetSdkVersion 34 // ----------------------------------------------------------------------------------------- // We use the Semantic Versioning (https://semver.org/): - versionName '3.2.2' - versionCode 51 + versionName '3.2.3' + versionCode 52 // ----------------------------------------------------------------------------------------- vectorDrawables.useSupportLibrary = true @@ -76,7 +75,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.2.1' - implementation 'androidx.preference:preference:1.2.0' + implementation 'androidx.preference:preference:1.2.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1' implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a9f4173a..9e79c1f1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + diff --git a/app/src/main/java/eu/basicairdata/graziano/gpslogger/FragmentRecordingControls.java b/app/src/main/java/eu/basicairdata/graziano/gpslogger/FragmentRecordingControls.java index ec3e6d78..8891cb0f 100644 --- a/app/src/main/java/eu/basicairdata/graziano/gpslogger/FragmentRecordingControls.java +++ b/app/src/main/java/eu/basicairdata/graziano/gpslogger/FragmentRecordingControls.java @@ -33,7 +33,9 @@ import androidx.fragment.app.Fragment; import android.os.Vibrator; +import android.util.Log; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -90,6 +92,7 @@ public void onClick(View v) { } }); tvAnnotateButton = view.findViewById(R.id.id_annotate); + tvAnnotateButton.setHapticFeedbackEnabled(false); tvAnnotateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -111,6 +114,7 @@ public boolean onLongClick(View v) { } }); tvRecordButton = view.findViewById(R.id.id_record); + tvRecordButton.setHapticFeedbackEnabled(false); tvRecordButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -118,6 +122,30 @@ public void onClick(View v) { ((GPSActivity) getActivity()).onToggleRecord(); } }); + tvRecordButton.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (isAdded()) { + //Log.w("myApp", "[#] FragmentRecordingControls.java - REQUEST TO ACTIVATE FORCED RECORDING OF TRACKPOINTS"); + ((GPSActivity) getActivity()).onRequestForceRecord(); + Update(); + } + return true; + } + }); + tvRecordButton.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) { + //Log.w("myApp", "[#] FragmentRecordingControls.java - (ACTION DOWN FOR FORCED RECORDING OF TRACKPOINTS)"); + } else if (event.getAction() == android.view.MotionEvent.ACTION_UP || event.getAction() == android.view.MotionEvent.ACTION_CANCEL) { + Log.w("myApp", "[#] FragmentRecordingControls.java - DEACTIVATE FORCE RECORDING OF TRACKPOINTS"); + gpsApp.setForcedTrackpointsRecording(false); + Update(); + } + return false; + } + }); tvGeoPointsNumber = view.findViewById(R.id.id_textView_GeoPoints); tvPlacemarksNumber = view.findViewById(R.id.id_textView_Placemarks); return view; @@ -234,7 +262,7 @@ private void setButtonToDisabledState(@NonNull TextView button, int imageId, int public void Update() { if (isAdded()) { final Track track = gpsApp.getCurrentTrack(); - final boolean isRec = gpsApp.isRecording(); + final boolean isRec = gpsApp.isRecording() || gpsApp.isForcedTrackpointsRecording(); final boolean isAnnot = gpsApp.isPlacemarkRequested(); final boolean isLck = gpsApp.isBottomBarLocked(); if (track != null) { diff --git a/app/src/main/java/eu/basicairdata/graziano/gpslogger/GPSActivity.java b/app/src/main/java/eu/basicairdata/graziano/gpslogger/GPSActivity.java index 1f749037..859912df 100644 --- a/app/src/main/java/eu/basicairdata/graziano/gpslogger/GPSActivity.java +++ b/app/src/main/java/eu/basicairdata/graziano/gpslogger/GPSActivity.java @@ -23,6 +23,8 @@ import android.Manifest; import android.app.Activity; +import android.app.Application; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -48,12 +50,15 @@ import androidx.preference.PreferenceManager; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.Toolbar; + +import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.Window; import android.view.WindowManager; import android.widget.Toast; @@ -135,6 +140,7 @@ public void onTabSelected(TabLayout.Tab tab) { bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); bottomSheetBehavior.setHideable(false); bottomSheet.setFocusable(false); + updateNavigationBarColor(getWindow(),getApplicationContext()); } @Override @@ -818,6 +824,25 @@ public void onRequestAnnotation() { } } + /** + * Process the request to to force recording the current trackpoint. It manages the button behaviour and + * the status of the request. + * It also displays some toasts to inform the user about some conditions. + */ + public void onRequestForceRecord() { + if (!gpsApp.isBottomBarLocked()) { + //Log.w("myApp", "[#] GPSActivity.java - ACTIVATE FORCED RECORDING OF TRACKPOINTS"); + gpsApp.setForcedTrackpointsRecording(true); + //Update(); + } else { + //Log.w("myApp", "[#] GPSActivity.java - FORCED RECORDING OF TRACKPOINTS NOT POSSIBLE, BOTTOM BAR LOCKED"); + if (toast != null) toast.cancel(); + toast = Toast.makeText(gpsApp.getApplicationContext(), R.string.toast_bottom_bar_locked, Toast.LENGTH_SHORT); + toast.setGravity(Gravity.BOTTOM, 0, TOAST_VERTICAL_OFFSET); + toast.show(); + } + } + /** * Manages the Lock button behaviour. */ @@ -831,4 +856,21 @@ public void onToggleLock() { } //Update(); } + + /** + * Updates the navigation bar background and icon colors to match the bottom bar background based on the theme. + */ + public void updateNavigationBarColor(Window window, Context applicationContext) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + if (window != null && applicationContext instanceof Application) { + // Retrieve the preferred color theme from shared preferences and check if it's "1" + if (TextUtils.equals("1", PreferenceManager.getDefaultSharedPreferences(applicationContext).getString("prefColorTheme", "2"))) { + window.setNavigationBarColor(getResources().getColor(R.color.colorRecControlBackground,getTheme())); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } else { + window.setNavigationBarColor(getResources().getColor(R.color.colorRecControlBackground,getTheme())); + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/eu/basicairdata/graziano/gpslogger/GPSApplication.java b/app/src/main/java/eu/basicairdata/graziano/gpslogger/GPSApplication.java index ccaa8782..88bd21df 100644 --- a/app/src/main/java/eu/basicairdata/graziano/gpslogger/GPSApplication.java +++ b/app/src/main/java/eu/basicairdata/graziano/gpslogger/GPSApplication.java @@ -67,6 +67,7 @@ import androidx.documentfile.provider.DocumentFile; import androidx.preference.PreferenceManager; +import android.os.Vibrator; import android.util.Log; import org.greenrobot.eventbus.EventBus; @@ -197,6 +198,7 @@ public class GPSApplication extends Application implements LocationListener { private boolean isRecording; // True if the recording is active private boolean isBottomBarLocked; // True if the bottom bar is locked private boolean isGPSLocationUpdatesActive; // True if the Location Manager is active (is requesting FIXes) + private boolean isForcedTrackpointsRecording = false; // if True, the current fix is recorded into the track; private int gpsStatus = GPS_SEARCHING; // The status of the GPS: GPS_DISABLED, GPS_OUTOFSERVICE, // GPS_TEMPORARYUNAVAILABLE, GPS_SEARCHING, GPS_STABILIZING; private LocationManager locationManager = null; // GPS LocationManager @@ -453,13 +455,18 @@ public void onServiceDisconnected(ComponentName arg0) { /** * Starts and Binds to the Foreground Service GPSService */ - private void startAndBindGPSService() { - gpsServiceIntent = new Intent(GPSApplication.this, GPSService.class); - //Start the service - startService(gpsServiceIntent); - //Bind to the service - bindService(gpsServiceIntent, gpsServiceConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT); - Log.w("myApp", "[#] GPSApplication.java - StartAndBindGPSService"); + public void startAndBindGPSService() { + if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) && + (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { + gpsServiceIntent = new Intent(GPSApplication.this, GPSService.class); + //Start the service + startService(gpsServiceIntent); + //Bind to the service + bindService(gpsServiceIntent, gpsServiceConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT); + Log.w("myApp", "[#] GPSApplication.java - StartAndBindGPSService - SERVICE STARTED"); + } else { + Log.w("myApp", "[#] GPSApplication.java - StartAndBindGPSService - UNABLE TO START THE SERVICE"); + } } /** @@ -690,6 +697,14 @@ public void setCurrentTrackVisible(boolean currentTrackVisible) { isCurrentTrackVisible = currentTrackVisible; } + public boolean isForcedTrackpointsRecording() { + return isForcedTrackpointsRecording; + } + + public void setForcedTrackpointsRecording(boolean forcedTrackpointsRecording) { + isForcedTrackpointsRecording = forcedTrackpointsRecording; + } + public boolean isBackgroundActivityRestricted() { return isBackgroundActivityRestricted; } @@ -1183,7 +1198,7 @@ public void onLocationChanged(@NonNull Location loc) { // Distance Filter and Interval Filter in OR // The Trackpoint is recorded when at less one filter is True. - if ((isRecording) && ((prevRecordedFix == null) + if ((isRecording && ((prevRecordedFix == null) || (forceRecord) // Forced to record the point || ((prefGPSinterval == 0) && (prefGPSdistance == 0)) // No filters enabled --> it records all the points || ((prefGPSinterval > 0) @@ -1196,7 +1211,14 @@ public void onLocationChanged(@NonNull Location loc) { || ((prefGPSinterval == 0) && (prefGPSdistance > 0) // Only distance filter enabled && ((loc.distanceTo(prevRecordedFix.getLocation()) >= prefGPSdistance))) - || (currentTrack.getNumberOfLocations() == 0))){ // It is the first point of a track + || (currentTrack.getNumberOfLocations() == 0))) // It is the first point of a track + || (isForcedTrackpointsRecording)){ // recording button is long pressed + + if (isForcedTrackpointsRecording) { + Vibrator vibrator; + vibrator = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE); + vibrator.vibrate(150); + } prevRecordedFix = eloc; ast.taskType = TASK_ADDLOCATION; diff --git a/app/src/main/res/layout/activity_gps.xml b/app/src/main/res/layout/activity_gps.xml index 444622f4..463ae67d 100644 --- a/app/src/main/res/layout/activity_gps.xml +++ b/app/src/main/res/layout/activity_gps.xml @@ -82,4 +82,11 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-gl-rES/strings.xml b/app/src/main/res/values-gl-rES/strings.xml new file mode 100644 index 00000000..c6ccc536 --- /dev/null +++ b/app/src/main/res/values-gl-rES/strings.xml @@ -0,0 +1,215 @@ + + + + + Pos. GPS + Trazado + Arquivo + + Latitude + Lonxitude + Altitude + Velocidade + Dirección + Precisión + Tempo + Satélites + N + NNL + NL + LNL + L + LSL + SL + SSL + S + SSO + SO + OSO + O + ONO + NO + NNO + + GPS non accesíbel + GPS desactivado + GPS fora de servizo + Buscando GPS + Estabilización do sinal + A aplicación non pode acceder á localización + A aplicación non pode funcionar en segundo plano.\nPrema aquí para ir aos axustes do sistema onde, na sección de batería, pode permitir a actividade en segundo plano. + O sensor GPS está desactivado.\nPrema aquí para ir aos axustes do sistema, onde pode activar o servizo de localización e estabelecer un método de localización que utilice o sensor GPS + + Trazado + Duración + Vel. máxima + Vel. media + Distancia + Rumbo + Dif. altitude + + Novo trazado + Comezar a gravar puntos de seguimento\nou engadir unha anotación\nutilizando un dos botóns de embaixo + + Gravar + Pausar + Anotar + Deter + Bloquear + Desbloquear + Rematar o trazado + A barra inferior está bloqueada + Non hai nada que gardar + A gravación comezará cando se atope o sinal de GPS + A anotación tomarase cando se atope o sinal de GPS + Coordenadas copiadas no portapapeis + Aceptar + Anotacións + Puntos GPS + + Axustes + Trazado arquivado + Trazados exportados ao cartafol \"%1$s\" + Sobre + Axuda en liña + Apagar + + Engadir anotación + Introducir a descrición + Engadir + + Arquivo baleiro + Lonxitude + Duración + Dif. alt. + Vel. max. + Vel. media + Puntos + Notacións + + Exportar + Ver en… + Ver en %1$s + Eliminar + Compartir con… + Editar detalles + + Confirma que quere eliminar os trazados seleccionados? + Si + Non + Cancelar + Non é posíbel escribir o ficheiro + + Camiñadas + Auga e neve + Aéreo + Sobre rodas + Outros + + A aplicación foi derramada durante a gravación en segundo plano. + Comprobe nos axustes de Android que a aplicación non estea optimizada para a batería e tampouco estea restrinxida no segundo plano. + Abrir os axustes + + INTERFACE + Manter a pantalla acesa + A batería esgotase antes + Cor do tema + Escuro + Claro + Amosar coordenadas decimais + Parte fraccionaria en notación decimal + Amosar a hora do GPS no fuso horario local + no canto da hora global do GPS + Amosar o rumbo con + Graos leste respecto do norte + Puntos cardinais + Sistema de unidades + Métrico + Imperial + Aéreo / Náutico + Amosar as velocidades en + Cartafol de exportación local + Non definido + Visor de trazados + Non está instalado ningún visor GPX/KML + Preguntar sempre + SEGUIMENTO + Filtro de distancia + Filtro de intervalos + Desactivado + Intervalo de actualización de GPS + O máis curto dispoñíbel + 1 segundo (alta precisión) + 2 segundos + 3 segundos (baixa precisión) + CORRECCIÓNS DE ALTITUDE + Corrección por EGM96 + Corrección automática da altitude, baseada no xeoide terrestre da NGA + Descargando ficheiro de 2028 kB:\nAltitude do xeoide EGM96… + Corrección manual + Desprazamento sen definir + EXPORTACIÓN + Exportar os trazados a TXT + Texto simple, valores separados por comas + Exportar os trazados a KML + Keyhole Markup Language (v.2.2) + Exportar os trazados a GPX + Estándar GPS eXchange Format + Versión do estándar GPX + GPX 1.0 + GPX 1.1 + Modo de altitude KML + Absoluta + Proxectado ao chan + Estatísticas de trazado baseadas en + Tempo total + Tempo en movemento + + Produciuse un erro de descarga + Descarga completada + Produciuse un fallou na descarga. Ténteo de novo máis tarde + O trazado actual non está baleiro + Non hai ningún navegador de Internet instalado + + ver. + Copyright © 2016–%1$s BasicAirData\nhttps://www.basicairdata.eu\n\nBasicAirData GPS Logger rexistra trazados empregando a posición GPS. Pode velos na súa aplicación preferida, compartilos e exportalos ao seu dispositivo en formato KML, GPX e TXT.\n\nÉ software libre, publicado baixo os térmos da Licenza Pública Xertal de GNU.\nPara obter máis detalles consulte: https://www.gnu.org/licenses/gpl.txt + Se lle gusta usar esta aplicación, agradecémoslle que se tome un intre para valorar GPS Logger na Google Play Store. + Pechar + Avalía esta aplicación + Non é posíbel acceder á tenda + + está activo + + Está a pechar a aplicación.\nQuere rematar agora o trazado? + + m + km + m/s + km/h + ft + mi + fps + mph + NM + kn + s + diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 6854403a..081219b2 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -65,7 +65,7 @@ Vel. média Distância Orientação - Altitude Gap + Dif. de altitude Nova gravação de percurso Começar a gravação de Pontos\nou adicionar uma Anotação\nusando um dos botões abaixo diff --git a/build.gradle b/build.gradle index 9aac19bb..d1ee03fd 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { gradlePluginPortal() } dependencies { - classpath 'com.android.tools.build:gradle:8.1.2' + classpath 'com.android.tools.build:gradle:8.7.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/fastlane/metadata/android/en-US/changelogs/52.txt b/fastlane/metadata/android/en-US/changelogs/52.txt new file mode 100644 index 00000000..add7d97a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/52.txt @@ -0,0 +1,5 @@ +- Force recording the current trackpoint by holding down the Record button +- Added galician language +- Updated portuguese translation +- Upgraded to API 34 and updated dependencies +- Some UI refinements \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ccebba77..2c352119 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c9b0f7a0..68e8816d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,8 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 79a61d42..f5feea6d 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,10 +85,9 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +134,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +201,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 6689b85b..9b42019c 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/sourcecode/GPSLogger-3.2.3 - Source.zip b/sourcecode/GPSLogger-3.2.3 - Source.zip new file mode 100644 index 00000000..247f70c5 Binary files /dev/null and b/sourcecode/GPSLogger-3.2.3 - Source.zip differ