diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/ControlActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/ControlActivity.java index 4a7f7fd56..9c6404c5c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/ControlActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/ControlActivity.java @@ -1,10 +1,14 @@ package nodomain.freeyourgadget.gadgetbridge.devices.supercars; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.Bundle; import android.os.CountDownTimer; import android.widget.CheckBox; import android.widget.CompoundButton; +import android.widget.TextView; import androidx.localbroadcastmanager.content.LocalBroadcastManager; @@ -13,12 +17,14 @@ import org.slf4j.LoggerFactory; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.service.devices.supercars.SuperCarsSupport; public class ControlActivity extends AbstractGBActivity implements JoystickView.JoystickListener { private static final Logger LOG = LoggerFactory.getLogger(ControlActivity.class); LocalBroadcastManager localBroadcastManager; boolean lights = false; + boolean blinking = false; boolean turbo = false; CountDownTimer periodicDataSenderRunner; @@ -26,14 +32,32 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView. SuperCarsConstants.Movement movement = SuperCarsConstants.Movement.IDLE; SuperCarsConstants.Speed speed = SuperCarsConstants.Speed.NORMAL; SuperCarsConstants.Light light = SuperCarsConstants.Light.OFF; + public GBDevice device; + TextView batteryPercentage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_supercars_control); - localBroadcastManager = LocalBroadcastManager.getInstance(this); + + Intent intent = getIntent(); + Bundle bundle = intent.getExtras(); + if (bundle != null) { + device = bundle.getParcelable(GBDevice.EXTRA_DEVICE); + } else { + throw new IllegalArgumentException("Must provide a device when invoking this activity"); + } + CheckBox turboMode = findViewById(R.id.turboMode); CheckBox lightsOn = findViewById(R.id.lightsOn); + CheckBox lightsBlinking = findViewById(R.id.lightsBlinking); + batteryPercentage = findViewById(R.id.battery_percentage_label); + setBatteryLabel(); + localBroadcastManager = LocalBroadcastManager.getInstance(ControlActivity.this); + + IntentFilter filter = new IntentFilter(); + filter.addAction(GBDevice.ACTION_DEVICE_CHANGED); + LocalBroadcastManager.getInstance(this).registerReceiver(commandReceiver, filter); turboMode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override @@ -46,6 +70,24 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView. @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { lights = isChecked; + setLights(); + + } + }); + + lightsBlinking.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + + if (isChecked) { + if (lightsOn.isChecked()) { + lightsOn.setChecked(false); + lights = false; + } + } + lightsOn.setEnabled(!isChecked); + blinking = isChecked; + setLights(); } }); @@ -54,14 +96,39 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView. periodicDataSenderRunner.start(); } + private void setLights() { + if (!blinking) { + if (lights) { + light = SuperCarsConstants.Light.ON; + } else { + light = SuperCarsConstants.Light.OFF; + } + } + + } + + private void setBatteryLabel() { + String level = device.getBatteryLevel() > 0 ? String.format("%1s%%", device.getBatteryLevel()) : device.getName(); + //batteryPercentage.setText(level); //the device seems to be cached, thus the value is old...! + } + private void sendLocalBroadcast(Intent intent) { localBroadcastManager.sendBroadcast(intent); } public void periodicDataSender() { - periodicDataSenderRunner = new CountDownTimer(Long.MAX_VALUE, 200) { + periodicDataSenderRunner = new CountDownTimer(Long.MAX_VALUE, 100) { public void onTick(long millisUntilFinished) { + + if (blinking) { + if (light.equals(SuperCarsConstants.Light.ON)) { + light = SuperCarsConstants.Light.OFF; + } else { + light = SuperCarsConstants.Light.ON; + } + } + create_intent_with_data(); } @@ -83,9 +150,9 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView. @Override public void onJoystickMoved(float xPercent, float yPercent, int id) { - if (yPercent < 0) { + if (yPercent < 0.2 && yPercent != 0) { movement = SuperCarsConstants.Movement.UP; - } else if (yPercent > 0) { + } else if (yPercent > 0.2) { movement = SuperCarsConstants.Movement.DOWN; } else { movement = SuperCarsConstants.Movement.IDLE; @@ -99,11 +166,6 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView. direction = SuperCarsConstants.Direction.CENTER; } - if (lights) { - light = SuperCarsConstants.Light.ON; - } else { - light = SuperCarsConstants.Light.OFF; - } if (turbo) { speed = SuperCarsConstants.Speed.TURBO; } else { @@ -115,6 +177,7 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView. protected void onDestroy() { super.onDestroy(); periodicDataSenderRunner.cancel(); + LocalBroadcastManager.getInstance(this).unregisterReceiver(commandReceiver); } @Override @@ -128,4 +191,15 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView. super.onPause(); periodicDataSenderRunner.cancel(); } + + BroadcastReceiver commandReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + LOG.debug("device receiver received " + intent.getAction()); + if (intent.getAction().equals(GBDevice.ACTION_DEVICE_CHANGED)) { + setBatteryLabel(); + } + } + }; + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/supercars/SuperCarsSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/supercars/SuperCarsSupport.java index 7dc5ccc3f..c50ff7c35 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/supercars/SuperCarsSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/supercars/SuperCarsSupport.java @@ -67,7 +67,7 @@ public class SuperCarsSupport extends AbstractBTLEDeviceSupport { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(COMMAND_DRIVE_CONTROL)) { - send_data( + queueDataToBLE( (SuperCarsConstants.Speed) intent.getSerializableExtra(EXTRA_SPEED), (SuperCarsConstants.Movement) intent.getSerializableExtra(EXTRA_MOVEMENT), (SuperCarsConstants.Light) intent.getSerializableExtra(EXTRA_LIGHT), @@ -112,7 +112,8 @@ public class SuperCarsSupport extends AbstractBTLEDeviceSupport { if (decoded_data.length == 16) { GBDeviceEventBatteryInfo batteryEvent = new GBDeviceEventBatteryInfo(); batteryEvent.state = BatteryState.BATTERY_NORMAL; - batteryEvent.level = decoded_data[4]; + int level = decoded_data[4]; + batteryEvent.level = level; evaluateGBDeviceEvent(batteryEvent); } } @@ -294,10 +295,10 @@ public class SuperCarsSupport extends AbstractBTLEDeviceSupport { return false; } - private void send_data(SuperCarsConstants.Speed speed, - SuperCarsConstants.Movement movement, - SuperCarsConstants.Light light, - SuperCarsConstants.Direction direction) { + private void queueDataToBLE(SuperCarsConstants.Speed speed, + SuperCarsConstants.Movement movement, + SuperCarsConstants.Light light, + SuperCarsConstants.Direction direction) { byte[] command = craft_packet(speed, direction, movement, light); TransactionBuilder builder = new TransactionBuilder("send data"); diff --git a/app/src/main/res/layout/activity_supercars_control.xml b/app/src/main/res/layout/activity_supercars_control.xml index 71cac1801..a948fd0ed 100644 --- a/app/src/main/res/layout/activity_supercars_control.xml +++ b/app/src/main/res/layout/activity_supercars_control.xml @@ -10,6 +10,17 @@ android:orientation="vertical" tools:ignore="MissingConstraints"> + + + android:height="48dp" + android:text="@string/supercars_turbo_speed_label" + tools:ignore="TouchTargetSizeCheck" /> + android:height="48dp" + android:text="@string/supercars_lights_label" + tools:ignore="TouchTargetSizeCheck" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6223dac4c..d2f172bc3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1850,4 +1850,5 @@ Shell Racing Turbo Speed Lights + Blinking