Remove id and index from GBDeviceApp in favor of UUIDs

This commit is contained in:
Andreas Shimokawa 2015-05-18 20:56:19 +02:00
parent 6fa2017dda
commit c37cacf43d
23 changed files with 136 additions and 79 deletions

View File

@ -1,5 +1,7 @@
package nodomain.freeyourgadget.gadgetbridge; package nodomain.freeyourgadget.gadgetbridge;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceProtocol; import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceProtocol;
public abstract class AbstractBTDeviceSupport extends AbstractDeviceSupport { public abstract class AbstractBTDeviceSupport extends AbstractDeviceSupport {
@ -106,8 +108,8 @@ public abstract class AbstractBTDeviceSupport extends AbstractDeviceSupport {
} }
@Override @Override
public void onAppDelete(int id, int index) { public void onAppDelete(UUID uuid) {
byte[] bytes = gbDeviceProtocol.encodeAppDelete(id, index); byte[] bytes = gbDeviceProtocol.encodeAppDelete(uuid);
sendToDevice(bytes); sendToDevice(bytes);
} }

View File

@ -14,11 +14,13 @@ import android.view.View;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ListView; import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.adapter.GBDeviceAppAdapter; import nodomain.freeyourgadget.gadgetbridge.adapter.GBDeviceAppAdapter;
@ -39,11 +41,10 @@ public class AppManagerActivity extends Activity {
for (Integer i = 0; i < appCount; i++) { for (Integer i = 0; i < appCount; i++) {
String appName = intent.getStringExtra("app_name" + i.toString()); String appName = intent.getStringExtra("app_name" + i.toString());
String appCreator = intent.getStringExtra("app_creator" + i.toString()); String appCreator = intent.getStringExtra("app_creator" + i.toString());
int id = intent.getIntExtra("app_id" + i.toString(), -1); UUID uuid = UUID.fromString(intent.getStringExtra("app_uuid" + i.toString()));
int index = intent.getIntExtra("app_index" + i.toString(), -1);
GBDeviceApp.Type appType = GBDeviceApp.Type.values()[intent.getIntExtra("app_type" + i.toString(), 0)]; GBDeviceApp.Type appType = GBDeviceApp.Type.values()[intent.getIntExtra("app_type" + i.toString(), 0)];
appList.add(new GBDeviceApp(id, index, appName, appCreator, "", appType)); appList.add(new GBDeviceApp(uuid, appName, appCreator, "", appType));
} }
mGBDeviceAppAdapter.notifyDataSetChanged(); mGBDeviceAppAdapter.notifyDataSetChanged();
} }
@ -92,8 +93,7 @@ public class AppManagerActivity extends Activity {
if (selectedApp != null) { if (selectedApp != null) {
Intent deleteIntent = new Intent(this, BluetoothCommunicationService.class); Intent deleteIntent = new Intent(this, BluetoothCommunicationService.class);
deleteIntent.setAction(BluetoothCommunicationService.ACTION_DELETEAPP); deleteIntent.setAction(BluetoothCommunicationService.ACTION_DELETEAPP);
deleteIntent.putExtra("app_id", selectedApp.getId()); deleteIntent.putExtra("app_uuid", selectedApp.getUUID().toString());
deleteIntent.putExtra("app_index", selectedApp.getIndex());
startService(deleteIntent); startService(deleteIntent);
} }
return true; return true;

View File

@ -21,6 +21,8 @@ import android.widget.Toast;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBDevice.State; import nodomain.freeyourgadget.gadgetbridge.GBDevice.State;
import nodomain.freeyourgadget.gadgetbridge.miband.MiBandSupport; import nodomain.freeyourgadget.gadgetbridge.miband.MiBandSupport;
import nodomain.freeyourgadget.gadgetbridge.pebble.PebbleIoThread; import nodomain.freeyourgadget.gadgetbridge.pebble.PebbleIoThread;
@ -226,9 +228,8 @@ public class BluetoothCommunicationService extends Service {
mDeviceSupport.onAppInfoReq(); mDeviceSupport.onAppInfoReq();
break; break;
case ACTION_DELETEAPP: case ACTION_DELETEAPP:
int id = intent.getIntExtra("app_id", -1); UUID uuid = UUID.fromString(intent.getStringExtra("app_uuid"));
int index = intent.getIntExtra("app_index", -1); mDeviceSupport.onAppDelete(uuid);
mDeviceSupport.onAppDelete(id, index);
break; break;
case ACTION_INSTALL_PEBBLEAPP: case ACTION_INSTALL_PEBBLEAPP:
String uriString = intent.getStringExtra("app_uri"); String uriString = intent.getStringExtra("app_uri");

View File

@ -8,7 +8,9 @@ public interface DeviceCoordinator {
String EXTRA_DEVICE_MAC_ADDRESS = "nodomain.freeyourgadget.gadgetbridge.discovery.DeviceCandidate.EXTRA_MAC_ADDRESS"; String EXTRA_DEVICE_MAC_ADDRESS = "nodomain.freeyourgadget.gadgetbridge.discovery.DeviceCandidate.EXTRA_MAC_ADDRESS";
boolean supports(DeviceCandidate candidate); boolean supports(DeviceCandidate candidate);
boolean supports(GBDevice device); boolean supports(GBDevice device);
DeviceType getDeviceType(); DeviceType getDeviceType();
Class<? extends Activity> getPairingActivity(); Class<? extends Activity> getPairingActivity();

View File

@ -28,6 +28,7 @@ public interface DeviceSupport extends EventHandler {
BluetoothAdapter getBluetoothAdapter(); BluetoothAdapter getBluetoothAdapter();
Context getContext(); Context getContext();
boolean useAutoConnect(); boolean useAutoConnect();
void pair(); void pair();

View File

@ -1,5 +1,7 @@
package nodomain.freeyourgadget.gadgetbridge; package nodomain.freeyourgadget.gadgetbridge;
import java.util.UUID;
public interface EventHandler { public interface EventHandler {
void onSMS(String from, String body); void onSMS(String from, String body);
@ -19,7 +21,7 @@ public interface EventHandler {
void onAppInfoReq(); void onAppInfoReq();
void onAppDelete(int id, int index); void onAppDelete(UUID uuid);
void onPhoneVersion(byte os); void onPhoneVersion(byte os);

View File

@ -3,16 +3,7 @@ package nodomain.freeyourgadget.gadgetbridge;
import android.app.Application; import android.app.Application;
import android.content.Context; import android.content.Context;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.util.FileUtil;
import ch.qos.logback.core.util.StatusPrinter;
public class GBApplication extends Application { public class GBApplication extends Application {
private static GBApplication context; private static GBApplication context;

View File

@ -5,11 +5,12 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import java.lang.reflect.Method; import com.android.internal.telephony.ITelephony;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.android.internal.telephony.ITelephony; import java.lang.reflect.Method;
import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceCommandCallControl; import nodomain.freeyourgadget.gadgetbridge.protocol.GBDeviceCommandCallControl;

View File

@ -1,16 +1,16 @@
package nodomain.freeyourgadget.gadgetbridge; package nodomain.freeyourgadget.gadgetbridge;
import java.util.UUID;
public class GBDeviceApp { public class GBDeviceApp {
private final String name; private final String name;
private final String creator; private final String creator;
private final String version; private final String version;
private final int id; private final UUID uuid;
private final int index;
private final Type type; private final Type type;
public GBDeviceApp(int id, int index, String name, String creator, String version, Type type) { public GBDeviceApp(UUID uuid, String name, String creator, String version, Type type) {
this.id = id; this.uuid = uuid;
this.index = index;
this.name = name; this.name = name;
this.creator = creator; this.creator = creator;
this.version = version; this.version = version;
@ -29,12 +29,8 @@ public class GBDeviceApp {
return version; return version;
} }
public int getId() { public UUID getUUID() {
return id; return uuid;
}
public int getIndex() {
return index;
} }
public Type getType() { public Type getType() {

View File

@ -4,14 +4,15 @@ import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic; import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService; import android.bluetooth.BluetoothGattService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.AbstractDeviceSupport; import nodomain.freeyourgadget.gadgetbridge.AbstractDeviceSupport;

View File

@ -25,7 +25,7 @@ public abstract class BtLEAction {
/** /**
* Returns true if this actions expects an (async) result which must * Returns true if this actions expects an (async) result which must
* be waited for, before continuing with other actions. * be waited for, before continuing with other actions.
* * <p/>
* This is needed because the current Bluedroid stack can only deal * This is needed because the current Bluedroid stack can only deal
* with one single bluetooth operation at a time. * with one single bluetooth operation at a time.
*/ */
@ -33,6 +33,7 @@ public abstract class BtLEAction {
/** /**
* Executes this action, e.g. reads or write a GATT characteristic. * Executes this action, e.g. reads or write a GATT characteristic.
*
* @param gatt the characteristic to manipulate, or null if none. * @param gatt the characteristic to manipulate, or null if none.
* @return true if the action was successful, false otherwise * @return true if the action was successful, false otherwise
*/ */

View File

@ -56,7 +56,7 @@ public interface GattCallback {
* @see BluetoothGattCallback#onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int) * @see BluetoothGattCallback#onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int)
*/ */
void onCharacteristicWrite(BluetoothGatt gatt, void onCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status); BluetoothGattCharacteristic characteristic, int status);
/** /**
* @param gatt * @param gatt
@ -64,7 +64,7 @@ public interface GattCallback {
* @see BluetoothGattCallback#onCharacteristicChanged(BluetoothGatt, BluetoothGattCharacteristic) * @see BluetoothGattCallback#onCharacteristicChanged(BluetoothGatt, BluetoothGattCharacteristic)
*/ */
void onCharacteristicChanged(BluetoothGatt gatt, void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic); BluetoothGattCharacteristic characteristic);
// /** // /**
// * @see BluetoothGattCallback#onDescriptorRead(BluetoothGatt, BluetoothGattDescriptor, int) // * @see BluetoothGattCallback#onDescriptorRead(BluetoothGatt, BluetoothGattDescriptor, int)

View File

@ -19,10 +19,11 @@ import android.widget.ListView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
import java.util.ArrayList;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import nodomain.freeyourgadget.gadgetbridge.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.DeviceHelper; import nodomain.freeyourgadget.gadgetbridge.DeviceHelper;
import nodomain.freeyourgadget.gadgetbridge.GB; import nodomain.freeyourgadget.gadgetbridge.GB;
@ -203,7 +204,7 @@ public class DiscoveryActivity extends Activity implements AdapterView.OnItemCli
if (ensureBluetoothReady()) { if (ensureBluetoothReady()) {
if (what == Scanning.SCANNING_BT) { if (what == Scanning.SCANNING_BT) {
startBTDiscovery(); startBTDiscovery();
} else if (what == Scanning.SCANNING_BTLE){ } else if (what == Scanning.SCANNING_BTLE) {
if (GB.supportsBluetoothLE()) { if (GB.supportsBluetoothLE()) {
startBTLEDiscovery(); startBTLEDiscovery();
} else { } else {
@ -326,8 +327,7 @@ public class DiscoveryActivity extends Activity implements AdapterView.OnItemCli
Intent intent = new Intent(this, pairingActivity); Intent intent = new Intent(this, pairingActivity);
intent.putExtra(DeviceCoordinator.EXTRA_DEVICE_MAC_ADDRESS, deviceCandidate.getMacAddress()); intent.putExtra(DeviceCoordinator.EXTRA_DEVICE_MAC_ADDRESS, deviceCandidate.getMacAddress());
startActivity(intent); startActivity(intent);
} } else {
else {
try { try {
BluetoothDevice btDevice = adapter.getRemoteDevice(deviceCandidate.getMacAddress()); BluetoothDevice btDevice = adapter.getRemoteDevice(deviceCandidate.getMacAddress());
if (btDevice.createBond()) { if (btDevice.createBond()) {

View File

@ -7,11 +7,10 @@ import android.content.SharedPreferences;
import android.os.PowerManager; import android.os.PowerManager;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.BluetoothCommunicationService; import nodomain.freeyourgadget.gadgetbridge.BluetoothCommunicationService;

View File

@ -4,10 +4,11 @@ import android.app.Activity;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import java.util.Calendar;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.Calendar;
import nodomain.freeyourgadget.gadgetbridge.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.DeviceType; import nodomain.freeyourgadget.gadgetbridge.DeviceType;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
@ -50,6 +51,7 @@ public class MiBandCoordinator implements DeviceCoordinator {
/** /**
* Returns the configured user info, or, if that is not available or invalid, * Returns the configured user info, or, if that is not available or invalid,
* a default user info. * a default user info.
*
* @param miBandAddress * @param miBandAddress
*/ */
public static UserInfo getAnyUserInfo(String miBandAddress) { public static UserInfo getAnyUserInfo(String miBandAddress) {
@ -63,6 +65,7 @@ public class MiBandCoordinator implements DeviceCoordinator {
/** /**
* Returns the user info from the user configured data in the preferences. * Returns the user info from the user configured data in the preferences.
*
* @param miBandAddress * @param miBandAddress
* @throws IllegalArgumentException when the user info can not be created * @throws IllegalArgumentException when the user info can not be created
*/ */

View File

@ -6,9 +6,9 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager; import android.support.v4.content.LocalBroadcastManager;
import android.os.Bundle;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;

View File

@ -8,7 +8,19 @@ import android.support.v4.content.LocalBroadcastManager;
import nodomain.freeyourgadget.gadgetbridge.ControlCenter; import nodomain.freeyourgadget.gadgetbridge.ControlCenter;
import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivity; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivity;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.*;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_GENERIC;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_K9MAIL;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_PEBBLEMSG;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_SMS;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_MIBAND_ADDRESS;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_USER_ALIAS;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_USER_GENDER;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_USER_HEIGHT_CM;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_USER_WEIGHT_KG;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_USER_YEAR_OF_BIRTH;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.VIBRATION_COUNT;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.getNotificationPrefKey;
public class MiBandPreferencesActivity extends AbstractSettingsActivity { public class MiBandPreferencesActivity extends AbstractSettingsActivity {
@Override @Override

View File

@ -5,19 +5,37 @@ import android.bluetooth.BluetoothGattCharacteristic;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.UUID; import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nodomain.freeyourgadget.gadgetbridge.GBCommand; import nodomain.freeyourgadget.gadgetbridge.GBCommand;
import nodomain.freeyourgadget.gadgetbridge.GBDevice.State; import nodomain.freeyourgadget.gadgetbridge.GBDevice.State;
import nodomain.freeyourgadget.gadgetbridge.btle.AbstractBTLEDeviceSupport; import nodomain.freeyourgadget.gadgetbridge.btle.AbstractBTLEDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.btle.TransactionBuilder;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.*; import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.DEFAULT_VALUE_FLASH_COLOUR;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.DEFAULT_VALUE_FLASH_COUNT;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.DEFAULT_VALUE_FLASH_DURATION;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.DEFAULT_VALUE_FLASH_ORIGINAL_COLOUR;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_COUNT;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_DURATION;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_PAUSE;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.FLASH_COLOUR;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.FLASH_COUNT;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.FLASH_DURATION;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.FLASH_ORIGINAL_COLOUR;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_GENERIC;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_K9MAIL;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_SMS;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.VIBRATION_COUNT;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.VIBRATION_DURATION;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.VIBRATION_PAUSE;
import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.getNotificationPrefIntValue;
public class MiBandSupport extends AbstractBTLEDeviceSupport { public class MiBandSupport extends AbstractBTLEDeviceSupport {
@ -80,9 +98,9 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
builder.queue(getQueue()); builder.queue(getQueue());
} }
private static final byte[] startVibrate = new byte[]{ 8, 1 }; private static final byte[] startVibrate = new byte[]{8, 1};
private static final byte[] stopVibrate = new byte[]{ 19 }; private static final byte[] stopVibrate = new byte[]{19};
private static final byte[] reboot = new byte[]{ 12 }; private static final byte[] reboot = new byte[]{12};
private byte[] getNotification(long vibrateDuration, int vibrateTimes, int flashTimes, int flashColour, int originalColour, long flashDuration) { private byte[] getNotification(long vibrateDuration, int vibrateTimes, int flashTimes, int flashColour, int originalColour, long flashDuration) {
byte[] vibrate = new byte[]{(byte) 8, (byte) 1}; byte[] vibrate = new byte[]{(byte) 8, (byte) 1};
@ -304,7 +322,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
} }
@Override @Override
public void onAppDelete(int id, int index) { public void onAppDelete(UUID uuid) {
// not supported // not supported
} }

View File

@ -82,7 +82,6 @@ public class UserInfo {
} }
private String ensureTenCharacters(String alias) { private String ensureTenCharacters(String alias) {
char[] result = new char[10]; char[] result = new char[10];
int aliasLen = alias.length(); int aliasLen = alias.length();

View File

@ -4,6 +4,11 @@ import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -12,14 +17,10 @@ import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.slf4j.Logger; import java.util.UUID;
import org.slf4j.LoggerFactory;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import org.json.JSONException;
import org.json.JSONObject;
import nodomain.freeyourgadget.gadgetbridge.GBDeviceApp; import nodomain.freeyourgadget.gadgetbridge.GBDeviceApp;
public class PBWReader { public class PBWReader {
@ -127,9 +128,10 @@ public class PBWReader {
String appName = json.getString("shortName"); String appName = json.getString("shortName");
String appCreator = json.getString("companyName"); String appCreator = json.getString("companyName");
String appVersion = json.getString("versionLabel"); String appVersion = json.getString("versionLabel");
UUID uuid = UUID.fromString(json.getString("uuid"));
if (appName != null && appCreator != null && appVersion != null) { if (appName != null && appCreator != null && appVersion != null) {
// FIXME: dont assume WATCHFACE // FIXME: dont assume WATCHFACE
app = new GBDeviceApp(-1, -1, appName, appCreator, appVersion, GBDeviceApp.Type.WATCHFACE); app = new GBDeviceApp(uuid, appName, appCreator, appVersion, GBDeviceApp.Type.WATCHFACE);
} }
} catch (JSONException e) { } catch (JSONException e) {

View File

@ -15,13 +15,14 @@ import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager; import android.support.v4.content.LocalBroadcastManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import nodomain.freeyourgadget.gadgetbridge.AppManagerActivity; import nodomain.freeyourgadget.gadgetbridge.AppManagerActivity;
@ -375,8 +376,7 @@ public class PebbleIoThread extends GBDeviceIoThread {
for (Integer i = 0; i < appCount; i++) { for (Integer i = 0; i < appCount; i++) {
appInfoIntent.putExtra("app_name" + i.toString(), appInfoCmd.apps[i].getName()); appInfoIntent.putExtra("app_name" + i.toString(), appInfoCmd.apps[i].getName());
appInfoIntent.putExtra("app_creator" + i.toString(), appInfoCmd.apps[i].getCreator()); appInfoIntent.putExtra("app_creator" + i.toString(), appInfoCmd.apps[i].getCreator());
appInfoIntent.putExtra("app_id" + i.toString(), appInfoCmd.apps[i].getId()); appInfoIntent.putExtra("app_uuid" + i.toString(), appInfoCmd.apps[i].getUUID().toString());
appInfoIntent.putExtra("app_index" + i.toString(), appInfoCmd.apps[i].getIndex());
appInfoIntent.putExtra("app_type" + i.toString(), appInfoCmd.apps[i].getType().ordinal()); appInfoIntent.putExtra("app_type" + i.toString(), appInfoCmd.apps[i].getType().ordinal());
} }
LocalBroadcastManager.getInstance(context).sendBroadcast(appInfoIntent); LocalBroadcastManager.getInstance(context).sendBroadcast(appInfoIntent);

View File

@ -90,6 +90,7 @@ public class PebbleProtocol extends GBDeviceProtocol {
static final byte APPMANAGER_GETAPPBANKSTATUS = 1; static final byte APPMANAGER_GETAPPBANKSTATUS = 1;
static final byte APPMANAGER_REMOVEAPP = 2; static final byte APPMANAGER_REMOVEAPP = 2;
static final byte APPMANAGER_REFRESHAPP = 3; static final byte APPMANAGER_REFRESHAPP = 3;
static final byte APPMANAGER_GETUUIDS = 5;
static final int APPMANAGER_RES_SUCCESS = 1; static final int APPMANAGER_RES_SUCCESS = 1;
@ -138,7 +139,7 @@ public class PebbleProtocol extends GBDeviceProtocol {
static final byte PHONEVERSION_REMOTE_OS_UNKNOWN = 0; static final byte PHONEVERSION_REMOTE_OS_UNKNOWN = 0;
static final byte PHONEVERSION_REMOTE_OS_IOS = 1; static final byte PHONEVERSION_REMOTE_OS_IOS = 1;
public static final byte PHONEVERSION_REMOTE_OS_ANDROID = 2; static final byte PHONEVERSION_REMOTE_OS_ANDROID = 2;
static final byte PHONEVERSION_REMOTE_OS_OSX = 3; static final byte PHONEVERSION_REMOTE_OS_OSX = 3;
static final byte PHONEVERSION_REMOTE_OS_LINUX = 4; static final byte PHONEVERSION_REMOTE_OS_LINUX = 4;
static final byte PHONEVERSION_REMOTE_OS_WINDOWS = 5; static final byte PHONEVERSION_REMOTE_OS_WINDOWS = 5;
@ -147,7 +148,7 @@ public class PebbleProtocol extends GBDeviceProtocol {
static final short LENGTH_PREFIX = 4; static final short LENGTH_PREFIX = 4;
static final short LENGTH_SETTIME = 5; static final short LENGTH_SETTIME = 5;
static final short LENGTH_GETTIME = 1; static final short LENGTH_GETTIME = 1;
static final short LENGTH_REMOVEAPP = 9; static final short LENGTH_REMOVEAPP = 17;
static final short LENGTH_REFRESHAPP = 5; static final short LENGTH_REFRESHAPP = 5;
static final short LENGTH_PHONEVERSION = 17; static final short LENGTH_PHONEVERSION = 17;
static final short LENGTH_UPLOADSTART = 7; static final short LENGTH_UPLOADSTART = 7;
@ -159,10 +160,15 @@ public class PebbleProtocol extends GBDeviceProtocol {
private static final String[] hwRevisions = {"unknown", "ev1", "ev2", "ev2_3", "ev2_4", "v1_5", "v2_0"}; private static final String[] hwRevisions = {"unknown", "ev1", "ev2", "ev2_3", "ev2_4", "v1_5", "v2_0"};
private static Random mRandom = new Random(); private static Random mRandom = new Random();
static byte last_id = -1;
private byte last_id = -1;
private ArrayList<UUID> tmpUUIDS = new ArrayList<>();
// FIXME: this does not belong here // FIXME: this does not belong here
static final UUID WeatherNeatUUID = UUID.fromString("3684003b-a685-45f9-a713-abc6364ba051"); static final UUID WeatherNeatUUID = UUID.fromString("3684003b-a685-45f9-a713-abc6364ba051");
private static byte[] encodeMessage(short endpoint, byte type, int cookie, String[] parts) { private static byte[] encodeMessage(short endpoint, byte type, int cookie, String[] parts) {
// Calculate length first // Calculate length first
int length = LENGTH_PREFIX + 1; int length = LENGTH_PREFIX + 1;
@ -377,18 +383,18 @@ public class PebbleProtocol extends GBDeviceProtocol {
@Override @Override
public byte[] encodeAppInfoReq() { public byte[] encodeAppInfoReq() {
return encodeMessage(ENDPOINT_APPMANAGER, APPMANAGER_GETAPPBANKSTATUS, 0, null); return encodeMessage(ENDPOINT_APPMANAGER, APPMANAGER_GETUUIDS, 0, null);
} }
@Override @Override
public byte[] encodeAppDelete(int id, int index) { public byte[] encodeAppDelete(UUID uuid) {
ByteBuffer buf = ByteBuffer.allocate(LENGTH_PREFIX + LENGTH_REMOVEAPP); ByteBuffer buf = ByteBuffer.allocate(LENGTH_PREFIX + LENGTH_REMOVEAPP);
buf.order(ByteOrder.BIG_ENDIAN); buf.order(ByteOrder.BIG_ENDIAN);
buf.putShort(LENGTH_REMOVEAPP); buf.putShort(LENGTH_REMOVEAPP);
buf.putShort(ENDPOINT_APPMANAGER); buf.putShort(ENDPOINT_APPMANAGER);
buf.put(APPMANAGER_REMOVEAPP); buf.put(APPMANAGER_REMOVEAPP);
buf.putInt(id); buf.putLong(uuid.getMostSignificantBits());
buf.putInt(index); buf.putLong(uuid.getLeastSignificantBits());
return buf.array(); return buf.array();
} }
@ -682,7 +688,7 @@ public class PebbleProtocol extends GBDeviceProtocol {
appType = GBDeviceApp.Type.APP_GENERIC; appType = GBDeviceApp.Type.APP_GENERIC;
} }
Short appVersion = buf.getShort(); Short appVersion = buf.getShort();
appInfoCmd.apps[i] = new GBDeviceApp(id, index, new String(appName).trim(), new String(appCreator).trim(), appVersion.toString(), appType); appInfoCmd.apps[i] = new GBDeviceApp(tmpUUIDS.get(i), new String(appName).trim(), new String(appCreator).trim(), appVersion.toString(), appType);
} }
for (int i = 0; i < slotCount; i++) { for (int i = 0; i < slotCount; i++) {
if (!slotInUse[i]) { if (!slotInUse[i]) {
@ -693,6 +699,20 @@ public class PebbleProtocol extends GBDeviceProtocol {
} }
cmd = appInfoCmd; cmd = appInfoCmd;
break; break;
case APPMANAGER_GETUUIDS:
GBDeviceCommandSendBytes sendBytes = new GBDeviceCommandSendBytes();
sendBytes.encodedBytes = encodeMessage(ENDPOINT_APPMANAGER, APPMANAGER_GETAPPBANKSTATUS, 0, null);
cmd = sendBytes;
tmpUUIDS.clear();
slotsUsed = buf.getInt();
for (int i = 0; i < slotsUsed; i++) {
long uuid_high = buf.getLong();
long uuid_low = buf.getLong();
UUID uuid = new UUID(uuid_high, uuid_low);
LOG.info("found uuid: " + uuid);
tmpUUIDS.add(uuid);
}
break;
case APPMANAGER_REMOVEAPP: case APPMANAGER_REMOVEAPP:
GBDeviceCommandAppManagementResult deleteRes = new GBDeviceCommandAppManagementResult(); GBDeviceCommandAppManagementResult deleteRes = new GBDeviceCommandAppManagementResult();
deleteRes.type = GBDeviceCommandAppManagementResult.CommandType.DELETE; deleteRes.type = GBDeviceCommandAppManagementResult.CommandType.DELETE;

View File

@ -1,5 +1,7 @@
package nodomain.freeyourgadget.gadgetbridge.protocol; package nodomain.freeyourgadget.gadgetbridge.protocol;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBCommand; import nodomain.freeyourgadget.gadgetbridge.GBCommand;
public abstract class GBDeviceProtocol { public abstract class GBDeviceProtocol {
@ -40,7 +42,7 @@ public abstract class GBDeviceProtocol {
return null; return null;
} }
public byte[] encodeAppDelete(int id, int index) { public byte[] encodeAppDelete(UUID uuid) {
return null; return null;
} }
@ -48,7 +50,11 @@ public abstract class GBDeviceProtocol {
return null; return null;
} }
public byte[] encodeReboot() { return null; } public byte[] encodeReboot() {
return null;
}
public GBDeviceCommand decodeResponse(byte[] responseData) { return null; } public GBDeviceCommand decodeResponse(byte[] responseData) {
return null;
}
} }