diff --git a/app/src/main/java/org/obd/graphs/PowerBroadcastReceiver.kt b/app/src/main/java/org/obd/graphs/PowerBroadcastReceiver.kt index f94733b1..5e212a64 100644 --- a/app/src/main/java/org/obd/graphs/PowerBroadcastReceiver.kt +++ b/app/src/main/java/org/obd/graphs/PowerBroadcastReceiver.kt @@ -25,7 +25,7 @@ import android.util.Log import org.obd.graphs.activity.LOG_TAG import org.obd.graphs.activity.MainActivity import org.obd.graphs.bl.datalogger.DATA_LOGGER_SCHEDULED_START_EVENT -import org.obd.graphs.bl.datalogger.dataLogger +import org.obd.graphs.bl.datalogger.DATA_LOGGER_SCHEDULED_STOP_EVENT const val SCREEN_OFF_EVENT = "power.screen.off" const val SCREEN_ON_EVENT = "power.screen.on" @@ -65,12 +65,7 @@ internal class PowerBroadcastReceiver : BroadcastReceiver() { } if (powerPreferences.connectOnPower) { - Log.d( - LOG_TAG, - "Stop data logging", - ) - dataLogger.stop() - dataLogger.scheduledStop() + sendBroadcastEvent(DATA_LOGGER_SCHEDULED_STOP_EVENT) } if (powerPreferences.screenOnOff) { diff --git a/app/src/main/java/org/obd/graphs/activity/MainActivity.kt b/app/src/main/java/org/obd/graphs/activity/MainActivity.kt index 9b485f68..308763cc 100644 --- a/app/src/main/java/org/obd/graphs/activity/MainActivity.kt +++ b/app/src/main/java/org/obd/graphs/activity/MainActivity.kt @@ -38,7 +38,7 @@ import org.obd.graphs.MAIN_ACTIVITY_EVENT_DESTROYED import org.obd.graphs.MAIN_ACTIVITY_EVENT_PAUSE import org.obd.graphs.Permissions import org.obd.graphs.R -import org.obd.graphs.bl.datalogger.dataLogger +import org.obd.graphs.bl.datalogger.DataLoggerRepository import org.obd.graphs.bl.drag.dragRacingMetricsProcessor import org.obd.graphs.bl.extra.vehicleStatusMetricsProcessor import org.obd.graphs.bl.generator.MetricsGenerator @@ -46,6 +46,7 @@ import org.obd.graphs.bl.gps.gpsMetricsEmitter import org.obd.graphs.bl.trip.tripManager import org.obd.graphs.cacheManager import org.obd.graphs.network +import org.obd.graphs.preferences.initPrefs import org.obd.graphs.profile.profile import org.obd.graphs.sendBroadcastEvent import org.obd.graphs.setActivityContext @@ -58,7 +59,6 @@ const val LOG_TAG = "MainActivity" class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks { - lateinit var lockScreenDialog: AlertDialog internal lateinit var backupManager: BackupManager @@ -125,13 +125,14 @@ class MainActivity : override fun onSupportNavigateUp(): Boolean { val navController = (supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment).navController - return NavigationUI.navigateUp(navController,appBarConfiguration) || super.onSupportNavigateUp() + return NavigationUI.navigateUp(navController, appBarConfiguration) || super.onSupportNavigateUp() } override fun onCreate(savedInstanceState: Bundle?) { setupStrictMode() super.onCreate(savedInstanceState) setActivityContext(this) + initPrefs(this) initCache() setContentView(R.layout.activity_main) @@ -164,7 +165,6 @@ class MainActivity : validatePermissions() } - override fun onResume() { super.onResume() screen.setupWindowManager(this) @@ -188,15 +188,15 @@ class MainActivity : Thread.setDefaultUncaughtExceptionHandler(ExceptionHandler()) } - - fun getAppBarConfiguration(): AppBarConfiguration = AppBarConfiguration( - setOf( - R.id.nav_giulia, - R.id.nav_graph, - R.id.nav_gauge, - ), - findViewById(R.id.drawer_layout) - ) + fun getAppBarConfiguration(): AppBarConfiguration = + AppBarConfiguration( + setOf( + R.id.nav_giulia, + R.id.nav_graph, + R.id.nav_gauge, + ), + findViewById(R.id.drawer_layout), + ) private fun initCache() { cacheManager.initCache(cache) @@ -244,14 +244,14 @@ class MainActivity : } private fun setupMetricsProcessors() { - dataLogger + DataLoggerRepository .observe(dragRacingMetricsProcessor) .observe(tripManager) .observe(vehicleStatusMetricsProcessor) .observe(gpsMetricsEmitter) if (BuildConfig.DEBUG) { - dataLogger.observe(MetricsGenerator(BuildConfig.DEBUG)) + DataLoggerRepository.observe(MetricsGenerator(BuildConfig.DEBUG)) } } diff --git a/app/src/main/java/org/obd/graphs/activity/Navigation.kt b/app/src/main/java/org/obd/graphs/activity/Navigation.kt index c1023455..51ff0aa4 100644 --- a/app/src/main/java/org/obd/graphs/activity/Navigation.kt +++ b/app/src/main/java/org/obd/graphs/activity/Navigation.kt @@ -23,7 +23,7 @@ import androidx.core.os.bundleOf import androidx.core.view.GravityCompat import androidx.navigation.ui.NavigationUI import org.obd.graphs.R -import org.obd.graphs.bl.datalogger.dataLogger +import org.obd.graphs.bl.datalogger.DataLoggerRepository import org.obd.graphs.getContext import org.obd.graphs.preferences.PREFERENCE_SCREEN_KEY import org.obd.graphs.preferences.Prefs @@ -99,7 +99,7 @@ internal fun MainActivity.setupNavigationBar() { navController.addOnDestinationChangedListener { _, destination, _ -> bottomAppBar { - it.menu.findItem(R.id.ctx_menu_dtc).isVisible = dataLogger.isDTCEnabled() + it.menu.findItem(R.id.ctx_menu_dtc).isVisible = DataLoggerRepository.isDTCEnabled() ?: false it.menu.findItem(R.id.ctx_menu_android_auto)?.let { if (NavigationRouter.isAndroidAutoEnabled(this)) { val spanString = SpannableString(it.title.toString()) diff --git a/app/src/main/java/org/obd/graphs/activity/Receivers.kt b/app/src/main/java/org/obd/graphs/activity/Receivers.kt index 10d87e81..ce1623dc 100644 --- a/app/src/main/java/org/obd/graphs/activity/Receivers.kt +++ b/app/src/main/java/org/obd/graphs/activity/Receivers.kt @@ -60,10 +60,11 @@ import org.obd.graphs.bl.datalogger.DATA_LOGGER_DTC_AVAILABLE import org.obd.graphs.bl.datalogger.DATA_LOGGER_ERROR_CONNECT_EVENT import org.obd.graphs.bl.datalogger.DATA_LOGGER_ERROR_EVENT import org.obd.graphs.bl.datalogger.DATA_LOGGER_NO_NETWORK_EVENT +import org.obd.graphs.bl.datalogger.DATA_LOGGER_SCHEDULED_STOP_EVENT import org.obd.graphs.bl.datalogger.DATA_LOGGER_STOPPED_EVENT import org.obd.graphs.bl.datalogger.DATA_LOGGER_WIFI_INCORRECT import org.obd.graphs.bl.datalogger.DATA_LOGGER_WIFI_NOT_CONNECTED -import org.obd.graphs.bl.datalogger.dataLogger +import org.obd.graphs.bl.datalogger.DataLoggerRepository import org.obd.graphs.bl.datalogger.dataLoggerSettings import org.obd.graphs.bl.extra.EVENT_VEHICLE_STATUS_IGNITION_OFF import org.obd.graphs.bl.extra.EVENT_VEHICLE_STATUS_IGNITION_ON @@ -81,6 +82,7 @@ import org.obd.graphs.registerReceiver import org.obd.graphs.ui.common.COLOR_CARDINAL import org.obd.graphs.ui.common.COLOR_PHILIPPINE_GREEN import org.obd.graphs.ui.common.toast +import org.obd.graphs.ui.withDataLogger internal val powerReceiver = PowerBroadcastReceiver() const val NOTIFICATION_GRAPH_VIEW_TOGGLE = "view.graph.toggle" @@ -96,6 +98,16 @@ private const val EVENT_VEHICLE_STATUS_CHANGED = "event.vehicle.status.CHANGED" internal fun MainActivity.receive(intent: Intent?) { when (intent?.action) { + DATA_LOGGER_SCHEDULED_STOP_EVENT -> { + Log.d( + LOG_TAG, + "Stop data logging", + ) + withDataLogger { + stop() + scheduledStop() + } + } NAVIGATION_BUTTONS_VISIBILITY_CHANGED -> setupNavigationBar() GOOGLE_SIGN_IN_NO_CREDENTIAL_FAILURE -> toast(org.obd.graphs.commons.R.string.main_activity_toast_google_signin_failed) @@ -150,7 +162,9 @@ internal fun MainActivity.receive(intent: Intent?) { UsbManager.ACTION_USB_DEVICE_DETACHED -> { val usbDevice: UsbDevice = intent.extras?.get(UsbManager.EXTRA_DEVICE) as UsbDevice toast(R.string.pref_usb_device_detached, usbDevice.productName!!) - dataLogger.stop() + withDataLogger { + stop() + } } USB_DEVICE_ATTACHED_EVENT -> { @@ -211,7 +225,9 @@ internal fun MainActivity.receive(intent: Intent?) { ContextCompat.getColorStateList(applicationContext, org.obd.graphs.commons.R.color.cardinal) it.setOnClickListener { Log.i(LOG_TAG, "Stop data logging ") - dataLogger.stop() + withDataLogger { + stop() + } } it.refreshDrawableState() } @@ -264,7 +280,9 @@ internal fun MainActivity.receive(intent: Intent?) { updateVehicleStatus("Key off") if (dataLoggerSettings.instance().vehicleStatusDisconnectWhenOff) { Log.i(LOG_TAG, "Received vehicle status OFF event. Closing the session.") - dataLogger.stop() + withDataLogger { + stop() + } } } } @@ -301,7 +319,7 @@ internal fun MainActivity.toggleNavigationItem( internal fun MainActivity.unregisterReceiver() { unregisterReceiver(activityBroadcastReceiver) unregisterReceiver(powerReceiver) - unregisterReceiver(dataLogger.eventsReceiver) + unregisterReceiver(DataLoggerRepository.eventsReceiver) } internal fun MainActivity.registerReceiver() { @@ -359,6 +377,7 @@ internal fun MainActivity.registerReceiver() { it.addAction(REQUEST_NOTIFICATION_PERMISSIONS) it.addAction(LOCATION_IS_DISABLED) it.addAction(NAVIGATION_BUTTONS_VISIBILITY_CHANGED) + it.addAction(DATA_LOGGER_SCHEDULED_STOP_EVENT) } registerReceiver(this, powerReceiver) { @@ -366,7 +385,7 @@ internal fun MainActivity.registerReceiver() { it.addAction("android.intent.action.ACTION_POWER_DISCONNECTED") } - registerReceiver(this, dataLogger.eventsReceiver) { + registerReceiver(this, DataLoggerRepository.eventsReceiver) { it.addAction(MODULES_LIST_CHANGED_EVENT) it.addAction(PROFILE_CHANGED_EVENT) } diff --git a/app/src/main/java/org/obd/graphs/preferences/PreferencesFragment.kt b/app/src/main/java/org/obd/graphs/preferences/PreferencesFragment.kt index b432d54f..7e09390a 100644 --- a/app/src/main/java/org/obd/graphs/preferences/PreferencesFragment.kt +++ b/app/src/main/java/org/obd/graphs/preferences/PreferencesFragment.kt @@ -27,7 +27,7 @@ import android.view.ViewGroup import androidx.preference.* import org.obd.graphs.R import org.obd.graphs.activity.* -import org.obd.graphs.bl.datalogger.dataLogger +import org.obd.graphs.bl.datalogger.DataLoggerRepository import org.obd.graphs.bl.trip.tripVirtualScreenManager import org.obd.graphs.preferences.dtc.DiagnosticTroubleCodeListPreferences import org.obd.graphs.preferences.dtc.DiagnosticTroubleCodePreferenceDialogFragment @@ -191,7 +191,7 @@ class PreferencesFragment : PreferenceFragmentCompat() { private fun hidePreferences() { findPreference("pref.dtc.category")?.isVisible = - dataLogger.isDTCEnabled() + DataLoggerRepository.isDTCEnabled() } private fun registerListeners() { diff --git a/app/src/main/java/org/obd/graphs/preferences/pid/PidDefinitionPreferenceDialogFragment.kt b/app/src/main/java/org/obd/graphs/preferences/pid/PidDefinitionPreferenceDialogFragment.kt index c5459322..07dc4f4c 100644 --- a/app/src/main/java/org/obd/graphs/preferences/pid/PidDefinitionPreferenceDialogFragment.kt +++ b/app/src/main/java/org/obd/graphs/preferences/pid/PidDefinitionPreferenceDialogFragment.kt @@ -35,7 +35,7 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import org.obd.graphs.R import org.obd.graphs.ViewPreferencesSerializer -import org.obd.graphs.bl.datalogger.dataLogger +import org.obd.graphs.bl.datalogger.DataLoggerRepository import org.obd.graphs.bl.datalogger.dataLoggerSettings import org.obd.graphs.bl.datalogger.serialize import org.obd.graphs.bl.datalogger.vehicleCapabilitiesManager @@ -317,12 +317,12 @@ open class PidDefinitionPreferenceDialogFragment( private fun getAdapter() = (getRecyclerView(root).adapter as PidViewAdapter) private fun sourceList(): MutableList { - val all = dataLogger.getPidDefinitionRegistry().findAll() + val all = DataLoggerRepository.getPidDefinitionRegistry().findAll() val individualQuery = dataLoggerSettings.instance().adapter.individualQueryStrategyEnabled val sourceList: List = if (source == PREFERENCE_SCREEN_SOURCE_TRIP_INFO) { - val pidRegistry = dataLogger.getPidDefinitionRegistry() + val pidRegistry = DataLoggerRepository.getPidDefinitionRegistry() val list = Query .instance(QueryStrategyType.TRIP_INFO_QUERY) @@ -331,7 +331,7 @@ open class PidDefinitionPreferenceDialogFragment( .toMutableList() list.map { PidDefinitionDetails(it, checked = false, supported = true) } } else if (source == PREFERENCE_SCREEN_SOURCE_PERFORMANCE) { - val pidRegistry = dataLogger.getPidDefinitionRegistry() + val pidRegistry = DataLoggerRepository.getPidDefinitionRegistry() val list = Query .instance(QueryStrategyType.PERFORMANCE_QUERY) @@ -340,18 +340,18 @@ open class PidDefinitionPreferenceDialogFragment( .toMutableList() list.map { PidDefinitionDetails(it, checked = false, supported = true) } } else if (individualQuery) { - findPidDefinitionByPriority(dataLogger.getPidDefinitionRegistry().findAll()) { true } + findPidDefinitionByPriority(DataLoggerRepository.getPidDefinitionRegistry().findAll()) { true } } else { when (source) { "low" -> findPidDefinitionByPriority(all) { pidDefinition -> pidDefinition.priority > 0 } "high" -> findPidDefinitionByPriority(all) { pidDefinition -> pidDefinition.priority == 0 } - "edit" -> findPidDefinitionByPriority(dataLogger.getPidDefinitionRegistry().findAll()) { true } + "edit" -> findPidDefinitionByPriority(DataLoggerRepository.getPidDefinitionRegistry().findAll()) { true } "dashboard" -> map(all) "graph" -> map(all) "gauge" -> map(all) "giulia" -> map(all) "aa" -> map(all) - else -> findPidDefinitionByPriority(dataLogger.getPidDefinitionRegistry().findAll()) { true } + else -> findPidDefinitionByPriority(DataLoggerRepository.getPidDefinitionRegistry().findAll()) { true } } } diff --git a/app/src/main/java/org/obd/graphs/ui/Extensions.kt b/app/src/main/java/org/obd/graphs/ui/Extensions.kt new file mode 100644 index 00000000..5d739427 --- /dev/null +++ b/app/src/main/java/org/obd/graphs/ui/Extensions.kt @@ -0,0 +1,65 @@ + /** + * Copyright 2019-2026, Tomasz Żebrowski + * + *

Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + *

http://www.apache.org/licenses/LICENSE-2.0 + * + *

Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.obd.graphs.ui + +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import com.google.android.material.floatingactionbutton.FloatingActionButton +import org.obd.graphs.R +import org.obd.graphs.bl.datalogger.DataLoggerRepository +import org.obd.graphs.bl.datalogger.DataLoggerService +import org.obd.graphs.bl.query.Query + +fun Fragment.withDataLogger(action: DataLoggerService.() -> Unit) { + org.obd.graphs.bl.datalogger.withDataLogger(requireContext(), action) +} + +fun ComponentActivity.withDataLogger(action: DataLoggerService.() -> Unit) { + org.obd.graphs.bl.datalogger.withDataLogger(this, action) +} + +fun Fragment.configureActionButton(query: Query) { + activity?.let { + val btn = it.findViewById(R.id.connect_btn) + + btn?.setOnClickListener { + if (DataLoggerRepository.isRunning()) { + withDataLogger { + Log.i("Fragment", "Stop data logging") + stop() + } + } else { + withDataLogger { + Log.i("Fragment", "Start data logging") + start(query) + } + } + } + + btn?.backgroundTintList = + ContextCompat.getColorStateList( + it, + if (DataLoggerRepository.isRunning()) { + org.obd.graphs.commons.R.color.cardinal + } else { + org.obd.graphs.commons.R.color.philippine_green + }, + ) + } +} diff --git a/app/src/main/java/org/obd/graphs/ui/common/FloatingButton.kt b/app/src/main/java/org/obd/graphs/ui/common/FloatingButton.kt deleted file mode 100644 index adfd79b4..00000000 --- a/app/src/main/java/org/obd/graphs/ui/common/FloatingButton.kt +++ /dev/null @@ -1,49 +0,0 @@ - /** - * Copyright 2019-2026, Tomasz Żebrowski - * - *

Licensed to the Apache Software Foundation (ASF) under one or more contributor license - * agreements. See the NOTICE file distributed with this work for additional information regarding - * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. You may obtain a - * copy of the License at - * - *

http://www.apache.org/licenses/LICENSE-2.0 - * - *

Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.obd.graphs.ui.common - -import android.app.Activity -import android.util.Log -import androidx.core.content.ContextCompat -import com.google.android.material.floatingactionbutton.FloatingActionButton -import org.obd.graphs.R -import org.obd.graphs.bl.datalogger.dataLogger -import org.obd.graphs.bl.query.Query - -private const val LOG_TAG = "FloatingButton" - -fun attachToFloatingButton( - activity: Activity?, - query: Query, -) { - activity?.let { - val btn = activity.findViewById(R.id.connect_btn) - btn?.setOnClickListener { - if (dataLogger.isRunning()) { - Log.i(org.obd.graphs.activity.LOG_TAG, "DragRacingFragment: Start data logging") - dataLogger.stop() - } else { - Log.i(LOG_TAG, "Start data logging") - dataLogger.start(query) - } - } - - btn?.backgroundTintList = - ContextCompat.getColorStateList(activity, if (dataLogger.isRunning()) org.obd.graphs.commons.R.color.cardinal - else org.obd.graphs.commons.R.color.philippine_green) - } -} diff --git a/app/src/main/java/org/obd/graphs/ui/dashboard/DashboardFragment.kt b/app/src/main/java/org/obd/graphs/ui/dashboard/DashboardFragment.kt index e5d6a8b8..d4acc288 100644 --- a/app/src/main/java/org/obd/graphs/ui/dashboard/DashboardFragment.kt +++ b/app/src/main/java/org/obd/graphs/ui/dashboard/DashboardFragment.kt @@ -26,49 +26,58 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import org.obd.graphs.bl.collector.Metric -import org.obd.graphs.bl.collector.MetricsCollector import org.obd.graphs.R import org.obd.graphs.RenderingThread -import org.obd.graphs.bl.datalogger.* +import org.obd.graphs.bl.collector.Metric +import org.obd.graphs.bl.collector.MetricsCollector +import org.obd.graphs.bl.datalogger.DATA_LOGGER_CONNECTED_EVENT +import org.obd.graphs.bl.datalogger.DATA_LOGGER_STOPPED_EVENT +import org.obd.graphs.bl.datalogger.DataLoggerRepository import org.obd.graphs.preferences.Prefs import org.obd.graphs.preferences.getLongSet import org.obd.graphs.preferences.getS import org.obd.graphs.registerReceiver -import org.obd.graphs.ui.common.attachToFloatingButton -import org.obd.graphs.ui.recycler.RefreshableFragment +import org.obd.graphs.ui.configureActionButton import org.obd.graphs.ui.gauge.AdapterContext +import org.obd.graphs.ui.recycler.RefreshableFragment +import org.obd.graphs.ui.withDataLogger private const val CONFIGURATION_CHANGE_EVENT_DASH = "recycler.view.change.configuration.event.dash_id" + class DashboardFragment : RefreshableFragment() { private val metricsCollector = MetricsCollector.instance() - private val renderingThread: RenderingThread = RenderingThread( - renderAction = { - refreshRecyclerView(metricsCollector, R.id.dashboard_recycler_view) - }, - perfFrameRate = { - Prefs.getS("pref.dashboard.fps", "10").toInt() - } - ) + private val renderingThread: RenderingThread = + RenderingThread( + renderAction = { + refreshRecyclerView(metricsCollector, R.id.dashboard_recycler_view) + }, + perfFrameRate = { + Prefs.getS("pref.dashboard.fps", "10").toInt() + }, + ) private val dashboardPreferences: DashboardPreferences by lazy { getDashboardPreferences() } - private var broadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - when (intent?.action) { - CONFIGURATION_CHANGE_EVENT_DASH -> setupDashboardRecyclerView(false) - - DATA_LOGGER_CONNECTED_EVENT -> { - renderingThread.start() - } - - DATA_LOGGER_STOPPED_EVENT -> { - renderingThread.stop() - attachToFloatingButton(activity, query()) + private var broadcastReceiver = + object : BroadcastReceiver() { + override fun onReceive( + context: Context?, + intent: Intent?, + ) { + when (intent?.action) { + CONFIGURATION_CHANGE_EVENT_DASH -> setupDashboardRecyclerView(false) + + DATA_LOGGER_CONNECTED_EVENT -> { + renderingThread.start() + } + + DATA_LOGGER_STOPPED_EVENT -> { + renderingThread.stop() + configureActionButton(query()) + } } } } - } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) @@ -98,24 +107,24 @@ class DashboardFragment : RefreshableFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { root = inflater.inflate(R.layout.fragment_dashboard, container, false) setupDashboardRecyclerView(true) - dataLogger.observe(viewLifecycleOwner) { + DataLoggerRepository.observe(viewLifecycleOwner) { it.run { metricsCollector.append(it) } } - if (dataLogger.isRunning()) { - dataLogger.updateQuery(query()) + if (DataLoggerRepository.isRunning()) { + withDataLogger { + updateQuery(query()) + } renderingThread.start() } - attachToFloatingButton(activity, query()) - return root } @@ -124,23 +133,26 @@ class DashboardFragment : RefreshableFragment() { private fun setupDashboardRecyclerView(enableOnTouchListener: Boolean) { configureView( configureChangeEventId = CONFIGURATION_CHANGE_EVENT_DASH, - recyclerView = root.findViewById(R.id.dashboard_recycler_view) as RecyclerView, + recyclerView = root.findViewById(R.id.dashboard_recycler_view)!!, metricsIdsPref = dashboardPreferences.dashboardSelectedMetrics.first, - adapterContext = AdapterContext( - layoutId = R.layout.item_dashboard, - spanCount = calculateSpanCount(), - height = calculateHeight(Prefs.getLongSet(dashboardPreferences.dashboardSelectedMetrics.first).size) - ), + adapterContext = + AdapterContext( + layoutId = R.layout.item_dashboard, + spanCount = calculateSpanCount(), + height = calculateHeight(Prefs.getLongSet(dashboardPreferences.dashboardSelectedMetrics.first).size), + ), enableDragManager = dashboardPreferences.dragAndDropEnabled, enableOnTouchListener = enableOnTouchListener, enableSwipeToDelete = dashboardPreferences.swipeToDeleteEnabled, - adapter = { context: Context, - data: MutableList, - resourceId: Int, - height: Int? -> + adapter = { + context: Context, + data: MutableList, + resourceId: Int, + height: Int?, + -> DashboardViewAdapter(context, data, resourceId, height) }, - metricsSerializerPref = "prefs.dash.pids.settings" + metricsSerializerPref = "prefs.dash.pids.settings", ) metricsCollector.applyFilter(dashboardPreferences.dashboardSelectedMetrics.second) @@ -154,7 +166,7 @@ class DashboardFragment : RefreshableFragment() { } private fun calculateSpanCount(): Int { - val numberOfItems = Prefs.getLongSet(dashboardPreferences.dashboardSelectedMetrics.first).size + val numberOfItems = Prefs.getLongSet(dashboardPreferences.dashboardSelectedMetrics.first).size return if (numberOfItems <= 3) { 1 } else { diff --git a/app/src/main/java/org/obd/graphs/ui/drag_racing/DragRacingFragment.kt b/app/src/main/java/org/obd/graphs/ui/drag_racing/DragRacingFragment.kt index d9d0e8c6..9c53e3b0 100644 --- a/app/src/main/java/org/obd/graphs/ui/drag_racing/DragRacingFragment.kt +++ b/app/src/main/java/org/obd/graphs/ui/drag_racing/DragRacingFragment.kt @@ -21,23 +21,27 @@ import android.content.Context import android.content.Intent import android.content.res.Configuration import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.SurfaceView +import android.view.View +import android.view.ViewGroup import androidx.fragment.app.Fragment import org.obd.graphs.R import org.obd.graphs.RenderingThread import org.obd.graphs.bl.collector.MetricsCollector -import org.obd.graphs.bl.query.Query import org.obd.graphs.bl.datalogger.DATA_LOGGER_CONNECTED_EVENT import org.obd.graphs.bl.datalogger.DATA_LOGGER_STOPPED_EVENT +import org.obd.graphs.bl.datalogger.DataLoggerRepository +import org.obd.graphs.bl.query.Query import org.obd.graphs.bl.query.QueryStrategyType -import org.obd.graphs.bl.datalogger.dataLogger import org.obd.graphs.registerReceiver import org.obd.graphs.renderer.Fps import org.obd.graphs.renderer.SurfaceRenderer import org.obd.graphs.renderer.SurfaceRendererType import org.obd.graphs.renderer.ViewSettings +import org.obd.graphs.ui.configureActionButton import org.obd.graphs.ui.common.SurfaceController -import org.obd.graphs.ui.common.attachToFloatingButton +import org.obd.graphs.ui.withDataLogger open class DragRacingFragment : Fragment() { @@ -63,13 +67,15 @@ open class DragRacingFragment : Fragment() { when (intent?.action) { DATA_LOGGER_CONNECTED_EVENT -> { - dataLogger.updateQuery(query) + withDataLogger { + updateQuery(query) + } renderingThread.start() } DATA_LOGGER_STOPPED_EVENT -> { renderingThread.stop() - attachToFloatingButton(activity, query) + configureActionButton(query) } } } @@ -83,7 +89,7 @@ open class DragRacingFragment : Fragment() { override fun onAttach(context: Context) { super.onAttach(context) - registerReceiver(activity, broadcastReceiver){ + registerReceiver(activity, broadcastReceiver) { it.addAction(DATA_LOGGER_CONNECTED_EVENT) it.addAction(DATA_LOGGER_STOPPED_EVENT) } @@ -106,7 +112,7 @@ open class DragRacingFragment : Fragment() { savedInstanceState: Bundle? ): View { - root = inflater.inflate(R.layout.fragment_drag_racing, container, false) + root = inflater.inflate(R.layout.fragment_drag_racing, container, false) val surfaceView = root.findViewById(R.id.surface_view) val renderer = SurfaceRenderer.allocate( @@ -121,18 +127,20 @@ open class DragRacingFragment : Fragment() { enabled = query.getIDs() ) - dataLogger.observe(viewLifecycleOwner) { + DataLoggerRepository.observe(viewLifecycleOwner) { it.run { metricsCollector.append(it) } } - if (dataLogger.isRunning()) { - dataLogger.updateQuery(query) + if (DataLoggerRepository.isRunning()) { + withDataLogger { + updateQuery(query) + } renderingThread.start() } - attachToFloatingButton(activity, query) + configureActionButton(query) return root } } diff --git a/app/src/main/java/org/obd/graphs/ui/gauge/GaugeAdapter.kt b/app/src/main/java/org/obd/graphs/ui/gauge/GaugeAdapter.kt index 19d3a9cf..d22f9d59 100644 --- a/app/src/main/java/org/obd/graphs/ui/gauge/GaugeAdapter.kt +++ b/app/src/main/java/org/obd/graphs/ui/gauge/GaugeAdapter.kt @@ -33,7 +33,7 @@ import androidx.recyclerview.widget.RecyclerView import org.obd.graphs.PREF_ALERTING_ENABLED import org.obd.graphs.R import org.obd.graphs.bl.collector.Metric -import org.obd.graphs.bl.datalogger.dataLogger +import org.obd.graphs.bl.datalogger.DataLoggerRepository import org.obd.graphs.format import org.obd.graphs.mapRange import org.obd.graphs.modules @@ -212,7 +212,7 @@ class GaugeAdapter( if (preferences.commandRateEnabled) { this.visibility = View.VISIBLE val rate = - dataLogger + DataLoggerRepository .getDiagnostics() .rate() .findBy(RateType.MEAN, pid) diff --git a/app/src/main/java/org/obd/graphs/ui/gauge/GaugeFragment.kt b/app/src/main/java/org/obd/graphs/ui/gauge/GaugeFragment.kt index f9668862..49898564 100644 --- a/app/src/main/java/org/obd/graphs/ui/gauge/GaugeFragment.kt +++ b/app/src/main/java/org/obd/graphs/ui/gauge/GaugeFragment.kt @@ -35,13 +35,22 @@ import org.obd.graphs.RenderingThread import org.obd.graphs.activity.TOOLBAR_TOGGLE_ACTION import org.obd.graphs.bl.collector.Metric import org.obd.graphs.bl.collector.MetricsCollector -import org.obd.graphs.bl.datalogger.* +import org.obd.graphs.bl.datalogger.DATA_LOGGER_CONNECTED_EVENT +import org.obd.graphs.bl.datalogger.DATA_LOGGER_CONNECTING_EVENT +import org.obd.graphs.bl.datalogger.DATA_LOGGER_SCHEDULED_START_EVENT +import org.obd.graphs.bl.datalogger.DATA_LOGGER_STOPPED_EVENT +import org.obd.graphs.bl.datalogger.DataLoggerRepository import org.obd.graphs.getPowerPreferences -import org.obd.graphs.preferences.* +import org.obd.graphs.preferences.Prefs +import org.obd.graphs.preferences.getS import org.obd.graphs.registerReceiver -import org.obd.graphs.ui.common.* +import org.obd.graphs.ui.configureActionButton +import org.obd.graphs.ui.common.COLOR_PHILIPPINE_GREEN +import org.obd.graphs.ui.common.COLOR_TRANSPARENT +import org.obd.graphs.ui.common.isTablet import org.obd.graphs.ui.recycler.RecyclerViewAdapter import org.obd.graphs.ui.recycler.RefreshableFragment +import org.obd.graphs.ui.withDataLogger import kotlin.math.roundToInt private const val ENABLE_DRAG_AND_DROP_PREF = "pref.gauge_enable_drag_and_drop" @@ -51,64 +60,74 @@ private const val GAUGE_PIDS_SETTINGS = "prefs.gauge.pids.settings" class GaugeFragment : RefreshableFragment() { private val metricsCollector = MetricsCollector.instance() - private val renderingThread: RenderingThread = RenderingThread( - id = "GaugeFragmentRenderingThread", - renderAction = { - refreshRecyclerView(metricsCollector, R.id.recycler_view) - }, - perfFrameRate = { - Prefs.getS("pref.gauge.fps", "10").toInt() - } - ) + private val renderingThread: RenderingThread = + RenderingThread( + id = "GaugeFragmentRenderingThread", + renderAction = { + refreshRecyclerView(metricsCollector, R.id.recycler_view) + }, + perfFrameRate = { + Prefs.getS("pref.gauge.fps", "10").toInt() + }, + ) @SuppressLint("NotifyDataSetChanged") - private var broadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - when (intent?.action) { - DATA_LOGGER_SCHEDULED_START_EVENT -> { - if (isAdded && isVisible) { - Log.i(org.obd.graphs.activity.LOG_TAG, "Scheduling data logger for=${query().getIDs()}") - dataLogger.scheduleStart(getPowerPreferences().startDataLoggingAfter, query()) + private var broadcastReceiver = + object : BroadcastReceiver() { + override fun onReceive( + context: Context?, + intent: Intent?, + ) { + when (intent?.action) { + DATA_LOGGER_SCHEDULED_START_EVENT -> { + if (isAdded && isVisible) { + Log.i(org.obd.graphs.activity.LOG_TAG, "Scheduling data logger for=${query().getIDs()}") + withDataLogger { + scheduleStart(getPowerPreferences().startDataLoggingAfter, query()) + } + } } - } - CONFIGURE_CHANGE_EVENT_GAUGE -> { - configureView(false) - } - DATA_LOGGER_CONNECTING_EVENT -> { - val recyclerView = root.findViewById(R.id.recycler_view) as RecyclerView - val adapter = recyclerView.adapter as RecyclerViewAdapter - val metrics = prepareMetrics( - metricsIdsPref = gaugeVirtualScreen.getVirtualScreenPrefKey(), - metricsSerializerPref = GAUGE_PIDS_SETTINGS - ) - adapter.data.clear() - adapter.data.addAll(metrics) - adapter.notifyDataSetChanged() - } - DATA_LOGGER_CONNECTED_EVENT -> { - virtualScreensPanel { - it.isVisible = false + CONFIGURE_CHANGE_EVENT_GAUGE -> { + configureView(false) } - renderingThread.start() - } - DATA_LOGGER_STOPPED_EVENT -> { - virtualScreensPanel { - it.isVisible = true + DATA_LOGGER_CONNECTING_EVENT -> { + val recyclerView: RecyclerView = root.findViewById(R.id.recycler_view) + val adapter = recyclerView.adapter as RecyclerViewAdapter + val metrics = + prepareMetrics( + metricsIdsPref = gaugeVirtualScreen.getVirtualScreenPrefKey(), + metricsSerializerPref = GAUGE_PIDS_SETTINGS, + ) + adapter.data.clear() + adapter.data.addAll(metrics) + adapter.notifyDataSetChanged() + } + + DATA_LOGGER_CONNECTED_EVENT -> { + virtualScreensPanel { + it.isVisible = false + } + renderingThread.start() + } + + DATA_LOGGER_STOPPED_EVENT -> { + virtualScreensPanel { + it.isVisible = true + } + renderingThread.stop() + configureActionButton(query()) } - renderingThread.stop() - attachToFloatingButton(activity, query()) - } - TOOLBAR_TOGGLE_ACTION -> { - virtualScreensPanel { - it.isVisible = !it.isVisible + TOOLBAR_TOGGLE_ACTION -> { + virtualScreensPanel { + it.isVisible = !it.isVisible + } } } } } - } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) @@ -118,11 +137,11 @@ class GaugeFragment : RefreshableFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { root = inflater.inflate(R.layout.fragment_gauge, container, false) - dataLogger.observe(viewLifecycleOwner) { + DataLoggerRepository.observe(viewLifecycleOwner) { it.run { metricsCollector.append(it) } @@ -131,20 +150,22 @@ class GaugeFragment : RefreshableFragment() { configureView(true) setupVirtualViewPanel() - if (dataLogger.isRunning()) { - dataLogger.updateQuery(query()) + if (DataLoggerRepository.isRunning()) { + withDataLogger { + updateQuery(query()) + } + renderingThread.start() } - attachToFloatingButton(activity, query()) + configureActionButton(query()) return root } - override fun onAttach(context: Context) { super.onAttach(context) - registerReceiver(activity, broadcastReceiver){ + registerReceiver(activity, broadcastReceiver) { it.addAction(CONFIGURE_CHANGE_EVENT_GAUGE) it.addAction(DATA_LOGGER_CONNECTING_EVENT) it.addAction(DATA_LOGGER_CONNECTED_EVENT) @@ -173,23 +194,25 @@ class GaugeFragment : RefreshableFragment() { private fun configureView(enableOnTouchListener: Boolean) { configureView( configureChangeEventId = CONFIGURE_CHANGE_EVENT_GAUGE, - recyclerView = root.findViewById(R.id.recycler_view) as RecyclerView, + recyclerView = root.findViewById(R.id.recycler_view)!!, metricsIdsPref = gaugeVirtualScreen.getVirtualScreenPrefKey(), - adapterContext = AdapterContext( - layoutId = R.layout.item_gauge, - spanCount = calculateSpan() - ), - + adapterContext = + AdapterContext( + layoutId = R.layout.item_gauge, + spanCount = calculateSpan(), + ), enableSwipeToDelete = Prefs.getBoolean(ENABLE_SWIPE_TO_DELETE_PREF, false), enableDragManager = Prefs.getBoolean(ENABLE_DRAG_AND_DROP_PREF, false), enableOnTouchListener = enableOnTouchListener, - adapter = { context: Context, - data: MutableList, - resourceId: Int, - height: Int? -> + adapter = { + context: Context, + data: MutableList, + resourceId: Int, + height: Int?, + -> GaugeAdapter(context, data, resourceId, height) }, - metricsSerializerPref = GAUGE_PIDS_SETTINGS + metricsSerializerPref = GAUGE_PIDS_SETTINGS, ) metricsCollector.applyFilter(getSelectedPIDs()) @@ -212,6 +235,7 @@ class GaugeFragment : RefreshableFragment() { } } } + else -> { when (numberOfPIDsToDisplay) { 0 -> 1 @@ -225,7 +249,11 @@ class GaugeFragment : RefreshableFragment() { private fun getSelectedPIDs() = query.filterBy(gaugeVirtualScreen.getVirtualScreenPrefKey()) - private fun setVirtualViewBtn(btnId: Int, selection: String, viewId: String) { + private fun setVirtualViewBtn( + btnId: Int, + selection: String, + viewId: String, + ) { (root.findViewById