mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-12-19 15:17:50 +01:00
Xiaomi: Set and delete watchfaces
This commit is contained in:
parent
7fb81b6e0d
commit
a895a6aae7
@ -22,7 +22,9 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo;
|
||||||
@ -39,18 +41,16 @@ public class XiaomiWatchfaceService extends AbstractXiaomiService {
|
|||||||
|
|
||||||
public static final int CMD_WATCHFACE_LIST = 0;
|
public static final int CMD_WATCHFACE_LIST = 0;
|
||||||
public static final int CMD_WATCHFACE_SET = 1;
|
public static final int CMD_WATCHFACE_SET = 1;
|
||||||
|
public static final int CMD_WATCHFACE_DELETE = 2;
|
||||||
public static final int CMD_WATCHFACE_INSTALL = 4;
|
public static final int CMD_WATCHFACE_INSTALL = 4;
|
||||||
|
|
||||||
|
private final Set<UUID> allWatchfaces = new HashSet<>();
|
||||||
|
private final Set<UUID> userWatchfaces = new HashSet<>();
|
||||||
|
|
||||||
public XiaomiWatchfaceService(final XiaomiSupport support) {
|
public XiaomiWatchfaceService(final XiaomiSupport support) {
|
||||||
super(support);
|
super(support);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initialize(final TransactionBuilder builder) {
|
|
||||||
//getSupport().sendCommand(builder, COMMAND_TYPE, CMD_WATCHFACE_LIST);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleCommand(final XiaomiProto.Command cmd) {
|
public void handleCommand(final XiaomiProto.Command cmd) {
|
||||||
// TODO
|
// TODO
|
||||||
@ -60,7 +60,12 @@ public class XiaomiWatchfaceService extends AbstractXiaomiService {
|
|||||||
// TODO handle
|
// TODO handle
|
||||||
return;
|
return;
|
||||||
case CMD_WATCHFACE_SET:
|
case CMD_WATCHFACE_SET:
|
||||||
// watchface set ack
|
LOG.debug("Got watchface set response, ack={}", cmd.getWatchface().getAck());
|
||||||
|
//requestWatchfaceList();
|
||||||
|
return;
|
||||||
|
case CMD_WATCHFACE_DELETE:
|
||||||
|
LOG.debug("Got watchface delete response, ack={}", cmd.getWatchface().getAck());
|
||||||
|
requestWatchfaceList();
|
||||||
return;
|
return;
|
||||||
case CMD_WATCHFACE_INSTALL:
|
case CMD_WATCHFACE_INSTALL:
|
||||||
return;
|
return;
|
||||||
@ -82,11 +87,20 @@ public class XiaomiWatchfaceService extends AbstractXiaomiService {
|
|||||||
private void handleWatchfaceList(final XiaomiProto.WatchfaceList watchfaceList) {
|
private void handleWatchfaceList(final XiaomiProto.WatchfaceList watchfaceList) {
|
||||||
LOG.debug("Got {} watchfaces", watchfaceList.getWatchfaceCount());
|
LOG.debug("Got {} watchfaces", watchfaceList.getWatchfaceCount());
|
||||||
|
|
||||||
|
allWatchfaces.clear();
|
||||||
|
userWatchfaces.clear();
|
||||||
|
|
||||||
final List<GBDeviceApp> gbDeviceApps = new ArrayList<>();
|
final List<GBDeviceApp> gbDeviceApps = new ArrayList<>();
|
||||||
|
|
||||||
for (final XiaomiProto.WatchfaceInfo watchface : watchfaceList.getWatchfaceList()) {
|
for (final XiaomiProto.WatchfaceInfo watchface : watchfaceList.getWatchfaceList()) {
|
||||||
|
final UUID uuid = toWatchfaceUUID(watchface.getId());
|
||||||
|
allWatchfaces.add(uuid);
|
||||||
|
if (watchface.getCanDelete()) {
|
||||||
|
userWatchfaces.add(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
GBDeviceApp gbDeviceApp = new GBDeviceApp(
|
GBDeviceApp gbDeviceApp = new GBDeviceApp(
|
||||||
UUID.randomUUID(),
|
uuid,
|
||||||
watchface.getName(),
|
watchface.getName(),
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
@ -101,23 +115,78 @@ public class XiaomiWatchfaceService extends AbstractXiaomiService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setWatchface(final UUID uuid) {
|
public void setWatchface(final UUID uuid) {
|
||||||
// TODO
|
if (!allWatchfaces.contains(uuid)) {
|
||||||
|
LOG.warn("Unknown watchface {}", uuid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.debug("Set watchface to {}", uuid);
|
||||||
|
|
||||||
|
getSupport().sendCommand(
|
||||||
|
"set watchface to " + uuid,
|
||||||
|
XiaomiProto.Command.newBuilder()
|
||||||
|
.setType(COMMAND_TYPE)
|
||||||
|
.setSubtype(CMD_WATCHFACE_SET)
|
||||||
|
.setWatchface(XiaomiProto.Watchface.newBuilder().setWatchfaceId(toWatchfaceId(uuid)))
|
||||||
|
.build()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setWatchface(final String watchfaceId) {
|
public void setWatchface(final String watchfaceId) {
|
||||||
// TODO
|
setWatchface(toWatchfaceUUID(watchfaceId));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteWatchface(final UUID uuid) {
|
public void deleteWatchface(final UUID uuid) {
|
||||||
// TODO
|
if (!userWatchfaces.contains(uuid)) {
|
||||||
|
LOG.warn("Refusing to delete non-user watchface {}", uuid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!allWatchfaces.contains(uuid)) {
|
||||||
|
LOG.warn("Refusing to delete unknown watchface {}", uuid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.debug("Delete watchface {}", uuid);
|
||||||
|
|
||||||
|
allWatchfaces.remove(uuid);
|
||||||
|
userWatchfaces.remove(uuid);
|
||||||
|
|
||||||
|
getSupport().sendCommand(
|
||||||
|
"delete watchface " + uuid,
|
||||||
|
XiaomiProto.Command.newBuilder()
|
||||||
|
.setType(COMMAND_TYPE)
|
||||||
|
.setSubtype(CMD_WATCHFACE_DELETE)
|
||||||
|
.setWatchface(XiaomiProto.Watchface.newBuilder().setWatchfaceId(toWatchfaceId(uuid)))
|
||||||
|
.build()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteWatchface(final String watchfaceId) {
|
public void deleteWatchface(final String watchfaceId) {
|
||||||
// TODO
|
deleteWatchface(toWatchfaceUUID(watchfaceId));
|
||||||
// TODO prevent uninstall of non-uninstallable watchface
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void installWatchface(final Uri uri) {
|
public void installWatchface(final Uri uri) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static UUID toWatchfaceUUID(final String id) {
|
||||||
|
// Watchface IDs are numbers as strings - pad them to the right with F
|
||||||
|
// and encode as UUID
|
||||||
|
final String padded = String.format("%-32s", id).replace(' ', 'F');
|
||||||
|
return UUID.fromString(
|
||||||
|
padded.substring(0, 8) + "-" +
|
||||||
|
padded.substring(8, 12) + "-" +
|
||||||
|
padded.substring(12, 16) + "-" +
|
||||||
|
padded.substring(16, 20) + "-" +
|
||||||
|
padded.substring(20, 32)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toWatchfaceId(final UUID uuid) {
|
||||||
|
return uuid.toString()
|
||||||
|
.replaceAll("-", "")
|
||||||
|
.replaceAll("f", "")
|
||||||
|
.replaceAll("F", "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user