1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-27 02:55:50 +01:00

huawei: Improve user feedback in error cases

Currently the user isn't informed about errors when connecting to
the watch and is left with a working BT connection that isn't used at all.

Add toasts when the HiChainRequest fails or times out and disconnect
the phone. Without a successful HiChain established the connection is
useless anyways and it causes the phone to be not discoverable any more.

In addition add a timeout to the HiChainRequest, one longer for the first
pairing, where the user needs to confirm the pairing request on the watch.
The short delay is used for subsequent HiChainRequests.

The watch might not answer HiChainRequests when it was paired with a
different phone, so the added timeout and toast improves user experience
a lot since it's now clear that there was a problem.

Related to issue #4148
Related to issue #4061
Fixes issue #4062

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
This commit is contained in:
Patrick Rudolph 2024-09-28 19:58:56 +02:00 committed by José Rebelo
parent ce387396fd
commit a923766aa5
2 changed files with 26 additions and 0 deletions

View File

@ -494,6 +494,26 @@ public class HuaweiSupportProvider {
public void call() { public void call() {
initializeDeviceConfigure(); initializeDeviceConfigure();
} }
@Override
public void timeout(Request request) {
LOG.error("Authentication timed out");
GB.toast(context, R.string.authentication_failed_negotiation, Toast.LENGTH_LONG, GB.ERROR);
// Disconnect as no communication can succeed after this point
final GBDevice device = getDevice();
if (device != null) {
GBApplication.deviceService(device).disconnect();
}
}
@Override
public void handleException(Request.ResponseParseException e) {
LOG.error("Authentication exception", e);
GB.toast(context, R.string.authentication_failed_negotiation, Toast.LENGTH_LONG, GB.ERROR);
// Disconnect as no communication can succeed after this point
final GBDevice device = getDevice();
if (device != null) {
GBApplication.deviceService(device).disconnect();
}
}
}; };
protected void initializeDeviceHiChainMode(int authType) { protected void initializeDeviceHiChainMode(int authType) {

View File

@ -53,13 +53,19 @@ public class GetHiChainRequest extends Request {
private byte[] challenge = null; private byte[] challenge = null;
private byte[] psk = null; private byte[] psk = null;
// The user needs to confirm the pairing request on the device itself.
private final int firstAuthenticateTimeout = 30 * 1000;
private final int authenticateTimeout = 5000;
public GetHiChainRequest(HuaweiSupportProvider support, boolean firstConnection) { public GetHiChainRequest(HuaweiSupportProvider support, boolean firstConnection) {
super(support); super(support);
this.serviceId = DeviceConfig.id; this.serviceId = DeviceConfig.id;
this.commandId = HiChain.id; this.commandId = HiChain.id;
if (firstConnection) { if (firstConnection) {
setupTimeoutUntilNext(firstAuthenticateTimeout);
operationCode = 0x01; operationCode = 0x01;
} else {
setupTimeoutUntilNext(authenticateTimeout);
} }
this.step = 0x01; this.step = 0x01;
} }