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 7536b1ae60fd276413ee53d04e7f7e805f43e6e0..0e8a96152c1fadfc6ebbbe2c1e8514fc6f8719d7 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 @@ -6,6 +6,7 @@ import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.util.Log; @@ -20,7 +21,6 @@ import com.google.android.gms.wearable.MessageEvent; import com.google.android.gms.wearable.Wearable; import org.eclipse.paho.android.service.MqttAndroidClient; -import org.eclipse.paho.android.service.MqttService; import org.eclipse.paho.client.mqttv3.IMqttActionListener; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.IMqttToken; @@ -31,7 +31,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import java.nio.ByteBuffer; import java.nio.charset.Charset; -import java.util.Arrays; +import java.text.DateFormat; +import java.util.Date; +import java.util.Locale; import static de.tudresden.inf.st.sensorsharing.common.Constants.BASE_KEY; import static de.tudresden.inf.st.sensorsharing.common.Constants.BASE_KEY_LENGTH; @@ -51,12 +53,17 @@ public class MainActivity extends AppCompatActivity implements private static final String MQTT_TOPIC_SAMSUNG = "sensors/samsung/brightness"; private static final int MQTT_DEFAULT_QOS = 0; private static final Charset MQTT_CHARSET = Charset.forName("UTF-8"); + /** Delay in milliseconds after which the wearable is assumed to be offline */ + public static final int DELAY_WEARABLE_ASSUMED_OFFLINE = 30000; private SensorManager mSensorManager; private Sensor mLight; private TextView mValueWearBrightness; private MqttAndroidClient mqttAndroidClient; - private int counter = 0; + private int sensorChangedCounter = 0; + private long lastMessageFromWearable; + private DateFormat dateTimeFormat = DateFormat.getDateTimeInstance( + DateFormat.SHORT, android.icu.text.DateFormat.SHORT); @Override protected void onCreate(Bundle savedInstanceState) { @@ -76,6 +83,20 @@ public class MainActivity extends AppCompatActivity implements setChecked(false); connectMqtt(null); + + final Handler handler = new Handler(); + Runnable runnable = new Runnable() { + @Override + public void run() { + long now = System.currentTimeMillis(); + if (now - lastMessageFromWearable > DELAY_WEARABLE_ASSUMED_OFFLINE) { + setChecked(false); + } + // repeat after 30 seconds + handler.postDelayed(this, DELAY_WEARABLE_ASSUMED_OFFLINE); + } + }; + handler.post(runnable); } public void connectMqtt(View view) { @@ -148,9 +169,9 @@ public class MainActivity extends AppCompatActivity implements String stringValue = String.valueOf(lightValue); TextView textView = findViewById(R.id.value_own_brightness); textView.setText(stringValue); - if (++counter >= 5) { + if (++sensorChangedCounter >= 5) { // only send every 5th change - counter = 0; + sensorChangedCounter = 0; sendUpdateOfSmartphone(stringValue); } } @@ -175,10 +196,12 @@ public class MainActivity extends AppCompatActivity implements } @Override - public void onMessageReceived(@NonNull MessageEvent messageEvent) { + public void onMessageReceived(@NonNull final MessageEvent messageEvent) { String path = messageEvent.getPath(); if (path == null) return; if (path.startsWith(BASE_KEY)) { + final Date contactTime = new Date(); + lastMessageFromWearable = contactTime.getTime(); final String updatedValue; String topic; final TextView textViewToUpdate; @@ -213,6 +236,8 @@ public class MainActivity extends AppCompatActivity implements @Override public void run() { setChecked(true); + TextView lastContact = findViewById(R.id.value_last_contact); + lastContact.setText(dateTimeFormat.format(contactTime)); textViewToUpdate.setText(updatedValue); } diff --git a/mobile/src/main/res/layout/activity_main.xml b/mobile/src/main/res/layout/activity_main.xml index 5a1653cb16917c87d0540c8c74d5ee4b9e3ea90b..a3c2f712c9a9ab7d6bc6326e8722754eb7478d0a 100644 --- a/mobile/src/main/res/layout/activity_main.xml +++ b/mobile/src/main/res/layout/activity_main.xml @@ -50,7 +50,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" - android:layout_marginTop="8dp" + android:layout_marginTop="24dp" android:text="@string/text_mqtt_server_uri" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -175,4 +175,14 @@ app:layout_constraintStart_toEndOf="@+id/value_server_uri" app:layout_constraintTop_toBottomOf="@+id/separator_mqtt" /> + <TextView + android:id="@+id/value_last_contact" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="16dp" + android:text="@android:string/unknownName" + app:layout_constraintStart_toEndOf="@+id/checkBox" + app:layout_constraintTop_toBottomOf="@+id/separator_wear" /> + </android.support.constraint.ConstraintLayout>