Search in sources :

Example 16 with GBDeviceEvent

use of nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent in project Gadgetbridge by Freeyourgadget.

the class PebbleProtocol method decodeResponse.

@Override
public GBDeviceEvent[] decodeResponse(byte[] responseData) {
    ByteBuffer buf = ByteBuffer.wrap(responseData);
    buf.order(ByteOrder.BIG_ENDIAN);
    short length = buf.getShort();
    short endpoint = buf.getShort();
    GBDeviceEvent[] devEvts = null;
    byte pebbleCmd;
    switch(endpoint) {
        case ENDPOINT_MUSICCONTROL:
            pebbleCmd = buf.get();
            GBDeviceEventMusicControl musicCmd = new GBDeviceEventMusicControl();
            switch(pebbleCmd) {
                case MUSICCONTROL_NEXT:
                    musicCmd.event = GBDeviceEventMusicControl.Event.NEXT;
                    break;
                case MUSICCONTROL_PREVIOUS:
                    musicCmd.event = GBDeviceEventMusicControl.Event.PREVIOUS;
                    break;
                case MUSICCONTROL_PLAY:
                    musicCmd.event = GBDeviceEventMusicControl.Event.PLAY;
                    break;
                case MUSICCONTROL_PAUSE:
                    musicCmd.event = GBDeviceEventMusicControl.Event.PAUSE;
                    break;
                case MUSICCONTROL_PLAYPAUSE:
                    musicCmd.event = GBDeviceEventMusicControl.Event.PLAYPAUSE;
                    break;
                case MUSICCONTROL_VOLUMEUP:
                    musicCmd.event = GBDeviceEventMusicControl.Event.VOLUMEUP;
                    break;
                case MUSICCONTROL_VOLUMEDOWN:
                    musicCmd.event = GBDeviceEventMusicControl.Event.VOLUMEDOWN;
                    break;
                default:
                    break;
            }
            devEvts = new GBDeviceEvent[] { musicCmd };
            break;
        case ENDPOINT_PHONECONTROL:
            pebbleCmd = buf.get();
            GBDeviceEventCallControl callCmd = new GBDeviceEventCallControl();
            switch(pebbleCmd) {
                case PHONECONTROL_HANGUP:
                    callCmd.event = GBDeviceEventCallControl.Event.END;
                    break;
                default:
                    LOG.info("Unknown PHONECONTROL event" + pebbleCmd);
                    break;
            }
            devEvts = new GBDeviceEvent[] { callCmd };
            break;
        case ENDPOINT_FIRMWAREVERSION:
            pebbleCmd = buf.get();
            GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo();
            // skip
            buf.getInt();
            versionCmd.fwVersion = getFixedString(buf, 32);
            mFwMajor = versionCmd.fwVersion.charAt(1) - 48;
            LOG.info("Pebble firmware major detected as " + mFwMajor);
            byte[] tmp = new byte[9];
            buf.get(tmp, 0, 9);
            int hwRev = buf.get() + 8;
            if (hwRev >= 0 && hwRev < hwRevisions.length) {
                versionCmd.hwVersion = hwRevisions[hwRev];
            }
            devEvts = new GBDeviceEvent[] { versionCmd };
            break;
        case ENDPOINT_APPMANAGER:
            pebbleCmd = buf.get();
            switch(pebbleCmd) {
                case APPMANAGER_GETAPPBANKSTATUS:
                    GBDeviceEventAppInfo appInfoCmd = new GBDeviceEventAppInfo();
                    int slotCount = buf.getInt();
                    int slotsUsed = buf.getInt();
                    appInfoCmd.apps = new GBDeviceApp[slotsUsed];
                    boolean[] slotInUse = new boolean[slotCount];
                    for (int i = 0; i < slotsUsed; i++) {
                        int id = buf.getInt();
                        int index = buf.getInt();
                        slotInUse[index] = true;
                        String appName = getFixedString(buf, 32);
                        String appCreator = getFixedString(buf, 32);
                        int flags = buf.getInt();
                        GBDeviceApp.Type appType;
                        if ((flags & 16) == 16) {
                            // FIXME: verify this assumption
                            appType = GBDeviceApp.Type.APP_ACTIVITYTRACKER;
                        } else if ((flags & 1) == 1) {
                            // FIXME: verify this assumption
                            appType = GBDeviceApp.Type.WATCHFACE;
                        } else {
                            appType = GBDeviceApp.Type.APP_GENERIC;
                        }
                        Short appVersion = buf.getShort();
                        appInfoCmd.apps[i] = new GBDeviceApp(tmpUUIDS.get(i), appName, appCreator, appVersion.toString(), appType);
                    }
                    for (int i = 0; i < slotCount; i++) {
                        if (!slotInUse[i]) {
                            appInfoCmd.freeSlot = (byte) i;
                            LOG.info("found free slot " + i);
                            break;
                        }
                    }
                    devEvts = new GBDeviceEvent[] { appInfoCmd };
                    break;
                case APPMANAGER_GETUUIDS:
                    GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes();
                    sendBytes.encodedBytes = encodeSimpleMessage(ENDPOINT_APPMANAGER, APPMANAGER_GETAPPBANKSTATUS);
                    devEvts = new GBDeviceEvent[] { sendBytes };
                    tmpUUIDS.clear();
                    slotsUsed = buf.getInt();
                    for (int i = 0; i < slotsUsed; i++) {
                        UUID uuid = getUUID(buf);
                        LOG.info("found uuid: " + uuid);
                        tmpUUIDS.add(uuid);
                    }
                    break;
                case APPMANAGER_REMOVEAPP:
                    GBDeviceEventAppManagement deleteRes = new GBDeviceEventAppManagement();
                    deleteRes.type = GBDeviceEventAppManagement.EventType.DELETE;
                    int result = buf.getInt();
                    switch(result) {
                        case APPMANAGER_RES_SUCCESS:
                            deleteRes.event = GBDeviceEventAppManagement.Event.SUCCESS;
                            break;
                        default:
                            deleteRes.event = GBDeviceEventAppManagement.Event.FAILURE;
                            break;
                    }
                    devEvts = new GBDeviceEvent[] { deleteRes };
                    break;
                default:
                    LOG.info("Unknown APPMANAGER event" + pebbleCmd);
                    break;
            }
            break;
        case ENDPOINT_PUTBYTES:
            pebbleCmd = buf.get();
            GBDeviceEventAppManagement installRes = new GBDeviceEventAppManagement();
            installRes.type = GBDeviceEventAppManagement.EventType.INSTALL;
            switch(pebbleCmd) {
                case PUTBYTES_INIT:
                    installRes.token = buf.getInt();
                    installRes.event = GBDeviceEventAppManagement.Event.SUCCESS;
                    break;
                default:
                    installRes.token = buf.getInt();
                    installRes.event = GBDeviceEventAppManagement.Event.FAILURE;
                    break;
            }
            devEvts = new GBDeviceEvent[] { installRes };
            break;
        case ENDPOINT_APPLICATIONMESSAGE:
        case ENDPOINT_LAUNCHER:
            pebbleCmd = buf.get();
            last_id = buf.get();
            UUID uuid = getUUID(buf);
            switch(pebbleCmd) {
                case APPLICATIONMESSAGE_PUSH:
                    LOG.info((endpoint == ENDPOINT_LAUNCHER ? "got LAUNCHER PUSH from UUID : " : "got APPLICATIONMESSAGE PUSH from UUID : ") + uuid);
                    AppMessageHandler handler = mAppMessageHandlers.get(uuid);
                    if (handler != null) {
                        if (handler.isEnabled()) {
                            if (endpoint == ENDPOINT_APPLICATIONMESSAGE) {
                                ArrayList<Pair<Integer, Object>> dict = decodeDict(buf);
                                devEvts = handler.handleMessage(dict);
                            } else {
                                currentRunningApp = uuid;
                                devEvts = handler.onAppStart();
                            }
                        } else {
                            devEvts = new GBDeviceEvent[] { null };
                        }
                    } else {
                        try {
                            if (endpoint == ENDPOINT_APPLICATIONMESSAGE) {
                                devEvts = decodeDictToJSONAppMessage(uuid, buf);
                            } else {
                                currentRunningApp = uuid;
                                GBDeviceEventAppManagement gbDeviceEventAppManagement = new GBDeviceEventAppManagement();
                                gbDeviceEventAppManagement.uuid = uuid;
                                gbDeviceEventAppManagement.type = GBDeviceEventAppManagement.EventType.START;
                                gbDeviceEventAppManagement.event = GBDeviceEventAppManagement.Event.SUCCESS;
                                devEvts = new GBDeviceEvent[] { gbDeviceEventAppManagement };
                            }
                        } catch (JSONException e) {
                            LOG.error(e.getMessage());
                            return null;
                        }
                    }
                    break;
                case APPLICATIONMESSAGE_ACK:
                    LOG.info("got APPLICATIONMESSAGE/LAUNCHER (EP " + endpoint + ")  ACK");
                    devEvts = new GBDeviceEvent[] { null };
                    break;
                case APPLICATIONMESSAGE_NACK:
                    LOG.info("got APPLICATIONMESSAGE/LAUNCHER (EP " + endpoint + ")  NACK");
                    devEvts = new GBDeviceEvent[] { null };
                    break;
                case APPLICATIONMESSAGE_REQUEST:
                    LOG.info("got APPLICATIONMESSAGE/LAUNCHER (EP " + endpoint + ")  REQUEST");
                    devEvts = new GBDeviceEvent[] { null };
                    break;
                default:
                    break;
            }
            break;
        case ENDPOINT_PHONEVERSION:
            pebbleCmd = buf.get();
            switch(pebbleCmd) {
                case PHONEVERSION_REQUEST:
                    LOG.info("Pebble asked for Phone/App Version - repLYING!");
                    GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes();
                    sendBytes.encodedBytes = encodePhoneVersion(PHONEVERSION_REMOTE_OS_ANDROID);
                    devEvts = new GBDeviceEvent[] { sendBytes };
                    break;
                default:
                    break;
            }
            break;
        case ENDPOINT_DATALOG:
            devEvts = decodeDatalog(buf, length);
            break;
        case ENDPOINT_SCREENSHOT:
            devEvts = new GBDeviceEvent[] { decodeScreenshot(buf, length) };
            break;
        case ENDPOINT_EXTENSIBLENOTIFS:
        case ENDPOINT_NOTIFICATIONACTION:
            devEvts = decodeAction(buf);
            break;
        case ENDPOINT_PING:
            devEvts = new GBDeviceEvent[] { decodePing(buf) };
            break;
        case ENDPOINT_APPFETCH:
            devEvts = new GBDeviceEvent[] { decodeAppFetch(buf) };
            break;
        case ENDPOINT_SYSTEMMESSAGE:
            devEvts = new GBDeviceEvent[] { decodeSystemMessage(buf) };
            break;
        case ENDPOINT_APPRUNSTATE:
            devEvts = decodeAppRunState(buf);
            break;
        case ENDPOINT_BLOBDB:
            devEvts = new GBDeviceEvent[] { decodeBlobDb(buf) };
            break;
        case ENDPOINT_APPREORDER:
            devEvts = new GBDeviceEvent[] { decodeAppReorder(buf) };
            break;
        case ENDPOINT_APPLOGS:
            decodeAppLogs(buf);
            break;
        //                break;
        default:
            break;
    }
    return devEvts;
}
Also used : GBDeviceEvent(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent) JSONException(org.json.JSONException) GBDeviceEventCallControl(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl) GBDeviceEventVersionInfo(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo) ByteBuffer(java.nio.ByteBuffer) GBDeviceEventAppManagement(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppManagement) GBDeviceEventMusicControl(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl) GBDeviceEventAppInfo(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo) GBDeviceEventSendBytes(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes) UUID(java.util.UUID) GBDeviceApp(nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp) Pair(android.util.Pair)

