diff --git a/.gitignore b/.gitignore index 8f91cf5abd77cade2fc4eb3afdbec4d51127a988..3fc61441802c7ae713eb97332a469ddc7a9992b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,8 @@ -*.iml -.gradle /local.properties -/.idea/workspace.xml -/.idea/libraries -/.idea/caches -.DS_Store +/.idea/ /build /captures +*.iml +.gradle +.DS_Store .externalNativeBuild diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 30aa626c23142d59e94cc76327172301f159b618..0000000000000000000000000000000000000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,29 +0,0 @@ -<component name="ProjectCodeStyleConfiguration"> - <code_scheme name="Project" version="173"> - <Objective-C-extensions> - <file> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" /> - </file> - <class> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" /> - <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" /> - </class> - <extensions> - <pair source="cpp" header="h" fileNamingConvention="NONE" /> - <pair source="c" header="h" fileNamingConvention="NONE" /> - </extensions> - </Objective-C-extensions> - </code_scheme> -</component> \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 16fa2b3c5d53cf4c6c7bec6efafab8e2c72ad41f..0000000000000000000000000000000000000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="GradleSettings"> - <option name="linkedExternalProjectsSettings"> - <GradleProjectSettings> - <option name="distributionType" value="DEFAULT_WRAPPED" /> - <option name="externalProjectPath" value="$PROJECT_DIR$" /> - <option name="modules"> - <set> - <option value="$PROJECT_DIR$" /> - <option value="$PROJECT_DIR$/common" /> - <option value="$PROJECT_DIR$/mobile" /> - <option value="$PROJECT_DIR$/wear" /> - </set> - </option> - <option name="resolveModulePerSourceSet" value="false" /> - </GradleProjectSettings> - </option> - </component> -</project> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 75dac502959ec4f6e5232282499067f85aa716f5..0000000000000000000000000000000000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="NullableNotNullManager"> - <option name="myDefaultNullable" value="android.support.annotation.Nullable" /> - <option name="myDefaultNotNull" value="android.support.annotation.NonNull" /> - <option name="myNullables"> - <value> - <list size="4"> - <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" /> - <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" /> - <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" /> - <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" /> - </list> - </value> - </option> - <option name="myNotNulls"> - <value> - <list size="4"> - <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" /> - <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" /> - <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" /> - <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" /> - </list> - </value> - </option> - </component> - <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK"> - <output url="file://$PROJECT_DIR$/build/classes" /> - </component> - <component name="ProjectType"> - <option name="id" value="Android" /> - </component> -</project> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index dd960f626537f5b1241cfced3d78b39a9b011bea..0000000000000000000000000000000000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectModuleManager"> - <modules> - <module fileurl="file://$PROJECT_DIR$/SensorSharing.iml" filepath="$PROJECT_DIR$/SensorSharing.iml" /> - <module fileurl="file://$PROJECT_DIR$/common/common.iml" filepath="$PROJECT_DIR$/common/common.iml" /> - <module fileurl="file://$PROJECT_DIR$/mobile/mobile.iml" filepath="$PROJECT_DIR$/mobile/mobile.iml" /> - <module fileurl="file://$PROJECT_DIR$/wear/wear.iml" filepath="$PROJECT_DIR$/wear/wear.iml" /> - </modules> - </component> -</project> \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d8b38ac04e3a3224d7c79ef719b1991a9..0000000000000000000000000000000000000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="RunConfigurationProducerService"> - <option name="ignoredProducers"> - <set> - <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" /> - <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" /> - <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" /> - </set> - </option> - </component> -</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4cb416c083d265558da75d457237d671..0000000000000000000000000000000000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$" vcs="Git" /> - </component> -</project> \ No newline at end of file diff --git a/common/src/main/java/de/tudresden/inf/st/sensorsharing/common/Utils.java b/common/src/main/java/de/tudresden/inf/st/sensorsharing/common/Utils.java new file mode 100644 index 0000000000000000000000000000000000000000..15eb6f623723641a0e90a7e6f7b56b696ff47452 --- /dev/null +++ b/common/src/main/java/de/tudresden/inf/st/sensorsharing/common/Utils.java @@ -0,0 +1,18 @@ +package de.tudresden.inf.st.sensorsharing.common; + +import java.nio.ByteBuffer; +import java.util.Locale; + +public class Utils { + public static String formatArray3(float[] a) { + return String.format(Locale.getDefault(), "%.2f:%.2f:%.2f", a[0], a[1], a[2]); + } + + public static byte[] floatArray2ByteArray(float[] input) { + ByteBuffer buffer = ByteBuffer.allocate(4 * input.length); + for (float value : input) { + buffer.putFloat(value); + } + return buffer.array(); + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/mobile/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java b/mobile/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java index ce87db8f787f80d3c4e99e23f00df481f0ec1ef5..e86a3a3a2a4ab94da74ea9d19be9c79c7848beb8 100644 --- a/mobile/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java +++ b/mobile/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java @@ -34,9 +34,12 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.DateFormat; +import java.util.Arrays; import java.util.Date; import java.util.Locale; +import de.tudresden.inf.st.sensorsharing.common.Utils; + import static de.tudresden.inf.st.sensorsharing.common.Constants.BASE_KEY; import static de.tudresden.inf.st.sensorsharing.common.Constants.BASE_KEY_LENGTH; import static de.tudresden.inf.st.sensorsharing.common.Constants.MQTT_CHARSET; @@ -50,21 +53,31 @@ public class MainActivity extends AppCompatActivity implements MessageClient.OnMessageReceivedListener { private static final String TAG = "SensorSharing"; - private static final String MQTT_TOPIC_SAMSUNG = "sensors/samsung/brightness"; - private static final int MQTT_DEFAULT_QOS = 0; - /** Delay in milliseconds after which the wearable is assumed to be offline */ - public static final int DELAY_WEARABLE_ASSUMED_OFFLINE = 30000; +// private static final String MQTT_TOPIC_SAMSUNG = "sensors/samsung/brightness"; + // sensor management private SensorManager mSensorManager; private Sensor mLight; - private TextView mValueWearBrightness; + private Sensor mRotationVector; + + // mqtt management + private static final int MQTT_DEFAULT_QOS = 0; private MqttAndroidClient mqttAndroidClient; + private MqttTopics wearTopics; + private MqttTopics phoneTopics; private int sensorChangedCounter = 0; - private Date lastMessageFromWearable; + private boolean sendMqttUpdates; + + // wearable management + /** Delay in milliseconds after which the wearable is assumed to be offline */ + public static final int DELAY_WEARABLE_ASSUMED_OFFLINE = 30000; + private Date lastMessageFromWearable = new Date(); private DateFormat dateTimeFormat = DateFormat.getDateTimeInstance( DateFormat.SHORT, android.icu.text.DateFormat.SHORT); - private boolean sendMqttUpdates; - private MqttTopics wearTopics; + + // sensor values of phone + private float[] mRotationVectorValues; + private float mLightValue; @Override protected void onCreate(Bundle savedInstanceState) { @@ -82,7 +95,22 @@ public class MainActivity extends AppCompatActivity implements return; } mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); - mValueWearBrightness = findViewById(R.id.value_wear_brightness); + mRotationVector = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR); + if (mRotationVector == null) { + mRotationVector = mSensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR); + if (mRotationVector == null) { + TextView textView = findViewById(R.id.value_own_rotation); + textView.setText("ERROR"); + Log.e(TAG, "Couldn't find rotation sensor!"); + } else { + Log.w(TAG, "Using alternative rotation sensor!"); + } + } + + + // initialize sensor values + mLightValue = -1; + mRotationVectorValues = new float[3]; updateWearStatus(false); connectMqtt(null); @@ -119,6 +147,8 @@ public class MainActivity extends AppCompatActivity implements subTopic = "polar"; } wearTopics = new MqttTopics(subTopic); + // use fixed topic for phone for now + phoneTopics = new MqttTopics("samsung"); } private void setupSendUpdatesCheckbox() { @@ -178,7 +208,8 @@ public class MainActivity extends AppCompatActivity implements options.setAutomaticReconnect(true); options.setConnectionTimeout(5); try { - IMqttToken token = mqttAndroidClient.connect(options, null, new IMqttActionListener() { + IMqttToken token = mqttAndroidClient.connect(options, + null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.i(TAG, "Successfully connected to " + serverURI); @@ -209,14 +240,24 @@ public class MainActivity extends AppCompatActivity implements @Override public void onSensorChanged(SensorEvent sensorEvent) { - float lightValue = sensorEvent.values[0]; - String stringValue = String.valueOf(lightValue); - TextView textView = findViewById(R.id.value_own_brightness); - textView.setText(stringValue); - if (++sensorChangedCounter >= 5) { - // only send every 5th change + TextView textView; + switch (sensorEvent.sensor.getType()) { + case Sensor.TYPE_LIGHT: + mLightValue = sensorEvent.values[0]; + textView = findViewById(R.id.value_own_brightness); + textView.setText(String.valueOf(mLightValue)); + break; + case Sensor.TYPE_GAME_ROTATION_VECTOR: + case Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR: + mRotationVectorValues = sensorEvent.values; + textView = findViewById(R.id.value_own_rotation); + textView.setText(Utils.formatArray3(mRotationVectorValues)); + break; + } + if (++sensorChangedCounter >= 15) { + // only send every 15th change sensorChangedCounter = 0; - sendUpdateOfSmartphone(stringValue); + sendUpdateOfSmartphone(); } } @@ -229,6 +270,7 @@ public class MainActivity extends AppCompatActivity implements protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_UI); + mSensorManager.registerListener(this, mRotationVector, SensorManager.SENSOR_DELAY_UI); Wearable.getMessageClient(this).addListener(this); } @@ -248,12 +290,13 @@ public class MainActivity extends AppCompatActivity implements final String updatedValue; String topic = null; final TextView textViewToUpdate; + final byte[] bytesToSendViaMqtt = messageEvent.getData(); switch (path.substring(BASE_KEY_LENGTH)) { case SUB_KEY_BRIGHTNESS: float mWearBrightness = ByteBuffer.wrap(messageEvent.getData()).getFloat(); updatedValue = Float.toString(mWearBrightness); - textViewToUpdate = mValueWearBrightness; + textViewToUpdate = findViewById(R.id.value_wear_brightness); topic = wearTopics.mqtt_topic_brightness; break; case SUB_KEY_LINEAR_ACCELERATION: @@ -290,21 +333,22 @@ public class MainActivity extends AppCompatActivity implements } }); if (topic != null) { - sendUpdateOfWearable(topic, updatedValue); + sendUpdateOfWearable(topic, bytesToSendViaMqtt); } } } private String formatByteFloatArray(ByteBuffer buffer) { + return formatFloatArray(buffer.asFloatBuffer().array()); + } + + private String formatFloatArray(float... values) { StringBuilder sb = new StringBuilder(); - final int length = 3; - boolean notFirst = false; - for (int i = 0; i < length; i++) { - if (notFirst) { + for (int i = 0; i < values.length; i++) { + if (i > 0) { sb.append(" : "); } - notFirst = true; - sb.append(String.format(Locale.getDefault(), "%.2f", buffer.getFloat())); + sb.append(String.format(Locale.getDefault(), "%.2f", values[i])); } return sb.toString(); } @@ -315,15 +359,22 @@ public class MainActivity extends AppCompatActivity implements } } - private void sendUpdateOfWearable(String topic, String newValue) { + private void sendUpdateOfWearable(String topic, byte[] newValue) { sendUpdate(topic, newValue); } - private void sendUpdateOfSmartphone(String newValue) { - sendUpdate(MQTT_TOPIC_SAMSUNG, newValue); + private void sendUpdateOfSmartphone() { +// sendUpdate(phoneTopics.mqtt_topic_brightness, ByteBuffer.allocate(4).putFloat(mLightValue).array()); +// sendUpdate(phoneTopics.mqtt_topic_rotation, Utils.floatArray2ByteArray(mRotationVectorValues)); + sendUpdate(phoneTopics.mqtt_topic_brightness, Float.toString(mLightValue)); + sendUpdate(phoneTopics.mqtt_topic_rotation, Arrays.toString(mRotationVectorValues)); } private void sendUpdate(String topic, String newValue) { + sendUpdate(topic, newValue.getBytes(MQTT_CHARSET)); + } + + private void sendUpdate(String topic, byte[] bytes) { if (!sendMqttUpdates) { return; } @@ -337,8 +388,7 @@ public class MainActivity extends AppCompatActivity implements } // send to MQTT try { - mqttAndroidClient.publish(topic, newValue.getBytes(MQTT_CHARSET), - MQTT_DEFAULT_QOS, false); + mqttAndroidClient.publish(topic, bytes, MQTT_DEFAULT_QOS, false); } catch (MqttException e) { Log.d(TAG, "mqtt message publish failed", e); } diff --git a/mobile/src/main/res/layout/activity_main.xml b/mobile/src/main/res/layout/activity_main.xml index 9ad48d1b09c0aa4a381b51066108d598ab3831ef..88f33421aeaa096114b35f195f134b756531dc88 100644 --- a/mobile/src/main/res/layout/activity_main.xml +++ b/mobile/src/main/res/layout/activity_main.xml @@ -6,6 +6,26 @@ android:layout_height="match_parent" tools:context="de.tudresden.inf.st.sensorsharing.MainActivity"> + <TextView + android:id="@+id/label_own_rotation" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:text="@string/text_rotation" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/label_own_brightness" /> + + <TextView + android:id="@+id/value_own_rotation" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:text="@android:string/unknownName" + app:layout_constraintStart_toEndOf="@+id/label_own_rotation" + app:layout_constraintTop_toBottomOf="@+id/value_own_brightness" /> + <TextView android:id="@+id/label_wear_name" android:layout_width="wrap_content" @@ -65,8 +85,8 @@ android:id="@+id/separator_wear" style="?android:attr/listSeparatorTextViewStyle" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" + android:layout_height="21dp" + android:layout_marginTop="32dp" android:background="@android:color/darker_gray" android:text="@string/text_separator_wear_values" app:layout_constraintEnd_toEndOf="parent" @@ -104,7 +124,7 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" - android:text="@string/text_own_brightness" + android:text="@string/text_brightness" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/label_own_name" /> @@ -115,7 +135,7 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" - android:text="@string/text_wear_brightness" + android:text="@string/text_brightness" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/label_wear_name" /> @@ -125,7 +145,7 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" - android:text="@string/text_wear_acceleration" + android:text="@string/text_acceleration" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/label_wear_brightness" /> @@ -135,7 +155,7 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" - android:text="@string/text_wear_rotation" + android:text="@string/text_rotation" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/label_wear_acceleration" /> diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml index d3d2f34651087cdd3e42ace93a30c294fbf8717c..6ff84060ddd491329b1e7aae92e60e4d90527622 100644 --- a/mobile/src/main/res/values/strings.xml +++ b/mobile/src/main/res/values/strings.xml @@ -1,10 +1,9 @@ <resources> <string name="app_name">SensorSharing</string> <string name="text_name">Name</string> - <string name="text_own_brightness">Own Brightness</string> - <string name="text_wear_brightness">Wear Brightness</string> - <string name="text_wear_acceleration">Wear Acceleration</string> - <string name="text_wear_rotation">Wear Rotation</string> + <string name="text_brightness">Brightness</string> + <string name="text_acceleration">Acceleration</string> + <string name="text_rotation">Rotation</string> <string name="text_connected">Connected</string> <string name="text_mqtt_server_uri">MQTT Server URI</string> <string name="default_mqtt_server_uri">tcp://10.8.0.119</string> diff --git a/wear/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java b/wear/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java index 005e9cccf2cf2fb994ab516e298213e371a98ab4..53b1d2a2f7c3054f258f6540d36ef2c05171b2c1 100644 --- a/wear/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java +++ b/wear/src/main/java/de/tudresden/inf/st/sensorsharing/MainActivity.java @@ -19,9 +19,9 @@ import com.google.android.gms.wearable.Node; import com.google.android.gms.wearable.Wearable; import java.nio.ByteBuffer; -import java.util.Arrays; import java.util.List; -import java.util.Locale; + +import de.tudresden.inf.st.sensorsharing.common.Utils; import static de.tudresden.inf.st.sensorsharing.common.Constants.KEY_BRIGHTNESS; import static de.tudresden.inf.st.sensorsharing.common.Constants.KEY_LINEAR_ACCELERATION; @@ -111,21 +111,17 @@ public class MainActivity extends WearableActivity implements SensorEventListene case Sensor.TYPE_ACCELEROMETER: mLinearAccelerationValues = sensorEvent.values; textView = findViewById(R.id.acceleration_value); - textView.setText(formatArray3(mLinearAccelerationValues)); + textView.setText(Utils.formatArray3(mLinearAccelerationValues)); break; case Sensor.TYPE_GAME_ROTATION_VECTOR: case Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR: mRotationVectorValues = sensorEvent.values; textView = findViewById(R.id.rotation_value); - textView.setText(formatArray3(mRotationVectorValues)); + textView.setText(Utils.formatArray3(mRotationVectorValues)); break; } } - private String formatArray3(float[] a) { - return String.format(Locale.getDefault(), "%.2f:%.2f:%.2f", a[0], a[1], a[2]); - } - private void sendCurrentValueToAllConnectedNodes() { Task<List<Node>> nodesTask = Wearable.getNodeClient(this).getConnectedNodes(); final MessageClient messageClient = Wearable.getMessageClient(this); @@ -133,8 +129,8 @@ public class MainActivity extends WearableActivity implements SensorEventListene @Override public void onSuccess(List<Node> nodes) { final byte[] brightnessData = ByteBuffer.allocate(4).putFloat(mLightValue).array(); - final byte[] accelerationData = floatArray2ByteArray(mLinearAccelerationValues); - final byte[] rotationData = floatArray2ByteArray(mRotationVectorValues); + final byte[] accelerationData = Utils.floatArray2ByteArray(mLinearAccelerationValues); + final byte[] rotationData = Utils.floatArray2ByteArray(mRotationVectorValues); for (Node node : nodes) { if (sendName) { final byte[] nameData = Build.MODEL.getBytes(MQTT_CHARSET); @@ -149,14 +145,6 @@ public class MainActivity extends WearableActivity implements SensorEventListene }); } - private byte[] floatArray2ByteArray(float[] input) { - ByteBuffer buffer = ByteBuffer.allocate(4 * input.length); - for (float value : input) { - buffer.putFloat(value); - } - return buffer.array(); - } - @Override public void onAccuracyChanged(Sensor sensor, int i) { // ignore accuracy changes