mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2025-06-05 21:49:48 +02:00
created api specific abstraction layer
This commit is contained in:
@@ -32,6 +32,7 @@ import android.graphics.Bitmap;
|
|||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.media.MediaMetadata;
|
import android.media.MediaMetadata;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
@@ -43,6 +44,7 @@ import android.support.v4.media.session.MediaSessionCompat;
|
|||||||
import android.support.v4.media.session.PlaybackStateCompat;
|
import android.support.v4.media.session.PlaybackStateCompat;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
import androidx.core.app.NotificationCompat;
|
import androidx.core.app.NotificationCompat;
|
||||||
import androidx.core.app.RemoteInput;
|
import androidx.core.app.RemoteInput;
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||||
@@ -631,36 +633,30 @@ public class NotificationListener extends NotificationListenerService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||||
@Override
|
@Override
|
||||||
public void onNotificationRemoved(StatusBarNotification sbn) {
|
public void onNotificationRemoved(StatusBarNotification sbn) {
|
||||||
LOG.info("Notification removed: " + sbn.getPackageName());
|
LOG.info("Notification removed: " + sbn.getPackageName() + ": " + sbn.getNotification().category);
|
||||||
|
|
||||||
notificationStack.remove(sbn.getPackageName());
|
notificationStack.remove(sbn.getPackageName());
|
||||||
|
|
||||||
Object lookupObject = mNotificationHandleLookup.lookupByValue(sbn.getPostTime());;
|
if(Notification.CATEGORY_CALL.equals(sbn.getNotification().category) && activeCallPostTime == sbn.getPostTime()) {
|
||||||
if(lookupObject == null){
|
activeCallPostTime = 0;
|
||||||
LOG.debug("removed notification not found");
|
CallSpec callSpec = new CallSpec();
|
||||||
return;
|
callSpec.command = CallSpec.CALL_END;
|
||||||
|
GBApplication.deviceService().onSetCallState(callSpec);
|
||||||
}
|
}
|
||||||
int originalId = (int) lookupObject;
|
// FIXME: DISABLED for now
|
||||||
|
|
||||||
if (GBApplication.isRunningLollipopOrLater()) {
|
|
||||||
LOG.info("Notification removed: " + sbn.getPackageName() + ", category: " + sbn.getNotification().category);
|
|
||||||
if (Notification.CATEGORY_CALL.equals(sbn.getNotification().category) && activeCallPostTime == sbn.getPostTime()) {
|
|
||||||
activeCallPostTime = 0;
|
|
||||||
CallSpec callSpec = new CallSpec();
|
|
||||||
callSpec.command = CallSpec.CALL_END;
|
|
||||||
GBApplication.deviceService().onSetCallState(callSpec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (shouldIgnore(sbn))
|
if (shouldIgnore(sbn))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Prefs prefs = GBApplication.getPrefs();
|
Prefs prefs = GBApplication.getPrefs();
|
||||||
if (prefs.getBoolean("autoremove_notifications", true)) {
|
if (prefs.getBoolean("autoremove_notifications", true)) {
|
||||||
LOG.info("notification removed, will ask device to delete it");
|
LOG.info("notification removed, will ask device to delete it");
|
||||||
GBApplication.deviceService().onDeleteNotification(originalId);
|
GBApplication.deviceService().onDeleteNotification((int) sbn.getPostTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -7,10 +7,8 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -18,14 +16,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayDeque;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.GregorianCalendar;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.NoSuchElementException;
|
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.TimeZone;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||||
@@ -33,7 +24,6 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.PackageConfig;
|
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.PackageConfig;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.PackageConfigHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.PackageConfigHelper;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.externalevents.NotificationListener;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.NotificationListener;
|
||||||
@@ -46,30 +36,10 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.WatchAdapter;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.WatchAdapter;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.WatchAdapterFactory;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.WatchAdapterFactory;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.ActivityPointGetRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.AnimationRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.BatteryLevelRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.DownloadFileRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.DownloadFileRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.EraseFileRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.FileRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.GetCountdownSettingsRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.GetCurrentStepCountRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.GetStepGoalRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.GetStepGoalRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.GetVibrationStrengthRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.GoalTrackingGetRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.ListFilesRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.MoveHandsRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.OTAEnterRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.OTAEraseRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.PlayNotificationRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.PlayNotificationRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.ReleaseHandsControlRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.Request;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.Request;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.RequestHandControlRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.SetCurrentStepCountRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.SetStepGoalRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.SetTimeRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.SetVibrationStrengthRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.UploadFileRequest;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.VibrateRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.VibrateRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
@@ -135,30 +105,14 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
GBApplication.getContext().registerReceiver(globalCommandReceiver, globalFilter);
|
GBApplication.getContext().registerReceiver(globalCommandReceiver, globalFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean supportsActivityHand() {
|
private void loadTimeOffset() {
|
||||||
switch (modelNumber) {
|
|
||||||
case "HL.0.0":
|
|
||||||
return false;
|
|
||||||
case "HW.0.0":
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean supportsExtendedVibration() {
|
|
||||||
switch (modelNumber) {
|
|
||||||
case "HL.0.0":
|
|
||||||
return false;
|
|
||||||
case "HW.0.0":
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getTimeOffset() {
|
|
||||||
timeOffset = getContext().getSharedPreferences(getContext().getPackageName(), Context.MODE_PRIVATE).getInt("QHYBRID_TIME_OFFSET", 0);
|
timeOffset = getContext().getSharedPreferences(getContext().getPackageName(), Context.MODE_PRIVATE).getInt("QHYBRID_TIME_OFFSET", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getTimeOffset(){
|
||||||
|
return this.timeOffset;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected TransactionBuilder initializeDevice(TransactionBuilder builder) {
|
protected TransactionBuilder initializeDevice(TransactionBuilder builder) {
|
||||||
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext()));
|
||||||
@@ -172,34 +126,23 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
for (int i = 2; i <= 7; i++)
|
for (int i = 2; i <= 7; i++)
|
||||||
builder.notify(getCharacteristic(UUID.fromString("3dda000" + i + "-957f-7d4a-34a6-74696673696d")), true);
|
builder.notify(getCharacteristic(UUID.fromString("3dda000" + i + "-957f-7d4a-34a6-74696673696d")), true);
|
||||||
|
|
||||||
|
|
||||||
Request initialRequest = new GetStepGoalRequest();
|
|
||||||
|
|
||||||
builder
|
builder
|
||||||
// .read(getCharacteristic(UUID.fromString("00002a00-0000-1000-8000-00805f9b34fb")))
|
|
||||||
// .read(getCharacteristic(UUID.fromString("00002a24-0000-1000-8000-00805f9b34fb")))
|
|
||||||
.read(getCharacteristic(UUID.fromString("00002a26-0000-1000-8000-00805f9b34fb")))
|
.read(getCharacteristic(UUID.fromString("00002a26-0000-1000-8000-00805f9b34fb")))
|
||||||
// .read(getCharacteristic(UUID.fromString("00002a19-0000-1000-8000-00805f9b34fb")))
|
.read(getCharacteristic(UUID.fromString("00002a24-0000-1000-8000-00805f9b34fb")))
|
||||||
// .notify(getCharacteristic(UUID.fromString("00002a19-0000-1000-8000-00805f9b34fb")), true)
|
|
||||||
// .write(getCharacteristic(initialRequest.getRequestUUID()), initialRequest.getRequestData())
|
|
||||||
;
|
;
|
||||||
|
|
||||||
getTimeOffset();
|
loadTimeOffset();
|
||||||
|
|
||||||
// builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZED, getContext()));
|
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZED, getContext()));
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFetchRecordedData(int dataTypes) {
|
public void onFetchRecordedData(int dataTypes) {
|
||||||
//TODO
|
if ((dataTypes & RecordedDataTypes.TYPE_ACTIVITY) != 0) {
|
||||||
/* if ((dataTypes & RecordedDataTypes.TYPE_ACTIVITY) != 0) {
|
this.watchAdapter.onFetchActivityData();
|
||||||
requestQueue.add(new BatteryLevelRequest());
|
}
|
||||||
requestQueue.add(new GetCurrentStepCountRequest());
|
|
||||||
requestQueue.add(new ListFilesRequest());
|
|
||||||
queueWrite(new ActivityPointGetRequest());
|
|
||||||
} */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -241,7 +184,6 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
watchAdapter.playNotification(new PackageConfig(
|
watchAdapter.playNotification(new PackageConfig(
|
||||||
(short) -1,
|
(short) -1,
|
||||||
(short) -1,
|
(short) -1,
|
||||||
//TODO test activity hand
|
|
||||||
(short) (progress * 180),
|
(short) (progress * 180),
|
||||||
PlayNotificationRequest.VibrationType.NO_VIBE
|
PlayNotificationRequest.VibrationType.NO_VIBE
|
||||||
));
|
));
|
||||||
@@ -249,7 +191,7 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private double calculateNotificationProgress() {
|
public double calculateNotificationProgress() {
|
||||||
HashMap<PackageConfig, Boolean> configs = new HashMap<>(0);
|
HashMap<PackageConfig, Boolean> configs = new HashMap<>(0);
|
||||||
for (PackageConfig config : helper.getSettings()) {
|
for (PackageConfig config : helper.getSettings()) {
|
||||||
configs.put(config, false);
|
configs.put(config, false);
|
||||||
@@ -290,7 +232,7 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
@Override
|
@Override
|
||||||
public void onFindDevice(boolean start) {
|
public void onFindDevice(boolean start) {
|
||||||
try {
|
try {
|
||||||
if (start && !supportsExtendedVibration()) {
|
if (start && !watchAdapter.supportsExtendedVibration()) {
|
||||||
GB.toast("Device does not support brr brr", Toast.LENGTH_SHORT, GB.INFO);
|
GB.toast("Device does not support brr brr", Toast.LENGTH_SHORT, GB.INFO);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -306,11 +248,9 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
VibrateRequest request = new VibrateRequest(false, (short) 4, (short) 1);
|
|
||||||
BluetoothGattCharacteristic chara = getCharacteristic(request.getRequestUUID());
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (searchDevice) {
|
while (searchDevice) {
|
||||||
new TransactionBuilder("findDevice#" + i++).write(chara, request.getRequestData()).queue(getQueue());
|
QHybridSupport.this.watchAdapter.vibrateFindMyDevicePattern();
|
||||||
try {
|
try {
|
||||||
Thread.sleep(2500);
|
Thread.sleep(2500);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
@@ -370,15 +310,16 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
|
|
||||||
gbDevice.setFirmwareVersion(firmwareVersion);
|
gbDevice.setFirmwareVersion(firmwareVersion);
|
||||||
this.watchAdapter = new WatchAdapterFactory().createWatchAdapter(firmwareVersion, this);
|
this.watchAdapter = new WatchAdapterFactory().createWatchAdapter(firmwareVersion, this);
|
||||||
|
this.watchAdapter.initialize();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "00002a24-0000-1000-8000-00805f9b34fb": {
|
case "00002a24-0000-1000-8000-00805f9b34fb": {
|
||||||
modelNumber = characteristic.getStringValue(0);
|
modelNumber = characteristic.getStringValue(0);
|
||||||
gbDevice.setModel(modelNumber);
|
gbDevice.setModel(modelNumber);
|
||||||
gbDevice.setName(getModelNameByModelNumber(modelNumber));
|
gbDevice.setName(watchAdapter.getModelName());
|
||||||
try {
|
try {
|
||||||
gbDevice.addDeviceInfo(new GenericItem(ITEM_EXTENDED_VIBRATION_SUPPORT, String.valueOf(supportsExtendedVibration())));
|
gbDevice.addDeviceInfo(new GenericItem(ITEM_EXTENDED_VIBRATION_SUPPORT, String.valueOf(watchAdapter.supportsExtendedVibration())));
|
||||||
gbDevice.addDeviceInfo(new GenericItem(ITEM_HAS_ACTIVITY_HAND, String.valueOf(supportsActivityHand())));
|
gbDevice.addDeviceInfo(new GenericItem(ITEM_HAS_ACTIVITY_HAND, String.valueOf(watchAdapter.supportsActivityHand())));
|
||||||
} catch (UnsupportedOperationException e) {
|
} catch (UnsupportedOperationException e) {
|
||||||
GB.toast("Please contact dakhnod@gmail.com\n", Toast.LENGTH_SHORT, GB.INFO);
|
GB.toast("Please contact dakhnod@gmail.com\n", Toast.LENGTH_SHORT, GB.INFO);
|
||||||
gbDevice.addDeviceInfo(new GenericItem(ITEM_EXTENDED_VIBRATION_SUPPORT, "false"));
|
gbDevice.addDeviceInfo(new GenericItem(ITEM_EXTENDED_VIBRATION_SUPPORT, "false"));
|
||||||
@@ -403,16 +344,6 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getModelNameByModelNumber(String modelNumber) {
|
|
||||||
switch (modelNumber) {
|
|
||||||
case "HW.0.0":
|
|
||||||
return "Q Commuter";
|
|
||||||
case "HL.0.0":
|
|
||||||
return "Q Activist";
|
|
||||||
}
|
|
||||||
return "unknwon Q";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic
|
public boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic
|
||||||
characteristic) {
|
characteristic) {
|
||||||
@@ -480,7 +411,7 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QHYBRID_COMMAND_UPDATE: {
|
case QHYBRID_COMMAND_UPDATE: {
|
||||||
getTimeOffset();
|
loadTimeOffset();
|
||||||
onSetTime();
|
onSetTime();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -489,7 +420,6 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
switch (newSetting) {
|
switch (newSetting) {
|
||||||
case ITEM_VIBRATION_STRENGTH: {
|
case ITEM_VIBRATION_STRENGTH: {
|
||||||
watchAdapter.setVibrationStrength(Short.parseShort(gbDevice.getDeviceInfo(ITEM_VIBRATION_STRENGTH).getDetails()));
|
watchAdapter.setVibrationStrength(Short.parseShort(gbDevice.getDeviceInfo(ITEM_VIBRATION_STRENGTH).getDetails()));
|
||||||
// queueWrite(new VibrateRequest(false, (short)4, (short)1));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ITEM_STEP_GOAL: {
|
case ITEM_STEP_GOAL: {
|
||||||
|
@@ -36,11 +36,18 @@ public abstract class WatchAdapter {
|
|||||||
public abstract void setActivityHand(double progress);
|
public abstract void setActivityHand(double progress);
|
||||||
public abstract void setHands(short hour, short minute);
|
public abstract void setHands(short hour, short minute);
|
||||||
public abstract void vibrate(PlayNotificationRequest.VibrationType vibration);
|
public abstract void vibrate(PlayNotificationRequest.VibrationType vibration);
|
||||||
|
public abstract void vibrateFindMyDevicePattern();
|
||||||
public abstract void requestHandsControl();
|
public abstract void requestHandsControl();
|
||||||
public abstract void releaseHandsControl();
|
public abstract void releaseHandsControl();
|
||||||
public abstract void setStepGoal(int stepGoal);
|
public abstract void setStepGoal(int stepGoal);
|
||||||
public abstract void setVibrationStrength(short strength);
|
public abstract void setVibrationStrength(short strength);
|
||||||
|
|
||||||
|
public abstract boolean supportsExtendedVibration();
|
||||||
|
public abstract boolean supportsActivityHand();
|
||||||
|
public abstract String getModelName();
|
||||||
|
|
||||||
|
public abstract void onFetchActivityData();
|
||||||
|
|
||||||
public abstract boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic);
|
public abstract boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,7 @@ public final class WatchAdapterFactory {
|
|||||||
public final WatchAdapter createWatchAdapter(String firmwareVersion, QHybridSupport deviceSupport){
|
public final WatchAdapter createWatchAdapter(String firmwareVersion, QHybridSupport deviceSupport){
|
||||||
char major = firmwareVersion.charAt(6);
|
char major = firmwareVersion.charAt(6);
|
||||||
switch (major){
|
switch (major){
|
||||||
case 'a': return new MisfitWatchAdapter(deviceSupport);
|
case '1': return new MisfitWatchAdapter(deviceSupport);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new UnsupportedOperationException("Firmware " + firmwareVersion + " not supported");
|
throw new UnsupportedOperationException("Firmware " + firmwareVersion + " not supported");
|
||||||
|
@@ -58,6 +58,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.mis
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.SetTimeRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.SetTimeRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.SetVibrationStrengthRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.SetVibrationStrengthRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.UploadFileRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.UploadFileRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.VibrateRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport.ITEM_ACTIVITY_POINT;
|
import static nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport.ITEM_ACTIVITY_POINT;
|
||||||
@@ -85,14 +86,14 @@ public class MisfitWatchAdapter extends WatchAdapter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
requestQueue.add(new GetCurrentStepCountRequest());
|
requestQueue.add(new GetStepGoalRequest());
|
||||||
requestQueue.add(new GetVibrationStrengthRequest());
|
requestQueue.add(new GetVibrationStrengthRequest());
|
||||||
requestQueue.add(new ActivityPointGetRequest());
|
requestQueue.add(new ActivityPointGetRequest());
|
||||||
requestQueue.add(prepareSetTimeRequest());
|
requestQueue.add(prepareSetTimeRequest());
|
||||||
requestQueue.add(new AnimationRequest());
|
requestQueue.add(new AnimationRequest());
|
||||||
|
requestQueue.add(new SetCurrentStepCountRequest((int) (999999 * getDeviceSupport().calculateNotificationProgress())));
|
||||||
|
|
||||||
//TODO
|
queueWrite(new GetCurrentStepCountRequest());
|
||||||
// requestQueue.add(new SetCurrentStepCountRequest((int) (999999 * calculateNotificationProgress())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -100,8 +101,7 @@ public class MisfitWatchAdapter extends WatchAdapter {
|
|||||||
long millis = System.currentTimeMillis();
|
long millis = System.currentTimeMillis();
|
||||||
TimeZone zone = new GregorianCalendar().getTimeZone();
|
TimeZone zone = new GregorianCalendar().getTimeZone();
|
||||||
return new SetTimeRequest(
|
return new SetTimeRequest(
|
||||||
//TODO time offset
|
(int) (millis / 1000 + getDeviceSupport().getTimeOffset() * 60),
|
||||||
(int) (millis / 1000 + 0 * 60),
|
|
||||||
(short) (millis % 1000),
|
(short) (millis % 1000),
|
||||||
(short) ((zone.getRawOffset() + zone.getDSTSavings()) / 60000));
|
(short) ((zone.getRawOffset() + zone.getDSTSavings()) / 60000));
|
||||||
}
|
}
|
||||||
@@ -117,13 +117,14 @@ public class MisfitWatchAdapter extends WatchAdapter {
|
|||||||
queueWrite(new PlayNotificationRequest(
|
queueWrite(new PlayNotificationRequest(
|
||||||
config.getVibration(),
|
config.getVibration(),
|
||||||
config.getHour(),
|
config.getHour(),
|
||||||
config.getMin()
|
config.getMin(),
|
||||||
|
config.getActivity()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTime() {
|
public void setTime() {
|
||||||
|
queueWrite(prepareSetTimeRequest());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -372,6 +373,12 @@ public class MisfitWatchAdapter extends WatchAdapter {
|
|||||||
queueWrite(new PlayNotificationRequest(vibration, -1, -1));
|
queueWrite(new PlayNotificationRequest(vibration, -1, -1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void vibrateFindMyDevicePattern() {
|
||||||
|
queueWrite(new VibrateRequest(false, (short) 4, (short) 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void requestHandsControl() {
|
public void requestHandsControl() {
|
||||||
queueWrite(new RequestHandControlRequest());
|
queueWrite(new RequestHandControlRequest());
|
||||||
@@ -392,6 +399,49 @@ public class MisfitWatchAdapter extends WatchAdapter {
|
|||||||
queueWrite(new SetVibrationStrengthRequest(strength));
|
queueWrite(new SetVibrationStrengthRequest(strength));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsExtendedVibration() {
|
||||||
|
String modelNumber = getDeviceSupport().getDevice().getModel();
|
||||||
|
switch (modelNumber) {
|
||||||
|
case "HW.0.0":
|
||||||
|
return true;
|
||||||
|
case "HL.0.0":
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
throw new UnsupportedOperationException("Model " + modelNumber + " not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsActivityHand() {
|
||||||
|
String modelNumber = getDeviceSupport().getDevice().getModel();
|
||||||
|
switch (modelNumber) {
|
||||||
|
case "HW.0.0":
|
||||||
|
return true;
|
||||||
|
case "HL.0.0":
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
throw new UnsupportedOperationException("Model " + modelNumber + " not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getModelName() {
|
||||||
|
String modelNumber = getDeviceSupport().getDevice().getModel();
|
||||||
|
switch (modelNumber) {
|
||||||
|
case "HW.0.0":
|
||||||
|
return "Q Commuter";
|
||||||
|
case "HL.0.0":
|
||||||
|
return "Q Activist";
|
||||||
|
}
|
||||||
|
return "unknwon Q";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFetchActivityData() {
|
||||||
|
requestQueue.add(new BatteryLevelRequest());
|
||||||
|
requestQueue.add(new GetCurrentStepCountRequest());
|
||||||
|
// requestQueue.add(new ListFilesRequest());
|
||||||
|
queueWrite(new ActivityPointGetRequest());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void overwriteButtons() {
|
public void overwriteButtons() {
|
||||||
|
Reference in New Issue
Block a user