diff --git a/app/build.gradle b/app/build.gradle index 5dfeff2..8cdcc06 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,6 +58,7 @@ dependencies { // AndroidX def navigationVersion = "2.3.5" + implementation "androidx.activity:activity-ktx:1.2.3" implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.core:core-ktx:1.3.2' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f8d065b..8efc390 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ + , grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when (requestCode) { - Keys.REQUEST_CODE_FOREGROUND -> { + Keys.REQUEST_CODE_LOCATION -> { if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { // permission was granted - re-bind service activity?.unbindService(connection) - activity?.bindService(Intent(activity, TrackerService::class.java), connection, Context.BIND_AUTO_CREATE) + activity?.bindService(Intent(activity, TrackerService::class.java), connection, Context.BIND_AUTO_CREATE) LogHelper.i(TAG, "Request result: Location permission has been granted.") } else { // permission denied - unbind service @@ -160,6 +158,30 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlayHelpe layout.toggleLocationErrorBar(gpsProviderActive, networkProviderActive) return } + Keys.REQUEST_CODE_ACTIVITY_START -> { + LogHelper.e(TAG, "permissions => ${grantResults.isEmpty()} ${permissions[0]}") // todo remove + if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { + LogHelper.i(TAG, "Request result: Activity Recognition permission has been granted.") + } else { + LogHelper.i(TAG, "Request result: Activity Recognition permission has NOT been granted.") + } + // start service via intent so that it keeps running after unbind + startTrackerService() + trackerService.startTracking() + return + } + Keys.REQUEST_CODE_ACTIVITY_RESUME -> { + LogHelper.e(TAG, "permissions => ${grantResults.isEmpty()} ${permissions[0]}") // todo remove + if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { + LogHelper.i(TAG, "Request result: Activity Recognition permission has been granted.") + } else { + LogHelper.i(TAG, "Request result: Activity Recognition permission has NOT been granted.") + } + // start service via intent so that it keeps running after unbind + startTrackerService() + trackerService.resumeTracking() + return + } } } @@ -191,6 +213,34 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlayHelpe } + /* Start recording waypoints */ + private fun startTracking() { + // request activity recognition permission on Android Q+ if denied + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && ContextCompat.checkSelfPermission(activity as Context, Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_DENIED) { + LogHelper.e(TAG, "permissions resume DING") // todo remove + this.requestPermissions(arrayOf(Manifest.permission.ACTIVITY_RECOGNITION), Keys.REQUEST_CODE_ACTIVITY_START) + } else { + // start service via intent so that it keeps running after unbind + startTrackerService() + trackerService.startTracking() + } + } + + + /* Resume recording waypoints */ + private fun resumeTracking() { + // request activity recognition permission on Android Q+ if denied + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && ContextCompat.checkSelfPermission(activity as Context, Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_DENIED) { + LogHelper.e(TAG, "permissions resume DING") // todo remove + this.requestPermissions(arrayOf(Manifest.permission.ACTIVITY_RECOGNITION), Keys.REQUEST_CODE_ACTIVITY_RESUME) + } else { + // start service via intent so that it keeps running after unbind + startTrackerService() + trackerService.resumeTracking() + } + } + + /* Start tracker service */ private fun startTrackerService() { val intent = Intent(activity, TrackerService::class.java) @@ -219,11 +269,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlayHelpe when (trackingState) { Keys.STATE_TRACKING_STOPPED -> layout.toggleRecordingButtonSubMenu() Keys.STATE_TRACKING_ACTIVE -> trackerService.stopTracking() - Keys.STATE_TRACKING_NOT -> { - // start service via intent so that it keeps running after unbind - startTrackerService() - trackerService.startTracking() - } + Keys.STATE_TRACKING_NOT -> startTracking() } } diff --git a/app/src/main/java/org/y20k/trackbook/TrackerService.kt b/app/src/main/java/org/y20k/trackbook/TrackerService.kt index 561d019..873de9d 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackerService.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackerService.kt @@ -449,11 +449,7 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener { /* Registers a step counter listener */ private fun startStepCounter() { - val stepCounterAvailable = sensorManager.registerListener( - this, sensorManager.getDefaultSensor( - Sensor.TYPE_STEP_COUNTER - ), SensorManager.SENSOR_DELAY_UI - ) + val stepCounterAvailable = sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER), SensorManager.SENSOR_DELAY_UI) if (!stepCounterAvailable) { LogHelper.w(TAG, "Pedometer sensor not available.") track.stepCount = -1f diff --git a/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt b/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt index 09095ee..c328e84 100644 --- a/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt +++ b/app/src/main/java/org/y20k/trackbook/ui/TrackFragmentLayoutHolder.kt @@ -77,6 +77,7 @@ data class TrackFragmentLayoutHolder(private var context: Context, private var m private val statisticsSheet: NestedScrollView private val statisticsView: View private val distanceView: MaterialTextView + private val stepsTitleView: MaterialTextView private val stepsView: MaterialTextView private val waypointsView: MaterialTextView private val durationView: MaterialTextView @@ -118,6 +119,7 @@ data class TrackFragmentLayoutHolder(private var context: Context, private var m statisticsSheet = rootView.findViewById(R.id.statistics_sheet) statisticsView = rootView.findViewById(R.id.statistics_view) distanceView = rootView.findViewById(R.id.statistics_data_distance) + stepsTitleView = rootView.findViewById(R.id.statistics_p_steps) stepsView = rootView.findViewById(R.id.statistics_data_steps) waypointsView = rootView.findViewById(R.id.statistics_data_waypoints) durationView = rootView.findViewById(R.id.statistics_data_duration) @@ -202,10 +204,18 @@ data class TrackFragmentLayoutHolder(private var context: Context, private var m /* Sets up the statistics sheet */ private fun setupStatisticsViews() { - // get step count string + // get step count string - hide step count if not available val steps: String - if (track.stepCount == -1f) steps = context.getString(R.string.statistics_sheet_p_steps_no_pedometer) - else steps = track.stepCount.roundToInt().toString() + if (track.stepCount == -1f) { + steps = context.getString(R.string.statistics_sheet_p_steps_no_pedometer) + stepsTitleView.isGone = true + stepsView.isGone = true + } + else { + steps = track.stepCount.roundToInt().toString() + stepsTitleView.isVisible = true + stepsView.isVisible = true + } // populate views trackNameView.text = track.name diff --git a/build.gradle b/build.gradle index 9be6a7a..a875b58 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { - kotlin_version = '1.4.32' + kotlin_version = '1.5.0' navigation_version = '2.3.3' } repositories { @@ -10,7 +10,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.0' + classpath 'com.android.tools.build:gradle:4.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigation_version"