Example 17 with GBDeviceEvent

use of nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent in project Gadgetbridge by Freeyourgadget.

the class LiveviewIoThread method run.

@Override
public void run() {
    mIsConnected = connect();
    if (!mIsConnected) {
        setUpdateState(GBDevice.State.NOT_CONNECTED);
        return;
    }
    mQuit = false;
    while (!mQuit) {
        LOG.info("Ready for a new message exchange.");
        try {
            GBDeviceEvent[] deviceEvents = mLiveviewProtocol.decodeResponse(parseIncoming());
            if (deviceEvents == null) {
                LOG.info("unhandled message");
            } else {
                for (GBDeviceEvent deviceEvent : deviceEvents) {
                    if (deviceEvent == null) {
                        continue;
                    }
                    mLiveviewSupport.evaluateGBDeviceEvent(deviceEvent);
                }
            }
        } catch (SocketTimeoutException ignore) {
            LOG.debug("socket timeout, we can't help but ignore this");
        } catch (IOException e) {
            LOG.info(e.getMessage());
            mIsConnected = false;
            mBtSocket = null;
            mInStream = null;
            mOutStream = null;
            LOG.info("Bluetooth socket closed, will quit IO Thread");
            break;
        }
    }
    mIsConnected = false;
    if (mBtSocket != null) {
        try {
            mBtSocket.close();
        } catch (IOException e) {
            LOG.error(e.getMessage());
        }
        mBtSocket = null;
    }
    setUpdateState(GBDevice.State.NOT_CONNECTED);
}
Also used : GBDeviceEvent(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent) SocketTimeoutException(java.net.SocketTimeoutException) IOException(java.io.IOException)

