From ac07ddc9326f5a3749a77d1d94ba57d7d0d136e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Balzarotti?= Date: Sun, 8 Oct 2017 00:14:43 +0200 Subject: [PATCH] Initial HERE Active Listening Device Support --- app/src/main/AndroidManifest.xml | 5 +- .../activities/AudioActivity.java | 67 +++ .../adapter/GBDeviceAdapterv2.java | 327 +++++------ .../devices/DeviceCoordinator.java | 8 + .../gadgetbridge/devices/EventHandler.java | 2 + .../devices/UnknownDeviceCoordinator.java | 5 + .../devices/here/HereConstants.java | 25 + .../devices/here/HereCoordinator.java | 152 ++++++ .../devices/hplus/HPlusCoordinator.java | 5 + .../devices/jyou/TeclastH30Coordinator.java | 5 + .../devices/liveview/LiveviewCoordinator.java | 5 + .../devices/miband/MiBandCoordinator.java | 5 + .../devices/no1f1/No1F1Coordinator.java | 5 + .../devices/pebble/PebbleCoordinator.java | 5 + .../vibratissimo/VibratissimoCoordinator.java | 5 + .../gadgetbridge/impl/GBDeviceService.java | 14 + .../gadgetbridge/model/DeviceService.java | 2 + .../gadgetbridge/model/DeviceType.java | 5 + .../service/DeviceCommunicationService.java | 9 + .../service/DeviceSupportFactory.java | 13 + .../service/ServiceDeviceSupport.java | 5 + .../service/devices/here/HereSupport.java | 512 ++++++++++++++++++ .../service/devices/hplus/HPlusSupport.java | 5 + .../devices/jyou/TeclastH30Support.java | 6 + .../devices/liveview/LiveviewSupport.java | 4 + .../service/devices/miband/MiBandSupport.java | 5 + .../devices/miband2/MiBand2Support.java | 6 + .../service/devices/no1f1/No1F1Support.java | 5 + .../service/devices/pebble/PebbleSupport.java | 5 + .../vibratissimo/VibratissimoSupport.java | 5 + .../gadgetbridge/util/DeviceHelper.java | 2 + app/src/main/res/layout/audio_settings.xml | 16 + app/src/main/res/layout/device_itemv2.xml | 17 +- app/src/main/res/values/strings.xml | 2 + 34 files changed, 1109 insertions(+), 155 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AudioActivity.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/here/HereConstants.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/here/HereCoordinator.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/here/HereSupport.java create mode 100644 app/src/main/res/layout/audio_settings.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 49ae1174..4c43d314 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -388,7 +388,10 @@ android:name=".activities.VibrationActivity" android:label="@string/title_activity_vibration" android:parentActivityName=".activities.ControlCenterv2" /> - + . */ + +package nodomain.freeyourgadget.gadgetbridge.activities; + +import android.os.Bundle; +import android.widget.SeekBar; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.UUID; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.devices.here.HereConstants; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; + + +public class AudioActivity extends AbstractGBActivity { + private static final Logger LOG = LoggerFactory.getLogger(AudioActivity.class); + private SeekBar seekBar; + private int volume; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.audio_settings); + LOG.info("Create"); + + seekBar = (SeekBar) findViewById(R.id.volume_seekbar); + seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int position, boolean fromUser) { + // HERE's volume range is from 0xe3 (-22dB on their app) to 0xff (+6dB) + // 0xff - 0xe3 = 28 -> seekbar max value + // volume = seekbar + Min_volume (= 0xe3 = 227) + volume = position + 227; + LOG.debug("Volume = " + (byte)volume + " = " + volume + "= " + position); + GBApplication.deviceService().onSetAudioProperty(0, volume); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + }); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java index b8f6373c..26dafe35 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java @@ -5,17 +5,17 @@ Gadgetbridge is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. - Gadgetbridge is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. +Gadgetbridge is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . */ -package nodomain.freeyourgadget.gadgetbridge.adapter; +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . */ + package nodomain.freeyourgadget.gadgetbridge.adapter; import android.app.Activity; import android.app.AlertDialog; @@ -42,10 +42,12 @@ import android.widget.Toast; import java.util.List; import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.GBEnvironment; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureAlarms; import nodomain.freeyourgadget.gadgetbridge.activities.VibrationActivity; import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity; +import nodomain.freeyourgadget.gadgetbridge.activities.AudioActivity; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; @@ -84,27 +86,27 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter appsManagementActivity = coordinator.getAppsManagementActivity(); - if (appsManagementActivity != null) { - Intent startIntent = new Intent(context, appsManagementActivity); - startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - context.startActivity(startIntent); - } - } - } - ); + { + @Override + public void onClick(View v) { + DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device); + Class appsManagementActivity = coordinator.getAppsManagementActivity(); + if (appsManagementActivity != null) { + Intent startIntent = new Intent(context, appsManagementActivity); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + context.startActivity(startIntent); + } + } + } + ); //set alarms holder.setAlarmsView.setVisibility(coordinator.supportsAlarmConfiguration() ? View.VISIBLE : View.GONE); holder.setAlarmsView.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View v) { - Intent startIntent; - startIntent = new Intent(context, ConfigureAlarms.class); - startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - context.startActivity(startIntent); - } - } - ); + { + @Override + public void onClick(View v) { + Intent startIntent; + startIntent = new Intent(context, ConfigureAlarms.class); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + context.startActivity(startIntent); + } + } + ); //show graphs holder.showActivityGraphs.setVisibility(coordinator.supportsActivityTracking() ? View.VISIBLE : View.GONE); holder.showActivityGraphs.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View v) { - Intent startIntent; - startIntent = new Intent(context, ChartsActivity.class); - startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - context.startActivity(startIntent); - } - } - ); + { + @Override + public void onClick(View v) { + Intent startIntent; + startIntent = new Intent(context, ChartsActivity.class); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + context.startActivity(startIntent); + } + } + ); + + + // audio settings + holder.showAudioSettings.setVisibility(device.isInitialized() && coordinator.supportsAudioSettings() ? View.VISIBLE : View.GONE); + holder.showAudioSettings.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) { + showTransientSnackbar(R.string.controlcenter_snackbar_requested_screenshot); + Intent startIntent; + startIntent = new Intent(context, AudioActivity.class); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + context.startActivity(startIntent); + } + } + ); ItemWithDetailsAdapter infoAdapter = new ItemWithDetailsAdapter(context, device.getDeviceInfos()); infoAdapter.setHorizontalAlignment(true); @@ -222,95 +240,96 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter