Search in sources :

Example 6 with GBDevice

use of nodomain.freeyourgadget.gadgetbridge.impl.GBDevice in project Gadgetbridge by Freeyourgadget.

the class DeviceHelper method toGBDevice.

/**
     * Converts a known device from the database to a GBDevice.
     * Note: The device might not be supported anymore, so callers should verify that.
     * @param dbDevice
     * @return
     */
public GBDevice toGBDevice(Device dbDevice) {
    DeviceType deviceType = DeviceType.fromKey(dbDevice.getType());
    GBDevice gbDevice = new GBDevice(dbDevice.getIdentifier(), dbDevice.getName(), deviceType);
    List<DeviceAttributes> deviceAttributesList = dbDevice.getDeviceAttributesList();
    if (deviceAttributesList.size() > 0) {
        gbDevice.setModel(dbDevice.getModel());
        DeviceAttributes attrs = deviceAttributesList.get(0);
        gbDevice.setFirmwareVersion(attrs.getFirmwareVersion1());
        gbDevice.setFirmwareVersion2(attrs.getFirmwareVersion2());
        gbDevice.setVolatileAddress(attrs.getVolatileIdentifier());
    }
    return gbDevice;
}
Also used : DeviceType(nodomain.freeyourgadget.gadgetbridge.model.DeviceType) DeviceAttributes(nodomain.freeyourgadget.gadgetbridge.entities.DeviceAttributes) GBDevice(nodomain.freeyourgadget.gadgetbridge.impl.GBDevice)

Example 7 with GBDevice

use of nodomain.freeyourgadget.gadgetbridge.impl.GBDevice in project Gadgetbridge by Freeyourgadget.

the class DeviceHelper method getBondedDevices.

private List<GBDevice> getBondedDevices(BluetoothAdapter btAdapter) {
    Set<BluetoothDevice> pairedDevices = btAdapter.getBondedDevices();
    List<GBDevice> result = new ArrayList<>(pairedDevices.size());
    DeviceHelper deviceHelper = DeviceHelper.getInstance();
    for (BluetoothDevice pairedDevice : pairedDevices) {
        if (pairedDevice.getName() != null && (pairedDevice.getName().startsWith("Pebble-LE ") || pairedDevice.getName().startsWith("Pebble Time LE "))) {
            // ignore LE Pebble (this is part of the main device now (volatileAddress)
            continue;
        }
        GBDevice device = deviceHelper.toSupportedDevice(pairedDevice);
        if (device != null) {
            result.add(device);
        }
    }
    return result;
}
Also used : BluetoothDevice(android.bluetooth.BluetoothDevice) ArrayList(java.util.ArrayList) GBDevice(nodomain.freeyourgadget.gadgetbridge.impl.GBDevice)

Example 8 with GBDevice

use of nodomain.freeyourgadget.gadgetbridge.impl.GBDevice in project Gadgetbridge by Freeyourgadget.

the class AppMessageHandlerMisfit method handleMessage.

