From ea1a608d3bd5ea5d35e6db888ccd62880840bcad Mon Sep 17 00:00:00 2001 From: tfiedlerdev Date: Fri, 22 Apr 2022 08:42:17 +0200 Subject: [PATCH 01/46] Add screen and tab for on device training --- app/build.gradle | 10 ++++++---- .../java/sensors_in_paradise/sonar/MainActivity.kt | 5 +++++ .../java/sensors_in_paradise/sonar/PageInterface.kt | 4 ++-- .../sensors_in_paradise/sonar/page4/Page4Handler.kt | 10 ++++++++++ .../res/drawable/ic_baseline_model_training_24.xml | 10 ++++++++++ app/src/main/res/layout/activity_main.xml | 10 +++++++++- app/src/main/res/layout/training_fragment.xml | 6 ++++++ build.gradle | 4 ++-- 8 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/sensors_in_paradise/sonar/page4/Page4Handler.kt create mode 100644 app/src/main/res/drawable/ic_baseline_model_training_24.xml create mode 100644 app/src/main/res/layout/training_fragment.xml diff --git a/app/build.gradle b/app/build.gradle index cbee1a38..ad098ad7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -74,8 +74,8 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'com.google.android.material:material:1.5.0' - implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1' - implementation 'androidx.navigation:navigation-ui-ktx:2.4.1' + implementation 'androidx.navigation:navigation-fragment-ktx:2.4.2' + implementation 'androidx.navigation:navigation-ui-ktx:2.4.2' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.preference:preference-ktx:1.2.0' implementation 'androidx.preference:preference-ktx:1.2.0' @@ -90,7 +90,7 @@ dependencies { implementation project(path: ':Xsens_DOT_Core') implementation "androidx.core:core-ktx:1.7.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.10") + implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.20") implementation("com.android.volley:volley:1.2.1") testImplementation("junit:junit:4.13.2") testImplementation('androidx.test:core:1.4.0') @@ -100,10 +100,12 @@ dependencies { implementation("androidx.cardview:cardview:1.0.0") implementation 'com.google.android.material:material:1.5.0' - def camerax_version = "1.1.0-beta02" + def camerax_version = "1.1.0-beta03" implementation("androidx.camera:camera-camera2:${camerax_version}") implementation("androidx.camera:camera-video:${camerax_version}") implementation("androidx.camera:camera-view:${camerax_version}") + + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' } repositories { mavenCentral() diff --git a/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt b/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt index 1e6f31c4..85152190 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt @@ -18,6 +18,7 @@ import sensors_in_paradise.sonar.page1.Page1Handler import sensors_in_paradise.sonar.page2.Page2Handler import sensors_in_paradise.sonar.page2.RecordingDataManager import sensors_in_paradise.sonar.page3.Page3Handler +import sensors_in_paradise.sonar.page4.Page4Handler import sensors_in_paradise.sonar.uploader.RecordingsUploaderDialog import sensors_in_paradise.sonar.uploader.DavCloudRecordingsUploader import sensors_in_paradise.sonar.util.PreferencesHelper @@ -61,9 +62,13 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne pageHandlers.add(page2Handler) val page3Handler = Page3Handler(scannedDevices, this) pageHandlers.add(page3Handler) + val page4Handler = Page4Handler() + pageHandlers.add(page4Handler) + page1Handler.addConnectionInterface(page2Handler) page1Handler.addConnectionInterface(page3Handler) page1Handler.addConnectionInterface(this) + val permissionLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) {} diff --git a/app/src/main/java/sensors_in_paradise/sonar/PageInterface.kt b/app/src/main/java/sensors_in_paradise/sonar/PageInterface.kt index 7a8d4f26..a313573d 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/PageInterface.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/PageInterface.kt @@ -7,9 +7,9 @@ interface PageInterface { @UiThread fun activityCreated(activity: Activity) @UiThread - fun activityResumed() + fun activityResumed() {} @UiThread - fun activityWillDestroy() + fun activityWillDestroy() {} @UiThread fun activityStopped() {} } diff --git a/app/src/main/java/sensors_in_paradise/sonar/page4/Page4Handler.kt b/app/src/main/java/sensors_in_paradise/sonar/page4/Page4Handler.kt new file mode 100644 index 00000000..28153805 --- /dev/null +++ b/app/src/main/java/sensors_in_paradise/sonar/page4/Page4Handler.kt @@ -0,0 +1,10 @@ +package sensors_in_paradise.sonar.page4 + +import android.app.Activity +import sensors_in_paradise.sonar.PageInterface + +class Page4Handler : PageInterface { + + override fun activityCreated(activity: Activity) { + } +} diff --git a/app/src/main/res/drawable/ic_baseline_model_training_24.xml b/app/src/main/res/drawable/ic_baseline_model_training_24.xml new file mode 100644 index 00000000..8158a10a --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_model_training_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 7c08d8b5..e259e6b6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -41,8 +41,11 @@ layout="@layout/capture_fragment" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/training_fragment.xml b/app/src/main/res/layout/training_fragment.xml new file mode 100644 index 00000000..77d9ef65 --- /dev/null +++ b/app/src/main/res/layout/training_fragment.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 777be9ca..3f7bcf74 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,14 @@ import io.gitlab.arturbosch.detekt.Detekt buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.6.20' ext.moshiVersion = "1.13.0" repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.android.tools.build:gradle:7.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.20" classpath 'com.google.gms:google-services:4.3.10' From 9e78e2ddeb8cbee19ec77c07034fa88bc653a3f9 Mon Sep 17 00:00:00 2001 From: tfiedlerdev Date: Fri, 22 Apr 2022 13:22:50 +0200 Subject: [PATCH 02/46] Make training screen optional --- .../sonar/HeadingResetHandler.kt | 2 +- .../sensors_in_paradise/sonar/MainActivity.kt | 76 +++++++++++++------ .../sonar/PermissionsHandler.kt | 2 +- .../{PageInterface.kt => ScreenInterface.kt} | 2 +- .../SensorTrafficVisualizationHandler.kt | 2 +- .../sonar/page4/Page4Handler.kt | 10 --- .../ConnectionInterface.kt | 2 +- .../ConnectionScreen.kt} | 6 +- .../SensorAdapter.kt | 2 +- .../SyncHandler.kt | 2 +- .../SyncInterface.kt | 2 +- .../UIDeviceConnectionInterface.kt | 2 +- .../Prediction.kt | 2 +- .../PredictionScreen.kt} | 8 +- .../PredictionsAdapter.kt | 2 +- .../ActivitiesAdapter.kt | 2 +- .../CameraManager.kt | 2 +- .../CategoryItem.kt | 2 +- .../CategoryItemStorage.kt | 2 +- .../LoggingManager.kt | 2 +- .../NestedAdapter.kt | 2 +- .../PersistentCategoriesAdapter.kt | 2 +- .../PersistentCategoriesDialog.kt | 2 +- .../PersistentStringArrayAdapter.kt | 2 +- .../PersistentStringArrayDialog.kt | 2 +- .../{page2 => screen_recording}/Recording.kt | 2 +- .../RecordingDataManager.kt | 2 +- .../RecordingMetadataStorage.kt | 2 +- .../RecordingScreen.kt} | 9 +-- .../RecordingsAdapter.kt | 2 +- .../StringItemStorage.kt | 2 +- .../sonar/screen_train/TrainingScreen.kt | 10 +++ .../uploader/DavCloudRecordingsUploader.kt | 2 +- .../sonar/uploader/RecordingUIItem.kt | 2 +- .../sonar/util/PreferencesHelper.kt | 3 + app/src/main/res/layout/activity_main.xml | 19 ++--- app/src/main/res/xml/root_preferences.xml | 7 ++ 37 files changed, 120 insertions(+), 84 deletions(-) rename app/src/main/java/sensors_in_paradise/sonar/{PageInterface.kt => ScreenInterface.kt} (91%) delete mode 100644 app/src/main/java/sensors_in_paradise/sonar/page4/Page4Handler.kt rename app/src/main/java/sensors_in_paradise/sonar/{page1 => screen_connection}/ConnectionInterface.kt (89%) rename app/src/main/java/sensors_in_paradise/sonar/{page1/Page1Handler.kt => screen_connection/ConnectionScreen.kt} (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page1 => screen_connection}/SensorAdapter.kt (99%) rename app/src/main/java/sensors_in_paradise/sonar/{page1 => screen_connection}/SyncHandler.kt (95%) rename app/src/main/java/sensors_in_paradise/sonar/{page1 => screen_connection}/SyncInterface.kt (87%) rename app/src/main/java/sensors_in_paradise/sonar/{page1 => screen_connection}/UIDeviceConnectionInterface.kt (86%) rename app/src/main/java/sensors_in_paradise/sonar/{page3 => screen_prediction}/Prediction.kt (91%) rename app/src/main/java/sensors_in_paradise/sonar/{page3/Page3Handler.kt => screen_prediction/PredictionScreen.kt} (97%) rename app/src/main/java/sensors_in_paradise/sonar/{page3 => screen_prediction}/PredictionsAdapter.kt (97%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/ActivitiesAdapter.kt (97%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/CameraManager.kt (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/CategoryItem.kt (70%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/CategoryItemStorage.kt (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/LoggingManager.kt (99%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/NestedAdapter.kt (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/PersistentCategoriesAdapter.kt (99%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/PersistentCategoriesDialog.kt (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/PersistentStringArrayAdapter.kt (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/PersistentStringArrayDialog.kt (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/Recording.kt (99%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/RecordingDataManager.kt (96%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/RecordingMetadataStorage.kt (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page2/Page2Handler.kt => screen_recording/RecordingScreen.kt} (97%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/RecordingsAdapter.kt (98%) rename app/src/main/java/sensors_in_paradise/sonar/{page2 => screen_recording}/StringItemStorage.kt (96%) create mode 100644 app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt diff --git a/app/src/main/java/sensors_in_paradise/sonar/HeadingResetHandler.kt b/app/src/main/java/sensors_in_paradise/sonar/HeadingResetHandler.kt index e9d01a28..4e15c093 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/HeadingResetHandler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/HeadingResetHandler.kt @@ -7,7 +7,7 @@ import androidx.annotation.UiThread import com.xsens.dot.android.sdk.events.XsensDotData import com.xsens.dot.android.sdk.interfaces.XsensDotMeasurementCallback import com.xsens.dot.android.sdk.models.XsensDotDevice -import sensors_in_paradise.sonar.page1.ConnectionInterface +import sensors_in_paradise.sonar.screen_connection.ConnectionInterface class HeadingResetHandler( private val context: Context, diff --git a/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt b/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt index 85152190..ab7f98ab 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt @@ -13,12 +13,12 @@ import androidx.appcompat.app.AppCompatDelegate.* import com.google.android.material.tabs.TabLayout import com.google.firebase.crashlytics.FirebaseCrashlytics import sensors_in_paradise.sonar.custom_views.stickman.StickmanDialog -import sensors_in_paradise.sonar.page1.ConnectionInterface -import sensors_in_paradise.sonar.page1.Page1Handler -import sensors_in_paradise.sonar.page2.Page2Handler -import sensors_in_paradise.sonar.page2.RecordingDataManager -import sensors_in_paradise.sonar.page3.Page3Handler -import sensors_in_paradise.sonar.page4.Page4Handler +import sensors_in_paradise.sonar.screen_connection.ConnectionInterface +import sensors_in_paradise.sonar.screen_connection.ConnectionScreen +import sensors_in_paradise.sonar.screen_recording.RecordingScreen +import sensors_in_paradise.sonar.screen_recording.RecordingDataManager +import sensors_in_paradise.sonar.screen_prediction.PredictionScreen +import sensors_in_paradise.sonar.screen_train.TrainingScreen import sensors_in_paradise.sonar.uploader.RecordingsUploaderDialog import sensors_in_paradise.sonar.uploader.DavCloudRecordingsUploader import sensors_in_paradise.sonar.util.PreferencesHelper @@ -31,13 +31,20 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne private lateinit var davCloudUploader: DavCloudRecordingsUploader private lateinit var recordingsManager: RecordingDataManager - private val pageHandlers = ArrayList() + private val pageHandlers = ArrayList() private val scannedDevices = XSENSArrayList() - private lateinit var page1Handler: Page1Handler + private lateinit var connectionScreen: ConnectionScreen private lateinit var sensorTrafficVisualizationHandler: SensorTrafficVisualizationHandler private lateinit var resetHeadingMi: MenuItem private lateinit var revertHeadingMi: MenuItem private lateinit var headingResetHandler: HeadingResetHandler + private val tabIndexToScreenIndexMap = mutableMapOf( + 0 to 0, + 1 to 1, + 2 to 3 + ) + private lateinit var trainingTab: TabLayout.Tab + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -47,27 +54,28 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne recordingsManager = RecordingDataManager( GlobalValues.getSensorRecordingsBaseDir(this) ) + trainingTab = tabLayout.getTabAt(2)!! initClickListeners() - page1Handler = Page1Handler(scannedDevices) + connectionScreen = ConnectionScreen(scannedDevices) headingResetHandler = HeadingResetHandler(this, scannedDevices) { address -> runOnUiThread { - page1Handler.notifyItemChanged(address) + connectionScreen.notifyItemChanged(address) } } - page1Handler.addConnectionInterface(headingResetHandler) - pageHandlers.add(page1Handler) - val page2Handler = Page2Handler(scannedDevices, recordingsManager, this) - pageHandlers.add(page2Handler) - val page3Handler = Page3Handler(scannedDevices, this) - pageHandlers.add(page3Handler) - val page4Handler = Page4Handler() - pageHandlers.add(page4Handler) - - page1Handler.addConnectionInterface(page2Handler) - page1Handler.addConnectionInterface(page3Handler) - page1Handler.addConnectionInterface(this) + connectionScreen.addConnectionInterface(headingResetHandler) + pageHandlers.add(connectionScreen) + val recordingScreen = RecordingScreen(scannedDevices, recordingsManager, this) + pageHandlers.add(recordingScreen) + val predictionScreen = PredictionScreen(scannedDevices, this) + pageHandlers.add(predictionScreen) + val trainingScreen = TrainingScreen() + pageHandlers.add(trainingScreen) + + connectionScreen.addConnectionInterface(recordingScreen) + connectionScreen.addConnectionInterface(predictionScreen) + connectionScreen.addConnectionInterface(this) val permissionLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() @@ -95,6 +103,8 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne for (handler in pageHandlers) { handler.activityResumed() } + setTrainingTabVisible(PreferencesHelper.isOnDeviceTrainingScreenEnabled(this)) + } override fun onDestroy() { @@ -102,14 +112,29 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne super.onDestroy() } - + private fun setTrainingTabVisible(visible: Boolean) { + if(visible){ + tabIndexToScreenIndexMap[2] = 2 + tabIndexToScreenIndexMap[3] = 3 + if (tabLayout.tabCount < 4) { + tabLayout.addTab(trainingTab, 2) + } + } + else{ + tabIndexToScreenIndexMap[2] = 3 + tabIndexToScreenIndexMap.remove(3) + if (tabLayout.tabCount > 3) { + tabLayout.removeTab(trainingTab) + } + } + } private fun initClickListeners() { tabLayout.addOnTabSelectedListener(this) } override fun onTabSelected(tab: TabLayout.Tab?) { if (tab != null) { - switcher.displayedChild = tab.position + switcher.displayedChild = tabIndexToScreenIndexMap[tab.position]!! } } @@ -131,7 +156,7 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne findViewById(R.id.linearLayout_sensorOrientation_activityMain), menu.findItem(R.id.menuItem_orientation_activityMain) ) - page1Handler.addConnectionInterface( + connectionScreen.addConnectionInterface( sensorTrafficVisualizationHandler ) resetHeadingMi = menu.findItem(R.id.menuItem_headingReset_activityMain) @@ -182,4 +207,5 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne resetHeadingMi.isEnabled = !areConnectedSensorsOccupied && hasConnectedSensors revertHeadingMi.isEnabled = !areConnectedSensorsOccupied && hasConnectedSensors } + } diff --git a/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt b/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt index 854999d4..1f22231f 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt @@ -7,7 +7,7 @@ import androidx.activity.result.ActivityResultLauncher import sensors_in_paradise.sonar.util.PermissionsHelper import sensors_in_paradise.sonar.util.UIHelper -class PermissionsHandler(private val requestPermissionLauncher: ActivityResultLauncher>) : PageInterface { +class PermissionsHandler(private val requestPermissionLauncher: ActivityResultLauncher>) : ScreenInterface { lateinit var context: Context private var dialog: AlertDialog? = null diff --git a/app/src/main/java/sensors_in_paradise/sonar/PageInterface.kt b/app/src/main/java/sensors_in_paradise/sonar/ScreenInterface.kt similarity index 91% rename from app/src/main/java/sensors_in_paradise/sonar/PageInterface.kt rename to app/src/main/java/sensors_in_paradise/sonar/ScreenInterface.kt index a313573d..104ce4cf 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/PageInterface.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/ScreenInterface.kt @@ -3,7 +3,7 @@ package sensors_in_paradise.sonar import android.app.Activity import androidx.annotation.UiThread -interface PageInterface { +interface ScreenInterface { @UiThread fun activityCreated(activity: Activity) @UiThread diff --git a/app/src/main/java/sensors_in_paradise/sonar/SensorTrafficVisualizationHandler.kt b/app/src/main/java/sensors_in_paradise/sonar/SensorTrafficVisualizationHandler.kt index ad898e2c..ec5ba460 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/SensorTrafficVisualizationHandler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/SensorTrafficVisualizationHandler.kt @@ -14,7 +14,7 @@ import com.xsens.dot.android.sdk.utils.XsensDotParser import sensors_in_paradise.sonar.custom_views.SensorDataTrafficIndicatorView import sensors_in_paradise.sonar.custom_views.stickman.Render3DView import sensors_in_paradise.sonar.custom_views.stickman.object3d.Sensor3D -import sensors_in_paradise.sonar.page1.ConnectionInterface +import sensors_in_paradise.sonar.screen_connection.ConnectionInterface class SensorTrafficVisualizationHandler( val activity: Activity, diff --git a/app/src/main/java/sensors_in_paradise/sonar/page4/Page4Handler.kt b/app/src/main/java/sensors_in_paradise/sonar/page4/Page4Handler.kt deleted file mode 100644 index 28153805..00000000 --- a/app/src/main/java/sensors_in_paradise/sonar/page4/Page4Handler.kt +++ /dev/null @@ -1,10 +0,0 @@ -package sensors_in_paradise.sonar.page4 - -import android.app.Activity -import sensors_in_paradise.sonar.PageInterface - -class Page4Handler : PageInterface { - - override fun activityCreated(activity: Activity) { - } -} diff --git a/app/src/main/java/sensors_in_paradise/sonar/page1/ConnectionInterface.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionInterface.kt similarity index 89% rename from app/src/main/java/sensors_in_paradise/sonar/page1/ConnectionInterface.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionInterface.kt index d2a7c78d..36f97874 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page1/ConnectionInterface.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionInterface.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page1 +package sensors_in_paradise.sonar.screen_connection import androidx.annotation.AnyThread import androidx.annotation.UiThread diff --git a/app/src/main/java/sensors_in_paradise/sonar/page1/Page1Handler.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionScreen.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page1/Page1Handler.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionScreen.kt index 48d15e1f..955639ba 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page1/Page1Handler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionScreen.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page1 +package sensors_in_paradise.sonar.screen_connection import android.annotation.SuppressLint import android.app.Activity @@ -28,8 +28,8 @@ import android.view.animation.AccelerateDecelerateInterpolator import sensors_in_paradise.sonar.* import kotlin.properties.Delegates -class Page1Handler(private val scannedDevices: XSENSArrayList) : - XsensDotScannerCallback, XsensDotDeviceCallback, PageInterface, +class ConnectionScreen(private val scannedDevices: XSENSArrayList) : + XsensDotScannerCallback, XsensDotDeviceCallback, ScreenInterface, UIDeviceConnectionInterface, SyncInterface { private lateinit var context: Context private lateinit var activity: Activity diff --git a/app/src/main/java/sensors_in_paradise/sonar/page1/SensorAdapter.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/SensorAdapter.kt similarity index 99% rename from app/src/main/java/sensors_in_paradise/sonar/page1/SensorAdapter.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_connection/SensorAdapter.kt index 52be6fda..904e2c71 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page1/SensorAdapter.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/SensorAdapter.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page1 +package sensors_in_paradise.sonar.screen_connection import android.content.Context import android.graphics.drawable.Drawable diff --git a/app/src/main/java/sensors_in_paradise/sonar/page1/SyncHandler.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/SyncHandler.kt similarity index 95% rename from app/src/main/java/sensors_in_paradise/sonar/page1/SyncHandler.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_connection/SyncHandler.kt index dae79a12..cf3b3d97 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page1/SyncHandler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/SyncHandler.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page1 +package sensors_in_paradise.sonar.screen_connection import android.util.Log import com.xsens.dot.android.sdk.interfaces.XsensDotSyncCallback diff --git a/app/src/main/java/sensors_in_paradise/sonar/page1/SyncInterface.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/SyncInterface.kt similarity index 87% rename from app/src/main/java/sensors_in_paradise/sonar/page1/SyncInterface.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_connection/SyncInterface.kt index 2814ed89..5650e46b 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page1/SyncInterface.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/SyncInterface.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page1 +package sensors_in_paradise.sonar.screen_connection import androidx.annotation.AnyThread import java.util.HashMap diff --git a/app/src/main/java/sensors_in_paradise/sonar/page1/UIDeviceConnectionInterface.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/UIDeviceConnectionInterface.kt similarity index 86% rename from app/src/main/java/sensors_in_paradise/sonar/page1/UIDeviceConnectionInterface.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_connection/UIDeviceConnectionInterface.kt index d024f536..5ace67c6 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page1/UIDeviceConnectionInterface.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/UIDeviceConnectionInterface.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page1 +package sensors_in_paradise.sonar.screen_connection import androidx.annotation.AnyThread import com.xsens.dot.android.sdk.models.XsensDotDevice diff --git a/app/src/main/java/sensors_in_paradise/sonar/page3/Prediction.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/Prediction.kt similarity index 91% rename from app/src/main/java/sensors_in_paradise/sonar/page3/Prediction.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_prediction/Prediction.kt index 73b60823..9362884d 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page3/Prediction.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/Prediction.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page3 +package sensors_in_paradise.sonar.screen_prediction class Prediction(var title: String, var percentage: Float) { fun percentageAsString(): String { diff --git a/app/src/main/java/sensors_in_paradise/sonar/page3/Page3Handler.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionScreen.kt similarity index 97% rename from app/src/main/java/sensors_in_paradise/sonar/page3/Page3Handler.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionScreen.kt index 644de1a3..313b2a45 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page3/Page3Handler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionScreen.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page3 +package sensors_in_paradise.sonar.screen_prediction import android.annotation.SuppressLint import android.app.Activity @@ -21,7 +21,7 @@ import org.tensorflow.lite.support.tensorbuffer.TensorBuffer import sensors_in_paradise.sonar.* import sensors_in_paradise.sonar.util.PredictionHelper import sensors_in_paradise.sonar.R -import sensors_in_paradise.sonar.page1.ConnectionInterface +import sensors_in_paradise.sonar.screen_connection.ConnectionInterface import sensors_in_paradise.sonar.XSENSArrayList import sensors_in_paradise.sonar.ml.Lstmmodel118 import sensors_in_paradise.sonar.util.PreferencesHelper @@ -29,10 +29,10 @@ import kotlin.collections.ArrayList import java.nio.ByteBuffer import kotlin.math.round -class Page3Handler( +class PredictionScreen( private val devices: XSENSArrayList, private val sensorOccupationInterface: SensorOccupationInterface? -) : PageInterface, ConnectionInterface { +) : ScreenInterface, ConnectionInterface { private lateinit var activity: Activity private lateinit var context: Context private lateinit var recyclerView: RecyclerView diff --git a/app/src/main/java/sensors_in_paradise/sonar/page3/PredictionsAdapter.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionsAdapter.kt similarity index 97% rename from app/src/main/java/sensors_in_paradise/sonar/page3/PredictionsAdapter.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionsAdapter.kt index c67710db..ae8d49d1 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page3/PredictionsAdapter.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionsAdapter.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page3 +package sensors_in_paradise.sonar.screen_prediction import android.view.LayoutInflater import android.view.View diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/ActivitiesAdapter.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/ActivitiesAdapter.kt similarity index 97% rename from app/src/main/java/sensors_in_paradise/sonar/page2/ActivitiesAdapter.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/ActivitiesAdapter.kt index 76f15c07..fc8a4b0e 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/ActivitiesAdapter.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/ActivitiesAdapter.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.annotation.SuppressLint import android.view.LayoutInflater diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/CameraManager.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/CameraManager.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page2/CameraManager.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/CameraManager.kt index f1deb027..38c09736 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/CameraManager.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/CameraManager.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.content.Context import android.util.Log diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/CategoryItem.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/CategoryItem.kt similarity index 70% rename from app/src/main/java/sensors_in_paradise/sonar/page2/CategoryItem.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/CategoryItem.kt index 428e3006..aa973329 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/CategoryItem.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/CategoryItem.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording data class CategoryItem( var itemText: String, diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/CategoryItemStorage.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/CategoryItemStorage.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page2/CategoryItemStorage.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/CategoryItemStorage.kt index 35c26693..effa3366 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/CategoryItemStorage.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/CategoryItemStorage.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import org.json.JSONArray import org.json.JSONObject diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/LoggingManager.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/LoggingManager.kt similarity index 99% rename from app/src/main/java/sensors_in_paradise/sonar/page2/LoggingManager.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/LoggingManager.kt index dde4ab39..24dd90c4 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/LoggingManager.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/LoggingManager.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.content.Context import android.os.SystemClock diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/NestedAdapter.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/NestedAdapter.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page2/NestedAdapter.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/NestedAdapter.kt index 9affa9a9..0dd6cdfd 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/NestedAdapter.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/NestedAdapter.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.app.AlertDialog import android.view.LayoutInflater diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/PersistentCategoriesAdapter.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentCategoriesAdapter.kt similarity index 99% rename from app/src/main/java/sensors_in_paradise/sonar/page2/PersistentCategoriesAdapter.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentCategoriesAdapter.kt index 3e9a1d54..75a9e73f 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/PersistentCategoriesAdapter.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentCategoriesAdapter.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.annotation.SuppressLint import android.app.AlertDialog diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/PersistentCategoriesDialog.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentCategoriesDialog.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page2/PersistentCategoriesDialog.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentCategoriesDialog.kt index 96907d62..4056fdcf 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/PersistentCategoriesDialog.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentCategoriesDialog.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/PersistentStringArrayAdapter.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentStringArrayAdapter.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page2/PersistentStringArrayAdapter.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentStringArrayAdapter.kt index ab63197f..47ebaded 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/PersistentStringArrayAdapter.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentStringArrayAdapter.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.graphics.Color import android.view.LayoutInflater diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/PersistentStringArrayDialog.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentStringArrayDialog.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page2/PersistentStringArrayDialog.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentStringArrayDialog.kt index 5c99570b..2edf025f 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/PersistentStringArrayDialog.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/PersistentStringArrayDialog.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/Recording.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/Recording.kt similarity index 99% rename from app/src/main/java/sensors_in_paradise/sonar/page2/Recording.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/Recording.kt index 1bbf1b4c..58f222a5 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/Recording.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/Recording.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import sensors_in_paradise.sonar.GlobalValues import java.io.BufferedReader diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/RecordingDataManager.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingDataManager.kt similarity index 96% rename from app/src/main/java/sensors_in_paradise/sonar/page2/RecordingDataManager.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingDataManager.kt index 2161f263..960389c4 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/RecordingDataManager.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingDataManager.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import sensors_in_paradise.sonar.GlobalValues import java.io.File diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/RecordingMetadataStorage.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page2/RecordingMetadataStorage.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt index 83102734..e330aa76 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/RecordingMetadataStorage.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt @@ -1,5 +1,5 @@ @file:Suppress("SwallowedException") -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import org.json.JSONArray import org.json.JSONException diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/Page2Handler.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingScreen.kt similarity index 97% rename from app/src/main/java/sensors_in_paradise/sonar/page2/Page2Handler.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingScreen.kt index 9c5b402e..2ab3461e 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/Page2Handler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingScreen.kt @@ -1,27 +1,26 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.app.Activity import android.content.Context import android.media.MediaPlayer import android.view.View import android.widget.* -import androidx.core.view.size import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.tabs.TabLayout import com.google.common.io.Files import com.xsens.dot.android.sdk.events.XsensDotData import sensors_in_paradise.sonar.* -import sensors_in_paradise.sonar.page1.ConnectionInterface +import sensors_in_paradise.sonar.screen_connection.ConnectionInterface import sensors_in_paradise.sonar.XSENSArrayList import sensors_in_paradise.sonar.util.PreferencesHelper import java.io.IOException -class Page2Handler( +class RecordingScreen( private val devices: XSENSArrayList, private val recordingsManager: RecordingDataManager, private val sensorOccupationInterface: SensorOccupationInterface? -) : PageInterface, ConnectionInterface, +) : ScreenInterface, ConnectionInterface, TabLayout.OnTabSelectedListener { private lateinit var context: Context private lateinit var timer: Chronometer diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/RecordingsAdapter.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingsAdapter.kt similarity index 98% rename from app/src/main/java/sensors_in_paradise/sonar/page2/RecordingsAdapter.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingsAdapter.kt index aec368e7..50881dfb 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/RecordingsAdapter.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingsAdapter.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import android.annotation.SuppressLint import android.content.Context diff --git a/app/src/main/java/sensors_in_paradise/sonar/page2/StringItemStorage.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/StringItemStorage.kt similarity index 96% rename from app/src/main/java/sensors_in_paradise/sonar/page2/StringItemStorage.kt rename to app/src/main/java/sensors_in_paradise/sonar/screen_recording/StringItemStorage.kt index 8ec046e6..6b6894e5 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/page2/StringItemStorage.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/StringItemStorage.kt @@ -1,4 +1,4 @@ -package sensors_in_paradise.sonar.page2 +package sensors_in_paradise.sonar.screen_recording import org.json.JSONArray import sensors_in_paradise.sonar.JSONStorage diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt new file mode 100644 index 00000000..c17ac108 --- /dev/null +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt @@ -0,0 +1,10 @@ +package sensors_in_paradise.sonar.screen_train + +import android.app.Activity +import sensors_in_paradise.sonar.ScreenInterface + +class TrainingScreen : ScreenInterface { + + override fun activityCreated(activity: Activity) { + } +} diff --git a/app/src/main/java/sensors_in_paradise/sonar/uploader/DavCloudRecordingsUploader.kt b/app/src/main/java/sensors_in_paradise/sonar/uploader/DavCloudRecordingsUploader.kt index 867d6c19..501acfc4 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/uploader/DavCloudRecordingsUploader.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/uploader/DavCloudRecordingsUploader.kt @@ -6,7 +6,7 @@ import android.util.Log import com.google.common.net.MediaType import sensors_in_paradise.sonar.GlobalValues import sensors_in_paradise.sonar.util.dialogs.MessageDialog -import sensors_in_paradise.sonar.page2.RecordingDataManager +import sensors_in_paradise.sonar.screen_recording.RecordingDataManager import java.io.File class DavCloudRecordingsUploader(activity: Activity, val recordingsManager: RecordingDataManager) : diff --git a/app/src/main/java/sensors_in_paradise/sonar/uploader/RecordingUIItem.kt b/app/src/main/java/sensors_in_paradise/sonar/uploader/RecordingUIItem.kt index c7ef323b..af41e3b9 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/uploader/RecordingUIItem.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/uploader/RecordingUIItem.kt @@ -1,7 +1,7 @@ package sensors_in_paradise.sonar.uploader import sensors_in_paradise.sonar.GlobalValues -import sensors_in_paradise.sonar.page2.Recording +import sensors_in_paradise.sonar.screen_recording.Recording import java.io.File import java.lang.Exception diff --git a/app/src/main/java/sensors_in_paradise/sonar/util/PreferencesHelper.kt b/app/src/main/java/sensors_in_paradise/sonar/util/PreferencesHelper.kt index 2a21965e..01abed0d 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/util/PreferencesHelper.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/util/PreferencesHelper.kt @@ -64,6 +64,9 @@ class PreferencesHelper private constructor() { fun shouldViewSensorHeadingMenuItems(context: Context): Boolean { return getSharedPreferences(context).getBoolean("viewHeadingMenuItems", false) } + fun isOnDeviceTrainingScreenEnabled(context: Context): Boolean { + return getSharedPreferences(context).getBoolean("onDeviceTraining", false) + } fun getCameraRecordingQuality(context: Context): Quality { return when (getSharedPreferences(context).getString("videoRecordingQuality", "LOWEST")) { "HIGHEST" -> Quality.HIGHEST diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e259e6b6..811e1af1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -39,13 +39,13 @@ - + layout="@layout/training_fragment" /> + layout="@layout/prediction_fragment" /> + + android:text="Connect" /> + android:text="Record" /> + + android:icon="@drawable/ic_baseline_model_training_24" + android:text="Train" /> + android:icon="@drawable/ic_baseline_local_fire_department_24" + android:text="Predict" /> \ No newline at end of file diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 1c711db6..9dec937e 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -30,6 +30,13 @@ app:key="darkMode" app:title="Dark mode" /> + + + Date: Mon, 25 Apr 2022 09:47:48 +0200 Subject: [PATCH 03/46] Prepare onDeviceTrainingScreen --- .../sensors_in_paradise/sonar/GlobalValues.kt | 26 ++++++++++++ .../sensors_in_paradise/sonar/MainActivity.kt | 41 +++++++++++-------- .../sonar/PermissionsHandler.kt | 6 +-- .../sonar/ScreenInterface.kt | 12 ++++-- .../screen_connection/ConnectionScreen.kt | 6 +-- .../screen_prediction/PredictionScreen.kt | 6 +-- .../RecordingMetadataStorage.kt | 33 ++++++++++++++- .../sonar/screen_recording/RecordingScreen.kt | 6 +-- .../sonar/screen_train/TrainingScreen.kt | 2 +- 9 files changed, 103 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/sensors_in_paradise/sonar/GlobalValues.kt b/app/src/main/java/sensors_in_paradise/sonar/GlobalValues.kt index 01cb1787..4ab1b459 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/GlobalValues.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/GlobalValues.kt @@ -5,6 +5,9 @@ import android.content.Context import android.os.Build import com.xsens.dot.android.sdk.models.XsensDotPayload import java.io.File +import java.net.NetworkInterface +import java.util.* +import kotlin.collections.ArrayList class GlobalValues private constructor() { companion object { @@ -124,5 +127,28 @@ class GlobalValues private constructor() { return minutes.toString().padStart(2, '0') + ":" + seconds.toString().padStart(2, '0') } + fun getMacAddress(): String { + try { + val all = Collections.list(NetworkInterface.getNetworkInterfaces()) + for (nif in all) { + if (!nif.name.equals("wlan0", ignoreCase=true)) continue + + val macBytes = nif.hardwareAddress ?: return "" + + val res1 = StringBuilder() + for (b in macBytes) { + res1.append(String.format("%02X:", b)) + } + + if (res1.isNotEmpty()) { + res1.deleteCharAt(res1.length - 1) + } + return res1.toString() + } + } catch (ex: Exception) { + } + + return "02:00:00:00:00:00" + } } } diff --git a/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt b/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt index ab7f98ab..ebf6a00d 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt @@ -31,7 +31,7 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne private lateinit var davCloudUploader: DavCloudRecordingsUploader private lateinit var recordingsManager: RecordingDataManager - private val pageHandlers = ArrayList() + private val screenHandlers = ArrayList() private val scannedDevices = XSENSArrayList() private lateinit var connectionScreen: ConnectionScreen private lateinit var sensorTrafficVisualizationHandler: SensorTrafficVisualizationHandler @@ -65,13 +65,17 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne } } connectionScreen.addConnectionInterface(headingResetHandler) - pageHandlers.add(connectionScreen) + screenHandlers.add(connectionScreen) + val recordingScreen = RecordingScreen(scannedDevices, recordingsManager, this) - pageHandlers.add(recordingScreen) - val predictionScreen = PredictionScreen(scannedDevices, this) - pageHandlers.add(predictionScreen) + screenHandlers.add(recordingScreen) + val trainingScreen = TrainingScreen() - pageHandlers.add(trainingScreen) + screenHandlers.add(trainingScreen) + + val predictionScreen = PredictionScreen(scannedDevices, this) + screenHandlers.add(predictionScreen) + connectionScreen.addConnectionInterface(recordingScreen) connectionScreen.addConnectionInterface(predictionScreen) @@ -80,10 +84,10 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne val permissionLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) {} - pageHandlers.add(PermissionsHandler(permissionLauncher)) + screenHandlers.add(PermissionsHandler(permissionLauncher)) - for (handler in pageHandlers) { - handler.activityCreated(this) + for (handler in screenHandlers) { + handler.onActivityCreated(this) } supportActionBar?.setBackgroundDrawable(ColorDrawable(getColor(R.color.colorPrimary))) @@ -100,15 +104,15 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne mode = if (PreferencesHelper.shouldUseDarkMode(this)) MODE_NIGHT_YES else MODE_NIGHT_NO } setDefaultNightMode(mode) - for (handler in pageHandlers) { - handler.activityResumed() + for (handler in screenHandlers) { + handler.onActivityResumed() } setTrainingTabVisible(PreferencesHelper.isOnDeviceTrainingScreenEnabled(this)) } override fun onDestroy() { - pageHandlers.forEach { handler -> handler.activityWillDestroy() } + screenHandlers.forEach { handler -> handler.onActivityWillDestroy() } super.onDestroy() } @@ -134,17 +138,20 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne override fun onTabSelected(tab: TabLayout.Tab?) { if (tab != null) { - switcher.displayedChild = tabIndexToScreenIndexMap[tab.position]!! + val screenIndex = tabIndexToScreenIndexMap[tab.position]!! + switcher.displayedChild = screenIndex + screenHandlers[screenIndex].onScreenOpened() } } override fun onTabUnselected(tab: TabLayout.Tab?) { - // TODO("Not yet implemented") + if (tab != null) { + val screenIndex = tabIndexToScreenIndexMap[tab.position]!! + screenHandlers[screenIndex].onScreenClosed() + } } - override fun onTabReselected(tab: TabLayout.Tab?) { - // TODO("Not yet implemented") - } + override fun onTabReselected(tab: TabLayout.Tab?) {} override fun onCreateOptionsMenu(menu: Menu): Boolean { val inflater: MenuInflater = menuInflater diff --git a/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt b/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt index 1f22231f..024831c0 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt @@ -11,13 +11,13 @@ class PermissionsHandler(private val requestPermissionLauncher: ActivityResultLa lateinit var context: Context private var dialog: AlertDialog? = null - override fun activityCreated(activity: Activity) { + override fun onActivityCreated(activity: Activity) { context = activity val missingPermissions = PermissionsHelper.getRequiredButUngrantedPermissions(context) requestPermissionLauncher.launch(missingPermissions.toArray(arrayOf())) } - override fun activityResumed() { + override fun onActivityResumed() { dialog?.dismiss() if (!PermissionsHelper.areAllPermissionsGranted(context)) { val missingPermissions = PermissionsHelper.getRequiredButUngrantedPermissions(context) @@ -30,7 +30,7 @@ class PermissionsHandler(private val requestPermissionLauncher: ActivityResultLa } } - override fun activityWillDestroy() { + override fun onActivityWillDestroy() { // Nothing to do } } diff --git a/app/src/main/java/sensors_in_paradise/sonar/ScreenInterface.kt b/app/src/main/java/sensors_in_paradise/sonar/ScreenInterface.kt index 104ce4cf..9b93909b 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/ScreenInterface.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/ScreenInterface.kt @@ -5,11 +5,15 @@ import androidx.annotation.UiThread interface ScreenInterface { @UiThread - fun activityCreated(activity: Activity) + fun onActivityCreated(activity: Activity) @UiThread - fun activityResumed() {} + fun onActivityResumed() {} @UiThread - fun activityWillDestroy() {} + fun onActivityWillDestroy() {} @UiThread - fun activityStopped() {} + fun onActivityStopped() {} + @UiThread + fun onScreenOpened() {} + @UiThread + fun onScreenClosed() {} } diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionScreen.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionScreen.kt index 955639ba..cc364b72 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionScreen.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_connection/ConnectionScreen.kt @@ -113,7 +113,7 @@ class ConnectionScreen(private val scannedDevices: XSENSArrayList) : @SuppressLint("NotifyDataSetChanged") @RequiresApi(Build.VERSION_CODES.S) - override fun activityCreated(activity: Activity) { + override fun onActivityCreated(activity: Activity) { this.context = activity this.activity = activity tv = activity.findViewById(R.id.tv_center_acitivity_main) @@ -144,7 +144,7 @@ class ConnectionScreen(private val scannedDevices: XSENSArrayList) : } } @SuppressLint("SetTextI18n") - override fun activityResumed() { + override fun onActivityResumed() { if (PermissionsHelper.areAllPermissionsGranted(context)) { val mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter() if (mBluetoothAdapter == null) { @@ -168,7 +168,7 @@ class ConnectionScreen(private val scannedDevices: XSENSArrayList) : } } - override fun activityWillDestroy() { + override fun onActivityWillDestroy() { // Nothing to do } diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionScreen.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionScreen.kt index 313b2a45..134a8738 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionScreen.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_prediction/PredictionScreen.kt @@ -198,7 +198,7 @@ class PredictionScreen( addPredictionViews(outputFeature0.floatArray) } - override fun activityCreated(activity: Activity) { + override fun onActivityCreated(activity: Activity) { this.activity = activity this.context = activity @@ -224,10 +224,10 @@ class PredictionScreen( mainHandler = Handler(Looper.getMainLooper()) } - override fun activityResumed() { + override fun onActivityResumed() { } - override fun activityWillDestroy() { + override fun onActivityWillDestroy() { // Nothing to do } diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt index e330aa76..bc0f88e1 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt @@ -1,9 +1,11 @@ @file:Suppress("SwallowedException") package sensors_in_paradise.sonar.screen_recording +import android.os.Build import org.json.JSONArray import org.json.JSONException import org.json.JSONObject +import sensors_in_paradise.sonar.GlobalValues import sensors_in_paradise.sonar.JSONStorage import java.io.File @@ -80,7 +82,33 @@ class RecordingMetadataStorage(file: File) : JSONStorage(file) { null } } - + fun hasBeenUsedForOnDeviceTraining(): Boolean{ + val macAddress = GlobalValues.getMacAddress() + if(json.has(ON_DEVICE_TRAINING_METADATA_KEY)){ + return json.has(macAddress) + } + return false + } + fun setUsedForOnDeviceTraining(save: Boolean = true){ + if(!json.has(ON_DEVICE_TRAINING_METADATA_KEY)){ + json.put(ON_DEVICE_TRAINING_METADATA_KEY, JSONObject()) + } + val onDeviceTrainingObj = json.getJSONObject(ON_DEVICE_TRAINING_METADATA_KEY) + val macAddress = GlobalValues.getMacAddress() + if(!onDeviceTrainingObj.has(macAddress)){ + val deviceInfoObj = JSONObject() + deviceInfoObj.put("device_model", Build.MODEL) + deviceInfoObj.put("device", Build.DEVICE) + deviceInfoObj.put("trainingHistory",JSONArray()) + onDeviceTrainingObj.put(macAddress, deviceInfoObj) + } + val deviceInfoObj = onDeviceTrainingObj.getJSONObject(macAddress) + val trainingHistory = deviceInfoObj.getJSONArray("trainingHistory") + trainingHistory.put(System.currentTimeMillis()) + if(save){ + save() + } + } private fun addActivity(activity: Pair) { val obj = JSONObject() obj.put("timeStarted", activity.first) @@ -106,4 +134,7 @@ class RecordingMetadataStorage(file: File) : JSONStorage(file) { } json.put("sensorMapping", obj) } + companion object{ + private const val ON_DEVICE_TRAINING_METADATA_KEY = "onDeviceTraining" + } } diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingScreen.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingScreen.kt index 2ab3461e..d97d240a 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingScreen.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingScreen.kt @@ -39,7 +39,7 @@ class RecordingScreen( private lateinit var activity: Activity private lateinit var cameraManager: CameraManager private lateinit var mediaPlayerSound: MediaPlayer - override fun activityCreated(activity: Activity) { + override fun onActivityCreated(activity: Activity) { this.context = activity this.activity = activity timer = activity.findViewById(R.id.timer) @@ -125,11 +125,11 @@ class RecordingScreen( recordingsAdapter.notifyItemInserted(0) } - override fun activityResumed() { + override fun onActivityResumed() { setCameraTabVisible(PreferencesHelper.shouldRecordWithCamera(context)) } - override fun activityWillDestroy() { + override fun onActivityWillDestroy() { loggingManager.stopLoggingImmediately() } diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt index c17ac108..c4df1de3 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt @@ -5,6 +5,6 @@ import sensors_in_paradise.sonar.ScreenInterface class TrainingScreen : ScreenInterface { - override fun activityCreated(activity: Activity) { + override fun onActivityCreated(activity: Activity) { } } From 14061c6a09f0dcbcc7cd2c5049bacc47224bc322 Mon Sep 17 00:00:00 2001 From: treyfel <58570309+treyfel@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:51:50 +0200 Subject: [PATCH 04/46] init useCases --- .../java/sensors_in_paradise/sonar/util/use_cases/UseCase.kt | 4 ++++ .../sonar/util/use_cases/UseCaseHandler.kt | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 app/src/main/java/sensors_in_paradise/sonar/util/use_cases/UseCase.kt create mode 100644 app/src/main/java/sensors_in_paradise/sonar/util/use_cases/UseCaseHandler.kt diff --git a/app/src/main/java/sensors_in_paradise/sonar/util/use_cases/UseCase.kt b/app/src/main/java/sensors_in_paradise/sonar/util/use_cases/UseCase.kt new file mode 100644 index 00000000..a38b1d32 --- /dev/null +++ b/app/src/main/java/sensors_in_paradise/sonar/util/use_cases/UseCase.kt @@ -0,0 +1,4 @@ +package sensors_in_paradise.sonar.util.use_cases + +class UseCase { +} \ No newline at end of file diff --git a/app/src/main/java/sensors_in_paradise/sonar/util/use_cases/UseCaseHandler.kt b/app/src/main/java/sensors_in_paradise/sonar/util/use_cases/UseCaseHandler.kt new file mode 100644 index 00000000..d0e2e2bc --- /dev/null +++ b/app/src/main/java/sensors_in_paradise/sonar/util/use_cases/UseCaseHandler.kt @@ -0,0 +1,4 @@ +package sensors_in_paradise.sonar.util.use_cases + +class UseCaseHandler { +} \ No newline at end of file From 97b0c0386aeb1ad10cdede317aebf6c2d1ea1cd2 Mon Sep 17 00:00:00 2001 From: tfiedlerdev Date: Mon, 25 Apr 2022 16:52:50 +0200 Subject: [PATCH 05/46] Populate on-device-training screen --- app/build.gradle | 3 +- .../sensors_in_paradise/sonar/GlobalValues.kt | 7 +- .../sensors_in_paradise/sonar/MainActivity.kt | 9 +- .../sonar/PermissionsHandler.kt | 3 +- .../screen_recording/RecordingDataManager.kt | 33 +++++- .../RecordingMetadataStorage.kt | 22 ++-- .../labels_editor/EditableRecording.kt | 4 +- .../labels_editor/LabelsEditorDialog.kt | 4 +- .../sonar/screen_train/TrainingScreen.kt | 104 +++++++++++++++++- app/src/main/res/layout/training_fragment.xml | 78 ++++++++++++- 10 files changed, 235 insertions(+), 32 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ad098ad7..fd8baa2a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,8 +110,7 @@ dependencies { repositories { mavenCentral() maven { - name 'ossrh-snapshot' - url 'https://oss.sonatype.org/content/repositories/snapshots' + url 'https://jitpack.io' } } diff --git a/app/src/main/java/sensors_in_paradise/sonar/GlobalValues.kt b/app/src/main/java/sensors_in_paradise/sonar/GlobalValues.kt index 4ab1b459..56440675 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/GlobalValues.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/GlobalValues.kt @@ -3,9 +3,11 @@ package sensors_in_paradise.sonar import android.Manifest import android.content.Context import android.os.Build +import android.util.Log import com.xsens.dot.android.sdk.models.XsensDotPayload import java.io.File import java.net.NetworkInterface +import java.net.SocketException import java.util.* import kotlin.collections.ArrayList @@ -137,7 +139,7 @@ class GlobalValues private constructor() { val res1 = StringBuilder() for (b in macBytes) { - res1.append(String.format("%02X:", b)) + res1.append(String.format(Locale.US, "%02X:", b)) } if (res1.isNotEmpty()) { @@ -145,7 +147,8 @@ class GlobalValues private constructor() { } return res1.toString() } - } catch (ex: Exception) { + } catch (ex: SocketException) { + ex.message?.let { Log.e("GlobalValues", it) } } return "02:00:00:00:00:00" diff --git a/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt b/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt index cd3a522d..068ce59e 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/MainActivity.kt @@ -70,13 +70,12 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne val recordingScreen = RecordingScreen(scannedDevices, recordingsManager, this) screenHandlers.add(recordingScreen) - val trainingScreen = TrainingScreen() + val trainingScreen = TrainingScreen(recordingsManager) screenHandlers.add(trainingScreen) val predictionScreen = PredictionScreen(scannedDevices, this) screenHandlers.add(predictionScreen) - connectionScreen.addConnectionInterface(recordingScreen) connectionScreen.addConnectionInterface(predictionScreen) connectionScreen.addConnectionInterface(this) @@ -108,7 +107,6 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne handler.onActivityResumed() } setTrainingTabVisible(PreferencesHelper.isOnDeviceTrainingScreenEnabled(this)) - } override fun onDestroy() { @@ -117,14 +115,13 @@ class MainActivity : AppCompatActivity(), TabLayout.OnTabSelectedListener, Conne super.onDestroy() } private fun setTrainingTabVisible(visible: Boolean) { - if(visible){ + if (visible) { tabIndexToScreenIndexMap[2] = 2 tabIndexToScreenIndexMap[3] = 3 if (tabLayout.tabCount < 4) { tabLayout.addTab(trainingTab, 2) } - } - else{ + } else { tabIndexToScreenIndexMap[2] = 3 tabIndexToScreenIndexMap.remove(3) if (tabLayout.tabCount > 3) { diff --git a/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt b/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt index 024831c0..818c6818 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/PermissionsHandler.kt @@ -7,7 +7,8 @@ import androidx.activity.result.ActivityResultLauncher import sensors_in_paradise.sonar.util.PermissionsHelper import sensors_in_paradise.sonar.util.UIHelper -class PermissionsHandler(private val requestPermissionLauncher: ActivityResultLauncher>) : ScreenInterface { +class PermissionsHandler(private val requestPermissionLauncher: ActivityResultLauncher>) : + ScreenInterface { lateinit var context: Context private var dialog: AlertDialog? = null diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingDataManager.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingDataManager.kt index 50eef1a6..7d44560f 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingDataManager.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingDataManager.kt @@ -3,7 +3,10 @@ package sensors_in_paradise.sonar.screen_recording import sensors_in_paradise.sonar.GlobalValues import java.io.File -class RecordingDataManager(private val recordingsDir: File, val recordingsList: ArrayList) { +class RecordingDataManager( + private val recordingsDir: File, + val recordingsList: ArrayList +) { constructor(recordingsDir: File) : this(recordingsDir, ArrayList()) { loadRecordingsFromStorage() } @@ -43,4 +46,32 @@ class RecordingDataManager(private val recordingsDir: File, val recordingsList: recording.delete() recordingsList.remove(recording) } + + fun getActivityDurationsOfTrainableRecordings(): Map { + val result = mutableMapOf() + for (recording in recordingsList) { + + val metadata = recording.metadataStorage + if (!metadata.hasBeenUsedForOnDeviceTraining()) { + val activities = metadata.getActivities() + for ((index, labelEntry) in activities.withIndex()) { + val timeEnded = + if (index + 1 < activities.size) activities[index + 1].timeStarted else metadata.getTimeEnded() + val duration = timeEnded - labelEntry.timeStarted + result[labelEntry.activity] = duration + (result[labelEntry.activity] ?: 0L) + } + } + } + + return result + } + fun getPeopleDurationsOfTrainableRecordings(): Map { + val result = mutableMapOf() + for (recording in recordingsList) { + val metadata = recording.metadataStorage + val person = metadata.getPerson() + result[person] = metadata.getDuration() + (result[person] ?: 0L) + } + return result + } } diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt index 3fc99d6e..cfd6c806 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/RecordingMetadataStorage.kt @@ -95,34 +95,33 @@ class RecordingMetadataStorage(file: File, initialJson: JSONObject? = null) : JS null } } - fun hasBeenUsedForOnDeviceTraining(): Boolean{ + fun hasBeenUsedForOnDeviceTraining(): Boolean { val macAddress = GlobalValues.getMacAddress() - if(json.has(ON_DEVICE_TRAINING_METADATA_KEY)){ + if (json.has(ON_DEVICE_TRAINING_METADATA_KEY)) { return json.has(macAddress) } return false } - fun setUsedForOnDeviceTraining(save: Boolean = true){ - if(!json.has(ON_DEVICE_TRAINING_METADATA_KEY)){ + fun setUsedForOnDeviceTraining(save: Boolean = true) { + if (!json.has(ON_DEVICE_TRAINING_METADATA_KEY)) { json.put(ON_DEVICE_TRAINING_METADATA_KEY, JSONObject()) } val onDeviceTrainingObj = json.getJSONObject(ON_DEVICE_TRAINING_METADATA_KEY) val macAddress = GlobalValues.getMacAddress() - if(!onDeviceTrainingObj.has(macAddress)){ + if (!onDeviceTrainingObj.has(macAddress)) { val deviceInfoObj = JSONObject() deviceInfoObj.put("device_model", Build.MODEL) deviceInfoObj.put("device", Build.DEVICE) - deviceInfoObj.put("trainingHistory",JSONArray()) + deviceInfoObj.put("trainingHistory", JSONArray()) onDeviceTrainingObj.put(macAddress, deviceInfoObj) } val deviceInfoObj = onDeviceTrainingObj.getJSONObject(macAddress) val trainingHistory = deviceInfoObj.getJSONArray("trainingHistory") trainingHistory.put(System.currentTimeMillis()) - if(save){ + if (save) { save() } } - private fun addActivity(activity: Pair) { private fun clearActivities() { while (activities.length()> 0) { activities.remove(0) @@ -153,9 +152,7 @@ class RecordingMetadataStorage(file: File, initialJson: JSONObject? = null) : JS } json.put("sensorMapping", obj) } - companion object{ - private const val ON_DEVICE_TRAINING_METADATA_KEY = "onDeviceTraining" - } + fun getSensorMacMap(): Map { val result = mutableMapOf() val obj = json.getJSONObject("sensorMapping") @@ -168,4 +165,7 @@ class RecordingMetadataStorage(file: File, initialJson: JSONObject? = null) : JS fun clone(): RecordingMetadataStorage { return RecordingMetadataStorage(file, json) } + companion object { + private const val ON_DEVICE_TRAINING_METADATA_KEY = "onDeviceTraining" + } } diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/labels_editor/EditableRecording.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/labels_editor/EditableRecording.kt index ea7354c5..067bc699 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/labels_editor/EditableRecording.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/labels_editor/EditableRecording.kt @@ -1,8 +1,8 @@ package sensors_in_paradise.sonar.page2.labels_editor import sensors_in_paradise.sonar.GlobalValues -import sensors_in_paradise.sonar.page2.Recording -import sensors_in_paradise.sonar.page2.RecordingMetadataStorage +import sensors_in_paradise.sonar.screen_recording.Recording +import sensors_in_paradise.sonar.screen_recording.RecordingMetadataStorage class EditableRecording( private val recording: Recording, diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/labels_editor/LabelsEditorDialog.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/labels_editor/LabelsEditorDialog.kt index a1dbcef5..27334686 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_recording/labels_editor/LabelsEditorDialog.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_recording/labels_editor/LabelsEditorDialog.kt @@ -15,8 +15,8 @@ import androidx.constraintlayout.motion.widget.MotionLayout import com.google.android.material.slider.RangeSlider import sensors_in_paradise.sonar.GlobalValues import sensors_in_paradise.sonar.R -import sensors_in_paradise.sonar.page2.PersistentCategoriesDialog -import sensors_in_paradise.sonar.page2.Recording +import sensors_in_paradise.sonar.screen_recording.PersistentCategoriesDialog +import sensors_in_paradise.sonar.screen_recording.Recording class LabelsEditorDialog( val context: Context, diff --git a/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt b/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt index c4df1de3..b2da723c 100644 --- a/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt +++ b/app/src/main/java/sensors_in_paradise/sonar/screen_train/TrainingScreen.kt @@ -1,10 +1,110 @@ package sensors_in_paradise.sonar.screen_train import android.app.Activity +import android.content.Context +import android.graphics.Color +import android.graphics.Typeface +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.data.PieData +import com.github.mikephil.charting.data.PieDataSet +import com.github.mikephil.charting.data.PieEntry +import com.github.mikephil.charting.formatter.ValueFormatter +import com.github.mikephil.charting.utils.ColorTemplate +import com.github.mikephil.charting.utils.MPPointF +import sensors_in_paradise.sonar.GlobalValues +import sensors_in_paradise.sonar.R import sensors_in_paradise.sonar.ScreenInterface +import sensors_in_paradise.sonar.screen_recording.RecordingDataManager -class TrainingScreen : ScreenInterface { - +class TrainingScreen(private val recordingsManager: RecordingDataManager) : ScreenInterface { + private lateinit var activitiesPieChart: PieChart + private lateinit var peoplePieChart: PieChart + private lateinit var context: Context + private lateinit var activity: Activity override fun onActivityCreated(activity: Activity) { + this.activity = activity + this.context = activity + activitiesPieChart = activity.findViewById(R.id.pieChart_availableData_trainingFragment) + peoplePieChart = activity.findViewById(R.id.pieChart_availableDataPeople_trainingFragment) + } + + override fun onScreenOpened() { + populateDurationPieChart( + activitiesPieChart, + recordingsManager.getActivityDurationsOfTrainableRecordings() + ) + populateDurationPieChart( + peoplePieChart, + recordingsManager.getPeopleDurationsOfTrainableRecordings() + ) + activitiesPieChart.animateY(1400, Easing.EaseInOutQuad) + peoplePieChart.animateY(1400, Easing.EaseInOutQuad) + } + + private fun populateDurationPieChart(pieChart: PieChart, labelledDurations: Map) { + val entries = ArrayList() + for ((activity, duration) in improveData(labelledDurations)) { + entries.add( + PieEntry( + duration.toFloat(), + activity + ) + ) + } + + val dataSet = PieDataSet(entries, "Election Results") + + prepareDataset(dataSet) + // dataSet.setSelectionShift(0f); + + // dataSet.setSelectionShift(0f); + val data = PieData(dataSet) + + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return GlobalValues.getDurationAsString(value.toLong()) + } + }) + data.setValueTextSize(11f) + data.setValueTextColor(Color.WHITE) + data.setValueTypeface(Typeface.DEFAULT) + pieChart.legend.isEnabled = false + pieChart.setHoleColor(Color.TRANSPARENT) + pieChart.data = data + + // undo all highlights + + // undo all highlights + pieChart.highlightValues(null) + pieChart.invalidate() + pieChart.animate() + } + + private fun prepareDataset(dataSet: PieDataSet) { + dataSet.setDrawIcons(false) + dataSet.sliceSpace = 3f + dataSet.iconsOffset = MPPointF(0f, 40f) + dataSet.selectionShift = 5f + val colors = ArrayList() + for (c in ColorTemplate.PASTEL_COLORS) colors.add(c) + colors.add(ColorTemplate.getHoloBlue()) + dataSet.colors = colors + } + + private fun improveData( + data: Map, + smallItemPercentageThreshold: Float = 0.04f + ): Map { + val result = mutableMapOf() + var sum = 0L + for ((_, duration) in data) { + sum += duration + } + for ((activity, duration) in data) { + val label = if (duration >= sum * smallItemPercentageThreshold) activity else "other" + result[label] = duration + (result[label] ?: 0L) + } + return result } } diff --git a/app/src/main/res/layout/training_fragment.xml b/app/src/main/res/layout/training_fragment.xml index 77d9ef65..fbeb0910 100644 --- a/app/src/main/res/layout/training_fragment.xml +++ b/app/src/main/res/layout/training_fragment.xml @@ -1,6 +1,78 @@ - + android:layout_height="match_parent" + android:orientation="vertical" + android:padding="16dp"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + +