diff --git a/README.md b/README.md index 0d8889ba..ee024a10 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,15 @@ -# WheelLogAndroid +# WheelLogAndroid V2.0.9 -One more try to make it working with Inmotion V8 +Updated Gradle configuration to compile with Gradle 4.4 -Added support for Samsung Gear Tizen based watches +Inmotion V10 support + +Manual BLE MAC address edit + +When the app is in focus, pressing the volume up or down keys will trigger the native wheel beep (KingSong and Gotway) + +Pressing the Select button on a connected Pebble watch will trigger the native wheel beep (KingSong and Gotway), if enabled in preferences +This feature might work with a Tizen watch as well, please provide feedback as I don't have access to one Pebble app code diff --git a/app/build.gradle b/app/build.gradle index 046a25e0..bb374739 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,18 +2,17 @@ apply plugin: 'com.android.application' android { compileSdkVersion 25 - buildToolsVersion '27.0.3' lintOptions { abortOnError false } - defaultConfig { applicationId "com.cooper.wheellog" - minSdkVersion 18 - targetSdkVersion 25 + vectorDrawables.useSupportLibrary = true + minSdkVersion 24 + targetSdkVersion 24 versionCode 34 - versionName "2.0.8" + versionName '2.0.10' } buildTypes { release { @@ -21,20 +20,30 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + productFlavors { + } } //apply plugin: 'android-apt' dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:design:25.1.0' - implementation 'com.android.support:gridlayout-v7:25.1.0' - implementation 'com.google.android.gms:play-services-drive:10.0.1' + // implementation 'com.android.support:appcompat-v7:24.2.1' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:animated-vector-drawable:24.2.1' + implementation 'com.android.support:support-compat:24.2.1' + implementation 'com.android.support:design:24.2.1' + implementation 'com.android.support:preference-v7:24.2.1' + implementation 'com.android.support:gridlayout-v7:24.2.1' + //implementation 'com.google.android.gms:play-services-base:15.0.1' + //implementation 'com.google.android.gms:play-services-identity:15.0.1' + //implementation 'com.google.android.gms:play-services-auth:16.0.0' + implementation 'com.google.android.gms:play-services-drive:10.2.0' implementation 'com.getpebble:pebblekit:3.1.0' implementation 'com.github.JakeWharton:ViewPagerIndicator:2.4.1' implementation 'com.jakewharton.timber:timber:4.3.1' - implementation 'com.pavelsikun:material-seekbar-preference:2.3.0+' + implementation 'com.pavelsikun:material-seekbar-preference:2.3.0' implementation 'com.github.PhilJay:MPAndroidChart:v3.0.0' implementation "com.github.hotchemi:permissionsdispatcher:2.2.0" annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:2.2.0" + } diff --git a/app/src/main/java/com/cooper/wheellog/BluetoothLeService.java b/app/src/main/java/com/cooper/wheellog/BluetoothLeService.java index 9e84078e..d7e1c101 100644 --- a/app/src/main/java/com/cooper/wheellog/BluetoothLeService.java +++ b/app/src/main/java/com/cooper/wheellog/BluetoothLeService.java @@ -100,6 +100,10 @@ public void onReceive(Context context, Intent intent) { } break; case Constants.ACTION_REQUEST_KINGSONG_HORN: + WheelData.getInstance().makeWheelBeep(); + /* this is type-specific wheel beep code that has been moved to WheelData::makeWheelBeep(). + type-specific code has been implemented there. + if (WheelData.getInstance().getWheelType() == WHEEL_TYPE.KINGSONG) { byte[] data = new byte[20]; data[0] = (byte) -86; @@ -110,6 +114,7 @@ public void onReceive(Context context, Intent intent) { data[19] = (byte) 90; writeBluetoothGattCharacteristic(data); } + */ break; case Constants.ACTION_REQUEST_CONNECTION_TOGGLE: if (mConnectionState == STATE_DISCONNECTED) diff --git a/app/src/main/java/com/cooper/wheellog/MainActivity.java b/app/src/main/java/com/cooper/wheellog/MainActivity.java index 037e8d4e..cd58d53f 100644 --- a/app/src/main/java/com/cooper/wheellog/MainActivity.java +++ b/app/src/main/java/com/cooper/wheellog/MainActivity.java @@ -3,6 +3,8 @@ import android.Manifest; import android.app.Fragment; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; import android.bluetooth.BluetoothManager; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -59,12 +61,14 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Locale; +import java.util.UUID; import permissions.dispatcher.NeedsPermission; import permissions.dispatcher.OnPermissionDenied; import permissions.dispatcher.RuntimePermissions; import timber.log.Timber; +import static com.cooper.wheellog.utils.Constants.ACTION_REQUEST_KINGSONG_HORN; import static com.cooper.wheellog.utils.MathsUtil.kmToMiles; @@ -880,10 +884,26 @@ public void run() { } return true; default: - return super.onKeyDown(keyCode, event); + return super.onKeyDown(keyCode, event); // should this not be super.OnKeyUp() instead? *MacPara 20180504 } } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) || + (keyCode == KeyEvent.KEYCODE_VOLUME_UP)) + { + // Add code to sound the alarm here... + WheelData.getInstance().makeWheelBeep(); + return true; + } + else + return super.onKeyDown(keyCode, event); + + } + + ViewPager.SimpleOnPageChangeListener pageChangeListener = new ViewPager.SimpleOnPageChangeListener(){ @Override public void onPageSelected(int position) { @@ -899,13 +919,18 @@ private void loadPreferences() { int max_speed = sharedPreferences.getInt(getString(R.string.max_speed), 30) * 10; wheelView.setMaxSpeed(max_speed); wheelView.setUseMPH(use_mph); + WheelData.getInstance().setUseRatio(sharedPreferences.getBoolean(getString(R.string.use_ratio), false)); + WheelData.getInstance().setGotway84V(sharedPreferences.getBoolean(getString(R.string.gotway_84v), false)); + wheelView.invalidate(); boolean alarms_enabled = sharedPreferences.getBoolean(getString(R.string.alarms_enabled), false); + boolean use_ratio = sharedPreferences.getBoolean(getString(R.string.use_ratio), false); WheelData.getInstance().setUseRatio(use_ratio); boolean gotway_84v = sharedPreferences.getBoolean(getString(R.string.gotway_84v), false); WheelData.getInstance().setGotway84V(gotway_84v); + WheelData.getInstance().setAlarmsEnabled(alarms_enabled); if (alarms_enabled) { diff --git a/app/src/main/java/com/cooper/wheellog/PreferencesFragment.java b/app/src/main/java/com/cooper/wheellog/PreferencesFragment.java index b29caa75..d144e987 100644 --- a/app/src/main/java/com/cooper/wheellog/PreferencesFragment.java +++ b/app/src/main/java/com/cooper/wheellog/PreferencesFragment.java @@ -3,6 +3,8 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; @@ -19,8 +21,6 @@ import com.cooper.wheellog.utils.SettingsUtil; import com.pavelsikun.seekbarpreference.SeekBarPreference; -import timber.log.Timber; - public class PreferencesFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { enum SettingsScreen { @@ -42,8 +42,26 @@ enum SettingsScreen { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); + updateVersionTag(); + + } + + private void updateVersionTag() + { + Preference pref = getPreferenceScreen().findPreference(getString(R.string.VersionTag)); + if (pref == null) return; + + try { + PackageInfo pInfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); + String version = "pInfo"; + if (pInfo != null) version = "V" + pInfo.versionName; + pref.setTitle(version); + } + catch (Exception e) + { ; } } @Override @@ -113,10 +131,37 @@ public void onClick(DialogInterface dialog, int which) { boolean handle_button_disabled = sharedPreferences.getBoolean(getString(R.string.handle_button_disabled), false); WheelData.getInstance().updateHandleButton(handle_button_disabled); break; + case "ks_speed_alarm_1": + case "ks_speed_alarm_2": + case "ks_speed_alarm_3": case "wheel_max_speed": + final int max_speed = sharedPreferences.getInt(getString(R.string.wheel_max_speed), 0); + final int spd_alarm_1 = sharedPreferences.getInt("ks_speed_alarm)1", 0); + final int spd_alarm_2 = sharedPreferences.getInt("ks_speed_alarm)2", 0); + final int spd_alarm_3 = sharedPreferences.getInt("ks_speed_alarm)3", 0); + new AlertDialog.Builder(getActivity()) + .setTitle("Wheel Speed Alarm Change") + .setMessage("Do you want to write these alarms to your Kingsong wheel?\n 1/ 2/ 3/ tiltback\n"+ + String.format("%2d/%2d/%2d/%2d km/h", spd_alarm_1, spd_alarm_2, spd_alarm_3, max_speed)) + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + WheelData.getInstance().updateMaxSpeed(max_speed, spd_alarm_1, spd_alarm_2, spd_alarm_3); + } + }) + .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + // no action needed as changes to alarms should accumulative but we might need to add wanring message and reset of tiltback if answer is negative + //mSpeedWarningDisplayed = true; + //correctWheelBarState(getString(R.string.wheel_max_speed), WheelData.getInstance().getWheelMaxSpeed()); + + } + }) + .setIcon(android.R.drawable.ic_dialog_alert) + .show(); + //if (!mSpeedWarningDisplayed) { - final int max_speed = sharedPreferences.getInt(getString(R.string.wheel_max_speed), 0); - WheelData.getInstance().updateMaxSpeed(max_speed); + //final int max_speed = sharedPreferences.getInt(getString(R.string.wheel_max_speed), 0); + //WheelData.getInstance().updateMaxSpeed(max_speed); // if (max_speed > 30) { // new AlertDialog.Builder(getActivity()) // .setTitle("Are you sure?") @@ -174,6 +219,14 @@ public void onClick(DialogInterface dialog, int which) { int led_mode = Integer.parseInt(sharedPreferences.getString(getString(R.string.led_mode), "0")); WheelData.getInstance().updateLedMode(led_mode); break; + case "use_ratio": + boolean use_ratio = sharedPreferences.getBoolean(getString(R.string.use_ratio), false); + WheelData.getInstance().setUseRatio(use_ratio); + break; + case "gotway_84v": + boolean g84v_enabled = sharedPreferences.getBoolean(getString(R.string.gotway_84v), false); + WheelData.getInstance().setGotway84V(g84v_enabled); + break; // case "reset_user_trip": // WheelData.getInstance().resetUserDistance(); // break; @@ -356,7 +409,6 @@ public void onClick(DialogInterface dialog, int which) { builder1.show(); - //SettingsUtil.setPasswordForWheel(getActivity(), deviceAddress, "000000"); //finish(); } @@ -373,7 +425,6 @@ public void onClick(DialogInterface dialog, int which) { return true; } - }); } @@ -505,6 +556,7 @@ public boolean show_main_menu() { getPreferenceScreen().removeAll(); addPreferencesFromResource(R.xml.preferences); + updateVersionTag(); //System.out.println("ShowMainMenuRecognized"); Preference wheel_button = findPreference(getString(R.string.wheel_settings)); mWheelType = WheelData.getInstance().getWheelType(); diff --git a/app/src/main/java/com/cooper/wheellog/WheelData.java b/app/src/main/java/com/cooper/wheellog/WheelData.java index 4629e4d4..bddbc24c 100644 --- a/app/src/main/java/com/cooper/wheellog/WheelData.java +++ b/app/src/main/java/com/cooper/wheellog/WheelData.java @@ -78,7 +78,10 @@ public class WheelData { private boolean mWheelLedEnabled = false; private boolean mWheelButtonDisabled = false; private int mWheelMaxSpeed = 25; - private int mWheelSpeakerVolume = 50; + private int nWheelSpeedAlarm1 = 0; + private int nWheelSpeedAlarm2 = 0; + private int nWheelSpeedAlarm3 = 0; + private int mWheelSpeakerVolume = 50; private int mWheelTiltHorizon = 0; private boolean mAlarmsEnabled = false; @@ -310,7 +313,11 @@ public void updateHandleButton(boolean enabledButton) { } } - public void updateMaxSpeed(int wheelMaxSpeed) { + public void updateMaxSpeed(int wheelMaxSpeed) { + this.updateMaxSpeed(wheelMaxSpeed, 0, 0, wheelMaxSpeed - 1); + } + + public void updateMaxSpeed(int wheelMaxSpeed, int spd_alarm_1, int spd_alarm_2, int spd_alarm_3) { if (mWheelType == WHEEL_TYPE.INMOTION) { if (mWheelMaxSpeed != wheelMaxSpeed) { mWheelMaxSpeed = wheelMaxSpeed; @@ -345,8 +352,17 @@ public void updateMaxSpeed(int wheelMaxSpeed) { byte[] data = new byte[20]; data[0] = (byte) 0xAA; data[1] = (byte) 0x55; - data[6] = (byte) 0x1F; - data[8] = (byte) wheelMaxSpeed; + data[2] = (byte)spd_alarm_1; + data[3] = 0; + + data[4] = (byte)spd_alarm_2; + data[5] = 0; + data[6] = (byte)spd_alarm_3; + data[7] = 0; + data[8] = (byte)wheelMaxSpeed; + data[9] = 0; + //data[6] = (byte) 0x1F; // hardcoded to 31 km/h, yuck! + //data[8] = (byte) wheelMaxSpeed; data[16] = (byte) 0x85; data[17] = (byte) 0x14; data[18] = (byte) 0x5A; @@ -675,6 +691,29 @@ else if (mAlarm3Speed > 0 && mAlarm3Battery > 0 && } + public void makeWheelBeep() + { + switch (mWheelType) + { + case GOTWAY: + mBluetoothLeService.writeBluetoothGattCharacteristic("b".getBytes()); + break; + case INMOTION: break; + case KINGSONG: + byte[] data = new byte[20]; + data[0] = (byte) 0xaa; + data[1] = (byte)0x55; + data[16] = (byte) 0x88; + data[17] = 0x14; + data[18] = 0x5a; + data[19] = 0x5a; + mBluetoothLeService.writeBluetoothGattCharacteristic(data); + break; + case NINEBOT: break; + default: + } + } + private void raiseAlarm(ALARM_TYPE alarmType, Context mContext) { Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); long[] pattern = {0}; @@ -762,10 +801,10 @@ private boolean decodeKingSong(byte[] data) { if (data.length >= 20) { int a1 = data[0] & 255; int a2 = data[1] & 255; - if (a1 != 170 || a2 != 85) { + if (a1 != 170 || a2 != 85) { // needs to be 0xAA and 0x55 ! return false; } - if ((data[16] & 255) == 169) { // Live data + if ((data[16] & 255) == 169) { // Live data 0xA9 mVoltage = byteArrayInt2(data[2], data[3]); mSpeed = byteArrayInt2(data[4], data[5]); mTotalDistance = byteArrayInt4(data[6], data[7], data[8], data[9]); @@ -778,18 +817,22 @@ private boolean decodeKingSong(byte[] data) { mModeStr = String.format(Locale.US, "%d", mMode); } + int iVoltage = mVoltage; + if (mGotway84V) { + iVoltage = (int)Math.round(mVoltage * 0.8); + } int battery; - if (mVoltage < 5000) { + if (iVoltage < 5000) { battery = 0; - } else if (mVoltage >= 6600) { + } else if (iVoltage >= 6600) { battery = 100; } else { - battery = (mVoltage - 5000) / 16; + battery = (iVoltage - 5000) / 16; } setBatteryPercent(battery); return true; - } else if ((data[16] & 255) == 185) { // Distance/Time/Fan Data + } else if ((data[16] & 255) == 185) { // Distance/Time/Fan Data 0xB9 long distance = byteArrayInt4(data[2], data[3], data[4], data[5]); setDistance(distance); //int currentTime = byteArrayInt2(data[6], data[7]); @@ -797,7 +840,7 @@ private boolean decodeKingSong(byte[] data) { setCurrentTime(currentTime); setTopSpeed(byteArrayInt2(data[8], data[9])); mFanStatus = data[12]; - } else if ((data[16] & 255) == 187) { // Name and Type data + } else if ((data[16] & 255) == 187) { // Name and Type data 0xBB int end = 0; int i = 0; while (i < 14 && data[i + 2] != 0) { @@ -818,12 +861,19 @@ private boolean decodeKingSong(byte[] data) { } catch (Exception ignored) { } - } else if ((data[16] & 255) == 179) { // Serial Number + } else if ((data[16] & 255) == 179) { // Serial Number 0xB3 byte[] sndata = new byte[18]; System.arraycopy(data, 2, sndata, 0, 14); System.arraycopy(data, 17, sndata, 14, 3); sndata[17] = (byte) 0; mSerialNumber = new String(sndata); + } else if ((data[16] & 0xff) == 0xb5) { // Speed Alarm report + nWheelSpeedAlarm1 = byteArrayInt2(data[4], data[5]); + nWheelSpeedAlarm2 = byteArrayInt2(data[6], data[7]); + nWheelSpeedAlarm3 = byteArrayInt2(data[8], data[9]); + mWheelMaxSpeed = byteArrayInt2(data[10], data[11]); + + // here we need to adjust the PreferenceBars to reflect the readback } } return false; @@ -981,6 +1031,9 @@ void reset() { mWheelLedEnabled = false; mWheelButtonDisabled = false; mWheelMaxSpeed = 25; + nWheelSpeedAlarm1 = 0; + nWheelSpeedAlarm2 = 0; + nWheelSpeedAlarm3 = 0; mWheelSpeakerVolume = 50; } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 9fa7e08d..113958e7 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -7,7 +7,7 @@ Disabled - On-board (KingSong) + Built-In (KS/GW) via bluetooth audio diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bd370d62..c300ca4a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -87,6 +87,7 @@ watch_preferences wheel_settings trip_settings + VersionTag // ALARM PREFERENCES @@ -137,5 +138,4 @@ reset_user_distance last_mac - diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 8c713df1..3b3e7977 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -37,6 +37,14 @@ android:key="@string/reset_user_distance" android:enabled="true" android:title="Reset user distance" /> + + + android:summary="If your wheel is a Gotway MCM, and it shows wrong speed, distance and others parameters, it should make them normal" /> + + android:summary="If your wheel is a Gotway with 20S (84V) battery" /> + \ No newline at end of file diff --git a/app/src/main/res/xml/preferences_kingsong.xml b/app/src/main/res/xml/preferences_kingsong.xml index 069bdc51..a433b099 100644 --- a/app/src/main/res/xml/preferences_kingsong.xml +++ b/app/src/main/res/xml/preferences_kingsong.xml @@ -1,6 +1,6 @@ - + + - + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8f591075..77771151 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.3.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // NOTE: Do not place your application dependencies here; they belong @@ -18,6 +18,7 @@ allprojects { repositories { jcenter() maven { url "https://jitpack.io" } + google() } } diff --git a/gradlew b/gradlew index 9d82f789..cccdd3d5 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,20 +6,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -150,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282a..f9553162 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line