@Override
public GBDeviceEvent[] handleMessage(ArrayList<Pair<Integer, Object>> pairs) {
    GBDevice device = getDevice();
    for (Pair<Integer, Object> pair : pairs) {
        switch(pair.first) {
            case KEY_INCOMING_DATA_BEGIN:
                LOG.info("incoming data start");
                break;
            case KEY_INCOMING_DATA_END:
                LOG.info("incoming data end");
                break;
            case KEY_INCOMING_DATA:
                byte[] data = (byte[]) pair.second;
                ByteBuffer buf = ByteBuffer.wrap(data);
                buf.order(ByteOrder.LITTLE_ENDIAN);
                int timestamp = buf.getInt();
                int key = buf.getInt();
                int samples = (data.length - 8) / 2;
                if (samples <= 0) {
                    break;
                }
                if (mPebbleProtocol.mFwMajor < 3) {
                    timestamp -= SimpleTimeZone.getDefault().getOffset(timestamp * 1000L) / 1000;
                }
                Date startDate = new Date((long) timestamp * 1000L);
                Date endDate = new Date((long) (timestamp + samples * 60) * 1000L);
                LOG.info("got data from " + startDate + " to " + endDate);
                int totalSteps = 0;
                PebbleMisfitSample[] misfitSamples = new PebbleMisfitSample[samples];
                try (DBHandler db = GBApplication.acquireDB()) {
                    PebbleMisfitSampleProvider sampleProvider = new PebbleMisfitSampleProvider(device, db.getDaoSession());
                    Long userId = DBHelper.getUser(db.getDaoSession()).getId();
                    Long deviceId = DBHelper.getDevice(getDevice(), db.getDaoSession()).getId();
                    for (int i = 0; i < samples; i++) {
                        short sample = buf.getShort();
                        misfitSamples[i] = new PebbleMisfitSample(timestamp + i * 60, deviceId, userId, sample & 0xffff);
                        misfitSamples[i].setProvider(sampleProvider);
                        int steps = misfitSamples[i].getSteps();
                        totalSteps += steps;
                        LOG.info("got steps for sample " + i + " : " + steps + "(" + Integer.toHexString(sample & 0xffff) + ")");
                    }
                    LOG.info("total steps for above period: " + totalSteps);
                    sampleProvider.addGBActivitySamples(misfitSamples);
                } catch (Exception e) {
                    LOG.error("Error acquiring database", e);
                    return null;
                }
                break;
            default:
                LOG.info("unhandled key: " + pair.first);
                break;
        }
    }
    // always ack
    GBDeviceEventSendBytes sendBytesAck = new GBDeviceEventSendBytes();
    sendBytesAck.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(mUUID, mPebbleProtocol.last_id);
    return new GBDeviceEvent[] { sendBytesAck };
}
Also used : GBDeviceEvent(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent) ByteBuffer(java.nio.ByteBuffer) Date(java.util.Date) GBDevice(nodomain.freeyourgadget.gadgetbridge.impl.GBDevice) DBHandler(nodomain.freeyourgadget.gadgetbridge.database.DBHandler) PebbleMisfitSampleProvider(nodomain.freeyourgadget.gadgetbridge.devices.pebble.PebbleMisfitSampleProvider) GBDeviceEventSendBytes(nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes) PebbleMisfitSample(nodomain.freeyourgadget.gadgetbridge.entities.PebbleMisfitSample)

Example 9 with GBDevice

use of nodomain.freeyourgadget.gadgetbridge.impl.GBDevice in project Gadgetbridge by Freeyourgadget.

