From ffb90c001d5ae18943b7bb424b915b3ffe79dfab Mon Sep 17 00:00:00 2001 From: Sam Hos Date: Mon, 3 Jun 2024 16:17:27 +0200 Subject: [PATCH 1/9] Refactoring --- code/arduino/Movement-sensor-code/Connectivity.cpp | 3 ++- .../Movement-sensor-code/Movement-sensor-code.ino | 2 +- code/arduino/Movement-sensor-code/SensorManager.cpp | 10 +++++----- code/arduino/Movement-sensor-code/SensorManager.h | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/code/arduino/Movement-sensor-code/Connectivity.cpp b/code/arduino/Movement-sensor-code/Connectivity.cpp index 1f7252d..651e40c 100644 --- a/code/arduino/Movement-sensor-code/Connectivity.cpp +++ b/code/arduino/Movement-sensor-code/Connectivity.cpp @@ -24,6 +24,7 @@ const char* getServerURL = "http://145.92.8.132:443/get-ip"; String ipAddress = ""; // string that will hold the server's IP address const char* Connectivity::fetchIPAddress() { + char* ipAddress = NULL; // Declare ipAddress as a char* if (WiFi.status() == WL_CONNECTED) { HTTPClient http; WiFiClient client; @@ -33,7 +34,7 @@ const char* Connectivity::fetchIPAddress() { if (httpCode > 0) { if (httpCode == HTTP_CODE_OK) { // If successful (code 200), read the response body and store the IP address - ipAddress = http.getString(); + ipAddress = strdup(http.getString().c_str()); } } else { Serial.printf("GET request failed, error: %s\n", http.errorToString(httpCode).c_str()); diff --git a/code/arduino/Movement-sensor-code/Movement-sensor-code.ino b/code/arduino/Movement-sensor-code/Movement-sensor-code.ino index 6540384..fbb0a11 100644 --- a/code/arduino/Movement-sensor-code/Movement-sensor-code.ino +++ b/code/arduino/Movement-sensor-code/Movement-sensor-code.ino @@ -37,7 +37,7 @@ struct acceleration { accelData.z, "data"); // %d = int, %f = floatation, %s = string - connectivity.httpPost(serverIp, "/", 3445, buffer, strlen(buffer), "application/json"); + connectivity.httpPost("192.168.137.30", "/", 3445, buffer, strlen(buffer), "application/json"); lastTime = currentTime; } } diff --git a/code/arduino/Movement-sensor-code/SensorManager.cpp b/code/arduino/Movement-sensor-code/SensorManager.cpp index 7fee39d..ab2216f 100644 --- a/code/arduino/Movement-sensor-code/SensorManager.cpp +++ b/code/arduino/Movement-sensor-code/SensorManager.cpp @@ -17,14 +17,14 @@ void SensorManager::sensorSetup() { // myIMU.enableStepCounter(500); //Send data update every 500ms } //get sensordata -SensorManager::RotationQuintillions SensorManager::getQuintillions() { +SensorManager::RotationQuaternions SensorManager::getQuaternions() { if (myIMU.dataAvailable() == true) { float i = myIMU.getQuatI(); float j = myIMU.getQuatJ(); float k = myIMU.getQuatK(); float w = myIMU.getQuatReal(); - RotationQuintillions rotation = { i, j, k, w }; + RotationQuaternions rotation = { i, j, k, w }; return rotation; } else { float i = myIMU.getQuatI(); @@ -32,13 +32,13 @@ SensorManager::RotationQuintillions SensorManager::getQuintillions() { float k = myIMU.getQuatK(); float w = myIMU.getQuatReal(); - RotationQuintillions rotation = { i, j, k, w }; + RotationQuaternions rotation = { i, j, k, w }; return rotation; } } -//calculate Quintillions to Euler angles from -1π to +1π +//calculate Quaternions to Euler angles from -1π to +1π SensorManager::eulerAngles SensorManager::getEulerAngles() { - SensorManager::RotationQuintillions rotation = getQuintillions(); + SensorManager::RotationQuaternions rotation = getQuaternions(); float roll = atan2(2.0f * (rotation.w * rotation.i + rotation.j * rotation.k), 1.0f - 2.0f * (rotation.i * rotation.i + rotation.j * rotation.j)); float pitch = asin(2.0f * (rotation.w * rotation.j - rotation.k * rotation.i)); float yaw = atan2(2.0f * (rotation.w * rotation.k + rotation.i * rotation.j), 1.0f - 2.0f * (rotation.j * rotation.j + rotation.k * rotation.k)); diff --git a/code/arduino/Movement-sensor-code/SensorManager.h b/code/arduino/Movement-sensor-code/SensorManager.h index aaf4d71..a7652e7 100644 --- a/code/arduino/Movement-sensor-code/SensorManager.h +++ b/code/arduino/Movement-sensor-code/SensorManager.h @@ -23,13 +23,13 @@ public: acceleration getAcelleration(); bool sensorTap(); private: - struct RotationQuintillions { + struct RotationQuaternions { float i; float j; float k; float w; }; - RotationQuintillions getQuintillions(); + RotationQuaternions getQuaternions(); BNO080 myIMU; }; From 46ba5dbdbd71d042c7e4eff7342ac8f139c8fc94 Mon Sep 17 00:00:00 2001 From: SebasKoedam Date: Mon, 3 Jun 2024 16:25:35 +0200 Subject: [PATCH 2/9] video will now be displayed with link from database --- .../fitbot/ui/activities/FitnessActivity.java | 13 +++++-------- .../app/src/main/res/layout/activity_fitness.xml | 5 ++++- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java index fb84abd..faa10b9 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java @@ -40,6 +40,8 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall private TextView exerciseShortDescriptionTextView; private TextView exerciseDescriptionTextView; + private static String exerciseVideoUrl; + // Some nice little messages for the user private static final String[] EXERCISE_NOT_FOUND_MESSAGES = new String[]{ "Ik heb momenteel helaas wat moeite met het ophalen van oefeningen, sorry.", @@ -69,6 +71,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall this.exerciseDescriptionTextView = findViewById(R.id.textViewDialogDescription); this.exerciseShortDescriptionTextView = findViewById(R.id.textViewFitnessShortDescription); + // Find the VideoView by its ID VideoView videoView = findViewById(R.id.videoView); playVideo(videoView, this); @@ -139,6 +142,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall exerciseNameTextView.setText(exercise.name); exerciseShortDescriptionTextView.setText(exercise.shortDescription); exerciseDescriptionTextView.setText(exercise.description); + exerciseVideoUrl = exercise.videoUrl; onSuccessfulFetch.handle(exercise); } })).start(); @@ -153,14 +157,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall public static void playVideo(VideoView videoView, Context context) { // Set up the video player if (videoView != null) { - Uri videoUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.bicepvideo); - videoView.setVideoURI(videoUri); - - videoView.setOnCompletionListener(mp -> { - // Repeat the video when it finishes playing - videoView.start(); - }); - + videoView.setVideoPath(exerciseVideoUrl); videoView.start(); } else { Log.e("FitnessActivity", "VideoView is null. Check your layout XML."); diff --git a/code/src/Fitbot/app/src/main/res/layout/activity_fitness.xml b/code/src/Fitbot/app/src/main/res/layout/activity_fitness.xml index 1eb25a3..ea324d5 100644 --- a/code/src/Fitbot/app/src/main/res/layout/activity_fitness.xml +++ b/code/src/Fitbot/app/src/main/res/layout/activity_fitness.xml @@ -47,7 +47,10 @@ android:layout_width="300dp" android:layout_height="300dp" android:layout_centerInParent="true" - android:layout_margin="50dp" /> + android:layout_marginStart="50dp" + android:layout_marginTop="50dp" + android:layout_marginEnd="50dp" + android:layout_marginBottom="50dp" /> From d0d09aa2d22a9ef1ea61b5d59f587141b8da43ba Mon Sep 17 00:00:00 2001 From: SebasKoedam Date: Mon, 3 Jun 2024 16:28:56 +0200 Subject: [PATCH 3/9] Refactor FitnessActivity code to remove commented out video playback function --- .../fitbot/ui/activities/FitnessActivity.java | 2 +- .../res/raw/bubble-pop-ding-betacut-1-00-01.mp3 | Bin 69989 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 code/src/Fitbot/app/src/main/res/raw/bubble-pop-ding-betacut-1-00-01.mp3 diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java index faa10b9..28c28c5 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java @@ -74,7 +74,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall // Find the VideoView by its ID VideoView videoView = findViewById(R.id.videoView); - playVideo(videoView, this); +// playVideo(videoView, this); NavigationManager.setupButtonNavigation(this, R.id.homeButtonFitness, MainActivity.class); NavigationManager.setupButtonNavigation(this, R.id.skipButtonFitness, MainActivity.class); //Needs to skip exercises once those are implemented diff --git a/code/src/Fitbot/app/src/main/res/raw/bubble-pop-ding-betacut-1-00-01.mp3 b/code/src/Fitbot/app/src/main/res/raw/bubble-pop-ding-betacut-1-00-01.mp3 deleted file mode 100644 index 9fe5526068e4a11dec88a9ab6e5909cc3ea57f70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69989 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 Date: Tue, 4 Jun 2024 00:03:34 +0200 Subject: [PATCH 4/9] added dataprotocol research --- docs/documentation/brainstorm/Dataprotocols.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/documentation/brainstorm/Dataprotocols.md diff --git a/docs/documentation/brainstorm/Dataprotocols.md b/docs/documentation/brainstorm/Dataprotocols.md new file mode 100644 index 0000000..e69de29 From 3cfea7fc6fb12e8ebb6eb6a29983597dc1390de0 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 4 Jun 2024 00:03:55 +0200 Subject: [PATCH 5/9] added the research? --- .../documentation/brainstorm/Dataprotocols.md | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/documentation/brainstorm/Dataprotocols.md b/docs/documentation/brainstorm/Dataprotocols.md index e69de29..3ca3af3 100644 --- a/docs/documentation/brainstorm/Dataprotocols.md +++ b/docs/documentation/brainstorm/Dataprotocols.md @@ -0,0 +1,36 @@ +# Dataprotocols + + + +# different types + +### Hypertext Transfer Protocol (HTTP) +HTTP is the foundation of web communication, permitting the transport of data across the internet using a request-response architecture. It uses TCP/IP and stands out by its statelessness, with each request being independent, increasing the web's scalability and flexibility. While it does not encrypt data which makes it usable with sensible data it still makes an nice easy to use option. + +We decided to use this for our project because for communicating with the database it is easy to use and we are not usiong sensible data. If we were to use sensible data that we want to encrypt we can use HTTPS. We are only sending small amounts of data to our app and we are not transfering files to our app. This made HTTP it way more attractive option. + +### File Transfer Protocol (FTP) +FTP is the classic protocol for transferring files between computers. It establishes a connection between two computers and it has 2 modes. Passive mode for recieving files. This leaves a port open on the computer. You also have an active mode. This is were the client opens a port towards an other computer. If you want to encrypt your data you can use FTPS. + +When we started the project is thought of this as a option however since we are not only transfering videos but also stuff like titles and dicriptions i thought we were not going to enable it to its fullest potattional. On top of that we are also transfering only small amounts of videos and we switched the way we used videos on our project by hosting the videos on a service like youtube. This made FTP not usefull for our project. + +### User Datagram Protocol (UDP) +UDP is s connectionless protocol that prioritizes speed over reliability. It sends datagrams to a computer without establishing a connection with the reciever. It is not stable so you need to keep in mind that it will not be 100% accurate. However it is really fast so this makes it a suitible option for applications where a tiny amount of dataloss is not an issue. + +(to be added) + +### Message Queue Telemetry Transport (MQTT) +MQTT is s lightweight messaging protocol designed for machine-to-machine communication in Internet of Things applications. It uses a publish subscribe model. This is were one device publishes data on a server and the other devices need to subscribe to that publisher to recieve the data. It is commonly used to transmot sensor data to a server. + +(to be added) + +### Real-time Streaming Protocols (RTSP) +RTSP is collection of protocols used for streaming media such as videos over networks. However it requires additional software for it to work properly. RTSP shines in controlling live streams allowing features like pause. It's often used in IPTV's and video conferencing applications. + + +Due to its limited support we are not uising it in our project. We were already having issues with other things that are not supported on android or mobile apps and we did not want to risk getting more issues while working on our project since we were already using up our limited time. It is a very interesting option though since it will enable more advanced videos. It also is realy complex which makes it a less atractive option since we are already learning a lot of new things and if we were to want to learn more things we would rather learn something with a low learning curve. + + +# Conclusion + +We decide to just go for the simple solution wich is google drive how ever if we want to expend or had more time we could have used. \ No newline at end of file From 2118680b27e8ec0b3311085a39ed300a84a43061 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 4 Jun 2024 00:04:58 +0200 Subject: [PATCH 6/9] removed wrong conclusion --- docs/documentation/brainstorm/Dataprotocols.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/documentation/brainstorm/Dataprotocols.md b/docs/documentation/brainstorm/Dataprotocols.md index 3ca3af3..c82c3c8 100644 --- a/docs/documentation/brainstorm/Dataprotocols.md +++ b/docs/documentation/brainstorm/Dataprotocols.md @@ -31,6 +31,4 @@ RTSP is collection of protocols used for streaming media such as videos over ne Due to its limited support we are not uising it in our project. We were already having issues with other things that are not supported on android or mobile apps and we did not want to risk getting more issues while working on our project since we were already using up our limited time. It is a very interesting option though since it will enable more advanced videos. It also is realy complex which makes it a less atractive option since we are already learning a lot of new things and if we were to want to learn more things we would rather learn something with a low learning curve. -# Conclusion - -We decide to just go for the simple solution wich is google drive how ever if we want to expend or had more time we could have used. \ No newline at end of file +# Conclusion \ No newline at end of file From 3b65fffec8bd4adc16dd9badc084189b13b3b07c Mon Sep 17 00:00:00 2001 From: Sam Hos Date: Tue, 4 Jun 2024 10:31:24 +0200 Subject: [PATCH 7/9] motion processing stuff + logs + fix crash (luca) --- .../fitbot/ui/activities/FitnessActivity.java | 22 +++++++++++-------- .../example/fitbot/util/path/GesturePath.java | 6 ++++- .../util/processing/InputProcessor.java | 17 +++++++------- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java index fb84abd..9339f71 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java @@ -40,6 +40,8 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall private TextView exerciseShortDescriptionTextView; private TextView exerciseDescriptionTextView; + private final Object lock = new Object(); + // Some nice little messages for the user private static final String[] EXERCISE_NOT_FOUND_MESSAGES = new String[]{ "Ik heb momenteel helaas wat moeite met het ophalen van oefeningen, sorry.", @@ -58,16 +60,14 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); QiSDK.register(this, this); - setContentView(R.layout.activity_fitness); - // Remove the ugly ass bar on top of the view - setSpeechBarDisplayStrategy(SpeechBarDisplayStrategy.IMMERSIVE); - // Fill empty objects with exercise data this.exerciseNameTextView = findViewById(R.id.textViewFitnessTitle); - this.exerciseDescriptionTextView = findViewById(R.id.textViewDialogDescription); + //this.exerciseDescriptionTextView = findViewById(R.id.textViewDialogDescription); this.exerciseShortDescriptionTextView = findViewById(R.id.textViewFitnessShortDescription); + // Remove the ugly ass bar on top of the view + setSpeechBarDisplayStrategy(SpeechBarDisplayStrategy.IMMERSIVE); // Find the VideoView by its ID VideoView videoView = findViewById(R.id.videoView); @@ -84,6 +84,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall @Override public void onClick(View v) { showInfoDialog(); + } }); } @@ -109,8 +110,8 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall exerciseStatusElement.initialize(exercise, motionProcessor, EXERCISE_COUNT); motionProcessor.useExercise(exercise); /* TODO: Remove if not needed */motionProcessor.setRecording(true, 10); - motionProcessor.startListening(); motionProcessor.setInputHandler(exerciseStatusElement); + motionProcessor.startListening(); }, (n) -> { int randomMessageIndex = (int) Math.floor(Math.random() * EXERCISE_NOT_FOUND_MESSAGES.length); @@ -136,14 +137,17 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall if (exercise == null) { onFailedFetch.handle(null); } else { - exerciseNameTextView.setText(exercise.name); - exerciseShortDescriptionTextView.setText(exercise.shortDescription); - exerciseDescriptionTextView.setText(exercise.description); onSuccessfulFetch.handle(exercise); + this.runOnUiThread(() -> { + exerciseNameTextView.setText(exercise.name); + exerciseShortDescriptionTextView.setText(exercise.shortDescription); + // exerciseDescriptionTextView.setText(exercise.description); + }); } })).start(); } + /** * Function for playing a video in a VideoView * diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/path/GesturePath.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/path/GesturePath.java index 9f9decd..f3b8cb3 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/path/GesturePath.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/path/GesturePath.java @@ -14,7 +14,11 @@ public class GesturePath { */ public GesturePath(Vector3f[] vectors) { if (vectors.length < 2) { - this.segments = new PathSegment[0]; + this.segments = new PathSegment[1]; + this.segments[0] = new PathSegment( + new Vector3f(0, 0, 0), + new Vector3f(0, 0, 0) + ); return; } diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/InputProcessor.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/InputProcessor.java index a39dad6..e95008a 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/InputProcessor.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/InputProcessor.java @@ -160,6 +160,8 @@ public class InputProcessor { try { + Log.i("MotionProcessor", "Time passed: " + this.secondsPassed + "s"); + Log.i("MotionProcessor", "Recording: " + this.recordingMovement + ", " + this.secondsPassed + " / " + this.recordingDurationInSeconds); Log.i("MotionProcessor", "Received packet data: " + data); JsonElement json = JsonParser.parseString(data); @@ -198,18 +200,12 @@ public class InputProcessor { // Re-calculate time for index calculation secondsPassed = (System.currentTimeMillis() - lastTime) / 1000.0d; - lastTime = System.currentTimeMillis(); + // Supposed index of the current rotation vector in the `rotationVectorPaths` array int selfIndex = (int) (secondsPassed * sampleRate); - motionDataConsumer.accept(rotation, deviceId); - if (selfIndex >= selfRotationVectorPaths[deviceId].length || selfIndex < 0) - return; - - selfRotationVectorPaths[deviceId][selfIndex] = rotation; - - if ( this.recordingMovement && this.hasFinished()) { + if ( this.recordingMovement && this.secondsPassed >= this.recordingDurationInSeconds) { // Do something with the recorded data. this.recordingMovement = false; // Convert recorded data from `selfRotationVectorPaths` to string, and @@ -221,6 +217,11 @@ public class InputProcessor { Log.i("MotionProcessor", "Converted data: "); Log.i("MotionProcessor", converted); } + motionDataConsumer.accept(rotation, deviceId); + if (selfIndex >= selfRotationVectorPaths[deviceId].length || selfIndex < 0) + return; + + selfRotationVectorPaths[deviceId][selfIndex] = rotation; } } From 0c98744bdd2657e19f3eb5c6b1a24ab1c738d0eb Mon Sep 17 00:00:00 2001 From: Sam Hos Date: Tue, 4 Jun 2024 11:25:49 +0200 Subject: [PATCH 8/9] fix crashes and video player, changed loading elements to UI thread --- .../fitbot/ui/activities/FitnessActivity.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java index 47b8b76..3daf12c 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java @@ -72,8 +72,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall setSpeechBarDisplayStrategy(SpeechBarDisplayStrategy.IMMERSIVE); // Find the VideoView by its ID - VideoView videoView = findViewById(R.id.videoView); -// playVideo(videoView, this); + NavigationManager.setupButtonNavigation(this, R.id.homeButtonFitness, MainActivity.class); NavigationManager.setupButtonNavigation(this, R.id.skipButtonFitness, MainActivity.class); //Needs to skip exercises once those are implemented @@ -139,15 +138,18 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall if (exercise == null) { onFailedFetch.handle(null); } else { - exerciseNameTextView.setText(exercise.name); - exerciseShortDescriptionTextView.setText(exercise.shortDescription); - exerciseDescriptionTextView.setText(exercise.description); - exerciseVideoUrl = exercise.videoUrl; onSuccessfulFetch.handle(exercise); this.runOnUiThread(() -> { exerciseNameTextView.setText(exercise.name); exerciseShortDescriptionTextView.setText(exercise.shortDescription); + exerciseNameTextView.setText(exercise.name); + exerciseShortDescriptionTextView.setText(exercise.shortDescription); +// exerciseDescriptionTextView.setText(exercise.description); + exerciseVideoUrl = exercise.videoUrl; // exerciseDescriptionTextView.setText(exercise.description); + VideoView videoView = findViewById(R.id.videoView); + Log.e("exerciseVideoUrl", "videourl:" + exerciseVideoUrl); + playVideo(videoView, this); }); } })).start(); From 398389aa5e5785bdc23ace71c9d2622ddc2851bf Mon Sep 17 00:00:00 2001 From: SebasKoedam Date: Tue, 4 Jun 2024 11:32:05 +0200 Subject: [PATCH 9/9] added comments and optimized code --- .../fitbot/ui/activities/FitnessActivity.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java index 3daf12c..975a8b3 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java @@ -39,11 +39,10 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall private TextView exerciseNameTextView; private TextView exerciseShortDescriptionTextView; private TextView exerciseDescriptionTextView; + private static String exerciseVideoUrl; private final Object lock = new Object(); - private static String exerciseVideoUrl; - // Some nice little messages for the user private static final String[] EXERCISE_NOT_FOUND_MESSAGES = new String[]{ "Ik heb momenteel helaas wat moeite met het ophalen van oefeningen, sorry.", @@ -68,16 +67,14 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall this.exerciseNameTextView = findViewById(R.id.textViewFitnessTitle); //this.exerciseDescriptionTextView = findViewById(R.id.textViewDialogDescription); this.exerciseShortDescriptionTextView = findViewById(R.id.textViewFitnessShortDescription); - // Remove the ugly ass bar on top of the view - setSpeechBarDisplayStrategy(SpeechBarDisplayStrategy.IMMERSIVE); - - // Find the VideoView by its ID + // Navigation Buttons NavigationManager.setupButtonNavigation(this, R.id.homeButtonFitness, MainActivity.class); NavigationManager.setupButtonNavigation(this, R.id.skipButtonFitness, MainActivity.class); //Needs to skip exercises once those are implemented // Hide system UI NavigationManager.hideSystemUI(this); + setSpeechBarDisplayStrategy(SpeechBarDisplayStrategy.IMMERSIVE); // Initiate info button Button infoButtonFitness = findViewById(R.id.infoButtonFitness); @@ -85,7 +82,6 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall @Override public void onClick(View v) { showInfoDialog(); - } }); } @@ -121,8 +117,9 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall NavigationManager.navigateToActivity(this, EndScreenActivity.class); }); }); - - // FitnessCycle.playVideo(qiContext, videoView, this); + VideoView videoView = findViewById(R.id.videoView); + Log.e("exerciseVideoUrl", "videoUrl:" + exerciseVideoUrl); + playVideo(videoView, this); } /** @@ -142,20 +139,13 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall this.runOnUiThread(() -> { exerciseNameTextView.setText(exercise.name); exerciseShortDescriptionTextView.setText(exercise.shortDescription); - exerciseNameTextView.setText(exercise.name); - exerciseShortDescriptionTextView.setText(exercise.shortDescription); -// exerciseDescriptionTextView.setText(exercise.description); + // exerciseDescriptionTextView.setText(exercise.description); exerciseVideoUrl = exercise.videoUrl; - // exerciseDescriptionTextView.setText(exercise.description); - VideoView videoView = findViewById(R.id.videoView); - Log.e("exerciseVideoUrl", "videourl:" + exerciseVideoUrl); - playVideo(videoView, this); }); } })).start(); } - /** * Function for playing a video in a VideoView *