1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-25 11:26:47 +01:00

Bug fixes

This commit is contained in:
mamutcho 2019-12-11 19:38:12 +02:00
parent dfe62fa28f
commit 632f46bc8b
5 changed files with 220 additions and 123 deletions

View File

@ -43,11 +43,11 @@ import static nodomain.freeyourgadget.gadgetbridge.GBApplication.getContext;
public class WatchXPlusDeviceCoordinator extends AbstractDeviceCoordinator {
private static final Logger LOG = LoggerFactory.getLogger(WatchXPlusDeviceSupport.class);
public static final int FindPhone_ON = -1;
private static final int FindPhone_ON = -1;
public static final int FindPhone_OFF = 0;
public static boolean isBPCalibrated = false;
protected static Prefs prefs = GBApplication.getPrefs();
private static Prefs prefs = GBApplication.getPrefs();
@NonNull
@Override
@ -59,7 +59,7 @@ public class WatchXPlusDeviceCoordinator extends AbstractDeviceCoordinator {
}
@Override
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) {
}
@ -185,6 +185,7 @@ Prefs from device settings on main page
// return time format pref
public static byte getTimeMode(SharedPreferences sharedPrefs) {
String timeMode = sharedPrefs.getString(DeviceSettingsPreferenceConst.PREF_TIMEFORMAT, getContext().getString(R.string.p_timeformat_24h));
assert timeMode != null;
if (timeMode.equals(getContext().getString(R.string.p_timeformat_24h))) {
return WatchXPlusConstants.ARG_SET_TIMEMODE_24H;
} else {
@ -202,6 +203,7 @@ Prefs from device settings on main page
public static boolean shouldEnableHeadsUpScreen(SharedPreferences sharedPrefs) {
String liftMode = sharedPrefs.getString(WatchXPlusConstants.PREF_ACTIVATE_DISPLAY, getContext().getString(R.string.p_on));
// WatchXPlus doesn't support scheduled intervals. Treat it as "on".
assert liftMode != null;
return !liftMode.equals(getContext().getString(R.string.p_off));
}
@ -209,6 +211,7 @@ Prefs from device settings on main page
public static boolean shouldEnableDisconnectReminder(SharedPreferences sharedPrefs) {
String lostReminder = sharedPrefs.getString(WatchXPlusConstants.PREF_DISCONNECT_REMIND, getContext().getString(R.string.p_on));
// WatchXPlus doesn't support scheduled intervals. Treat it as "on".
assert lostReminder != null;
return !lostReminder.equals(getContext().getString(R.string.p_off));
}
@ -219,6 +222,7 @@ Prefs from device settings on main page
public static int getFindPhone(SharedPreferences sharedPrefs) {
String findPhone = sharedPrefs.getString(WatchXPlusConstants.PREF_FIND_PHONE, getContext().getString(R.string.p_off));
assert findPhone != null;
if (findPhone.equals(getContext().getString(R.string.p_off))) {
return FindPhone_OFF;
} else if (findPhone.equals(getContext().getString(R.string.p_on))) {
@ -230,6 +234,7 @@ Prefs from device settings on main page
int iDuration;
try {
assert duration != null;
iDuration = Integer.valueOf(duration);
} catch (Exception ex) {
iDuration = 60;
@ -250,6 +255,7 @@ Prefs from device settings on main page
public static boolean getQuiteHours(SharedPreferences sharedPrefs, Calendar startOut, Calendar endOut) {
String doNotDisturb = sharedPrefs.getString(WatchXPlusConstants.PREF_DO_NOT_DISTURB, getContext().getString(R.string.p_off));
assert doNotDisturb != null;
if (doNotDisturb.equals(getContext().getString(R.string.p_off))) {
LOG.info(" DND is disabled ");
return false;
@ -303,38 +309,38 @@ Values from device specific settings page
*/
// read altitude from preferences
public static int getAltitude(String address) {
return (int) prefs.getInt(WatchXPlusConstants.PREF_ALTITUDE, 200);
return prefs.getInt(WatchXPlusConstants.PREF_ALTITUDE, 200);
}
// read repeat call notification
public static int getRepeatOnCall(String address) {
return (int) prefs.getInt(WatchXPlusConstants.PREF_REPEAT, 1);
return prefs.getInt(WatchXPlusConstants.PREF_REPEAT, 1);
}
//read continious call notification
public static boolean getContiniousVibrationOnCall(String address) {
return (boolean) prefs.getBoolean(WatchXPlusConstants.PREF_CONTINIOUS, false);
return prefs.getBoolean(WatchXPlusConstants.PREF_CONTINIOUS, false);
}
//read missed call notification
public static boolean getMissedCallReminder(String address) {
return (boolean) prefs.getBoolean(WatchXPlusConstants.PREF_MISSED_CALL, false);
return prefs.getBoolean(WatchXPlusConstants.PREF_MISSED_CALL, false);
}
//read missed call notification
public static int getMissedCallRepeat(String address) {
return (int) prefs.getInt(WatchXPlusConstants.PREF_MISSED_CALL_REPEAT, 0);
return prefs.getInt(WatchXPlusConstants.PREF_MISSED_CALL_REPEAT, 0);
}
//read button reject call settings
public static boolean getButtonReject(String address) {
return (boolean) prefs.getBoolean(WatchXPlusConstants.PREF_BUTTON_REJECT, false);
return prefs.getBoolean(WatchXPlusConstants.PREF_BUTTON_REJECT, false);
}
//read shake wrist reject call settings
public static boolean getShakeReject(String address) {
return (boolean) prefs.getBoolean(WatchXPlusConstants.PREF_SHAKE_REJECT, false);
return prefs.getBoolean(WatchXPlusConstants.PREF_SHAKE_REJECT, false);
}
/*

View File

@ -23,7 +23,6 @@ import android.preference.Preference;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivity;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
public class WatchXPlusPreferenceActivity extends AbstractSettingsActivity {
@Override

View File

@ -13,14 +13,9 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public class WatchXPlusSampleProvider extends AbstractSampleProvider<WatchXPlusActivitySample> {
private GBDevice mDevice;
private DaoSession mSession;
public WatchXPlusSampleProvider(GBDevice device, DaoSession session) {
super(device, session);
mSession = session;
mDevice = device;
}
@Override

View File

@ -17,12 +17,10 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.devices.lenovo.watchxplus;
import android.app.AlertDialog;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
@ -31,14 +29,13 @@ import android.os.Handler;
import android.widget.Toast;
import androidx.annotation.IntRange;
import androidx.annotation.MainThread;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@ -50,13 +47,9 @@ import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.UUID;
import java.util.prefs.PreferenceChangeEvent;
import java.util.prefs.PreferenceChangeListener;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.DebugActivity;
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
@ -97,17 +90,15 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
import static nodomain.freeyourgadget.gadgetbridge.GBApplication.getContext;
public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
protected static Prefs prefs = GBApplication.getPrefs();
private static Prefs prefs = GBApplication.getPrefs();
private boolean needsAuth;
private int sequenceNumber = 0;
private boolean isCalibrationActive = false;
private Map<Integer, Integer> dataToFetch = new LinkedHashMap<>();
private final Map<Integer, Integer> dataToFetch = new LinkedHashMap<>();
private int requestedDataTimestamp;
private int dataSlots = 0;
private DataType currentDataType;
@ -123,6 +114,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
@Override
public void onReceive(Context context, Intent intent) {
String broadcastAction = intent.getAction();
assert broadcastAction != null;
switch (broadcastAction) {
case WatchXPlusConstants.ACTION_CALIBRATION:
enableCalibration(intent.getBooleanExtra(WatchXPlusConstants.ACTION_ENABLE, false));
@ -230,7 +222,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
try {
TransactionBuilder builder = performInitialized("showNotification");
byte[] command = WatchXPlusConstants.CMD_NOTIFICATION_TEXT_TASK;
byte[] text = notificationText.getBytes("UTF-8");
byte[] text = notificationText.getBytes(StandardCharsets.UTF_8);
byte[] messagePart;
int messageLength = text.length;
@ -280,13 +272,12 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
return this;
}
public WatchXPlusDeviceSupport authorizationRequest(TransactionBuilder builder, boolean firstConnect) {
public void authorizationRequest(TransactionBuilder builder, boolean firstConnect) {
builder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
buildCommand(WatchXPlusConstants.CMD_AUTHORIZATION_TASK,
WatchXPlusConstants.TASK,
new byte[]{(byte) (firstConnect ? 0x00 : 0x01)})); //possibly not the correct meaning
return this;
}
private void enableCalibration(boolean enable) {
@ -388,9 +379,9 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
/** send command to request watch firmware version
* @param builder
* @param builder - transaction builder
*/
public WatchXPlusDeviceSupport getFirmwareVersion(TransactionBuilder builder) {
private WatchXPlusDeviceSupport getFirmwareVersion(TransactionBuilder builder) {
builder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
buildCommand(WatchXPlusConstants.CMD_FIRMWARE_INFO,
WatchXPlusConstants.READ_VALUE));
@ -399,7 +390,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
/** send command to request watch battery state
* @param builder
* @param builder - transaction builder
*/
private WatchXPlusDeviceSupport getBatteryState(TransactionBuilder builder) {
builder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
@ -410,7 +401,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
/** initialize device on connect
* @param builder
* @param builder - transaction builder
*/
public WatchXPlusDeviceSupport initialize(TransactionBuilder builder) {
getFirmwareVersion(builder)
@ -479,6 +470,12 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
}
private boolean isRinging = false; // store ringing state
private boolean outCall = false; // store outgoing call state
private boolean isMissedCall = false; // missed call state
private int remainingRepeats = 0; // initialize call notification reminds
private int remainingMissedRepeats = 0; // initialize missed call notification reminds
/** send notification on watch when phone rings
* @param callSpec - phone state
* send notification on incoming call, cancel notification when call is answered, ignored or rejected
@ -486,11 +483,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
* TODO add missed call reminder (send notification to watch at desired period)
*/
// variables to handle ring notifications
boolean isRinging = false; // store ringing state
boolean outCall = false; // store outgoing call state
boolean isMissedCall = false; // missed call state
int remainingRepeats = 0; // initialize call notification reminds
int remainingMissedRepeats = 0; // initialize missed call notification reminds
@Override
public void onSetCallState(final CallSpec callSpec) {
final int repeatDelay = 5000; // repeat delay of 5 sec (watch show call notifications for about 5 sec.)
@ -513,6 +506,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
isRinging = true;
isMissedCall = false;
remainingRepeats = repeatCount;
LOG.info(" Incomming call ");
if (("Phone".equals(callSpec.name)) || (callSpec.name.contains("ropusn")) || (callSpec.name.contains("issed"))) {
// do nothing for notifications without caller name, e.g. system call event
} else {
@ -532,6 +526,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
remainingRepeats = 0;
// stop handler
handler.removeCallbacks(this);
cancelNotification();
}
}
}, repeatDelay);
@ -542,27 +537,32 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
outCall = false;
isMissedCall = false;
cancelNotification();
LOG.info(" Call start ");
break;
case CallSpec.CALL_REJECT:
isRinging = false;
outCall = false;
isMissedCall = false;
cancelNotification();
LOG.info(" Call reject ");
break;
case CallSpec.CALL_ACCEPT:
isRinging = false;
outCall = false;
isMissedCall = false;
cancelNotification();
LOG.info(" Call accept ");
break;
case CallSpec.CALL_OUTGOING:
outCall = true;
isRinging = false;
isMissedCall = false;
cancelNotification();
LOG.info(" Outgoing call ");
break;
case CallSpec.CALL_END:
if ((isRinging) && (!outCall)) {
LOG.info(" End call ");
// it's a missed call, don't clear notification to preserve small icon near bluetooth
isRinging = false;
outCall = false;
@ -570,6 +570,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
remainingMissedRepeats = repeatCountMissed;
// send missed call notification if enabled in settings
if (missedCall) {
LOG.info(" Missed call ");
sendNotification(WatchXPlusConstants.NOTIFICATION_CHANNEL_PHONE_CALL, "Missed call");
// repeat missed call notification
final Handler handler = new Handler();
@ -586,6 +587,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
isMissedCall = false;
// stop handler
handler.removeCallbacks(this);
cancelNotification();
}
}
}, repeatMissedDelay);
@ -595,12 +597,14 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
outCall = false;
isMissedCall = false;
cancelNotification();
LOG.info(" Outgoing call end ");
}
break;
default:
isRinging = false;
isMissedCall = false;
cancelNotification();
LOG.info(" Call default ");
break;
}
}
@ -616,12 +620,16 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
if (buttonReject) {
LOG.info(" call rejected ");
isRinging = false;
remainingRepeats = 0;
isMissedCall = false;
callCmd.event = GBDeviceEventCallControl.Event.REJECT;
evaluateGBDeviceEvent(callCmd);
cancelNotification();
} else {
LOG.info(" call ignored ");
isRinging = false;
remainingRepeats = 0;
isMissedCall = false;
callCmd.event = GBDeviceEventCallControl.Event.IGNORE;
evaluateGBDeviceEvent(callCmd);
cancelNotification();
@ -638,14 +646,13 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
/** set personal info - read it from About me
* @param builder
* @param builder - transaction builder
* @param height - user height in meters
* @param weight - user weight in kg
* @param age - user age
* @param gender - user age
* send personal information on watch
*/
private WatchXPlusDeviceSupport setPersonalInformation(TransactionBuilder builder, int height, int weight, int age, int gender) {
private void setPersonalInformation(TransactionBuilder builder, int height, int weight, int age, int gender) {
LOG.warn(" Setting Personal Information... height:"+height+" weight:"+weight+" age:"+age+" gender:"+gender);
byte[] command = WatchXPlusConstants.CMD_SET_PERSONAL_INFO;
@ -659,7 +666,6 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
buildCommand(command,
WatchXPlusConstants.WRITE_VALUE,
bArr));
return this;
}
/** handle get/set personal info
@ -727,7 +733,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
@Override
public void onFetchRecordedData(int dataTypes) {
TransactionBuilder builder = null;
TransactionBuilder builder;
try {
builder = performInitialized("fetchData");
@ -807,7 +813,6 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
case ActivityUser.PREF_USER_STEPS_GOAL:
setFitnessGoal(builder);
break;
// settings from App Settings -> WatchXPlus settings
case WatchXPlusConstants.PREF_POWER_MODE:
setPowerMode();
@ -826,7 +831,6 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
case WatchXPlusConstants.PREF_BP_CAL_SWITCH:
sendBloodPressureCalibration();
break;
// settings from device card
case WatchXPlusConstants.PREF_ACTIVATE_DISPLAY:
setHeadsUpScreen(builder, sharedPreferences);
@ -863,7 +867,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
/** set long sit reminder time
* @param builder
* @param builder - transaction builder
* @param enable - state (true - enabled or false - disabled)
* @param hourStart - begin hour
* @param minuteStart - begin minute
@ -898,29 +902,28 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
/** get Long sit settings from app, and send it to watch
* @param builder
* @param sharedPreferences
* @return
* @param builder - transaction builder
* @param sharedPreferences - shared preferences
*/
private WatchXPlusDeviceSupport setLongSitHours(TransactionBuilder builder, SharedPreferences sharedPreferences) {
private void setLongSitHours(TransactionBuilder builder, SharedPreferences sharedPreferences) {
Calendar start = new GregorianCalendar();
Calendar end = new GregorianCalendar();
boolean enable = WatchXPlusDeviceCoordinator.getLongSitHours(sharedPreferences, start, end);
if (enable) {
int period = prefs.getInt(WatchXPlusConstants.PREF_LONGSIT_PERIOD, 60);
return this.setLongSitHours(builder, enable,
this.setLongSitHours(builder, enable,
start.get(Calendar.HOUR_OF_DAY), start.get(Calendar.MINUTE),
end.get(Calendar.HOUR_OF_DAY), end.get(Calendar.MINUTE),
period);
} else {
// disable Long sit reminder
LOG.info(" Long sit reminder are disabled");
return this.setLongSitSwitch(builder, enable);
this.setLongSitSwitch(builder, enable);
}
}
/** set long sit reminder switch
* @param tbuilder
* @param tbuilder - transaction builder
* @param enable - true or false
* enabled or disables long sit reminder (inactivity reminder) on watch
*/
@ -936,7 +939,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
/** set do not disturb time
* @param builder
* @param builder - transaction builder
* @param enable - state (true - enabled or false - disabled)
* @param hourStart - begin hour
* @param minuteStart - begin minute
@ -962,7 +965,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
/** set do not disturb switch
* @param tbuilder
* @param tbuilder - transaction builder
* @param enable - true or false
* enabled or disables DND on watch
*/
@ -976,22 +979,21 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
/** get DND settings from app, and send it to watch
* @param builder
* @param sharedPreferences
* @return
* @param builder - transaction builder
* @param sharedPreferences - shared preferences
*/
private WatchXPlusDeviceSupport setQuiteHours(TransactionBuilder builder, SharedPreferences sharedPreferences) {
private void setQuiteHours(TransactionBuilder builder, SharedPreferences sharedPreferences) {
Calendar start = new GregorianCalendar();
Calendar end = new GregorianCalendar();
boolean enable = WatchXPlusDeviceCoordinator.getQuiteHours(sharedPreferences, start, end);
if (enable) {
return this.setQuiteHours(builder, enable,
this.setQuiteHours(builder, enable,
start.get(Calendar.HOUR_OF_DAY), start.get(Calendar.MINUTE),
end.get(Calendar.HOUR_OF_DAY), end.get(Calendar.MINUTE));
} else {
// disable DND
LOG.info(" Quiet hours are disabled");
return this.setQuiteHoursSwitch(builder, enable);
this.setQuiteHoursSwitch(builder, enable);
}
}
@ -999,7 +1001,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
* switch watch power mode
* modes (0- normal, 1- energysaving, 2- only watch)
*/
private WatchXPlusDeviceSupport setPowerMode() {
private void setPowerMode() {
int settingRead = prefs.getInt(WatchXPlusConstants.PREF_POWER_MODE, 0);
byte[] bArr = new byte[1];
bArr[0] = (byte) settingRead;
@ -1014,7 +1016,6 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
} catch (IOException e) {
LOG.warn("Unable to set power mode", e);
}
return this;
}
/** request watch units
@ -1037,7 +1038,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
/** set watch units
*
*/
private WatchXPlusDeviceSupport setUnitsSettings() {
private void setUnitsSettings() {
int units = 0;
if (getContext().getString(R.string.p_unit_metric).equals(units)) {
LOG.info(" Changed units: metric");
@ -1058,11 +1059,10 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
} catch (IOException e) {
LOG.warn("Unable to set units", e);
}
return this;
}
/** request status of blood pressure calibration
* @param builder
* @param builder - transaction builder
*/
private WatchXPlusDeviceSupport getBloodPressureCalibrationStatus(TransactionBuilder builder) {
builder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
@ -1075,12 +1075,12 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
/** send blood pressure calibration to watch
* TODO add better error handling if blood pressure calibration is failed
*/
private WatchXPlusDeviceSupport sendBloodPressureCalibration() {
private void sendBloodPressureCalibration() {
try {
int beginCalibration = prefs.getInt(WatchXPlusConstants.PREF_BP_CAL_SWITCH, 0);
if (beginCalibration == 1) {
LOG.warn(" Calibrating BP - cancel " + beginCalibration);
return this;
return;
}
int mLowP = prefs.getInt(WatchXPlusConstants.PREF_BP_CAL_LOW, 80);
int mHighP = prefs.getInt(WatchXPlusConstants.PREF_BP_CAL_HIGH, 130);
@ -1093,7 +1093,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
byte mStart = 0x01; // initiate calibration
byte[] bArr = new byte[5];
bArr[0] = (byte) mStart; // byte[08]
bArr[0] = mStart; // byte[08]
bArr[1] = (byte) (mHighP >> 8); // byte[09]
bArr[2] = (byte) mHighP; // byte[10]
bArr[3] = (byte) (mLowP >> 8); // byte[11]
@ -1107,7 +1107,6 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
} catch (IOException e) {
LOG.warn("Unable to send BP Calibration", e);
}
return this;
}
/** handle watch response if blood pressure is calibrated
@ -1115,11 +1114,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
* save result to global variable (uses for BP measurement)
*/
private void handleBloodPressureCalibrationStatus(byte[] value) {
if (Conversion.fromByteArr16(value[8]) != 0) {
WatchXPlusDeviceCoordinator.isBPCalibrated = false;
} else {
WatchXPlusDeviceCoordinator.isBPCalibrated = true;
}
WatchXPlusDeviceCoordinator.isBPCalibrated = Conversion.fromByteArr16(value[8]) == 0;
}
/** handle watch response for result of blood pressure calibration
@ -1171,7 +1166,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
int second = prefs.getInt("wxp_newcmd_second", 0);
byte[] command = new byte[]{(byte) first, (byte) second};
LOG.info("testing new command " + command);
LOG.info("testing new command " + Arrays.toString(command));
builder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
buildCommand(command,
WatchXPlusConstants.READ_VALUE));
@ -1187,27 +1182,139 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
public void onSendWeather(WeatherSpec weatherSpec) {
try {
TransactionBuilder builder = performInitialized("setWeather");
int currentTemp = 0;
int todayMinTemp = 0;
int todayMaxTemp = 0;
int currentTemp;
int todayMinTemp;
int todayMaxTemp;
byte[] command = WatchXPlusConstants.CMD_WEATHER_SET;
byte[] weatherInfo = new byte[5];
String currentCondition = weatherSpec.currentCondition;
int currentCondition = weatherSpec.currentConditionCode;
// set weather icon
int currentConditionCode = 0; // 0 is sunny
switch (currentCondition) {
case "Overcast clouds":
//Group 2xx: Thunderstorm
case 200: //thunderstorm with light rain: //11d
case 201: //thunderstorm with rain: //11d
case 202: //thunderstorm with heavy rain: //11d
currentConditionCode = 1024;
break;
case 210: //light thunderstorm:: //11d
case 211: //thunderstorm: //11d
case 212: //heavy thunderstorm: //11d
case 221: //ragged thunderstorm: //11d
case 230: //thunderstorm with light drizzle: //11d
case 231: //thunderstorm with drizzle: //11d
case 232: //thunderstorm with heavy drizzle: //11d
currentConditionCode = 1025;
break;
//Group 3xx: Drizzle
case 300: //light intensity drizzle: //09d
case 301: //drizzle: //09d
case 302: //heavy intensity drizzle: //09d
case 310: //light intensity drizzle rain: //09d
case 500: //light rain: //10d
currentConditionCode = 256;
break;
case 311: //drizzle rain: //09d
case 312: //heavy intensity drizzle rain: //09d
case 313: //shower rain and drizzle: //09d
case 314: //heavy shower rain and drizzle: //09d
case 321: //shower drizzle: //09d
case 501: //moderate rain: //10d
currentConditionCode = 1280;
break;
//Group 5xx: Rain
case 511: //freezing rain: //13d
case 520: //light intensity shower rain: //09d
case 521: //shower rain: //09d
case 502: //heavy intensity rain: //10d
case 503: //very heavy rain: //10d
case 504: //extreme rain: //10d
case 522: //heavy intensity shower rain: //09d
case 531: //ragged shower rain: //09d
currentConditionCode = 258;
break;
//Group 6xx: Snow
case 600: //light snow:
case 601: //snow: //[[file:13d.png]]
currentConditionCode = 513;
break;
case 620: //light shower snow: //[[file:13d.png]]
currentConditionCode = 514;
break;
case 602: //heavy snow: //[[file:13d.png]]
case 621: //shower snow: //[[file:13d.png]]
case 622: //heavy shower snow: //[[file:13d.png]]
currentConditionCode = 515;
break;
case 611: //sleet: //[[file:13d.png]]
case 612: //shower sleet: //[[file:13d.png]]
currentConditionCode = 1026;
break;
case 615: //light rain and snow: //[[file:13d.png]]
case 616: //rain and snow: //[[file:13d.png]]
currentConditionCode = 4;
break;
//Group 7xx: Atmosphere
case 741: //fog: //[[file:50d.png]]
case 701: //mist: //[[file:50d.png]]
case 711: //smoke: //[[file:50d.png]]
currentConditionCode = 5;
break;
case 721: //haze: //[[file:50d.png]]
currentConditionCode = 3;
break;
case 731: //sandcase dust whirls: //[[file:50d.png]]
currentConditionCode = 771;
break;
case 751: //sand: //[[file:50d.png]]
case 761: //dust: //[[file:50d.png]]
case 762: //volcanic ash: //[[file:50d.png]]
case 771: //squalls: //[[file:50d.png]]
currentConditionCode = 769;
break;
case 781: //tornado: //[[file:50d.png]]
case 900: //tornado
currentConditionCode = 1283;
break;
//Group 800: Clear
case 800: //clear sky
currentConditionCode = 0;
break;
//Group 80x: Clouds
case 801: //few clouds: //[[file:02d.png]] [[file:02n.png]]
case 802: //scattered clouds: //[[file:03d.png]] [[file:03d.png]]
case 803: //broken clouds: //[[file:04d.png]] [[file:03d.png]]
currentConditionCode = 1;
case "Broken clouds":
break;
case 804: //overcast clouds: //[[file:04d.png]] [[file:04d.png]]
currentConditionCode = 2;
break;
//Group 90x: Extreme
case 901: //tropical storm
case 903: //cold
case 904: //hot
case 905: //windy
case 906: //hail
currentConditionCode = 1027;
break;
//Group 9xx: Additional
case 951: //calm
case 952: //light breeze
case 953: //gentle breeze
case 954: //moderate breeze
case 955: //fresh breeze
case 956: //strong breeze
case 957: //high windcase near gale
case 958: //gale
case 959: //severe gale
case 960: //storm
case 961: //violent storm
case 902: //hurricane
case 962: //hurricane
currentConditionCode = 261;
break;
}
if ((currentCondition.contains("Fog")) || (currentCondition.contains("fog"))) { currentConditionCode = 3; }
if ((currentCondition.contains("Rain")) || (currentCondition.contains("rain"))) { currentConditionCode = 257; }
if ((currentCondition.contains("Snow")) || (currentCondition.contains("snow"))) { currentConditionCode = 514; }
if ((currentCondition.contains("Sand")) || (currentCondition.contains("sand"))) { currentConditionCode = 769; }
if ((currentCondition.contains("Dust")) || (currentCondition.contains("dust"))) { currentConditionCode = 769; }
if ((currentCondition.contains("Sleet")) || (currentCondition.contains("sleet"))) { currentConditionCode = 1026; }
LOG.info( "Weather cond: " + currentCondition + " icon: " + currentConditionCode);
// calculate for temps under 0
currentTemp = (Math.abs(weatherSpec.currentTemp)) - 273;
if (currentTemp < 0) {
@ -1304,11 +1411,11 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
return true;
} else if (WatchXPlusConstants.UUID_CHARACTERISTIC_DATABASE_READ.equals(characteristicUUID)) {
LOG.info(" Value change for characteristic DATABASE: " + characteristicUUID + " value " + value);
LOG.info(" Value change for characteristic DATABASE: " + characteristicUUID + " value " + Arrays.toString(value));
handleContentDataChunk(value);
return true;
} else {
LOG.info(" Unhandled characteristic changed: " + characteristicUUID + " value " + value);
LOG.info(" Unhandled characteristic changed: " + characteristicUUID + " value " + Arrays.toString(value));
logMessageContent(characteristic.getValue());
}
@ -1516,10 +1623,8 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
} else {
LOG.warn(" Got unsupported data package type: " + type);
}
} catch (GBException ex) {
LOG.info((ex.getMessage()));
} catch (Exception ex) {
LOG.info(ex.getMessage());
LOG.info((ex.getMessage()));
}
}
@ -1569,7 +1674,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
TransactionBuilder builder = performInitialized("handleAck");
builder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
buildCommand((byte) 0x00));
buildCommand());
builder.queue(getQueue());
} catch (IOException e) {
LOG.warn("Unable to response to ACK", e);
@ -1577,14 +1682,14 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
// This is only for ACK response
private byte[] buildCommand(byte action) {
private byte[] buildCommand() {
byte[] result = new byte[7];
System.arraycopy(WatchXPlusConstants.CMD_HEADER, 0, result, 0, 5);
result[2] = (byte) (result.length - 6);
result[3] = WatchXPlusConstants.REQUEST;
result[4] = (byte) sequenceNumber++;
result[5] = action;
result[5] = (byte) 0;
result[result.length - 1] = calculateChecksum(result);
return result;
@ -1631,10 +1736,8 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
sample.setProvider(provider);
provider.addGBActivitySample(sample);
} catch (GBException ex) {
LOG.info((ex.getMessage()));
} catch (Exception ex) {
LOG.info(ex.getMessage());
LOG.info((ex.getMessage()));
}
}
}
@ -1687,7 +1790,8 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
private WatchXPlusActivitySample createSample(DBHandler dbHandler, int timestamp) {
Long userId = DBHelper.getUser(dbHandler.getDaoSession()).getId();
Long deviceId = DBHelper.getDevice(getDevice(), dbHandler.getDaoSession()).getId();
WatchXPlusActivitySample sample = new WatchXPlusActivitySample(
return new WatchXPlusActivitySample(
timestamp, // ts
deviceId, userId, // User id
null, // Raw Data
@ -1698,8 +1802,6 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
ActivitySample.NOT_MEASURED, // Distance
ActivitySample.NOT_MEASURED // Calories
);
return sample;
}
private byte[] buildCommand(byte[] command, byte action) {
@ -1740,7 +1842,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
/** handle watch response for battery level
* @param value
* @param value - returned value
*/
private void handleBatteryState(byte[] value) {
batteryInfo.state = value[8] == 1 ? BatteryState.BATTERY_NORMAL : BatteryState.BATTERY_LOW;
@ -1779,8 +1881,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
if (1 != value[8]) {
z = false;
}
LOG.info(" disconnectReminder: " + Boolean.valueOf(z) + " val: " + value[8]);
return;
LOG.info(" disconnectReminder: " + z + " val: " + value[8]);
}
// read preferences
@ -1797,7 +1898,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
activityUser.getAge(),activityUser.getGender());
}
private Handler mFindPhoneHandler = new Handler();
private final Handler mFindPhoneHandler = new Handler();
private void onReverseFindDevice(boolean start) {
if (start) {
@ -1832,8 +1933,8 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
}
// Set Lift Wrist to Light Screen based on saved preferences
private WatchXPlusDeviceSupport setHeadsUpScreen(TransactionBuilder transactionBuilder, SharedPreferences sharedPreferences) {
return this.setHeadsUpScreen(transactionBuilder,
private void setHeadsUpScreen(TransactionBuilder transactionBuilder, SharedPreferences sharedPreferences) {
this.setHeadsUpScreen(transactionBuilder,
WatchXPlusDeviceCoordinator.shouldEnableHeadsUpScreen(sharedPreferences));
}
@ -1860,8 +1961,8 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
return this;
}
private WatchXPlusDeviceSupport setDisconnectReminder(TransactionBuilder transactionBuilder, SharedPreferences sharedPreferences) {
return this.setDisconnectReminder(transactionBuilder,
private void setDisconnectReminder(TransactionBuilder transactionBuilder, SharedPreferences sharedPreferences) {
this.setDisconnectReminder(transactionBuilder,
WatchXPlusDeviceCoordinator.shouldEnableDisconnectReminder(sharedPreferences));
}
@ -1874,22 +1975,20 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
}
// Request status of Disconnect reminder
public WatchXPlusDeviceSupport getDisconnectReminderStatus(TransactionBuilder transactionBuilder) {
private void getDisconnectReminderStatus(TransactionBuilder transactionBuilder) {
transactionBuilder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
buildCommand(WatchXPlusConstants.CMD_DISCONNECT_REMIND,
WatchXPlusConstants.READ_VALUE));
return this;
}
// Request status of Lift Wrist to Light Screen, and Shake to Ignore/Reject Call
public WatchXPlusDeviceSupport getShakeStatus(TransactionBuilder transactionBuilder) {
private void getShakeStatus(TransactionBuilder transactionBuilder) {
transactionBuilder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
buildCommand(WatchXPlusConstants.CMD_SHAKE_SWITCH,
WatchXPlusConstants.READ_VALUE));
return this;
}
// calibrate altitude
private WatchXPlusDeviceSupport setAltitude(TransactionBuilder transactionBuilder) {
private void setAltitude(TransactionBuilder transactionBuilder) {
int mAltitude = WatchXPlusDeviceCoordinator.getAltitude(getDevice().getAddress());
if (mAltitude < 0) {
mAltitude = (Math.abs(mAltitude) ^ 65535) + 1;
@ -1905,7 +2004,6 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
WatchXPlusConstants.WRITE_VALUE,
bArr));
LOG.info(" setAltitude: " + mAltitude);
return this;
}
// set time format
@ -1920,8 +2018,8 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
return this;
}
private WatchXPlusDeviceSupport setLanguageAndTimeFormat(TransactionBuilder transactionBuilder, SharedPreferences sharedPreferences) {
return this.setLanguageAndTimeFormat(transactionBuilder,
private void setLanguageAndTimeFormat(TransactionBuilder transactionBuilder, SharedPreferences sharedPreferences) {
this.setLanguageAndTimeFormat(transactionBuilder,
WatchXPlusDeviceCoordinator.getTimeMode(sharedPreferences),
WatchXPlusDeviceCoordinator.getLanguage(sharedPreferences));
}
@ -1940,7 +2038,7 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
case 2:
return 1.0d * Math.pow(10.0d, -3.0d) * ((double) i2);
case 3:
return (double) (1 * i2);
return (double) (i2);
case 4:
return 10.0d * Math.pow(10.0d, -6.0d) * ((double) i2);
case 5:

View File

@ -65,7 +65,6 @@ public class XWatchSupport extends AbstractBTLEDeviceSupport {
private static final Logger LOG = LoggerFactory.getLogger(XWatchSupport.class);
private final GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo();
TransactionBuilder builder = null;
private DeviceInfo mDeviceInfo;
private byte dayToFetch; //0 = Today; 1 = Yesterday ...
private byte maxDayToFetch;
long lastButtonTimestamp;
@ -359,7 +358,7 @@ public class XWatchSupport extends AbstractBTLEDeviceSupport {
private void handleDeviceInfo(byte[] value, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
mDeviceInfo = new DeviceInfo(value);
DeviceInfo mDeviceInfo = new DeviceInfo(value);
LOG.warn("Device info: " + mDeviceInfo);
versionCmd.hwVersion = "1.0";
versionCmd.fwVersion = "1.0";