the class GBDeviceAdapterv2 method onBindViewHolder.

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    final GBDevice device = deviceList.get(position);
    final DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
    holder.container.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (device.isInitialized() || device.isConnected()) {
                showTransientSnackbar(R.string.controlcenter_snackbar_need_longpress);
            } else {
                showTransientSnackbar(R.string.controlcenter_snackbar_connecting);
                GBApplication.deviceService().connect(device);
            }
        }
    });
    holder.container.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            if (device.getState() != GBDevice.State.NOT_CONNECTED) {
                showTransientSnackbar(R.string.controlcenter_snackbar_disconnecting);
                GBApplication.deviceService().disconnect();
            }
            return true;
        }
    });
    holder.deviceImageView.setImageResource(R.drawable.level_list_device);
    //level-list does not allow negative values, hence we always add 100 to the key.
    holder.deviceImageView.setImageLevel(device.getType().getKey() + 100 + (device.isInitialized() ? 100 : 0));
    holder.deviceNameLabel.setText(getUniqueDeviceName(device));
    if (device.isBusy()) {
        holder.deviceStatusLabel.setText(device.getBusyTask());
        holder.busyIndicator.setVisibility(View.VISIBLE);
    } else {
        holder.deviceStatusLabel.setText(device.getStateString());
        holder.busyIndicator.setVisibility(View.INVISIBLE);
    }
    //begin of action row
    //battery
    holder.batteryStatusBox.setVisibility(View.GONE);
    short batteryLevel = device.getBatteryLevel();
    if (batteryLevel != GBDevice.BATTERY_UNKNOWN) {
        holder.batteryStatusBox.setVisibility(View.VISIBLE);
        holder.batteryStatusLabel.setText(device.getBatteryLevel() + "%");
        BatteryState batteryState = device.getBatteryState();
        if (BatteryState.BATTERY_CHARGING.equals(batteryState) || BatteryState.BATTERY_CHARGING_FULL.equals(batteryState)) {
            holder.batteryIcon.setImageLevel(device.getBatteryLevel() + 100);
        } else {
            holder.batteryIcon.setImageLevel(device.getBatteryLevel());
        }
    }
    //fetch activity data
    holder.fetchActivityDataBox.setVisibility((device.isInitialized() && coordinator.supportsActivityDataFetching()) ? View.VISIBLE : View.GONE);
    holder.fetchActivityData.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            showTransientSnackbar(R.string.busy_task_fetch_activity_data);
            GBApplication.deviceService().onFetchActivityData();
        }
    });
    //take screenshot
    holder.takeScreenshotView.setVisibility((device.isInitialized() && coordinator.supportsScreenshots()) ? View.VISIBLE : View.GONE);
    holder.takeScreenshotView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            showTransientSnackbar(R.string.controlcenter_snackbar_requested_screenshot);
            GBApplication.deviceService().onScreenshotReq();
        }
    });
    //manage apps
    holder.manageAppsView.setVisibility((device.isInitialized() && coordinator.supportsAppsManagement()) ? View.VISIBLE : View.GONE);
    holder.manageAppsView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
            Class<? extends Activity> appsManagementActivity = coordinator.getAppsManagementActivity();
            if (appsManagementActivity != null) {
                Intent startIntent = new Intent(context, appsManagementActivity);
                startIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
                context.startActivity(startIntent);
            }
        }
    });
    //set alarms
    holder.setAlarmsView.setVisibility(coordinator.supportsAlarmConfiguration() ? View.VISIBLE : View.GONE);
    holder.setAlarmsView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent startIntent;
            startIntent = new Intent(context, ConfigureAlarms.class);
            context.startActivity(startIntent);
        }
    });
    //show graphs
    holder.showActivityGraphs.setVisibility(coordinator.supportsActivityTracking() ? View.VISIBLE : View.GONE);
    holder.showActivityGraphs.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent startIntent;
            startIntent = new Intent(context, ChartsActivity.class);
            startIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
            context.startActivity(startIntent);
        }
    });
    ItemWithDetailsAdapter infoAdapter = new ItemWithDetailsAdapter(context, device.getDeviceInfos());
    infoAdapter.setHorizontalAlignment(true);
    holder.deviceInfoList.setAdapter(infoAdapter);
    justifyListViewHeightBasedOnChildren(holder.deviceInfoList);
    holder.deviceInfoList.setFocusable(false);
    final boolean detailsShown = position == expandedDevicePosition;
    boolean showInfoIcon = device.hasDeviceInfos() && !device.isBusy();
    holder.deviceInfoView.setVisibility(showInfoIcon ? View.VISIBLE : View.GONE);
    holder.deviceInfoBox.setActivated(detailsShown);
    holder.deviceInfoBox.setVisibility(detailsShown ? View.VISIBLE : View.GONE);
    holder.deviceInfoView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            expandedDevicePosition = detailsShown ? -1 : position;
            TransitionManager.beginDelayedTransition(parent);
            notifyDataSetChanged();
        }
    });
    holder.findDevice.setVisibility(device.isInitialized() ? View.VISIBLE : View.GONE);
    holder.findDevice.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (device.getType() == DeviceType.VIBRATISSIMO) {
                Intent startIntent;
                startIntent = new Intent(context, VibrationActivity.class);
                startIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
                context.startActivity(startIntent);
                return;
            }
            GBApplication.deviceService().onFindDevice(true);
            //TODO: extract string resource if we like this solution.
            Snackbar.make(parent, R.string.control_center_find_lost_device, Snackbar.LENGTH_INDEFINITE).setAction("Found it!", new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    GBApplication.deviceService().onFindDevice(false);
                }
            }).setCallback(new Snackbar.Callback() {

                @Override
                public void onDismissed(Snackbar snackbar, int event) {
                    GBApplication.deviceService().onFindDevice(false);
                    super.onDismissed(snackbar, event);
                }
            }).show();
        //                                                     ProgressDialog.show(
        //                                                             context,
        //                                                             context.getString(R.string.control_center_find_lost_device),
        //                                                             context.getString(R.string.control_center_cancel_to_stop_vibration),
        //                                                             true, true,
        //                                                             new DialogInterface.OnCancelListener() {
        //                                                                 @Override
        //                                                                 public void onCancel(DialogInterface dialog) {
        //                                                                     GBApplication.deviceService().onFindDevice(false);
        //                                                                 }
        //                                                             });
        }
    });
    //remove device, hidden under details
    holder.removeDevice.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            new AlertDialog.Builder(context).setCancelable(true).setTitle(context.getString(R.string.controlcenter_delete_device_name, device.getName())).setMessage(R.string.controlcenter_delete_device_dialogmessage).setPositiveButton(R.string.Delete, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    try {
                        DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
                        if (coordinator != null) {
                            coordinator.deleteDevice(device);
                        }
                        DeviceHelper.getInstance().removeBond(device);
                    } catch (Exception ex) {
                        GB.toast(context, "Error deleting device: " + ex.getMessage(), Toast.LENGTH_LONG, GB.ERROR, ex);
                    } finally {
                        Intent refreshIntent = new Intent(DeviceManager.ACTION_REFRESH_DEVICELIST);
                        LocalBroadcastManager.getInstance(context).sendBroadcast(refreshIntent);
                    }
                }
            }).setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                // do nothing
                }
            }).show();
        }
    });
}
Also used : AlertDialog(android.app.AlertDialog) DialogInterface(android.content.DialogInterface) VibrationActivity(nodomain.freeyourgadget.gadgetbridge.activities.VibrationActivity) ChartsActivity(nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity) Activity(android.app.Activity) Intent(android.content.Intent) ImageView(android.widget.ImageView) View(android.view.View) CardView(android.support.v7.widget.CardView) RecyclerView(android.support.v7.widget.RecyclerView) TextView(android.widget.TextView) ListView(android.widget.ListView) GBDevice(nodomain.freeyourgadget.gadgetbridge.impl.GBDevice) BatteryState(nodomain.freeyourgadget.gadgetbridge.model.BatteryState) DeviceCoordinator(nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator) Snackbar(android.support.design.widget.Snackbar)