Example 18 with GBDeviceEvent

use of nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent in project Gadgetbridge by Freeyourgadget.

the class AppMessageHandlerHealthify method onAppStart.

@Override
public GBDeviceEvent[] onAppStart() {
    WeatherSpec weatherSpec = Weather.getInstance().getWeatherSpec();
    if (weatherSpec == null) {
        return new GBDeviceEvent[] { null };
    }
    GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes();
    sendBytes.encodedBytes = encodeHelthifyWeatherMessage(weatherSpec);
    return new GBDeviceEvent[] { sendBytes };
}
Also used : GBDeviceEvent(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent) WeatherSpec(nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec) GBDeviceEventSendBytes(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes)

Aggregations

GBDeviceEvent (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent)18 GBDeviceEventSendBytes (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes)15 WeatherSpec (nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec)7 ByteBuffer (java.nio.ByteBuffer)4 UUID (java.util.UUID)4 IOException (java.io.IOException)3 DBHandler (nodomain.freeyourgadget.gadgetbridge.database.DBHandler)2 GBDeviceEventAppManagement (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppManagement)2 JSONException (org.json.JSONException)2 JSONObject (org.json.JSONObject)2 Pair (android.util.Pair)1 SocketTimeoutException (java.net.SocketTimeoutException)1 Date (java.util.Date)1 SimpleTimeZone (java.util.SimpleTimeZone)1 TimeZone (java.util.TimeZone)1 GBDeviceEventAppInfo (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo)1 GBDeviceEventAppMessage (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppMessage)1 GBDeviceEventCallControl (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallControl)1 GBDeviceEventMusicControl (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl)1 GBDeviceEventNotificationControl (nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventNotificationControl)1