Example 10 with GBDevice

use of nodomain.freeyourgadget.gadgetbridge.impl.GBDevice in project Gadgetbridge by Freeyourgadget.

the class DeviceManager method updateDeviceName.

private void updateDeviceName(BluetoothDevice device, String newName) {
    for (GBDevice dev : deviceList) {
        if (device.getAddress().equals(dev.getAddress())) {
            if (!dev.getName().equals(newName)) {
                dev.setName(newName);
                notifyDevicesChanged();
                return;
            }
        }
    }
}
Also used : GBDevice(nodomain.freeyourgadget.gadgetbridge.impl.GBDevice)

Aggregations

GBDevice (nodomain.freeyourgadget.gadgetbridge.impl.GBDevice)23 Device (nodomain.freeyourgadget.gadgetbridge.entities.Device)7 BluetoothDevice (android.bluetooth.BluetoothDevice)4 DBHandler (nodomain.freeyourgadget.gadgetbridge.database.DBHandler)3 DeviceAttributes (nodomain.freeyourgadget.gadgetbridge.entities.DeviceAttributes)3 Test (org.junit.Test)3 Intent (android.content.Intent)2 View (android.view.View)2 ListView (android.widget.ListView)2 TextView (android.widget.TextView)2 ArrayList (java.util.ArrayList)2 DaoSession (nodomain.freeyourgadget.gadgetbridge.entities.DaoSession)2 DeviceDao (nodomain.freeyourgadget.gadgetbridge.entities.DeviceDao)2 Activity (android.app.Activity)1 AlertDialog (android.app.AlertDialog)1 BluetoothAdapter (android.bluetooth.BluetoothAdapter)1 DialogInterface (android.content.DialogInterface)1 IntentFilter (android.content.IntentFilter)1 Uri (android.net.Uri)1 Snackbar (android.support.design.widget.Snackbar)1